tkabber000075500000000000000000000000001477701321300117725ustar00nobodynobodytkabber/AUTHORS000064400000000000000000000002701477701321300131200ustar00nobodynobodyAlexey Shchepin Marshall T. Rose Sergei Golovan Michail Litvak Konstantin Khomoutov tkabber/COPYING000064400000000000000000000432611477701321300131120ustar00nobodynobody GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 Library General Public License instead of this License. tkabber/ChangeLog000064400000000000000000015065761477701321300136470ustar00nobodynobody2025-04-13 Sergei Golovan * plugins/unix/tktray.tcl: Add a workaround for a race condition in Tcl 9 when the configure events for size of the tray icon come in incorrect order. * tkabber.tcl: Determine by creating a text window whether the Tk or Ttk theme is dark, set the ::darktheme binary variable, and the ::defaultforeground color variable. * *: Add the second set of colors for a dark theme. * ifacetk/unix.tcl, examples/xrdb/*: Do not override border widths and roster item placement indents (adapt theme examples to high DPI displays). Define colors for spinbox arrow buttons. 2025-04-11 Sergei Golovan * ifacetk/roster.tcl, plugins/chat/complete_last_nick.tcl, plugins/chat/open_chat.tcl: Fix relative namespaces for Tcl 9. * ttk/default.xrdb: Define *placeholderForeground, otherwise [entry] in userinfo crashed with ttk. * plugins/general/avatars.tcl, userinfo.tcl: Fix for Img 2.0 (it does not recognize base64 encoded JPEG images anymore). 2025-04-10 Sergei Golovan * plugins/chat/nick_colors.tcl: Fix call to crc::sum under Tcl 9. 2025-04-07 Sergei Golovan * ifacetk/default.tcl: Widen incertion cursor for displays with high DPI. * tk/bwidget.tcl, ttk/bwidget.tcl: Use 0.5mm padding for the dialog frames. * userinfo.tcl: Add a small gap between labels and userinfo values. * utils.tcl: Remove [lmap] procedure because it is implemented in Tcl 8.6. 2025-04-02 Sergei Golovan * tkabber.tcl: Optionally require tkpng for PNG images if Img is not available. * userinfo.tcl: Scale photos for high DPI displays. 2025-04-01 Sergei Golovan * plugins/pep/user_avatar.tcl: Fix the directory menu on Windows (show all drives in it). * userinfo.tcl: Fix the toplevel background when ttk is used. * ifacetk/iface.tcl: Fix the SSL indicator background. 2025-03-31 Sergei Golovan * plugins/general/avatars.tcl, plugins/pep/user_avatar.tcl: Zoom avatar images in case of high DPI displays. 2025-03-30 Sergei Golovan * *: Fix discrepancies between Tcl 8 and Tcl 9 using suggestions of a static code analyzer. * chats.tcl, ifacetk/default.tcl, ifacetk/roster.tcl, ifacetk/unix.tcl, tkabber.tcl: Move the default XRDB options to Tcl scripts to make teir values more flexible, they now can be calculated based on physical units. 2025-03-29 Sergei Golovan * README, splash.tcl, doc/tkabber.html, doc/tkabber.xml: Update copyright years. * *: Fix some variables referenced by relative namespace to work with Tcl 9 (unfinished yet). 2025-03-27 Sergei Golovan * ttk/bwidget.tcl: Fix non-numeric spacing and padx for ButtonBox. 2025-03-26 Sergei Golovan * pixmaps/default/tkabber/tkabber-logo.svg, splash.tcl: Specify correct DPI for displaying Tkabber SVG logo, fix its size to match the GIF one for 96 DPI. 2025-03-25 Sergei Golovan * ifacetk/default.xrdb: Do not specify the roster background, let it be taken from text widgets by default. * ifacetk.iface.tcl, pixmaps/default/tkabber/tkabber-logo.svg, splash.tcl: Add optional SVG logo for the splash screen and About window. 2025-03-24 Sergei Golovan * ifacetk/unix.xrdb: Change the color of highlighting rectangles. * pixmaps.tcl, plugins/richtext/emoticons.tcl, search.tcl, splash.tcl, tk/bwidget.tcl, tkabber.tcl: Introduce the $::icons_scale config variable which instructs Tkabber to scale all the theme images. This helps somewhat with high DPI displays. 2025-03-22 Sergei Golovan * *: Replace call to [trace variable] and similar by calls to [trace add variable] etc. (porting to Tcl 9). 2025-03-19 Sergei Golovan * tk/bwidget.tcl: Restrict notebook border width because only width 1 and 2 are supported by BWidget. * tkabber.tcl: Introduce variable $::tk_scale which acts as a multiplier for [tk scaling] if Tk fails to determine true screen DPI. $::tk_scale can be set in the config file, or from the GDK_SCALE environment variable. 2025-03-17 Sergei Golovan * *: Start some support for High DPI. Make borders and spacing between widgets dependent on display DPI. 2025-03-15 Sergei Golovan * configdir.tcl, examples/configs/badlop-config.tcl, examples/configs/config.tcl, examples/configs/mtr-config.tcl, examples/configs/teo-config.tcl: Do not rely on expanding ~ at the beginning of file names (porting to Tcl 9). * msgs/ca.msg, msgs/eu.msg, msgs/pt.msg, msgs/ro.msg: Delete obsolete messages. 2024-10-19 Sergei Golovan * plugins/general/gpgme.tcl: Do not try to show GnuPG signatures if there isn't any. 2020-08-05 Sergei Golovan * plugins/chat/logger.tcl: Ignore malformed lines in the log files, they can happen if there's no space in the home directory, or in case of some other crashes. 2018-04-13 Sergei Golovan * ifacetk/iface.tcl: Fix updating window titles when a message from ignored MUC user arrives (close ticket [2e61153a20]). * doc/tkabber.xml, ifacetk/iface.tcl, splash.tcl: Update copyright. * README, doc/tkabber.html: Refresh docs. 2016-08-18 Sergei Golovan * hooks.tcl: Changed the meaning of omitted priority argument for hook::remove. Now it means 'remove all matched scripts from a hook' instead of 'remove matched script with priority 50'. 2016-07-09 Sergei Golovan * plugins/general/gpgme.tcl: Show the last 16 hexadecimal digits as keyid for GPG keys instead of 8 because of existing examples of keys with the same short keyids. 2016-06-30 Sergei Golovan * richtext.tcl: Fixed typo. 2016-04-25 Sergei Golovan * plugins/unix/dockingtray.tcl, plugins/unix/systray.tcl: Removed system tray plugins which use obsolete extensions (closes ticket [e02761a005]). 2016-03-17 Sergei Golovan * plugins/richtext/urls.tcl, plugins/chat/shuffle.tcl: Loosened the condition for forbidden characters in URLs. 2016-02-18 Sergei Golovan * ifacetk/roster.tcl: Don't use black for group and connection label borders. 2016-02-07 Sergei Golovan * plugins/roster/annotations.tcl: Don't show the conference's roster notes in the occupant's user info window. 2016-02-04 Sergei Golovan * plugins/pep/user_avatar.tcl: Renamed user_avatar_notification_hook to user_avatar_pep_notification_hook to prevent clashing with the avatarcache plugin in contrib. * plugins/general/autoaway.tcl, plugins/iq/last.tcl: Cleaned up the code, removed all kinds of commands for getting idle time except for the [tk inactive]. * login.tcl: Got rid of [eval] calls. Do not add -castore and -certfile options if they are empty strings. Defined /etc/ssl/certs as a default value for the loginconf(cacertstore) on unix systems. 2016-02-01 Sergei Golovan * plugins/general/gpgme.tcl: Don't draw the signed/encrypted message icon for outgoing messages in groupchats because only drawing incoming messages makes sense there. * register.tcl: Don't panic if the register window is already destroyed when registration answer is received. 2016-01-26 Sergei Golovan * chats.tcl: Fixed tab titles for chats with groupchat occupants. They were broken when search for conference roster items was fixed. 2016-01-25 Sergei Golovan * plugins/roster/rosterx.tcl: Fixed the attached users dialogs clash. * plugins/roster/rosterx.tcl: Show only users missing in roster when displaying add users dialog. * muc.tcl: Added a dirty hack which makes Tkabber ignore the MUC invitations to the rooms where the user is an occupant already. * login.tcl: Fixed typo in loginconf(useboshkeys) option definition. * ifacetk/login.tcl, login.tcl: Disabled the X-GOOGLE-TOKEN SASL authentication mechanism because it doesn't work anymore. 2016-01-24 Sergei Golovan * ifacetk/iface.tcl, tk/bwidget.tcl: Fixed sending the text status selected in the corresponding combobox. 2016-01-16 Sergei Golovan * utils.tcl: Don't clean-up the checkbuttons variable before constructing the dialog. This helps to set some checkbuttons in advance by default. * plugins/general/gpgme.tcl: Fixed disabling the ecryption in a groupchat after enabling it there. 2016-01-15 Sergei Golovan * ifacetk/roster.tcl, roster.tcl: Fixed finding the conference roster item in the user's roster, made sure the bare conference JID goes first when rendering the roster tooltip. * plugins/roster/annotations.tcl: Don't add roster item notes to the conference occupants. * ifacetk/roster.tcl: Don't show any info on conference occupants in roster tooltips if ::ifacetk::roster::options(show_conference_user_info) option is disabled. 2016-01-14 Sergei Golovan * plugins/general/gpgme.tcl: Fixed behavior of the dialog with conference participants to encrypt to if there's none of them. Also, removed unnecessary catch guards. * utils.tcl: Add the checkbox dialog title to the dialog window content as well. * plugins/pep/user_avatar.tcl: Started implementing user avatar (XEP-0084) specification. Currently only uploading avatar works. 2016-01-13 Sergei Golovan * plugins/chat/logger.tcl: Fixed bug with names of temporary arrays clash. * tk/bwidget.tcl: Made the 'current' subcommand for a combobox a synonym for 'getvalue' ('current' is taken from ttk::combobox). * plugins/chat/logger.tcl: Implemented showing log messages for all JIDs that correspond to a single metacontact. This closes feature request [7619b16aec]. * README, doc/tkabber.html, doc/tkabber.xml: Clarified a bit information on the ispell plugin options. 2016-01-12 Sergei Golovan * plugins/chat/log_on_open.tcl, plugins/chat/logger.tcl: Read the logged messages not only for the JID which chat window is being opened, but also for all JIDs in a metacontact it belongs. This option is disabled by default. Since the metacontacts info isn't cached locally, this feature doesn't work for windows which open when saved state is restored on Tkabber start. 2016-01-07 Sergei Golovan * plugins/general/gpgme.tcl: Relaxed the strategy of replay attack prevention: don't add own JID but a recipient's JID, and don't add extra info to the presence updates. * login.tcl: Removed the loginconf(sslkeyfile) option, so now if someone wants to use a client sertificate, he'll have to bundle the private key together with the certificate itself. * msgs/ru.msg, msgs/uk.msg: Updated Russian and Ukrainian translations. 2016-01-06 Sergei Golovan * login.tcl, tkabber.tcl: Use 'from' attribute when opening XMPP streams. * login.tcl: Fixed interval between reconnections. 2016-01-04 Sergei Golovan * plugins/general/gpgme.tcl: Improved the fetch key information dialog. * msgs/ru.msg, msgs/uk.msg: Updated Russain and Ukrainian translations. 2016-01-03 Sergei Golovan * plugins/general/gpgme.tcl: Fixed simultaneous encrypting and signing. Moved drawing of GPG icons for outgoing messages from rewrite_outgoing_message_hook to draw_message_hook. Translate the 'This message is encrypted.' auxiliary message to the recipient language instead of our own. * msgs/ca.msg, msgs/de.msg, msgs/eo.msg, msgs/es.msg, msgs/eu.msg, msgs/fr.msg, msgs/nl.msg, msgs/pl.msg, msgs/pt.msg, msgs/ro.msg, msgs/ru.msg, msgs/uk.msg, trans/ca.msg, trans/de.msg, trans/eo.msg, trans/es.msg, trans/eu.msg, trans/fr.msg, trans/nl.msg, trans/pl.msg, trans/pt.msg, trans/ro.msg, trans/ru.msg, trans/uk.msg: Moved the 'This message is encrypted.' message translation to the trans/ subdirectory. 2016-01-02 Sergei Golovan * plugins/chat/empty_body.tcl, plugins/chat/open_window.tcl, plugins/general/xaddress.tcl: Adjusted priorities for the draw_message_hook hook procedures. 2016-01-01 Sergei Golovan * plugins/general/gpgme.tcl: Switched to he gpg package import command for missing GPG key importing from direct gpg binary call. Also, made this import asynchronous. 2015-12-31 Sergei Golovan * plugins/roster/itemedit.tcl: Mitigated race condition with unset variable connected with the roster item nickname. Closes ticket [5f4781f0b9]. 2015-12-29 Sergei Golovan * login.tcl, proxy.tcl: Enabled TLS1.1 and TLS1.2 protocols if they are available. * utils.tcl: Added an optional parameter which makes some of the choices in checkbox dialogs disabled. * plugins/general/gpgme.tcl: Replaced the group encrypt menu by a dialog. Fixed fetching missing key. 2015-12-27 Sergei Golovan * ifacetk/iface.tcl, ifacetk/roster.tcl: Use grid instead of pack for the roster and roster filter because it works better when the main window is being resized. 2015-12-26 Sergei Golovan * plugins/general/gpgme.tcl: Don't look at the GPG_AGENT_INFO environment variable. Just set the passphrase callback property unconditionally because in the presence of gpg-agent it's simply ignored. * login.tcl: Added another user setting. It specifies the maximum time interval between two unsuccessful connection retries. * msgs/ru.msg, msgs/uk.msg: Updated Russian and Ukrainian translations. 2015-12-21 Sergei Golovan * messages.tcl, namespaces.tcl, plugins/roster/rosterx.tcl, roster.tcl: Use ::xmpp::roster::send procedure to send roster items to the user's server. Send the items separately because it's a requirement of RFC-6121. * ttk/bwidget.tcl: Generate event <> for widgets wrapped into a nice bordered ttk::entry only if they actually exist. 2015-12-20 Sergei Golovan * msgs/ru.msg, msgs/uk.msg: Fixed a few words with a little help of a spellchecker. * plugins/chat/log_on_open.tcl, plugins/chat/logger.tcl: Add message type (chat or groupchat) to logs. Added checking for message type when showing a few last messages on opening chat windows. This closes ticket [3cd34577a3]. 2015-12-15 Sergei Golovan * messages.tcl: Split processing OOB and data forms in message attachments. 2015-12-13 Sergei Golovan * plugins/general/remote.tcl: Use [::xmpp::jid::normalize] instead of [string tolower] for JID comparison. * plugins/general/xaddress.tcl: Restricted the JIDs which are allowed to rewrite the 'from' address for incoming messages to my own other resources only. Changed the indicator image to a blue arrow for others. * msgs/ru.msg: Updated Russian translation messages. * msgs/uk.msg, trans/uk.msg: Updated Ukrainian translation messages. 2015-11-19 Sergei Golovan * plugins/general/xaddress.tcl: Do not replace the from stanza attribute with the contents of ofrom XEP-0033 attribute for groupchat messages received directly from a MUC server. Otherwise, the room history in non-anonymous rooms can't be displayed properly. 2015-11-18 Sergei Golovan * plugins/general/gpgme.tcl: Fixed undefined variable in report for the problem with signature checking. 2015-11-12 Sergei Golovan * ttk/bwidget.tcl: Made the Listbox wrapper return a single element (instead of a one element list) when it is called with the get idx subcommand without the second index specified. 2015-10-30 Sergei Golovan * default.tcl: Prepend & by ^ in browse URLs only in case if the Windows shell cmd.exe is the calling command in ::webbrowser. 2015-10-28 Sergei Golovan * default.tcl: Fixed following links with & for the case when the ::webbrowser variable is set on MS Windows. * register.tcl, search.tcl: Fixed the dialog window style for the search and register forms on Mac OS X (see ticket [c91ffc44e0]). 2015-09-18 Sergei Golovan * messages.tcl: Fixed too early unset variable. 2015-08-29 Sergei Golovan * README, doc/tkabber.html, doc/tkabber.xml, tkabber.tcl: Do not emit error message if the stdout isn't available when debugmsg is called. Documented this in the docs. 2015-08-10 Sergei Golovan * COPYING, doc/tkabber.xml, emoticons/default/icondef.xml, pixmaps/default-blue/icondef.xml, pixmaps/default/icondef.xml, pixmaps/feather16/icondef.xml, pixmaps/feather22/icondef.xml, pixmaps/stars/icondef.xml, plugins/chat/abbrev.tcl, plugins/chat/bookmark_highlighted.tcl, plugins/chat/chatstate.tcl, plugins/chat/clear.tcl, plugins/chat/complete_last_nick.tcl, plugins/chat/completion.tcl, plugins/chat/disco.tcl, plugins/chat/draw_error.tcl, plugins/chat/draw_info.tcl, plugins/chat/draw_message.tcl, plugins/chat/draw_normal_message.tcl, plugins/chat/draw_server_message.tcl, plugins/chat/draw_timestamp.tcl, plugins/chat/draw_xhtml_message.tcl, plugins/chat/empty_body.tcl, plugins/chat/events.tcl, plugins/chat/exec_command.tcl, plugins/chat/histool.tcl, plugins/chat/history.tcl, plugins/chat/info_commands.tcl, plugins/chat/insert_nick.tcl, plugins/chat/irc_commands.tcl, plugins/chat/log_on_open.tcl, plugins/chat/logger.tcl, plugins/chat/me_command.tcl, plugins/chat/muc_commands.tcl, plugins/chat/muc_ignore.tcl, plugins/chat/nick_colors.tcl, plugins/chat/open_chat.tcl, plugins/chat/open_window.tcl, plugins/chat/popupmenu.tcl, plugins/chat/postpone.tcl, plugins/chat/shuffle.tcl, plugins/chat/unisymbols.tcl, plugins/chat/update_tab.tcl, plugins/filetransfer/http.tcl, plugins/filetransfer/si.tcl, plugins/general/autoaway.tcl, plugins/general/avatars.tcl, plugins/general/bob.tcl, plugins/general/caps.tcl, plugins/general/captcha.tcl, plugins/general/clientinfo.tcl, plugins/general/comm.tcl, plugins/general/copy_jid.tcl, plugins/general/disco.tcl, plugins/general/geometry.tcl, plugins/general/headlines.tcl, plugins/general/ispell.tcl, plugins/general/message_archive.tcl, plugins/general/nickname.tcl, plugins/general/offline.tcl, plugins/general/rawxml.tcl, plugins/general/remote.tcl, plugins/general/session.tcl, plugins/general/sigh.tcl, plugins/general/sound.tcl, plugins/general/stats.tcl, plugins/general/subscribe_gateway.tcl, plugins/general/tkcon.tcl, plugins/general/xaddress.tcl, plugins/general/xcommands.tcl, plugins/iq/browse.tcl, plugins/iq/last.tcl, plugins/iq/ping.tcl, plugins/iq/time.tcl, plugins/iq/time2.tcl, plugins/iq/version.tcl, plugins/pep/user_activity.tcl, plugins/pep/user_location.tcl, plugins/pep/user_mood.tcl, plugins/pep/user_tune.tcl, plugins/richtext/chatlog.tcl, plugins/richtext/emoticons.tcl, plugins/richtext/highlight.tcl, plugins/richtext/stylecodes.tcl, plugins/richtext/urls.tcl, plugins/roster/annotations.tcl, plugins/roster/backup.tcl, plugins/roster/bkup_annotations.tcl, plugins/roster/bkup_conferences.tcl, plugins/roster/bkup_metacontacts.tcl, plugins/roster/cache_categories.tcl, plugins/roster/conferenceinfo.tcl, plugins/roster/conferences.tcl, plugins/roster/fetch_nicknames.tcl, plugins/roster/itemedit.tcl, plugins/roster/metacontacts.tcl, plugins/roster/rosterx.tcl, plugins/search/browser.tcl, plugins/search/chat.tcl, plugins/search/custom.tcl, plugins/search/headlines.tcl, plugins/search/logger.tcl, plugins/search/muclists.tcl, plugins/search/rawxml.tcl, plugins/search/search.tcl, plugins/search/spanel.tcl, plugins/si/ibb.tcl, plugins/si/iqibb.tcl, plugins/si/socks5.tcl, plugins/unix/dockingtray.tcl, plugins/unix/icon.tcl, plugins/unix/menu.tcl, plugins/unix/systray.tcl, plugins/unix/tktray.tcl, plugins/unix/wmdock.tcl, plugins/windows/console.tcl, plugins/windows/mousewheel.tcl, plugins/windows/taskbar.tcl: Reformatted the code and added Vim modelines. 2015-08-08 Sergei Golovan * plugins/iq/version.tcl: Added version response for Windows 10 (thanks to Vitaly Takmazov). Closes [44f47fb01b]. 2015-07-10 Sergei Golovan * Makefile: Added 'fossil pull' call to the 'up' Makefile target for those who use fossil in manual merge mode. 2015-06-18 Sergei Golovan * Makefile: Replaced -f option to xml2rfc by -o because the former one will phase out in xml2rfc 3.0. 2015-06-17 Sergei Golovan * datagathering.tcl, messages.tcl, plugins/general/gpgme.tcl, utils.tcl: Fixed selecting the URL background for data forms and OOB attachments. Don't use -bg abbreviation for -background. 2015-06-02 Sergei Golovan * plugins/general/gpgme.tcl: Fixed typo. 2015-06-01 Sergei Golovan * plugins/general/gpgme.tcl: Don't add GPG icon to the chatlog window if the message sending is aborted in rewrite_outgoing_message_hook. * chats.tcl: Don't raise exception if chat_win, users_win or input_win are called for a chat which isn't open. Just return empty window name in these cases. 2015-05-29 Sergei Golovan * ifacetk/default.xrdb: Replaced Helvetica by TkDefaultFont in the default settings. * ifacetk/roster.tcl: Fixed the default roter groups background definition for Ttk based interface. 2015-05-25 Sergei Golovan * namespaces.tcl, plugins/general/gpgme.tcl: Refactored the GPG plugin (moved the relevant namespaces definition, removed unnecessary [eval] calls, shortened string comparisons in expressions, added a few extra menus). 2015-05-24 Sergei Golovan * plugins/general/gpgme.tcl: Implemented proof of concept for encrypting groupchat messages. * examples/configs/badlop-config-home.tcl, examples/configs/badlop-config.tcl, examples/configs/config.tcl, examples/configs/mtr-config.tcl, examples/configs/teo-config.tcl, examples/tclCarbonNotification-1.0.0/tclCarbonNotification.tcl, examples/tools/jsend.tcl, examples/tools/rssbot.tcl: Reformatted the code and added Vim modelines. * examples/tools/tkabber_setstatus: Deleted an ugly example. * ifacetk/buttonbar.tcl, ifacetk/default.tcl, ifacetk/iface.tcl, ifacetk/login.tcl, ifacetk/muc.tcl, ifacetk/roster.tcl, ifacetk/systray.tcl: Reformatted the code and added Vim modelines. 2015-05-20 Sergei Golovan * messages.tcl: Replaced modal unsubscribed info dialog by a nonmodal one. * msgs/ca.msg, msgs/de.msg, msgs/eo.msg, msgs/es.msg, msgs/eu.msg, msgs/fr.msg, msgs/nl.msg, msgs/pl.msg, msgs/pt.msg, msgs/ro.msg, msgs/ru.msg, msgs/uk.msg, plugins/general/gpgme.tcl: Added GPG key to the error messages about invalid signatures. Fixed grammar in the error message about failed deciphering. * msgs/pl.rc, msgs/ru.rc, msgs/uk.rc: Fixed formatting. * chats.tcl: Added extra check if the chat window is open before accessing its state variables. 2015-05-18 Sergei Golovan * plugins/general/gpgme.tcl, tkabber.tcl: Moved the GPG support plugin to the plugins directory. 2015-05-17 Sergei Golovan * contrib/extract-translations/extract.tcl, contrib/starkit/main.tcl: Reformatted the code and added Vim modelines. * gpgme.tcl, plugins/chat/send_message.tcl: Moved the encrypted and signed icons drawing code to the place where it should be. Reordered the OTR and GPG icons for outgoing chat messages. * balloon.tcl, chats.tcl, configdir.tcl, custom.tcl, datagathering.tcl, default.tcl, disco.tcl, filetransfer.tcl, gpgme.tcl, hooks.tcl, idna.tcl, iface.tcl, iq.tcl, login.tcl, messages.tcl, muc.tcl, namespaces.tcl, pep.tcl, pixmaps.tcl, plugins.tcl, plugins/chat/send_message.tcl, presence.tcl, privacy.tcl, proxy.tcl, pubsub.tcl, register.tcl, richtext.tcl, roster.tcl, search.tcl, si.tcl, splash.tcl, trans.tcl, userinfo.tcl, utils.tcl, xmppmime.tcl: Reformatted the code and added Vim modelines. * Makefile: Added missing tk and ttk subdirectories. * tk/bwidget.tcl, tk/mclistbox.tcl, ttk/bwidget.tcl, ttk/mclistbox.tcl: Reformatted the code and added Vim modelines. * tkabber.tcl, ttk/mclistbox.tcl: Removed debug printouts. 2015-05-14 Sergei Golovan * richtext.tcl: Replaced %W in binding scripts by the explicit window name because of the Ttk border wrapper. * default.tcl: Do not add the browsed URL to clipboard. It's confusing. 2015-05-12 Sergei Golovan * ifacetk/iface.tcl: Fixed the Tkabber site link background and border for the Ttk based interface. 2015-05-11 Sergei Golovan * tkabber-remote.tcl, tkabber.tcl: Ignore -interface option if its value is not tk or ttk. Also, reformatted the code. * msgs/ca.msg, msgs/de.msg, msgs/eo.msg, msgs/es.msg, msgs/eu.msg, msgs/fr.msg, msgs/it.msg, msgs/nl.msg, msgs/pl.msg, msgs/pt.msg, msgs/ro.msg, msgs/ru.msg, msgs/uk.msg: Added Vim modelines and reformatted the translation files to fit 80 character lines. * trans/de.msg, trans/es.msg, trans/pl.msg, trans/ru.msg, trans/uk.msg: Reformatted the code. * examples/xrdb/badlop-dark.xrdb, examples/xrdb/black.xrdb, examples/xrdb/dark.xrdb, examples/xrdb/dark2.xrdb, examples/xrdb/green.xrdb, examples/xrdb/ice.xrdb, examples/xrdb/light.xrdb, examples/xrdb/lighthouse.xrdb, examples/xrdb/ocean-deep.xrdb, examples/xrdb/teopetuk.xrdb, examples/xrdb/warm.xrdb, ifacetk/default.xrdb, ifacetk/unix.xrdb, tk/default.xrdb, ttk/default.xrdb, msgs/pl.rc, msgs/ru.rc, msgs/uk.rc: Added Vim modeline, reformatted the resource DB files. * ChangeLog, balloon.tcl, chats.tcl, contrib/starkit/README, custom.tcl, default.tcl, doc/tkabber.xml, examples/configs/badlop-config-home.tcl, examples/configs/badlop-config.tcl, examples/configs/mtr-config.tcl, examples/configs/teo-config.tcl, examples/tclCarbonNotification-1.0.0/tclCarbonNotification.tcl, examples/tools/jsend.tcl, examples/tools/rssbot.tcl, examples/xrdb/badlop-dark.xrdb, examples/xrdb/lighthouse.xrdb, examples/xrdb/ocean-deep.xrdb, filetransfer.tcl, gpgme.tcl, idna.tcl, iface.tcl, ifacetk/buttonbar.tcl, ifacetk/login.tcl, ifacetk/systray.tcl, msgs/ca.msg, msgs/es.msg, msgs/it.msg, msgs/pl.msg, msgs/ro.msg, msgs/ru.msg, msgs/uk.msg, namespaces.tcl, plugins/chat/abbrev.tcl, plugins/chat/bookmark_highlighted.tcl, plugins/chat/completion.tcl, plugins/chat/draw_xhtml_message.tcl, plugins/chat/exec_command.tcl, plugins/chat/histool.tcl, plugins/chat/history.tcl, plugins/chat/info_commands.tcl, plugins/chat/log_on_open.tcl, plugins/chat/logger.tcl, plugins/chat/muc_ignore.tcl, plugins/chat/nick_colors.tcl, plugins/chat/popupmenu.tcl, plugins/chat/update_tab.tcl, plugins/filetransfer/http.tcl, plugins/filetransfer/si.tcl, plugins/general/autoaway.tcl, plugins/general/clientinfo.tcl, plugins/general/headlines.tcl, plugins/general/ispell.tcl, plugins/general/message_archive.tcl, plugins/general/offline.tcl, plugins/general/rawxml.tcl, plugins/general/sound.tcl, plugins/general/stats.tcl, plugins/general/subscribe_gateway.tcl, plugins/general/tkcon.tcl, plugins/general/xaddress.tcl, plugins/general/xcommands.tcl, plugins/iq/browse.tcl, plugins/iq/time.tcl, plugins/iq/time2.tcl, plugins/iq/version.tcl, plugins/richtext/stylecodes.tcl, plugins/richtext/urls.tcl, plugins/roster/conferenceinfo.tcl, plugins/roster/conferences.tcl, plugins/roster/metacontacts.tcl, plugins/roster/rosterx.tcl, plugins/search/search.tcl, plugins/si/socks5.tcl, plugins/unix/menu.tcl, plugins/unix/wmdock.tcl, plugins/windows/console.tcl, presence.tcl, privacy.tcl, proxy.tcl, pubsub.tcl, richtext.tcl, roster.tcl, search.tcl, tk/mclistbox.tcl, ttk/bwidget.tcl, ttk/mclistbox.tcl: Removed trailing whitespaces from all over the code. 2015-05-10 Sergei Golovan * README, doc/tkabber.html, doc/tkabber.xml, tkabber.tcl: Bumped the Tkabber version to 1.1.2. * ifacetk/roster.tcl: Fixed the roster relief and border for the Ttk based interface. * ifacetk/buttonbar.tcl: Fixed getting buttonbar item properties. * tk/bwidget.tcl, ttk/bwidget.tcl: Wrapped scrollbar and ttk::scrollbar. 2015-05-09 Sergei Golovan * ttk/bwidget.tcl: Fixed inserting the parent path into the wrapped widget bindtags. * tk/bwidget.tcl, ttk/bwidget.tcl: Added the simple [Scale] wrapper. 2015-05-08 Sergei Golovan * plugins/general/disco.tcl: Fixed dropping JIDs over the JID combobox for Tk interface. Fixed doubleclick and Return bindings for Ttk interface. Fixed balloon display (and disable d it anyway). 2015-05-07 Sergei Golovan * ifacetk/iface.tk: Fixed updating tabs if there's no open chats or groupchats. * plugins/chat/histool.tcl: Adapted the chat history tool plugin to the Ttk interface. * tk/bwidget.tcl: Set the padding in notebook pages to 2mm. Cleaned up code a bit. * ttk/bwidget.tcl: Fixed modify command in comboboxes, added 2mm padding to notebook pages, extended the listbox-like wrapper to ttk::treeview. Cleaned up code a bit. 2015-05-05 Sergei Golovan * plugins/chat/muc_ignore.tcl: Adapted (unfinished) ignore list editor to the recent changes in Tree. 2015-05-04 Sergei Golovan * plugins/general/offline.tcl: Adapted to the changes in Tree widget. * register.tcl: Fixed displaying the registering result. * balloon.tcl, plugins/general/disco.tcl, plugins/general/headlines.tcl, plugins/search/headlines.tcl, plugins/search/search.tcl, tk/bwidget.tcl, tk/disco.tcl, tkabber.tcl, ttk/bwidget.tcl: Created a wrapper around the BWidget's Tree widget to match ttk::treeview interface. Use it for service discovery, headlines and searching in trees and headlines. * datagathering.tcl, msgs/ca.msg, msgs/de.msg, msgs/es.msg, msgs/fr.msg, msgs/it.msg, msgs/nl.msg, msgs/pl.msg, msgs/pt.msg, msgs/ru.msg, msgs/uk.msg: Moved processing the ejabberd:config disco feature to the external Ejabberd admin plugin. * plugins/chat/log_on_open.tcl: Disabled loading last messages from the log in groupchats by default to make this feature less confusing. 2015-05-03 Sergei Golovan * muc.tcl, plugins/chat/log_on_open.tcl: Show the last messages from the history not only for chats but also for groupchats (thanks to Sergey Alirzaev). 2015-05-01 Sergei Golovan * plugins/general/bob.tcl, plugins/general/caps.tcl, plugins/general/captcha.tcl, plugins/general/clientinfo.tcl, plugins/general/comm.tcl, plugins/general/copy_jid.tcl, plugins/general/geometry.tcl, plugins/general/ispell.tcl, plugins/general/nickname.tcl, plugins/general/sigh.tcl: Removed the Subversion keyword placeholders and added short file descriptions where necessary. * plugins/general/avatars.tcl, plugins/general/subscribe_gateway.tcl, plugins/general/xcommands.tcl: Adapted to Ttk. * ttk/bwidget.tcl: Fixed the selection subcommand for the wrapped listbox. * plugins/roster/metacontacts.tcl: Adapted the metacontacts plugin interface to Ttk. * ttk/bwidget.tcl: Wrapped index and bbox commands for the Listbox wrapper around ttk::treeview. * plugins/roster/rosterx.tcl: Adapted the roster item exchange plugin to Ttk. * utils.tcl: Removed a separator from checkbox dialogs. * plugins/roster/annotations.tcl: Adapted roster notes plugin to Ttk. * ttk/bwidget.tcl: Fixed selecting items in the ttk::treeview based listboxes. * plugins/roster/backup.tcl, plugins/roster/bkup_annotations.tcl, plugins/roster/bkup_conferences.tcl, plugins/roster/bkup_metacontacts.tcl, plugins/roster/conferenceinfo.tcl, plugins/roster/fetch_nicknames.tcl: Removed Subversion keyword placeholders, added short file descriptions if missing. 2015-04-24 Sergei Golovan * userinfo.tcl: Define all variables for entries and spinboxes because [ttk::entry] doesn't define the associated variable until it's actually edited. 2015-04-21 Sergei Golovan * contrib/starkit/README, contrib/starkit/main.tcl, examples/configs/config.tcl, plugins/si/ibb.tcl, plugins/si/iqibb.tcl: Removed Subversion keyword placeholders. * plugins/search/custom.tcl, plugins/search/logger.tcl: Added a short file description. * plugins/search/muclists.tcl, plugins/search/search.tcl, ttk/mclistbox.tcl: Adapted searching in MUC user lists to Ttk. * ifacetk/muc.tcl: Fixed typo. * plugins/richtext/chatlog.tcl, plugins/richtext/stylecodes.tcl, plugins/richtext/urls.tcl: Removed Subversion keyword placeholders and added short file descriptions. * pep.tcl, plugins/pep/user_activity.tcl, plugins/pep/user_location.tcl, plugins/pep/user_mood.tcl, plugins/pep/user_tune.tcl, ttk/bwidget.tcl: Adapted PEP modules to the themed widgets. * plugins/windows/console.tcl: Added short file description. Code cleanup. * filetransfer.tcl: Adapted file transfer sending dialog to Ttk. * plugins/iq/browse.tcl, plugins/iq/last.tcl, plugins/iq/version.tcl, plugins/windows/mousewheel.tcl: Added short file descriptions. * plugins/filetransfer/http.tcl, plugins/filetransfer/si.tcl: Adapted file transfer receiving dialogs to themable widgets. 2015-04-20 Sergei Golovan * search.tcl: Fixed selecting JID for a context menu in case if it's reported not as the first field. * tk/bwidget.tcl: Fixed typo. 2015-04-19 Sergei Golovan * gpgme.tcl, plugins/chat/logger.tcl, plugins/chat/nick_colors.tcl: Adapted to Ttk. * tk/bwidget.tcl: Code cleanup. 2015-04-18 Sergei Golovan * examples/xrdb/badlop-dark.xrdb, examples/xrdb/black.xrdb, examples/xrdb/dark.xrdb, examples/xrdb/dark2.xrdb, examples/xrdb/green.xrdb, examples/xrdb/ice.xrdb, examples/xrdb/light.xrdb, examples/xrdb/lighthouse.xrdb, examples/xrdb/ocean-deep.xrdb, examples/xrdb/teopetuk.xrdb, examples/xrdb/warm.xrdb: Reviewed color themes, updated checkbutton and radiobutton colors for menu items. * tkabber.tcl: Added -interface command line option which can be either tk or ttk. It defines a global variable $interface that can be used in config file and elsewhere. * configdir.tcl: Switched back to tk_messageBox because this script is run before the BWidget is required. * plugins/chat/abbrev.tcl, plugins/chat/chatstate.tcl, plugins/chat/complete_last_nick.tcl, plugins/chat/completion.tcl, plugins/chat/disco.tcl, plugins/chat/draw_timestamp.tcl, plugins/chat/insert_nick.tcl, plugins/chat/log_on_open.tcl, plugins/chat/me_command.tcl, plugins/chat/muc_commands.tcl, plugins/chat/open_window.tcl, plugins/chat/popupmenu.tcl, plugins/chat/postpone.tcl, plugins/chat/send_message.tcl, plugins/chat/shuffle.tcl, plugins/chat/unisymbols.tcl, plugins/chat/update_tab.tcl: Added short file descriptions. * ifacetk/buttonbar.tcl: Fixed typo. 2015-04-17 Sergei Golovan * ifacetk/buttonbar.tcl: Fixed itemcget command. Fixed declaring the buttonbar widget for Ttk interface. Partially fixed itemconfigure command. * tk/bwidget.tcl: Use option -mode from [ttk::progressbar] for the [Progressbar] wrapper. * tk/bwidget.tcl: Increased default -deltax and -deltay options for the [Tree] widget. * search.tcl, tk/mclistbox.tcl, ttk/mclistbox.tcl: Now popup menu is working for both Tk and Ttk mclistboxes. * ifacetk/muc.tcl, plugins/general/message_archive.tcl, search.tcl, tk/mclistbox.tcl, ttk/mclistbox.tcl: A bit simplified mclistbox programming interface. Now wrapper around [ttk::treeview] is almost working. Reimplemented columnwize sorting. 2015-04-16 Sergei Golovan * ifacetk/muc.tcl, plugins/general/message_archive.tcl, search.tcl, tk/mclistbox.tcl: Add spaces on both sides of displayed string in the mclistbox fields inside [mclistbox insert] routine. * plugins/general/message_archive.tcl: Optimized adding messages to the listbox. * Makefile, tk/mclistbox.tcl, tkabber.tcl, ttk/mclistbox.tcl: Moved the mclistbox widget to the tk/ subdirectory and started to implement a wrapper around ttk::treeview with the same interface. * ifacetk/muc.tcl: Fixed typo. * mclistbox/mclistbox.tcl: Changed a default option. * ifacetk/muc.tcl, messages.tcl, pubsub.tcl, tk/bwidget.tcl: Implemented 'set' command for the BWidget combobox and use it. Use wrapped widget calls in MUC dialogs. * ifacetk/default.tcl: Added Treeview scroll bindings. Renamed and added a short file description. * ttk/bwidget.tcl: Added selection set command to a [Listbox] wrapper. * register.tcl: Use the [Toplevel] wrapper to fix the toplevel window background color. * muc.tcl: Adapted displaying invitations to a conference to Ttk. * messages.tcl: Adapted send and receive message dialogs to Ttk. * tk/disco.tcl: Fixed the drop command arguments. * ttk/bwidget.tcl: Fixed typo. * plugins/roster/itemedit.tcl, tkabber.tcl: Moved itemedit.tcl to the roster plugins directory. * plugins/roster/conferences.tcl: Adapted editing group options in roster and add conference to roster dialog to Ttk. * custom.tcl: Use [Text] wrapper for the fields widget. * ttk/bwidget.tcl: Implemented [Listbox] as a wrapper to [ttk::treeview] with incomplete command list from [listbox]. * itemedit.tcl: Adapted editing roster nickname and groups to Ttk. * custom.tcl, datagathering.tcl: Minor changes. 2015-04-15 Sergei Golovan * ifacetk/roster.tcl: Fixed drag'n'drop of roster items for Ttk. * userinfo.tcl: Use ordinary Tk entries and texts with customized backgrounds to create smooth info frames. * chats.tcl, plugins/general/rawxml.tcl, plugins/search/rawxml.tcl, utils.tcl: Use the [Wrapped] command. * tk/bwidget.tcl, ttk/bwidget.tcl: Code cleanup. Also added [Wrapped] procedure which returns the name of the widget wrapped into Ttk frame. Added a few command to the Notebook collection. 2015-04-14 Sergei Golovan * userinfo.tcl: Removed overrideredirect commands. * chats.tcl, custom.tcl, plugins/chat/history.tcl, plugins/chat/muc_ignore.tcl, plugins/general/rawxml.tcl, plugins/search/chat.tcl, plugins/search/rawxml.tcl, ttk/bwidget.tcl: Since text widgets in ttk interface are wrapped in a frame (which is used to draw a nice themable focus border) it's hard to bind events to the wrapper frame. So, now procedures [chat::input_win] and [rawxml::input_win] return real name of the text widget. * plugins/search/search.tcl, plugins/search/spanel.tcl: Adapted the search panel to Ttk. * ifacetk/roster.tcl: Removed horizontal scrollbars from rosters. * register.tcl: Adapted register user interface to Ttk. * ttk/disco.tcl: Fixed adding featured item nodes. * plugins/general/remote.tcl: Fixed typo. * pubsub.tcl: Adapted publish/subscribe user interface to Ttk. * userinfo.tcl: Use a bit of padding inside label frames. * proxy.tcl, tk/bwidget.tcl: Adapted proxy profiles user interface to Ttk. * privacy.tcl: Adapted privacy rules user interface to Ttk. * splash.tcl, tk/bwidget.tcl, tkabber.tcl, ttk/bwidget.tcl: Adapted splash window to Ttk. This required wrapping progressbar widgets. * ttk/bwidget.tcl, userinfo.tcl: Adapted userinfo window to Ttk. This required enhancing notebook wrapper. * ifacetk/login.tcl, ifacetk/roster.tcl, login.tcl, presence.tcl, utils.tcl: Use wrapped widget procedures to make them working both in Tk and Ttk environment. * idna.tcl, iq.tcl, namespaces.tcl, pep.tcl, pixmaps.tcl, plugins.tcl, register.tcl, richtext.tcl, trans.tcl, xmppmime.tcl: Removed SVN keyword placeholders and clarified the file descriptions. * chats.tcl, ifacetk/iface.tcl, ifacetk/roster.tcl, plugins/chat/chatstate.tcl, plugins/chat/events.tcl, richtext.tcl, utils.tcl: Use wrapped widget procedures to make them working both in Tk and Ttk environment. * tk/bwidget.tcl, ttk/bwidget.tcl: Wrapped text, listbox and canvas widget to make them look better in Ttk environment. Prettified some code. * ifacetk/default.xrdb, messages.tcl: Fixed menubuttons look. 2015-04-13 Sergei Golovan * README, doc/tkabber.html, doc/tkabber.xml, filters.tcl, msgs/ca.msg, msgs/de.msg, msgs/eo.msg, msgs/es.msg, msgs/eu.msg, msgs/fr.msg, msgs/it.msg, msgs/nl.msg, msgs/pl.msg, msgs/pt.msg, msgs/ro.msg, msgs/ru.msg, msgs/uk.msg, splash.tcl, tkabber.tcl: Removed obsolete message filter support (actually, moved it to an external plugin). * ifacetk/iface.tcl: Fixed background for the About window. * filters.tcl, tk/bwidget.tcl, ttk/bwidget.tcl: Adapted obsolete Jabber 1.4 filters to Ttk. * plugins/general/rawxml.tcl, ttk/bwidget.tcl: Adapted raw XML window plugin to Ttk. * ttk/disco.tcl: Fixed drag'n'drop and rearranging tree items. * disco.tcl, plugins/search/browser.tcl, tk/disco.tcl, tkabber.tcl, ttk/disco.tcl: Reimplemented service discovery browser for Ttk. * configdir.tcl, default.tcl: Fixed the message dialogs. * ifacetk/buttonbar.tcl: Fixed configuring individual button font and foreground color. * configdir.tcl, datagathering.tcl, tk/bwidget.tcl, ttk/bwidget.tcl: Use wrappers over either Tk or Ttk widgets. * tkabber.tcl: Don't load the default unix XRDB resources if a themed widget set is used. Unconditionally load the default XRDB file with window sizes. * ifacetk/buttonbar.tcl: Fixed style from which button options are taken. Convert these options to pixels. 2015-04-12 Sergei Golovan * tkabber.tcl: Switch on the Ttk support in BWidget. * custom.tcl: Adapted to Ttk. * ttk/bwidget.tcl: Overloaded tk_optionMenu. * custom.tcl, filters.tcl, gpgme.tcl, ifacetk/roster.tcl, mclistbox/mclistbox.tcl, plugins/chat/logger.tcl, plugins/general/rawxml.tcl, proxy.tcl, splash.tcl, tk/bwidget.tcl, tkabber.tcl, userinfo.tcl: Removed tk_relief, tk_borderwidth and tk_highlightthickness variables. * tk/bwidget.tcl: Removed no longer necessary workaround. * ttk/bwidget.tcl: Fixed destroying the dialog and buttonbox frame. * balloon.tcl, chats.tcl, gpgme.tcl, ifacetk/buttonbar.tcl, ifacetk/default.xrdb, ifacetk/iface.tcl, ifacetk/login.tcl, plugins/general/headlines.tcl, plugins/general/message_archive.tcl, plugins/general/rawxml.tcl, tk/bwidget.tcl, tk/default.xrdb, tkabber.tcl, ttk/bwidget.tcl, ttk/default.xrdb, userinfo.tcl, utils.tcl: Started adapting the code to Ttk. 2015-04-05 Sergei Golovan * ifacetk/login.tcl, login.tcl: Added configuration option for stream management (XEP-0198). 2015-04-03 Sergei Golovan * ifacetk/roster.tcl, presence.tcl: Removed unnecessary [format] calls. * gpgme.tcl, hooks.tcl, iface.tcl, ifacetk/iface.tcl, mclistbox/mclistbox.tcl, muc.tcl, plugins/chat/bookmark_highlighted.tcl, plugins/chat/histool.tcl, plugins/chat/logger.tcl, plugins/chat/nick_colors.tcl, plugins/general/headlines.tcl, plugins/general/xaddress.tcl, plugins/iq/ping.tcl, plugins/pep/user_location.tcl, plugins/roster/annotations.tcl, plugins/roster/cache_categories.tcl, plugins/roster/metacontacts.tcl, plugins/si/socks5.tcl, proxy.tcl, search.tcl, splash.tcl, tkabber-remote.tcl: Replaced [lsearch] calls by 'in' or 'ni' expressions. Added headers with short description. * default.tcl, msgs/de.msg, msgs/es.msg, msgs/it.msg, msgs/nl.msg, msgs/pl.msg, msgs/ru.msg, msgs/uk.msg: Added one more example for the ::webbrowser variable setting. 2015-04-01 Sergei Golovan * msgs/ru.msg: Updated Russian translations. 2015-03-31 Sergei Golovan * plugins/general/autoaway.tcl: Fixed restoring user status and text status in case when Tkabber dies in autoaway state (closes: [73ec6fa7ee]). * README, doc/tkabber.html, doc/tkabber.xml: Removed notes about tkXwin and tclWinidle because they aren't necessary for autoaway to work with Tcl/Tk 8.5. * tkabber.tcl: Explicitly require Tk 8.5 or newer to run. * Tclx.tcl, balloon.tcl, chats.tcl, custom.tcl, datagathering.tcl, disco.tcl, examples/configs/mtr-config.tcl, filetransfer.tcl, filters.tcl, ifacetk/bwidget_workarounds.tcl, ifacetk/login.tcl, ifacetk/muc.tcl, ifacetk/roster.tcl, ifacetk/systray.tcl, itemedit.tcl, login.tcl, messages.tcl, plugins/chat/clear.tcl, plugins/chat/draw_error.tcl, plugins/chat/draw_info.tcl, plugins/chat/draw_message.tcl, plugins/chat/draw_normal_message.tcl, plugins/chat/draw_server_message.tcl, plugins/chat/draw_xhtml_message.tcl, plugins/chat/empty_body.tcl, plugins/chat/events.tcl, plugins/chat/exec_command.tcl, plugins/chat/history.tcl, plugins/chat/info_commands.tcl, plugins/chat/irc_commands.tcl, plugins/chat/open_chat.tcl, plugins/chat/popupmenu.tcl, plugins/filetransfer/http.tcl, plugins/general/avatars.tcl, plugins/general/message_archive.tcl, plugins/general/offline.tcl, plugins/general/rawxml.tcl, plugins/general/remote.tcl, plugins/general/session.tcl, plugins/general/sound.tcl, plugins/general/stats.tcl, plugins/general/tkcon.tcl, plugins/general/xcommands.tcl, plugins/iq/last.tcl, plugins/richtext/emoticons.tcl, plugins/richtext/highlight.tcl, plugins/roster/conferences.tcl, plugins/roster/rosterx.tcl, plugins/unix/dockingtray.tcl, plugins/unix/menu.tcl, plugins/unix/systray.tcl, plugins/unix/tktray.tcl, plugins/unix/wmdock.tcl, plugins/windows/taskbar.tcl, presence.tcl, privacy.tcl, pubsub.tcl, roster.tcl, si.tcl, tkabber.tcl, userinfo.tcl, utils.tcl: Removed Tclx procedure calls (specifically, [cconcat], [cequal], [clength], [crange], [lcontain], [lempty], [lvarpop], [lvarpush], [lrmdups], [max], [min]). Also, added headers with short description. 2015-03-30 Sergei Golovan * ifacetk/iface.tcl, msgs/de.msg, msgs/es.msg, msgs/pl.msg, msgs/ru.msg, msgs/uk.msg: Relocated the profiling menu items to the Debug external plugin. * disco.tcl, ifacetk/muc.tcl, messages.tcl, utils.tcl: Replaced inappropriate calls to ::xmpp::xml::getAttr by calls to a generic get_prop procedure. 2015-03-29 Sergei Golovan * plugins/chat/info_commands.tcl, plugins/iq/time.tcl, plugins/iq/time2.tcl, plugins/unix/icon.tcl: Dropped Tcl/Tk 8.4 support. * plugins/unix/menu.tcl: Removed code which runs on Tcl/Tk 8.3 only. * configdir.tcl, gpgme.tcl, ifacetk/buttonbar.tcl, ifacetk/bwidget_workarounds.tcl, ifacetk/iface.tcl, messages.tcl, userinfo.tcl, utils.tcl: Removed pieces of code which work with Tcl/Tk 8.3 or 8.4 only. * README, doc/tkabber.html, doc/tkabber.xml: Added a short note on installation of Tcl UDP extension for proper DNS resolving. * README, doc/tkabber.html, doc/tkabber.xml: Bumped required Tcl/Tk version to 8.5.8. Also, bumped a few other dependencies versions. * msgs/de.msg, trans/de.msg: Converted to UTF-8. * msgs/*, trans/*: Added headers with short file descriptions. 2015-03-27 Sergei Golovan * default.tcl: Added xdg-open and sensible browser to the browsers list. Don't try complicated options, just run 'browser url'. * default.tcl: Remove DDE calls to open browsers on Windows. Use only the command shell with the start command. * richtext.tcl: Allow command prefixes as entity parsers. 2015-03-26 Sergei Golovan * README, doc/tkabber.html, doc/tkabber.xml: Added a note that 1.1.1 is the last version that works with Tcl/Tk 8.4. 2015-03-25 Sergei Golovan * README, doc/tkabber.html, doc/tkabber.xml, tkabber.tcl: Changed version to 1.1.1, added a few lines on notable changes in version 1.1.1. * README, doc/tkabber.html, doc/tkabber.xml: Moved description for rewrite_outgoing_message_hook to the appropriate message hooks section. Fixed a few typos. * msgs/ru.msg: Updated Russian translations. * README, doc/tkabber.html, doc/tkabber.xml, ifacetk/iface.tcl, splash.tcl: Extended copyright interval. * Makefile: Prettified rules for generating docs. * doc/tkabber.html, doc/tkabber.xml, README: Added a short section on upgrade from version 1.0, put all section on upgrading to subsections of a new top level section 'Upgrading'. * tkabber.tcl: Guess the VCS for Tkabber version string based on file or subdirectory in the Tkabber directory. 2015-03-24 Sergei Golovan * Makefile: Add 'up' target which updates Tkabber and nested TclXMPP from their Fossil repositories. * doc/tkabber.html, doc/tkabber.xml, README: Replace the links to the old Tkabber third party repository (SVN) by the new ones (Fossil). 2015-03-22 Sergei Golovan * doc/tkabber.html, doc/tkabber.xml, README: Replaced the links to the old Tkabber, Tkabber plugins and TclXMPP repositories (SVN) by the new ones (Fossil). * tkabber.tcl: replaced svn by fossil in the development version string. 2015-03-17 Sergei Golovan * doc/tkabber.html, doc/tkabber.xml, README: Replaced the old TclGPG link (https://code.google.com/p/tclgpg/) by the new one (https://chiselapp.com/user/sgolovan/repository/tclgpg/). * Makefile: Adapted the doc target to the newer xml2rfc command line syntax. 2015-02-11 Sergei Golovan * default.tcl: Made use of the $::webbrowser config variable more robust (for example, allowed spaces inside the browser path). 2015-02-08 Sergei Golovan * datagathering.tcl: Destroy all open data windows on disconnect because the forms they access expire. * default.tcl: Fixed browsing URLs with $ and [ in them. 2014-12-27 Sergei Golovan * muc.tcl: Added title to the configure room dialog window for the case if the MUC server haven't supplied one. * msgs/ru.msg: Updated Russian translations. 2014-12-20 Sergei Golovan * datagathering.tcl, plugins/general/captcha.tcl: Added title to the jabber:x:data form windows. Use it for the CAPTCHA dialogs. * msgs/ru.msg: Updated Russian translations. 2014-12-09 Sergei Golovan * gpgme.tcl: Fixed bug when unencrypted message is sent despite of canceling in in the message dialog. The bug was introduced when GPG support was rewritten as a plugin to be compatible with OTR. 2014-12-05 Sergei Golovan * register.tcl: Fixed processing the result of password change form submit. 2014-10-29 Sergei Golovan * ifacetk/muc.tcl: Added chatroom menu item which opend edit room info dialog. * msgs/ru.msg: Updated Russian translation. * userinfo.tcl: Fixed setting vcard for a given JID which is not the same as yhe user's own JID. 2014-10-20 Sergei Golovan * tkabber-remote.tcl: Fixed usage for -eval command. * plugins/general/comm.tcl: Removed extra eval from the command call. 2014-05-08 Sergei Golovan * plugins/chat/completion.tcl: Use Shift-Tab to search through the completion choices backward. Also, did a bit of code cleanup. 2014-05-02 Sergei Golovan * presence.tcl: Fixed caching maximum JID priority for a roster contact. 2014-04-27 Sergei Golovan * utils.tcl: Fixed typo in a comment. 2014-04-04 Sergei Golovan * doc/tkabber.html, doc/tkabber.xml, README: Fixed typo in the Snack version requirement. 2014-03-20 Sergei Golovan * plugins/chat/muc_ignore.tcl: Added /ignore and /unignore groupchat window commands (thanks to Alexey Ignatov). 2014-02-27 Sergei Golovan * ifacetk/roster.tcl: Return unavailable icon instead of unsubscribed if the contact is not in the roster (these icons are shown only in chat windows, where unavailable icon is more appropriate). 2014-02-15 Sergei Golovan * plugins/roster/conferences.tcl: Fixed processing autojoin attribute (thanks to Vitaly Takmazov). 2014-02-14 Sergei Golovan * doc/tkabber.html, doc/tkabber.xml, README: Added changes for the upcoming 1.1 release. * *: 1.1 is released. * tkabber.tcl: Changed version prefix to 1.1. 2014-02-10 Sergei Golovan * plugins/general/subscribe_gateway.tcl: Fixed managing subscription request body. 2014-02-02 Sergei Golovan * plugins/general/sigh.tcl, plugins/chat/shuffle.tcl: Disabled prank plugins. * roster.tcl: Optionally cache roster offline and use roster versioning as in XEP-0237 and later in RFC-6121 (thanks to Jan Zachorowski). 2014-01-30 Sergei Golovan * plugins/chat/logger.tcl: Store 'me' attribute in log files and use it to show the user's own messages. 2014-01-27 Sergei Golovan * gpgme.tcl, presence.tcl: Fixed checking message signature in case when another plugin (like OTR) rewrites message body. Optionally add the user's JID and timestamp to outgoing messages to prevent replay attacks. Unfortunately, these JIDs and timestamps aren't shown in user's own chat log. 2014-01-26 Sergei Golovan * plugins/chat/logger.tcl, plugins/general/message_archive.tcl: Removed fake tkabber:x:dontlog namespace processing. Implemented omitting the logs using flags in an appropriate hook. * messages.tcl: Introduced send_normal_message_hook which executes when message is to be sent from a send message dialog. Moved logging of incoming messages to process_message_hook, and logging of outgoing messages to send_normal_message_hook. Use log flag in this hooks to disable logging. Use send flag in rewrite_outgoing_message_hook to disable actual sending. * hooks.tcl: Initialize flags variable when hook is created. * gpgme.tcl, utils.tcl, disco.tcl, search.tcl, privacy.tcl, ifacetk/iface.tcl, ifacetk/roster.tcl, ifacetk/idefault.tcl, plugins/chat/popupmenu.tcl, plugins/unix/tktray.tcl, plugins/unix/systray.tcl, plugins/unix/dockingtray.tcl, plugins/unix/wmdock.tcl, plugins/general/headlines.tcl, plugins/general/offline.tcl, plugins/general/message_archive.tcl, plugins/roster/metacontacts.tcl: Replaced direct bindings to mouse buttons 2 and 3 by virtual events <> and <>, because in MacOSX and in Unix buttons 2 and 3 correspond to different mous buttons (thanks to Vitaly Takmazov). * ifacetk/systray.tcl: Added option not to change the systray icon when a groupchat message which is not highlighted is received. * hooks.tcl: Ensure that hook flags variable exists. 2014-01-22 Sergei Golovan * gpgme.tcl, chats.tcl: Adjusted priority of rewrite_message_hook items. 2014-01-20 Sergei Golovan * messages.tcl: Don't send the message if its destination JID is rewritten into an emty string in rewrite_outgoing_message_hook. 2014-01-19 Sergei Golovan * plugins/chat/open_window.tcl: Open a chat (and not a groupchat) window if an info message is displayed first. 2014-01-16 Sergei Golovan * ifacetk/iface.tcl: Fixed encoding the primary X selection in chat input windows if it is empty. 2014-01-12 Sergei Golovan * plugins/chat/logger.tcl, plugins/general/message_archive.tcl: added another way of signalling if a message should not be logged. * presence.tcl: Store presence xml:lang attribute. * messages.tcl, gpgme.tcl: Introduced new rewrite_outgoing_message_hook and moved GPG encryption and signing to this hook. 2014-01-07 Sergei Golovan * chats.tcl, ifacetk/roster.tcl, muc.tcl, plugins/general/remote.tcl, roster.tcl: Added a few checks if roster::find_jid returns empty string. 2014-01-01 Sergei Golovan * *: 1.0 is released. * tkabber.tcl: Bumped version prefix to 1.0. * proxy.tcl: Don't crash if there's no plugins/general/comm.tcl available. 2013-12-31 Sergei Golovan * login.tcl: Define the autologin variable in Customize interface. * login.tcl, plugins/iq/ping.tcl: Added option to use ping only for TCP based connections. Switch default behavior to ping TCP based connections only. * msgs/ru.msg: Updated Russian translation. * chats.tcl: Changed default value for smart scroll to enabled. * muc.tcl: Request only unseen history by default. * disco.tcl, ifacetk/bwidget_workarounds.tcl, plugins/general/headlines.tcl, plugins/general/offline.tcl: Use the chat font linespace for the vertical space between tree branches. It isn't perfect, but works in most cases. * Makefile: Changed mkdir and cp by install where appropriate. 2013-12-30 Sergei Golovan * README, doc/tkabber.html, doc/tkabber.xml: Added section which explains how to modify proxy configuration when upgrading from the older Tkabber versions. * tkabber-remote.tcl: Take config directory from the TKABBER_HOME environment variable if it is set. This partly mitigates the problem that tkabber-remote.tcl cant find comm.PID files on non-unix platforms. * proxy.tcl: Added mousewheel scroll for proxy list in the manage proxy servers dialog window. * ifacetk/systray.tcl: Added new restore_main_window_hook hook which runs right after the main window is restored from tray. 2013-12-29 Sergei Golovan * login.tcl: Added missing global definition. 2013-12-27 Sergei Golovan * README, doc/tkabber.html, doc/tkabber.xml: Added a short description for proxy profiles management. Fixed a few typos and added some clarifications. 2013-12-26 Sergei Golovan * README, doc/tkabber.html, doc/tkabber.xml: Added a few hooks description. 2013-12-25 Sergei Golovan * plugins/iq/version.tcl: Recognize Windows 8.1 (as Windows NT 6.3). * README, doc/tkabber.html, doc/tkabber.xml: Added small notes on 3rd party plugins repository and about BOSH connection method. * proxy.tcl: Added GUI for choosing proxy profiles defined in the config file. Implemented remote proxy profile changing via the tkabber-remote script. * tkabber-remote.tcl: Added a small example with list-commands to the usage message. Report PIDs of responded Tkabber processes. * msgs/ru.msg: Updated Russian translation. * login.tcl: Enable autoreconnect only after successful login, otherwise unwanted reconencts happen when server closes stream just after unsuccessful authentication. 2013-12-24 Sergei Golovan * README, doc/tkabber.html, doc/tkabber.xml, ifacetk/iface.tcl, splash.tcl: Updated copyright years. * README, doc/tkabber.html, doc/tkabber.xml: Added the changes list, removed traces of Tcl/Tk 8.3, added note on installing Snack. 2013-12-23 Sergei Golovan * msgs/ru.msg: Updated Russian translation. 2013-12-22 Sergei Golovan * login.tcl: Reduced boshhold default option to 1 because 2 is proved not to work with ejabberd mod_http_bind. Enabled TLSv1 because it is disabled in the tls Tcl extension by default. 2013-12-03 Sergei Golovan * proxy.tcl: Enabled TLS1 for secure HTTP connections because there are servers which have disabled SSLv3. * ifacetk/login.tcl, login.tcl: Added BOSH XMPP transport support. 2013-09-15 Sergei Golovan * default.tcl: Replace backslash by %5c in URLs which are passed to a browser. * doc/tkabber.xml, doc.tkabber.html, README, splash.tcl, ifacetk/iface.tcl: Added 2013 to the copyright notice. 2013-07-26 Sergei Golovan * plugins/general/sound.tcl: Use the sound package instead of snack to prevent unnecessary Tk loading in case of using a separate thread for playing sound. 2013-07-06 Sergei Golovan * plugins/search/search.tcl: Generate <> event on found item highlight. This helps to perform some additional tasks during the search. 2013-07-04 Sergei Golovan * ifacetk/muc.tcl: Added a new hook which is called after a MUC affiliation or role list dialog is constructed. * plugins/search/muclists.tcl: Implemented search in MUC affiliation and role lists. * plugins/search/search.tcl: Fixed search highlighting in multicolumn listboxes. * plugins/search/spanel.tcl: Do not propagate Return and Shift-Return events to make search bindings working in dialogs also. 2013-07-03 Sergei Golovan * plugins/search/search.tcl: Added code for searching in multicolumn listboxes. 2013-05-20 Sergei Golovan * messages.tcl: Fixed choosing the outgoing connection when sending normal messages using 'Services->Send message' menu item. 2013-02-20 Sergei Golovan * plugins/unix/dockingtray.tcl, plugins/unix/tktray.tcl, plugins/unix/wmdock.tcl, README, doc/tkabber.html, doc/tkabber.xml: Renamed WM class for systray icons to TkabberIcon. Also, documented this. 2012-10-20 Sergei Golovan * plugins/iq/version.tcl: Added version info for Windows 8 (thanks to Vitaly Takmazov). 2012-08-26 Sergei Golovan * balloon.tcl: Fixed regression for MS Windows platform (switch balloon windows overrideredirect parameter only for Unix platform). 2012-08-21 Sergei Golovan * default.tcl: Fixed using semicolons in browserurl if the webbrowser variable is defined again. * plugins/general/ispell.tcl: Fixed error processing in case if Ispell executable is missing or cannot be invoked. Also removed several Tclx'isms. 2012-08-19 Sergei Golovan * balloon.tcl: Apply override redirect just before deiconifying the balloon window. This helps geometry propagation for some window managers (e.g. Mutter). 2012-08-02 Sergei Golovan * plugins/general/headlines.tcl: Fixed calling namespaced procedure with args. Removed extra closing bracket. 2012-07-22 Sergei Golovan * default.tcl: Do not escape semicolon and @ as per RFC 1738. 2012-07-16 Sergei Golovan * plugins/general/nickname.tcl: Fixed priority of nick setting in roster_push_hook to make sure the roster item for which nickname is set exists. 2012-06-14 Sergei Golovan * msgs/uk.msg: Fixed line break in roster item info tooltip. 2012-05-30 Sergei Golovan * plugins/chat/chatstate.tcl: Added new option to ignore chat state notifications in MUC rooms (enabled by default). 2012-05-20 Sergei Golovan * README, doc/tkabber.html, doc/tkabber.xml: Started documenting changes in upcoming Tkabber 1.0. 2012-05-10 Sergei Golovan * default.tcl: Don't convert & into %26 in URLs. 2012-05-07 Sergei Golovan * default.tcl: Escaped all dangerous characters in URL supplied to a browser. * balloon.tcl: Shift the balloon if it's to be placed under the mouse pointer (thanks to Kirill Korneev). 2012-05-06 Sergei Golovan * plugins/general/headlines.tcl: Changed a translateable message "Timeout" to allow one to use different case in translation. * msgs/ru.msg: Updated Russian translation. 2012-04-27 Sergei Golovan * register.tcl: Fixed change password dialog. * README, doc/tkabber.html, doc/tkabber.xml, ifacetk/iface.tcl, splash.tcl: Updated copyright years. 2011-12-16 Sergei Golovan * ifacetk/systray.tcl, plugins/general/geometry.tcl, utils.tcl: Store zoomed main window state in Linux as well as in Windows if -zoomed attribute is supported. 2011-12-08 Sergei Golovan * muc.tcl: Fixed check for MUC compatibility while changing user's nickname. 2011-11-23 Konstantin Khomoutov * Improve ability to configure system tray icon blinking (thanks to Gebb). 2011-11-15 Konstantin Khomoutov * Fix parsing output of lsb_release binary. 2011-10-05 Sergei Golovan * namespaces.tcl, plugins/general/nickname.tcl: Added support for XEP-0172, user nicknames (thanks to Vitaly Takmazov). 2011-10-04 Sergei Golovan * ifacetk/systray.tcl, presence.tcl: Introduced new hook systray_menu_hook for popup menu in system tray (thanks to Kirill Korneev). 2011-09-26 Sergei Golovan * muc.tcl: Normalized group JID before activating its chat window (thanks to Vitaly Takmazov). * pixmaps.tcl: Don't catch the error on loading the default pixmaps theme. 2011-03-06 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * msgs/ru.msg: Updated Russian translation. 2011-02-20 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2011-02-13 Sergei Golovan * plugins/general/comm.tcl: Remove stale comm.* files on start. 2011-02-06 Sergei Golovan * plugins/general/headlines.tcl: Added binding to a headlines tree which toggles message unseen state (thanks to Vitaly Takmazov). * plugins/roster/rosterx.tcl: Added support for roster exchange in IQ (thanks to Vitaly Takmazov). * utils.tcl: Made moving chat window scrollbar after window size changes more reliable. * plugins/richtext/urls.tcl: Twicked URL regexp a bit to allow matched parentheses in it. * proxy.tcl: Changed proxy format in a config file to allow multiple proxy profiles. Still to be done is adding profiles to GUI. 2010-12-20 Sergei Golovan * plugins/richtext/urls.tcl: Added several TLDs to the URL regexp. 2010-11-18 Sergei Golovan * register.tcl: Added missing commands argument to the Unregister procedure. 2010-11-17 Sergei Golovan * datagathering.tcl: Fixed drawing data form which contains a list-single field with no values to choose. * pubsub.tcl: Added forgotten backslash at the end of line. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2010-10-29 Konstantin Khomoutov * plugins/chat/histool.tcl: When scanning log file hierarchy, skip year and month directories with invalid names. This prevents problems when such a name is later attempted to be interpreted according to its meaning. 2010-10-25 Sergei Golovan * iq.tcl: Added client_iq_hook for all incoming IQ stanzas. * plugins/general/bob.tcl: Find and cache BOB elements in incoming IQ stanzas. * register.tcl, login.tcl: Preliminarily implemented request for registration form after unsuccessfull login instead of sending the prefilled fixed one. 2010-10-14 Sergei Golovan * plugins/chat/popupmenu.tcl: Switched "search in Google" shortcut to Ctrl-H to avoid conflict with postpone plugin. 2010-10-11 Konstantin Khomoutov * plugins/general/remote.tcl: Implement special processing for the unavailable presence set remotely -- disconnect current session rather than blindly setting the status (thanks to Gebb for bug triaging). * plugins/general/remote.tcl, trans/*.msg: Fix spelling errors. 2010-10-03 Sergei Golovan * msgs/uk.msg: Updated Ukrainian translation (thanks to Artem Bondarenko). * plugins/chat/info_commands.tcl, msgs/ru.msg: Added /ping command to chat input windows (thanks to Andrey Svetly). * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2010-09-24 Konstantin Khomoutov * msgs/uk.rc: Updated Ukrainian translation of BWidget resources (thanks to Artem Bondarenko). 2010-09-01 Sergei Golovan * utils.tcl, plugins/general/ispell.tcl: Created new hook for text popup menus, moved spelling suggestions to the popup submenu (thanks to Vitaly Takmazov). 2010-05-25 Sergei Golovan * plugins/general/remote.tcl: Do not store service messages (with an empty JID) for forwarding. * presence.tcl: Use the own nickname as a resource part of JID where to send custom presence if it is to be sent into a MUC room (closes: http://yo.jabber.ru/bugzilla/show_bug.cgi?id=397). 2010-05-17 Sergei Golovan * plugins/richtext/emoticons.tcl: Started optimizing emoticons matching code. * plugins/richtext/emoticons.tcl: Use a single rexexp call for a message chunk. Returned to the old way of storing emoticons regexp. 2010-04-30 Sergei Golovan * default.tcl: Fixed DDE command argument (thanks to Jan Zachorowski) and ensured that URL doesn't contain spaces, so it can be used without turning into a list. 2010-04-28 Konstantin Khomoutov * privacy.tcl: Fix creating new privacy list. 2010-04-21 Sergei Golovan * default.tcl: Changed DDE command which calls browser to open URL. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2010-03-08 Sergei Golovan * plugins/chat/muc_commands.tcl: Added /banjid command (thanks to Serge Yudin). 2010-02-23 Sergei Golovan * ifacetk/roster.tcl: Fixed commands in popup submenus if they contain the menu path itself. 2010-02-22 Sergei Golovan * plugins/roster/bkup_conferences.tcl: Fixed storing roster conference bookmarks backup. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2010-02-18 Sergei Golovan * chats.tcl: If chat window is to be opened with type 'error' change the type to 'chat'. An additional investigation is needed to determine if type 'groupchat' has to be considered in this case. 2010-02-17 Sergei Golovan * pubsub.tcl: Ignore pubsub notifications in error messages (thanks to Vitaly Takmazov). 2010-02-14 Sergei Golovan * msgs/pl.msg, trans/pl.msg: Updated Polish translation (thanks to Irek Chmielowiec). * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2010-02-13 Sergei Golovan * ifacetk/muc.tcl: Fixed adding MUC menu to a disco node. * plugins/roster/backup.tcl: Send imported roster items to the user's XMPP server sequentially to match RFC-3921 requirement where jabber:iq:roster set query must not include more than one item. 2010-02-08 Sergei Golovan * muc.tcl, plugins/chat/muc_commands.tcl: Fixed typos. 2010-02-07 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * plugins/chat/muc_commands.tcl: Fixed call to a few procedures from ::muc namespace. * ifacetk/muc.tcl: Moved group, server and nick lists back to the root namespace. 2010-02-06 Sergei Golovan * login.tcl: Removed assigning global gr_nick, gr_server and gra_server variables. They don't make sense in multiuser environment. * utils.tcl, plugins/chat/histool.tcl, plugins/chat/irc_commands.tcl, plugins/chat/logger.tcl, plugins/roster/conferences.tcl: Rewtitten get_group_nick procedure not to use fallback which was often the removed global variable gr_nick. * muc.tcl, ifacetk/muc.tcl: Moved Tk specific MUC code to a separate file. * muc.tcl, plugins/chat/muc_commands.tcl: Moved MUC commands to a separate plugin. * joingrdialog.tcl: Removed because all its code has been moved to ifacetk/muc.tcl. * tkabber.tcl: Don't source joingrdialog.tcl. * plugins/general/remote.tcl: Don't use variable from ::chat namespace directly. * ifacetk/iface.tcl: Source ifacetk/muc.tcl file. Added a check for window existence before setting its title because of after idle call. * ifacetk/ilogin.tcl, ifacetk/iroster.tcl: renamed to ifacetk/login.tcl and ifacetk/roster.tcl. * chats.tcl: Reset MUC tokens on disconnect instead of leaving groups. * examples/configs/badlop-config.tcl, examples/configs/mtr-config.tcl: Replaced join_group calls by muc::join_group. 2010-02-05 Sergei Golovan * si.tcl: Moved customization variables definitions from finload_hook to postload_hook. 2010-02-02 Sergei Golovan * chats.tcl: Fixed calling add_message from the upper stack level. 2010-02-01 Sergei Golovan * chats.tcl: Added a few debug instructions. * chats.tcl: Fixed reporting presence change for opened chat windows. * muc.tcl: Adapted to a small change in xmpp::jid package. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * ifacetk/iface.tcl: Don't change windows title too frequently because it hurts some windows managers. 2010-01-31 Sergei Golovan * chats.tcl, muc.tcl, plugins/chat/muc_ignore.tcl: Changed arguments of room_nickname_changed_hook to chatid, nick, new_nick to make them consistent with chat_user_enter and chat_user_exit hooks. * muc.tcl: Added an option to retry joining a group with different nicknames (adding _ at the end) in case of name conflicts. * chats.tcl: Fixed tracking nick change. 2010-01-30 Sergei Golovan * plugins/roster/conferences.tcl: Added option for ignoring autojoin flag. Retain the order of fetched bookmarks on saving them. Store the last roster group name used for placing bookmarks and suggest it the next time a conference is added to the user's roster. * chats.tcl: Added bindings and events which scroll chat window to the top and the bottom. * presence.tcl: Moved creating arglist for sending presence to a separate procedure to make it usable for new MUC join. * muc.tcl, chats.tcl: Started to rewrite MUC code, moving low-level parts to TclXMPP. Two variables are already removed which leads to potential backaward incompatibility: ::grouproster (use ::muc::roster procedure instead, which returns a list of nicknames instead of JIDs though), and ::muc::users (use ::muc::get_affiliation and ::muc::get_role procedures instead). * plugins/chat/completion.tcl: Got rid of ::grouproster variable. * plugins/chat/irc_commands.tcl: Added /rejoin command which leaves the current room and joins immediately after that. Rewritten /join command to test if a room is joined already by pinging yourself before actual entering the room. * muc.tcl: Fixed reporting nickname change. * chats.tcl: Fixed changing chat partners status icons and messages in chat windows. * muc.tcl: Don't add status message when leaving room if it's empty. * plugins/chat/irc_commands.tcl: Fixed getting the current nickname for rejoining room. 2010-01-28 Sergei Golovan * userinfo.tcl: Do not add TYPE element to PHOTO vCard item if it wasn't present in fetched vCard. * plugins/general/rawxml.tcl: Fixed the beginning of the comments. 2010-01-27 Sergei Golovan * custom.tcl: Switched away from using clock clicks in generating temporary file name. 2010-01-25 Sergei Golovan * *: Added 2010 to copyright statements. 2010-01-24 Sergei Golovan * trans/ru.msg: Updated Russian translation of the texts for outgoing error messages. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * joingrdialog.tcl: Fixed calls to JID normalization where chatid was passed to xmpp::jid::normalize instead of JID itself. * login.tcl: Do not reconnect on bad-namespace-prefix stream error. Tkabber does use only the required 'stream' prefix, so there's definitely some weird problem on the server. 2010-01-23 Sergei Golovan * login.tcl, roster.tcl: Use xmpp::register package from TclXMPP. * namespaces.tcl, register.tcl: Removed NS(register) array value. * plugins/general/clientinfo.tcl: Added the plugin option to Customize interface window under Plugins group (closes: http://yo.jabber.ru/bugzilla/show_bug.cgi?id=375). * plugins/roster/conferenceinfo.tcl: Moved optins to Plugins group in Customize interface. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * ifacetk/iroster.tcl, plugins/chat/info_commands.tcl, plugins/roster/backup.tcl, plugins/roster/metacontacts.tcl, presence.tcl, register.tcl, userinfo.tcl: Fixed messages (mostly capitalization) which are to be presented to a user. * msgs/ru.msg: Updated Russian translation. 2010-01-22 Konstantin Khomoutov * ifacetk/iface.tcl: Fix error occured when deletion of the status message history was attempted from the context menu of the status message combobox widget. 2010-01-21 Sergei Golovan * chats.tcl: Don't try to redraw chatroom roster if it doesn't exist. 2010-01-16 Sergei Golovan * plugins/general/rawxml.tcl: Moved timestamp and comments generation to separate procedures. Ensure that commented line doesn't contain two dashes -- (thanks to Konstantin Khomoutov). * login.tcl: Fixed typo. * login.tcl, ifacetk/iface.tcl: Added login log window to which important login/logout messages are stored. Also, a bit rearranged status processing and removed one 8.4-izm ("true" as a boolean value). * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2010-01-15 Sergei Golovan * privacy.tcl: Added IQ to blocked stanzas for JIDs in invisible list to close another channel of leaking user's presence. The obvious drawback is that it becomes impossible to query contacts bare JID also (which doesn't reveal presence if the contact doesn't have full access to his server). 2010-01-14 Sergei Golovan * login.tcl: Turned connect and login procedures into asynchronous mode except for DNS resolution. * namespaces.tcl: Removed unused (moved to TclXMPP) namespaces. * plugins/chat/insert_nick.tcl: Forced focus to chat input window after inserting nickname into it (thanks to Konstantin Khomoutov). 2010-01-10 Sergei Golovan * plugins/chat/bookmark_highlighted.tcl, plugins/chat/popupmenu.tcl: Added bindings to XF86_Switch_VT_2 and XF86_Switch_VT_3 keysyms (the same as for Shift-F2 and Shift-F3) which are recognized by Tk in modern X when Shift-F2 and Shift-F3 are pressed. * plugins/chat/nick_colors.tcl: Save nick colors just after change (thanks to Serge Yudin). 2010-01-07 Sergei Golovan * privacy.tcl: Added two debug messages. 2010-01-06 Sergei Golovan * plugins/general/headlines.tcl: Lowered priority of processing headline messages. This allows to use headlines for various notifications which is useful because headlines aren't stored offline. 2010-01-04 Sergei Golovan * privacy.tcl: Rewritten to use low level interface to XEP-0016 from xmpp::privacy package. * namespaces.tcl: Removed jabber:iq:privacy variable. 2009-12-29 Sergei Golovan * plugins/pep/user_activity.tcl, plugins/pep/user_mood.tcl: Do not show the correspondent PEP page if user activity or user mood is empty, and check for existence of a human readable mood description. * msgs/ru.msg: Fixed strings which were changed when roster export and import were rewritten. 2009-11-17 Sergei Golovan * userinfo.tcl: Fixed sending jabber:iq:last, jabber:iq:time and jabber:iq:version queries to MUC rooms. 2009-10-31 Sergei Golovan * Makefile: Install tkabber-remote script to bin directory, changed tkabber script to just execute /usr/share/tkabber/tkabber.tcl. Also, fixed call to echo for dash shell which doesn't recognize -e option. 2009-10-30 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2009-10-28 Sergei Golovan * userinfo.tcl: Added two overrideredirect calls (just after creating toplevel window and just before drawing it) to prevent window manager of catching geometry too early. 2009-10-27 Sergei Golovan * ifacetk/iface.tcl, plugins/general/rawxml.tcl, plugins/general/tkcon.tcl, plugins/windows/console.tcl: Added a new submenu "Debug tools" where all debug-related commands are placed (consoles, debug log, raw XML, profiling tools). Also, moved Help menu to the right on Unix systems. 2009-10-26 Sergei Golovan * muc.tcl: Fixed processing errors when joining to a MUC room. 2009-10-04 Sergei Golovan * plugins/iq/version.tcl: Added reporting Windows 7. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2009-09-13 Sergei Golovan * plugins/general/rawxml.tcl: Always show "Shaow all connections" checkbutton to make seeing all stanzas possible after all connections but one closed (thanks to Jan Zachorowski). Also, increased timestamps resolution to milliseconds for Tcl 8.5 and newer. 2009-09-02 Sergei Golovan * plugins/general/rawxml.tcl: Added multiple connections support: allow to choose outgoing connection and to display only messages for an active connection. Removed quick access to prettyprinting XML config variable and changed its default value to true. (thanks to Jan Zachorowski) * gpgme.tcl, presence.tcl, privacy.tcl, muc.tcl: Removed obligatory non-empty text status from presence stanzas and allowed GPG to sign empty status messages (thanks to Jan Zachorowski). 2009-08-17 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * plugins/general/rawxml.tcl: Changed generation of stream prefix. 2009-08-16 Sergei Golovan * msgs/es.msg, trans/es.msg: Updated Spanish translaton (thanks to Badlop). 2009-08-11 Sergei Golovan * plugins/iq/ping.tcl: Corrected ping reply function arguments. 2009-08-08 Sergei Golovan * gpgme.tcl: Don't switch GPG token property armor back and forth. 2009-08-07 Sergei Golovan * gpgme.tcl: Fixed typo. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2009-08-03 Sergei Golovan * gpgme.tcl: Entirely switched to TclGPG which broke compatibility with TclGPGME. * doc/tkabber.html, doc/tkabber.xml, README: Replaced TclGPGME by TclGPG. * plugins/iq/ping.tcl: Use xmpp::ping package from TclXMPP. 2009-08-01 Sergei Golovan * plugins/general/comm.tcl: Raised priority of cleanup function in quit_hook to make sure the comm file is deleted on exit. 2009-07-31 Sergei Golovan * datagathering.tcl, joingrdialog.tcl, muc.tcl, plugins/chat/nick_colors.tcl, plugins/roster/conferences.tcl, presence.tcl, pubsub.tcl: Moved dialog windows to the center of root window. * plugins/general/rawxml.tcl: Added XMLNS prefixes to Raw XML prettyprinter. 2009-07-28 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2009-07-27 Sergei Golovan * muc.tcl: Changed affiliation and role list control interface. The former one had insufficient performance on long lists (a few thousand elements) because it created three entries and one combobox per list item. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * muc.tcl: Improved localization in affiliation and role lists windows. 2009-07-25 Sergei Golovan * plugins/general/xcommands.tcl: Made ad-hoc command window non-transitive which is more suitable for long-lived dialogs. Fixed Escape key binding for ad-hoc command windows. Added id to cancel requests. 2009-07-17 Sergei Golovan * plugins/iq/time2.tcl: Fixed timezone definition (and made it fail to work with Tcl 8.4 or older on MS Windows systems). 2009-06-21 Sergei Golovan * messages.tcl: Minor fixes in widgets packing (entry fields shouldn't expand). 2009-06-18 Sergei Golovan * muc.tcl: Changed the order of status codes processing in MUC presence packets. This prevents conflicts between code 110 (our own presence) and 303 (changing nicknames). 2009-06-08 Sergei Golovan * ifacetk/iface.tcl: Fixed sending announce messages. * plugins/general/headlines.tcl: Fixed message forwarding. 2009-05-16 Sergei Golovan * ifacetk/iface.tcl: Fixed changing text status. 2009-05-15 Sergei Golovan * plugins/general/message_archive.tcl: Fixed message selection which was broken when escaping % in event bindings. 2009-05-11 Sergei Golovan * plugins/chat/chatstate.tcl: Fixed order of running bind scripts when or events are fired. * plugins/chat/me_command.tcl: Treat any message starting with word /me as a /me-command (not only '/me ', but also '/me,', '/me.' etc.). 2009-05-09 Sergei Golovan * plugins/chat/events.tcl, plugins/chat/chatstate.tcl:: Fixed processing incoming events which were ignored because they are sent as normal messages. Also, don't send events to people not in roster or in a groupchat. * plugins/chat/chatstate.tcl: Added sending 'paused' event (thanks to Jan Zachorowski). * plugins/general/remote.tcl: Fixed binding of event if the bound script contains % sign. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * balloon.tcl, chats.tcl, custom.tcl, datagathering.tcl, disco.tcl, filetransfer.tcl, ifacetk/buttonbar.tcl, ifacetk/iface.tcl, ifacetk/ilogin.tcl, ifacetk/iroster.tcl, itemedit.tcl, messages.tcl, muc.tcl, plugins/chat/bookmark_highlighted.tcl, plugins/chat/draw_xhtml_message.tcl, plugins/chat/histool.tcl, plugins/chat/logger.tcl, plugins/chat/muc_ignore.tcl, plugins/chat/nick_colors.tcl, plugins/chat/popupmenu.tcl, plugins/chat/postpone.tcl, plugins/chat/unisymbols.tcl, plugins/filetransfer/http.tcl, plugins/filetransfer/si.tcl, plugins/general/headlines.tcl, plugins/general/ispell.tcl, plugins/general/message_archive.tcl, plugins/general/offline.tcl, plugins/general/rawxml.tcl, plugins/general/subscribe_gateway.tcl, plugins/general/xcommands.tcl, plugins/pep/user_tune.tcl, plugins/richtext/emoticons.tcl, plugins/richtext/urls.tcl, plugins/roster/annotations.tcl, plugins/unix/dockingtray.tcl, plugins/unix/systray.tcl, plugins/unix/tktray.tcl, privacy.tcl, pubsub.tcl, register.tcl, richtext.tcl, search.tcl, splash.tcl, userinfo.tcl, utils.tcl: Escaped % in event bindings. 2009-05-07 Sergei Golovan * joingrdialog.tcl: Added another room JID normalization. * muc.tcl: Added processing status codes 110 and 210 in MUC status elements. 2009-05-04 Sergei Golovan * datagathering.tcl: Fixed binding of <> event if the bound script contains % sign. 2009-05-01 Sergei Golovan * plugins/si/iqibb.tcl, plugins/si/ibb.tcl, trans/pl.msg, trans/es.msg, trans/de.msg, trans/ru.msg: Fixed typo in error message. 2009-04-26 Sergei Golovan * plugins/chat/logger.tcl: Fixed logging messages with empty from address (thanks to Konstantin Khomoutov). * plugins/chat/muc_ignore.tcl, userinfo.tcl: Fixed doubling of % symbol in event bindings (thanks to Konstantin Khomoutov). * muc.tcl: Added MUC submenu to chat windows if it corresponds to a participant of a conference. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2009-04-23 Sergei Golovan * chats.tcl: Added JID argument to chat::opened procedure to make it possible to return all opened chat windows for a given JID. * datagathering.tcl: Fixed typo and added check if a window which had sent query still exists. Fixed packing error message inside form windows. 2009-04-21 Sergei Golovan * pubsub.tcl: Fixed typo. Also, fixed requesting pubsub subscriptions. * pubsub.tcl: Fixed configuration forms processing. 2009-04-10 Sergei Golovan * pubsub.tcl: Added forgotten state options to disco popup menu items. 2009-04-08 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * presence.tcl, roster.tcl: Changed the order in which Tkabber asks for roster and sends initial presence to register roater XMLNS first and create the correct caps hash. 2009-04-05 Sergei Golovan * ifacetk/iroster.tcl: Removed unused curuser variable. * pubsub.tcl, pep.tcl: Moved interface part of pubsub and PEP modules to TclXMPP. * plugins/pep/user_activity.tcl, plugins/pep/user_location.tcl, plugins/pep/user_mood.tcl, plugins/pep/user_tune.tcl: Adapted to PEP module from TclXMPP. * pubsub.tcl: Started to implement user interface to pubsub. So far added two menu items to Disco browser nodes. * pubsub.tcl: Added simple user interface for subscription, unsubscription and configuring subscription. * pubsub.tcl: Fixed referring to pubsub namespaces. 2009-04-02 Sergei Golovan * plugins/general/comm.tcl, tkabber-remote.tcl: Made errors from a remote Tkabber reported, and not showed in the Tkabber itself. * custom.tcl: Added a hack which allows to load external plugins before their customized settings are to be applied. 2009-04-01 Sergei Golovan * plugins/general/comm.tcl, tkabber-remote.tcl: Added proof-of-concept plugin and client for remote controlling Tkabber via comm package from Tcllib. 2009-03-31 Sergei Golovan * filetransfer.tcl: Added unregistering filetransfer trantports. 2009-03-30 Sergei Golovan * plugins/general/session.tcl: Changed default values for saving state on exit and loading state on start to true. * proxy.tcl: Fixed proxy filter setting in case of HTTP protocol, so HTTP-polling now works via proxy again. Also, don't send Proxy- Authorization header if username and password are empty. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2009-03-29 Sergei Golovan * si.tcl: Fixed sending error stanza to a filetransfer peer when the transport negotiation fails. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * proxy.tcl: Moved wrapped geturl to ::http namespace and adapted it to work with HTTPS through a proxy server. The technique uses pconnect package, therefore it can't be proposed to http upstream as is. * plugins/filetransfer/http.tcl: Use original call of ::http::geturl. * proxy.tcl: Changed proxy type for HTTPS traffic from HTTP to tunnelling, which is more appropriate. * proxy.tcl, plugins/chat/popupmenu.tcl, plugins/filetransfer/http.tcl: Added version to http package requirement to prevent version 1.0 loading. * proxy.tcl: Added a call to ::http::config to make sure the http package procedures are loaded. 2009-03-28 Sergei Golovan * si.tcl, plugins/si/ibb.tcl, plugins/si/iqibb.tcl, plugins/si/socks5.tcl: Added enabling/disabling transports by default when registering them. Disable bytestream transport by default, as it not always works, so it should be switched on only if user knows how to work with it. * proxy.tcl: Removed proxy type 'none' to make sure that every proxy entry represent a real proxy, which is better to understand. * plugins/general/geometry.tcl: Store main window state and geometry separately for tabbed and non-tabbed modes. 2009-03-27 Sergei Golovan * custom.tcl: Run commands associated with customizable variables on Tkabber start even if custom.tcl doesn't exist. Otherwise Tkabber pixmaps theme can't be loaded. * plugins/si/socks5.tcl: Fixed bug with forgotten return in case when connection to all received smarthosts failed. * ifacetk/iface.tcl, ifacetk/ilogin.tcl, login.tcl, plugins/filetransfer/http.tcl, plugins/si/socks5.tcl, proxy.tcl, splash.tcl, tkabber.tcl: Separated proxy servers management from login and loginconf array. Made choosing proxy depending from a hostname to connect to. Use proxy if necessary in file transfers. * proxy.tcl: Renamed connect proxies to tunnel proxies which is more clear. * proxy.tcl: Fixed proxy management dialog size and added some space between individual proxy frames. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * plugins/chat/chatstate.tcl, plugins/chat/events.tcl: Removed bindings which used %A substitution from chat input windows. This makes XIM working in chat windows. * filetransfer.tcl, plugins/filetransfer/http.tcl, plugins/filetransfer/si.tcl: Made filetransfer windows non-transient, so they can be iconified separately from the main window. 2009-03-20 Sergei Golovan * messages.tcl: Put messages in the message archive only if they have non-empty body. * muc.tcl: Fixed MUC item in disco popup menu. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2009-03-17 Sergei Golovan * messages.tcl: Don't create subject menu on every incoming message. This helps to create correct menu if it's an offline message and came befor the roster. 2009-03-15 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * datagathering.tcl, plugins/general/captcha.tcl: Removed support for old robot challenge support and moved media element parsing to TclXMPP. * custom.tcl: Trigger assigned commands for all customization variables after restoring from the stored file, and not only for those which were in the file. * pixmaps.tcl: Allow pixmaps theme option to be equal to non-existent theme name and clean themes array before reloading. This helps to load iconsets plugin. * ifacetk/systray.tcl: Fixed creating popup menu when the main window doesn't have a menubar yet. 2009-03-14 Sergei Golovan * chats.tcl, muc.tcl: Converted chat and conference menus into dynamic ones (created just before posting) to make it easier to enabling/disabling and adding/deleting items. * README, chats.tcl, doc/tkabber.html, doc/tkabber.xml, examples/configs/badlop-config.tcl: Removed chat::options(default_message_type) option because messages with no type attribute must be treated as normal. * plugins/general/xcommands.tcl: Added ad-hoc commands submenu to all popup menus. * muc.tcl: Treat conference room as MUC-compatible if its server is. * plugins/roster/conferences.tcl: Fixed adding MUC commands to a bookmark roster item. 2009-03-13 Sergei Golovan * plugins/general/captcha.tcl: Renamed from challenge.tcl and added current XEP-0158 support (only for CAPTCHAs in messages). * disco.tcl: Implemented unregistering features (it's intended to be used by unloadable plugins). * datagathering.tcl: Fixed cid: URI scheme handling. * plugins/general/captcha.tcl: Added id attribute to sent CAPTCHA form because id is mandatory for an IQ. * custom.tcl: Remove variable traces before creating or recreating it. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2009-03-12 Sergei Golovan * plugins/general/bob.tcl: Added two procedures which collect Bits of Binary (XEP-0231) included in a message or presence stanza. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * datagathering.tcl: Added preliminary support for URI which reference to bits-of-binary data (only for included in the same stanza yet). 2009-03-11 Sergei Golovan * custom.tcl: Fixed duplicates in customization groups. This is useful if a config variable could be added several times on plugins loading/unloading. Also, don't set trace on a custom variable if it's set already. 2009-03-09 Sergei Golovan * plugins/si/socks5.tcl: Removed proxy.netlabs.cz from proxies list to prevent its abuse. * muc.tcl: Enclose JIDs/nicks in quotes when showing error messages on failed MUC actions (kick, ban, etc.). It helps to detect extra or missing spaces (thanks to Serge Yudin). * disco.tcl: Fixed keyboard bindings (thanks to Konstantin Khomoutov). 2009-03-05 Sergei Golovan * hooks.tcl: Added a procedure which checks if a hook is empty. 2009-03-02 Sergei Golovan * plugins/richtext/emoticons.tcl: Reload images on theme change unconditionally. 2009-02-28 Sergei Golovan * disco.tcl: Allowed extra handlers to return empty lists. * plugins/iq/version.tcl: Don't report Tkabber version in disco#info replies if user chooses not to show the version. * plugins/chat/draw_timestamp.tcl, plugins/chat/logger.tcl, plugins/general/headlines.tcl, plugins/general/message_archive.tcl: Adapted to a change in output format in ::xmpp::delay::parse procedure. 2009-02-27 Sergei Golovan * plugins/general/caps.tcl: Fixed erroneous emptying features list and added several debug messages. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * plugins/general/caps.tcl: Added procedure which requests entity info if its capabilities hash was received earlier. Also a bit shortened hash calculating code. * disco.tcl: Fixed bug with non-existent variable if no extra handlers is registered. Also fixed bug with doubled features in features list returned in reply to disco#info query (it implicated in incorrectly calculated caps hash). 2009-02-25 Sergei Golovan * messages.tcl: Added cancelling subscriptions to roster item popup menu because it may be useful to unsubscribe from a contact without removing it from the roster. * examples/xrdb/badlop-dark.xrdb, examples/xrdb/black.xrdb, examples/xrdb/dark.xrdb, examples/xrdb/dark2.xrdb, examples/xrdb/ocean-deep.xrdb: Fixed colors for metacontacts in roster. 2009-02-24 Sergei Golovan * plugins/si/ibb.tcl: Fixed reporting error to the other side. 2009-02-23 Sergei Golovan * disco.tcl, joingrdialog.tcl, login.tcl, messages.tcl, muc.tcl, plugins/general/caps.tcl, plugins/general/remote.tcl, plugins/iq/version.tcl, plugins/roster/cache_categories.tcl, plugins/roster/conferenceinfo.tcl, plugins/roster/conferences.tcl: Moved part of the Disco functionality to TclXMPP. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * examples/xrdb/*.xrdb: Added color resources for metacontacts background in roster. 2009-02-20 Sergei Golovan * presence.tcl: Fixed sending custom presence to a conference. * ifacetk/iroster.tcl: Fixed metacontact label positioning when group close/open mark should be displayed. * plugins.tcl: Remove recognizing preload.tcl as a plugin preload file and added a procedure which checks if the requested plugin is already registered. * ifacetk/iface.tcl, plugins/roster/backup.tcl, plugins/roster/bkup_annotations.tcl, plugins/roster/bkup_conferences.tcl: Adapted roster import/export procedures to changes in corresponding modules (moving part of the functionality to TclXMPP). * plugins/roster/bkup_metacontacts.tcl: Added plugin for exporting metacontacts. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * plugins/chat/draw_xhtml_message.tcl: Added checking for incorrect color names. 2009-02-19 Sergei Golovan * presence.tcl: Greyed out sending custom presence submenu in chat windows which correspond to groupchat members. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2009-02-18 Sergei Golovan * ifacetk/iface.tcl: Exported procedure which destroys opened tab or window. * plugins.tcl: Renamed 'external plugins' group to 'plugins management'. Changed default behavior to not to load plugins. 2009-02-15 Sergei Golovan * ifacetk/iroster.tcl: Made collapsing/expanding metacontacts or multiple JID resources asynchronous if they appear in multiple groups. Fixed storing info on showing offline users in roster groups. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * ifacetk/iroster.tcl, ifacetk/iface.tcl, plugins/roster/metacontacts.tcl: Added options to disable metacontacts and to always show a fixed metacontact label. * plugins/roster/metacontacts.tcl: Fixed keyboard traversal of metacontact window and started to implement items reordering. * plugins/roster/metacontacts.tcl: Made windows titles and messages more clear and added drag'n'drop which allows metacontact items reordering. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * plugins/roster/metacontacts.tcl: Fixed adding item by using entry and added keyboard items reordering (by and ). 2009-02-14 Sergei Golovan * chats.tcl, ifacetk/iroster.tcl: Adapted to a new syntax of roster click procedures. * custom.tcl: Use random filename for temporal customization store. * ifacetk/iroster.tcl: Fixed showing metacontacts in case when some of its members are online and the others are offline. Put metacontact in all groups of its members. Fixed creating JID popup menu on metacontacts. Added processing of radiobuttons to popup menus. * plugins/roster/metacontacts.tcl: Added UI for creating, editind and deleting metacontacts. * ifacetk/iroster.tcl: Take into account menu items state when joining menus for contacts and metacontacts. * plugins/roster/metacontacts.tcl: Fixed bug with deleting metacontact. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * plugins/roster/metacontacts.tcl: Fixed bug with deleting user from a metacontact. * custom.tcl: Removed 8.4ism. * ifacetk/unix.xrdb, examples/xrdb/teopetuk.xrdb: Added resources for metacontacts background. 2009-02-13 Sergei Golovan * muc.tcl: Move focus and scroll down to 'add new JID' field in MUC lists (thanks to Serge Yudin). * utils.tcl: Use \u0000 as a split character in msplit routine. * chats.tcl: Slightly optimized drawing room roster. * plugins/roster/conferences.tcl: Use storing/retrieving notes from TclXMPP. * ifacetk/iroster.tcl: Added metacontacts support. Unfinished yet, editing metacontacts is not possible, but grouping them in roster works. Also, fixed bug which appears when a group name coinsides with a JID in roster. Also, removed aliases support in favor of metacontacts. 2009-02-11 Sergei Golovan * private.tcl: Removed in favour of private XML storage interface in TclXMPP. * plugins/roster/annotations.tcl: Use storing/retrieving notes from TclXMPP. * plugins/roster/conferences.tcl: Use private XML storage interface in TclXMPP. * plugins/roster/roster_delimiter.tcl: Removed as the same functionality appeared in TclXMPP. * tkabber.tcl: Removed reference to private.tcl. 2009-02-09 Sergei Golovan * utils.tcl: Made [rand $n] procedure to produce numbers uniformly distributed among integers from 0 to $n. * ifacetk/iroster.tcl, msgs/ru.msg, plugins/roster/conferences.tcl, roster.tcl: Changed semantics of operation 'remove all users in roster group'. Now all the users are removed from the roster even if they are in some other groups. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2009-02-05 Sergei Golovan * custom.tcl: Store customization variables to a temporary file and then move it to custom.tcl to prevent custom.tcl accidental corruption. 2009-02-04 Sergei Golovan * plugins/general/geometry.tcl: Added new plugin which saves main window geometry and restores it on Tkabber start. * ifacetk/iface.tcl: Moved saving main window state (normal or zoomed) to the new geometry plugin. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2009-02-03 Sergei Golovan * plugins/si/ibb.tcl: Fixed typo. 2009-02-01 Sergei Golovan * ifacetk/systray.tcl: Added an option not to show a systray icon on server messages in groupchats (thanks to Ruslan Rakhmanin). * gpgme.tcl, msmg/ru.msg: Show all GPG warnings in a separate window (thanks to Konstantin Khomoutov). * chats.tcl, joingrdialog.tcl, muc.tcl: Moved focusing chat window into a separate procedure, normalise room JID before joining (thanks to Konstantin Khomoutov). * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2009-01-28 Sergei Golovan * ifacetk/iface.tcl: Update main window title when chat tab is closed (the systray icon isn't updated yet though). 2009-01-17 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2009-01-14 Sergei Golovan * gpgme.tcl: Fixed backgroung under GPG signature label in chat windows. 2009-01-13 Sergei Golovan * plugins/pep/user_tune.tcl: Fixed typo. 2009-01-12 Sergei Golovan * plugins/general/sound.tcl: Since Snack requires Tk a new toplevel is created if Snack is loaded into a separate thread. So, withdrawed this unnecessary toplevel. 2009-01-10 Sergei Golovan * plugins.tcl: Added preliminary infrastructure for loading/unloading external plugins. Made plugins loaded by default. Added ViM modeline. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2008-12-20 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2008-12-15 Sergei Golovan * plugins/general/sound.tcl: Fixed resource leak when every time a sound is played using snack the new sound object were created. Also, moved snack to a separate thread (if Thread package is available) to make sound better because snack uses Tcl event loop which can be busy in the main thread. * plugins/general/caps.tcl: Replaced lset by explicit list creation to make disco reply working in Tcl 8.3. 2008-12-14 Sergei Golovan * login.tcl: Since logout can be called before a connection is authenticated then an additional flag is added to connections list. It indicates if the connection is active and needs running disconnected_hook on logout. 2008-12-10 Sergei Golovan * plugins/general/autoaway.tcl: Start timer at Tkabber start and stop at exit instead of connect/disconnect to prevent racing with reconnection code. 2008-11-26 Sergei Golovan * login.tcl: Refixed bug with incorrect disconnecting from the server if authentication failed. * plugins/windows/taskbar.tcl: Use another variable as an indicator of user status. 2008-11-25 Sergei Golovan * login.tcl: Fixed bug with incorrect disconnecting from the server if authentication failed. 2008-11-23 Sergei Golovan * muc.tcl: Use the last muc#user attachment for processing to workaround a long lasting ejabberd bug which don't understand XMLNS prefixes and therefore can't filter all muc#user subelements which are included into presence stanzas by a client. 2008-11-15 Sergei Golovan * register.tcl: Fixed keyboard bindings in register window (thanks to Konstantin Khomoutov). * ifacetk/systray.tcl: Fixed invocation of location callback. 2008-11-11 Sergei Golovan * plugins/chat/draw_xhtml_message.tcl: Fixed another typo. 2008-11-10 Sergei Golovan * plugins/chat/draw_xhtml_message.tcl: Fixed typo. 2008-11-09 Sergei Golovan * tkabber.tcl, login.tcl, plugins/general/rawxml.tcl: Adapted XML console to a new log callback in XMPP library. 2008-11-06 Sergei Golovan * ifacetk/ilogin.tcl: Call logout even if there is no connections to cancel possible scheduled ones. 2008-11-05 Sergei Golovan * hooks.tcl: Added a procedure which removes function from a hook. Also, it's allowed to stop processing hook by returning break code. 2008-11-04 Sergei Golovan * datagathering.tcl: Fixed typo. 2008-11-03 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * plugins/si/socks5.tcl: Moved resetting fileevent script upper. * plugins/filetransfer/si.tcl, si.tcl: Made receiving file or use of any other SI profile asynchronous (without vwait). * ifacetk/iface.tcl: Changed trace command syntax to make Tkabber run on Tcl/Tk 8.3. 2008-11-02 Sergei Golovan * datagathering.tcl: Added a procedure which returns a list of entered values for a given data form window. Also, removed a procedure which returned variables list for a given form. * search.tcl: Switched to xmpp::search package for sending search requests and parsing returned items. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * datagathering.tcl: Removed predefined form fields. * register.tcl: Switched to xmpp::register package. * search.tcl: Cleanup form data upon search window is destroyed. * register.tcl, login.tcl, ifacetk/iface.tcl: Moved changing password to register.tcl and make using xmpp::register package for it. * negotiate.tcl, tkabber.tcl, disco.tcl: Removed support for very old form of feature negotiations. * datagathering.tcl: Moved creating data form field and submit form to xmpp::data package. * muc.tcl, plugins/general/challenge.tcl, plugins/general/xcommands.tcl, plugins/general/remote.tcl, plugins/iq/version.tcl, si.tcl: Switched to xmpp::data package for data forms processing. * messages.tcl: Made use of jabber:x:data explicit. * namespaces.tcl, pubsub.tcl: Removed creating jabber:x:data forms by hands. 2008-11-01 Sergei Golovan * Makefile: Added rules to make documentation (tkabber.html and README) from its source. * doc/tkabber.html, doc/tkabber.xml, README: Changed notes about tDOM parser usage (it is default if it is installed currently). * datagathering.tcl: Removed support for undocumented XMLNS jabber:iq:data which was used ages ago for administering ejabberd server. * datagathering.tcl, disco.tcl, plugins/general/caps.tcl, plugins/general/remote.tcl, search.tcl: Switched to parsing jabber:x:data forms using xmpp::data package. * plugins/si/socks5.tcl: Turned all work into asynchronous mode. * plugins/filetransfer/si.tcl, si.tcl: Got rid of unnecessary vwait. * datagathering.tcl: Fixed form sending if it is not a jabber:x:data form. 2008-10-29 Sergei Golovan * login.tcl, presence.tcl: Fixed resetting user status if all Tkabber connections are closed. 2008-10-28 Sergei Golovan * Makefile: Fixed the list of directories to install. 2008-10-27 Sergei Golovan * messages.tcl: Don't send subscription request if it's to be sent through non-existent XMPP connection. 2008-10-26 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2008-10-25 Sergei Golovan * plugins/chat/send_message.tcl: Use generated unique packet IDs instead of predictable increasing ones. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * chat/chatstate.tcl, chat/events.tcl, chat/send_message.tcl: Added packet ID to chat_send_message_xlist_hook. 2008-10-24 Sergei Golovan * gpgme.tcl, ifacetk/iface.tcl, ifacetk/iroster.tcl, login.tcl, plugins/general/sound.tcl, plugins/roster/cache_categories.tcl, presence.tcl, privacy.tcl: Simplified procedures from disconnected_hook (removed check for empty connection token argument), optimized loading and storing roster group interface settings. * ifacetk/iface.tcl: Fixed status_history option type. 2008-10-23 Sergei Golovan * chats.tcl, ifacetk/iroster.tcl, login.tcl, plugins/general/sound.tcl, presence.tcl, roster.tcl: Removed predisconnected_hook and moved all procedures from it to dosconnected_hook. * login.tcl: Don't actually logout if a connection isn't in active connections list. 2008-10-22 Sergei Golovan * datagathering.tcl: Fixed typo. 2008-10-21 Sergei Golovan * datagathering.tcl: Fixed typo. * plugins/general/remote.tcl: Fixed -xmlns option in xmpp::xml::create call. * disco.tcl: Fixed checking for jabber:x:data XMLNS in disco forms. * datagathering: Fixed creating jabber:x:data submit forms. * login.tcl: Fixed checking for different proxy packages. Also, make sure that no login is scheduled if logout without arguments is called. 2008-10-20 Sergei Golovan * messages.tcl: Fixed typo. * iface.tcl, login.tcl: Adapted STARTTLS and old SSL to new -verifycommand option of starttls and tls transport. Restored SSL button in the right lower corner of the Tkabber window. 2008-10-19 Sergei Golovan * plugins/roster/annotations.tcl: Fixed widget name with connection token inside. * itemedit.tcl, utils.tcl, chats.tcl, privacy.tcl, gpgme.tcl: Added (and use) new procedure which maps colons in connection token to number signs for usage in widget names. * chats.tcl, examples/configs/mtr-config.tcl, gpgme.tcl, iface.tcl, ifacetk/iroster.tcl, itemedit.tcl, joingrdialog.tcl, messages.tcl, muc.tcl, plugins/chat/disco.tcl, plugins/chat/histool.tcl, plugins/chat/info_commands.tcl, plugins/chat/irc_commands.tcl, plugins/chat/log_on_open.tcl, plugins/chat/logger.tcl, plugins/chat/muc_ignore.tcl, plugins/chat/nick_colors.tcl, plugins/general/avatars.tcl, plugins/general/headlines.tcl, plugins/general/message_archive.tcl, plugins/general/remote.tcl, plugins/pep/user_activity.tcl, plugins/pep/user_location.tcl, plugins/pep/user_mood.tcl, plugins/pep/user_tune.tcl, plugins/roster/annotations.tcl, plugins/roster/cache_categories.tcl, plugins/roster/conferenceinfo.tcl, plugins/roster/conferences.tcl, plugins/roster/fetch_nicknames.tcl, plugins/si/socks5.tcl, presence.tcl, privacy.tcl, roster.tcl, userinfo.tcl, utils.tcl: Replaced JID related procedures from utils.tcl (node_from_jid, server_from_jid, resource_from_jid, node_and_server_from_jid, tolower_node_and_domain) by procedures from xmpp::jid package (::xmpp::jid::node, ::xmpp::jid::server, ::xmpp::jid::resource, ::xmpp::jid::stripResource, ::xmpp::jid::normalize). * login.tcl: Use non-modal dialog when stream error is incoming. * privacy.tcl: Break the procedure of querying privacy lists items when its result is "abort". This helps to cleanup lists on disconnect. * plugins/general/remote.tcl: Fixed typo. * login.tcl: Process DNS errors. 2008-10-18 Sergei Golovan * presence.tcl: Fixed sending directed presence. * plugins/chat/irc_commands.tcl: Use JID creation command instead of joining JID parts manually. * joingrdialog.tcl, plugins/roster/conferences.tcl: Use JID command with optional resource. * presence.tcl: Added packet ID to available presence options. * muc.tcl: Fixed changing nicknames. * presence.tcl: Unset error property if an available or subscription presence is received. * chats.tcl, muc.tcl: Fixed processing errors when joining room and when an occupant's unavaiable presence is received. * search.tcl: Fixed typo. * gpgme.tcl, privacy.tcl: Fixed widget paths with connection token in their names. * login.tcl: Change status message while waiting for the next reconnection. * chats.tcl, configdir.tcl, disco.tcl, filetransfer.tcl, filters.tcl, ifacetk/iface.tcl, ifacetk/iroster.tcl, itemedit.tcl, messages.tcl, muc.tcl, plugins/chat/chatstate.tcl, plugins/chat/events.tcl, plugins/chat/logger.tcl, plugins/chat/nick_colors.tcl, plugins/filetransfer/http.tcl, plugins/filetransfer/si.tcl, plugins/general/autoaway.tcl, plugins/general/clientinfo.tcl, plugins/general/headlines.tcl, plugins/general/subscribe_gateway.tcl, plugins/roster/annotations.tcl, plugins/roster/backup.tcl, plugins/roster/conferenceinfo.tcl, plugins/roster/conferences.tcl, plugins/roster/rosterx.tcl, plugins/unix/wmdock.tcl, register.tcl, search.tcl, si.tcl, userinfo.tcl: Removed unnecessary call to format command. * pixmaps.tcl: Put directory with pixmaps themes supplied with Tkabber to the end of directories list. This makes using users' themes more robust (though users have to use different theme names). * plugins/roster/backup.tcl: Fixed roster backup. * presence.tcl: Show error messages in contact status, as it was before switching to a new library. * plugins/chat/irc_commands.tcl: Fixed typo. 2008-10-17 Sergei Golovan * plugins/general/sound.tcl: Cleared sound external program option making Snack package the default alternative. * doc/tkabber.html, doc/tkabber.xml, README: Added note about three new plugins. * *: 0.11.1 is released. * tkabber.tcl: Pushed version number to 0.11.1-svn. * *: Massive update caused by moving to an external XMPP library TclXMPP (http://code.google.com/p/tclxmpp/). * tclxmpp: Added map to external repository http://tclxmpp.googlecode.com/svn/trunk/ * ckabber.tcl, ifaceck/*: Removed. * plugins/roster/conferences.tcl: Fixed roster push calls. * plugins/si/iqibb.tcl: Fixed typo. * itemedit.tcl: Fixed bug with widget name containing xlib variable. * datagathering.tcl, plugins/general/offline.tcl: Fixed incorrect variable names. * plugins/roster/conferences.tcl: Added missing space between arguments. * xmppmime.tcl: Changed notation. * pubsub.tcl: Fixed closing brackets at the end of several commands. * ifacetk/iface.tcl: Fixed privacy menu items. * disco.tcl, ifacetk/iface.tcl, joingrdialog.tcl, muc.tcl, plugins/chat/disco.tcl, plugins/pep/user_location.tcl, plugins/pep/user_mood.tcl, plugins/pep/user_tune.tcl, xmppmime.tcl: Fixed connection options. * plugins/pep/user_location.tcl: Fixed typo. * pubsub.tcl: Fixed typo. * doc/tkabber.html, doc/tkabber.xml, README: Changed connection ID to connection token. * muc.tcl: Fixed call to ::xmpp::xml::split. * plugins/roster/conferenceinfo.tcl: Fixed main menu item command. * muc.tcl, userinfo.tcl, messages.tcl: Fixed cdata notation. * login.tcl: Added server JID as to address when registering new username. * plugins/general/rawxml.tcl: Fixed window coloring. 2008-10-11 Sergei Golovan * AUTHORS: Fixed authors list. * msgs/pl.msg: Updated Polish translation (thanks to Irek Chmielowiec). * chats.tcl, ifacetk/iface.tcl: Added command which programmatically closes chat window (thanks to Konstantin Khomoutov). * muc.tcl: Request MUC info not only from server but also from the room itself when joining conference room. It allows to use redirectors like J2J transport. 2008-10-10 Sergei Golovan * doc/tkabber.html, doc/tkabber.xml, README: Added notes about new sound theme and about upcoming 0.11.1 release. Replaced tabs by whitespaces. * ifacetk/iroster.tcl: Show offline users if roster filter is enabled and isn't empty (thanks to Ruslan Rakhmanin). * msgs/ru.msg: Updated Russian translation. * msgs/es.msg: Updated Spanish translation (thanks to Badlop). 2008-09-27 Sergei Golovan * plugins/general/sound.tcl: Fixed bug with sound notification of disconnect event if its default value is used. 2008-09-26 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2008-09-25 Sergei Golovan * ifacetk/iface.tcl: A bit optimized running of map_window_hook. * chats.tcl: Added new hook draw_message_post_hook. It is necessary because procedures in a usual draw_message_hook often return stop, so it's impossible to add a procedure to the very end of the hook and be sure it will be executed (thanks to Konstantin Khomoutov). * jabberlib/jabberlib.tcl, login.tcl: Reworked forced disconnecting from a server to make possible to use sound notification. * plugins/general/sound.tcl: Added sound notification for disconnect and changed default sounds for own chat and groupchat messages. * sounds/default/*.wav: Replaced default sound theme by a new original one (thanks to Serge Yudin). 2008-09-12 Sergei Golovan * gpgme.tcl: Ported key info processing to GPG package where its format slightly differs from TclGPGME. 2008-09-11 Sergei Golovan * plugins/chat/draw_timestamp.tcl: Raised priority to enable timestamps for error and info messages. * gpgme.tcl: Added GPG package (http://code.google.com/p/tclgpg) as an alternative package for encryption/signing messages. * msgs/de.msg, msgs/es.msg, msgs/it.msg, msgs/nl.msg, msgs/pl.msg, msgs/ru.msg, msgs/uk.msg: Replaced GPGME by more generic GPG. 2008-09-10 Sergei Golovan * disco.tcl: Added procedure which returns features list for a node. * plugins/chat/disco.tcl: Added a new plugin which implements /disco command in a chat window. The command opens disco window either for the curernt chat JID or for any specified JID. * muc.tcl, plugins/roster/conferences.tcl: Added MUC menu for room configuration etc. to conference JID nodes in disco and to conference bookmarks in a roster. 2008-09-09 Sergei Golovan * msgs/ru.msg: Fixed Russian translation. 2008-09-07 Sergei Golovan * ifacetk/buttonbar.tcl: Fixed keyboard traversing order for tabbar after its buttons are moved or a new tab is inserted in the middle. 2008-08-26 Sergei Golovan * msgs/ru.msg: Updated Russian translation. 2008-08-25 Sergei Golovan * ifacetk/systray.tcl, jabberlib/jlibauth.tcl, jabberlib/jlibcomponent.tcl, jabberlib/jlibcompress.tcl, jabberlib/jlibsasl.tcl, jabberlib/jlibtls.tcl, plugins/general/headlines.tcl, plugins/windows/taskbar.tcl: Fixed usage of [namespace code] in callbacks. The previous behavior doesn't reveal bug in Tcl/Tk 8.6a1 and older due to a hack maintained for Itcl and removed in 8.6a2. Also, TkCon may mask the bug because it includes a copy of the hack. 2008-08-24 Sergei Golovan * plugins/unix/menu8.4.tcl: Enabled plugin for Tcl/Tk 8.6. 2008-08-08 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * msgs/es.msg: Fixed typo in Spanish translation (thanks to Emiliano Gavilan). 2008-08-03 Sergei Golovan * plugins/general/copy_jid.tcl: Added a menu item for copying real JID (if available) in groupchats to clipboard (thanks to Konstantin Khomoutov). * msgs/ru.msg: Updated Russian translation (thanks to Konstantin Khomoutov). 2008-07-30 Sergei Golovan * login.tcl: Added -proxy option to jlib::connect call even if no proxy is used. This fixes bug when it's impossible to disable once used proxy. 2008-07-28 Sergei Golovan * jabberlib/https.tcl: Fixed typo in basic authentication (thanks to Konstantin Khomoutov). 2008-07-16 Sergei Golovan * utils.tcl, roster.tcl, ifacetk/iroster.tcl: Fixed bug in splitting roster group by a delimiter, now correctly treating delimiter as a string and not as a regexp (thanks to Konstantin Khomoutov). 2008-07-12 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2008-07-11 Sergei Golovan * chats.tcl: Use left-justified text in chat window/tab JID menubutton. * ifacetk/iface.tcl: Added an option to show only personal messages (chat or highlighted) in windows titles (thanks to Antoni Grzymala). 2008-07-08 Sergei Golovan * jabberlib/wrapper.tcl, tclxml/sgmlparser.tcl: Bugfix in XMLNS prefix processing when tDOM parser is used. 2008-07-07 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2008-07-05 Sergei Golovan * jabberlib/wrapper.tcl, tclxml/sgmlparser.tcl: Fixed parsing XMLNS prefixes for tag attributes. Now they are replaced by XMLNS URI both when tDOM or internal parser are used. 2008-07-03 Sergei Golovan * plugins/general/caps.tcl: Added forgotten node in disco#info reply (thanks to Konstantin Khomoutov). 2008-06-17 Sergei Golovan * jabberlib/https.tcl: Fixed typo in basic authentication. 2008-06-15 Sergei Golovan * chats.tcl: Lower node and server case for JID to which a new chat window is opened using open_to_user procedure. * plugins/iq/time2.tcl: Fixed urn:xmpp:time tag (thanks to Konstantin Khomoutov). 2008-06-08 Sergei Golovan * doc/tkabber.html, doc/tkabber.xml, README: Added a note about data form media element (XEP-0221) support and mentioned that Tkabber supports only version 0.2 of this and version 0.9 of XEP-0156. * *: 0.11.0 is released. * tkabber.tcl: Pushed version number to 0.11.0-svn. 2008-06-05 Sergei Golovan * doc/tkabber.html, doc/tkabber.xml, README: Added working links to Tclmore and ZTcl sources. Fixed unclear external links. Added Konstantin Khomoutov to the authors list, fixed authors email addresses. * ifaceck/iface.tcl, ifacetk/iface.tcl, splash.tcl: Added Konstantin Khomoutov to the authors list. 2008-06-04 Sergei Golovan * msgs/pl.msg: Updated Polish translation (thanks to Irek Chmielowiec). * msgs/es.msg: Updated Spanish translation (thanks to Badlop). * plugins/pep/user_tune.tcl: Show user tune info even if it doesn't contain author's name using ? marks (thanks to Konstantin Khomoutov). * plugins/pep/user_location.tcl, plugins/pep/user_tune.tcl, plugins/pep/user_activity.tcl, plugins/pep/user_mood.tcl, msgs/es.msg, msgs/pl.msg, msgs/ru.msg, msgs/de.msg: Corrected messages in user popup info (thanks to Konstantin Khomoutov). * doc/tkabber.html, doc/tkabber.xml, README: Added upgrade section which describes main changes between 0.10.0 and 0.11.0 versions (thanks to Konstantin Khomoutov). 2008-05-22 Sergei Golovan * doc/tkabber.xml, doc/tkabber.html, README: Bumped stable version to 0.11.0. * examples/tools/jsend.tcl, examples/tools/rssbot.tcl: Fixed required jabberlib version. * msgs/ru.msg: Updated Russian translation. 2008-05-21 Sergei Golovan * iface.tcl, login.tcl: Prettified SSL certificate info output (thanks to Konstantin Khomoutov). * msgs/ru.msg: Updated Russian translation. * contrib/extract-translations/extract.tcl: Read message file using UTF-8 encoding. * plugins/chat/draw_timestamp.tcl, plugins/general/ispell.tcl: Turned multiline translateable messages in one-line messages because message extraction tool doesn't process multiline messages correctly. * datagathering.tcl: Restored E-mail spelling. * jabberlib/stanzaerror.tcl, login.tcl: Fixed commented out translateable messages, so they can be processed by an extraction script. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2008-05-20 Sergei Golovan * utils.tcl: Added forgotten helper procedure lpop which is used in user tune plugin (thanks to Konstantin Khomoutov). * plugins/pep/user_tune.tcl: Added implementation of rating field, which was added to XEP-0118 in version 1.2 (thanks to Konstantin Khomoutov). * msgs/ru.msg: Updated Russian translation (thanks to Konstantin Khomoutov). * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2008-05-19 Sergei Golovan * jabberlib/stanzaerror.tcl, login.tcl: Added a few commented out strings for translation (messages from jabberd 1.4 and SSL info). * plugins/general/clientinfo.tcl, msgs/ca.msg, msgs/de.msg, msgs/eo.msg, msgs/es.msg, msgs/eu.msg, msgs/fr.msg, msgs/nl.msg, msgs/pl.msg, msgs/pt.msg, msgs/ro.msg, msgs/ru.msg, msgs/uk.msg: Replaced Os by OS (as operating system abbreviation). * plugins/pep/user_location.tcl: Made several field labels more clear (thanks to Konstantin Khomoutov). * plugins/pep/user_tune.tcl: Implemented stopping player and did a few other improvements (thanks to Konstantin Khomoutov). * msgs/ru.msg: Updated Russian translation (thanks to Konstantin Khomoutov). * msgs/ru.msg: Sorted messages and fit them into 80 columns. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2008-05-18 Sergei Golovan * privacy.tcl: Removed hook create_privacy_rules_menu_hook added for receipts plugin but no longer needed (thanks to Konstantin Khomoutov). * roster.tcl: Removed unneeded variable link (thanks to Konstantin Khomoutov). * ifacetk/iface.tcl: Replaced status message entry field with a compbobox with several recently used status messages (thanks to Konstantin Khomoutov). * plugins/unix/icon.tcl: Use "user available" icon for all toplevel windows. * userinfo.tcl: Removed "Close" button from info window because it isn't a dialog. * chats.tcl, ifacetk/bwidget_workarounds.tcl, ifacetk/iface.tcl, plugins/general/headlines.tcl, plugins/general/message_archive.tcl, plugins/general/rawxml.tcl: Made paned window separators flat and decreased their width. * plugins/roster/fetch_nicknames.tcl: Added a command to fetch nicknames for all users in a given group (thanks to Konstantin Khomoutov). * ifacetk/iroster.tcl: Moved "Rename group" menu item from the top of menu. * ifacetk/iface.tcl: Made popup menu on text status combobox non-torn-off. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2008-05-15 Sergei Golovan * plugins/general/caps.tcl: Fixed bug with incorrectly calculated hash string if extra info have spaces in field values (closes: http://www.jabber.ru/bugzilla/show_bug.cgi?id=380). 2008-05-14 Sergei Golovan * roster.tcl: Added an own JID to trusted JIDs and check bare JIDs instead of full ones. 2008-05-13 Sergei Golovan * plugins/general/challenge.tcl: Don't mirror challenge id attribute when submitting a form because it isn't necessary according to version 0.9 of XEP-0158. * roster.tcl: Added a helper function roster::is_trusted which returns true iff a roster user is subscribed to out presence. 2008-05-12 Sergei Golovan * plugins/chat/chatstate.tcl: Switch internal chat states even if messages aren't sent because a recipient is unavalable. It prevents accidental sending of chat state events when a recipient becomes available * plugins/chat/events.tcl: Do not send events if a recipient is unavailable. It's useless and sometimes a remote server returns error messages which confuse users. * msgs/pl.msg: Updated Polish translation (thanks to Irek Chmielowiec). 2008-05-11 Sergei Golovan * utils.tcl: Added two procedures get_conf and render_url. The first one returns the value of a given widget option, the second creates a one-line text widget with a specified URL in it. * messages.tcl: Render OOB urls as links and not as buttons. * chats.tcl, gpgme.tcl, messages.tcl, muc.tcl, plugins/general/remote.tcl, plugins/general/xaddress.tcl, plugins/roster/rosterx.tcl: Added id argument to message_process_x_hook arguments list. * datagathering.tcl: Added processing of media elements (XEP-0221). Only in-band images and uris are supported currently. * plugins/richtext/urls.tcl: Fixed typo. * jabberlib/jabberlib.tcl: Allowed using id specified by send_iq call even for get and set queries. * plugins/general/challenge.tcl: Added processing of robot challenges forms in XMPP messages. * jabberlib/namespaces.tcl: Added two new namespaces (from XEP-0221 and XEP-0158). * datagathering.tcl: Return error if a media element cannot be processed this allows to fall back to a legacy challenge. * plugins/general/challenge.tcl: Don't show a message if a robot challenge form is attached and can be processed without errors. * ifacetk/iroster.tcl: Added an option which controls whether chat or normal message window is to be opened on roster item doubleclick (defaults to chat). * messages.tcl: Lowered priority of normal message processing because it returns stop and breaks other procedures in process_message_hook if default message type is normal (as it should be). * README, doc/tkabber.html, doc/tkabber.xml, ifaceck/iface.tcl, ifacetk/iface.tcl, splash.tcl: Fixed copyright messages and added a few new features to 0.10.1 features list. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2008-05-05 Sergei Golovan * disco.tcl: Added more heuristics when guessing JID category and type while dragging it to roster. 2008-05-04 Sergei Golovan * roster.tcl: When overriding roster item category or subtype check if it was already overridden. 2008-04-22 Sergei Golovan * plugins/general/caps.tcl: Fixed bug with jabber:x:data processing in case if field values contain spaces. * muc.tcl: Added reasons to all MUC /commands. It isn't supported by MUC servers currently, but might be useful in the future (thanks to Konstantin Khomoutov). 2008-04-21 Sergei Golovan * datagathering.tcl: Added variable type to parsed jabber:x:data form output. * plugins/general/remote.tcl: Adjusted to account for variable types in jabber:x:data forms. * disco.tcl: Changed semantics of extras argument in disco_info_hook to a list of forms instead of a flat list of all variables. * plugins/general/caps.tcl: Fixed identity support (added name and xml:lang processing). Added extras (additional jabber:x:data forms) support. 2008-04-16 Sergei Golovan * privacy.tcl: Changed "no default list" and "no active list" radiobutton values from "" to "\u0000" to workaround a bug with radiobutton tristate mode in Tk 8.5. 2008-04-07 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2008-03-23 Sergei Golovan * jabberlib/wrapper.tcl: Fixed xml:lang parsing when tDOM is used as an XML parser. * utils.tcl: Added a procedure to generate a sequence of paths for message dialogs. * plugins/chat/histool.tcl, plugins/pep/user_activity.tcl, plugins/pep/user_location.tcl, plugins/pep/user_mood.tcl, plugins/pep/user_tune.tcl, plugins/roster/backup.tcl, plugins/roster/bkup_annotations.tcl, plugins/roster/bkup_conferences.tcl: Switched from tk_messageBox to MessageDlg (tk_messageBox in Tk 8.5.1 and newer uses Ttk unconditionally, which is unacceptable). * plugins/pep/user_activity.tcl, plugins/pep/user_location.tcl, plugins/pep/user_mood.tcl, plugins/pep/user_tune.tcl: Enable/disable menu items on connect/disconnect to a server. * muc.tcl: Added a possibility to change affiliation/role for all MUC list at once. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2008-03-07 Sergei Golovan * plugins/chat/draw_xhtml_message.tcl: Fixed a bug with xhtml_symb tag which was introduced when removing global font variable. * disco.tcl: Added registering extras to include XEP-0128 forms into disco#info replies. * plugins/iq/version.tcl: Implemented reporting Tkabber version in disco#info replies (XEP-0232). * ifacetk/iroster.tcl, jabberlib/wrapper.tcl, plugins/roster/annotations.tcl, plugins/roster/backup.tcl, plugins/roster/bkup_annotations.tcl, plugins/roster/bkup_conferences.tcl, plugins/roster/conferences.tcl, roster.tcl: Rewritten roster export. Now it is exported to XML, and export includes roster items, conferences and roster notes (thanks to Konstantin Khomoutov). * ifacetk/idefault.tcl, ifacetk/iface.tcl, ifacetk/iroster.tcl, plugins/chat/draw_xhtml_message.tcl, plugins/richtext/stylecodes.tcl, richtext.tcl: Added a different for rosters (before that rosters and chats used the same font). * README, doc/tkabber.html, doc/tkabber.xml: Fixed section about using fonts and added a few items into the list of new features in 0.10.1. * ifacetk/iroster.tcl, presence.tcl: Code cleanup. 2008-03-06 Sergei Golovan * disco.tcl: Added new hook disco_node_reply_hook to allow answering service discovery queries to unregistered temporary nodes (as in entity capabilities plugin). * plugins/general/caps.tcl: Implemented version 1.5 of XEP-0115 (only sending capabilities and replying to disco#info queries). * iq.tcl: Fixed call of IQ handler if it is a command with arguments. * datagathering.tcl: Removed [cequal] and [cindex] calls. * negotiate.tcl: Adapted to a current version of XEP-0020. * privacy.tcl: Fixed possible race conditions with receiving/updating privacy lists. * plugins/pep/user_location.tcl: Added user location support plugin (XEP-0080). * plugins/iq/time2.tcl: Added entity time support plugin (XEP-0202). * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2008-03-04 Sergei Golovan * msgs/ru.msg: Updated Russian translation. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2008-03-03 Sergei Golovan * muc.tcl: Added a warning message to groupchat window if a room the user enters is newly created. 2008-03-02 Sergei Golovan * ifacetk/bwidget_workarounds.tcl: Changed look and feel of paned window separators. * chats.tcl, examples/xrdb/badlop-dark.xrdb, examples/xrdb/dark.xrdb, examples/xrdb/dark2.xrdb, examples/xrdb/ice.xrdb, examples/xrdb/light.xrdb, examples/xrdb/lighthouse.xrdb, examples/xrdb/ocean-deep.xrdb, examples/xrdb/teopetuk.xrdb, examples/xrdb/warm.xrdb, ifacetk/idefault.tcl, ifacetk/iface.tcl, ifacetk/iroster.tcl, mclistbox/mclistbox.tcl, plugins/chat/draw_xhtml_message.tcl, plugins/richtext/stylecodes.tcl, richtext.tcl, tkabber.tcl: Removed global font variable. Now one should either add option *font or use ifacetk::options(font) variable. * idefault.tcl, iface.tcl, ifacetk/iroster.tcl, plugins/richtext/stylecodes.tcl, richtext.tcl: Partially rolled back the change in font options for Tcl/Tk on UNIX with disabled Xft. Removed use of named fonts wherever possible. Also, ifacetk::options(font) variable can't be used for roster and chats font setup. Use *Chat*Text.font resource instead. 2008-02-21 Sergei Golovan * msgs/ru.msg: Updated Russian translation. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2008-02-20 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2008-02-19 Sergei Golovan * plugins/chat/draw_server_message.tcl: Removed unnecessary procedure call (thanks to Konstantin Khomoutov). * plugins/richtext/stylecodes.tcl: Added a customize option which allows to show stylecode markup symbols regardles of changing fonts in a chat window (thanks to Konstantin Khomoutov). * msgs/ru.msg: Updated (thanks to Konstantin Khomoutov). 2008-02-18 Sergei Golovan * iface.tcl: Show SHA1 hash of SSL certificate when asking for its approval and in a certificate info. 2008-02-05 Sergei Golovan * doc/tkabber.html, doc/tkabber.xml, README: Fixed notice about external XML parser (replaced TclXML which diesnt' work by tDOM which works). * jabberlib/jabberlib.tcl: Eliminate use_external_tclxml variable. Now, to use tDOM a user should 'require' it in a config file. * chats.tcl, custom.tcl, datagathering.tcl, disco.tcl, ifaceck/iroster.tcl, messages.tcl, muc.tcl, plugins/chat/chatstate.tcl, plugins/chat/events.tcl, plugins/chat/histool.tcl, plugins/chat/logger.tcl, plugins/chat/nick_colors.tcl, plugins/general/headlines.tcl, plugins/general/message_archive.tcl, plugins/general/offline.tcl, plugins/general/rawxml.tcl, plugins/general/xcommands.tcl, plugins/roster/annotations.tcl, pubsub.tcl, register.tcl, search.tcl, userinfo.tcl: Removed usage of global variable font. 2008-01-27 Sergei Golovan * plugins/filetransfer/si.tcl: Registered filetransfer feature to include it into disco#info replies. 2008-01-23 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2008-01-15 Sergei Golovan * tkabber.tcl: Moved loading BWidget below sourcing config file to allow adding/removing directories to auto_path in config. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2008-01-05 Sergei Golovan * ifacetk/iface.tcl, ifacetk/iroster.tcl: Added simple roster filter. * ifacetk/iroster.tcl: Made roster filter case insensitive, added Escape binding which clears filter string. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2008-01-03 Sergei Golovan * chats.tcl: Fixed raising tab in case when a user clicks on "Open new conversation" link which appears in chat tab if the other party changes his/her nickname. 2007-12-31 Sergei Golovan * ifaceck/iface.tcl, ifacetk/iface.tcl: Added -raise option to add_win to make it possible to raise new tab even if raise_new_tab option is switched off. Also, added new raise_win function which raise a corresponding tab. * chats.tcl, custom.tcl, disco.tcl, doc/tkabber.xml, ifacetk/iface.tcl, joingrdialog.tcl, plugins/chat/histool.tcl, plugins/chat/muc_ignore.tcl, plugins/general/message_archive.tcl, plugins/general/rawxml.tcl, plugins/general/stats.tcl: Do not raise new tabs (when raise_new_tab is off) only if it isn't created by a Tkabber user himself, but by some external event (incoming message etc.). 2007-12-30 Sergei Golovan * tclxml/sgmlparser.tcl, tclxml/tclparser-8.1.tcl, tclxml/xml-8.1.tcl: Fixed bug with processing multiple XML attributes in case when one of them contains unescaped >. Also, made XML parser more reliable when parsing incomplete document (e.g. correctly process XML entities split into packets). * custom.tcl: Fixed back/forward moving in customize window history. 2007-12-28 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2007-12-27 Sergei Golovan * mclistbox/mclistbox.tcl: Fixed error message when selecting a row (in Tcl/Tk 8.5.0). 2007-12-26 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2007-12-24 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2007-12-23 Sergei Golovan * disco.tcl: Added unregistering and re-registering disco features. * pep.tcl: Added PEP customization group. * plugins/pep/user_activity.tcl, plugins/pep/user_mood.tcl, plugins/pep/user_tune.tcl: Report corresponding features in disco, added auto-subscription to PEP notifications. 2007-12-19 Sergei Golovan * mclistbox/mclistbox.tcl, plugins/pep/user_activity.tcl, plugins/pep/user_mood.tcl, plugins/pep/user_tune.tcl, tclxml/sgmlparser.tcl, tclxml/tclparser-8.1.tcl: Added -- to all switch commands. 2007-12-16 Sergei Golovan * plugins/windows/taskbar.tcl: Fixed tray and window icons change during pixmaps theme switch (thanks to Konstantin Khomoutov). 2007-12-06 Sergei Golovan * plugins/si/socks5.tcl: Fixed procedure call (thanks to Konstantin Khomoutov). 2007-11-29 Sergei Golovan * doc/tkabber.html, doc/tkabber.xml, README: Added an item to the list of searchable windows (thanks to Konstantin Khomoutov). 2007-11-28 Sergei Golovan * plugins/chat/nick_colors.tcl: Replaced crc16 by sum for performance reason and because crc16 fails to load in older Tcllib versions (observed in Gentoo and Tcllib 1.6.1). 2007-11-25 Sergei Golovan * chats.tcl, plugins/chat/nick_colors.tcl: Implemented storing and using nick colors using more efficient algorithm. 2007-11-20 Sergei Golovan * plugins/chat/draw_timestamp.tcl: Replaced [clock scan] by [expr] in "23 hours 59 minutes ago" calculation. 2007-11-16 Sergei Golovan * ifacetk/bwidget_workarounds.tcl: Fixed dialog definition if -parent is explicitly empty. 2007-11-13 Sergei Golovan * ifacetk/bwidget_workarounds.tcl: Make dialogs non-transient to their parents if parents aren't viewable. Transient window in this case become unmapped too and grab to it leads to complete application hang. 2007-11-12 Sergei Golovan * plugins/chat/logger.tcl: Replace trailing dot by its hexadecimal code to make it possible to create log files for JIDs which end by a dot. * plugins/chat/histool.tcl: Fixed bug with showing history only for odd JIDS in JID list (thanks to Konstantin Khomoutov). 2007-11-11 Sergei Golovan * ifacetk/iface.tcl: Fixed unneeded tab headers highlighting when Tkabber window is not shown. 2007-11-10 Sergei Golovan * utils.tcl: A small addition to underscrolling fix. * plugins/si/ibb.tcl: Fixed incorrect error reporting. * plugins/si/ibb.tcl: Fixed processing of messages with type error (by do not replying to them). 2007-11-09 Sergei Golovan * chats.tcl, utils.tcl: Fixed chatlog window scrolling if a tabbar row is added/removed when a tab is opened/closed. 2007-11-08 Sergei Golovan * msgs/pl.msg: Updated Polish translation (thanks to Irek Chmielowiec). * chats.tcl: Added workaround for underscrolled chatlog windows which are opened at Tkabber startup and not mapped yet (so their height is one pixel and adding any text to it likely switches off smart scrolling). * plugins/general/caps.tcl: Made hash attribute required and added node attribute to make outgoing caps conforming to XEP-0115 (version 1.5). 2007-11-02 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2007-10-31 Sergei Golovan * msgs/es.msg: Updated Spanish translation (thanks to Badlop). 2007-10-30 Sergei Golovan * plugins/general/rawxml.tcl: Fixed sending messages from raw XML console (thanks to Konstantin Khomoutov). 2007-10-28 Sergei Golovan * ifacetk/unix.xrdb: Fixed balloons resources. * messages.tcl: Made 'Add user' menu item inactive if the contact's real JID isn't available (thanks to Konstantin Khomoutov). * *: Tagged 0.10.1-beta2 for release. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2007-10-27 Sergei Golovan * tkabber.tcl: Increased priority for options read from default XRDB files. 2007-10-26 Sergei Golovan * jabberlib/autoconnect.tcl, jabberlib/https.tcl, jabberlib/jabberlib.tcl, jabberlib/pkgIndex.tcl, jabberlib/socks4.tcl, jabberlib/socks5.tcl, jabberlib/transports.tcl: Renamed https, socks4 and socks5 modules to autoconnect::https, autoconnect::socks4 and autoconnect::socks5. Rewritten proxy modules loading scheme (now they are registered in autoconnect). * ifaceck/ilogin.tcl, ifacetk/systray.tcl, msgs/ru.msg, pep.tcl: Updated Russian translation. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2007-10-24 Sergei Golovan * jabberlib/https.tcl, jabberlib/socks3.tcl, jabberlib/socks5.tcl, jabberlib/autoconnect.tcl: Fixed closing TCP socket to a proxy in case of network problems. 2007-10-21 Sergei Golovan * plugins/richtext/emoticons.tcl: Added support for JISP emoticon sets (requires vfs::zip and Memchan Tcl extensions). * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2007-10-18 Sergei Golovan * plugins/windows/taskbar.tcl: Added window icons to all Tkabber windows (thanks to Konstantin Khomoutov). 2007-10-15 Sergei Golovan * ifacetk/buttonbar.tcl: Replaced ... by \u2026 at the end of trimmed button labels. This helps to show extra two symbols if a monospaced font is used. 2007-10-14 Sergei Golovan * chats.tcl: Added a procedure which returns chat ID given its window name (thanks to Konstantin Khomoutov). 2007-10-11 Sergei Golovan * ifacetk/iface.tcl: Fixed binding of and to chat windows/tabs (thanks to Konstantin Khomoutov). Also, cleaned up corresponding hooks. 2007-10-10 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * jabberlib/transports.tcl: Fixed supported proxy types list. 2007-10-07 Sergei Golovan * examples/xrdb/*: Fixed *Balloon*foreground and *Balloon*background resources. * tkabber.tcl, ckabber.tcl: Fixed default resources priority. * jabberlib/jabberlib.tcl: Fixed small typo. * doc/tkabber.html, doc/tkabber.xml, README: Added info on ctcomp plugin. * plugins/iq/ping.tcl: Use jlib::emergency_disconnect (indirectly via jlib::inmsg) for disconnecting/reconnecting after ping timeout. This should fix race condition during reconnect. * *: Tagged 0.10.1-beta for release. 2007-10-06 Sergei Golovan * jabberlib-tclxml/: Renamed to jabberlib/ directory. * tclxml/*: Code cleanup, removed xmldep.tcl and xpath.tcl since they are not necessary for jabberlib. * Makefile: Adopted to recent changes in directories list. * disco.tcl, ifacetk/iface.tcl, ifacetk/iroster.tcl, plugins/general/avatars.tcl, plugins/general/subscribe_gateway.tcl, plugins/roster/conferences.tcl, plugins/general/xcommands.tcl, privacy.tcl, pubsub.tcl: Got rid of ::jlib::route. * tkabber.tcl: Require jabberlib 0.10.1 * splash.tcl: Fixed label flicker during loading package indices. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * doc/tkabber.html, doc/tkabber.xml, README: Added info on floatinglog plugin. * balloon.tcl: Cleaned up usage of foreground and background resources for balloon windows. Also, the meaning of padX and padY was changed. * examples/xrdb/*: Removed *Balloon*padX and *Balloon*padY resources. * msgs/ru.msg: Added translation of user mood, user tune, user activity (thanks to Serge Yudin ans Konstantin Khomoutov). 2007-10-05 Sergei Golovan * jabberlib-tclxml/jabberlib.tcl, doc/tkabber.xml: Removed keep-alive periodic sending of space character to a server. XMPP Ping support does this job much better (at cost of bigger traffic though). * jabberlib-tclxml/jabberlib.tcl, jabberlib-tclxml/transports.tcl, jabberlib-tclxml/jlibsasl.tcl, jabberlib-tclxml/jlibtls.tcl, jabberlib-tclxml/jlibcompress.tcl: Moved starting and finishing stream to transports. Eventually it will allow to impolement unusual stream start and finish (e.g. in BOSH, XEP-0124). * login.tcl: Increased default polling intervals. Moved to more neutral options -httpurl, -httpusekeys, -httpnumkeys (they will be used not only in HTTP polling). * jabberlib-tclxml/transports.tcl: Code cleanup, use separate variables for different connections instead of a single array. * jabberlib-tclxml/tclxml: Moved to tkabber root directory. * jabberlib-tclxml/jabberlib.tcl, jabberlib-tclxml/wrapper.tcl, tclxml/xml__tcl.tcl: Added -namespace option to xml::parser and made possible to use tDOM as an XML parser. (tDOM parser is sensitive to unbound XML namespaces though, so to enable it use variable use_external_tclxml and set it to 1.) * doc/tkabber.html, doc/tkabber.xml, README: Added main changes in 0.10.1. 2007-09-25 Sergei Golovan * plugins/richtext/emoticons.tcl: Ignore empty text as an emoticon label (thanks to Konstantin Khomoutov). 2007-09-21 Sergei Golovan * private.tcl, tkabber.tcl: Separated interface to private XML storage (XEP-0049). Eventually private information via pubsub (XEP-0223) backend will be added. * plugins/roster/annotations.tcl, plugins/roster/conferences.tcl, plugins/roster/roster_delimiter.tcl: Switched to a separated private XML storage interface. * ifacetk/systray.tcl: Added call to [wm withdraw .] to please some window managers when raising main window. 2007-09-20 Sergei Golovan * plugins/general/xaddress.tcl: Moved address rewriting to rewrite_message_hook, check for forged address changes. * ifacetk/systray.tcl, plugins/unix/dockingtray.tcl, plugins/unix/systray.tcl, plugins/unix/tktray.tcl, plugins/windows/taskbar.tcl: Split main window showing and hiding into two separate gestures: left mouse button shows main window, middle mouse button hides. * ifacetk/iface.tcl: Added a few words describing systray icon behavior. * ifacetk/systray.tcl: Raise main window to top when showing it. * plugins/chat/events.tcl, plugins/chat/chatstate.tcl: Registered jabber:x:event and http://jabber.org/protocol/chatstates as Disco features. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2007-09-18 Sergei Golovan * ifacetk/iroster.tcl: Fixed showing own resources if username is not in lowercase. 2007-09-17 Sergei Golovan * plugins/chat/popupmenu.tcl: Fixed double encoding of Google query to UTF-8. 2007-09-16 Sergei Golovan * userinfo.tcl: Fixed bug with reconfiguring photo after it is destroyed. * plugins/pep/user_tune.tcl: Replaced positional arguments of publish procedure by optional ones. 2007-09-08 Sergei Golovan * msgs/de.msg, trans/de.msg: Updated German translation (thanks to Roger Sondermann). 2007-09-05 Sergei Golovan * msgs/pl.msg, trans/pl.msg: Updated Polish translation (thanks to Irek Chmielowiec). 2007-09-04 Sergei Golovan * ifacetk/ilogin.tcl, jabberlib-tclxml/jabberlib.tcl, jabberlib-tclxml/jlibsasl.tcl, login.tcl: Added new option to disable X-GOOGLE-TOKEN SASL mechanism. This helps if Tkabber cannot connect to Google via HTTPS. Also, made error message about SASL mechanisms more clear. * msgs/es.msg: Updated Spanish translation (thanks to Badlop). * plugins/chat/histool.tcl: Ignore damaged history messages during search in history. 2007-09-03 Sergei Golovan * plugins/iq/version.tcl: Made reporting OS version optional as required by XEP-0092. 2007-09-02 Sergei Golovan * login.tcl: Added $connid suffix to authentication error dialog path to avoid conflict if several connections are used simultaneously. 2007-08-31 Sergei Golovan * README, doc/tkabber.html, doc/tkabber.xml, jidlink.tcl, plugins/filetransfer/jidlink.tcl, plugins/jidlink/dtcp.tcl, plugins/jidlink/ibb.tcl, tkabber.tcl: Moved Jidlink (obsolete undocumented filetransfer protocol) support to an external plugin. * ifaceck/iroster.tcl, ckabber.tcl, splash.tcl: Removed references to Jidlink. * examples/xrgb/*.xrdb: Added inactiveSelectBackground definitions. * msgs/ru.msg: Updated Russian translation. 2007-08-30 Sergei Golovan * README, browser.tcl, datagathering.tcl, disco.tcl, doc/tkabber.html, doc/tkabber.xml, ifacetk/default.xrdb, ifacetk/iface.tcl, ifacetk/unix.xrdb, muc.tcl, plugins/general/headlines.tcl, plugins/general/offline.tcl, plugins/general/subscribe_gateway.tcl, plugins/general/xcommands.tcl, plugins/iq/browse.tcl, plugins/unix/icon.tcl, plugins/windows/taskbar.tcl, register.tcl, search.tcl, tkabber.tcl, userinfo.tcl: Moved Jabber Browser (XEP-0011) support to an external plugin since it is deprecated for a long time. Moved registering Disco features (and Browser namespaces) to a new hook. Replaced JBrowser window class by JDisco. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2007-08-18 Sergei Golovan * plugins/general/xcommands.tcl: Fixed x:data cleanup on completing or cancelling ad-hoc command. * plugins/pep/user_mood.tcl: Fixed typo (thanks to Roger Sondermann). * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * plugins/general/headlines.tcl: Ensure that color of read messages is not an empty string. Also, minor code cleanup. * plugins.tcl: Sort list of files to source to make order of loaded plugins always the same. * plugins/pep/user_mood.tcl: Fixed status line notifications. * plugins/pep/user_activity.tcl: Added preliminary user activity implementation (XEP-0108). * plugins/pep/user_mood.tcl, plugins/pep/user_activity.tcl: Fixed multiuser support. * plugins/pep/user_tune.tcl: Added preliminary user tune implementation (XEP-0118). * plugins/pep/user_activity.tcl: Fixed publishing an activity without a subactivity, and fixed showing user activity in userinfo window. * plugins/pep/user_tune.tcl: Fixed showing user tune in userinfo window. 2007-08-17 Sergei Golovan * pubsub.tcl: Added notification support when deleting published item. * pep.tcl: Added item ID support when publishing PEP item. Also, added a node deleting procedure. * plugins/pep/user_mood.tcl: Added support of deleting published user mood. Also, added publishing user mood for all connected resources simultaneously. 2007-08-16 Sergei Golovan * datagathering.tcl: Register jabber:x:data to show in disco#info responses (closes: http://www.jabber.ru/bugzilla/show_bug.cgi?id=365). * messages.tcl: Register jabber:x:oob to show in disco#info responses (closes: http://www.jabber.ru/bugzilla/show_bug.cgi?id=366). * disco.tcl: Sort features list on sending disco#info response. * tkabber.tcl: Reordered files sourcesd at Tkabber start to allow registering jabber:x:oob as a disco feature in messages.tcl. * plugins/general/tkcon.tcl: Fixed clearing checkmark in main menu on closing TkCon window. * plugins/windows/console.tcl: Fixed clearing checkmark in main menu on closing console window. 2007-08-15 Sergei Golovan * examples/tools/jsend.tcl, examples/tools/rssbot.tcl: Fixed sending available presence and removed loading unnecessary Tclx package. 2007-08-12 Sergei Golovan * iq.tcl: Switched to returning service-unavailable instead of feature-not-implemented as recommended by RFC-3291. * plugins/iq/ping.tcl: Return service-unavailable instead of swallowing ping request because it's mandatory to reply to every IQ request. * plugins/general/caps.tcl: Index array of features lists not only by hash values but also by hash methods. * plugins/roster/conferenceinfo.tcl: Added service-unavailable to caught jabber:iq:browse errors. * muc.tcl: Added a hack to change room nickname instead of joining if we are already in the room. 2007-08-11 Sergei Golovan * jabberlib-tclxml/tclxml/xml-8.1.tcl: Fixed parsing XML attributes which end by an equal sign. * jabberlib-tclxml/jabberlib.tcl: Add any tags (not only ) to a presence extensions list. * plugins/general/caps.tcl: Added entitiy capabilities support (XEP-0115, version 1.4). 2007-08-10 Sergei Golovan * plugins/general/rawxml.tcl: Fixed bug with pretty-printing tags with no attributes. * plugins/general/headlines.tcl: Ignore empty messages with also empty attached URL and description. 2007-08-08 Sergei Golovan * jabberlib-tclxml/socks4.tcl: Fixed checking SOCKS server response. * login.tcl: Added readable connect error messages. * jabberlib-tclxml/socks4.tcl: Changed error reporting. * jabberlib-tclxml/https.tcl: Report error if connection to a proxy server fails. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2007-08-07 Sergei Golovan * plugins/general/rawxml.tcl: Removed redundant xmlns attributes from pretty-printed XML for better readability. * plugins/chat/histool.tcl: Fixed history tree if JID resources contain double colons. 2007-08-06 Sergei Golovan * ifacetk/iroster.tcl: Fixed roster item menu commands in case when multiple contact resources connected and the command contains menu path (as in plugins/general/copy_jid.tcl). * plugins/search/spanel.tcl: Removed update idletasks to make creating chat window an atomic operation (this helps if there are several offline messages incoming). 2007-08-05 Sergei Golovan * ifacetk/iroster.tcl: Fixed cascaded roster item submenus in case of multiple contact resources connected. * plugins/pep/user_mood.tcl: Use JIDs without resource for sending user mood subscription/unsubscription stanzas via roster item menu. 2007-08-03 Sergei Golovan * pep.tcl: Fixed customization of menu tearoffs. * plugins/pep/user_mood.tcl: Fixed publishing of translated mood. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2007-08-01 Sergei Golovan * pep.tcl, pubsub.tcl, tkabber.tcl: Moved personal evening support to a separate file (thanks to Konstantin Khomoutov). * plugins/pep/user_mood.tcl: Added user mood (XEP-107) support as an exercise on personal eventing (thanks to Konstantin Khomoutov). 2007-07-31 Sergei Golovan * jabberlib-tclxml/tclxml/xml-8.1.tcl: Fixed tokenizing regexp to match CDATA XML declaration (this bug was introduced at 2005-04-07 when parsing unescaped > in tag attributes was fixed). * login.tcl: Fixed 'Logout with reason' dialog. It incorrectly reused existing .logout window. (Closes http://www.jabber.ru/bugzilla/show_bug.cgi?id=341) * plugins/unix/icon.tcl: Do not load static icon if WindowMaker dock is used. (Closes http://www.jabber.ru/bugzilla/show_bug.cgi?id=342) * si.tcl: Fixed an application error message in case of cancelled file transfer. (Closes http://www.jabber.ru/bugzilla/show_bug.cgi?id=358) * plugins/filetransfer/http.tcl: Report an error message in case of unsuccessful HTTP reply. (Closes http://www.jabber.ru/bugzilla/show_bug.cgi?id=361) * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2007-07-26 Sergei Golovan * plugins/chat/logger.tcl: Added ~ to symbols which are escaped during JID-to-filename conversion. 2007-07-23 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2007-07-22 Sergei Golovan * msgs/de.msg, trans/de.msg: Updated German translation (thanks to Roger Sondermann). 2007-07-21 Sergei Golovan * datagathering.tcl: Show descriptions in a balloon over the form fields (closes: http://www.jabber.ru/bugzilla/show_bug.cgi?id=359). 2007-07-17 Sergei Golovan * plugins/richtext/urls.tcl: Added upcoming asia TLD and changed URL regexp to accept URLS like http://example.org?par=val (without a slash after a domain name). 2007-07-16 Sergei Golovan * jabberlib-tclxml/https.tcl: Fixed bug with authorization at HTTPS proxy server. 2007-07-15 Sergei Golovan * jabberlib-tclxml/ntlm.tcl: Wrapped md5::md5 procedure to make possible using md5 package earlier than 2.0. * jabberlib-tclxml/transports.tcl, jabberlib-tclxml/https.tcl: Moved HTTPS proxy support to a separate https package. * jabberlib-tclxml/socks4.tcl, jabberlib-tclxml/socks5.tcl: Added SOCKS4a and SOCKS5 proxy support (the code is mostly borrowed from Mats Bengtsson). * jabberlib-tclxml/autoconnect.tcl: Added a wrapper over the socket command, which allows to connect via proxy. * jabberlib-tclxml/jabberlib.tcl, jabberlib-tclxml/transports.tcl: Made use of socks4, socks5 and https packages. Unfinished yet, todo meaningful error messages. * login.tcl, ifacetk/ilogin.tcl: Added support for new proxy types. Changed binary loginconf(useproxy) to loginconf(proxy) with values none, socks4, socks5, https. Changed loginconf(httpproxy) to loginconf(proxyhost), loginconf(httpport) to loginconf(proxyport), loginconf(httplogin) to loginconf(proxyusername) and loginconf(httppassword) to loginconf(proxypassword) option names. * doc/tkabber.xml, doc/tkabber.html, README: Documented changes in options. 2007-07-12 Sergei Golovan * jabberlib-tclxml/wrapper.tcl: Do not add xmlns attribute to an XML element if it is the same as for its parent element. 2007-07-11 Sergei Golovan * jabberlib-tclxml/tclxml/sgmlparser.tcl, jabberlib-tclxml/namespaces.tcl, jabberlib-tclxml/jabberlib.tcl, jabberlib-tclxml/jlibcomponent.tcl: Made XML namespace prefixes converted to xmlns attributes. Still ignore invalid prefixes. * jabberlib-tclxml/tclxml/sgmlparser.tcl: Fixed default xmlns processing (popping from stack). Also made code more readable and removed some pre 8.1 code. 2007-07-09 Sergei Golovan * hooks.tcl: Allowed hook priority to take real value instead of integer. This helps inserting a procedure to a hook between two existing procedures easier. * msgs/it.msg: Updated Italian translation (thanks to Mikhail Zakharenko) * plugins/si/socks5.tcl: Replaced buggy 'proxy.jabber.org' by known to work 'proxy.netlab.cz' and 'proxy.jabber.cd.chalmers.se' in default proxy list. * muc.tcl: Added chat messages about changes in occupants' roles and affiliations (thanks to Konstantin Khomoutov). * msgs/ru.msg: Updated (thanks to Konstantin Khomoutov). * plugins/roster/rosterx.tcl, search.tcl: Turned optional connection ID arguments to obligatory ones. 2007-06-22 Sergei Golovan * plugins/filetransfer/si.tcl: Don't close SOCKS5 connection upon receiving announced number of bytes because it leads to problems when the other side closes the socket. 2007-06-15 Sergei Golovan * userinfo.tcl: Request vCard from recipient bare JID except if the user is a groupchat member. 2007-06-13 Sergei Golovan * messages.tcl: Added 'Subscription' submenu to service popup menu in main roster. 2007-06-09 Sergei Golovan * jabberlib-tclxml/jabberlib.tcl, messages.tcl, examples/tools/jsend.tcl, examples/tools/rssbot.tcl: Made -connection option mandatory for jlib::send_msg. This prevents sending messages to wrong connection. * jabberlib-tclxml/jabberlib.tcl: Made parsing options in jlib::send_msg and jlib::send_presence more efficient. * jabberlib-tclxml/jabberlib.tcl: Made -connection option mandatory for jlib::send_presence. This prevents sending presence to wrong connection. 2007-05-29 Sergei Golovan * ifacetk/buttonbar.tcl: Fixed setting active page when -raisecmd is not called on activation. 2007-05-28 Sergei Golovan * ifacetk/buttonbar.tcl: Don't call -raisecmd command on first page creation. 2007-05-27 Sergei Golovan * ifacetk/buttonbar.tcl: Fixed activation of the first added button and deactivation of the last removed button (thanks to Konstantin Khomoutov). 2007-05-25 Sergei Golovan * richtext.tcl: Added -nonewline option to ::richtext::render_message procedure. * plugins/chat/draw_xhtml_message.tcl: Bugfix. Use -nonewline option in ::richtext::render_message calls when rendering XHTML messages. 2007-05-21 Sergei Golovan * doc/tkabber.xml, doc/tkabber.html, README: Fixed grammar in several sentences (thanks to Peter Kudinov). * pixmaps.tcl: Added JISP support (XEP-0038) for pixmap set loader. It requires vfs::zip, Memchan and Trf packages. * jabberlib-tclxml/transports.tcl, jidlink.tcl, messages.tcl, plugins/filetransfer/jidlink.tcl, plugins/general/message_archive.tcl, plugins/general/remote.tcl, plugins/jidlink/dtcp.tcl, plugins/jidlink/ibb.tcl, si.tcl, tkabber.tcl, utils.tcl: Renamed [random] procedure to [rand] to prevent clash with one from Memchan package, which is loaded for JISP support. 2007-05-08 Sergei Golovan * ifacetk/iface.tcl: Fixed main window gometry in untabbed mode (thanks to Konstantin Khomoutov). * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2007-05-06 Sergei Golovan * ifacetk/iface.tcl: Moved tab buttons closer to tabs themselves. 2007-05-01 Sergei Golovan * emoticons/default/icondef.xml: Lowered case of emoticons filenames. * emoticons/default/faceyukky.gif, emoticons/default/facehappy.gif, emoticons/default/facestartled.gif, emoticons/default/faceironic.gif, emoticons/default/facestraight.gif, emoticons/default/facewinking.gif, emoticons/default/facesad.gif, emoticons/default/facegrinning.gif: Updated (thanks to Artem Bannikov). 2007-04-29 Sergei Golovan * plugins/chat/logger.tcl: Fixed displaying announcement log messages in groupchat logs (thanks to Konstantin Khomoutov). * plugins/general/autoaway.tcl: Added support for tkinactive package from TIP 245 (see http://wiki.tcl.tk/14765) in Windows (thanks to Konstantin Khomoutov). * ifacetk/buttonbar.tcl: Cleanup in redraw buttonbar code. 2007-04-24 Sergei Golovan * ifacetk/buttonbar.tcl: Fixed raising tab page if this page is already activated. 2007-04-22 Sergei Golovan * configdir.tcl, splash.tcl, tkabber.tcl: Fixed bug when Tkabber couldn't show message dialogs during config directory transfer because the main window was withdrawn (thanks to Konstantin Khomoutov). 2007-04-21 Sergei Golovan * ifacetk/iface.tcl: Quickfixed bug with "bad window path name ".pages.ftab_0"" on updating tab foregrounds. 2007-04-19 Sergei Golovan * ifacetk/buttonbar.tcl: Fixed displaying vertical tabbar. Before that it might be wider than required and under certain conditions there was an infinite event loop. * ifacetk/iface.tcl: Color active tab foreground to highlight received messages when Tkabber has lost focus. 2007-04-18 Sergei Golovan * ifacetk/buttonbar.tcl, ifacetk/iface.tcl, ifacetk/systray.tcl, examples/xrdb/badlop-dark.xrdb, examples/xrdb/black.xrdb, examples/xrdb/dark.xrdb, examples/xrdb/dark2.xrdb, examples/xrdb/green.xrdb, examples/xrdb/ice.xrdb, examples/xrdb/light.xrdb, examples/xrdb/lighthouse.xrdb, examples/xrdb/teopetuk.xrdb, examples/xrdb/warm.xrdb: Merged changes from tkabber-tabbar branch. Changes introduce new user interface in tabbed mode. * plugins/general/session.tcl: Lowered priority of state loading procedure to make it work with colors in chat windows. 2007-04-15 Sergei Golovan * plugins/chat/logger.tcl: Fixed bug with converting chatlogs directory if its definition contains trailing slash. * doc/tkabber.xml, doc/tkabber.html, README: Fixed URL of Img extension project. 2007-04-13 Sergei Golovan * pixmaps/default-blue/docking/tkabber.ico, pixmaps/default-blue/docking/available-dnd.gif, pixmaps/default-blue/roster/available-dnd.gif, pixmaps/default-blue/icondef.xml: Changed DND icons in Default-blue theme (thanks to Artem Bannikov). 2007-04-12 Sergei Golovan * jabberlib-tclxml/jabberlib.tcl: Fixed bug with delayed delivery timestamps. * messages.tcl: Fixed jabber:x:data form processing. Before this fix Tkabber displayed not the form itself. * datagathering.tcl, muc.tcl: Returned cancel_command ardument to data::draw_window routine. Use it while configuring MUC rooms. * register.tcl, search.tcl: Manage focus using return value from data::fill_fields procedure. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * msgs/ru.msg: Updated Russian translation. * pixmaps/default/tkabber/gpg-signed.gif, pixmaps/default/tkabber/gpg-badsigned.gif, pixmaps/default/tkabber/gpg-unsigned.gif, pixmaps/default/tkabber/gpg-vsigned.gif: Updated (thanks to Artem Bannikov) * pixmaps/default/services/server.gif, pixmaps/default/icondef.xml: Added icon for jabber servers in service discovery windows (thanks to Artem Bannikov). * doc/tkabber.xml, doc/tkabber.html, README: Added few more lines to the release highlights. * doc/tkabber.xml, doc/tkabber.html, README: Fixed download URLs. * plugins/richtext/emoticons.tcl: Restored procedure ::emoteicons::load_dir, which loads emoticons set for compatibility with older Tkabber versions. * contrib/starkit/main.tcl: Require Tk package at script upper level. * doc/tkabber.xml, doc/tkabber.html, README: Added upgrade notes and extended release notes. * doc/tkabber.xml, doc/tkabber.html, README: Bumped stable version to 0.10.0. * *: 0.10.0 is released. * tkabber.tcl: Pushed version number to 0.10.0-svn. 2007-04-11 Sergei Golovan * jabberlib-tclxml/jabberlib.tcl: Added partial support of XEP-0203 (delayed delivery). * plugins/search/search.tcl: Fixed searching substrings and glob patterns. * messages.tcl: Ignore empty jabber:x:data form in messages. 2007-04-10 Sergei Golovan * messages.tcl, presence.tcl: Moved showing unsubscribed message dialog to messages.tcl and made several dialogs possible. 2007-04-09 Sergei Golovan * pixmaps/default/services/jud.gif, pixmaps/default/services/sms.gif: Updated (thanks to Artem Bannikov). * pixmaps/default/docking/tkabber.ico, pixmaps/default/docking-blue/tkabber.ico: Changed 32x32 icon from a bulb to a feather (thanks to Artem Bannikov). * ifacetk/iface.tcl: Fixed chat window/tab title updates when rendering a presence message. 2007-04-08 Sergei Golovan * plugins/chat/logger.tcl: Accept subdirs list when creating chatlog window to prevent extra directory tree scanning (thanks to Konstantin Khomoutov). * plugins/search/spanel.tcl: Removed checking for existence of search form. It should be done in search routines. Also added 'Stop' button and stop search callback (thanks to Konstantin Khomoutov). * plugins/chat/histool.tcl: Redone full-text search to use stop search callback and to avoid [update] calls. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * ifacetk/iroster.tcl: Changed default roster icon from empty to ordinary user icon. * msgs/uk.msg: Updated Ukrainian translation (thanks to Artem Bondarenko). * datagathering.tcl, plugins/chat/logger.tcl: Fixed switch statements (added missing --). * plugins/search/search.tcl, roster.tcl: Fixed regexp statements (added missing --). * datagathering.tcl: Added support for several values in list-multi and fixed data fields (thanks to Artem Borodin). * remote.tcl: Added ad-hoc wizards support to remote command scheduler (thanks to Artem Borodin). * xcommands.tcl: Uncommented draw_window calls to partially support ad-hoc wizards (thanks to Artem Borodin). * msgs/ru.msg: Updated Russian translation. 2007-04-02 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * plugins/roster/conferences.tcl: Fixed bug with autojoin when this attribute is set to 'true'. 2007-04-01 Sergei Golovan * contrib/starkit/README: Fixed double README. * privacy.tcl: Ensure conference list loading before any join room attempt is made. Without that it would be possible for conference list to become empty if there are autojoined conferences in bookmarks or if a user loads Tkabber's state on start. 2007-03-31 Sergei Golovan * contrib/starkit/main.tcl: Fixed usage of starkit::topdir variable, requre Tk package because Linux tclkit doesn't require it by default and forget zlib package to make it possible to use compressed XMPP streams (thanks to Konstantin Khomoutov, Sergey Yudin and Ruslan Rakhmanin). * contrib/starkit/README: Added README for those, who want to create Tkabber starkits (thanks to Konstantin Khomoutov, Sergey Yudin and Ruslan Rakhmanin). 2007-03-30 Sergei Golovan * splash.tcl, tkabber.tcl: Override bgerror even if splash screen is not used. Also, don't show the second error message if the previous one is shown. * plugins/chat/histool.tcl: Display chat log on in JID list tab. Also, don't export listbox selection. * messages.tcl: Fixed race condition when receiving several subscription requests. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2007-03-29 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2007-03-28 Sergei Golovan * muc.tcl: Fixed grid options in MUC lists editing windows. Also, added the possibilty of changing reasons without changing affiliation. * plugins/chat/histool.tcl: Added scrolling in logs tree using mousewheel. 2007-03-27 Sergei Golovan * plugins/windows/mousewheel.tcl, ifacetk/idefault.tcl: Moved scroll bindings outside from windows plugin. 2007-03-25 Sergei Golovan * muc.tcl: Process all errors in MUC presence. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2007-03-23 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2007-03-22 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2007-03-21 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * msgs/es.msg: Updated Spanish translation (thanks to Badlop). * plugins/general/avatars.tcl: Fixed avatars menu in case of non-tornoff menus (thanks to Roger Sondermann). 2007-03-18 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * msgs/ru.msg: Updated Russian translation. 2007-03-17 Sergei Golovan * tkabber.tcl: Fixed Tkabber rootdir definition for starkit. Added starkit initialization (thanks to Konstantin Khomoutov). * contrib/starkit/main.tcl: Added main.tcl starkit script (thanks to Konstantin Khomoutov). * jabberlib-tclxml/jlibdns.tcl: Fixed nameservers list if they are separated by commas in corresponding registry key in Windows (thanks to Irek Chmielowiec). * privacy.tcl, msgs/ru.msg, msgs/pl.msg, msgs/uk.msg, msgs/de.msg: Fixed typo. * msgs/es.msg: Updated Spanish translation (thanks to Badlop). 2007-03-14 Sergei Golovan * msgs/pl.msg: Updated Polish translation (thanks to Irek Chmielowiec). * plugins/search/spanel.tcl: Added checking for existence of search panel after the search is done. * plugins/chat/histool.tcl: Do not throw an error if the user breaks full-text search by closing chats history window. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2007-03-11 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * plugins/chat/histool.tcl: Optimized JID list sorting (thanks to Konstantin Khomoutov). 2007-03-10 Sergei Golovan * jabberlib-tclxml/jabberlib.tcl: Made -connection argument mandatory for send_iq. Call user callback even in case of disconnect. * disco.tcl, examples/tools/rssbot.tcl, filters.tcl, login.tcl, plugins/general/stats.tcl, plugins/roster/rosterx.tcl, plugins/si/ibb.tcl, plugins/si/iqibb.tcl, pubsub.tcl, userinfo.tcl: Added -connection argument to all jlib::send_iq calls, where it was missing. Fixed several bugs with backslash at the end of line. * privacy.tcl: Made error messageboxes appear only in case of errors (ignore disconnects). * jabberlib-tclxml/jabberlib.tcl: Added few extra checks if connection exists. * plugins/general/headlines.tcl: After removing a from headlines tree select the closest node to make keyboard traversal easier (thanks to Konstantin Khomoutov). * msgs/uk.msg: Updated Ukrainian translation (thanks to Artem Bondarenko). * plugins/windows/taskbar.tcl, plugins/unix/dockingtray.tcl, plugins/unix/systray.tcl, plugins/unix/tktray.tcl: Added extra checks for icon existence. * plugins/search/spanel.tcl: Added few new options to search panel (-allowclose, -twoway, -defaultdirection, thanks to Konstantin Khomoutov). * plugins/chat/logger.tcl, plugins/search/logger.tcl: Added possibility to open log window at a specific message by timestamp (thanks to Konstantin Khomoutov). * plugins/chat/histool.tcl: Added full-text search in all stored chatlogs (thanks to Konstantin Khomoutov). 2007-03-09 Sergei Golovan * ifacetk/iface.tcl, splash.tcl, tkabber.tcl: Withdraw main window at the very beginning because otherwise it's visible (and pretty ugly) during confid directory transfer. * userinfo.tcl: Fixed typo (destroying userinfo window didn't delete correspondent variabla trace). * userinfo.tcl: Rearranged controls on photo page because otherwise it isn't possible to replace large photos. * ifacetk/iface.tcl: Fixed profiling option ::enable_profiling. 2007-03-08 Sergei Golovan * presence.tcl, ifacetk/iroster.tcl: Show presence priority in roster contact tooltips. * presence.tcl, plugins/chat/histool.tcl, messages.tcl, ifacetk/iroster.tcl: Made messages, which are shown to user, more clear. * msgs/ru.msg: Updated Russian translation. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * config.tcl: Renamed to configdir.tcl. Name config.tcl confuses people. * tkabber.tcl: Use configdir.tcl instead of config.tcl. 2007-03-07 Sergei Golovan * muc.tcl, chats.tcl: Added new option ::muc::options(gen_muc_status_change_msgs) which allows to enable groupchat status messages separately from chat status messages. * roster.tcl, ifacetk/iroster.tcl: Added "My Resources" roster group, which contains own JID. * gpgme.tcl, plugins/chat/logger.tcl, plugins/roster/fetch_nicknames.tcl, plugins/roster/annotations.tcl, itemedit.tcl, messages.tcl: Fixed roster menu items if the JID, where the menu is popped up, doesn't belong to the roster. The bug appeared in "My Resources" and "Active chats" roster groups, and in chat windows menus. * plugins/general/jitworkaround.tcl: Fixed bug which appeared if subscribed presence from JIT comes before the roster item. * roster.tcl, ifacetk/iface.tcl, ifacetk/iroster.tcl: Renamed option for showing own resources in roster. Added menu item for quick change in this option. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * presence.tcl: Added custom presence menu to service contacts in roster. * messages.tcl: Added menu item for granting subscription (this helps if for some reason mutual subscription of two users is in inconsistent state). 2007-03-06 Sergei Golovan * chats.tcl: Fixed moving interface tabs by keyboard shortcuts and . * msgs/de.msg, trans/de.msg: Updated German translation (thanks to Roger Sondermann). * ifacetk/iface.tcl: Moved "Activate privacy lists at startup" higher in the menu item list. * privacy.tcl: Fixed bug with adding items to conference list, made all privacy lists updated in one transaction without packets in between. This makes changes in privacy lists taking significantly more time. Fixed Tkabber behavior in case if server doesn't support privacy lists (closes http://yo.jabber.ru/bugzilla/show_bug.cgi?id=333). * privacy.tcl: Set priority of initial privacy list activation on connect to the higher value to ensure it starts first. * pixmaps/default/icondef.xml: Added weather icons in addition to x-weather (closes http://yo.jabber.ru/bugzilla/show_bug.cgi?id=327). 2007-03-04 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * msgs/ru.msg: Updated Russian translation (thanks to Konstantin Khomoutov). * plugins/chat/abbrev.tcl: Made translated messages extractable by the extraction script. * plugins/chat/logger.tcl: Fixed bug with showing empty history. * plugins/search/*: Added unified search panel interface (thanks to Konstantin Khomoutov). Use this interface for searching in all Tkabber windows. * plugins/general/headlines.tcl: Moved search functions to plugins/search/headlines.tcl. * plugins/search/spanel.tcl: Fixed error message. * plugins/search/search.tcl: Added functions to search in listboxes (thanks to Konstantin Khomoutov). * plugins/chat/histool.tcl: Added Chats history tool plugin (thanks to Konstantiin Khomoutov). * doc/tkabber.xml, doc/tkabber.html, README: Added info about chats history tool. * Makefile: Removed reference to aniemoteicons directory. * *: 0.10.0-beta2 is released. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2007-03-03 Sergei Golovan * plugins/general/headlines.tcl: Bugfix. Removed trailing linefeed from subject to prevent its scrolling. * plugins/search/search.tcl: Bugfix. Fixed search panel entry background coloring after successful search. * pixmaps/default/icondef.xml, pixmaps/default/tkabber/*.gif: Replaced chat-bookmark and xaddress icons by new versions (thanks to Artem Bannikov). * pixmaps/stars/icondef.xml: Renamed chat-bookmark icons. * plugins/chat/popupmenu.tcl: Renamed chat-bookmark image name. * plugins/general/xaddress.tcl: Renamed xaddress/info image name. * plugins/general/remote.tcl: Allow action execute at the final ad-hoc command step. * plugins/chat/abbrev.tcl: Added new plugin, which allows to abbreviate words in chat input windows. expands abbreviations (thanks to Konstantin Khomoutov). * aniemoteicons/*, tkabber.tcl, plugins/richtext/emoticons.tcl: Converted aniemoticons to external plugin. 2007-03-02 Sergei Golovan * ifacetk/iface.tcl, privacy.tcl: Redone accepting messages from roster only to proagate to all connected resources. 2007-03-01 Sergei Golovan * doc/tkabber.xml: Added note about new privacy lists case. * gpgme.tcl: Fixed inconsistent behaviour when chat window icon indicated unencrypted state and in fact the messages were encrypted. 2007-02-28 Sergei Golovan * plugins/chat/logger.tcl: Don't strip resource from JID when showing chat log (if the user is in roster then resource is removed earlier, otherwise the resource is nesessary to get private chat log with conference users). Also, made possible showing a certain month log instead of the latest (thanks to Konstantin Khomoutov). * chats.tcl: Fixed Alt-Prior and Alt-Next binding in chat input windows. * ifacetk/iface.tcl: Don't count server messages in tab headers. * privacy.tcl, ifacetk/iface.tcl, muc.tcl: Added blocking all messages to/from users, which aren't in the roster. Also, added special privacy rule for conferences, to allow joining them even if they aren't in the roster. * privacy.tcl: Added own JID to privacy lists, making communication between own different resources possible even if messages from users, which aren't in the roster, are blocked. * msgs/ru.msg: Updated Russian translation. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2007-02-27 Sergei Golovan * plugins/general/remote.tcl, trans/pl.msg, trans/uk.msg, trans/ru.msg, trans/es.msg, trans/de.msg, msgs/es.msg, msgs/pl.msg, msgs/uk.msg, msgs/ru.msg, msgs/de.msg: Fixed user messages (thanks to Roger Sondermann). * muc.tcl: Fixed reason processing during editing (ban/member/admin/etc.) lists. 2007-02-26 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * pixmaps/default/tkabber/tkabber-logo.gif: Fixed edges of Tkabber logo. * pixmaps/default/docking/tkabber.ico, pixmaps/default-blue/docking/tkabber.ico: Changed icon colors to make them look acceptable on Windows 2000 (where tray icons use fixed 16-color palette). * pixmaps/default/docking/message-personal.gif: Minor change. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * trans/de.msg: Added German translation of error messages and forms (thanks to Roger Sondermann). 2007-02-25 Sergei Golovan * plugins/richtext/urls.tcl: Fixed bug with cursor restoring on leaving URL. * ifacetk/iface.tcl, userinfo.tcl: Removed trailing newline from URL one-line texts. This makes unneeded unbinding scrolling events. * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). 2007-02-24 Sergei Golovan * msgs/de.msg: Updated German translation (thanks to Roger Sondermann). * doc/tkabber.xml, doc/tkabber.html, README: Added some info on Tkabber look and feel. Aknowledged Artem Bannikov contribution to Tkabber's new look (thanks to Konstantin Khomoutov). 2007-02-23 Sergei Golovan * pixmaps/default/tkabber/tkabber-logo.gif: New (preliminary) Tkabber logo. * pixmaps/default/docking/tkabber.ico, pixmaps/default-blue/docking/tkabber.ico: New (preliminary) windows icons. * pixmaps/default/docking/message-personal.gif: Minor change. * splash.tcl: Changed position of Tkabber logo. * doc/tkabber.xml: Added renju plugin to changes list. * README, doc/tkabber.html: Updated. * *: 0.10.0-beta is released. * ifacetk/systray.tcl: Fixed bug with forgotten window geometry when hiding main window to system tray. * msgs/uk.msg: Updated (thanks to Artem Bondarenko). * plugins/richtext/highlight.tcl: Fixed bug with highlighting one-letter words. 2007-02-20 Sergei Golovan * plugins/chat/info_commands.tcl: Bugfix: send last, time and vaersion queries to full user's JID if it was not found in the roster. * default.tcl, login.tcl, msgs/ca.msg, msgs/de.msg, msgs/es.msg, msgs/eu.msg, msgs/fr.msg, msgs/nl.msg, msgs/pl.msg, msgs/pt.msg, msgs/ru.msg, msgs/uk.msg, search.tcl: Fixed typos in translatable messages. * plugins/unix/icon.tcl: Removed version check, since colored icons are supported not only in Tcl/Tk 8.5. 2007-02-18 Sergei Golovan * plugins/chat/postpone.tcl: Added new plugin, which allows to save input window content to a special buffer and restore it. Inspired by push-line and get-line zsh commands (thanks to Konstantin Khomoutov). 2007-02-17 Sergei Golovan * plugins/roster/fetch_nicknames.tcl: Bugfix. Don't try to fetch nickname if there aren't such item in the roster. 2007-02-16 Sergei Golovan * utils.tcl: Recent changes trigger unknown bug in Tcl/Tk from Debian sarge, so reverted them. 2007-02-14 Sergei Golovan * ifacetk/iface.tcl, userinfo.tcl: Unbound mousewheel bindings from one-line URL text widgets. Also, unbound <> and <> virtual events. * utils.tcl: Optimized procedures, which extract JID parts. Also fixed a bug in procedure, which returns JID node (thanks to Konstantin Khomoutov). * msgs/pl.msg: Updated Polish translation (thanks to Irek Chmielowiec). 2007-02-13 Sergei Golovan * msgs/es.msg: Updated Spanish translation (thanks to Badlop). * chats.tcl: Small fix for tclshat plugin. 2007-02-12 Sergei Golovan * plugins/windows/taskbar.tcl: Reverted the previous change. It needs more work. * pixmaps/default/services/aim*: Updated (thanks to Artem Bannikov). 2007-02-11 Sergei Golovan * pixmaps/default/tkabber/new-msg.gif, pixmaps/default/tkabber/search_bk.gif, pixmaps/default/tkabber/search_exact.gif, pixmaps/default/tkabber/search_case.gif, pixmaps/default/tkabber/search_fw.gif: Removed, as they are no longer used. * custom.tcl: Added saving customize tab during state saving. * jabberlib-tclxml/jabberlib.tcl: Added procedures, which return requested username, server and resource (before resource binding). They are used in saving sessions. * chats.tcl: Bind chat tabs to requested JIDs, and not to real ones (this helps if resource binding changes JID, as at gmail.com). * plugins/richtext/emoticons.tcl: Fixed (mitigated) bug with crash during emoticons menu constructing. * jabberlib-tclxml/jabberlib.tcl: Added jlib::x_delay command to calculate message time (and to workaround a bug with timestamp format in some unknown Jabber client). * plugins/chat/logger.tcl, plugins/chat/draw_timestamp.tcl, plugins/general/message_archive.tcl, plugins/general/headlines.tcl: Use jlib::x_delay command. * muc.tcl, plugins/chat/irc_commands.tcl: Always include element when joining a conference. Otherwise it becomes impossible to join a password-protected room with empty password. * plugins/general/rawxml.tcl: Save tab on exit and restore it on start. * plugins/general/session.tcl: Fixed order of restored tabs. * doc/tkabber.xml: Listed main changes in upcoming 0.10.0. * mclistbox-1.02, ckabber.tcl, tkabber.tcl: Renamed mclistbox-1.02 directory to mclistbox. * Makefile: Adapted to the current version. Separated installation of scripts and docs. * ifacetk/systray.tcl, plugins/windows/taskbar.tcl: Code cleanup, changed systray icon behaviour in Windows (doubleclick deiconifies Tkabber window). * plugins/richtext/stylecodes.tcl: Removed unnecessary variable reference. * plugins/richtext/emoticons.tcl, ifacetk/iface.tcl: Added emoticons quick showing and hiding. 2007-02-10 Sergei Golovan * pixmaps/default/services/aim*, pixmaps/default/services/gg*, pixmaps/default/services/mrim*, pixmaps/default/services/msn*, pixmaps/default/services/weather*, pixmaps/default/services/yahoo*: Updated (thanks to Artem Bannikov). * msgs/es.msg, msgs/pl.msg, msgs/ru.msg, msgs/uk.msg, pixmaps.tcl, plugins/richtext/emoticons.tcl: Replaced ~/.tkabber by actual config directory name. * pixmaps/default/roster/invisible.gif, pixmaps/default/docking/invisible.gif: Fixed. * plugins/chat/chatstate.tcl: Made workaround of the bug in JIT, which raise an error if chat state notification message is sent without a body. 2007-02-09 Sergei Golovan * messages.tcl: Launch browser on jabber:x:oob attachments, and do not start file transfer. * pixmaps.tcl: Made possible to add pixmap directories during startup. * plugins/unix/icon.tcl: Fixed window icons changes when pixmaps theme is changed. * pixmaps/default/*, pixmaps/default-blue/*: Added new default Tkabber pixmaps theme (unfinished yet) - big thanks to Artem Bannikov. * pixmaps/feather16/*: Renamed old default pixmaps theme. * pixmaps/stars/*: Added new Stars pixmaps theme (thanks to Serge Yudin). * ifacetk/iface.tcl: Added clickable URL to 'About' window, removed Tkabber logo from 'Quick help' window. * splash.tcl: Moved Tcl/Tk version up. * tkabber.tcl: Replace 'alpha' by 'SVN' in version label. * chats.tcl, plugins/iq/ping.tcl, plugins/chat/muc_ignore.tcl: Slightly changed message strings. * msgs/ru.msg: Updated. * pixmaps/default/services/icq*: Updated (thanks to Artem Bannikov). 2007-02-08 Sergei Golovan * examples/tools/jsend.tcl: Adapted to new jabberlib version. * examples/tools/rssbot.tcl: Adapted to new jabberlib version. * plugins/general/headlines.tcl: Fixed 'Read on...' URL processing (thanks to Konstantin Khomoutov). * plugins/chat/logger.tcl: Wrapped opening log files into cd call (workaround of a bug with very long file names in Windows). Added extra open file checks during log conversion. * plugins/general/headlines.tcl: Don't ignore headline messages with empty URL or subject. 2007-02-07 Sergei Golovan * plugins/si/socks5.tcl: Fixed bug with lowering case of JID. Resource case does not need to be lowered. * plugins/si/socks5.tcl: Fixed bug with error on logout if there are pending IQ requests to SOCKS5 capable proxy. * chats.tcl: Add informational message to chat window if it is a chat with groupchat user and she changes nickname (thanks to Konstantin Khomoutov). * chats.tcl, plugins/chat/draw_server_message.tcl, plugins/chat/log_on_open.tcl, plugins/chat/logger.tcl, plugins/chat/update_tab.tcl, plugins/general/sound.tcl: Replaced 'synthetic' JID in genersted messages by empty JID to make sure it cannot be a real JID (thanks to Konstantin Khomoutov). * plugins/richtext/urls.tcl: Fixed duplicate URL processing in case of nonstandard URL's (thanks to Konstantin Khomoutov). * plugins/filetransfer/si.tcl: Close SOCKS5 connection upon receiving announced number of bytes (helps to avoid infinite waiting if the other side does not close the socket). Also, fixed cancelling of incoming file transfer. 2007-02-01 Sergei Golovan * utils.tcl: Optiimized jid_to_tag (thanks to Konstantin Khomoutov). * gpgme.tcl: Added submenu, which allows to toggle traffic signing and encryption, to main menu. 2007-01-31 Sergei Golovan * plugins/unix/wmdock.tcl: Fixed bug with processing messages from chat history. * plugins/chat/update_tab.tcl: Don't update tab label color on messages from chat history. * plugins/general/headlines.tcl: Fixed subject background definition. 2007-01-30 Sergei Golovan * ifacetk/iface.tcl: Fixed description. * messages.tcl: Enabled sending normal message to groupchat users. * muc.tcl: Fixed sometimes duplicated MUC menu entries. * plugins/general/headlines.tcl: Added search in headlines. * msgs/uk.msg: Updated (thanks to Artem Bondarenko). * plugins/search/custom.tcl, custom.tcl: Added search in customize window. 2007-01-27 Sergei Golovan * datagathering.tcl: Made data form windows transient and made default window height smaller. * examples/xrdb/badlop-dark.xrdb, examples/xrdb/black.xrdb, examples/xrdb/dark.xrdb, examples/xrdb/dark2.xrdb, examples/xrdb/green.xrdb, examples/xrdb/ice.xrdb, examples/xrdb/light.xrdb, examples/xrdb/lighthouse.xrdb, examples/xrdb/teopetuk.xrdb, examples/xrdb/warm.xrdb: Added *readonlyBackground resource definition (it is used in MUC management). * jabberlib-tclxml/jabberlib.tcl: Fixed unsetting variable, which stores received IQ's id. * muc.tcl: Moved MUC room menu items to a submenu. Also, increased width of input entries in configuration forms. * plugins/chat/muc_ignore.tcl, plugins/iq/ping.tcl: Fixed user messages. * register.tcl: Made register form scrollable (see http://www.jabber.ru/bugzilla/show_bug.cgi?id=313). 2007-01-26 Sergei Golovan * jabberlib-tclxml/jabberlib.tcl: Added -timeout option to send_iq. * login.tcl: Removed unnecessary check whether "replace connections" is set. Added extra call to jlib::disconnect to client:reconnect procedure. * plugins/iq/ping.tcl: Implemented aggressive server ping with reconnection on ping timeout. * utils.tcl: Added function caller, which returns the name of upper level procedure or empty string if it is called at levels 0 or 1 (thanks to Konstantin Khomoutov). * custom.tcl: Use caller procedure from utils.tcl (thanks to Konstantin Khomoutov). * examples/configs/mtr-config.tcl, ifacetk/iface.tcl, plugins/chat/draw_error.tcl, plugins/chat/draw_info.tcl, plugins/chat/draw_normal_message.tcl, plugins/chat/draw_server_message.tcl, plugins/chat/draw_xhtml_message.tcl, plugins/chat/me_command.tcl, plugins/general/headlines.tcl, plugins/general/message_archive.tcl, plugins/general/rawxml.tcl, plugins/chat/update_tab.tcl: Moved most instances of tab_set_updated calls to ifacetk/iface.tcl and plugins/chat/update_tab.tcl. * ifacetk/iface.tcl, plugins/chat/draw_normal_message.tcl, plugins/chat/me_command.tcl, plugins/chat/update_tab.tcl, plugins/chat/muc_ignore.tcl: Added new plugin, which allows to ignore messages from given conference occupants. It is not finished yet, but usable. (Thanks to Konstantin Khomoutov.) 2007-01-22 Sergei Golovan * plugins/iq/ping.tcl: Added reply to XMPP ping (XEP-0199) support. * iq.tcl: Explicitly allowed ignoring requests. 2007-01-19 Sergei Golovan * plugins/roster/conferences.tcl: Do not autojoin already joined conference room (this might change nickname, if it's unusual). * utils.tcl: Added two functions: lmap and lfilter to apply function to list elements and to filter list using specified function. * chats.tcl, ifacetk/iface.tcl, ifacetk/iroster.tcl, muc.tcl, plugins/chat/chatstate.tcl, plugins/chat/events.tcl, plugins/chat/irc_commands.tcl, plugins/general/remote.tcl, plugins/roster/conferenceinfo.tcl, plugins/roster/conferences.tcl, presence.tcl: Code cleanup, removed almost all external references to internal variables in ::chat namespace. 2007-01-18 Sergei Golovan * muc.tcl: Fixed reporting own presences in MUC rooms. * chats.tcl, ifacetk/bwidget_workarounds.tcl, ifacetk/iface.tcl, plugins/general/headlines.tcl, plugins/general/message_archive.tcl, plugins/general/rawxml.tcl: Made a step toward using panedwindow from Tk 8.5 and newer. It is still buggy yet, so this feature is disabled for now. PanedWindow from BWidget is still used. 2007-01-17 Sergei Golovan * plugins/unix/icon.tcl: Added plugin, which sets Tkabber titlebar icons. It uses [wm iconphoto], so, it works with Tk 8.5 or newer. 2007-01-16 Sergei Golovan * plugins/chat/me_command.tcl, plugins/chat/nick_colors.tcl: Fixed bug with inserting nicknames to chat input windows on /me messages. * plugins/general/ispell.tcl: Some code cleanup, replaced option options(dictionary) by more general options(command_line) to allow any ispell/aspell options. Moved plugin to general directory because it works not only in UNIX (the only requirement is working ispell). * README, doc/tkabber.html, doc/tkabber.xml: Documented changes in ispell module. * plugins/chat/nick_colors.tcl: Fixed colored nicknames processing. 2007-01-15 Sergei Golovan * plugins/general/autoaway.tcl: Fixed bug with restoring status and status message on disconnect in autoaway state. 2007-01-14 Sergei Golovan * plugins/unix/ispell.tcl: Changed option, which enables ispell to plugins::ispell::options(enable). Enabled changing ispell path, dictionary, its encoding on the fly. * README, doc/tkabber.html, doc/tkabber.xml: Documented changes in ispell module. 2007-01-13 Sergei Golovan * custom.tcl: Raise customize tab on Tkabber->Customize if it is already opened (thanks to Pavel Borzenkov). Save page offsets in the history (not very accurately because ScrolledWindow changes window width). * muc.tcl: Replaced labels by entries in owner/admin/moderator/etc. list editing form. * plugins/general/copy_jid.tcl: Added "Copy JID to clipboard" menu item to roster, chat, groupchat, message, search menus. * splash.tcl, plugins/iq/version.tcl, tkabber.tcl, ifaceck/iface.tcl, ckabber.tcl, ifacetk/iface.tcl: Changed version variable to tkabber_version. 2007-01-11 Sergei Golovan * plugins/richtext/urls.tcl: Fixed proc, which adds leading http:// and ftp:// prefix to URL. 2007-01-08 Sergei Golovan * plugins/general/tkcon.tcl: Adapted to use tkcon as a Tcl package. 2007-01-06 Sergei Golovan * README, doc/tkabber.xtml, doc/tkabber.xml: Documented changes in the config directory for different operating systems. Replaced ~/.tkabber by $::configdir in docs. Documented searching in Tkabber windows. Documented hook roster_group_popup_menu_hook (thanks to Konstantin Khomoutov). 2007-01-05 Sergei Golovan * plugins/general/autoaway.tcl, plugins/iq/last.tcl: Added support of [tk inactive], which works in Tk 8.5. * ifacetk/iface.tcl: Added window path to map_window_hook call. * ifacetk/iface.tcl, splash.tcl, tkabber.tcl: Added Tcl/Tk version to About and splash windows. Added description of a vew more commands to Quick help window (thanks to Konstantin Khomoutov). * config.tcl, tkabber.tcl: Changed config directory in Windows and MacOS. Also, Tkabber now honors TKABBER_HOME environment variable (thanks to Konstantin Khomoutov). * msgs/pl.msg: Updated (thanks to Irek Chmielowiec). * plugins/general/tkcon.tcl: Moved Tkcon menu item to Help submenu. * ifacetk/iface.tcl, gpgme.tcl: Removed path argument from ifacetk::set_toolbar_icon and ifacetk::set_toolbar_icon procedures. ifacetk::set_toolbar_icon now returns current icon index, which can be used in ifacetk::set_toolbar_icon. 2007-01-02 Sergei Golovan * userinfo.tcl, chats.tcl: Added empty item to comboboxes in show userinfo and open chat dialogs. * msgs/ru.msg: Added VIM modeline. 2007-01-01 Sergei Golovan * msgs/ru.msg: Updated. * README, doc/tkabber.html, doc/tkabber.xml, ifaceck/iface.tcl, ifacetk/iface.tcl, splash.tcl: Copyright updated. 2006-12-31 Sergei Golovan * jabberlib-tclxml/jabberlib.tcl, login.tcl: Fixed IDNA domains support. 2006-12-30 Sergei Golovan * msgs/es.msg: Updated (thanks to Badlop). * msgs/uk.msg: Updated (thanks to Artem Bondarenko). * trans/es.msg: Added Spanish translation of remote messages and errors (thanks to Badlop). * plugins/general/remote.tcl, trans/pl.msg, trans/ru.msg, trans/uk.msg: Fixed typo in text message (thanks to Badlop). 2006-12-29 Sergei Golovan * browser.tcl, disco.tcl: Bugfix in destroying state variables after browser/disco window is closed (thanks to Konstantin Khomoutov). * ifacetk/iroster.tcl: Added new hook roster_group_popup_menu_hook which is called on popping up group menu in main roster (thanks to Konstantin Khomoutov). * msgs/pl.msg: Updated (thanks to Irek Chmielowiec). * msgs/uk.msg: Updated (thanks to Artem Bondarenko). 2006-12-26 Sergei Golovan * plugins/chat/logger.tcl: Changed log directory structure and made log file format more rliable. Since that the first Tkabber run converts log files to new format. This conversion may take long time, so it shows a dialog window with the conversion progress during the conversion. * plugins/chat/logger.tcl: Shortened filenames of log files. * ckabber.tcl, custom.tcl, ifaceck/iroster.tcl, pixmaps.tcl, plugins/chat/logger.tcl, plugins/chat/nick_colors.tcl, plugins/general/headlines.tcl, plugins/general/message_archive.tcl, plugins/general/session.tcl, plugins/richtext/emoticons.tcl, roster.tcl splash.tcl tkabber.tcl: Introduced variable ::configdir, which is set to normalized name of ~/.tkabber. This should help with file operations in Windows. * plugins/chat/logger.tcl, plugins/general/message_archive.tcl: Specially process message_archive when converting logs. Changed message archive file format to make it more reliable. 2006-12-25 Sergei Golovan * plugins/general/session.tcl: Renamed session to state (only in user messages yet). Added menu for controlling save/load state options. * plugins/chat/logger.tcl: Added new conversion scheme between JIDs and log filenames. Added procedure, which converts old log directory structure to a new one. New log directory structure is not used yet, it's only for testing. 2006-12-24 Sergei Golovan * ifacetk/idefault.tcl, ifacetk/iface.tcl: Use named font instead of XLFD when XFT fonts rendering is used. * jabberlib-tclxml/jabberlib.tcl: Added connection_resource function. * joingrdialog.tcl: Removed two useless debug messages. * plugins/general/session.tcl: Added preliminary session support. Now it is possible to save some tabs at Tkabber exit and restore them on Tkabber start. * chats.tcl, plugins/general/headlines.tcl: Added functions which save chats and headlines during Tkabber exit. Separated opening headlines window from putting messages to it. * chats.tcl, ifacetk/iface.tcl, msgs/ru.msg, muc.tcl, plugins/chat/draw_server_message.tcl, presence.tcl, roster.tcl: Added chat messages on changing user status. These messages are off by default. Renamed option muc::options(gen_event) to more meaninful name muc::options(gen_enter_exit_msgs). 2006-12-22 Sergei Golovan * plugins/roster/fetch_nicknames.tcl: Added plugin, which automatically fetches user nickname from his/her vCard and makes it roster label. For services (e.g. ICQ-transport) it fetches nicknames for all service users. * plugins/roster/fetch_nicknames.tcl: Bugfix (thanks to Irek Chmielowiec). 2006-12-16 Sergei Golovan * msgs/ru.msg: Bugfix. 2006-12-15 Sergei Golovan * plugins.tcl: Worked around the bug in Tcl 8.3 when [glob -type d] doesn't return symbolic links to directories. 2006-12-10 Sergei Golovan * plugins/unix/menu8.4.tcl: Use this plugin with menu workaround in Tcl/Tk 8.5 also. * plugins/richtext/emoticons.tcl: Fixed tooltip behaviour over emoticons menu. 2006-12-06 Sergei Golovan * ifacetk/iface.tcl: Close tab with middle button click on the tab header. 2006-12-05 Sergei Golovan * gpgme.tcl: Fixed bug with incorrect call of signed:Label. * plugins/si/ibb.tcl: Return error message to file sender in case of error during file transaction. 2006-12-03 Sergei Golovan * plugins/si/socks5.tcl: Fixed SHA1 hash computing for SOCKS5 bytestreams support. * disco.tcl, utils.tcl, plugins/si/socks5.tcl: Introduced new function my_jid, which is suitable to get JID for including to requests and responses (for conference recipients it returns conference JID, for other recipients it returns real JID). Use this new function when replying disco queries and when sending files. 2006-12-02 Sergei Golovan * plugins/richtext/highlight.tcl: Enable highlighting by default. * browser.tcl, chats.tcl, disco.tcl, ifacetk/iface.tcl, ifacetk/iroster.tcl, joingrdialog.tcl, login.tcl, messages.tcl, plugins/general/headlines.tcl, plugins/roster/cache_categories.tcl, presence.tcl, userinfo.tcl: Removed explicit storing of customized variables because they are stored automatically. 2006-11-29 Sergei Golovan * plugins/richtext/highlight.tcl: Fixed initializing plugin state. * plugins/richtext/urls.tcl: Changed the way of storing URLs in text widget. Instead of hiding them in text, add them to tag list. * plugins/richtext/stylecodes.tcl, plugins/richtext/emoticons.tcl: Swapped priorities to make emoticons pluging move first (thanks to Konstantin Khomoutov). * plugins/richtext/chatlog.tcl, plugins/richtext/highlight.tcl: Replaced chatlog for highlight richtext entity in chatlog.tcl because two plugins defined highlight entity (thanks to Konstantin Khomoutov). 2006-11-27 Sergei Golovan * chats.tcl: Fixed error messages processing. * msgs/pl.msg, trans/pl.msg: Updated (thanks to Irek Chmielowiec). 2006-11-26 Sergei Golovan * contrib/extract-translations/extract.tcl: Fixed bug with multiline string processing. * filetransfer.tcl: Lessened file transfer dialog dimentions. * msgs/ru.msg, trans/ru.msg: Updated. 2006-11-25 Sergei Golovan * privacy.tcl: Disabled privasy rules menu item for chats with groupchats users. Privacy rules aren't intended to work with groupchats. * plugins/richtext/emoticons.tcl, pixmaps.tcl: Added dots at the end of sentences. * msgs/ru.msg: Added several translated messages (thanks to Pavel Borzenkov). 2006-11-24 Sergei Golovan * plugins/unix/ispell.tcl: Added processing of nonletter keys, which was broken after input methods were fixed 2006-10-11. * plugins/richtext/urls.tcl: Add URL prefixes ftp:// or http:// to URLs without them. * custom.tcl: Do not store loginconf automatically. * contrib/extract-translations/extract.tcl: Changed the only defined variable when checking for variables in strings to less common name. Added hidden key -showvars to show all strings with embedded variables. * jabberlib-tclxml/stanzaerror.tcl: Added extra braces to eval arguments to fix the hypothetical case of error type and condition with spaces. * plugins/filetransfer/http.tcl, plugins/filetransfer/jidlink.tcl, plugins/filetransfer/si.tcl, si.tcl: Added translations of error messages, sent to the peer. * plugins/richtext/emoticons.tcl: Removed list search options, which aren't in Tcl 8.3. 2006-11-23 Sergei Golovan * contrib/extract-translations/extract.tcl: Added search of ::trans messages. * trans.tcl: Added one-argument ::trans::trans (only to allow searching messages, which are not to be translated immediately). * muc.tcl, plugins/general/remote.tcl: Added ::trans::trans calls, which help to search translatable messages. * jabberlib-tclxml/jabberlib.tcl: Made get_lang routine working in Tcl/Tk 8.5 (thanks to Irek Chmielowiec). * msgs/uk.msg, trans/uk.msg: Updated Ukrainian translation (thanks to Artem Bondarenko). 2006-11-22 Sergei Golovan * plugins/iq/version.tcl: Fixed bug with reporting empty string for Linux distribution (thanks to Pavel Borzenkov). 2006-11-20 Sergei Golovan * plugins/chat/info_commands.tcl: Fixed bug with asking info in groupchats. When name was not specified, /version, /time, /last, /vcard sent IQ to an occupant with the highest priority and not to the room itself. 2006-11-19 Sergei Golovan * plugins/richtext/urls.tcl: Changed balloon behaviour to be consistent with other balloons. * plugins/roster/conferences.tcl: Made conference group name translateable (thanks to Irek Chmielowiec). * custom.tcl, plugins/general/rawxml.tcl: Removed menu tearoffs (thanks to Irek Chmielowiec). * plugins/richtext/emoticons.tcl: Removed txtlabels variable and made taking label names (ballon tips) from txtdefaults (thanks to Irek Chmielowiec). * gpgme.tcl: Added option to suppress warnings on signature verification failures (thanks to Antoni Grzymala). * plugins/iq/version.tcl: Use lsb_release to guess Linux distribution (this allows to distinguish Ubuntu from Debian, for example). (Thanks to Konstantin Khomoutov.) 2006-11-15 Sergei Golovan * userinfo.tcl: Bugfix. Add script to event, not override existing. * chats.tcl: Removed unused URL regexp (thanks to Konstantin Khomoutov). * richtext.tcl, plugins/richtext/urls.tcl: Added URLs with label, which differs from URL itself (thanks to Konstantin Khomoutov). * plugins/general/headlines.tcl: Replaced link text by a neutral message (the URL is showed in a tooltip) (thanks to Konstantin Khomoutov). * utils.tcl: Moved some useful functions from richtext.tcl (thanks to Konstantin Khomoutov). 2006-11-12 Sergei Golovan * INSTALL: Corrected link to README. * Makefile: Fixed installing docs, emoticons, and translations. * chats.tcl, messages.tcl, plugins/chat/draw_info.tcl, plugins/chat/draw_server_message.tcl, plugins/chat/draw_xhtml_message.tcl, plugins/chat/me_command.tcl, plugins/general/headlines.tcl, plugins/general/message_archive.tcl, richtext.tcl: Replaced chat::add_emoteiconed_text by richtext::render_message, removed highlightlist arg from richtext::render_message. * plugins/richtext/chatlog.tcl, plugins/richtext/emoticons.tcl, plugins/richtext/highlight.tcl, plugins/richtext/stylecodes.tcl, plugins/richtext/urls.tcl, richtext.tcl: Code cleanup. * chats.tcl, plugins/richtext/urls.tcl: Moved adding 'Copy URL' menu item to the appropriate plugin. 2006-11-10 Sergei Golovan * ifacetk/iroster.tcl: Bugfix (thanks to Irek Chmielowiec). * ifacetk/iface.tcl: Added two hooks: got_focus_hook and lost_focus_hook (thanks to Pavel Borzenkov). * plugins/richtext/emoticons.tcl: Added 'sweep' command, which removes all unused emoticons from the memory. Fixed loading emoticons at Tkabber start (thanks to Konstantin Khomoutov). * ifacetk/idefault.tcl: Moved workaround for calling emoticons menu using Alt-e in nonenglish keyboard layout to plugins/richtext/emoticons.tcl. * richtext.tcl, plugins/richtext/highlight.tcl, plugins/chat/draw_normal_message.tcl, plugins/richtext/urls.tcl: Moved highlight plugin to richtext plugins, changed priority of URL parsing plugin to higher value (thanks to Konstantin Khomoutov). * utils.tcl, plugins/richtext/highlight.tcl: Added new hook check_personal_message_hook and made using it in highlight plugin. Changed syntax of check_message. * ifacetk/iface.tcl, plugins/chat/bookmark_highlighted.tcl, plugins/chat/complete_last_nick.tcl, plugins/chat/draw_normal_message.tcl, plugins/chat/me_command.tcl, plugins/general/sound.tcl: Adapted calls of check_message to new syntax. 2006-11-06 Sergei Golovan * msgs/pl.msg, trans/pl.msg: Updated (thanks to Irek Chmielowiec). * plugins/richtext/emoticons.tcl: Renamed merge_dir command to load_dir (restored nondestructive behaviour of load_dir). Added clean command, which destroys all loaded emoticons. 2006-11-05 Sergei Golovan * README, doc/tkabber.html, doc/tkabber.xml: Fixed default emoticons directory name. 2006-11-04 Sergei Golovan * README, doc/tkabber.html, doc/tkabber.xml, richtext.tcl, examples/configs/badlop-config.tcl, examples/configs/config.tcl, examples/configs/mtr-config.tcl, examples/configs/teo-config.tcl: Changed emoticons interface in docs and examples. * filetransfer.tcl, plugins/filetransfer/http.tcl, plugins/filetransfer/jidlink.tcl, plugins/filetransfer/si.tcl: Moved send file user interface to filetransfer.tcl (unfinished yet). * plugins/richtext/emoticons.tcl, plugins/richtext/stylecodes.tcl, plugins/richtext/urls.tcl: Removed 'enable' options, added all customize groups to Chat group. Changed emoticons theme definition: now options(theme) should be set to the name of theme directory. Theme names are used only for labels in customize option menu. * plugins/richtext/emoticons.tcl: Fixed processing of 'None' emoticon theme (theme with no images at all). * plugins/richtext/urls.tcl, chats.tcl: Fixed URL highlighting when mouse pointer is over the URL (thanks to Konstantin Khomoutov). * filetransfer.tcl, plugins/filetransfer/si.tcl: Fixed bug with 'stream id is in use' after choosing a file, which cannot be written. Show error messages in the main file transfer windows, not in separate message boxes. Inserted several checks of transfer window existense (helps when the other side reply is received after closing the window). * plugins/richtext/emoticons.tcl: Fixed escaping regexp metacharacters. Also fixed emoticons::add procedure. 2006-11-03 Sergei Golovan * plugins/richtext/urls.tcl: Fixed URL regular expression. * richtext.tcl: Wrapper around text widget, which allows to use customizable message render plugins (thanks to Konstantin Khomoutov). * plugins/richtext/chatlog.tcl, plugins/richtext/emoticons.tcl, plugins/richtext/stylecodes.tcl, plugins/richtext/urls.tcl: Plugins with basic colored messages, emoticons (now configurable via GUI), stylecodes and URL handling support (thanks to Konstantin Khomoutov). * custom.tcl: Added new configvar function, which allowes changing config variable options on the fly (thanks to Konstantin Khomoutov). * aniemoteicons/aniemoteicons.tcl, chats.tcl, ifacetk/iface.tcl, messages.tcl, plugins/chat/draw_xhtml_message.tcl, plugins/general/headlines.tcl, plugins/general/message_archive.tcl, tkabber.tcl, userinfo.tcl: Use richtext for text widgets with highlighting support (thanks to Konstantin Khomoutov). * emoticons-tkabber/*: Moved to emoticons/default/ (thanks to Konstantin Khomoutov). * examples/configs/badlop-config.tcl, examples/configs/badlop-config-home.tcl: Fixed paths of sourced scripts. * ifacetk/iroster.tcl: Added support of checkbuttons in roster popup menu. 2006-10-27 Sergei Golovan * plugins/chat/irc_commands.tcl: Fixed bug with joining conference room from private chat window/tab. * plugins/chat/logger.tcl: Do not try to open log files when they do not exist. 2006-10-25 Sergei Golovan * jabberlib-tclxml/jlibsasl.tcl: Worked around bug 1545306 in tcllib SASL module. See http://sourceforge.net/tracker/index.php?func=detail&aid=1545306&group_id=12883&atid=112883 2006-10-24 Sergei Golovan * tkabber.tcl: Stepped required jabberlib version. * utils.tcl: Added extra rguments to Spinbox command. * plugins/general/stats.tcl: Use 'Set' button relief to show whether statistical parameter is requested periodically. 2006-10-22 Sergei Golovan * msgs/uk.msg, msgs/uk.rc: Updated Ukrainian translation (thanks to Artem Bondarenko). 2006-10-21 Sergei Golovan * pixmaps/default/icondef.xml, pixmaps/default/tkabber/gpg-vsigned.gif: Added image for signature which is not at least marginally trusted or which signer's JID does not belong to key UIDs. * gpgme.tcl: Added extra signature validity check and made drawing special icon when the signature seems to be suspicious. Don't check signature if message encryption fails. * msgs/ru.rc: Removed accelerators from labels in Font and Password dialogs. They cause runtime errors. 2006-10-20 Sergei Golovan * chats.tcl: Added new hook rewrite_message_hook. It is run before process_message_hook and allows to change message variables. Removed normalize_chatid_hook. * examples/configs/mtr-config.tcl: Use rewrite_message_hook instead of normalize_chatid_hook. * pixmaps/default/icondef.xml, pixmaps/default/tkabber/gpg-badencrypted.gif: Added image for message which cannot be deciphered. * gpgme.tcl: Use rewrite_message_hook to decrypt message bodies. Draw icon from gpg-badencrypted.gif when message cannot be deciphered. Draw it even if no GPG support at all to make messages more clear. Some code cleanup. 2006-10-15 Sergei Golovan * ifacetk/iface.tcl: Restored "Activate lists at startup" menu item for privacy lists. Since it is autosaved when switched it makes sense to use it again. * custom.tcl: Fixed sorting subgroups. 2006-10-14 Sergei Golovan * messages.tcl: Use threads for normal messages (they aren't stored in message archive yet). Also use different variables for choosing connection for different message windows. * muc.tcl: Added Node name for 'Current rooms' node. 2006-10-13 Sergei Golovan * ifacetk/iface.tcl: Bugfix. 2006-10-12 Sergei Golovan * plugins/chat/log_on_open.tcl: Changed default values for maximum message numbers to 20 and for time interval to 24 hours. 2006-10-11 Sergei Golovan * msgs/pl.msg: Updated (thanks to Irek Chmielowiec). * plugins/general/autoaway.tcl: Change text status when go to autoaway only if it's set to nonempty string (thanks to Irek Chmielowiec). * plugins/general/subscribe_gateway.tcl: Translated subscribe message similar to messages.tcl (thanks to Irek Chmielowiec). * plugins/general/xaddress.tcl: Set extended address label background in chat windows and in message windows to the background of parent element (thanks to Irek Chmielowiec). * jabberlib-tclxml/jlibsasl.tcl: Added support of X-GOOGLE-TOKEN authentication mechanism, which implemented in tcllib 1.9 SASL module. * utils.tcl: Added another workaround for XIM input. * plugins/unix/ispell.tcl: Use workaround from utils.tcl. Redesigned ispell plugin to work not only in chat windows. Reassigned two resources from Chat to Text class. * examples/xrdb/*: Reassigned two resources from Chat to Text class. * plugins/chat/completion.tcl: Bugfix, check if window with tab completion exists. * datagathering.tcl, messages.tcl, plugins/filetransfer/http.tcl, plugins/filetransfer/jidlink.tcl, plugins/filetransfer/si.tcl, plugins/general/message_archive.tcl, plugins/general/subscribe_gateway.tcl, userinfo.tcl: Use wrapper textUndoable which enables undo mechanism and initialises spellchecker for the text window. 2006-10-10 Sergei Golovan * plugins/chat/completion.tcl: Made workaround for XIM in chat input windows. Instead of binding %A to any key and query if the symbol is empty (which does not work if XIM is used because of known bug in Tk) Tkabber compares two indices, before and after keypress, and if they are the same then the symbol is thought as empty. 2006-10-09 Sergei Golovan * ifacetk/iface.tcl: Don't add message to tab or window title when it is from chat log and is shown by plugins/chat/log_on_open.tcl. * Makefile, chats.tcl, messages.tcl, splash.tcl, tkabber.tcl, textundo/dkflib.tcl, textundo/textundo.tcl, utils.tcl: Removed usage of textundo package. It leaves undeleted variables after destroying widget and text widget in Tcl/Tk 8.4 supports own undo mechanism. So, no undo when using Tcl/Tk 8.3 from now. * *: Replaced obsolete JEP (Jabber Enhancement Proposal) abbreviation by XEP (XMPP Extension Proposal) through all of the sources. 2006-10-08 Sergei Golovan * custom.tcl: Fixed duplicate parent groups (thanks to Pavel Borzenkov). * plugins/chat/log_on_open.tcl, plugins/chat/logger.tcl, plugins/general/sound.tcl: Added new plugin, which shows several last logged messages in newly opened chat (not groupchat) windows. Added jid attribute to log messages, changed timestamps to GMT (so, existing log messages show incorrect timestamps now). 2006-10-07 Sergei Golovan * custom.tcl: Autosave customized variable if it has been set from outside ::custom namespace. It should improve usability. * disco.tcl: Added connection ID to all disco operations. * disco.tcl, joingrdialog.tcl, messages.tcl, plugins/roster/conferences.tcl: Added new hook disco_node_menu_hook for popup menues in disco window. Moved join conference, add conference to roster, send message menu items to the hook. * plugins/chat/info_commands.tcl: Added roster item completion to /time, /last, /vcard, and /version commands. Made ::msgcat::mc handle substitutions in strings. 2006-10-05 Sergei Golovan * plugins/general/headlines.tcl, trans.tcl: Removed temporary changes of system encoding because it does not allow to install Tkabber to a directory, which name contains nonenglish characters. * ckabber.tcl, tkabber.tcl: Removed temporary changes of system encoding since [msgcat::mcload] and [option readfile] themselves use UTF-8. 2006-10-02 Sergei Golovan * plugins/general/headlines.tcl: Added option, which allows not to show balloons over hedlines tree. * chats.tcl, muc.tcl: Update chat window last message timestamp only in connected state. It fixes the situation when not all room history is requested when one client replaces another one with the same resource. 2006-10-01 Sergei Golovan * balloon.tcl: Made workaround for a bug when balloon shows up in wrong screen if multiple monitor configuration is used in Windows (thanks to Pat Thoyts). * pubsub.tcl: Made pubsub implementation closer to JEP-0060 v. 1.9. (It is still untested and unusable though.) * tkabber.tcl: Source pubsub.tcl. * browser.tcl, disco.tcl, ifacetk/iroster.tcl, ifacetk/iface.tcl, messages.tcl, privacy.tcl: Added connection ID to drag'n'drop JID data. * ifacetk/iroster.tcl: Added configurable drag'n'drop commands to roster::create. * chats.tcl: Added invitation to the conference when the user is dragged'n'dropped from the main roster to the room roster. 2006-09-30 Sergei Golovan * balloon.tcl: Added function balloon::setup, which is useful for registering common balloons with static or dynamic texts. Slightly changed syntax of balloon::default_balloon procedure. Destroy balloon when mouse moves over it (workaround for sometimes freezing balloons). * emoticons.tcl: Used new syntax of balloon::default_balloon. * browser.tcl, disco.tcl, ifacetk/systray.tcl, messages.tcl, plugins/general/headlines.tcl, plugins/unix/dockingtray.tcl, plugins/unix/systray.tcl, plugins/unix/tktray.tcl, plugins/unix/wmdock.tcl, utils.tcl, chats.tcl: Switched to balloon::setup when defining balloons. * roster.tcl: Strictened check whether removing JID is our server JID (to make sure that if it's in the roster then removing it doesn't unregister account). 2006-09-29 Sergei Golovan * custom.tcl: Added new variable type 'options'. GUI for this type is options menu. * utils.tcl: Workarounded fixed borderwidth of tk_optionMenu widget. * filters.tcl: Use workaround from utils.tcl. * ifacetk/iface.tcl, login.tcl, pixmaps.tcl, plugins/general/headlines.tcl, plugins/search/search.tcl: Replaced almost all customizeable radio variables by options variables. * chats.tcl: Small fix for URL regexp. * msgs/pl.msg: Updated (thanks to Irek Chmielowiec). 2006-09-26 Sergei Golovan * plugins/general/sound.tcl: Made sound::play loading sound file if it's not loaded yet if snack library is used (thanks to Pavel Borzenkov). 2006-09-25 Sergei Golovan * msgs/es.msg: Updated (thanks to Badlop). * disco.tcl, plugins/chat/logger.tcl: Fixed typo. * ifacetk/iface.tcl, userinfo.tcl: Replaced menu entry 'Show user info...' by 'Show user or service info...' which is more correct. * msgs/ru.msg: Updated. * emoticons.tcl: Added support of emoticons in formats other than GIF (thanks to Irek Chmielowiec). * messages.tcl: Made subscription request translateable (thanks to Irek Chmielowiec). * msgs/pl.msg, trans/msg.pl: Updated (thanks to Irek Chmielowiec). * messages.tcl: Remove item from the roster when user presses 'Unsubscribe' button in subscription window. Otherwise roster gradually becomes full of users with subscription 'none'. * roster.tcl: Fixed typo. * plugins/filetransfer/http.tcl: Added two options: advertised host and port for file transfer. They are useful for tranferring files through NAT via forwarded port (thanks to Antoni Grzymala). * plugins/iq/version.tcl: Guess Windows version. * plugins/general/remote.tcl: Moved remote control functions (leave groupchats, forward messages, change status) to separate namespaces. Moved session variables to a separate namespace, index sessions by connection ID, JID, node and session ID. Do not close session immediately if the error type is 'modify' (thanks to Artem Borodin). 2006-09-24 Sergei Golovan * filetransfer/si.tcl: Do not use progressbar if file size is zero (thanks to Konstantin Khomoutov). * si/socks5.tcl: Removed forgotten debug code. * msgs/en.msg: Removed English message file since all messages are in English by default. * msgs/ru.msg: Updated. * ifaceck/iface.tcl, ifacetk/iface.tcl, splash.tcl, doc/tkabber.xml, doc/tkabber.html: Changed Tkabber home page. * ifacetk/iface.tcl: In UNIX WM_SAVE_YOURSELF can be called several times. So, call quit only on windows, where WM_SAVE_YOURSELF means end of windows session. Also trap SIGTERM (call quit) when Tclx is available (thanks to Konstantin Khomoutov). * disco.tcl, plugins/general/xcommands.tcl: Show a special item for some (registered) features even if the remote service has not provided it. Especially, always show http://jabber.org/protocol/commands node if there is a corresponding feature. It helps for example to control Psi client remotely. 2006-09-23 Sergei Golovan * plugins/filetransfer/si.tcl, plugins/si/ibb.tcl, plugins/si/iqibb.tcl, plugins/si/socks5.tcl, si.tcl: Index bytestreams by direction (in, out), connection ID, JID, and SID instead of SID only. * plugins/si/socks5.tcl: Added mediated SOCKS5 connection support. 2006-09-21 Sergei Golovan * plugins/filetransfer/si.tcl, plugins/si/ibb.tcl, plugins/si/iqibb.tcl, plugins/si/socks5.tcl, si.tcl: Slightly redesigned filetransfer via SI (JEP-0095, JEP-0065, JEP-0047). Replaced all unnecessary vwaits by callbacks. Added new (undocumented yet) IQ-based IBB transport. Made IBB transport usable (now it does not throw all data immediately). * filetransfer.tcl, plugins/filetransfer/si.tcl: Use errors returned when file is being opened instead of simple file exisence check (thanks to Konstantin Khomoutov). * jabberlib-tclxml/jabberlib.tcl: Added jlib::socket_ip function. * userinfo.tcl: Made all userinfo fields flat. 2006-09-20 Sergei Golovan * datagathering.tcl, disco.tcl: Added processing and using of multiple values in jabber:x:data forms (thanks to Artem Borodin). * plugins/general/remote.tcl: A few bugfixes (thanks to Artem Borodin). * pubsub.tcl: Started implementing Publish-Subscribe (JEP-0060). 2006-09-18 Sergei Golovan * disco.tcl, examples/tools/jsend.tcl, examples/tools/rssbot.tcl, iq.tcl, jabberlib-tclxml/jabberlib.tcl, jidlink.tcl, muc.tcl, negotiate.tcl, plugins/filetransfer/http.tcl, plugins/filetransfer/jidlink.tcl, plugins/general/avatars.tcl, plugins/general/remote.tcl, plugins/iq/browse.tcl, plugins/iq/last.tcl, plugins/iq/time.tcl, plugins/iq/version.tcl, plugins/jidlink/dtcp.tcl, plugins/jidlink/ibb.tcl, plugins/si/ibb.tcl, plugins/si/socks5.tcl, privacy.tcl, si.tcl, tkabber.tcl, trans.tcl, trans/ru.msg: Added xml:lang support in incoming IQ queries. It allows to answer these queries using remote user's locale. Since msgcat is not designed to handle translation to many languages in parallel and it's not very wise to load all translations in msgs/ together new trans.tcl module and new translation files in trans/ subdirectory are added. They currently contain only translations for messages from remote control plugin, so they are relatively short. * plugins/general/remote.tcl: Corrected a few typos in the displayed messages. * jabberlib-tclxml/jabberlib.tcl: Removed useless -sendto option of jlib::create. 2006-09-17 Sergei Golovan * plugins/iq/version.tcl: Added code for reporting Arch Linux version (thanks to Pavel Borzenkov). * datagathering.tcl: Added server-side x:data processing routine which creates x:data field tag (thanks to Artem Borodin). * disco.tcl: Added subnodes registering (second level nodes only, thanks to Artem Borodin). * plugins/general/xaddress.tcl, pixmaps/default/icondef.xml, pixmaps/default/tkabber/xaddress.gif: Implemented Extended Stanza Addressing (JEP-0033, thanks to Artem Borodin). * plugins/general/remote.tcl: Implemented Remote Controlling Clients (JEP-0146) via Ad-hoc commands. Includes status change, messages forwarding, and leaving conference rooms (thanks to Artem Borodin). 2006-09-16 Sergei Golovan * jabberlib-tclxml/jabberlib.tcl, jabberlib-tclxml/pkgIndex.tcl, examples/tools/jsend.tcl, examples/tools/rssbot.tcl: Bumped jabberlib version to 0.10.0 (because of changes in client:roster arguments). * hooks.tcl: Use bgerror for displaying error messages in hooks. * splash.tcl: Wrapped bgerror to hide splash window when error occurs. Improved splash progress messages. * tkabber.tcl: Slightly changed order of loading modules making messages in splash window to flash less frequently. * ifacetk/idefault.tcl: Bugfix. Removed binding for <6> and <7> events, since they are ambiguous. Bind scrolling events only in x11 environment. * ifacetk/bwidget_workarounds.tcl: Made using auto_load to load BWidget scripts instead of creating and destroying widgets. * msgs/ru.msg: Updated. * examples/xrdb/lighthouse.tcl: New color theme (thanks to Max Loparyev). * examples/*.xrdb: Moved to examples/xrdb subdirectory. * examples/*.tcl: Moved to examples/configs subdirectory. * examples/tkabber_setstatus: Moved to examples/tools subdirectory. * gpgme.tcl, hooks.tcl, messages.tcl, muc.tcl, plugins/chat/chatstate.tcl, plugins/chat/events.tcl, plugins/chat/send_message.tcl, plugins/general/avatars.tcl, plugins/roster/rosterx.tcl, presence.tcl: Replaced hook::run with upvar for hook::foldl (it is more simple and looks more "ticklish"). * hooks.tcl: Removed hook::foldl procedure. 2006-09-15 Sergei Golovan * ifacetk/idefault.tcl: Bind mouse buttons to scroll events only on nonwindows systems. 2006-09-13 Sergei Golovan * msgs/pl.msg: Polish translation is updated (thanks to Irek Chmielowiec) * plugins/chat/draw_timestamp.tcl, msgs/*.msg: Corrected typo. * login.tcl: Run predisconnected_hook also before reconnect. 2006-09-12 Sergei Golovan * pixmaps/*: Fixed corrupt pixmaps. * ifacetk/idefault.tcl: Added virtual events for scrolling up, down, left, and right. * util.tcl: Increased horizontal mouswheel scroll increment. Use virtual events for scrolling. * plugins/windows/mouswheel.tcl: Added horizontal scrolling using mousewheel key. Use virtual events for scrolling. * ifacetk/iface.tcl: Use virtual scrolling events for tab switching using mousewheel. * plugins/windows/console.tcl: Added missing Id keyword. * jabberlib-tclxml/jabberlib.tcl: Added xml packet size logging possibility. It can be used for traffic accounting (thanks to Artem Borodin). 2006-09-10 Sergei Golovan * roster.tcl, pixmaps/*/icondef.xml: Replaced x-gadugadu gateway type by gadu-gadu as the latter is registed by Jabber Registrar. Added sms gateway icon to disco/browser. * muc.tcl: Bugfix. Convert MUC room JID to lowercase before joining it. * disco.tcl: Added displaying number of items in every node's title where this number is sufficiently large. * plugins/roster/conferences.tcl: Fixed race confition during autojoining conferences. * plugins/roster/cache_categories.tcl, roster.tcl: Fixed race condition when overriding servers categories and types. Made overriding scheme more robust. * chats.tcl: Fixed status icon behavior (transport icons are not replaced by ordinary icons anymore). * ifacetk/iroster.tcl: Added optional argument (status) to get_jid_icon. 2006-09-09 Sergei Golovan * browser.tcl, disco.tcl: Removed hardcoded icon names for disco/browser services. * pixmaps/*/icondef.xml: Changed browser/* icon names to match services categories and types. * pixmaps/default/services/mrim_*.gif, pixmaps/default/icondef.xml: Added Mail.ru Instant Messenger icons (thanks to Konstantin Khomoutov). * plugins/unix/wmdock.tcl, plugins/general/headlines.tcl: Changed displayed icon names. * plugins/chat/logger.tcl: Made Tkabber more responsible while converting or displaying chatlogs. * plugins/roster/, tkabber.tcl: Added new plugins directory. * plugins/general/annotations.tcl, plugins/general/conferenceinfo.tcl, plugins/general/conferences.tcl, plugins/general/rosterx.tcl, plugins/general/roster_delimiter.tcl: Moved to plugins/roster/ directory. * custom.tcl: Added store_vars procedure for convenience. * jabberlib-tclxml/jabberlib.tcl, roster.tcl, plugins/general/jitworkaround.tcl, plugins/roster/conferences.tcl, ifacetk/iroster.tcl: Don't use nonstandard way of getting item category in the roster. * roster.tcl, messages.tcl, ifacetk/iroster.tcl: Removed roster::is_user function. Forced usage of roster::configure instead. * itemedit.tcl, plugins/roster/conferences.tcl: Made sure that nickname or properties editing frame is the topmost frame of the item edit window. * plugins/roster/cache_categories.tcl: Added new plugin, which uses disco#info queries to retrieve services categories and types, caches them locally and makes roster using the cached information for displaying JIDs icons, menus etc. * gpgme.tcl, ifacetk/iroster.tcl, roster.tcl: Added checks for a few extra service categories. 2006-09-05 Sergei Golovan * ifacetk/iface.tcl: Added conventional quit on closing X session or Windows shutdown (thanks to Konstantin Khomoutov). * ifacetk/iroster.tcl: Quick bugfix. Roster redraw failed when active chats group was enabled. 2006-09-03 Serhei Golovan * jabberlib-tclxml/jabberlib.tcl: Fixed processing presence of type "error" 2006-08-18 Sergei Golovan * pixmaps/*/*.gif: svn:mime-type property is set to application/octet-stream to avoid corruption when downloading on nonunix systems (Closes: http://www.jabber.ru/bugzilla/show_bug.cgi?id=256) * plugins/general/rawxml.tcl, plugins/search/rawxml.tcl: Search in Raw XML window is added 2006-08-17 Sergei Golovan * plugins/search/chat.tcl, plugins/search/logger.tcl, plugins/search/browser.tcl, plugins/search/search.tcl: Searching in chat and chatlog windows moved to separate directory. New plugins which allow searching in browser and disco windows are added (thanks to Konstantin Khomoutov) * browser.tcl: New hook (open_browser_post_hook) is added. It is useful for new search feature * disco.tcl: New hook (open_disco_post_hook) is added. It is useful for new search feature * plugins/chat/logger.tcl: Search in chatlog window is moved to plugins/search directory * tkabber.tcl: Load plugins in plugins/search subdir * plugins/chat/info_commands.tcl: Bugfix. VCard is requested from bare JID (works when chat partner goes offline) 2006-08-16 Sergei Golovan * datagathering.tcl: Fixed empty form processing * jabberlib-tclxml/jlibtls.tcl, jabberlib-tclxml/jlibsasl.tcl, jabberlib-tclxml/jlibcompress.tcl: Fixed behavior when no callback is set * browser.tcl, disco.tcl: Unset all browser/disco window state variables on window destroy (thanks to Konstantin Khomoutov) * login.tcl: Replace .connect_err window if it exists instead of warning * doc/tkabber.xml, doc/tkabber.html, README: Changed Tkabber repository address 2006-07-08 Alexey Shchepin * jabberlib-tclxml/jlibdns.tcl: Fixed DNS reply processing (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: Start IQ stanzas "id" from 1 instead of 0 (thanks to Sergei Golovan) * chats.tcl: Don't raise conference windows on reconnect (thanks to Sergei Golovan) * joingrdialog.tcl: Likewise * muc.tcl: Likewise * plugins/general/conferences.tcl: Likewise 2006-06-24 Alexey Shchepin * plugins/general/subscribe_gateway.tcl: Bugfix (thanks to Sergei Golovan) * jabberlib-tclxml/jlibsasl.tcl: Fixed a typo (thanks to Sergei Golovan) * ifacetk/iface.tcl: Bugfix (thanks to Sergei Golovan) * doc/tkabber.xml: Updated (thanks to Sergei Golovan) * aniemoteicons/anigif.tcl: Bugfix (thanks to Sergei Golovan) * muc.tcl: Raise conference window on join request if it is already opened (thanks to Sergei Golovan) * chats.tcl: Clear status in chat windows on disconnect (thanks to Sergei Golovan) 2006-06-12 Alexey Shchepin * jabberlib-tclxml/jabberlib.tcl: Bugfix (thanks to Sergei Golovan) * ifacetk/systray.tcl: Minor fix (thanks to Sergei Golovan) * ifacetk/iface.tcl: Disable presence menu in offline state, bugfix (thanks to Sergei Golovan) * presence.tcl: Don't change status in offline state (thanks to Sergei Golovan) * plugins/iq/time.tcl: Don't convert time under Windows and tcl newer than 8.4.12 (thanks to Sergei Golovan) 2006-06-01 Alexey Shchepin * doc/tkabber.xml: Updated (thanks to Sergei Golovan) 2006-05-28 Alexey Shchepin * chats.tcl: Don't use latest entered JID on dialog opening (thanks to Sergei Golovan) * userinfo.tcl: Likewise 2006-05-27 Alexey Shchepin * doc/tkabber.xml: Updated (thanks to Sergei Golovan) * README: Likewise * plugins/general/subscribe_gateway.tcl: Bugfix (thanks to Sergei Golovan) * plugins/unix/tktray.tcl: Yet another tray support (thanks to Sergei Golovan) * ifacetk/systray.tcl: Likewise * ifacetk/iface.tcl: Removed loginconf usage (thanks to Sergei Golovan) * doc/tkabber.xml: Updated (thanks to Sergei Golovan) * tkabber.tcl: Added ifacetk namespace definition (thanks to Sergei Golovan) * splash.tcl: Copyright update (thanks to Sergei Golovan) * ifacetk/iface.tcl: Likewise * Makefile: Updated (thanks to Sergei Golovan) 2006-05-21 Alexey Shchepin * messages.tcl: Bugfix (thanks to Sergei Golovan) 2006-05-13 Alexey Shchepin * plugins/general/conferences.tcl: Bugfix (thanks to Sergei Golovan) 2006-05-12 Alexey Shchepin * plugins/general/conferences.tcl: Bugfix (thanks to Sergei Golovan) * plugins/chat/logger.tcl: Avoid more special characters in file names (thanks to Sergei Golovan) * jabberlib-tclxml/namespaces.tcl: Added pubsub#owner namespace (thanks to Sergei Golovan) * jabberlib-tclxml/jlibdns.tcl: Added processing of "." target (thanks to Sergei Golovan) * userinfo.tcl: Added a check for invalid seconds values (thanks to Sergei Golovan) * register.tcl: Multilogin support (thanks to Sergei Golovan) * login.tcl: Don't resolve SRV records if alternative server is specified (thanks to Sergei Golovan) * datagathering.tcl: Added multilogin support (thanks to Sergei Golovan) * custom.tcl: Better mouse wheel support (thanks to Sergei Golovan) 2006-04-27 Alexey Shchepin * jabberlib-tclxml/jlibsasl.tcl: Added SASL::NTLM loading (thanks to Sergei Golovan) * ifacetk/bwidget_workarounds.tcl: Fixed mouse wheel behaviour on Windows (thanks to Sergei Golovan) * plugins/windows/mousewheel.tcl: Likewise * contrib/extract-translations/extract.tcl: Fixed case when extraction file doesn't exist (thanks to Sergei Golovan) * userinfo.tcl: "OS" entry moved to "Client Version" frame (thanks to Sergei Golovan) * privacy.tcl: Bugfix (thanks to Sergei Golovan) 2006-04-19 Alexey Shchepin * msgs/es.msg: Updated (thanks to Badlop) 2006-04-09 Alexey Shchepin * msgs/es.msg: Updated (thanks to Badlop) * plugins/general/roster_delimiter.tcl: Fixed typo (thanks to Sergei Golovan) * muc.tcl: Faster list edit dialog (thanks to Sergei Golovan) * itemedit.tcl: Adding conference to roster moved to plugin (thanks to Sergei Golovan) * roster.tcl: Likewise * ifacetk/iface.tcl: Likewise * ifacetk/iroster.tcl: Likewise * plugins/general/conferences.tcl: Likewise * chats.tcl: Bugfix (thanks to Sergei Golovan) 2006-03-28 Alexey Shchepin * gpgme.tcl: Updated translation strings (thanks to Sergei Golovan) * login.tcl: Likewise * muc.tcl: Likewise * utils.tcl: Likewise * ifacetk/iface.tcl: Likewise * ifacetk/ilogin.tcl: Likewise * msgs/ru.msg: Likewise 2006-03-26 Alexey Shchepin * jabberlib-tclxml/jlibtls.tcl: Bugfix (thanks to Sergei Golovan) 2006-03-25 Alexey Shchepin * plugins/general/xcommands.tcl: Bugfix (thanks to Sergei Golovan) * muc.tcl: Bugfix (thanks to Sergei Golovan) * login.tcl: Updated login interface (thanks to Sergei Golovan) * ifacetk/ilogin.tcl: Likewise * jabberlib-tclxml/jabberlib.tcl: Likewise 2006-03-23 Alexey Shchepin * plugins/chat/irc_commands.tcl: In disconnected chatroom /nick now works as /join (thanks to Sergei Golovan) * jabberlib-tclxml/jlibdns.tcl: Support for SRV and TXT DNS records (requires tcllib 1.8, or 1.7 for TXT only) (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: Likewise * jabberlib-tclxml/pkgIndex.tcl: Likewise * login.tcl: Likewise * ifacetk/iroster.tcl: Add "Remove" menu item for all chat menus (thanks to Sergei Golovan) * userinfo.tcl: Bugfix (thanks to Sergei Golovan) * privacy.tcl: Updated (thanks to Sergei Golovan) * muc.tcl: Slightly changed argument parsing for IRC-like commands (thanks to Sergei Golovan) 2006-03-17 Alexey Shchepin * plugins/general/xcommands.tcl: Fixed typo (thanks to Sergei Golovan) * register.tcl: Fixed "Unregister" button state (thanks to Sergei Golovan) * privacy.tcl: Bugfix (thanks to Sergei Golovan) * plugins/filetransfer/http.tcl: Bugfix (thanks to Sergei Golovan) * msgs/uk.msg: Updated (thanks to Mykola Dzham) * msgs/ru.msg: Updated (thanks to Sergei Golovan) * jabberlib-tclxml/namespaces.tcl: Added jabber:iq:privacy namespace (thanks to Sergei Golovan) * ifacetk/iroster.tcl: Minor update (thanks to Sergei Golovan) * privacy.tcl: Updated (thanks to Sergei Golovan) * ifacetk/iface.tcl: Updated privacy rules menu * muc.tcl: Added missed -exact lsearch option (thanks to Sergei Golovan) * pixmaps.tcl: Likewise * roster.tcl: Likewise * splash.tcl: Likewise * examples/teo-config.tcl: Likewise * examples/tkabber_setstatus: Likewise * plugins/chat/popupmenu.tcl: Likewise * messages.tcl: Updated labels (thanks to Sergei Golovan) * muc.tcl: Likewise * plugins/general/subscribe_gateway.tcl: Likewise * iq.tcl: Don't show own requests in the status line (thanks to Sergei Golovan) * filters.tcl: Disabled by default (thanks to Sergei Golovan) * disco.tcl: Fixed extra info reordering and clearing (thanks to Sergei Golovan) * chats.tcl: Fixed copying of URL to clipboard (thanks to Sergei Golovan) 2006-02-25 Alexey Shchepin * plugins/unix/ispell.tcl: Bugfix (thanks to Sergei Golovan) * plugins/general/jitworkaround.tcl: Bugfix (thanks to Sergei Golovan) * plugins/chat/irc_commands.tcl: Bugfix (thanks to Sergei Golovan) * tkabber.tcl: Support for TKABBER_SITE_PLUGINS environment variable (thanks to Sergei Golovan) * plugins.tcl: Added check for file existence (thanks to Sergei Golovan) 2006-02-09 Alexey Shchepin * plugins/windows/taskbar.tcl: Fixed typo (thanks to Sergei Golovan) * plugins/unix/wmdock.tcl: Icon creation moved to postload_hook, added icon window existing check (thanks to Sergei Golovan) * plugins/general/headlines.tcl: Minor update (thanks to Sergei Golovan) * pixmaps/amibulb/roster/icondef.xml: Replaced \r\n with \n (thanks to Sergei Golovan) * utils.tcl: Performance improvement (thanks to Sergei Golovan) * pixmaps.tcl: Better file name handling (thanks to Sergei Golovan) * chats.tcl: Cleanup (thanks to Sergei Golovan) 2006-02-06 Alexey Shchepin * msgs/es.msg: Updated (thanks to Badlop) 2006-01-28 Alexey Shchepin * plugins/general/annotations.tcl: Bugfix (thanks to Sergei Golovan) * plugins/chat/logger.tcl: Cleanup (thanks to Sergei Golovan) * plugins/chat/irc_commands.tcl: Added error message on /msg command failure (thanks to Sergei Golovan) * plugins/chat/insert_nick.tcl: Minor fix (thanks to Sergei Golovan) * jabberlib-tclxml/jlib*.tcl: Replaced [$token action] to [action $token] calls (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: "after idle" call moved back to jabberlib.tcl (thanks to Sergei Golovan) * jabberlib-tclxml/wrapper.tcl: Likewise * jabberlib-tclxml/jabberlib.tcl: Correctly handle resource change in resource binding (thanks to Sergei Golovan) * jabberlib-tclxml/jlibsasl.tcl: Likewise * jabberlib-tclxml/jabberlib.tcl: Bugfix (thanks to Sergei Golovan) * ifacetk/iroster.tcl: Show both subscribe and ask status in tooltip (thanks to Sergei Golovan) * ifacetk/ilogin.tcl: Fill both ltmp and loginconf variables on profile change (thanks to Sergei Golovan) * roster.tcl: Attribute "name" processing moved to plugin (thanks to Sergei Golovan) * plugins/general/jitworkaround.tcl: Likewise * pixmaps.tcl: Pixmaps now can be loaded on the fly (thanks to Sergei Golovan) * browser.tcl: Updated * chats.tcl: Likewise * disco.tcl: Likewise * gpgme.tcl: Likewise * splash.tcl: Likewise * tkabber.tcl: Likewise * ifacetk/idefault.tcl: Likewise * ifacetk/iface.tcl: Likewise * ifacetk/iroster.tcl: Likewise * plugins/chat/popupmenu.tcl: Likewise * plugins/chat/send_message.tcl: Likewise * plugins/general/headlines.tcl: Likewise * plugins/general/offline.tcl: Likewise * plugins/unix/dockingtray.tcl: Likewise * plugins/unix/systray.tcl: Likewise * plugins/unix/wmdock.tcl: Likewise * plugins/windows/taskbar.tcl: Likewise * muc.tcl: Added support for error codes 321 and 322 (thanks to Sergei Golovan) * custom.tcl: Minor change (thanks to Sergei Golovan) * chats.tcl: Bugfix (thanks to Sergei Golovan) * msgs/pl.msg: Updated (thanks to Irek Chmielowiec) 2006-01-25 Alexey Shchepin * plugins/chat/irc_commands.tcl: Bugfix (thanks to Sergei Golovan) * plugins/chat/insert_nick.tcl: Plugin for insert nick by clicking on conference roster or in chat or conference window (thanks to Sergei Golovan) * jabberlib-tclxml/transports.tcl: Added zlib over tls support (thanks to Sergei Golovan) * ifacetk/iroster.tcl: Added -singleclick and -doubleclick options to ifacetk::roster::create (thanks to Sergei Golovan) * ifacetk/iface.tcl: Likewise * chats.tcl: Likewise * roster.tcl: Minor change (thanks to Sergei Golovan) * presence.tcl: Bugfix (thanks to Sergei Golovan) * muc.tcl: Bugfix, added "/unban JID" command (thanks to Sergei Golovan) 2006-01-20 Alexey Shchepin * plugins/general/avatars.tcl: Bugfix (thanks to Irek Chmielowiec) * **/*.tcl: All menus now created using hooks (thanks to Sergei Golovan) * plugins/general/rosterx.tcl: Roster Item Exchange Support (JEP-0093) (thanks to Sergei Golovan) * messages.tcl: Rosterx-related stuff moved to rosterx plugin * roster.tcl: Likewise * plugins/general/clientinfo.tcl: Minor change (thanks to Sergei Golovan) * jabberlib-tclxml/namespaces.tcl: Added xroster and rosterx namespaces (thanks to Sergei Golovan) * jabberlib-tclxml/jlibcompress.tcl: Better error processing (thanks to Sergei Golovan) * ifacetk/iface.tcl: Removed invisible status (thanks to Sergei Golovan) * muc.tcl: Changed some menu labels, fixed presence sending upon room joining or nick changing (thanks to Sergei Golovan) * gpgme.tcl: Added "expires" field processing, fixed signature printing in user info (thanks to Sergei Golovan) * chats.tcl: Bugfixes (thanks to Sergei Golovan) * browser.tcl: The connid parameter is not optional now (thanks to Sergei Golovan) * disco.tcl: Likewise * filetransfer.tcl: Likewise * messages.tcl: Likewise 2006-01-17 Alexey Shchepin * ifacetk/iroster.tcl: Bugfix (thanks to Igor Goryachev) * plugins/general/xcommands.tcl: Updated (thanks to Sergei Golovan) * plugins/general/rawxml.tcl: Fixed "smart scroll" (thanks to Sergei Golovan) * chats.tcl: Likewise * plugins/general/headlines.tcl: Added "delete" button (thanks to Sergei Golovan) * plugins/general/conferenceinfo.tcl: Updated (thanks to Sergei Golovan) * plugins/general/avatars.tcl: Presence processing moved to another hook (thanks to Sergei Golovan) * plugins/general/annotations.tcl: Bugfix (thanks to Sergei Golovan) * plugins/chat/send_message.tcl: Add id to messages (thanks to Sergei Golovan) * plugins/chat/open_chat.tcl: Updated (thanks to Sergei Golovan) * plugins/chat/irc_commands.tcl: Added invitation support, reason now expected on second line (thanks to Sergei Golovan) * plugins/chat/completion.tcl: Remove additional suffix on Sh-RET (thanks to Sergei Golovan) * plugins/chat/clear.tcl: Support for /clear command (moved from irc_commands.tcl) (thanks to Sergei Golovan) * plugins/chat/irc_commands.tcl: Likewise * plugins/chat/chatstate.tcl: Bugfix (thanks to Sergei Golovan) * jabberlib-tclxml/ntlm.tcl: Bugfix (thanks to Pat Thoyts) * jabberlib-tclxml/namespaces.tcl: Updated (thanks to Sergei Golovan) * jabberlib-tclxml/jlibcompress.tcl: Support for stream compression (JEP-0138) (requires https://gna.org/projects/ztcl/) (thanks to Sergei Golovan) * login.tcl: Likewise * ifacetk/ilogin.tcl: Likewise * jabberlib-tclxml/jabberlib.tcl: Likewise * jabberlib-tclxml/pkgIndex.tcl: Likewise * jabberlib-tclxml/transports.tcl: Likewise * examples/mtr-config.tcl: Updated (thanks to Sergei Golovan) * userinfo.tcl: Bugfix (thanks to Sergei Golovan) * roster.tcl: Some procedures moved to hooks (thanks to Sergei Golovan) * register.tcl: Added "unregister" button (thanks to Sergei Golovan) * presence.tcl: Removed presence_process_x_hook, internal updates, save status on exit (thanks to Sergei Golovan) * muc.tcl: Cleanup, deny some affiliation changes, /kick and /ban now expect reason on second line, fixed invitations (thanks to Sergei Golovan) * messages.tcl: Destroy subscription window on roster push if subscription request is not required anymore (thanks to Sergei Golovan) * gpgme.tcl: All gpgme-related stuff moved here (thanks to Sergei Golovan) * messages.tcl: Likewise * userinfo.tcl: Likewise * ifacetk/iface.tcl: Likewise * plugins/chat/draw_encrypted.tcl: Likewise * plugins/chat/draw_signed.tcl: Likewise * plugins/general/presenceinfo.tcl: Likewise * disco.tcl: Added disco publish support (thanks to Sergei Golovan) * disco.tcl: Added disco tree clearing feature (thanks to Maxim Ryazanov) * datagathering.tcl: Changed focus behaviour (thanks to Sergei Golovan) * chats.tcl: Encode non-ASCII characters in URL, miscellaneous internal changes (thanks to Sergei Golovan) 2006-01-08 Alexey Shchepin * plugins/chat/bookmark_highlighted.tcl: Updated hook priority (thanks to Sergei Golovan) * plugins/chat/me_command.tcl: Likewise * ifacetk/systray.tcl: Changed menu title, don't set geometry if window state wasn't saved (thanks to Sergei Golovan) * doc/tkabber.xml: Fixed urls (thanks to Sergei Golovan) * utils.tcl: Bugfix (thanks to Sergei Golovan) * userinfo.tcl: Center photo in frame (thanks to Sergei Golovan) * userinfo.tcl: Set image MIME type according to image signature (thanks to Unatine) * splash.tcl: Set -topmost attribute to splash screen (thanks to Sergei Golovan) * messages.tcl: Bugfix (thanks to Sergei Golovan) * chats.tcl: Bugfix, added some items to chat menu (thanks to Sergei Golovan) 2005-11-30 Alexey Shchepin * plugins/general/headlines.tcl: Better keyboard management, highlight headers after clicking url in body (thanks to Sergei Golovan) * ifacetk/iroster.tcl: Bugfix (thanks to Sergei Golovan) * ifacetk/iface.tcl: Fixed focus behaviour in status line (thanks to Sergei Golovan) * roster.tcl: Fixed sending of custom presence and resubscription in undefined group (thanks to Sergei Golovan) * login.tcl: Option "sslcafile" replaced with "sslcacertstore", which accepts CA file or directory (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: Likewise * jabberlib-tclxml/jlibtls.tcl: Likewise * jabberlib-tclxml/transports.tcl: Likewise 2005-11-20 Alexey Shchepin * plugins/general/headlines.tcl: Updated interface, added open_headlines_post_hook (thanks to Sergei Golovan) * plugins/chat/chatstate.tcl: Send "gone" event only after "active" event (thanks to Sergei Golovan) * jabberlib-tclxml/wrapper.tcl: Replace control characters to spaces (thanks to Sergei Golovan) * ifacetk/systray.tcl: Unification of tray support (thanks to Sergei Golovan) * ifacetk/iface.tcl: Likewise * plugins/unix/dockingtray.tcl: Likewise * plugins/unix/systray.tcl: Likewise * plugins/windows/taskbar.tcl: Likewise * presence.tcl: Likewise * search.tcl: Bugfix * roster.tcl: Support for sending custom presence to all group members (thanks to Sergei Golovan) * ifacetk/iroster.tcl: Likewise 2005-11-14 Alexey Shchepin * plugins/general/xcommands.tcl: Support for ad-hoc commands (JEP-0050) (thanks to Sergei Golovan) * plugins/general/roster_delimiter.tcl: Support for nested roster groups server-side delimiter storing (JEP-0083) (thanks to Sergei Golovan) * plugins/chat/logger.tcl: Removed dependency on loginconf variable (thanks to Sergei Golovan) * plugins/general/message_archive.tcl: Likewise * jabberlib-tclxml/namespaces.tcl: Updated (thanks to Sergei Golovan) * ifacetk/unix.xrdb: Updated (thanks to Sergei Golovan) * ifacetk/iface.tcl: Added separator in tab menu (thanks to Sergei Golovan) * ifacetk/bwidget_workarounds.tcl: Removed copying of selected nodes to primary X-selection (thanks to Sergei Golovan) * contrib/extract-translations/extract.tcl: Fixed processing of multiline strings (thanks to Sergei Golovan) * chats.tcl: Headlines stuff moved to plugin (thanks to Sergei Golovan) * messages.tcl: Likewise * plugins/general/headlines.tcl: Likewise * plugins/chat/chatstate.tcl: Disabled by default, don't send events to offline contacts (thanks to Sergei Golovan) * msgs/uk.msg: Updated Ukrainian translation (thanks to Mykola Dzham) * msgs/ua.msg: Removed * jabberlib-tclxml/namespaces.tcl: Updated (thanks to Sergei Golovan) * ifacetk/iroster.tcl: Fixed drag'n'drop of conferences from disco (thanks to Sergei Golovan) * plugins/general/conferences.tcl: Likewise * ifacetk/iroster.tcl: Removed items indenting when multilogin is used (thanks to Sergei Golovan) * ifacetk/iface.tcl: Added mouse wheel bindings for tab headers (thanks to Sergei Golovan) * messages.tcl: Removed "Cancel" button from subscribe dialog (thanks to Sergei Golovan) * disco.tcl: Added category and type attributes in drag'n'drop info (thanks to Sergei Golovan) * custom.tcl: Added status "set in config" (thanks to Sergei Golovan) * chats.tcl: Added nick highlighting in /me messages (thanks to Sergei Golovan) * plugins/chat/draw_normal_message.tcl: Likewise * plugins/chat/me_command.tcl: Likewise 2005-10-12 Alexey Shchepin * plugins/chat/events.tcl: Now message events can be switched off (thanks to Sergei Golovan) * plugins/chat/events.tcl: Generation of xlist is moved to hook (thanks to Sergei Golovan) * plugins/chat/send_message.tcl: Likewise * plugins/chat/chatstate.tcl: Support for Chat State Notifications (JEP-0085) (only and ) (thanks to Sergei Golovan) * jabberlib-tclxml/namespaces.tcl: Added 2 namespaces (thanks to Sergei Golovan) * login.tcl: Fixed error after unsuccessful registration (thanks to Sergei Golovan) * datagathering.tcl: Added support for "true" and "false" boolean values (thanks to Sergei Golovan) * chats.tcl: Now possible to read logs from conference private chats (thanks to Sergei Golovan) * ifacetk/iroster.tcl: Likewise * plugins/chat/logger.tcl: Likewise * chats.tcl: Changed message on topic change from room JID (thanks to Sergei Golovan) 2005-09-28 Alexey Shchepin * jabberlib-tclxml/jabberlib.tcl: Added a description for the DISCONNECT event (thanks to Sergei Golovan) * jabberlib-tclxml/stanzaerror.tcl: Likewise * register.tcl: Output a error message in the same registration window (thanks to Sergei Golovan) * muc.tcl: Show JID in kick and ban messages (thanks to Sergei Golovan) * datagathering.tcl: Now possible to clear fields and resend form (thanks to Sergei Golovan) * chats.tcl: Added a popup balloon for a topic label (thanks to Sergei Golovan) * chats.tcl: Bugfix (thanks to Sergei Golovan) * plugins/chat/open_window.tcl: Likewise * balloon.tcl: Don't show a empty balloon (thanks to Sergei Golovan) 2005-09-15 Alexey Shchepin * plugins/chat/highlight.tcl: Better highlighting (thanks to Sergei Golovan) * jabberlib-tclxml/*: Reorganized, a few fixes (thanks to Sergei Golovan) * iq.tcl: Updated * login.tcl: Likewise * utils.tcl: Likewise * plugins/general/conferenceinfo.tcl: Likewise 2005-09-02 Alexey Shchepin * plugins/general/conferences.tcl: Bugfix (thanks to Sergei Golovan) * jabberlib-tclxml/streamerror.tcl: Fixed CVS keyword (thanks to Sergei Golovan) * userinfo.tcl: Added connection choosing in user info dialog (thanks to Sergei Golovan) * plugins.tcl: Ignore non-directory files in plugins dir (thanks to Sergei Golovan) * messages.tcl: Added connection choosing in messages and subscription dialogs (thanks to Sergei Golovan) * presence.tcl: Likewise * chats.tcl: Added "open chat" dialog (thanks to Sergei Golovan) * ifacetk/iface.tcl: Likewise * chats.tcl: Updated URL regexp (thanks to Michail Litvak) 2005-08-28 Alexey Shchepin * msgs/pl.msg: Updated (thanks to Irek Chmielowiec) * plugins/chat/search.tcl: Fixed search panel displaying when the chat window have a small size (thanks to Sergei Golovan) 2005-08-19 Alexey Shchepin * login.tcl: Bugfix (thanks to Sergei Golovan) * ifacetk/iroster.tcl: Bugfix (thanks to Sergei Golovan) * doc/tkabber.xml: Updated 2005-08-14 Alexey Shchepin * msgs/nl.msg: Updated (thanks to Sander Devrieze) * chats.tcl: Bugfix (thanks to Michail Litvak) * plugins/general/conferences.tcl: Changed update_bookmark API (thanks to Sergei Golovan) * itemedit.tcl: Likewise * ifacetk/iroster.tcl: Fixed drug'n'drop of conference jids (thanks to Sergei Golovan) * roster.tcl: Removed setting of "conference" and "subtype" attributes (thanks to Sergei Golovan) 2005-08-11 Alexey Shchepin * joingrdialog.tcl: Minor fix (thanks to Sergei Golovan) 2005-08-10 Alexey Shchepin * msgs/es.msg: Updated (thanks to Badlop) * ifacetk/iroster.tcl: Bugfix (thanks to Sergei Golovan) 2005-08-09 Alexey Shchepin * plugins/general/annotations.tcl: Don't display note creation and modification dates in popup balloon (thanks to Sergei Golovan) * roster.tcl: Bugfix (thanks to Sergei Golovan) 2005-08-07 Alexey Shchepin * plugins/general/conferences.tcl: Bugfixes (thanks to Sergei Golovan) * plugins/chat/logger.tcl: Bugfix (thanks to Sergei Golovan) * msgs/ru.msg: Updated (thanks to Sergei Golovan) * itemedit.tcl: Minor translation string update (thanks to Sergei Golovan) * messages.tcl: Bugfix * plugins/general/conferences.tcl: Support for JEP-0048 (Bookmarks) (thanks to Sergei Golovan) * itemedit.tcl: Likewise * roster.tcl: Likewise * ifacetk/iroster.tcl: Likewise * muc.tcl: Added muc_password variable * login.tcl: Bugfix (thanks to Sergei Golovan) * joingrdialog.tcl: Updated join group dialog, removed add_group_dialog and add_conference procedures (bookmarks should be used) * browser.tcl: Updated * chats.tcl: Likewise * disco.tcl: Likewise * ifaceck/iroster.tcl: Likewise * ifacetk/iface.tcl: Likewise 2005-08-04 Alexey Shchepin * plugins/general/annotations.tcl: Added annotation page in user info window (thanks to Sergei Golovan) * msgs/ru.msg: Updated (thanks to Sergei Golovan) * jabberlib-tclxml/streamerror.tcl: Stream error processing (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: Likewise * jabberlib-tclxml/pkgIndex.tcl: Updated * ifacetk/iface.tcl: Added procedure client:errormsg (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: Likewise * login.tcl: Bugfix (thanks to Sergei Golovan) * disco.tcl: Support for JEP-0128, better usability (thanks to Sergei Golovan) * muc.tcl: Updated * datagathering.tcl: Added function data::parse_xdata_results (thanks to Sergei Golovan) * browser.tcl: Better usability, several variables made per-window (thanks to Sergei Golovan) 2005-08-01 Alexey Shchepin * plugins/general/annotations.tcl: Support for JEP-0145 (Annotations) (thanks to Sergei Golovan) * ifacetk/iroster.tcl: Added roster_create_user_menu_edit_hook, instead of roster_create_user_menu_gpg_hook (thanks to Sergei Golovan) * gpgme.tcl: Likewise * itemedit.tcl: Likewise * tkabber.tcl: Use Changelog file if available to generate version string (thanks to Sergei Golovan) 2005-07-31 Alexey Shchepin * msgs/ru.msg: Updated (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: Better error handling (thanks to Sergei Golovan) * contrib/extract-translations/extract.tcl: Updated (thanks to Sergei Golovan) * gpgme.tcl: Fixed typo (thanks to Sergei Golovan) * login.tcl: Likewise * ifacetk/ilogin.tcl: Likewise 2005-07-30 Alexey Shchepin * jabberlib-tclxml/jlibsasl.tcl: SASL support moved here from jabberlib.tcl, and added support for SASL module from tcllib (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: Likewise * jabberlib-tclxml/pkgIndex.tcl: Updated * jabberlib-tclxml/wrapper.tcl: Updated 2005-07-27 Alexey Shchepin * plugins/unix/ispell.tcl: Bugfix (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: Workaround for jabberd2 bug (which is now fixed) (thanks to Sergei Golovan) 2005-07-15 Alexey Shchepin * jabberlib-tclxml/transports.tcl: Bugfix (thanks to Sergei Golovan) * ifacetk/iface.tcl: Added option for displaying notebook tabs at the bottom (thanks to Sergei Golovan) * gpgme.tcl: Fixed typo (thanks to Sergei Golovan) 2005-06-22 Alexey Shchepin * plugins/general/sound.tcl: Added option for muting sound when Tkabber window have no focus (thanks to Sergei Golovan) * jabberlib-tclxml/transports.tcl: Ignore "-certfile", "-cafile", "-keyfile" options if their argument is empty string (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: Added errors returning on problems with authentication (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: Separated SASL and STARTTLS options (thanks to Pat Thoyts) * ifacetk/ilogin.tcl: Added certificate file field (thanks to Sergei Golovan) * contrib/extract-translations/extract.tcl: Better output (thanks to Badlop) * privacy.tcl: Minor update to simplify extraction of translation strings (thanks to Sergei Golovan) * login.tcl: Added option for enabling PLAIN SASL mechanism (thanks to Sergei Golovan) * ifacetk/ilogin.tcl: Likewise * gpgme.tcl: Added customization options (thanks to Sergei Golovan) 2005-05-15 Alexey Shchepin * plugins/chat/nick_colors.tcl: Bugfix (thanks to Sergei Golovan) * msgs/ru.msg: Updated (thanks to Sergei Golovan) * ifacetk/iface.tcl: Replaced "Browser" with "Jabber Browser" (thanks to Sergei Golovan) * disco.tcl: Replaced "Jabber Discovery" with "Service Discovery" (thanks to Sergei Golovan) * ifacetk/iface.tcl: Likewise 2005-04-26 Alexey Shchepin * msgs/ru.msg: Updated (thanks to Sergei Golovan) * plugins/windows/taskbar.tcl: Now behaviour is the same as in unix taskbar plugin (thanks to Sergei Golovan) * pixmaps/*/doking/tkabber.ico: Updated * userinfo.tcl: Better displaying of big photos (thanks to Sergei Golovan) * chats.tcl: Better status displaying (thanks to Sergei Golovan) 2005-04-20 Alexey Shchepin * muc.tcl: Sort affiliation lists (thanks to Sergei Golovan) * gpgme.tcl: Added multilogin support for GPGME (thanks to Sergei Golovan) * chats.tcl: Likewise * messages.tcl: Likewise * presence.tcl: Likewise * ifacetk/iroster.tcl: Likewise * plugins/chat/draw_signed.tcl: Likewise 2005-04-13 Alexey Shchepin * messages.tcl: Bugfix 2005-04-07 Alexey Shchepin * jabberlib-tclxml/tclxml/: Removed unused code (thanks to Sergei Golovan) * jabberlib-tclxml/wrapper.tcl: Optimizations (thanks to Sergei Golovan) * ifacetk/default.xrdb: Non-geometry resources are moved to unix.xrdb (thanks to Sergei Golovan) * ifacetk/unix.xrdb: Likewise * tkabber.tcl: Updated loading of default XRDB resources (thanks to Sergei Golovan) * chats.tcl: Added processing of empty subject in messages (thanks to Sergei Golovan) * examples/mtr-config.tcl: Likewise * examples/tools/rssbot.tcl: Likewise * jabberlib-tclxml/jabberlib.tcl: Likewise * plugins/si/ibb.tcl: Likewise 2005-03-27 Alexey Shchepin * plugins/unix/systray.tcl: Added message tray icon blinking (thanks to Sergei Golovan) * plugins/unix/dockingtray.tcl: Now behaviour is almost the same as in systray.tcl (thanks to Sergei Golovan) * plugins/chat/draw_xhtml_message.tcl: Fixed groupchat messages displaying, updated hook priority (thanks to Sergei Golovan) * plugins/chat/draw_normal_message.tcl: Updated hook priority * msgs/ru.msg: Updated (thanks to Sergei Golovan) * ifacetk/iroster.tcl: Updated status description in roster balloon (thanks to Sergei Golovan) * ifacetk/iface.tcl: Added options to hide toolbar, status bar and presence bar (thanks to Sergei Golovan) * ifacetk/idefault.tcl: Workaround for shortcuts in russian keyboard layout in Windows (thanks to Sergei Golovan) * emoticons.tcl: Updated bindings * plugins/chat/search.tcl: Likewise * ifacetk/bwidget_workarounds.tcl: Updated to latest BWidget version (thanks to Sergei Golovan) * examples/*.xrdb: Updated (thanks to Sergei Golovan) * gpgme.tcl: Minor change (thanks to Sergei Golovan) * browser.tcl: Bugfix (thanks to Sergei Golovan) 2005-03-16 Alexey Shchepin * msgs/*.msg: Commented ::msgcat::mcset commands with empty second argument to be compatible with latest msgcat package * msgs/pl.msg: Updated (thanks to Irek Chmielowiec) 2005-03-15 Alexey Shchepin * plugins/chat/search.tcl: Removed "Search:" label and FocusOut binding, added "Close" button (thanks to Sergei Golovan) * plugins/chat/logger.tcl: Pack all buttons in one row, added check for regexp correctness (thanks to Sergei Golovan) * ifacetk/iface.tcl: Minor fix (thanks to Sergei Golovan) * plugins/chat/logger.tcl: Use tag instead of selection to highlight matched text (thanks to Michail Litvak) * chats.tcl: Minor change (thanks to Michail Litvak) * plugins/chat/search.tcl: Support for search in chat window (thanks to Michail Litvak) 2005-03-13 Alexey Shchepin * plugins/general/rawxml.tcl: Options moved to "Plugins" subgroup (thanks to Sergei Golovan) * plugins/unix/ispell.tcl: Likewise * plugins/general/autoaway.tcl: Removed sound muting in "away" and "xa" states (thanks to Sergei Golovan) * ifacetk/iroster.tcl: Fixed bug with "show offline contacts" nested group command (thanks to Sergei Golovan) * ifacetk/iface.tcl: Store window state on Windows, slightly reorganized menu, less roster width (thanks to Sergei Golovan) * ifacetk/default.xrdb: Removed unused resource "mainwindowstate" (thanks to Sergei Golovan) * splash.tcl: Splash window now transparent on win and mac platforms (thanks to Pat Thoyts) * sounds.tcl: Moved to plugins/general/sound.tcl (thanks to Sergei Golovan) * plugins/general/sound.tcl: Likewise * tkabber.tcl: Removed loading of sound.tcl * messages.tcl: Added "Message" class for message windows (thanks to Sergei Golovan) * login.tcl: Added loginconf(httpuseragent) variable (thanks to Sergei Golovan) * jabberlib-tclxml/transports.tcl: Added -proxyuseragent option * custom.tcl: Added "file" type of variable (thanks to Sergei Golovan) * login.tcl: Use "file" type for SSL certificates * balloon.tcl: Less balloon pads (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: Bugfix (thanks to Sergei Golovan) * jabberlib-tclxml/transports.tcl: Likewise * roster.tcl: Bugfix (thanks to Sergei Golovan) 2005-03-12 Alexey Shchepin * plugins/chat/info_commands.tcl: Fixed typo (thanks to Sergei Golovan) * plugins/chat/events.tcl: Workaround for yahoo-t, which send inside jabber:x:event with real messages (thanks to Sergei Golovan) * msgs/ru.msg: Updated (thanks to Sergei Golovan) * jabberlib-tclxml/transports.tcl: Better SSL handling (thanks to Sergei Golovan) * ifacetk/iroster.tcl: Fixed roster aliases handling (thanks to Dmitry Astapov) * roster.tcl: Better handling of conference items (thanks to Pat Thoyts) * roster.tcl: Better status messages (thanks to Sergei Golovan) * muc.tcl: Added room destruction dialog (thanks to Sergei Golovan) * messages.tcl: Ignore messages with empty body and no (or unsupported, e.g. jabber:x:event) extras (thanks to Sergei Golovan) * chats.tcl: "Online" and "offline" strings replaced with "available" and "unavailable" (thanks to Sergei Golovan) * iface.tcl: Likewise * presence.tcl: Likewise * ifaceck/iroster.tcl: Likewise * ifacetk/iface.tcl: Likewise * ifacetk/iroster.tcl: Likewise * chats.tcl: Added /leave with reason command (thanks to Sergei Golovan) * plugins/chat/irc_commands.tcl: Likewise * chats.tcl: Added connid argument to get_nick function (thanks to Sergei Golovan) * muc.tcl: Likewise * sound.tcl: Likewise * examples/mtr-config.tcl: Likewise * ifaceck/iroster.tcl: Likewise * ifacetk/iface.tcl: Likewise * ifacetk/iroster.tcl: Likewise * plugins/chat/bookmark_highlighted.tcl: Likewise * plugins/chat/complete_last_nick.tcl:Likewise * plugins/chat/completion.tcl:Likewise * plugins/chat/draw_normal_message.tcl:Likewise * plugins/chat/draw_xhtml_message.tcl:Likewise * plugins/chat/logger.tcl:Likewise * plugins/chat/me_command.tcl:Likewise * plugins/chat/nick_colors.tcl:Likewise * plugins/chat/open_chat.tcl:Likewise 2005-03-08 Alexey Shchepin * custom.tcl: Remove duplicates in subgroup list (thanks to Sergei Golovan) 2005-03-03 Alexey Shchepin * plugins/unix/systray.tcl: Updated (thanks to Sergei Golovan) * plugins/general/conferenceinfo.tcl: All options now in minutes instead of seconds (thanks to Sergei Golovan) * plugins/chat/irc_commands.tcl: Command /subject without arguments doen't set empty subject and display current instead (thanks to Sergei Golovan) * plugins/chat/info_commands.tcl: Better customization (thanks to Sergei Golovan) * jabberlib-tclxml/transports.tcl: Fixed NTLM authentication (thanks to Sergei Golovan) * plugins.tcl: Remove definition of Plugins group (thanks to Sergei Golovan) * messages.tcl: Added news copying to clipboard (thanks to Sergei Golovan) * itemedit.tcl: User bare jid to retrieve user vCard (thanks to Sergei Golovan) * filetransfer.tcl: Insert tag in custom group definition (thanks to Sergei Golovan) * disco.tcl: Sort items by default (thanks to Sergei Golovan) * custom.tcl: Remove dups in group parent list, minor interface change (thanks to Sergei Golovan) * chats.tcl: Fixed bug with incorrect emphasizing initialization (thanks to Sergei Golovan) 2005-02-27 Alexey Shchepin * plugins/general/autoaway.tcl: Updated options(drop_priority) description (thanks to Sergei Golovan) * msgs/ru.msg: Updated (thanks to Sergei Golovan) * ifacetk/ilogin.tcl: Updated behaviour in SSL tab (thanks to Sergei Golovan) * login.tcl: Removed loginconf(usestarttls), updated usage of loginconf(usessl) variable (thanks to Sergei Golovan) 2005-02-22 Alexey Shchepin * plugins.tcl: Added "Plugins" customization group 2005-01-17 Alexey Shchepin * plugins/unix/menu.tcl: Fixed behaviour (thanks to Sergei Golovan) * plugins/unix/menu8.4.tcl: Likewise * plugins/unix/dockingtray.tcl: Replaced command renaming to hook calls (thanks to Sergei Golovan) * plugins/unix/systray.tcl: Likewise * plugins/windows/taskbar.tcl: Likewise * jabberlib-tclxml/pkgIndex.tcl: Added NTLM package, increased jabberlib version (thanks to Sergei Golovan) * jabberlib-tclxml/ntlm.tcl: Support for NTLM authentication (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: All socket and HTTP stuff moved to transports.tcl (thanks to Sergei Golovan) * jabberlib-tclxml/transports.tcl: Likewise * ifacetk/ilogin.tcl: Updated SSL tab (thanks to Sergei Golovan) * ifacetk/iface.tcl: Removed unneeded separator in Help menu, added "update idletask" (thanks to Sergei Golovan) * ifacetk/default.xrdb: Added customize button label color and width of scrollbar resources (thanks to Sergei Golovan) * ifaceck/iroster.tcl: Better menu labels (thanks to Sergei Golovan) * ifacetk/iroster.tcl: Likewise * examples/tools/jsend.tcl: Updated to work with current jabberlib (thanks to Sergei Golovan) * examples/tools/rssbot.tcl: Likewise * roster.tcl: Don't send unregistration request if server's jid is deleted, added procedure roster::send_remove_users_group (thanks to Sergei Golovan) * ifacetk/iroster.tcl: Added "Remove all users in group..." command * login.tcl: Many internal changes (thanks to Sergei Golovan) * iface.tcl: Better TLS warnings, added hooks set_status_hook and clear_status_hook (thanks to Sergei Golovan) * datagathering.tcl: Added "wm group $w ." (thanks to Sergei Golovan) * messages.tcl: Likewise * register.tcl: Likewise * search.tcl: Likewise * userinfo.tcl: Likewise * ifacetk/iface.tcl: Likewise * plugins/chat/logger.tcl: Likewise * plugins/general/subscribe_gateway.tcl: Likewise * custom.tcl: Group names now drawed inside buttons (thanks to Sergei Golovan) 2005-01-04 Alexey Shchepin * ifacetk/iface.tcl: Copyright update * splash.tcl: Likewise 2004-12-22 Alexey Shchepin * plugins/unix/menu.tcl: Fixed menu closing behaviour (thanks to Sergei Golovan) * plugins/unix/menu8.4.tcl: Likewise * roster.tcl: Fixed nicknames importing from JIT (thanks to Sergei Golovan) * plugins/general/avatars.tcl: Allows translation of more strings (thanks to Badlop) * ifacetk/iface.tcl: Menu reorganization (thanks to Badlop and Sergei Golovan) * ifacetk/iroster.tcl: Likewise * examples/ocean-deep.xrdb: New color theme (thanks to Badlop) 2004-12-17 Alexey Shchepin * plugins/chat/logger.tcl: Avoid glob characters in filename to work properly in win32 2004-11-29 Alexey Shchepin * plugins/chat/logger.tcl: Updated search interface (thanks to Sergei Golovan) * msgs/*.msg: Updated (thanks to Sergei Golovan) * muc.tcl: Minor fix (thanks to Sergei Golovan) * login.tcl: Avoid vwait (thanks to Sergei Golovan) * chats.tcl: Removed "..." from "Show info" and "Show history" menu items (thanks to Sergei Golovan) * messages.tcl: Likewise * search.tcl: Likewise * ifaceck/iroster.tcl: Likewise * ifacetk/iroster.tcl: Likewise 2004-11-28 Alexey Shchepin * plugins/general/autoaway.tcl: Fixed priority storing, intervals now specified in minutes (thanks to Sergei Golovan) * presence.tcl: Send presence only when changed $userstatus, updated sending of first presence (thanks to Sergei Golovan) 2004-11-21 Alexey Shchepin * plugins/chat/open_chat.tcl: Support for /open command (thanks to Dmitry Astapov) * plugins/chat/completion.tcl: Support for completion of strings with spaces (thanks to Dmitry Astapov) * jabberlib-tclxml/jabberlib.tcl: Moved predisconnected_hook to login.tcl (thanks to Sergei Golovan) * login.tcl: Likewise * ifacetk/iroster.tcl: Updated set_group_lists (thanks to Sergei Golovan) * tkabber.tcl: Updated exiting (thanks to Sergei Golovan) * ifacetk/iface.tcl: Likewise * muc.tcl: Replaced "[namespace current]" with "muc" (thanks to Sergei Golovan) * messages.tcl: Replaced "gc_" with "muc#" (thanks to Sergei Golovan) * muc.tcl: Likewise * muc.tcl: Avoid vwait (thanks to Sergei Golovan) * chats.tcl: Removed "after idle" call, cleanup (thanks to Sergei Golovan) * ifacetk/ilogin.tcl: Better focus setting in login window (thanks to Sergei Golovan) 2004-09-30 Alexey Shchepin * msgs/ru.msg: Updated (thanks to Sergei Golovan) * jabberlib-tclxml/wrapper.tcl: Added wrapper::free procedure (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: Better support for xml:lang (thanks to Sergei Golovan) * emoticons.tcl: Added freeing of xml parser (thanks to Sergei Golovan) * xmppmime.tcl: Likewise * jabberlib-tclxml/jabberlib.tcl: Likewise * jabberlib-tclxml/jabberlib.tcl (jlib::http_poll): Removed previous fix 2004-09-29 Alexey Shchepin * jabberlib-tclxml/jabberlib.tcl (jlib::http_poll): Bugfix (thanks to Sergei Golovan) 2004-09-28 Alexey Shchepin * tkabber.tcl: Added '-splash' option 2004-09-25 Alexey Shchepin * login.tcl: Display registration dialog only on authentication error (thanks to Sergei Golovan) * msgs/ru.msg: Updated (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: Updated for better handling of translation strings (thanks to Sergei Golovan) * plugins/general/rawxml.tcl: Likewise * plugins/general/stats.tcl: Likewise * ifaceck/iface.tcl: Updated some translation strings (thanks to Sergei Golovan) * ifacetk/iface.tcl: Likewise * contrib/extract-translations/extract.tcl: Better search for translation stings (thanks to Sergei Golovan) * msgs/pl.msg: Updated (thanks to Irek Chmielowiec) 2004-09-21 Alexey Shchepin * joingrdialog.tcl (add_group_dialog): Bugfix * presence.tcl: Bugfix (thanks to Sergei Golovan) 2004-09-17 Alexey Shchepin * plugins/general/offline.tcl: Partial support for JEP-0013 (thanks to Sergei Golovan) * ifacetk/iface.tcl: Removed avatar menu, register name for services menu (thanks to Sergei Golovan) * userinfo.tcl: Added hook for inserting new pages in user info window (thanks to Sergei Golovan) * muc.tcl: Processing of conference presence packets moved here (thanks to Sergei Golovan) * messages.tcl: Support for password in conference room invitation (thanks to Sergei Golovan) * login.tcl: Fixed logout with reason (thanks to Sergei Golovan) * presence.tcl: Likewise * joingrdialog.tcl: Updated support for room password (thanks to Sergei Golovan) * hooks.tcl: Added procedure foldl (thanks to Sergei Golovan) * ckabber.tcl: Removed avatar namespace (thanks to Sergei Golovan) * chats.tcl: Fixed processing of disconnecting from conference room (thanks to Sergei Golovan) * avatars.tcl: Moved to plugins (thanks to Sergei Golovan) * plugins/general/avatars.tcl: Likewise, added connid support, avatar menu moved from ifacetk/iface.tcl (thanks to Sergei Golovan) * tkabber.tcl: Removed direct loading of avatars.tcl (thanks to Sergei Golovan) 2004-09-10 Alexey Shchepin * ifacetk/iroster.tcl: Bugfix (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: Fixed TLS support (thanks to Sergei Golovan) * login.tcl: Likewise 2004-09-09 Alexey Shchepin * ifacetk/iface.tcl: Added "Iconize" option to options(closebuttonaction) (thanks to Badlop) 2004-09-05 Alexey Shchepin * chats.tcl: Better URL support, added "Add conference" in conference menu * plugins/chat/highlight.tcl: Removed highlighting inside URL * plugins/unix/systray.tcl: Fixed icon initialization * plugins/filetransfer/http.tcl: Bugfix * plugins/jidlink/dtcp.tcl: Likewise * jabberlib-tclxml/wrapper.tcl: Added stream_header and stream_trailer procedures * messages.tcl: Message body now displayed using $font * disco.tcl: Added sorting * browser.tcl: Added sorting by JID 2004-08-23 Alexey Shchepin * muc.tcl: Fixed invitation to conference (thanks to Sergei Golovan) * chats.tcl: Likewise 2004-08-16 Alexey Shchepin * plugins/unix/systray.tcl: New plugin for tray icon (thanks to Alexey Lyubimov) * plugins/unix/dockingtray.tcl: Now disabled by default (thanks to Sergei Golovan) * plugins/general/subscribe_gateway.tcl: New plugin for user adding using jabber:iq:gateway (thanks to Sergei Golovan) * msgs/ru.msg: Updated (thanks to Sergei Golovan) * ifacetk/iroster.tcl: Added service_popup_menu_hook (thanks to Sergei Golovan) * ifacetk/ilogin.tcl: Procedure logout_dialog moved to current namespace (thanks to Sergei Golovan) * ifacetk/iface.tcl: Added protocol_wm_delete_window_hook, bugfix (thanks to Sergei Golovan) * utils.tcl: Bugfix (thanks to Sergei Golovan) * userinfo.tcl: Bugfix (thanks to Sergei Golovan) * privacy.tcl: Updated messages (thanks to Sergei Golovan) * custom.tcl: Added interface to add options to radiobutton (thanks to Sergei Golovan) * pixmaps/: Renamed icons (thanks to Sergei Golovan) * browser.tcl: Likewise * disco.tcl: Likewise * splash.tcl: Likewise * ifacetk/iface.tcl: Likewise * ifacetk/iroster.tcl: Likewise * plugins/chat/popupmenu.tcl: Likewise * balloon.tcl: Better balloon placement in the bottom of screen (thanks to Sergei Golovan) * ifacetk/iroster.tcl: Move roster item on drag'n'drop instead of copying if it is dropped in the same roster (thanks to Sergei Golovan) * examples/tools/jsend.tcl: Updated (thanks to Marshall T. Rose) * jabberlib-tclxml/jabberlib.tcl: Added -from argument to jlib::send_msg (thanks to Marshall T. Rose) * jabberlib-tclxml/pkgIndex.tcl: Updated (thanks to Marshall T. Rose) 2004-08-08 Alexey Shchepin * jabberlib-tclxml/jabberlib.tcl: Don't send newline after stanza 2004-08-01 Alexey Shchepin * jabberlib-tclxml/jabberlib.tcl: Support for STARTTLS * login.tcl: Likewise * ifacetk/ilogin.tcl: Likewise 2004-07-23 Alexey Shchepin * doc/tkabber.xml: Updated 2004-07-20 Alexey Shchepin * roster.tcl (roster::get_label): Bugfix 2004-07-17 Alexey Shchepin * msgs/nl.msg: New Dutch translation (thanks to Sander Devrieze) 2004-07-16 Alexey Shchepin * plugins/filetransfer/si.tcl: Added missed function set_receive_file_name (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: Minor fix (thanks to Sergei Golovan) * avatars.tcl: Removed loginconf usage (thanks to Sergei Golovan) * gpgme.tcl: Likewise * ifacetk/iface.tcl: Likewise in call to userinfo::open * privacy.tcl: Fixed some translatable messages * msgs/pl.msg: Updated (thanks to Irek Chmielowiec) 2004-07-10 Alexey Shchepin * plugins/general/tkcon.tcl: Updated label (thanks to Sergei Golovan) * plugins/filetransfer/*.tcl: Added transport enabling option, updated dialogs and menus (thanks to Sergei Golovan) * plugins/chat/popupmenu.tcl: Updated (thanks to Sergei Golovan) * plugins/chat/nick_colors.tcl: Added "Edit nick color" menu item to roster (thanks to Sergei Golovan) * msgs/ru.msg: Updated (thanks to Sergei Golovan) * ifacetk/iroster.tcl: Updated file transfer menu (thanks to Sergei Golovan) * tkabber.tcl: Returned loading of jidlink.tcl (thanks to Sergei Golovan) * si.tcl: Added customization options (thanks to Sergei Golovan) * jidlink.tcl: Removed "Jidlink" menu (thanks to Sergei Golovan) * ifacetk/iface.tcl: Likewise * hooks.tcl: Bugfix (thanks to Sergei Golovan) * filetransfer.tcl: Added "cascaded_menu" option (thanks to Sergei Golovan) * default.tcl: Minor fix (thanks to Sergei Golovan) * chats.tcl: Removed global variable "w" (thanks to Sergei Golovan) * iface.tcl: Likewise * messages.tcl: Likewise 2004-07-06 Alexey Shchepin * msgs/es.msg: Updated (thanks to Badlop) * msgs/ca.msg: Updated (thanks to Badlop) 2004-07-04 Alexey Shchepin * plugins/chat/events.tcl: Don't open window if event notification is received * chats.tcl: Opening of chat window is moved to plugin * plugins/chat/open_window.tcl: New plugin to open chat and groupchat windows * plugins/chat/empty_body.tcl: Changed priority for check_draw_empty_body 2004-07-02 Alexey Shchepin * plugins/filetransfer/si.tcl: Handle element properly * plugins/si/socks5.tcl: Bugfix 2004-07-01 Alexey Shchepin * plugins/si/socks5.tcl: JEP-0065 support * plugins/iq/oob.tcl: Moved to plugins/filetransfer/http.tcl * plugins/chat/irc_commands.tcl: Added /clear command, some commands now works in chat (non-conference) windows (thanks to Sergei Golovan) * msgs/ru.msg: Updated (thanks to Sergei Golovan) * ifacetk/default.xrdb: Updated (thanks to Sergei Golovan) * examples/teopetuk.xrdb: Updated (thanks to Sergei Golovan) * filetransfer.tcl: Moved HTTP, Jidlink and SI stuff to plugins/filetransfer (thanks to Sergei Golovan) * plugins/filetransfer/http.tcl: Likewise * plugins/filetransfer/jidlink.tcl: Likewise * plugins/filetransfer/si.tcl: Likewise * disco.tcl: Better multilogin support (thanks to Sergei Golovan) * jidlink.tcl: Likewise * negotiate.tcl: Likewise * plugins/jidlink/dtcp.tcl: Likewise * plugins/jidlink/ibb.tcl: Likewise * chats.tcl: Updated menu items related to sending files (thanks to Sergei Golovan) * messages.tcl: Likewise * search.tcl: Likewise * ifacetk/iroster.tcl: Likewise 2004-06-24 Alexey Shchepin * chats.tcl: Minor internal change * filetransfer.tcl: Added support for JEP-0096 (not completed: only IBB is supported) * si.tcl: Likewise * plugins/si/ibb.tcl: Likewise * ifacetk/iface.tcl: Fixed call to message::send_subsribe_dialog (thanks to Sergei Golovan) * ifacetk/iroster.tcl: Likewise * jabberlib-tclxml/jabberlib.tcl: Bugfix (thanks to Sergei Golovan) 2004-06-18 Alexey Shchepin * ifacetk/iface.tcl: Support for tabs drag'n'drop (thanks to Sergei Golovan) * (all): Better connid support (thanks to Sergei Golovan) 2004-06-14 Alexey Shchepin * plugins/unix/dockingtray.tcl: Replaced "dock_in_tray" with "dockingtray" (thanks to Sergei Golovan) * plugins/chat/info_commands.tcl: Bugfix (thanks to Sergei Golovan) * plugins/chat/bookmark_highlighted.tcl: Changed behaviour (thanks to Sergei Golovan) * plugins/chat/popupmenu.tcl: Likewise * msgs/ru.msg: Updated (thanks to Sergei Golovan) * ifacetk/iroster.tcl: Bugfix (thanks to Sergei Golovan) * ifacetk/iface.tcl: Second button in toolbar now opens "Discovery" window instead of "Browser" (thanks to Sergei Golovan) 2004-06-10 Alexey Shchepin * plugins/unix/dockingtray.tcl: Added option for plugin disabling (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: Added registration for "https" protocol (thanks to Sergei Golovan) * ifacetk/iface.tcl: Don't count own messages in tab and main window titles (thanks to Sergei Golovan) * ifacetk/iface.tcl: Removed dots from "About" and "Quick help" menu items (thanks to Sergei Golovan) * plugins/unix/dockingtray.tcl: Likewise * plugins/windows/taskbar.tcl: Likewise * msgs/*.msg: Likewise * messages.tcl: Replace newlines to spaces in the headlines tree (thanks to Sergei Golovan) 2004-06-07 Alexey Shchepin * ifacetk/ilogin.tcl: Fixed bindings for C-Prior and C-Next (thanks to Sergei Golovan) 2004-05-11 Alexey Shchepin * msgs/fr.msg: Updated (thanks to Vincent Ricard) 2004-05-09 Alexey Shchepin * examples/tclCarbonNotification-1.0.0/: Package that adds support for "bouncing" the tkabber icon in the MacOS X (thanks to Marshall T. Rose) * examples/mtr-config.tcl: Updated (thanks to Marshall T. Rose) * balloon.tcl: Support for AquaBI (thanks to Marshall T. Rose) * register.tcl: Likewise * search.tcl: Likewise 2004-05-08 Alexey Shchepin * examples/mtr-config.tcl: Updated (thanks to Marshall T. Rose) * ifacetk/iface.tcl: Added "tab_set_updated" hook (thanks to Marshall T. Rose) * msgs/pl.msg: Removed trailing garbage 2004-04-27 Alexey Shchepin * plugins/general/autoaway.tcl: Support for AquaBI (thanks to Marshall T. Rose) * msgs/pl.msg: Updated (thanks to Irek Chmielowiec) 2004-04-23 Alexey Shchepin * (all): Updated to make tkabber run under AquaBI (thanks to Marshall T. Rose) 2004-04-17 Alexey Shchepin * plugins/chat/info_commands.tcl: Cleanup (thanks to Sergei Golovan) * muc.tcl: Display real jid in join message when available (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: Support for "name" attribute in presence stanzas with type "subscribed" (thanks to Sergei Golovan) * messages.tcl: Likewise * roster.tcl: Likewise * messages.tcl: Bugfix with displaying of "Undefined" group in "Edit item" dialog (thanks to Sergei Golovan) * roster.tcl: Likewise * plugins/chat/popupmenu.tcl: Bugfixes (thanks to Sergei Golovan) 2004-04-12 Alexey Shchepin * pixmaps/kroc/: Pixmaps theme from tkabber-starkit * jabberlib-tclxml/jabberlib.tcl: Support for IDNA (RFC3490) * login.tcl: Likewise 2004-04-11 Alexey Shchepin * plugins/chat/bookmark_highlighted.tcl: Bugfix (thanks to Sergei Golovan) * roster.tcl (roster::get_groups): Bugfix (thanks to Sergei Golovan) * plugins/chat/popupmenu.tcl: Moved bookmark image to bookmark.xpm (thanks to Sergei Golovan) * pixmaps/default/tkabber/bookmark.xpm: Likewise * plugins/chat/bookmark_highlighted.tcl: Updated (thanks to Sergei Golovan) * ifacetk/iroster.tcl: Added "Send message to all users in group" menu item (thanks to Sergei Golovan) * roster.tcl: Changed get_groups (thanks to Sergei Golovan) * itemedit.tcl: Likewise * ifacetk/iroster.tcl: Likewise * roster.tcl: Added function get_group_jids (thanks to Sergei Golovan) * messages.tcl: Headlines now stored in utf-8 encoding (thanks to Sergei Golovan) * messages.tcl: Changed syntax of message::send and message::send_dialog (thanks to Sergei Golovan) * search.tcl: Likewise * xmppmime.tcl: Likewise * ifaceck/iroster.tcl: Likewise * ifacetk/iroster.tcl: Likewise * ifacetk/iface.tcl: Likewise * default.tcl: More i18n * chats.tcl: Removed chats(groupchats) variable, added function chat::opened (thanks to Sergei Golovan) * ifacetk/iface.tcl: Likewise * plugins/chat/popupmenu.tcl: Likewise * plugins/chat/nick_colors.tcl: Likewise 2004-04-07 Alexey Shchepin * plugins/chat/popupmenu.tcl: Fixes, added hook (thanks to Sergei Golovan) * plugins/chat/nick_colors.tcl: Added "Edit nick color" context menu to colored nicks, fixes (thanks to Sergei Golovan) * plugins/chat/me_command.tcl: Bugfix (thanks to Sergei Golovan) * plugins/chat/draw_normal_message.tcl: Optimization, changed load priority (thanks to Sergei Golovan) * plugins/chat/bookmark_highlighted.tcl: Support for scrolling to highlighted messages (thanks to Sergei Golovan) * chats.tcl: Support for colored nicks in conference roster (thanks to Sergei Golovan) * ifacetk/iroster.tcl: Likewise * plugins/chat/nick_colors.tcl: Likewise * chats.tcl: Added "Copy URL to clipboard" menu item (thanks to Sergei Golovan) 2004-04-04 Alexey Shchepin * pixmaps/gush/: New pixmaps theme (thanks to Badlop) * pixmaps/amibulb/: Updated (thanks to Badlop) * ifacetk/ilogin.tcl: Minor change (thanks to Badlop) * muc.tcl: More i18n support (thanks to Badlop) * ifacetk/iface.tcl: New option "closebuttonaction" (thanks to Badlop) * examples/badlop-*: Updated (thanks to Badlop) * default.tcl: Added customization option for web browser (thanks to Badlop) 2004-04-03 Alexey Shchepin * ifacetk/iroster.tcl: Customized tearoff displaying in roster menu (thanks to Sergei Golovan and Badlop) * ifacetk/iface.tcl: Bugfix in displaying of star in titlebar (thanks to Sergei Golovan) * ifacetk/idefault.tcl: Changed priority for define_fonts (thanks to Sergei Golovan) * privacy.tcl: Added debugmsgs (thanks to Sergei Golovan) * messages.tcl (message::str2node): Updated to work with latest tcllib (thanks to Sergei Golovan) * custom.tcl: Changed priority of custom::restore (thanks to Sergei Golovan) * chats.tcl: Added "highlight" tag (thanks to Sergei Golovan) * plugins/chat/draw_normal_message.tcl: Likewise * custom.tcl: Fixed custom.tcl path (this change and changes below are adaptations by Sergei Golovan of tkabber-starkit (authors: David Zolli, Steve Redler and Pat Thoyst)) * default.tcl: Updated browseurl * joingrdialog.tcl: Specified -parent and -modal options * muc.tcl: Likewise * presence.tcl: Likewise * tkabber.tcl: Debugging info is now off by default, fixed file paths * examples/gtklook.xrdb: New theme * ifacetk/idefault.tcl: Minor update * ifacetk/iface.tcl: Added option show_presencebar * plugins/chat/nick_colors.tcl: Support for colored messages * plugins/chat/draw_normal_message.tcl: Likewise * plugins/chat/me_command.tcl: Likewise * plugins/chat/logger.tcl: Fixed file path * plugins/chat/popupmenu.tcl: Popup menu for chat windows * plugins/windows/console.tcl: Display console window 2004-03-30 Alexey Shchepin * plugins/chat/logger.tcl (::logger::get_subdirs): Bugfix 2004-03-22 Alexey Shchepin * msgs/pl.msg: Updated (thanks to Irek Chmielowiec) * tkabber.tcl: Added setting of seed for tclx "random" command 2004-03-20 Alexey Shchepin * iface*/iroster.tcl: Added sorting in send users dialog (thanks to Marshall T. Rose) * roster.tcl (roster::get_jids): Likewise 2004-03-16 Alexey Shchepin * msgs/fr.msg: Updated (thanks to Vincent Ricard) * contrib/extract-translations/extract.tcl: Added '-v' option to display useless old keys from translation files (thanks to Vincent Ricard) * plugins/chat/logger.tcl: Don't show months with no history messages, now possible to view entire history, added explicit color definitions in CSS (thanks to Sergei Golovan) * ifacetk/iface.tcl: Added binding for <> (thanks to Sergei Golovan) * utils.tcl: Checkbuttons list now sorted, fixed some bindings (thanks to Sergei Golovan) * messages.tcl: Added "Copy URL to clipboard" command for headlines (thanks to Sergei Golovan) * chats.tcl: Minor change (thanks to Sergei Golovan) 2004-03-12 Alexey Shchepin * plugins/windows/taskbar.tcl: Bugfix (thanks to Roger Sondermann) * plugins/unix/dockingtray.tcl: Likewise 2004-03-11 Alexey Shchepin * ifacetk/iroster.tcl: Fixed group resubscribe (thanks to David Everly) 2004-03-10 Alexey Shchepin * jabberlib-tclxml/jabberlib.tcl: Added check for "http" package version (thanks to Sergei Golovan) * filetransfer.tcl: Fixed check for "http" package version (thanks to Sergei Golovan) * browser.tcl: Don't open window when tkabber is disconnected (thanks to Sergei Golovan) * disco.tcl: Likewise * joingrdialog.tcl: Likewise 2004-03-08 Alexey Shchepin * jabberlib-tclxml/jabberlib.tcl: Bugfix (thanks to Sergei Golovan) * examples/mtr-config.tcl: Updated (thanks to Marshall T. Rose) 2004-03-07 Alexey Shchepin * ifacetk/iface.tcl: Added option for showing/hiding tearoffs (thanks to Badlop) * ifacetk/iface.tcl: Updated toolbar icons changing (thanks to Sergei Golovan) * userinfo.tcl: More compatibility with old versions, fixed regsub usage (thanks to Sergei Golovan) * tkabber.tcl: Now possible to use site-wide config (thanks to Sergei Golovan) * messages.tcl: Updated few messages (thanks to Sergei Golovan) * chats.tcl: Fixed presence sending to conference (thanks to Sergei Golovan) * presence.tcl: Likewise * ifacetk/iroster.tcl: Likewise * roster.tcl: Recognize "weather" in addition to "pogoda" (thanks to Marshall T. Rose) * jabberlib-tclxml/jabberlib.tcl: Added option for passing "to" attribute (thanks to Marshall T. Rose) 2004-03-02 Alexey Shchepin * jabberlib-tclxml/jabberlib.tcl: Fixed handshake processing * plugins/chat/info_commands.tcl: Removed not-evident AI (thanks to Sergei Golovan) * msgs/ru.msg: Updated (thanks to Sergei Golovan) * userinfo.tcl: Text widgets now inside ScrolledWindow, added -page option to userinfo::open, EMAIL tag now processed according to JEP-0054 (thanks to Sergei Golovan) * datagathering.tcl: Slightly updated look of x:data forms (thanks to Sergei Golovan) * muc.tcl: Likewise for affiliation lists * custom.tcl: Added group sorting (thanks to Sergei Golovan) * chats.tcl: Fixed "smart scroll" (thanks to Sergei Golovan) 2004-02-27 Alexey Shchepin * msgs/pl.msg: Updated (thanks to Irek Chmielowiec) 2004-02-26 Alexey Shchepin * ifacetk/bwidget_workarounds.tcl: Disable previous workaround for unix platform 2004-02-25 Alexey Shchepin * msgs/ru.msg: Updated (thanks to Sergei Golovan) * ifacetk/idefault.tcl: Added changing of font "on the fly" for non-unix platforms (thanks to Sergei Golovan) * ifacetk/iface.tcl: Likewise * ifacetk/bwidget_workarounds.tcl: Fixed SelectFont widget (thanks to Sergei Golovan) * utils.tcl: Added "error_type_condition" function (thanks to Sergei Golovan) * privacy.tcl: Updated interface, also added interface to visible/invisible/ignore lists (thanks to Sergei Golovan) * ifacetk/iface.tcl: Updated menu for privacy rules (thanks to Sergei Golovan) * muc.tcl: Updated menu labels (thanks to Sergei Golovan) * login.tcl: Roster getting and first presence sending moved to hooks (thanks to Sergei Golovan) * presence.tcl: Likewise * roster.tcl: Likewise * datagathering.tcl: Removed "xml:lang" attribute (thanks to Sergei Golovan) * disco.tcl: Likewise * muc.tcl: Likewise * register.tcl: Likewise * search.tcl: Likewise * userinfo.tcl: Likewise * plugins/general/conferenceinfo.tcl: Likewise * datagathering.tcl: Better look (thanks to Sergei Golovan) * custom.tcl: Added "font" type for variables (thanks to Sergei Golovan) * chats.tcl: Fixed conference topic changing (thanks to Sergei Golovan) * chats.tcl: Minor update (thanks to Sergei Golovan) * ifaceck/widgets.tcl: Likewise * plugins/general/rawxml.tcl: Likewise * balloon.tcl: Minor change (thanks to Sergei Golovan) 2004-02-17 Alexey Shchepin * pixmaps/amibulb/: New pixmaps theme (thanks to Badlop) * datagathering.tcl: Minor fix * ifaceck/iroster.tcl: Likewise * login.tcl: Likewise * muc.tcl: Likewise * plugins/chat/logger.tcl: Likewise * roster.tcl: Likewise * jabberlib-tclxml/jabberlib.tcl: Fixed error message output (thanks to Sergei Golovan) * muc.tcl: Added history management (thanks to Sergei Golovan) * chats.tcl: "Extended Away" message is replaced with "Extended away" (thanks to Sergei Golovan) * iface.tcl: Likewise * presence.tcl: Likewise * ifaceck/iroster.tcl: Likewise * ifacetk/iroster.tcl: Likewise * chats.tcl: Don't scroll window if message have empty body (thanks to Sergei Golovan) 2004-02-10 Alexey Shchepin * msgs/ru.msg: Updated (thanks to Sergei Golovan) * iface.tcl: Fixed translatable string (thanks to Sergei Golovan) * search.tcl: Likewise * roster.tcl: Fixed get_category_and_subtype and heuristically_get_category_and_subtype (thanks to Sergei Golovan) * gpgme.tcl: Likewise * datagathering.tcl: Fixed sending of ejabberd:config element (thanks to Sergei Golovan) * chats.tcl: Nick change command moved to muc.tcl, fixed error with conference menu (thanks to Sergei Golovan) * muc.tcl: Likewise * plugins/chat/irc_commands.tcl: Likewise 2004-02-08 Alexey Shchepin * msgs/pl.msg: Updated (thanks to Irek Chmielowiec) * plugins/general/rawxml.tcl: Added mandatory "id" attribute to IQ templates * plugins/general/stats.tcl: Added disco feature description (thanks to Sergei Golovan) * plugins/chat/irc_commands.tcl: /part and /leave now close conference window (thanks to Sergei Golovan) * plugins/chat/exec_command.tcl: Cleanup (thanks to Sergei Golovan) * plugins/chat/info_commands.tcl: Likewise * ifacetk/iface.tcl: Added ifacetk::destroy_win function (thanks to Sergei Golovan) * tkabber.tcl: Restored previous loading order (thanks to Sergei Golovan) * datagathering.tcl: Support for ejabberd:config namespace (thanks to Sergei Golovan) * chats.tcl: Open conference window before MUC negotiation (thanks to Sergei Golovan) * joingrdialog.tcl: Likewise * muc.tcl: Likewise * ifacetk/iroster.tcl: Likewise * browser.tcl: Minor update in ns_handler and feature_handler processing (thanks to Sergei Golovan) * disco.tcl: Likewise * pixmaps/jajc/docking/*.gif: New JAJC-like docking icons (thanks to Oleksandr Yakovlyev) 2004-02-04 Alexey Shchepin * plugins/general/autoaway.tcl: Display autoaway options only if tkXwin is available (thanks to Sergei Golovan) * joingrdialog.tcl: Join conference with current presence status (thanks to Sergei Golovan) * muc.tcl: Likewise 2004-02-01 Alexey Shchepin * plugins/windows/taskbar.tcl: Added option for taskbar blinking (thanks to Badlop) * msgs/es.msg: Updated (thanks to Badlop) * msgs/ca.msg: Updated (thanks to Badlop) * examples/badlop-*: Updated (thanks to Badlop) * ifacetk/iface.tcl: Added options for switching of tabbed mode and toolbar displaying (thanks to Badlop) * tkabber.tcl: Slightly changed loading order * ifacetk/iface.tcl (ifacetk::update_chat_titles): Minor fix 2004-01-26 Alexey Shchepin * plugins/chat/irc_commands.tcl: Updated nick changing (thanks to Sergei Golovan) * plugins/chat/draw_message.tcl: Minor update (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: Updated (thanks to Sergei Golovan) * presence.tcl: Removed "-id" processing (thanks to Sergei Golovan) * muc.tcl: Updated processing of nick changing (thanks to Sergei Golovan) * chats.tcl: Updated nick handling (thanks to Sergei Golovan) 2004-01-20 Alexey Shchepin * jabberlib-tclxml/jabberlib.tcl: Bugfix (thanks to Sergei Golovan) 2004-01-19 Alexey Shchepin * plugins/chat/irc_commands.tcl: Fixed nick changing (thanks to Sergei Golovan) * ifacetk/iroster.tcl: Bugfixes (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: Added -command option to presence sending (thanks to Sergei Golovan) * presence.tcl: Likewise * jabberlib-tclxml/jabberlib.tcl: HTTP Polling update (thanks to Sergei Golovan) * chats.tcl: Bugfix (thanks to Sergei Golovan) 2004-01-18 Alexey Shchepin * jabberlib-tclxml/jabberlib.tcl: Function get_lang moved to jabberlib.tcl from utils.tcl, added sending of xml:lang attribute in stream header * utils.tcl: Likewise * plugins/chat/irc_commands.tcl: Minor update (thanks to Sergei Golovan) * login.tcl: Added 2 options for HTTP Polling, bugfix (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: Cleanup, updated error codes, changed connid generation, added HTTP_LOG callback, more options for HTTP Polling (thanks to Sergei Golovan) * tkabber.tcl: Added HTTP_LOG callback * ckabber.tcl: Likewise * ifacetk/iroster.tcl: Bugfix (thanks to Sergei Golovan) * ifacetk/iface.tcl: Bugfix (thanks to Sergei Golovan) * chats.tcl: Added rejoining to conferences on login (thanks to Sergei Golovan) 2004-01-17 Alexey Shchepin * ifacetk/iface.tcl: Copyright update * splash.tcl: Likewise * ifacetk/iroster.tcl: Bugfix (thanks to Sergei Golovan) * ifacetk/ilogin.tcl: Bugfix (thanks to Sergei Golovan) 2004-01-14 Alexey Shchepin * plugins/chat/complete_last_nick.tcl: Minor fix (thanks to Sergei Golovan) * muc.tcl: Fixed /kick command (thanks to Sergei Golovan) * browser.tcl: Updated to latest JEP-0011 (thanks to Sergei Golovan) * plugins/iq/browse.tcl: Likewise * ifacetk/iroster.tcl: Bugfix (thanks to Sergei Golovan) 2004-01-12 Alexey Shchepin * tkabber.tcl: Bugfix 2004-01-11 Alexey Shchepin * login.tcl (client:reconnect): Bugfix * msgs/pt.msg: Updated (thanks to Miguel) 2004-01-08 Alexey Shchepin * chats.tcl: Bugfix 2004-01-07 Alexey Shchepin * plugins/windows/taskbar.tcl: Bugfix (thanks to Irek Chmielowiec) * plugins/unix/dockingtray.tcl: Likewise * browser.tcl: Fixed typos (thanks to Badlop) 2004-01-06 Alexey Shchepin * browser.tcl: Bugfix 2004-01-05 Alexey Shchepin * ifacetk/iroster.tcl: Bugfix 2004-01-04 Alexey Shchepin * pixmaps/*/services/jud.gif: New icons for JUD service (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: Added predisconnected_hook (thanks to Sergei Golovan) * roster.tcl: Interface stuff moved to ifacetk/iroster.tcl (thanks to Sergei Golovan) * ifacetk/iroster.tcl: Likewise, added roster state autosave feature * chats.tcl: Updated roster stuff * messages.tcl: Likewise * search.tcl: Likewise * ifacetk/iface.tcl: Likewise * plugins/unix/wmdock.tcl: Likewise * msgs/pt.msg: Updated (thanks to Miguel) 2004-01-03 Alexey Shchepin * doc/tkabber.xml: Updated (thanks to Badlop) 2003-12-30 Alexey Shchepin * jabberlib-tclxml/jabberlib.tcl: Use poll keys only when http polling is enabled (thanks to Sergei Golovan) * ifacetk/iface.tcl: Bugfixes (thanks to Sergei Golovan) * ifaceck/*: Updated (not completed yet) (thanks to Sergei Golovan) * userinfo.tcl: Fixed tab bindings (thanks to Sergei Golovan) * tkabber.tcl: Minor changes (thanks to Sergei Golovan) * login.tcl: Fixed types for port variables, fixed option for poll security keys (thanks to Sergei Golovan) * ifacetk/ilogin.tcl: Likewise * default.tcl: Some parts moved to ifacetk/ (thanks to Sergei Golovan) * ckabber.tcl: Updated (thanks to Sergei Golovan) * bwidget_workarounds.tcl: Moved to ifacetk/ (thanks to Sergei Golovan) * browser.tcl: Changed packing order (thanks to Sergei Golovan) * disco.tcl: Likewise 2003-12-29 Alexey Shchepin * Makefile: Updated SUBDIRS, removed "*.xrdb" from "cp" * ifacetk/iface.tcl (ifacetk::update_ssl_ind): Bugfix (thanks to Sergei Golovan) 2003-12-28 Alexey Shchepin * muc.tcl (muc::receive_list): Fixed non-translatable string * plugins/unix/dockingtray.tcl: Added check for interface (thanks to Sergei Golovan) * plugins/windows/taskbar.tcl: Likewise * plugins/iq/last.tcl: Added option for reply denying (thanks to Sergei Golovan) * plugins/iq/time.tcl: Likewise * plugins/iq/version.tcl: Likewise * plugins/general/stats.tcl: Added optional arguments to handler (thanks to Sergei Golovan) * plugins/chat/highlight.tcl: Bugfix (thanks to Sergei Golovan) * msgs/ru.msg: Updated (thanks to Sergei Golovan) * ifacetk/*: Interface for Tk (thanks to Sergei Golovan) * ifaceck/*: Interface for Ck (not completed yet) (thanks to Sergei Golovan) * tkabber.tcl: Minor changes (thanks to Sergei Golovan) * roster.tcl: Bugfix, moved updating of "show only online users" button to iface (thanks to Sergei Golovan) * muc.tcl: Added possibility for reporting of current MUC rooms on disco#items query, slightly changed muc::join (thanks to Sergei Golovan) * iq.tcl: Added option for iq request displaying in status line (thanks to Sergei Golovan) * iface.tcl: Most of stuff moved to ifacetk/ (thanks to Sergei Golovan) * login.tcl: Likewise * disco.tcl: Now possible to register nodes, added type "client" (thanks to Sergei Golovan) * default.xrdb: Moved to ifacetk/default.xrdb (thanks to Sergei Golovan) * datagathering.tcl: Added optional arguments to data::request_data (thanks to Sergei Golovan) * ckabber.tcl: Startup file for tkabber with console interface (thanks to Sergei Golovan) * chats.tcl: "chats(messages,$chatid)" and "chats(messagestome,$chatid)" are moved to iface (thanks to Sergei Golovan) * browser.tcl: Few cosmetic changes, added -connection option to browser::open, and -category and -type to for handlers (thanks to Sergei Golovan) * disco.tcl: Likewise * register.tcl: Updated disco and browse handlers * search.tcl: Likewise * userinfo.tcl: Likewise 2003-12-24 Alexey Shchepin * msgs/pl.msg: Updated (thanks to Irek Chmielowiec) 2003-12-23 Alexey Shchepin * plugins/chat/irc_commands.tcl: Plugin for IRC-like commands (/topic, /join, /leave) (thanks to Sergei Golovan) * plugins/chat/nick_command.tcl: Removed * jabberlib-tclxml/jabberlib.tcl: Added two helper functions (thanks to Sergei Golovan) * examples/teopetuk.xrdb: Updated (thanks to Sergei Golovan) * roster.tcl: Updated "roster::addline", now possible to darg'n'drop JIDs not only on group name, fixed bugs with "Undefined" and "Active Chats" groups (thanks to Sergei Golovan) * login.tcl: Changed usage of "loginconf" array (thanks to Sergei Golovan) * joingrdialog.tcl: Added options to "add_group_dialog" (thanks to Sergei Golovan) * iface.tcl: Some parts of tkabber.tcl moved here (thanks to Sergei Golovan) * login.tcl: Likewise * tkabber.tcl: Likewise * datagathering.tcl: Updated mousewheel bindings (thanks to Sergei Golovan) * messages.tcl: Likewise * plugins/general/message_archive.tcl: Likewise * chats.tcl: Removed usage of "loginconf", updated "open_to_user" (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: HTTP poll keys support (thanks to Alexander Timoshenko) * login.tcl: Likewise 2003-12-19 Alexey Shchepin * search.tcl: Bugfix (thanks to Sergei Golovan) * examples/badlop-config.tcl: Updated (thanks to Badlop) 2003-12-18 Alexey Shchepin * doc/tkabber.xml: Updated * examples/badlop-*: Updated (thanks to Badlop) * msgs/es.msg: Updated (thanks to Badlop) * msgs/ca.msg: Updated (thanks to rvalles) * plugins/chat/history.tcl: Added C-n and C-p bindings (thanks to Luis Peralta) 2003-12-13 Alexey Shchepin * bwidget_workarounds.tcl: Workaround for bwidget-1.6 (thanks to Sergei Golovan) * plugins/iq/browse.tcl: Updated to latest JEP-0011 (thanks to Sergei Golovan) * plugins/general/rawxml.tcl: Added headline template (thanks to Sergei Golovan) * msgs/ru.msg: Updated (thanks to Sergei Golovan) * utils.tcl: Fixed get_lang, updated bindscroll (thanks to Sergei Golovan) * search.tcl: Show message if search result is empty (thanks to Sergei Golovan) * register.tcl: Added window destroying (thanks to Sergei Golovan) * muc.tcl: Slightly changed items edit dialog, added mousewheel bindings (thanks to Sergei Golovan) * messages.tcl: Changed customization of options(headlines,multiple) (thanks to Sergei Golovan) * login.tcl: Minor interface changes (thanks to Sergei Golovan) * datagathering.tcl: Added registration in browser (thanks to Sergei Golovan) * custom.tcl: Added "radio" variable type (thanks to Sergei Golovan) * chats.tcl: Default message type now can be specified via customization interface (thanks to Sergei Golovan) * chats.tcl: Removed repeated code (thanks to Sergei Golovan) * gpgme.tcl: Likewise * messages.tcl: Likewise * roster.tcl: Likewise * utils.tcl: Likewise * browser.tcl: Minor changes (thanks to Sergei Golovan) 2003-12-04 Alexey Shchepin * msgs/ca.msg: Updated (thanks to Badlop) * msgs/es.msg: Updated (thanks to Badlop) * examples/badlop-*: Updated (thanks to Badlop) * userinfo.tcl: More i18n support (thanks to Sergei Golovan) * register.tcl: Minor interface changes, more i18n support (thanks to Sergei Golovan) * login.tcl: Login window now not resizeable (thanks to Sergei Golovan) * msgs/ru.msg: Updated (thanks to Sergei Golovan) * messages.tcl: More headlines options (thanks to Sergei Golovan) * custom.tcl: Variables color now customizable via XRDB, cleanup (thanks to Sergei Golovan) * browser.tcl: Bugfix * msgs/pl.msg: Updated (thanks to Irek Chmielowiec) 2003-12-02 Alexey Shchepin * plugins/general/conferenceinfo.tcl: Bugfix (thanks to Sergei Golovan) * msgs/ru.msg: Updated (thanks to Sergei Golovan) * userinfo.tcl: Changed description of namespaces in browser/disco (thanks to Sergei Golovan) * roster.tcl: Disabled displaying of subscription state in roster popup, added definition for error presence icon (thanks to Sergei Golovan) * register.tcl: Minor changes (thanks to Sergei Golovan) * muc.tcl: Function that called from browser/disco now displays group join dialog if called for groupchat service instead of conference room (thanks to Sergei Golovan) * login.tcl: Displaying of SSL certificate warnings now optional, minor update in tls_callback (thanks to Sergei Golovan) * iface.tcl: Simplified window with SSL certificate properties, changed balloon with certificate warnings (thanks to Sergei Golovan) * emoticons.tcl: Added missed handling of "" tag (thanks to Sergei Golovan) * emoticons-tkabber/icondef.xml: Updated (thanks to Sergei Golovan) * disco.tcl: Added "disco#items" handler, added icons for gateway, directory and headline categories (thanks to Sergei Golovan) * datagathering.tcl: Added better titles for registered fields, removed label "Instructions" (thanks to Sergei Golovan) * browser.tcl: Added headline icon (thanks to Sergei Golovan) 2003-11-29 Alexey Shchepin * filetransfer.tcl: Bugfix * aniemoteicons/: Imported modified "anigif" package (thanks to Sergei Golovan) * tkabber.tcl: Added loading of anigif * Makefile: Updated 2003-11-26 Alexey Shchepin * plugins/general/presenceinfo.tcl: Bugfix (thanks to Sergei Golovan) * roster.tcl: Now possible to display subscription in popup balloons, changed displying of conference participants lists (thanks to Sergei Golovan) * messages.tcl: Minor optimization (thanks to Sergei Golovan) * filetransfer.tcl: Assume that file sended using binary encoding, added processing of socket write errors (thanks to Sergei Golovan) * custom.tcl: Bugfix (thanks to Sergei Golovan) * emoticons.tcl: Slightly changed emoticons inserting, added support for latest JEP-0038 (thanks to Sergei Golovan) * chats.tcl: Likewise * emoticons-tkabber/icondef.xml: Updated 2003-11-21 Alexey Shchepin * messages.tcl (message::show_dialog): Bugfix 2003-11-20 Alexey Shchepin * login.tcl: Fixed error on autologin with SSL, added option for CA file, fixed type of loginconf(sslcertfile) option (thanks to Paul Argentoff) 2003-11-17 Alexey Shchepin * plugins/general/presenceinfo.tcl: Fixed regsub usage (thanks to Marshall T. Rose) * jabberlib-tclxml/jabberlib.tcl: Use logging rather that puts to stdout (thanks to Marshall T. Rose) * examples/mtr-config.tcl: Updated (thanks to Marshall T. Rose) * login.tcl: Additional instrumentation added to let users decide what to do when ssl is concerned about the cert (thanks to Marshall T. Rose) * gpgme.tcl: The heuristic used to decide whether to encrypt didn't take into account if we were sending to a groupchat (it would decide to use the key associated with one of the partipants) (thanks to Marshall T. Rose) * gpgme.tcl: There was a race condition with respect to setting ascii armor. In some cases, it was possible to send encrypted data in binary, instead (thanks to Marshall T. Rose) * gpgme.tcl: The balloon help indentation was off for email (thanks to Marshall T. Rose) 2003-11-16 Alexey Shchepin * chats.tcl (chat::open_to_user): Now raise tabs * roster.tcl: Added optional active chats group * chats.tcl (chat::close_window): Added close_chat_post_hook hook 2003-11-12 Alexey Shchepin * login.tcl: New option to make tkabber to retry to connect indefinitely, better message dialog when connect failed (thanks to Jan Hudec) * roster.tcl: Code from roster_nested.tcl moved here, few fixes, added "Show offline users" group menu (thanks to Sergei Golovan) * roster_nested.tcl: Removed (thanks to Sergei Golovan) 2003-11-08 Alexey Shchepin * msgs/pl.msg: Updated (thanks to Irek Chmielowiec) * plugins/chat/highlight.tcl: Plugin for highlighting words in groupchat messages (thanks to Sergei Golovan) * plugins/chat/draw_timestamp.tcl: Another timestamp for delayed messages is introduced (thanks to Sergei Golovan) * msgs/ru.msg: Updated (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: Set status to "Waiting for roster" while requesting roster (thanks to Sergei Golovan) * userinfo.tcl: Bugfix for showing signed presence (thanks to Sergei Golovan) * roster_nested.tcl: Bugfix for incorrect processing of users with multiple resources, new option "Default nested group delimiter" (thanks to Sergei Golovan) * roster.tcl: Showing online users, transport icons, user transport icons now is configurable via Customize interface (thanks to Sergei Golovan) * joingrdialog.tcl: Makes -nick option optional (if it is unspecified, [get_group_nick] is used) (thanks to Sergei Golovan) * hooks.tcl: Bugfix (thanks to Sergei Golovan) * custom.tcl: Bugfix (thanks to Sergei Golovan) 2003-11-07 Alexey Shchepin * login.tcl: Login dialog now have SASL tab when TclSASL is available * jabberlib-tclxml/jabberlib.tcl: Updated SASL authentication 2003-11-06 Alexey Shchepin * plugins/chat/completion.tcl: Bugfix (thanks to Sergei Golovan) 2003-11-04 Alexey Shchepin * presence.tcl: Minor fix (thanks to Sergei Golovan) * msgs/pt.msg: Updated (thanks to Miguel) * plugins/chat/draw_info.tcl: Now info messages have emoticons and clickable URLs (thanks to Sergei Golovan) * plugins/chat/completion.tcl: If after completion at the end of input Return is pressed, then completion suffix is removed from message (thanks to Sergei Golovan) * msgs/ru.msg: Updated (thanks to Sergei Golovan) * msgs/ua.msg: Likewise * roster.tcl: Better indentation in conference popup window (thanks to Sergei Golovan) * utils.tcl: Changed function "check_message" (thanks to Sergei Golovan) * iface.tcl: Updated for new "check_message" function (thanks to Sergei Golovan) * sound.tcl: Likewise * plugins/chat/complete_last_nick.tcl: Likewise * plugins/chat/draw_normal_message.tcl: Likewise * gpgme.tcl: Aligned mail addresses in key description (thanks to Sergei Golovan) * chats.tcl: User status description now displayed in popup window (thanks to Sergei Golovan) * browser.tcl: Tab window renamed to "Browser" instead of "JBrowser" (thanks to Sergei Golovan) 2003-11-01 Alexey Shchepin * msgs/ru.msg: Updated (thanks to Sergei Golovan) * presence.tcl: Now is always present when GPG is enabled, added information about signed presence in popup window (thanks to Sergei Golovan) * gpgme.tcl: Likewise * plugins/general/presenceinfo.tcl: Likewise * chats.tcl: Fixed status displaying in chat windows (thanks to Sergei Golovan) 2003-10-30 Alexey Shchepin * msgs/ua.msg: Updated (thanks to Vladimir N. Velychko) * plugins/chat/complete_last_nick.tcl: Better behaviour (thanks to Sergei Golovan) * msgs/ru.msg: Updated (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: Bugfix (thanks to Sergei Golovan) * browser.tcl: Added error handling (thanks to Sergei Golovan) 2003-10-26 Alexey Shchepin * msgs/ca.msg: Updated (thanks to Ager) * msgs/es.msg: Updated (thanks to Badlop) * examples/badlop-*: Updated (thanks to Badlop) * sounds/psi/: New sound theme (thanks to Badlop) 2003-10-22 Alexey Shchepin * msgs/ru.msg: Updated (thanks to Sergei Golovan) * presence.tcl: Support for changing of presence priority (thanks to Sergei Golovan) * iface.tcl: Likewise * plugins/general/autoaway.tcl: Likewise 2003-10-20 Alexey Shchepin * msgs/ru.msg: Updated (thanks to Sergei Golovan) * messages.tcl: Updated headline forwarding (thanks to Sergei Golovan) * login.tcl: Slightly changed interface, added bindings for C-PgUp and C-PgDown (thanks to Sergei Golovan) 2003-10-19 Alexey Shchepin * plugins/iq/version.tcl: Added support for PLD Linux * messages.tcl: Added history for message destinations * tkabber.tcl: Added command line options -chat, -message and -conference * xmppmime.tcl: Bugfix 2003-10-17 Alexey Shchepin * tkabber.tcl: Added support for command line options -user, -password, -resource, -port and -autologin 2003-10-15 Alexey Shchepin * plugins/iq/version.tcl (guess_linux_distribution): Added support for ASPLinux (thanks to Alexandr Kanevskiy) 2003-10-13 Alexey Shchepin * browser.tcl: Removed Conference-v2 support * chats.tcl: Likewise * joingrdialog.tcl: Likewise * plugins/chat/nick_command.tcl: Likewise * iface.tcl: Minor change (thanks to Sergei Golovan) * login.tcl: Added support for HTTP Polling (JEP-0025) (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: Likewise * plugins/general/httpconn.tcl: Obsoleted * joingrdialog.tcl (ecursor_entry): Removed selection on FocusIn event (thanks to Sergei Golovan) * utils.tcl: Added Spinbox function (thanks to Sergei Golovan) * custom.tcl: Now uses Spinbox function (thanks to Sergei Golovan) * bwidget_workarounds.tcl: Now selected tree items can be copied via X selection (or clipboard on Windows) (thanks to Sergei Golovan) * messages.tcl: Likewise 2003-10-12 Alexey Shchepin * msgs/pt.msg: Updated (thanks to Miguel) * msgs/de.msg: Updated (thanks to Stephan Dietl) * roster.tcl (roster::send_users): Replaced "jabber:" with "xmpp:" (thanks to Sergei Golovan) * plugins/chat/info_commands.tcl: Fixed typos (thanks to Sergei Golovan) * msgs/ru.msg: Fixed typos (thanks to Sergei Golovan) 2003-10-08 Alexey Shchepin * msgs/eu.msg: New basque translation (thanks to Ibon Irijoa) 2003-10-07 Alexey Shchepin * plugins/chat/info_commands.tcl: Better behaviour (thanks to Sergei Golovan) * plugins/chat/logger.tcl: Fixed behaviour on resizing window (thanks to Sergei Golovan) * plugins/iq/version.tcl: Now tries to guess linux distribution (thanks to Sergei Golovan) 2003-10-04 Alexey Shchepin * jabberlib-tclxml/jabberlib.tcl (jlib::sasl_callback): Now convert values to utf-8 2003-10-03 Alexey Shchepin * chats.tcl: Added option for enabling/disabling of displaying of user status description in chat windows 2003-10-01 Alexey Shchepin * examples/badlop-*: New config example (thanks to Badlop) * msgs/es.msg: Updated (thanks to Badlop) * userinfo.tcl: Slightly changed behaviour in edit photo tab (thanks to Sergei Golovan) * messages.tcl: Bugfix (thanks to Sergei Golovan) 2003-09-27 Alexey Shchepin * msgs/pl.msg: Updated (thanks to Irek Chmielowiec) * msgs/pl.rc: Likewise * pixmaps/default/services/(gg|weather)_*.gif: New icons for Gadu-Gadu and WeatherAgent (thanks to Irek Chmielowiec) * browser.tcl: Likewise * disco.tcl: Likewise * roster.tcl: Likewise * messages.tcl: Fixed X selection in headlines window (thanks to Sergei Golovan) * doc/tkabber.xml: Added note about winico (thanks to Sergei Golovan) 2003-09-24 Alexey Shchepin * jabberlib-tclxml/jabberlib.tcl: Wait for features element before session initiation * msgs/pt.msg: New portuguese translation (thanks to Miguel) 2003-09-20 Alexey Shchepin * pixmaps/gnome/*/*.(gif|xpm): Updated (thanks to Sergei Golovan) * pixmaps/default/browser/glade-message.gif: Updated (thanks to Sergei Golovan) * examples/*.xrdb: Updated (thanks to Sergei Golovan) * msgs/ru.msg: Updated (thanks to Sergei Golovan) * messages.tcl: Various enhancements (thanks to Sergei Golovan) * itemedit.tcl: Fixed case when nick in vCard is emtpy (thanks to Sergei Golovan) * tkabber.tcl: Minor change in loading order (thanks to Sergei Golovan) * default.tcl: Configuring of bold and italic fonts moved here (thanks to Sergei Golovan) * chats.tcl: Likewise * bwidget_workarounds.tcl: Added bindings for C-button1 to select subtree (thanks to Sergei Golovan) * balloon.tcl: Added options -aspect and -width for balloon window (thanks to Sergei Golovan) * messages.tcl (message::show_subscribe_dialog): Bugfix (thanks to Sergei Golovan) 2003-09-18 Alexey Shchepin * presence.tcl (clear_presence_info): Bugfix * chats.tcl: Show status description in chat windows (thanks to Jacek Konieczny) * jabberlib-tclxml/jabberlib.tcl: Fixed tag name in session request (thanks to Jacek Konieczny) * presence.tcl: Don't send status if user didn't enter custom status (thanks to Jacek Konieczny) * roster.tcl: Send presence subscribe when adding user to roster (thanks to Sergei Golovan) * messages.tcl: Fixed bug that appear on Return key press in headlines window (thanks to Sergei Golovan) * itemedit.tcl: Lookup vCard for nick (thanks to Sergei Golovan) * iface.tcl: Interval between tkabber gets focus and redraws tab title now customizable (thanks to Sergei Golovan) * chats.tcl: Minor fix (thanks to Sergei Golovan) * bwidget_workarounds.tcl: Fixed bug with key scrolling in Tree widget (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: Processing of "roster push" according to XMPP-IM (thanks to Sergei Golovan) 2003-09-09 Alexey Shchepin * examples/mtr-config.tcl: Updated (thanks to Marshall T. Rose) * jabberlib-tclxml/jabberlib.tcl: Updated version number (thanks to Marshall T. Rose) * xmppmime.tcl: Likewise * jabberlib-tclxml/pkgIndex.tcl: Likewise * plugins/general/rawxml.tcl: Now don't scroll text when scrollbar is not in lower position (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: Fixed some typos, updated error list (thanks to Sergei Golovan) * plugins/general/message_archive.tcl: Fixed typo (thanks to Sergei Golovan) * roster.tcl (roster::addline): Bugfix (thanks to Sergei Golovan) 2003-09-06 Alexey Shchepin * msgs/ru.msg: Updated (thanks to Sergei Golovan) * jabberlib-tclxml/jabberlib.tcl: Support for JEP-0078 (thanks to Sergei Golovan) * iface.tcl: Likewise * login.tcl: Likewise 2003-09-01 Alexey Shchepin * plugins/general/rawxml.tcl: Added "clear" button (thanks to Dendik N.F.) 2003-08-21 Alexey Shchepin * msgs/ru.msg: Updated (thanks to Sergei Golovan) * chats.tcl: Fixed scrolling when "smart scroll" option enabled (thanks to Sergei Golovan) * plugins/chat/info_commands.tcl: More powrful and customizable /vcard command (thanks to Sergei Golovan) * custom.tcl: Added option type "list" (thanks to Sergei Golovan) 2003-08-20 Alexey Shchepin * msgs/pl.msg: Updated (thanks to Irek Chmielowiec) * msgs/pl.rc: Likewise * msgs/pl.msg: Now really commited (sorry) (thanks to Irek Chmielowiec) * msgs/pl.rc: Likewise 2003-08-18 Alexey Shchepin * privacy.tcl: Allow to edit list if error occured while receiving list from server 2003-08-16 Alexey Shchepin * userinfo.tcl: Fixed emphasizing (thanks to Sergei Golovan) * messages.tcl: Likewise * plugins/general/message_archive.tcl: Likewise * examples/mtr-config.tcl: Updated (thanks to Marshall T. Rose) 2003-08-15 Alexey Shchepin * plugins/chat/logger.tcl: Bugfixes 2003-08-13 Alexey Shchepin * roster.tcl (roster::draginitcmd): Bugfix (thanks to Michail Litvak) * plugins/chat/logger.tcl: History now separated by months. Added "export to XHTML" feature 2003-08-12 Alexey Shchepin * plugins/chat/info_commands.tcl: Added /vcard command, better handling of other commands (thanks to Sergei Golovan) * plugins/chat/draw_info.tcl: Plugin for drawing "info" messages inside chat windows (thanks to Sergei Golovan) * chats.tcl: Added XRDB resource for "info" message (thanks to Sergei Golovan) * info.tcl: Added level for "info" messages in alert_lvls (thanks to Sergei Golovan) * muc.tcl: Changed type for "whois" message to info (thanks to Sergei Golovan) * plugins/chat/history.tcl: Changed hook priority to better insert commands in history (thanks to Sergei Golovan) * plugins/chat/exec_command.tcl: Likewise * plugins/chat/info_commands.tcl: Likewise 2003-08-07 Alexey Shchepin * chats.tcl (chat::change_presence): Fixed bug with presence processing of users without resources (like ICQ contacts) * plugins/chat/info_commands.tcl: New plugin for /time, /last and /version (thanks to Sergei Golovan) 2003-08-04 Alexey Shchepin * msgs/ru.msg: Updated (thanks to Sergei Golovan) * iface.tcl: Workaround for processing of elided text regions for x-selection, various minor changes (thanks to Sergei Golovan) * gpgme.tcl: Change cursor for GPG label (thanks to Sergei Golovan) * **/*.xrdb: Updated (thanks to Sergei Golovan) * chats.tcl: Now possible to switch emphasizing (thanks to Sergei Golovan) * browser.tcl: Minor changes (thanks to Sergei Golovan) * sound.tcl: Likewise * splash: Likewise 2003-08-03 Alexey Shchepin * privacy.tcl: Partially updated to latest XMPP-IM 2003-07-31 Alexey Shchepin * roster_nested.tcl: Bugfix * examples/tools/jsend.tcl: Now able to do groupchat (thanks to Marshall T. Rose) * examples/mtr-config.tcl: Updated (thanks to Marshall T. Rose) * examples/*.xrdb: Added colors for gpg label (thanks to Sergei Golovan) * gpgme.tcl: Changed format of popup balloon to better look with proportionally-spaced fonts (thanks to Sergei Golovan) 2003-07-28 Alexey Shchepin * plugins/unix/dockingtray.tcl (dockingtray::load): Fixed absence of ::msgscat::mc in Presence menu * msgs/pl.msg: New polish translation (thanks to Irek Chmielowiec) * msgs/pl.rc: Likewise * msgs/ro.msg: Updated (thanks to Adrian Rapa) 2003-07-24 Alexey Shchepin * msgs/ro.msg: Updated (thanks to Adrian Rapa) 2003-07-22 Alexey Shchepin * examples/mtr-config.tcl: Updated (thanks to Marshall T. Rose) 2003-07-21 Alexey Shchepin * presence.tcl (clear_presence_info): Added clearing of missed presence array elements * muc.tcl (muc::process_unavailable): Process unavailable status 2003-07-19 Alexey Shchepin * chats.tcl: Slightly better emphasizing * custom.tcl (custom::defvar): Added -command menu for tracing variable 2003-07-15 Alexey Shchepin * bwidget_workarounds.tcl: Fixed calls to "eval" * gpgme.tcl: Show info when mouse over "signed" icon (thanks to Marshall T. Rose) * plugins/chat/draw_signed.tcl: Likewise 2003-07-14 Alexey Shchepin * msgs/fr.msg: Updated (thanks to Vincent Ricard) * contrib/extract-translations/extract.tcl: Updated (thanks to Vincent Ricard) * iface.tcl: Added SSL sertificate properties window, fixed race condition in SSL indicator processing (thanks to Sergei Golovan) 2003-07-11 Alexey Shchepin * utils.tcl (check_message): New function for checking that message addressed directly to user (thanks to Sergei Golovan) * plugins/chat/draw_normal_message.tcl: Use check_message (thanks to Sergei Golovan) * sound.tcl: Likewise * iface.tcl: Likewise 2003-07-10 Alexey Shchepin * login.tcl (client:reconnect): Fixed * jabberlib-tclxml/jabberlib.tcl: Better connid choosing * login.tcl (login): Pass username to jlib::connect * jabberlib-tclxml/jabberlib.tcl: Fixed usage of parse_end variable 2003-07-09 Alexey Shchepin * plugins/chat/draw_normal_message.tcl: Fixed regexp * iface.tcl: Added option for customizing displaying of number of unreaded messages in tab titles (thanks to Sergei Golovan) * datagathering.tcl: Added "wm iconname" command (thanks to Sergei Golovan) * plugins/chat/logger.tcl: Likewise * iface.tcl: Likewise * login.tcl: Likewise * messages.tcl: Likewise * muc.tcl: Likewise * register.tcl: Likewise * search.tcl: Likewise * userinfo.tcl: Likewise 2003-07-07 Alexey Shchepin * muc.tcl: Fixed MUC commands (/whois, /kick, /ban, etc...) * plugins/unix/wmdock.tcl: Fixed (thanks to Michail Litvak) * plugins/general/rawxml.tcl: Added "templates" button 2003-07-05 Alexey Shchepin * iface.tcl: Fixed SSL indicator, added displaying of amount of unreaded messages in tabs (thanks to Sergei Golovan) * chats.tcl: Likewise * login.tcl: Likewise * default.xrdb: Changed some colors (thanks to Sergei Golovan) * roster.tcl: Likewise * browser.tcl: Likewise * disco.tcl: Likewise * search.tcl: Bugfix, now works correctly with bwidget-1.6 (thanks to Sergei Golovan) 2003-07-04 Alexey Shchepin * jabberlib-tclxml/tclxml/tclparser-8.1.tcl: CR LF replaced to LF 2003-07-03 Alexey Shchepin * plugins/chat/draw_xhtml_message.tcl: Added support for
    ,
      ,
    1. , and
       tags
      
      	* jabberlib-tclxml/jabberlib.tcl: Fix in out_keepalive (thanks to
      	Sergei Golovan)
      
      	* plugins/chat/draw_normal_message.tcl: Highlight "2mynick:"
      	(thanks to Sergei Golovan)
      
      	* sound.tcl: New option "notify_online", fixed processing of
      	groupchat server messages, message that begins with "2mynick:"
      	also considered as addressed to user (thanks to Sergei Golovan)
      
      	* jabberlib-tclxml/: Fixed loading of tclxml (thanks to Sergei
      	Golovan)
      
      	* chats.tcl (chat::is_our_jid): Minor cleanup
      
      	* plugins/chat/nick_command.tcl: Bugfix
      
      	* jabberlib-tclxml/jabberlib.tcl: Fixed remote roster modification
      	bug
      
      2003-07-02  Alexey Shchepin  
      
      	* plugins/chat/draw_xhtml_message.tcl: XHTML support (JEP-0071)
      	(not completed yet: no lists, most of style properties not
      	supported), disabled by default
      
      	* plugins/general/rawxml.tcl (rawxml::send_xml): Minor fix
      
      	* msgs/es.msg: Updated (thanks to Luis Peralta)
      	* msgs/ca.msg: Likewise
      
      2003-06-30  Alexey Shchepin  
      
      	* disco.tcl: Dragging from disco now works
      
      	* jabberlib-tclxml/jabberlib.tcl: Fixes in disconnection
      	processing
      
      	* jabberlib-tclxml/jabberlib.tcl (jlib::error_to_list): Small fix
      
      	* muc.tcl: Better support for multiple logins
      
      	* iface.tcl: Removed default placement of main window
      
      2003-06-29  Alexey Shchepin  
      
      	* jabberlib-tclxml/jabberlib.tcl: Updated error codes to confirm
      	latest xmpp-core (thanks to Sergei Golovan)
      	* avatars.tcl: Likewise
      	* filetransfer.tcl: Likewise
      	* iq.tcl: Likewise
      	* negotiate.tcl: Likewise
      	* utils.tcl: Likewise
      	* plugins/general/conferenceinfo.tcl: Likewise
      	* plugins/iq/last.tcl: Likewise
      
      	* roster.tcl: Updated roster import/export
      
      2003-06-28  Alexey Shchepin  
      
      	* doc/tkabber.xml: Fix in installation section
      
      2003-06-27  Alexey Shchepin  
      
      	* roster_nested.tcl: Works again
      
      	* iface.tcl: Better X-selection support (thanks to Sergei Golovan)
      
      	* chats.tcl (chat::close_window): Minor fix
      	* chats.tcl (chat::open_window): Likewise
      
      	* presence.tcl (client:presence): Remember unavailable status for
      	users
      
      	* muc.tcl (muc::join): Fixed typo
      
      2003-06-26  Alexey Shchepin  
      
      	* plugins/iq/last.tcl: New plugins for replying on iq:last queries
      	(thanks to Sergei Golovan)
      
      	* plugins/general/autoaway.tcl: Variable "idle_command" is now
      	global (thanks to Sergei Golovan)
      
      	* jabberlib-tclxml/jabberlib.tcl: Added functions for creating
      	error elements (thanks to Sergei Golovan)
      
      	* presence.tcl (client:presence): Cleanups
      
      	* presence.tcl (check_signature): Fixed
      
      	* gpgme.tcl (ssj::encrypted:output): Fixed
      
      	* plugins/general/conferenceinfo.tcl: Fixed
      
      	* examples/mtr-config.tcl: Updated (thanks to Marshall T. Rose)
      
      	* jabberlib-tclxml/jabberlib.tcl: Updated version (thanks to
      	Marshall T. Rose)
      
      2003-06-25  Alexey Shchepin  
      
      	* chats.tcl: Invitations fixes
      
      	* presence.tcl (clear_presence_info): Fixed
      
      	* roster.tcl: Fixed contacts sending dialog
      
      2003-06-24  Alexey Shchepin  
      
      	* (all): More multi-logins support and fixes.  Now most of
      	features should work
      
      2003-06-23  Alexey Shchepin  
      
      	* (all): More multi-logins support and fixes
      
      2003-06-22  Alexey Shchepin  
      
      	* (all): More multi-logins support, many things works again
      
      2003-06-21  Alexey Shchepin  
      
      	* (all): More multi-logins support.  Not completed yet, many
      	things are broken, better to use 0.9.5beta until it will be
      	completed
      
      	* default.xrdb: Changed default font
      
      2003-06-19  Alexey Shchepin  
      
      	* roster.tcl: More support for multiple logins
      	* presence.tcl: Likewise
      
      	* chats.tcl: Fixed bug with jid with spaces in invitation code
      
      	* jabberlib-tclxml/jabberlib.tcl: Pass connid to client:presence
      
      2003-06-18  Alexey Shchepin  
      
      	* presence.tcl (get_jid_of_user): Performance improvements
      
      	* roster.tcl (roster::find_jid): Performance improvements
      
      	* roster.tcl: Fixed collapsed groups handling
      	* roster_nested.tcl: Likewise
      
      2003-06-17  Alexey Shchepin  
      
      	* roster_nested.tcl: Updated to work with multiple connections
      
      	* roster.tcl: roster::group_doubleclick renamed to
      	roster::group_click
      
      	* contrib/extract-translations/extract.tcl: Useful tool to find
      	untranslated messages (thanks to Vincent Ricard)
      
      2003-06-16  Alexey Shchepin  
      
      	* examples/mtr-config.tcl: Updated (thanks to Marshall T. Rose)
      
      	* chats.tcl: Updated invitation to conferences (thanks to Sergei
      	Golovan)
      	* messages.tcl: Likewise
      	* muc.tcl: Likewise
      	* roster.tcl: Likewise
      	* msgs/ru.msg: Updated (thanks to Sergei Golovan)
      
      	* chats.tcl: Don't include  inside subject changing
      	messages and properly display such messages (thanks to Sergei
      	Golovan)
      	* msgs/ru.msg: Updated (thanks to Sergei Golovan)
      
      	* (all): Basic support for several simultaneous logins (not fully
      	completed yet)
      
      2003-06-08  Alexey Shchepin  
      
      	* filetransfer.tcl: Enhancements in file transfer (thanks to
      	Sergei Golovan)
      
      2003-06-07  Alexey Shchepin  
      
      	* iface.tcl: Added SSL indicator (thanks to Sergei Golovan)
      	* login.tcl: Likewise
      	* msgs/ru.msg: Updated (thanks to Sergei Golovan)
      
      	* messages.tcl: Changed handling of x:data
      
      	* doc/tkabber.xml: Updated
      
      	* jabberlib-tclxml/jabberlib.tcl: SASL support updated to
      	xmpp-core-13
      
      2003-06-04  Alexey Shchepin  
      
      	* sound.tcl (sound::play): Fixed starting of external play program
      	(thanks to Michail Litvak)
      
      	* search.tcl: Change mouse cursor when waiting for results (thanks
      	to Sergei Golovan)
      
      	* utils.tcl: New function "bindscroll" to add mousewheel bindings
      	to windows (thanks to Sergei Golovan)
      	* chats.tcl: Now uses "bindscroll" (thanks to Sergei Golovan)
      	* gpgme.tcl: Likewise
      	* roster.tcl: Likewise
      
      2003-06-03  Alexey Shchepin  
      
      	* msgs/fr.msg: Updated (thanks to Vincent Ricard)
      
      2003-06-02  Alexey Shchepin  
      
      	* msgs/fr.msg: Updated (thanks to Vincent Ricard)
      
      2003-06-01  Alexey Shchepin  
      
      	* joingrdialog.tcl: Added options to "join_group_dialog" function
      	(thanks to Sergei Golovan)
      	* roster.tcl: Use new interface to "join_group_dialog" (thanks to
      	Sergei Golovan)
      	* browser.tcl: Likewise
      
      	* sound.tcl: Added option for setting parameters for external play
      	program (thanks to Michail Litvak)
      
      2003-05-31  Alexey Shchepin  
      
      	* jabberlib-tclxml/jabberlib.tcl: Updated SASL namespace
      
      2003-05-30  Alexey Shchepin  
      
      	* userinfo.tcl: Now  inside description text widget works
      	correctly
      
      2003-05-29  Alexey Shchepin  
      
      	* userinfo.tcl: Added descriptions to disco features
      
      	* disco.tcl (disco::browser::add_line): Reconfigure item if
      	description was changed
      
      	* plugins/chat/completion.tcl: Now completions can work in private
      	chats
      
      2003-05-24  Alexey Shchepin  
      
      	* datagathering.tcl: Now possible to set x:data windows geometry
      	via XRDB (using XData.geometry)
      
      2003-05-23  Alexey Shchepin  
      
      	* chats.tcl: Support for chat messages emphasize (e.g. *bold*,
      	/slanted/, _underlined_) (thanks to Vincent Ricard)
      
      2003-05-22  Alexey Shchepin  
      
      	* roster.tcl (roster::process_item): Bugfix for previous bugfix
      
      2003-05-21  Alexey Shchepin  
      
      	* roster.tcl: Fixed bug with roster icons (thanks to Tomas
      	Ebenlendr)
      
      	* tkabber.tcl: Removed superfluous jabberlib loading
      
      2003-05-20  Alexey Shchepin  
      
      	* xmppmime.tcl: Support for JEP-0081 (XMPP/Jabber MIME Type) (not
      	well tested yet)
      	* tkabber.tcl: Support for "-mime file" option for loading of mime
      	file
      
      2003-05-18  Alexey Shchepin  
      
      	* roster_nested.tcl: Support for nested roster groups (JEP-0083)
      	(currently only "::" separator supported)
      	* roster.tcl: Likewise
      
      2003-05-17  Alexey Shchepin  
      
      	* msgs/ru.msg: Updated (thanks to Sergei Golovan)
      
      	* disco.tcl: Added registration of disco namespaces in browser
      	(thanks to Sergei Golovan)
      	* muc.tcl: Likewise for conferences
      	* register.tcl: Likewise for jabber:iq:register
      	* search.tcl: Likewise for jabber:iq:search
      	* userinfo.tcl: Likewise for vcard-temp, iq:time, iq:last and
      	iq:version
      
      	* browser.tcl: Added interface to register functions for browser
      	namespaces (thanks to Sergei Golovan)
      
      2003-05-15  Alexey Shchepin  
      
      	* muc.tcl: Added registration of MUC disco feature
      
      	* disco.tcl: Changed register_feature_handler interface, added
      	description of features
      	* plugins/general/stats.tcl: Updated
      	* datagathering.tcl: Likewise
      
      2003-05-14  Alexey Shchepin  
      
      	* plugins/chat/events.tcl: Added translations for events
      	* msgs/ru.msg: Likewise
      
      	* chats.tcl: Added translations for room roster groups
      	* msgs/ru.msg: Likewise
      
      2003-05-13  Alexey Shchepin  
      
      	* msgs/es.msg: Updated (thanks to Luis Peralta)
      	* msgs/ca.msg: Likewise
      
      2003-05-12  Alexey Shchepin  
      
      	* utils.tcl: Updated error list, added function error_to_list
      	(thanks to Sergei Golovan)
      
      	* msgs/*.msg: Updated (thanks to Sergei Golovan)
      
      	* plugins/general/conferenceinfo.tcl: Support for discovering
      	(thanks to Sergei Golovan)
      
      	* iface.tcl: More translations (thanks to Sergei Golovan)
      	* plugins/chat/logger.tcl: Likewise
      	* plugins/general/stats.tcl: Likewise
      
      2003-05-11  Alexey Shchepin  
      
      	* login.tcl: Slightly changed behaviour (thanks to Sergei Golovan)
      
      	* joingrdialog.tcl: Updated history processing (thanks to Sergei
      	Golovan)
      
      	* browser.tcl: Added history to entries (thanks to Sergei Golovan)
      	* disco.tcl: Likewise
      	* userinfo.tcl: Likewise
      
      	* bwidget_workarounds.tcl: Fixed behaviour for non-unix systems
      	(thanks to Sergei Golovan)
      
      	* examples/*.xrdb: Updated (thanks to Sergei Golovan)
      
      2003-05-10  Alexey Shchepin  
      
      	* plugins/general/conferenceinfo.tcl: Use error_to_string to show
      	error
      
      2003-05-09  Alexey Shchepin  
      
      	* joingrdialog.tcl: Entries replaced with combo boxes with
      	history (thanks to Sergei Golovan)
      
      	* custom.tcl: Added support for hidden groups (thanks to Sergei
      	Golovan)
      
      	* bwidget_workarounds.tcl: Fixed support of -highlightthickness in
      	ComboBox (thanks to Sergei Golovan)
      
      	* examples/*.xrdb: Updated (thanks to Sergei Golovan)
      	* default.xrdb: Likewise
      
      	* userinfo.tcl: Open user info window on pressing on iq:time,
      	iq:last and iq:version features in disco window
      
      2003-05-06  Alexey Shchepin  
      
      	* chats.tcl: Update tab titles on roster events (thanks to Sergei
      	Golovan)
      	* roster.tcl: Likewise
      	* iface.tcl: Likewise
      
      	* examples/*.xrdb: Updated (thanks to Sergei Golovan)
      
      	* examples/dark2.xrdb: New theme (thanks to Sergei Golovan)
      
      	* balloon.tcl: Fixed balloon positioning (thanks to Sergei
      	Golovan)
      
      	* pixmaps/default/tkabber/mainlogo.gif: Better look on dark
      	background (thanks to Sergei Golovan)
      
      2003-05-03  Alexey Shchepin  
      
      	* plugins/chat/events.tcl (events::process_x_event): Bugfix with
      	sending of unneeded event when message haven't 
      	element
      
      2003-05-02  Alexey Shchepin  
      
      	* login.tcl: Request roster before sending first presence
      
      	* plugins/unix/dockingtray.tcl: Add "Quit" and "Log out with
      	reason..." menu to tray menu (thanks to Roger Sondermann)
      	* plugins/windows/taskbar.tcl: Likewise
      
      2003-05-01  Alexey Shchepin  
      
      	* avatars.tcl: Bugfix
      
      2003-04-28  Alexey Shchepin  
      
      	* chats.tcl: Added recognizing of https:// in URL regexp
      
      2003-04-17  Alexey Shchepin  
      
      	* register.tcl: Handle error reply
      
      2003-04-16  Alexey Shchepin  
      
      	* plugins/chat/draw_timestamp.tcl: Timestamp format now
      	customizable
      
      	* custom.tcl: Append subgroups in the end of the list
      
      	* plugins/chat/logger.tcl: Path to logs directory now
      	customizable, added options for disabling private and group chats
      
      2003-04-15  Alexey Shchepin  
      
      	* doc/tkabber.html: Updated
      
      2003-04-14  Alexey Shchepin  
      
      	* filters.tcl: Filters dialog creation moved to filters::recv,
      	added handling of error result
      
      2003-04-13  Alexey Shchepin  
      
      	* filters.tcl: Workaround for bug with filters dialog (it not
      	appears if ".filters draw" is called from procedure filters::recv,
      	dunno why)
      
      2003-04-10  Alexey Shchepin  
      
      	* examples/mtr-config.tcl: Updated (thanks to Marshall T. Rose)
      
      	* plugins/general/conferenceinfo.tcl: Bugfix for processing of
      	browse reply (thanks to Sergei Golovan)
      
      	* custom.tcl: Replaced "puts" with "debugmsg" (thanks to Sergei
      	Golovan)
      
      2003-04-07  Alexey Shchepin  
      
      	* tkabber.tcl (quit): Workaround for bug with "wish" which not
      	always exit (thanks to Tomas Ebenlendr)
      
      	* plugins/general/httpconn.tcl: HTTP Polling (JEP-0025) support
      	(thanks to Tomas Ebenlendr)
      
      	* pixmaps/gabber/docking/*: New docking icons for Gabber theme
      	(thanks to Roger Sondermann)
      
      	* utils.tcl: Changed stanza error namespace name due to last XMPP
      	Core changes
      
      2003-04-06  Alexey Shchepin  
      
      	* sound.tcl: Now possible to mute sound for delayed messages
      	(thanks to Denis Shaposhnikov and Sergei Golovan)
      
      	* plugins/iq/time.tcl: Workaround for Tcl bug on windows (thanks
      	to Sergei Golovan)
      
      	* chats.tcl: Autoscroll bugfix (thanks to Sergei Golovan)
      
      2003-03-27  Alexey Shchepin  
      
      	* muc.tcl (muc::request_destruction): Fixed typo
      	* muc.tcl (muc::process_gc_user): Likewise
      
      	* muc.tcl (muc::request_config): Add xml:lang attribute in config
      	request
      
      	* filetransfer.tcl: Default dir for downloaded file now
      	customizable (thanks to Vincent Ricard)
      
      2003-03-26  Alexey Shchepin  
      
      	* doc/tkabber.xml: Updated link to TclWinidle
      
      	* muc.tcl: muc::options(gen_events) now can be changed via
      	customization interface (thanks to Sergei Golovan)
      
      	* chats.tcl: Added more smart autoscroll and more customization
      	options (thanks to Sergei Golovan)
      	* iface.tcl: Menu item for "smart autoscroll" (thanks to Sergei
      	Golovan)
      
      	* plugins/chat/history.tcl: More correct cursor positioning
      	(thanks to Sergei Golovan)
      
      2003-03-25  Alexey Shchepin  
      
      	* examples/tkabber_setstatus: Script to set tkabber status (thanks
      	to Sergei Golovan)
      
      	* examples/tools/rssbot.tcl: Fix roster out-of-sync bug (thanks to
      	Marshall T. Rose)
      
      	* examples/mtr-config.tcl: Updated (thanks to Marshall T. Rose)
      
      	* chats.tcl (chat::open_window): Removed size limitations in
      	panned windows
      
      2003-03-23  Alexey Shchepin  
      
      	* chats.tcl (chat::process_message): Now use "error_to_string"
      	function for error processing
      
      	* jabberlib-tclxml/jabberlib.tcl: Support for parsing new-style
      	message errors
      
      2003-03-21  Alexey Shchepin  
      
      	* jabberlib-tclxml/jabberlib.tcl: Support for writing accept
      	components (thanks to Marshall T. Rose)
      
      	* examples/tools/jsend.tcl: Updated (thanks to Marshall T. Rose)
      
      	* examples/mtr-config.tcl: Updated (thanks to Marshall T. Rose)
      
      	* doc/tkabber.xml: Updated (thanks to Marshall T. Rose)
      
      2003-03-20  Alexey Shchepin  
      
      	* (all): Updated links to tkabber home page
      
      2003-03-18  Alexey Shchepin  
      
      	* presence.tcl: Replaced tk_dialog with MessageDlg
      
      2003-03-15  Alexey Shchepin  
      
      	* jabberlib-tclxml/jabberlib.tcl: Fixed handling of message
      	extension subelements
      
      	* jabberlib-tclxml/wrapper.tcl: Partially rewriten
      
      2003-03-13  Alexey Shchepin  
      
      	* jabberlib-tclxml/jabberlib.tcl: Fixed SASL service name ("xmpp"
      	instead of "jabber"), removed setting of ssf_external
      
      2003-03-12  Alexey Shchepin  
      
      	* examples/mtr-config.tcl: Updated (thanks to Marshall T. Rose)
      
      	* chats.tcl: Add incoming message hook (thanks to Marshall
      	T. Rose)
      
      	* browser.tcl: Added right-click to have a popup menu for browser
      	items (thanks to Marshall T. Rose)
      
      	* examples/tools/*.tcl: Updated (thanks to Marshall T. Rose)
      
      	* jabberlib-tclxml/jabberlib.tcl: SASL support fixes
      
      	* msgs/ca.msg: Catalan translation (thanks to Luis Peralta)
      
      2003-03-10  Alexey Shchepin  
      
      	* msgs/es.msg: Updated (thanks to Luis Peralta)
      
      2003-03-09  Alexey Shchepin  
      
      	* examples/tools/*: Jabber Tcl Tools updated and moved to
      	examples/tools, added HOWTO (thanks to Marshall T. Rose)
      
      	* login.tcl: Limited number of reconnections (thanks to Marshall
      	T. Rose)
      
      	* jabberlib-tclxml/jabberlib.tcl: SASL support (requires Tcl SASL
      	package, currently works at least with PLAIN mechanism)
      
      2003-03-08  Alexey Shchepin  
      
      	* jabberlib-tclxml/jabberlib.tcl: Support for receiving new-style
      	stanza errors
      	* utils.tcl: Likewise
      
      2003-03-05  Alexey Shchepin  
      
      	* examples/rssbot*: A little rssbot (thanks to Marshall T. Rose)
      
      	* examples/jbot: Invoke jsend under /etc/rc (thanks to Marshall
      	T. Rose)
      
      	* examples/jsend.tcl: Now knows about the roster (thanks to
      	Marshall T. Rose)
      
      	* messages.tcl: Don't put up balloon help on headlines missing a
      	body (thanks to Marshall T. Rose)
      
      2003-03-04  Alexey Shchepin  
      
      	* chats.tcl (chat::invite_dialog): Don't show non-groupchat tab
      	names in list (thanks to Vincent Ricard)
      
      2003-02-28  Alexey Shchepin  
      
      	* examples/jsend.tcl: Updated (thanks to Marshall T. Rose)
      
      2003-02-27  Alexey Shchepin  
      
      	* chats.tcl (chat::invite_dialog): Fixed nick evaluation
      
      	* msgs/de.msg: German translation (thanks to Stephan Dietl)
      
      2003-02-26  Alexey Shchepin  
      
      	* examples/mtr-config.tcl: Updated (thanks to Marshall T. Rose)
      
      	* chats.tcl: New hook normalize_chat_id_hook to allow modification
      	of chatid variable (thanks to Marshall T. Rose)
      
      	* msgs/ro.msg: Fixed typos (thanks to badlop)
      
      2003-02-25  Alexey Shchepin  
      
      	* jabberlib-tclxml/jabberlib.tcl: Remove fileevent script prior to
      	closing the socket when inside the fileevent script (otherwise on
      	some systems tclsh dumps core!) (thanks to Marshall T. Rose)
      
      	* examples/mtr-config.tcl: Updates (thanks to Marshall T. Rose)
      
      	* examples/jsend.tcl: Better failure recovery (thanks to Marshall
      	T. Rose)
      
      	* messages.tcl: Better "multiple" handling for headlines (thanks
      	to Marshall T. Rose)
      
      	* (all): Tkabber 0.9.4beta released
      
      	* msgs/ro.msg: Updated (thanks to Adrian Rapa)
      
      2003-02-23  Alexey Shchepin  
      
      	* datagathering.tcl: Support of jabber:iq:data namespace (which is
      	the same as jabber:x:data with allowing of using without
      	surrounding namespace and with "node" attribute)
      
      2003-02-22  Alexey Shchepin  
      
      	* plugins/general/rawxml.tcl: Fixed bug with indentation (thanks
      	to Sergei Golovan)
      
      	* gpgme.tcl: Removed unneeded "puts" (thanks to Sergei Golovan)
      
      2003-02-18  Alexey Shchepin  
      
      	* msgs/ro.msg: Updated (thanks to Adrian Rapa)
      
      2003-02-17  Alexey Shchepin  
      
      	* plugins/chat/logger.tcl: Now possible to search substrings in
      	history (thanks to Michail Litvak)
      	* iface.tcl: Likewise
      
      	* gpgme.tcl: Fixed non-modal dialogs, added option for entering
      	gpg password only once (thanks to Sergei Golovan)
      
      2003-02-16  Alexey Shchepin  
      
      	* plugins/unix/ispell.tcl: Bugfix, replaced "==" to "cequal" in
      	expressions (thanks to Marshall T. Rose)
      	* plugins/unix/menu.tcl: Likewise
      	* plugins/unix/menu8.4.tcl: Likewise
      	* plugins/unix/wmdock.tcl: Likewise
      
      	* plugins/chat/completion.tcl: Fixed bug with "%" in groupchat JID
      
      2003-02-15  Alexey Shchepin  
      
      	* default.xrdb: Explicitly define geometry of some Tkabber
      	windows (thanks to Sergei Golovan)
      	* doc/tkabber.xml: Updated (thanks to Sergei Golovan)
      
      	* muc.tcl: MUC compatibility now checked via disco
      
      	* disco.tcl: Now handlers can contain arguments
      
      2003-02-14  Alexey Shchepin  
      
      	* chats.tcl: Fixed joining of conferences with uppercase chars in
      	name
      	* joingrdialog.tcl (set_our_groupchat_nick): Likewise
      
      2003-02-13  Alexey Shchepin  
      
      	* datagathering.tcl (data::fill_field_x): Fixed bug with handling
      	x:data field without  subelement
      
      2003-02-11  Alexey Shchepin  
      
      	* messages.tcl: "To:" string now can be translated
      
      2003-02-10  Alexey Shchepin  
      
      	* userinfo.tcl: Now possible to open browser by clicking on "Web
      	Site", "Photo URL" and "About" fields (thanks to Sergei Golovan)
      
      2003-02-09  Alexey Shchepin  
      
      	* utils.tcl: New function to draw non-modal message dialogs
      	(thanks to Sergei Golovan)
      	* gpgme.tcl: Use non-modal dialogs to display errors (thanks to
      	Sergei Golovan)
      
      	* msgs/fr.msg: Added e-mail of the author
      
      2003-02-08  Alexey Shchepin  
      
      	* (all): Added emoticons and clickable URLs in normal messages,
      	fixed bug with logging of messages that not sended due to GPG
      	encryption error (thanks to Sergei Golovan)
      
      2003-02-05  Alexey Shchepin  
      
      	* messages.tcl: Workaround for Bwidget bug with long node names in
      	headlines tree (thanks to Marshall T. Rose)
      
      2003-02-04  Alexey Shchepin  
      
      	* jabberlib-tclxml/tclxml/sgmlparser.tcl: Changed requred version
      	of "uri" from 1.1 to 1.0 (thanks to Sergei Golovan)
      
      	* jabberlib-tclxml/jabberlib.tcl: Fixed processing of
      	"use_external_tclxml" option for tcl8.4 (thanks to Sergei Golovan)
      
      2003-02-03  Alexey Shchepin  
      
      	* msgs/fr.msg: French translation (thanks to Vincent Ricard)
      
      	* login.tcl (connected): Changed main window title (thanks to
      	Michal Bozon)
      
      2003-02-01  Alexey Shchepin  
      
      	* plugins/unix/ispell.tcl: Fixed typo (thanks to Sergei Golovan)
      
      	* datagathering.tcl (data::fill_field_x): Fixed binding of
      	 and added scrollbar in text-multi field.
      
      2003-01-31  Alexey Shchepin  
      
      	* plugins/chat/exec_command.tcl: New plugin that adds "/exec"
      	command in chats (e.g. "/exec uptime" to insert output of "uptime"
      	command to chat input window)
      
      	* msgs/es.msg: Fixed typo (thanks to Luis Peralta)
      
      	* msgs/ro.msg: Updated (thanks to Adrian Rapa)
      
      2003-01-30  Alexey Shchepin  
      
      	* plugins/unix/ispell.tcl: More configuration options (thanks to
      	Sergei Golovan)
      
      	* msgs/es.msg: Updated (thanks to Luis Peralta)
      
      2003-01-27  Alexey Shchepin  
      
      	* sound.tcl: Fixed muting, added sound setup via "customize"
      	(thanks to Sergei Golovan)
      	* msgs/ru.msg: Updated (thanks to Sergei Golovan)
      
      2003-01-24  Alexey Shchepin  
      
      	* iface.tcl: Removed duplicate of function "help_window" (thanks
      	to Michal Bozon)
      
      2003-01-20  Alexey Shchepin  
      
      	* messages.tcl: Added check of message type for storing only
      	messages with type='normal' (thanks to Sergei Golovan)
      
      2003-01-19  Alexey Shchepin  
      
      	* plugins/general/message_archive.tcl: New plugin for storing and
      	displaying mesage archive (thanks to Sergei Golovan)
      	* msgs/ru.msg: Updated (thanks to Sergei Golovan)
      
      	* datagathering.tcl: Added interaction with disco
      
      2003-01-17  Alexey Shchepin  
      
      	* plugins/chat/logger.tcl: Fixed history window resizing (thanks
      	to Michail Litvak)
      
      2003-01-15  Alexey Shchepin  
      
      	* pixmaps/default/services/rss*: RSS icons (thanks to Michal Bozon)
      	* roster.tcl: Support of RSS icons (thanks to Michal Bozon)
      
      	* pixmaps/psi/roster/stalker.gif: Stalker icon for "psi" theme
      	(thanks to Michal Bozon)
      
      	* plugins/iq/version.tcl: Show Tcl/Tk version in reply (thanks to
      	Sergei Golovan)
      
      	* gpgme.tcl: Bugfix (thanks to Sergei Golovan)
      
      	* (all): Interface changes, added many panned windows (thanks to
      	Sergei Golovan)
      
      2003-01-13  Alexey Shchepin  
      
      	* iface.tcl: Fixed typo that cause missing of roster group menu
      	(thanks to Sergei Golovan)
      
      	* utils.tcl: New function "format_time" (thanks to Sergei
      	Golovan)
      	* userinfo.tcl: Changed birthday entry, use "format_time" function
      	(thanks to Sergei Golovan)
      	* plugins/general/autoaway.tcl: Now use "format_time" function (thanks
      	to Sergei Golovan)
      	* msgs/ru.msg: Updated (thanks to Sergei Golovan)
      
      	* presence.tcl: Custom presence bugfix (thanks to Sergei Golovan)
      
      	* roster.tcl: Fixed bug caused by previous fix of roster users
      	with resource bug
      
      2003-01-12  Alexey Shchepin  
      
      	* plugins/general/stats.tcl: Updated
      
      	* roster.tcl: Fixed bug with roster users with resources
      
      	* browser.tcl: Fixed typo (thanks to Sergei Golovan)
      
      	* utils.tcl: New function "get_group_nick" (thanks to Sergei
      	Golovan)
      	* browser.tcl: Use this function (thanks to Sergei Golovan)
      	* tkabber/joingrdialog.tcl: Likewise
      	* tkabber/messages.tcl: Likewise
      	* tkabber/plugins/chat/logger.tcl: Likewise
      	* tkabber/roster.tcl: Likewise
      	* doc/tkabber.xml: Updated (thanks to Sergei Golovan)
      
      2003-01-11  Alexey Shchepin  
      
      	* plugins/general/stats.tcl: JEP-0039 support (not completed)
      
      	* roster.tcl (roster::redraw): Partially fixed bug with roster
      	users with resources
      
      2003-01-10  Alexey Shchepin  
      
      	* msgs/ru.msg: Updated (thanks to Sergei Golovan)
      
      	* iface.tcl: Fixed typo (thanks to Sergei Golovan)
      
      	* custom.tcl: Added option type "password", use spinbox widget if
      	tk8.4 present (thanks to Sergei Golovan)
      	* login.tcl: Use "password" option type for password customization
      	(thanks to Sergei Golovan)
      	* **/*.xrdb: Updated (thanks to Sergei Golovan)
      
      	* messages.tcl: Fixed behaviour of GPG icon (thanks to Marshall
      	T. Rose)
      
      2003-01-09  Alexey Shchepin  
      
      	* utils.tcl: New function "error_to_string" (thanks to Sergei
      	Golovan)
      	* (all): Changed error processing by using function
      	"error_to_string" (thanks to Sergei Golovan)
      	* msgs/ru.msg: Updated (thanks to Sergei Golovan)
      
      	* iface.tcl: Changed behaviour of "show only online users" button
      	(thanks to Sergei Golovan)
      	* roster.tcl: Likewise
      	* pixmaps/*/tkabber/glade-(off|on)line.gif: Updated (thanks to
      	Sergei Golovan)
      
      2003-01-08  Alexey Shchepin  
      
      	* msgs/it.msg: Italian translation (thanks to Antonino Iacono)
      
      2003-01-06  Alexey Shchepin  
      
      	* jabberlib-tclxml/tclxml/sgmlparser.tcl: Removed precessing of
      	":" in tag names (thanks to Sergei Golovan)
      
      	* jabberlib-tclxml/jabberlib.tcl: Call client:disconnect or
      	client:reconnect depends on disconnect reason (thanks to Sergei
      	Golovan)
      	* login.tcl: Added client:reconnect procedure
      
      	* iface.tcl: Use "custom" module to set some options
      	* plugins/general/autoaway.tcl: Likewise
      	* login.tcl: Likewise
      
      	* doc/tkabber.xml: Updated
      
      	* userinfo.tcl: Register disco browser handler for "vcard-temp"
      	namespace
      	* register.tcl: Likewise for "jabber:iq:register"
      
      	* search.tcl: Send "xml:lang" attribute in queries
      	* disco.tcl: Likewise
      
      	* utils.tcl: New function "get_lang"
      
      2003-01-05  Alexey Shchepin  
      
      	* disco.tcl: More translation strings (thanks to Sergei Golovan)
      	* msgs/ru.msg: Likewise
      	* plugins/general/conferenceinfo.tcl: Likewise
      	* plugins/unix/ispell.tcl: Likewise
      	* privacy.tcl: Likewise
      	* msgs/ru.msg: Updated (thanks to Sergei Golovan)
      
      	* bwidget_workarounds.tcl: Fixed tree view keyboard scrolling
      	(thanks to Sergei Golovan)
      
      2003-01-04  Alexey Shchepin  
      
      	* search.tcl: Fixed processing of "reported" fields in x:data
      	(thanks to Sergei Golovan)
      
      	* msgs/es.msg: Spanish translation (thanks to Luis Peralta)
      
      	* iface.tcl: Better roster collapse/uncollapse (thanks to Sergei
      	Golovan)
      
      2003-01-03  Alexey Shchepin  
      
      	* iface.tcl: Copyright update
      	* splash.tcl: Likewise
      	* doc/tkabber.xml: Likewise
      
      	* roster.tcl: Added "Show only online users" menu item
      
      	* jabberlib-tclxml/jabberlib.tcl: Flush stream before sending
      	"" (thanks to Sergei Golovan)
      
      	* datagathering.tcl: Mouse wheel bindings (thanks to Sergei
      	Golovan)
      
      	* plugins/general/autoaway.tcl: Change priority to 0 when in
      	autoaway state (thanks to Sergei Golovan)
      	* doc/tkabber.xml: Updated (thanks to Sergei Golovan)
      
      	* plugins/general/rawxml.tcl: Added scrollbar in input window
      	(thanks to Sergei Golovan)
      
      	* chats.tcl: Added scrollbar in input window, use scrollwindow
      	widget to show scrollbar in chat log window (thanks to Sergei
      	Golovan)
      
      2003-01-02  Alexey Shchepin  
      
      	* disco.tcl: Now possible to register handlers for different
      	features, that executed when user choose feature
      	* search.tcl: Register handler for "jabber:iq:search" namespace
      
      	* userinfo.tcl: Now really removed "prodid" and "version"
      	attributes from vCard queries
      
      	* msgs/ro.msg: Updated (thanks to Adrian Rapa)
      
      2003-01-01  Alexey Shchepin  
      
      	* msgs/eo.msg: Esperanto translation (thanks to Mike Mintz)
      
      	* userinfo.tcl: Removed "prodid" and "version" attributes from
      	vCard queries
      
      	* disco.tcl: Changed attribute "type" to "var" in "feature"
      	elements, slightly changed item's name generation, fixed small bug
      	with incorrect item's data generation in tree
      
      2002-12-30  Alexey Shchepin  
      
      	* disco.tcl: Support of 'node' attribute
      
      2002-12-29  Alexey Shchepin  
      
      	* plugins/chat/unisymbols.tcl: New plugin that allows to insert
      	arbitrary unicode symbol in chat windows (e.g. by entering "&256c"
      	and pressing C-;)
      
      	* msgs/ru.msg: Updated
      
      	* roster.tcl (roster::remove_item): Added unregistration from
      	services (thanks to Sergei Golovan)
      
      2002-12-28  Alexey Shchepin  
      
      	* msgs/ro.msg: Romanian translation (thanks to Adrian Rapa)
      
      2002-12-27  Alexey Shchepin  
      
      	* plugins/unix/ispell.tcl: Fixed race condition (thanks to
      	Marshall T. Rose)
      
      	* plugins/general/rawxml.tcl: Don't make error if admin menu not
      	exists (thanks to Marshall T. Rose)
      
      	* jabberlib-tclxml/tclxml/sgmlparser.tcl: Removed special
      	processing of "xmlns" attribute
      
      2002-12-26  Alexey Shchepin  
      
      	* plugins/general/rawxml.tcl (rawxml::pretty_print): Small fixes
      	(thanks to Sergei Golovan)
      
      2002-12-25  Alexey Shchepin  
      
      	* plugins/general/rawxml.tcl: color palette changed, sligthly
      	changed window layout, pretty printing with proportional font is
      	corrected (thanks to Sergei Golovan)
      
      	* custom.tcl: Added navigation bar, support for option type
      	"integer", list of parent groups
      	* plugins/general/rawxml.tcl: Use "custom" module to set options
      
      	* gpgme.tcl: Unicode support fixes (thanks to Sergei Golovan)
      
      	* jabberlib-tclxml/jabberlib.tcl: New procedure ::LOG_OUTPUT_XML
      	* plugins/general/rawxml.tcl: Highlight also output XML when
      	possible
      	* doc/tkabber.xml: Updated
      
      2002-12-24  Alexey Shchepin  
      
      	* custom.tcl: Support for customizating Tkabber via GUI (not
      	completed)
      	* iface.tcl: Added "Customize" menu
      	* tkabber.tcl: Added loading of "custom.tcl"
      	* plugins/general/conferenceinfo.tcl: Use "custom" module to set
      	options
      	* plugins/unix/ispell.tcl: Likewise
      
      2002-12-22  Alexey Shchepin  
      
      	* doc/tkabber.xml: Updated
      
      	* plugins/general/rawxml.tcl: Added bindings for history and
      	scrolling
      
      2002-12-21  Alexey Shchepin  
      
      	* plugins/general/rawxml.tcl: New plugin for raw XML input
      	* iface.tcl: Removed old raw XML input code
      	* jabberlib-tclxml/jabberlib.tcl: New procedures for logging:
      	::LOG_OUTPUT, ::LOG_INPUT and ::LOG_INPUT_XML
      
      2002-12-18  Alexey Shchepin  
      
      	* gpgme.tcl: Fixes for better unicode support (thanks to Sergei
      	Golovan)
      	* messages.tcl: Likewise
      	* login.tcl: Likewise
      
      2002-12-16  Alexey Shchepin  
      
      	* pixmaps/psi/roster/available-chat.gif: Changed icon (thanks to
      	Michal Bozon)
      
      	* jabberlib-tclxml/jabberlib.tcl: Removed back "-exact", added
      	variable use_external_tclxml
      	* jabberlib-tclxml/pkgIndex.tcl: Removed changing of auto_path
      	* doc/tkabber.xml: Updated
      
      2002-12-14  Alexey Shchepin  
      
      	* roster.tcl (roster::heuristically_get_category_and_subtype):
      	Add subtype "icq" to JIDs with domain started with "icqv7" (thanks
      	to Michal Bozon)
      
      	* jabberlib-tclxml/jabberlib.tcl: Added -exact to "package require
      	xml 2.0" to avoid loading of incompatible tclxml versions (thanks
      	to piotr@rokicki.net)
      	* jabberlib-tclxml/tclxml/pkgIndex.tcl: Likewise
      
      	* examples/mtr-config.tcl: Updated (thanks to Marshall T. Rose)
      
      	* plugins/unix/dockingtray.tcl: Updated (thanks to Marshall
      	T. Rose)
      
      	* Makefile: More correct install places for files
      
      2002-12-12  Alexey Shchepin  
      
      	* (all): Many fixes to work properly with tcl8.4 (thanks to Sergei
      	Golovan)
      
      2002-12-11  Alexey Shchepin  
      
      	* roster.tcl (roster::jid_doubleclick): Added highlighting of
      	roster conference icon when it opened
      
      	* presence.tcl: Bugfix: clear presence information after
      	disconnecting
      
      2002-12-08  Alexey Shchepin  
      
      	* examples/(ice|light|warm).xrdb: Updated (thanks to Sergei
      	Golovan)
      
      	* msgs/ru.msg: Updated (thanks to Sergei Golovan)
      
      	* search.tcl: Bugfix (thanks Sergei Golovan)
      
      	* messages.tcl: Added menu for sender (thanks to Sergei Golovan)
      
      2002-12-05  Alexey Shchepin  
      
      	* sound.tcl: Fixed bug with theme started from "~" with external
      	play program; support for temporary mute sound (thanks to Sergei
      	Golovan)
      	* iface.tcl: Added menu item for muting sounds
      	* plugins/general/autoaway.tcl: Mute sound in away mode
      
      	* msgs/ru.msg: Updated (thanks to Sergei Golovan)
      
      	* examples/teo-config.tcl: New config example (thanks to Sergei
      	Golovan)
      
      	* doc/tkabber.xml: Updates (thanks to Sergei Golovan)
      
      2002-12-04  Alexey Shchepin  
      
      	* splash.tcl (splash_start): Fixed commentary table
      
      	* chats.tcl (chat::redraw_roster): Show number of participants in
      	conference users list
      
      2002-12-03  Alexey Shchepin  
      
      	* examples/mtr-config.tcl: Updated (thanks to Marshall T. Rose)
      
      	* doc/tkabber.xml: Updates (thanks to Marshall T. Rose)
      
      	* messages.tcl: Fixed headline caching bug (thanks to Marshall
      	T. Rose)
      
      2002-11-27  Alexey Shchepin  
      
      	* userinfo.tcl (userinfo::manage_focus): Bugfix
      
      2002-11-24  Alexey Shchepin  
      
      	* iface.tcl: Workaround for one bwidget issue (thanks to Sergei
      	Golovan)
      
      	* examples/*.xrdb: Updates and new themes (warm.xrdb and
      	light.xrdb) (thanks to Sergei Golovan)
      
      	* chats.tcl: Added ability to have different default size for chat
      	and groupchat windows (thanks to Sergei Golovan)
      	* iface.tcl: Likewise
      	* default.xrdb: Likewise
      
      2002-11-23  Alexey Shchepin  
      
      	* examples/dark.xrdb: New color theme (thanks to Sergei Golovan)
      	* examples/ice.xrdb: Likewise
      	* examples/green.xrdb: Likewise (thanks to ukscone)
      
      	* pixmaps/icq/: New ICQ-like theme (thanks to Oleg V. Motienko)
      
      	* examples/teopetuk.xrdb: Updated, added descriptions of used
      	resources (thanks to Sergei Golovan)
      	* examples/ermine.xrdb: Likewise
      
      	* roster.tcl: Roster import/export support
      
      	* userinfo.tcl (userinfo::load_photo): Fixed error when user
      	clicks on "Cancel" button in load photo dialog
      
      2002-11-21  Alexey Shchepin  
      
      	* examples/mtr-config.tcl: Updated (thanks to Marshall T. Rose)
      
      	* plugins/unix/dockingtray.tcl: Fixed race condition (thanks to
      	Marshall T. Rose)
      
      	* plugins/windows/taskbar.tcl: Bugfix (thanks to Sergei Golovan)
      
      	* roster.tcl: Fixed roster scrolling (thanks to Sergei Golovan)
      
      	* plugins/windows/mousewheel.tcl: Plugin that make mousewheel work
      	on Windows (thanks to Sergei Golovan)
      
      	* plugins/general/autoaway.tcl: Autoaway plugin that works both on
      	Unix and on Windows (requires tclWinidle package) (thanks to
      	Sergei Golovan)
      
      2002-11-19  Alexey Shchepin  
      
      	* privacy.tcl (privacy::send_lists): Send all lists in different
      	iq packets to work with jabberd2.  Now waiting for next revision
      	of JEP-0016...
      
      	* plugins/general/conferenceinfo.tcl: If conference return error
      	reply, then wait longer period of time to ask again
      	* doc/tkabber.xml: Updated
      
      2002-11-18  Alexey Shchepin  
      
      	* login.tcl (show_login_dialog): Fixed tab order
      
      2002-11-17  Alexey Shchepin  
      
      	* roster.tcl: More performance improvements
      
      	* presence.tcl: Cleanups
      
      2002-11-15  Alexey Shchepin  
      
      	* plugins/windows/taskbar.tcl: Few changes (thanks to Sergei
      	Golovan)
      
      	* roster.tcl: More performance improvements
      
      2002-11-14  Alexey Shchepin  
      
      	* roster.tcl (roster::jid_doubleclick): Small fix to better work
      	with bookmark items -- jabberd2 removes all category and type
      	attributes
      
      	* joingrdialog.tcl: Add conference in  tag instead of 
      
      	* messages.tcl: Fixed some headline caching stuff (thanks to
      	Marshall T. Rose)
      
      	* examples/jsend.tcl: Small changes (thanks to Marshall T. Rose)
      	* examples/mtr-config.tcl: Likewise
      
      	* plugins/windows/taskbar.tcl: Few changes (thanks to Sergei
      	Golovan)
      
      	* pixmaps/jajc/docking/tkabber.ico: Windows icon for JAJC theme
      	(thanks to Sergei Golovan)
      
      	* userinfo.tcl: Added dialog for requesting info from arbitrary
      	JID (thanks to Sergei Golovan)
      
      	* roster.tcl: Performance improvements (better handling of big
      	rosters)
      	* presence.tcl: Likewise
      
      	* muc.tcl (muc::process_gc_user): Fixed typo with reason handling
      
      2002-11-13  Alexey Shchepin  
      
      	* privacy.tcl: Server-Based Privacy Rules support (JEP-0016)
      
      2002-11-12  Alexey Shchepin  
      
      	* plugins/unix/wmdock.tcl (::wmdock::showhide): Small fix (thanks
      	to Michail Litvak and Max Loparyev)
      
      2002-11-11  Alexey Shchepin  
      
      	* disco.tcl: Small improvements
      
      	* plugins/general/tkcon.tcl: Plugin that add support for tkcon
      	(thanks Marshall T. Rose)
      	* doc/tkabber.xml: Updated
      
      	* plugins/windows/taskbar.tcl: Plugin to let tkabber on windows
      	put a little icon in the systray (requires Winico package)
      	(thanks Marshall T. Rose)
      	* pixmaps/default/docking/tkabber.ico: Windows icon for systray
      
      	* plugins/general/conferenceinfo.tcl: Plugin for listing
      	participants of roster conferences when user not joined them
      	* doc/tkabber.xml: Updated
      
      2002-11-10  Alexey Shchepin  
      
      	* presence.tcl (get_jid_of_user): Fixed for case when jid priority
      	not known
      
      	* roster.tcl (roster::item_to_xml): Store category in attribute
      	instead of element name
      
      	* roster.tcl: Roster aliases support
      	* doc/tkabber.xml: Updated
      
      	* roster.tcl: Don't show "stalker" icon and foreground if received
      	non-unavailable presence
      
      2002-11-09  Alexey Shchepin  
      
      	* muc.tcl: Fixed client message for nick change
      
      	* muc.tcl: MUC-compatible invitation support
      
      	* messages.tcl: A new option for headlines that determines when
      	all headlines go in one window or not (thanks Marshall T. Rose)
      	* doc/tkabber.xml: Updated (thanks Marshall T. Rose)
      
      	* messages.tcl: Fixed miss of message::quote (thanks Sergei
      	Golovan)
      
      2002-11-07  Alexey Shchepin  
      
      	* examples/jsend.tcl: New version of jmail.tcl renamed to
      	jsend.tcl (thanks Marshall T. Rose)
      
      	* roster.tcl: Menu for roster users to send custom presence
      	* chats.tcl: Likewise for groupchats
      
      	* presence.tcl (send_custom_presence): Function to send custom
      	presence
      
      2002-11-06  Alexey Shchepin  
      
      	* jabberlib-tclxml/jabberlib.tcl: Workaround for expat bug
      
      	* iface.tcl: C-M-Prior/Next now move current tab left/right
      
      	* iface.tcl: Better title handling (thanks Sergei Golovan)
      
      	* plugins/chat/completion.tcl (completion::complete): More
      	correctly completion
      
      2002-11-05  Alexey Shchepin  
      
      	* roster.tcl: Adding group by regexp on roster jids
      	* iface.tcl: Menu item for this feature
      
      	* datagathering.tcl (data::draw_window): Return cancel form when
      	'Cancel' button pressed
      
      	* roster.tcl: Now possible to rename or remove roster group
      
      	* roster.tcl: New popup menu for roster groups
      
      	* roster.tcl: roster::group_popup_menu renamed to
      	roster::groupchat_popup_menu
      	* chats.tcl: Likewise
      
      	* disco.tcl: Removed all references to 'category' attribute for
      	'feature' element
      
      	* tkabber.tcl: Load iq.tcl before disco.tcl
      
      2002-11-04  Alexey Shchepin  
      
      	* chats.tcl (chat::change_presence): New hooks 'chat_user_enter'
      	and 'chat_user_exit'
      	* doc/tkabber.xml: Updated
      
      	* jidlink.tcl (jidlink::negotiate_handler): Return all options on
      	empty feature negotiation request
      
      	* disco.tcl: Answer to disco info queries
      
      	* examples/jmail.tcl: A stand-alone program that sends to a jabber
      	recipient (you can use it e.g. to "follow" syslogs) (thanks
      	Marshall T. Rose)
      
      	* jabberlib-tclxml/pkgIndex.tcl: New file to allow install
      	jabberlib in the tcl search path (thanks Marshall T. Rose)
      
      	* examples/mtr-config.tcl: A few changes (thanks Marshall T. Rose)
      
      	* iface.tcl: much better focus/tab-update handling (thanks
      	Marshall T. Rose)
      
      	* (all): Now keep alive interval stored in keep_alive_interval
      	variable (thanks Sergei Golovan)
      
      	* login.tcl: Now possible to connect to server by defining its
      	another name or ip (thanks Sergei Golovan)
      
      2002-11-03  Alexey Shchepin  
      
      	* (all): Tkabber 0.9.2beta released
      
      	* doc/tkabber.xml: Updated
      
      	* Makefile: Updated
      
      	* iface.tcl: Fixed "Quick Help" message
      
      	* iface.tcl: Added "Change password" dialog, some admin tools
      	(thanks Sergei Golovan)
      
      2002-11-02  Alexey Shchepin  
      
      	* messages.tcl (message::send_subscribe_dialog): Fixed typo
      	(thanks Sergei Golovan and ukscone)
      
      	* plugins/clientinfo.tcl: Moved to plugins/general/
      	* iq-plugins/: Moved to plugins/iq/
      	* chat-plugins/: Moved to plugins/chat/
      	* unix/: Moved to plugins/unix/
      
      	* roster.tcl: Changed interface to
      	roster::create_groupchat_user_menu and to
      	roster_create_groupchat_user_menu_hook
      	* muc.tcl (muc::add_groupchat_user_menu_items): Likewise
      	* doc/tkabber.xml: Updated
      
      	* chat-plugins/clear.tcl: Plugin that adds menu for clearing chat
      	window
      
      	* iface.tcl: Added info about M-[0-9] bindings to "Quick Help"
      
      	* muc.tcl (muc::process_gc_user): Generate events messages on kick
      	and ban
      	* muc.tcl: Switch on/of client message events via
      	muc::options(gen_events)
      
      	* presence.tcl: Slightly changed interface to presence_process_x
      
      2002-11-01  Alexey Shchepin  
      
      	* plugins/clientinfo.tcl (clientinfo::add_user_popup_info): Show
      	also vCard name of JID
      
      	* muc.tcl (muc::add_user_popup_info): Don't show real JID if it
      	not known
      
      	* userinfo.tcl (userinfo::make_adr_item): Store country info in
      	 element instead of 
      
      	* doc/tkabber.xml: Fixed some versions in "Requirements" section
      
      	* messages.tcl: Changed messages interface (thanks Sergei Golovan)
      
      	* iface.tcl (get_focus): Fixed tab highliting when main window
      	gets focus
      
      	* (all): Slightly changed chats interface, replaced "puts" to
      	"debugmsg" (thanks Marshall T. Rose)
      
      2002-10-31  Alexey Shchepin  
      
      	* iface.tcl: Augment the tabcolor code to see if the main window
      	is out-of-focus (thanks Marshall T. Rose)
      
      	* chats.tcl (chat::change_presence): Show custom messages on users
      	join/exiting
      
      	* iface.tcl: Switch between tabs via M-[0-9]
      
      	* muc.tcl: Don't allow to edit role and affiliation simultaneously
      	in lists
      
      2002-10-30  Alexey Shchepin  
      
      	* unix/menu8.4.tcl: menu.tcl version for Tcl/Tk 8.4
      
      	* messages.tcl: Fixed resizing of some windows (thanks Sergei
      	Golovan)
      
      	* iface.tcl (show_rawxml_dialog): Send XML on C-Return instead of
      	Return (thanks Sergei Golovan)
      
      	* chat-plugins/complete_last_nick.tcl: Add nick from last
      	groupchat message in beginning of completion list
      
      	* joingrdialog.tcl (join_group_dialog): Interface slightly changed
      
      	* muc.tcl (muc::join_group): MUC-compatible join
      	* joingrdialog.tcl (join_group): Use MUC join for MU-Conferences
      
      	* negotiate.tcl (negotiate::recv_request_response): Changed format
      	of returned data
      	* jidlink.tcl: Use new format
      
      	* disco.tcl: Show feature negotiation results in browser
      
      	* disco.tcl: Show error replies
      
      2002-10-29  Alexey Shchepin  
      
      	* iface.tcl: Show number of unreaded messages in title in tabbed
      	interface when window have no focus (thanks Sergei Golovan)
      
      	* sound.tcl: Don't play sounds when our status is "xa" or "dnd"
      	(thanks Sergei Golovan)
      
      	* disco.tcl: Service discovery support (JEP-0030)
      	* iface.tcl: Menu item for disco-browser
      	* default.xrdb: Resources for disco-browser
      
      2002-10-28  Alexey Shchepin  
      
      	* unix/menu.tcl: Disabled for tcl version != 8.3
      
      2002-10-27  Alexey Shchepin  
      
      	* (all): Some design changes (thanks Sergei Golovan)
      
      	* unix/menu.tcl: Menu behavior changed to what ukscone and velikan
      	wants (thanks Sergei Golovan)
      
      	* sound.tcl: If theme name started with "/" or "~", then it
      	considered as path directly to theme directory (thanks Sergei
      	Golovan)
      	* doc/tkabber.xml: Updated
      
      	* tkabber.tcl: New autologin variable to automatically login after
      	startup (thanks Sergei Golovan)
      	* doc/tkabber.xml: Updated
      
      	* muc.tcl: Fixed granting/revoking voice, added completions for
      	/admin and /deadmin commands
      
      	* datagathering.tcl: Support of new text-multi, jid-single and
      	jid-multi fields
      
      	* presence.tcl: Removed test_muc condition (thanks David Sutton)
      
      	* sound.tcl: Sound notifications support (thanks Sergei Golovan)
      	* sounds/default/: Default sound theme (thanks Sergei Golovan)
      	* doc/tkabber.xml: Updated
      
      2002-10-26  Alexey Shchepin  
      
      	* messages.tcl: Fixed typo (thanks Marshall T. Rose)
      
      	* muc.tcl: Rewrited code for editing lists, few code cleanups, new
      	commands /admin and /deadmin
      
      	* (all): More i18n, added bindings to many dialogs, focus
      	management in userinfo dialog (thanks Sergei Golovan)
      
      	* (all): better english usage in messages and in the docs.  if an
      	 comes back in a message/presence, don't try to check
      	signatures, etc.  have clientinfo:autoask default to off (thanks
      	Marshall T. Rose)
      
      2002-10-24  Alexey Shchepin  
      
      	* iq.tcl (iq::register_handler): Store all registered namespaces
      	* iq-plugins/browse.tcl (iq_browse_reply): Show all registered
      	namespaces
      
      	* roster.tcl: Internal changes of displaying popup balloons, more
      	correctly but more slowly
      
      2002-10-23  Alexey Shchepin  
      
      	* msgs/ru.msg: Updated (thanks Sergei Golovan)
      
      	* (all): Much more i18n (thanks Sergei Golovan)
      
      	* chats.tcl (chat::process_message): Ignore non-groupchat messages
      	with type="groupchat"
      
      	* roster.tcl (roster::addline): Small fix to more correctly show
      	popup info for online users with one resource
      
      	* presence.tcl (change_our_presence): Bugfix
      
      	* muc.tcl (muc::request_destruction): Fixed
      
      2002-10-21  Alexey Shchepin  
      
      	* muc.tcl (muc::add_user_popup_info): Show affiliation in popup
      	info
      
      	* plugins/clientinfo.tcl (clientinfo::on_presence): Don't ask
      	every JID more than once, even if it not answers
      
      	* doc/tkabber.xml: Updated
      
      	* roster.tcl (roster::user_popup_info): Corrected status and
      	description in roster popup hints for conference items
      
      	* roster.tcl (roster::addline): Removed is_user condition for jids
      	with multiple resources
      
      	* chats.tcl (chat::close_window): Remove participants presence
      	from memory
      
      	* chats.tcl (chat::redraw_roster): Don't draw affiliation groups
      
      	* muc.tcl: Fixed role and affiliation when trying to grant/revoke
      	moderator priveleges
      
      2002-10-20  Alexey Shchepin  
      
      	* roster.tcl (roster::redraw): Remove doubled jids from groups
      
      2002-10-19  Alexey Shchepin  
      
      	* muc.tcl: New commands /member, /demember, /moderator,
      	/demoderator.  All such commands now compatible with JEP-0045
      	v0.15
      
      	* roster.tcl: 'jlib::parse_roster_get' moved back to jabberlib.tcl
      	* jabberlib-tclxml/jabberlib.tcl: Likewise
      
      	* jabberlib-tclxml/jabberlib.tcl (jlib::send_msg): Fixed bug with
      	message thread handling
      
      	* presence.tcl (client:presence): Handle error presence packets
      	* jabberlib-tclxml/jabberlib.tcl: Likewise
      
      	* jidlink.tcl (jidlink::setup_menu): Added menu for
      	enabling/disabling jidlink transpotrs
      	* iface.tcl: Likewise
      
      	* muc.tcl (muc::process_gc_user): Handle roles and affiliations in
      	presence packets
      
      	* chats.tcl (chat::redraw_roster): Display roles and affiliations
      
      	* muc.tcl: List requests changes, due to JEP-0045 changes
      
      2002-10-17  Alexey Shchepin  
      
      	* plugins/jidlink/dtcp.tcl: Seems works, need to add more error
      	checks
      
      	* muc.tcl (muc::request_negotiation): Browse conference service
      	instead of conference room
      
      	* muc.tcl: Working with lists changed due to JEP-0045 changes
      
      	* filetransfer.tcl: Small fixes
      
      2002-10-16  Alexey Shchepin  
      
      	* plugins/jidlink/dtcp.tcl: DTCP support (JEP-0046) (not completed)
      
      	* jidlink.tcl: Changed transport registration
      	* plugins/jidlink/ibb.tcl: Likewise
      
      2002-10-15  Alexey Shchepin  
      
      	* plugins/jidlink/ibb.tcl: Inband Bytestream support (JEP-0047)
      
      	* filetransfer.tcl: Added support of file transfer via Jidlink
      	(JEP-0052)
      
      	* jidlink.tcl: Jidlink support (JEP-0041)
      
      	* negotiate.tcl: Negotiation support (JEP-0020)
      
      2002-10-14  Alexey Shchepin  
      
      	* msgs/ua.msg: Updated (thanks Vladimir Velychko)
      
      	* chat-plugins/logger.tcl (::logger::show_log): Move history view
      	to the end when window opened
      
      	* browser.tcl (browser::ns_binding): Join conference by pressing
      	on new conference namespace
      
      	* search.tcl: Works more correctly with x:data (thanks Sergei
      	Golovan)
      
      	* muc.tcl: Fixed configure and added admin list (thanks David
      	Sutton)
      
      2002-10-13  Alexey Shchepin  
      
      	* iq.tcl: Changed interface to iq handlers
      	* avatars.tcl: Use new interface
      	* iq-plugins/browse.tcl: Likewise
      	* iq-plugins/time.tcl: Likewise
      	* iq-plugins/version.tcl: Likewise
      
      2002-10-12  Alexey Shchepin  
      
      	* muc.tcl: Negotiation now work via iq:browse
      
      2002-10-10  Alexey Shchepin  
      
      	* joingrdialog.tcl (join_group_dialog): Join on pressing enter in
      	dialog window
      
      	* chats.tcl (chat::get_nick): Use roster name for JID as nick if
      	possible
      
      	* filetransfer.tcl (ft::send_file_dialog): Takes default IP
      	address from socket to server
      
      	* jabberlib-tclxml/jabberlib.tcl: Changed socket encoding to utf-8
      	instead of binary, to avoid some problems with blocking
      
      	* chats.tcl (chat::redraw_roster): redraw_roster moved back from
      	muc.tcl
      	* muc.tcl: Likewise
      
      	* muc.tcl: Removed test_muc condition
      
      	* muc.tcl (muc::commands_comps): Check room for MUC-compatibility
      	* muc.tcl (muc::add_conference_menu_items): Likewise
      
      	* joingrdialog.tcl (join_group): Make iq:negotiation before
      	joining room
      
      	* presence.tcl (presence_process_x): Fixed namespace for MUC
      
      	* datagathering.tcl (data::fill_field_x): Removed use of "min"
      	function, because it not exists in not-extended Tcl
      
      2002-10-09  Alexey Shchepin  
      
      	* muc.tcl: Changed namespaces, due to JEP-0045 changes
      
      	* datagathering.tcl (data::fill_field_x): Don't set height of
      	combo boxes more then needed
      
      	* plugins/clientinfo.tcl: Plugin for showing client information
      	and automatically ask about it
      
      	* presence.tcl (client:presence): New hook client_presence_hook
      
      	* userinfo.tcl (userinfo::request_iq): New function to send
      	various iq queries
      
      	* datagathering.tcl (data::draw_window): New function to draw
      	toplevel window with form
      	* muc.tcl: Changes to use data::draw_window
      
      	* datagathering.tcl (data::add_label): Don't add ":" to the end of
      	label if it ends with punctuation symbol
      
      	* muc.tcl (muc::add_user_popup_info): Add real JID to user popup
      	info if it known
      	* muc.tcl (muc::whois): Whois command now takes information from
      	cache, due to JEP-0045 changes
      
      	* roster.tcl (roster::user_popup_info): User popup info now
      	extendable via roster_user_popup_info_hook
      
      	* roster.tcl: More correct login menu for services (thanks Michail
      	Litvak)
      
      	* roster.tcl: Minor roster fixes (thanks Sergei Golovan)
      
      	* msgs/ua.msg: Fixed typo (thanks Vladimir Velychko)
      
      2002-10-05  Alexey Shchepin  
      
      	* iface.tcl: More geometry configuration via xrdb for non-tabbed
      	interface (thanks Sergei Golovan)
      
      	* msgs/ua.msg: Ukrainian localization (thanks Vladimir Velychko)
      
      2002-10-04  Alexey Shchepin  
      
      	* (all): More interface parameters now configurable via xrdb
      	(thanks Sergei Golovan)
      
      2002-10-03  Alexey Shchepin  
      
      	* muc.tcl (muc::send_ban_voice_list): Fixed namespace
      
      2002-10-01  Alexey Shchepin  
      
      	* muc.tcl: IQ negotiation support
      
      	* roster.tcl: Added Login/logout menu for services (thanks Michail
      	Litvak)
      
      	* datagathering.tcl (data::fill_fields_x):  tag support
      	and added attribute type='submit' into </x> tag for submited data
      
      2002-09-30  Alexey Shchepin  <alexey@sevcom.net>
      
      	* login.tcl (recv_register_result): Make full reconnect after
      	registration
      
      	* tkabber.tcl: I18n support (thanks Sergey Kalinin aka BanZaj)
      	* chats.tcl: Likewise
      	* roster.tcl: Likewise
      	* iface.tcl: Likewise
      	* login.tcl: Likewise
      	* msgs/: Directory for translation files
      
      2002-09-29  Alexey Shchepin  <alexey@sevcom.net>
      
      	* chat-plugins/logger.tcl: Logs now colored (thanks Sergei
      	Golovan)
      
      	* userinfo.tcl: Userinfo window now not a dialog (thanks Sergei
      	Golovan)
      
      2002-09-28  Alexey Shchepin  <alexey@sevcom.net>
      
      	* plugins.tcl (plugins::load_dir): New function to load plugins
      	hierarchy (thanks Sergey Kalinin)
      	* tkabber.tcl: Search plugins in ~/.tkabber/plugins
      
      	* doc/tkabber.xml: Updates
      
      	* search.tcl: Items in search result now numerated (thanks Sergei
      	Golovan)
      
      	* tkabber.tcl: Roster width now configurable via xrdb
      	* chats.tcl: Likewise for conference users list (thanks Sergei
      	Golovan)
      
      2002-09-27  Alexey Shchepin  <alexey@sevcom.net>
      
      	* chat-plugins/completion.tcl: Algorithm slightly changed to
      	support adding of completions via hook 'generate_completions_hook'
      	* chat-plugins/me_command.tcl: Added completion of /me command
      	* chat-plugins/nick_command.tcl: Added completion of /nick command
      	* muc.tcl: Added completions of various MUC commands
      
      	* iface.tcl (tab_set_updated): Fixed highliting of tabs on Windows
      	platform with zoomed main window (thanks Sergei Golovan)
      
      	* mclistbox-1.02/mclistbox.tcl: More correctly resize columns
      	(thanks Sergei Golovan)
      
      	* muc.tcl (muc::request_ban_voice_list): Use namespace
      	jabber:gc:admin instead of incorrect jabber:gc:owner
      
      2002-09-26  Alexey Shchepin  <alexey@sevcom.net>
      
      	* muc.tcl: Ban & voice lists support
      
      	* datagathering.tcl: Fixes to avoid errors in incorrect form
      
      	* muc.tcl: Support for room destruction
      
      	* doc/tkabber.xml: Fixed typo (thanks Marshall T. Rose)
      
      	* iface.tcl: Fixes in X selection support
      
      	* muc.tcl: Support for modifying voice attribute (new commands:
      	/voice and /devoice)
      
      	* muc.tcl (muc::handle_commands): Support for /kick, /ban & /whois
      	commands in groupchats
      
      2002-09-25  Alexey Shchepin  <alexey@sevcom.net>
      
      	* muc.tcl (chat::redraw_roster): Separate users with different
      	levels in conference userlist
      
      	* presence.tcl (presence_process_x): Support for jabber:gc:user
      	namespace
      	* muc.tcl (muc::process_gc_user): Likewise
      
      	* muc.tcl (muc::whois): 'set' changed to 'get'
      
      	* muc.tcl: Bugfixes in configuration procedures
      
      2002-09-24  Alexey Shchepin  <alexey@sevcom.net>
      
      	* unix/ispell.tcl: Show variants of misspelled word correction on
      	right mouse click (thanks Sergei Golovan)
      
      	* muc.tcl: Support for whois command and subsequent room
      	configuration
      
      	* doc/tkabber.xml: slightly better english
      	(thanks Marshall T. Rose)
      
      	* examples/mtr-config.tcl: slightly newer version
      	(thanks Marshall T. Rose)
      
      	* chats.tcl: New hooks chat_create_user_menu_hook and
      	chat_create_conference_menu_hook
      
      	* mclistbox-1.02/mclistbox.tcl: mclistbox v1.02 (c) Bryan Oakley
      	* search.tcl: Search results now displayed via mclistbox package
      	(thanks Sergei Golovan)
      
      2002-09-23  Alexey Shchepin  <alexey@sevcom.net>
      
      	* chats.tcl (chat::open_window): More correct selecting of tab
      	title
      
      	* datagathering.tcl (data::fill_field_x): Fixed bug with incorrect
      	sending of selection in list-multi if it not changed
      
      	* datagathering.tcl: Fixed bug with sending content of text-multi
      	field
      
      	* chat-plugins/events.tcl (events::setup_ui): Fixed bug with '%'
      	in jids
      
      2002-09-22  Alexey Shchepin  <alexey@sevcom.net>
      
      	* muc.tcl: Multi-User Chat support (not completed, enabled by
      	setting 'test_muc' to '1')
      
      	* messages.tcl: Support for x:data in messages
      
      	* chat-plugins/events.tcl: Show incoming events also in status
      	line in tabbed mode
      
      2002-09-21  Alexey Shchepin  <alexey@sevcom.net>
      
      	* chat-plugins/events.tcl (events::process_x_event): Don't send
      	x:event reply when recipient offline
      
      	* messages.tcl (message::send_subscribe): Bugfix in sending
      	presence status
      
      	* doc/tkabber.xml: Updates
      
      	* chat-plugins/events.tcl: Support of message events (JEP-0022)
      
      	* chat-plugins/empty_body.tcl: Don't draw messages with empty body
      
      	* jabberlib-tclxml/jabberlib.tcl (jlib::parse): Support of message
      	'id' attribute
      	* chats.tcl: Likewise
      
      	* unix/ispell.tcl: Fixed leak of text marks
      
      2002-09-20  Alexey Shchepin  <alexey@sevcom.net>
      
      	* doc/tkabber.xml: Updates
      
      	* datagathering.tcl: Support for jabber:x:data (JEP-0004)
      
      	* messages.tcl: display the body from the headline in popup
      	balloon (thanks Marshall T. Rose)
      
      2002-09-19  Alexey Shchepin  <alexey@sevcom.net>
      
      	* iface.tcl: New tabs menu items: "Close other tabs" & "Close all
      	tabs" (thanks Sergei Golovan)
      
      	* jabberlib-tclxml/jabberlib.tcl: New option keep_alive to
      	periodically send empty string to server (thanks Sergei Golovan)
      
      	* (all): put a catch around raising a tab in an "after idle". fix
      	a bug in hedaline caching. more info during splash screen. logout
      	with a reason fixed (thanks Marshall T. Rose)
      
      	* pixmaps/docking: pixmaps/feather22 moved to here
      
      2002-09-18  Alexey Shchepin  <alexey@sevcom.net>
      
      	* userinfo.tcl (userinfo::fill_user_description): Bugfix
      
      	* presence.tcl (change_our_presence): Bugfix
      
      	* iface.tcl: Logout binded to C-j
      
      	* doc/tkabber.xml: Updates
      
      	* roster.tcl (roster::clean): New procedure to clean up roster
      	* login.tcl: Cleanup roster after logout
      
      	* pixmaps/feather22: Roster icons 22x22 moved to here
      	* pixmaps/default: New roster icons 16x16
      
      2002-09-17  Alexey Shchepin  <alexey@sevcom.net>
      
      	* balloon.tcl: don't hide balloons under lower boundary of the
      	screen (thanks Michail Litvak)
      
      	* unix/ispell.tcl: New option 'check_every_symbol' (thanks Sergei
      	Golovan)
      
      	* hooks.tcl: put a "catch" around hook:run. add debugmsg to
      	hook::run. removed old debugging stuff from message headline
      	caching. run as a hook message headline caching. update docs
      	(thanks Marshall T. Rose)
      
      2002-09-16  Alexey Shchepin  <alexey@sevcom.net>
      
      	* iface.tcl (add_win): Fixed bug with not raising of first tab
      	when raise_new_tab=0
      
      	* userinfo.tcl (userinfo::parse_vcard_photo_item): Fixed bug with
      	empty BINVAL tag in PHOTO
      
      2002-09-15  Alexey Shchepin  <alexey@sevcom.net>
      
      	* unix/ispell.tcl: Bugfixes
      
      2002-09-14  Alexey Shchepin  <alexey@sevcom.net>
      
      	* iface.tcl: Tkabber interface
      	* tkabber.tcl: Moved interface code to iface.tcl
      
      	* default.tcl: Default config
      	* tkabber.tcl: Moved default config code to default.tcl
      
      	* userinfo.tcl: Photos in vCard
      
      	* messages.tcl: Fixed bug with double subscription request
      
      	* roster.tcl: Bugfixes
      
      2002-09-13  Alexey Shchepin  <alexey@sevcom.net>
      
      	* (all): Cosmetic changes (thanks Sergei Golovan)
      
      	* unix/ispell.tcl: Support for ispell (thanks Sergei Golovan)
      	* doc/tkabber.xml: Updates
      
      2002-09-09  Alexey Shchepin  <alexey@sevcom.net>
      
      	* chats.tcl (chat::open_window): Bindings to M-Prior and M-Next to
      	scroll text in chat window from input window
      
      	* roster.tcl (roster::heuristically_get_category_and_subtype):
      	Performance improvements
      
      	* doc/tkabber.xml: Updates
      
      	* tkabber.tcl: New hooks postload_hook and finload_hook.
      
      2002-09-08  Alexey Shchepin  <alexey@sevcom.net>
      
      	* splash.tcl: Show progress window at startup
      
      	* tkabber.tcl: Now main window geometry configurable via xrdb
      
      	* (all): Error dialog when user tries to store not defined avatar.
      	More parametrizations to roster look.  Documentation updates.
      	(thanks Marshall T. Rose)
      
      	* search.tcl: Now user can search again in the same search dialog
      	after receiving results
      
      	* tkabber.tcl (about_window): Bugfix
      
      2002-09-07  Alexey Shchepin  <alexey@sevcom.net>
      
      	* doc/tkabber.xml: Updates
      
      	* textundo/: Textundo package from Donal K. Fellows
      	* chats.tcl (chat::open_window): Undo/redo support for input
      	windows.  Undo binded to C-z, redo to C-Z.
      	* messages.tcl: Likewise
      
      	* chats.tcl (chat::redraw_roster): List of groupchat users sorted
      	more correctly
      
      	* login.tcl: HTTPS proxy auth support (thanks Alexander
      	Timoshenko)
      
      2002-09-06  Alexey Shchepin  <alexey@sevcom.net>
      
      	* (all): default_message_type now a chat::option.  some minor
      	debuging for the gpgme module.  more updates to the docs.  (thanks
      	Marshall T. Rose)
      
      	* default.xrdb: New default theme
      	* tkabber.tcl: New variable load_default_xrdb
      
      2002-09-05  Alexey Shchepin  <alexey@sevcom.net>
      
      	* presence.tcl: Bugfix
      
      	* roster.tcl: New hook roster_create_groupchat_user_menu_hook
      
      	* tkabber.tcl (add_win): New variable raise_new_tab
      
      	* roster.tcl (roster::create): Bindings for second mouse wheel
      
      	* presence.tcl (get_jids_of_user): Performance improvements
      
      2002-09-04  Alexey Shchepin  <alexey@sevcom.net>
      
      	* register.tcl: Fixed bug with sending <item> tag instead of
      	<query>
      
      	* tkabber.tcl: New dialog for raw XML input
      
      	* (all): better icons.  added encrypt button to chat windows.
      	added headline caching between Tkabber sessions.  lots of crypto
      	fixes.  small change to hook::add so that if you source the same
      	plugin multiple times, it doesn't get added multiple times.
      	bugfix to presence status.  (thanks Marshall T. Rose)
      
      
      2002-09-03  Alexey Shchepin  <alexey@sevcom.net>
      
      	* tkabber.tcl: Removed unsetting of 'rw' and 'nw' to make C-r work
      	correctly
      
      	* chats.tcl: stop_scroll renamed to options(stop_scroll)
      
      	* avatars.tcl: avatar(announce) & avatar(share) renamed to
      	options(...)
      
      	* tkabber.tcl (browseurl): Fixed call to exec for windows platform
      
      	* (all): Show resources for users that have few ones in roster
      	(thanks Sergei Golovan)
      
      2002-09-02  Alexey Shchepin  <alexey@sevcom.net>
      
      	* roster.tcl (roster::redraw_after_idle): New function to optimize
      	calls to roster::redraw
      	* chat.tcl (chat::redraw_roster_after_idle): Likewise for
      	chat::redraw_roster
      
      	* doc/: Now we have documentation! (thanks Marshall T. Rose)
      
      	* (all): i got ballooning working with the emoticon menu. wasn't
      	easy.  fixed a few corner cases in when tkabber decides to handle
      	crypto stuff.  a lot of little changes to make the documentation
      	easier.  you can now set presence status from the main menu, e.g.,
      	click on "Away" and then enter "at lunch..."  managed to get rid
      	of the jlib::presence calls in login.tcl first line of tkabber.tcl
      	is friendly in case wish not installed in /usr/bin/.  pixmap_theme
      	can now be a directory name.  things re-arranged a bit in
      	tkabber.tcl to support the documentation better.  various globals
      	unset after use.  my config file now has a splash screen. not all
      	that happy with it, but it's a start.  autoaway and dockingtray
      	now use fullblown namespaces
      	(thanks Marshall T. Rose)
      
      	* messages.tcl (message::send_subscribe): Fixed bug with adding
      	jids with uppercase letters
      
      2002-08-31  Alexey Shchepin  <alexey@sevcom.net>
      
      	* login.tcl: Login on "Return" in login dialog
      
      	* roster.tcl (roster::create_user_menu): Added new hook
      
      	* (all): fix SUBDIRS definition in Makefile.  fix some bugs in
      	putting icons in the chat window when sending.  replace a lot of
      	"$gw withdraw" with "destroy $gw".  have the emoticon menu put a
      	space around the emoticon (if necessary).  less paranoid
      	signature-checking.  typo in URL to Img package. (thanks Marshall
      	T. Rose)
      
      	* gpgme.tcl: Support for GPG (thanks Marshall T. Rose)
      
      2002-08-29  Alexey Shchepin  <alexey@sevcom.net>
      
      	* tkabber.tcl: Support for Unicode in X selection (idea taken from
      	alicq)
      
      2002-08-28  Alexey Shchepin  <alexey@sevcom.net>
      
      	* login.tcl: Remember presence status between logins
      
      	* roster.tcl: Ask user before removing item from roster
      
      	* messages.tcl (message::send_subscribe): Show item edit dialog
      	after receiving item in roster
      
      	* itemedit.tcl: New module for editing roster items
      	* editgroups.tcl: Joined into itemedit.tcl
      	* roster.tcl: Code for editing item's name moved to itemedit.tcl
      
      	* unix/wmdock.tcl (wmdock::msg_recv): Don't count messages in
      	non-tabs mode
      
      	* tkabber.tcl: Append to auto_path dir with tkabber.tcl instead of
      	current dir
      
      	* chats.tcl (chat::open_window): New variable raise_on_activity to
      	raise and deiconify windows in non-tabs mode
      
      	* userinfo.tcl: Show UTC and TZ tags in iq:time reply
      
      2002-08-27  Alexey Shchepin  <alexey@sevcom.net>
      
      	* chat-plugins/logger.tcl: Store private chats in conferences,
      	fixed bug with history in chats windows
      
      	* chats.tcl (chat::change_presence): Bugfix
      
      	* utils.tcl (double%): New function for doubling '%' symbol in
      	bind scripts, to avoid some bugs
      	* chat-plugins/history.tcl: Changed bindings to use double%
      	function
      	* chats.tcl: Likewise
      	* roster.tcl: Likewise
      
      2002-08-26  Alexey Shchepin  <alexey@sevcom.net>
      
      	* roster.tcl: New hook on changing other users presence
      
      	* presence.tcl: New hook on changing our presence
      
      	* login.tcl: New hooks for connected & disconnected procedures
      
      	* unix/wmdock.tcl: Support for WindowMaker dock (thanks Michail
      	Litvak)
      
      	* tkabber.tcl (fullpath): Works more correctly
      
      	* tkabber.tcl: make the about window it's own proc; fix
      	plugins::load typo for platform (had an extra call to fullpath)
      	(thanks Marshall T. Rose)
      
      	* tkabber.tcl (add_win): Change iconname of windows in non-tab
      	mode
      
      	* unix/autoaway.tcl: Fixed bug with calling of autoaway functions
      	when tkXwin package not present
      
      2002-08-25  Alexey Shchepin  <alexey@sevcom.net>
      
      	* chats.tcl (chat::add_emoteiconed_text): Limited output of
      	emoticons by number of it instead of body size
      
      	* login.tcl: New hooks on connection and disconnection from server
      
      	* filetransfer.tcl (ft::send_file_accept): Content type changed to
      	application/data to avoid corrupting of binary files
      
      	* hooks.tcl: All hooks functions moved from plugins.tcl to
      	hooks.tcl
      	* plugins.tcl: Likewise
      
      	* presence.tcl (get_jid_status): Bugfix
      
      	* (all): removed not needed "global w"; tab_set_updated now has
      	defaults for some of its arguments; fixed a typo introduced with
      	the silly entry .delete .insert thing; temporarily put a catch
      	around the creation of rostericon(user,invisible); tab_set_updated
      	is a bit more clever to figure out if an update has actually
      	happened (the dockingtray stuff needs that); put finload after the
      	invocation of the login dialog; cleaned up autoaway.tcl a bit
      	(thanks Marshall T. Rose)
      
      	* roster.tcl (roster::redraw): Don't show groups without online
      	users in "Show online users only" mode
      
      	* iq-plugins/time.tcl: Show timezone in <display/> tag
      
      2002-08-24  Alexey Shchepin  <alexey@sevcom.net>
      
      	* joingrdialog.tcl: New conference room creation dialog, but it
      	seems that room creation not implemented in jabberd
      
      	* chats.tcl: Colors of chat text can be configured via xrdb
      
      	* pixmaps/gabber/services/: New icons for gabber theme
      
      2002-08-23  Alexey Shchepin  <alexey@sevcom.net>
      
      	* unix/autoaway.tcl: New plugin for autoaway support
      
      	* chats.tcl: Change type of messages with empty type to
      	$default_message_type
      
      	* roster.tcl: Fixed showing of conference items foreground
      
      	* roster.tcl: Support for new icons
      
      	* jabberlib-tclxml/tclxml/: Added TclXML with tclparser
      
      	* jabberlib-tclxml/wrapper.tcl: Changes to support tclparser
      	library
      
      2002-08-22  Alexey Shchepin  <alexey@sevcom.net>
      
      	* (all): change a few puts into debugmsg. fix an interoperability
      	bug with gabber messages. double-sided clicks. a few more "..." in
      	the menus. better focus selection in the dialogs. a fix for an
      	amusing entry/disabled problem in windows. still another approach
      	to the "package require Tls" thing. rearrange the order of some
      	widget creations, so that TAB works as you'd expect. add a user
      	hook, [get_our_presence_status], that gives the <status/> on a
      	presence change. typo in browseurl. various little UI changes
      	(thanks Marshall T. Rose)
      
      	* chats.tcl (chat::change_presence): Bugfix
      
      2002-08-21  Alexey Shchepin  <alexey@sevcom.net>
      
      	* roster.tcl (roster::redraw): Items now sorted by names instead
      	of jids
      
      	* chats.tcl (chat::create_user_menu): More useful items in user's
      	menu
      
      	* joingrdialog.tcl: Checking for errors while joining conference
      	with v2 protocol.  Support for password-protected groups with v2
      	protocol
      
      	* chats.tcl: Fixed scrollbars in invitation dialog
      
      	* roster.tcl: Fixed scrollbars in 'send users' dialog
      
      	* tkabber.tcl: Menu for avatars
      
      	* avatars.tcl: Support for storing avatar on server and bugfixes
      
      	* chats.tcl (chat::process_message): Temporary workaround in bug
      	with empty message type
      
      	* avatars.tcl (avatar::get_image): Fixed typo with debugmg
      
      2002-08-20  Alexey Shchepin  <alexey@sevcom.net>
      
      	* (all): Changed work with icons; added some new icons (thanks
      	Sergei Golovan)
      
      	* (all): have avatar.tcl use debugmsg; enable right-clicks for
      	chat menubutton; add "..." to create_user_menu; better login/tls
      	prompting; small grammar correction (thanks Marshall T. Rose)
      
      	* examples/config.tcl: Expamle of using avatars and emoticons
      
      	* roster.tcl (roster::add_menu_item): Bugfix
      
      	* emoticons.tcl: Emoticons menu can also popup by A-e
      
      2002-08-19  Alexey Shchepin  <alexey@sevcom.net>
      
      	* chat-plugins/nick_command.tcl: Temporary solution for nick
      	changes in v1 protocol
      
      	* balloon.tcl: Small fixes to make Frink work more silently
      	* browser.tcl: Likewise
      	* chats.tcl: Likewise
      	* filters.tcl: Likewise
      	* plugins.tcl: Likewise
      
      	* roster.tcl: Now users can set default nicks via array
      	defaultnick
      	* examples/config.tcl: Example of using defaultnick
      
      	* emoticons.tcl: Now in chats we can popup menu with emoticons by
      	pressing M-e
      
      	* presence.tcl: Bugfixes
      
      	* roster.tcl: In user popup menu now possible to select different
      	resources of users
      
      	* (all): 1. replace remaining "puts" with "debugmsg" 2. menus
      	for headlines 3. small typos/capitalizations, e.g., "distrub",
      	"Histroy" 4. remove tearoff from the popupmenus (because these
      	expect $curuser to point to the current item, but that won't work
      	for a tearoff) 5. two new hooks: proc menuload to update the menu
      	specification, and proc finload, called right before the
      	login. (see examples/mtr-config.tcl for examples of their usage.)
      	6. sgml bug fixed. (thanks Marshall T. Rose)
      
      2002-08-18  Alexey Shchepin  <alexey@sevcom.net>
      
      	* userinfo.tcl: Show result of iq:last in more user-readable form
      
      	* avatars.tcl: Basic support for avatars
      	* userinfo.tcl: Likewise
      	* presence.tcl: Likewise
      
      	* browser.tcl: New icons for aim, icq, msn and yahoo transports
      	(thanks Sergei Golovan)
      
      	* roster.tcl: Changed button to show only online buttons (thanks
      	Sergei Golovan)
      	* tkabber.tcl: Likewise
      
      	* messages.tcl: Changed calls to base64 function
      
      	* roster.tcl: Items indent now less to avoid wasting of useful
      	space
      
      	* chats.tcl: Bugfixes
      
      	* roster.tcl: Bugfixes
      
      2002-08-17  Alexey Shchepin  <alexey@sevcom.net>
      
      	* roster.tcl: Now we have much more beautiful roster (thanks
      	Sergei Golovan)
      
      	* chats.tcl: Added menu entry in conferences to show history
      
      	* chat-plugins/logger.tcl: New format for history files, not
      	compatible with old
      
      	* (all): 1. for a group conference, have the "Subject:" button lie
      	flat and work on right-click, like the rest of the user
      	buttons. 2. use the stated priority when logging in. 3. add
      	"logout with reason". 4. a few more "..." to menu names, also use
      	"Cancel" instead of "Close" for many windows. 5. a lot of cleanups
      	for the headline code. it's pretty usable now. 6. still more work
      	on the user status popup 7. don't advertise conferences when
      	sending users or making invitations 8. better proc browseurl
      	9. put logs in ~/.tkabber/logs/ (thanks Marshall T. Rose)
      
      	* login.tcl: Now can send encrypted password (thanks Sergei Golovan)
      
      2002-08-16  Alexey Shchepin  <alexey@sevcom.net>
      
      	* chats.tcl: Added menu in every userchat for showing user
      	information and history
      
      	* roster.tcl: Different menu for conference items
      
      	* chats.tcl (chat::highlighttext): Changing form of mouse cursor,
      	when it on URL (thanks Sergei Golovan)
      
      	* (all): new image for headlines (taken from gabber); menubutton
      	to invite folks to join an existing conference; implemented
      	receiving x:roster and x:oob; implemented sending x:roster;
      	implemented resubscribe; for file transfer, will try to get a
      	default ip address other than 127.0.0.1; for the
      	filters/search/register windows, don't draw them until the server
      	responds; diddle status menubutton when starting and when
      	dis/connected; if disconnected by network, put up the login
      	dialog; many cosmetic changes (big thanks to Marshall T. Rose)
      
      	* chats.tcl: New variable 'url_regexp'
      
      	* tkabber.tcl (pixmap): New function for finding images with
      	different themes (thanks Sergei Golovan)
      	* browser.tcl: Using 'pixmap' for loading images
      	* roster.tcl: Likewise
      	* pixmaps/: New themes 'psi' & 'gabber'
      	* examples/config.tcl: Example of using different themes
      
      2002-08-15  Alexey Shchepin  <alexey@sevcom.net>
      
      	* Tclx.tcl (lmatch): Fixed bug with regexp processing
      
      	* chat-plugins/completion.tcl: Now completion work correctly with
      	nicks that contain non-latin1 characters and work like zsh with
      	AUTO_MENU option (cycle completion?)
      
      	* tkabber.tcl: Removed 'T' button from toolbar
      
      2002-08-14  Alexey Shchepin  <alexey@sevcom.net>
      
      	* browser.tcl: Now show number of children in popup balloon for each
      	item
      
      	* chats.tcl: Now autoscrolling in chats can be stopped
      	* tkabber.tcl: Added menu for stoping autoscroll
      
      	* chats.tcl: Highlighting URLs and start WEB-browser on click
      
      	* chat-plugins/draw_normal_message.tcl: Highlight user's nick at
      	begining of message
      
      	* tkabber.tcl (tab_set_updated): Added different levels of updates
      	in chats, that highlighted with different colors
      	* chat-plugins/draw_normal_message.tcl: Likewise
      	* chat-plugins/draw_server_message.tcl: Likewise
      	* chat-plugins/draw_error.tcl: Likewise
      
      	* (all): Replaced "Ok" to "OK" in dialog buttons
      
      	* tkabber.tcl: Changed grid weight for roster, because with old
      	value on some systems roster have null width
      	* chats.tcl: Likewise
      
      	* chat-plugins/draw_normal_message.tcl: Nick names also highlited
      
      	* examples/mtr-config.tcl: Updated
      
      	* messages.tcl: Bugfix in headlines processing (thanks Marshall
      	T. Rose)
      
      2002-08-13  Alexey Shchepin  <alexey@sevcom.net>
      
      	* userinfo.tcl: Support for editing user's vCard
      
      2002-08-12  Alexey Shchepin  <alexey@sevcom.net>
      
      	* emoticons.tcl: Basic support for JEP-0038 (image/gif only and no
      	sounds)
      
      	* (all): Support for headlines, invitations of users to join
      	chats, better support for configurable colors, fixing typos, and
      	replacing many functions of TclX (big thanks to Marshall T. Rose)
      
      2002-08-11  Alexey Shchepin  <alexey@sevcom.net>
      
      	* chats.tcl (chat::add_emoteiconed_text): Performance improvements
      
      	* userinfo.tcl: Now can query jabber:iq:last
      
      	* iq-plugins/version.tcl: Show also OS version
      
      	* browser.tcl: Fixed bug with spaces in jids
      
      	* utils.tcl: Added functions to simplify work with canvas tags
      
      	* login.tcl: Support for user's login profiles
      	* examples/config.tcl: Added examples of using login profiles
      
      2002-08-10  Alexey Shchepin  <alexey@sevcom.net>
      
      	* chats.tcl: Fixed bug with nicks containg glob-characters
      
      	* iq-plugins/browse.tcl: Answer on browser requests with supported
      	iq namespaces
      
      	* roster.tcl: Now roster don't change position on any change
      
      	* chats.tcl (chat::change_presence): Fixed bug with staying users
      	after exiting conference with v2 protocol
      
      	* browser.tcl: Now items can be draged to browser's entry field
      
      	* tkabber.tcl (tab_set_updated): Performance improvements
      
      2002-08-09  Alexey Shchepin  <alexey@sevcom.net>
      
      	* search.tcl: Now users can be added from search results
      
      	* joingrdialog.tcl: Conference-v2 support
      	* joingrdialog.tcl (join_group_dialog): Added checkbutton for
      	selecting conference protocol
      
      	* roster.tcl: Now items can be draged from browser to roster
      	* browser.tcl: Likewise
      
      	* messages.tcl: Processing of jabber:x:roster, jabber:x:oob &
      	jabber:x:conference (not completed)
      
      	* tkabber.tcl (debugmsg): New function for showing debug messages
      	* browser.tcl: Replaced "puts" to "debugmsg" calls
      	* chats.tcl: Likewise
      	* filetransfer.tcl: Likewise
      	* filters.tcl: Likewise
      	* iq.tcl: Likewise
      	* joingrdialog.tcl: Likewise
      	* plugins.tcl: Likewise
      	* presence.tcl: Likewise
      	* roster.tcl: Likewise
      	* search.tcl: Likewise
      	* userinfo.tcl: Likewise
      
      2002-08-08  Alexey Shchepin  <alexey@sevcom.net>
      
      	* joingrdialog.tcl: Conference-v2 support (not completed)
      
      	* login.tcl (show_login_dialog): Set focus by default on "Login"
      	button
      
      	* roster.tcl: Now in group names drawed how many online users in
      	this group
      
      	* browser.tcl: Bugfixes & removed old browser code
      
      	* tkabber.tcl: Reorganized main menu
      
      2002-08-07  Alexey Shchepin  <alexey@sevcom.net>
      
      	* userinfo.tcl: Changes to more correspond to
      	http://www.jabber.org/protocol/vcard-xml/vCard-XML-v2-20010520.dtd
      	(not completed)
      
      	* browser.tcl: New Jabber Browser interface
      
      2002-08-06  Alexey Shchepin  <alexey@sevcom.net>
      
      	* filters.tcl: Support for editing filters
      
      	* browser.tcl: Browser now can be scrolled with mousewheel (if it
      	binds to 4 and 5 mouse buttons).
      
      	* login.tcl (client:disconnect): New function, that called when
      	disconnecting
      
      	* tkabber.tcl: Now roster can be collapsed with C-r
      
      2002-08-05  Alexey Shchepin  <alexey@sevcom.net>
      
      	* roster.tcl: Scrollbars on roster now drawed only when needed
      
      	* search.tcl: Displaying of jids in search results and added
      	scrollbars
      
      	* (all): Tkabber now can be started from any directory
      
      	* login.tcl: Fixed typo which result in ignoring entered in login
      	dialog fields
      
      	* tkabber.tcl: Correctly logout when closing main window
      
      2002-08-03  Alexey Shchepin  <alexey@sevcom.net>
      
      	* emoticons.tcl: Changed emoticons API
      
      	* userinfo.tcl: Bugfix
      
      2002-08-02  Alexey Shchepin  <alexey@sevcom.net>
      
      	* examples: Added some examples of config file & xrdb files
      	(thanks Sergei Golovan)
      
      	* login.tcl: All data for login now stored in loginconf variable
      
      	* tkabber.tcl (tab_set_updated): Bugfix in tabs highlighting
      
      	* balloon.tcl: Added new tooltips engine (thanks Sergei Golovan)
      
      	* tkabber.tcl: Config now stored in ~/.tkabber/config.tcl
      
      	* tkabber.tcl: Fixed bug with incorrect closing of chat windows
      
      2002-08-01  Alexey Shchepin  <alexey@sevcom.net>
      
      	* chats.tcl (chat::open_window): Don't resize roster when resizing
      	window
      	* tkabber.tcl: Likewise
      
      	* messages.tcl (send_message_dialog): Now destination address can
      	be edited
      	* tkabber.tcl (menu): Added menu entry for sending new messages
      
      	* tkabber.tcl: Support for status line
      	* roster.tcl (roster::on_change_jid_presence): Likewise
      
      	* filetransfer.tcl: Bugfixes in sending file
      
      	* tkabber.tcl (tab_set_updated): Highlighting tabs in non-active
      	chats
      
      	* roster.tcl: Added dialog for editing names of roster items
      
      	* chats.tcl (chat::open_window): Now if jid have name in roster,
      	then this name used in titles.
      
      2002-07-31  Alexey Shchepin  <alexey@sevcom.net>
      
      	* tkabber.tcl (add_win): Temporary workaround for bug with tabs &
      	jids with spaces
      
      2002-07-30  Alexey Shchepin  <alexey@sevcom.net>
      
      	* roster.tcl (roster::addline): Collapsed groups now highlighted
      
      	* filetransfer.tcl: Basic support for file transfers
      	* iq-plugins/oob.tcl: Likewise
      
      	* iq.tcl: Answer "501 Not Implemented" on unknown iq requests
      
      2002-07-29  Alexey Shchepin  <alexey@sevcom.net>
      
      	* browser.tcl: Add checks to avoid errors when reply received in
      	closed window
      
      	* login.tcl: Now we can create new accounts
      
      	* editgroups.tcl (change_groups_to_user): Changes in roster item
      	groups now don't touch another item parameters
      	* roster.tcl (roster::item_to_xml): Likewise
      
      	* (all): Tkabber now parse xml stream via TclXML library
      	(http://tclxml.sf.net)
      
      	* utils.tcl (tolower_node_and_domain): Fixed stupid bug with
      	doubling of resource field in jids that have not node field
      
      	* tkabber.tcl: Fixed mistake in menu "Services"
      
      	* tkabber.tcl (add_win): Fixed mistake with "wm title"
      
      ����������������������������������������������������������������������������������������������������������������������������������tkabber/INSTALL�������������������������������������������������������������������������������������0000644�0000000�0000000�00000000013�14777013213�0013074�0����������������������������������������������������������������������������������������������������ustar�00nobody��������������������������nobody�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������See README
      ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������tkabber/Makefile������������������������������������������������������������������������������������0000644�0000000�0000000�00000003164�14777013213�0013515�0����������������������������������������������������������������������������������������������������ustar�00nobody��������������������������nobody�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Tkabber Makefile
      
      PREFIX = /usr/local
      TKABBERDIR = $(PREFIX)/share/tkabber
      DOCDIR = $(PREFIX)/share/doc/tkabber
      BINDIR = $(PREFIX)/bin
      
      SUBDIRS = emoticons \
      	  ifacetk   \
      	  msgs      \
      	  pixmaps   \
      	  plugins   \
      	  sounds    \
      	  tclxmpp   \
      	  tk        \
      	  trans     \
      	  ttk
      
      all: doc
      
      doc: README doc/tkabber.html
      
      README: doc/tkabber.xml
      	DISPLAY= xml2rfc $< -o $@ --text
      
      doc/tkabber.html: doc/tkabber.xml
      	DISPLAY= xml2rfc $< -o $@ --html
      
      install: install-bin install-doc install-examples
      
      install-bin:
      	install -d $(DESTDIR)$(TKABBERDIR)
      	cp -dr --no-preserve=ownership *.tcl $(SUBDIRS) $(DESTDIR)$(TKABBERDIR)
      	chmod 755 $(DESTDIR)$(TKABBERDIR)/tkabber.tcl
      	chmod 755 $(DESTDIR)$(TKABBERDIR)/tkabber-remote.tcl
      	install -d $(DESTDIR)$(BINDIR)
      	echo "#!/bin/sh" >$(DESTDIR)$(BINDIR)/tkabber
      	echo "exec $(TKABBERDIR)/tkabber.tcl \"\$$@\"" >>$(DESTDIR)$(BINDIR)/tkabber
      	echo "#!/bin/sh" >$(DESTDIR)$(BINDIR)/tkabber-remote
      	echo "exec $(TKABBERDIR)/tkabber-remote.tcl \"\$$@\"" >>$(DESTDIR)$(BINDIR)/tkabber-remote
      	chmod 755 $(DESTDIR)$(BINDIR)/tkabber
      	chmod 755 $(DESTDIR)$(BINDIR)/tkabber-remote
      
      install-doc: doc
      	install -d $(DESTDIR)$(DOCDIR)
      	install -m 644 AUTHORS COPYING ChangeLog README doc/tkabber.html $(DESTDIR)$(DOCDIR)
      
      install-examples:
      	install -d $(DESTDIR)$(DOCDIR)
      	cp -dr --no-preserve=ownership examples $(DESTDIR)$(DOCDIR)
      
      # Update Tkabber from Fossil repository
      up:
      	test -f .fslckout -o -f _FOSSIL_ && fossil pull && fossil update
      	test -d tclxmpp && cd tclxmpp && \
      	    test -f .fslckout -o -f _FOSSIL_ && fossil pull && fossil update
      
      .PHONY: all doc install install-bin install-doc install-examples up
      ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������tkabber/README��������������������������������������������������������������������������������������0000644�0000000�0000000�00000317245�14777013213�0012745�0����������������������������������������������������������������������������������������������������ustar�00nobody��������������������������nobody�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
      
      
      
                                                                   A. Shchepin
                                                                   Process-One
                                                                       M. Rose
                                                  Dover Beach Consulting, Inc.
                                                                    S. Golovan
                                                           New Economic School
                                                                     M. Litvak
                                                                 Colocall Ltd.
                                                                  K. Khomoutov
                                                                   Service 007
                                                                    March 2015
      
      
                                   Tkabber 1.1.2+
      
      Abstract
      
         _Tkabber_ is an open source Jabber client, written in _Tcl/Tk_.  This
         memo describes the installation, configuration, and extension of
         _Tkabber_.
      
      Table of Contents
      
         1.  Features  . . . . . . . . . . . . . . . . . . . . . . . . . .   3
         2.  Requirements  . . . . . . . . . . . . . . . . . . . . . . . .   5
         3.  Download, install and run . . . . . . . . . . . . . . . . . .   8
         4.  Upgrading . . . . . . . . . . . . . . . . . . . . . . . . . .  10
           4.1.  Upgrading from version 1.0, 1.1 or 1.1.1  . . . . . . . .  10
           4.2.  Upgrading from version 0.11.0 or 0.11.1 . . . . . . . . .  10
             4.2.1.  External plugins  . . . . . . . . . . . . . . . . . .  10
             4.2.2.  Configuration options . . . . . . . . . . . . . . . .  10
           4.3.  Upgrading from version 0.10.0 . . . . . . . . . . . . . .  11
             4.3.1.  Configuration options . . . . . . . . . . . . . . . .  11
               4.3.1.1.  Proxy servers . . . . . . . . . . . . . . . . . .  12
               4.3.1.2.  Resources to control fonts  . . . . . . . . . . .  12
               4.3.1.3.  Keep-alives and dead link detection . . . . . . .  13
               4.3.1.4.  Resources to control appearance of balloon
                         windows . . . . . . . . . . . . . . . . . . . . .  13
               4.3.1.5.  Support for external XML parser . . . . . . . . .  14
             4.3.2.  User interface  . . . . . . . . . . . . . . . . . . .  14
               4.3.2.1.  System tray icon mouse gestures . . . . . . . . .  14
               4.3.2.2.  New tab management widget . . . . . . . . . . . .  14
               4.3.2.3.  Window splitters  . . . . . . . . . . . . . . . .  15
           4.4.  Upgrading from version 0.9.9  . . . . . . . . . . . . . .  15
         5.  Configuration . . . . . . . . . . . . . . . . . . . . . . . .  15
           5.1.  Pre-load  . . . . . . . . . . . . . . . . . . . . . . . .  16
             5.1.1.  Tabbed Interface  . . . . . . . . . . . . . . . . . .  17
             5.1.2.  Fonts and colors  . . . . . . . . . . . . . . . . . .  18
      
      
      
      Shchepin, et al.        Expires September 2, 2015               [Page 1]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
             5.1.3.  Cryptography by default . . . . . . . . . . . . . . .  20
             5.1.4.  Debugging Output  . . . . . . . . . . . . . . . . . .  20
             5.1.5.  Splash window . . . . . . . . . . . . . . . . . . . .  21
             5.1.6.  I18n/L10n . . . . . . . . . . . . . . . . . . . . . .  21
             5.1.7.  Browse URL  . . . . . . . . . . . . . . . . . . . . .  21
             5.1.8.  Searching . . . . . . . . . . . . . . . . . . . . . .  22
           5.2.  Post-load . . . . . . . . . . . . . . . . . . . . . . . .  22
             5.2.1.  Look-and-Feel . . . . . . . . . . . . . . . . . . . .  27
             5.2.2.  The system tray icon (for Unix) . . . . . . . . . . .  27
             5.2.3.  The Autoaway Module . . . . . . . . . . . . . . . . .  28
             5.2.4.  The Avatar Module . . . . . . . . . . . . . . . . . .  28
             5.2.5.  The Chat Module . . . . . . . . . . . . . . . . . . .  28
             5.2.6.  The Clientinfo Module . . . . . . . . . . . . . . . .  28
             5.2.7.  The Conferenceinfo Module . . . . . . . . . . . . . .  29
             5.2.8.  The Cryptographic Module  . . . . . . . . . . . . . .  29
             5.2.9.  The Emoticons Module  . . . . . . . . . . . . . . . .  29
             5.2.10. The File Transfer Module  . . . . . . . . . . . . . .  30
             5.2.11. The Groupchat Module  . . . . . . . . . . . . . . . .  30
             5.2.12. The Ispell Module . . . . . . . . . . . . . . . . . .  31
             5.2.13. The Stream Initiation Module  . . . . . . . . . . . .  31
             5.2.14. The Logger Module . . . . . . . . . . . . . . . . . .  32
             5.2.15. The Proxy Module  . . . . . . . . . . . . . . . . . .  32
             5.2.16. The Login Module  . . . . . . . . . . . . . . . . . .  34
             5.2.17. The Message Module  . . . . . . . . . . . . . . . . .  36
             5.2.18. The Raw XML Input Module  . . . . . . . . . . . . . .  36
             5.2.19. The Roster Module . . . . . . . . . . . . . . . . . .  36
             5.2.20. The Sound Module  . . . . . . . . . . . . . . . . . .  36
           5.3.  Menu-load . . . . . . . . . . . . . . . . . . . . . . . .  38
             5.3.1.  The Avatar Module . . . . . . . . . . . . . . . . . .  39
             5.3.2.  The Browser Module  . . . . . . . . . . . . . . . . .  39
             5.3.3.  The Groupchat Module  . . . . . . . . . . . . . . . .  39
             5.3.4.  The Login Module  . . . . . . . . . . . . . . . . . .  39
             5.3.5.  The Message Module  . . . . . . . . . . . . . . . . .  39
             5.3.6.  The Presence Module . . . . . . . . . . . . . . . . .  39
             5.3.7.  Miscellany  . . . . . . . . . . . . . . . . . . . . .  40
           5.4.  Final-Load  . . . . . . . . . . . . . . . . . . . . . . .  41
         6.  Extensibility . . . . . . . . . . . . . . . . . . . . . . . .  41
           6.1.  Message Hooks . . . . . . . . . . . . . . . . . . . . . .  42
           6.2.  Chat Hooks  . . . . . . . . . . . . . . . . . . . . . . .  43
           6.3.  Login Hooks . . . . . . . . . . . . . . . . . . . . . . .  45
           6.4.  Presence Hooks  . . . . . . . . . . . . . . . . . . . . .  45
           6.5.  Info/Query Hook . . . . . . . . . . . . . . . . . . . . .  46
           6.6.  Roster Hooks  . . . . . . . . . . . . . . . . . . . . . .  46
           6.7.  Miscellaneous Hooks . . . . . . . . . . . . . . . . . . .  47
         7.  User Interface basics . . . . . . . . . . . . . . . . . . . .  47
           7.1.  Searching . . . . . . . . . . . . . . . . . . . . . . . .  47
           8.1.  URIs  . . . . . . . . . . . . . . . . . . . . . . . . . .  49
         Appendix A.  Releases History . . . . . . . . . . . . . . . . . .  50
      
      
      
      Shchepin, et al.        Expires September 2, 2015               [Page 2]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
           A.1.  Main changes in 1.1.2+  . . . . . . . . . . . . . . . . .  50
           A.2.  Main changes in 1.1.2 . . . . . . . . . . . . . . . . . .  50
           A.3.  Main changes in 1.1.1 . . . . . . . . . . . . . . . . . .  50
           A.4.  Main changes in 1.1 . . . . . . . . . . . . . . . . . . .  51
           A.5.  Main changes in 1.0 . . . . . . . . . . . . . . . . . . .  51
           A.6.  Main changes in 0.11.1  . . . . . . . . . . . . . . . . .  52
           A.7.  Main changes in 0.11.0  . . . . . . . . . . . . . . . . .  52
           A.8.  Main changes in 0.10.0  . . . . . . . . . . . . . . . . .  53
           A.9.  Main changes in 0.9.9 . . . . . . . . . . . . . . . . . .  54
           A.10. Main changes in 0.9.8 . . . . . . . . . . . . . . . . . .  54
           A.11. Main changes in 0.9.7beta . . . . . . . . . . . . . . . .  54
           A.12. Main changes in 0.9.6beta . . . . . . . . . . . . . . . .  55
           A.13. Main changes in 0.9.5beta . . . . . . . . . . . . . . . .  55
         Appendix B.  Tk option database resources . . . . . . . . . . . .  55
         Appendix C.  Documentation TODO . . . . . . . . . . . . . . . . .  58
         Appendix D.  Acknowledgements . . . . . . . . . . . . . . . . . .  59
         Appendix E.  Copyrights . . . . . . . . . . . . . . . . . . . . .  59
         Authors' Addresses  . . . . . . . . . . . . . . . . . . . . . . .  59
      
      1.  Features
      
         Tkabber [1] provides a _Tcl/Tk_ interface to the Jabber/XMPP [2]
         instant messaging and presence service.
      
         _Tcl/Tk_ is a graphical scripting language that runs on the Unix,
         Windows, and Macintosh platforms.  The choice of _Tcl/Tk_ for a
         Jabber client is three-fold:
      
         o  it is portable: once you install a _Tcl/Tk_ interpreter on your
            system, the _Tkabber_ script "just runs" -- without having to
            compile anything;
      
         o  it is customizable: _Tkabber_ reads a configuration file when it
            starts that tells it the settings of various parameters; and,
      
         o  it is extensible: the configuration file is actually a _Tcl_
            script, so you can replace or augment entire portions of _Tkabber_
            (if you're so inclined).
      
         _Tkabber_ is fully-featured:
      
         sessions:
      
            *  TCP, BOSH and HTTP-polling session transports
      
            *  XMPP SRV and TXT DNS-records handling
      
            *  hashed passwords
      
      
      
      Shchepin, et al.        Expires September 2, 2015               [Page 3]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
            *  SASL authentication
      
            *  encrypted sessions (if you install an optional extension)
      
            *  compressed sessions (if you install an optional extension)
      
            *  login via SOCKS4a, SOCKS5 or HTTPS proxy
      
            *  IPv6 support (from Tcl/Tk 8.6)
      
            *  user-defined hooks for connection establishment and release
      
            *  XMPP/Jabber MIME type
      
         messages:
      
            *  privacy rules
      
            *  GPG-signed/encrypted messages (if you install an optional
               extension)
      
            *  Off-the-record (OTR [3]) messaging
      
            *  file transfers (HTTP, SOCKS bytestream, DTCP and IBB
               transports)
      
            *  groupchat (GroupChat-1.0 and Multi-User Chat conferencing
               protocols)
      
            *  headline messages
      
            *  message events
      
            *  completions of nick and commands
      
            *  hyperlinks
      
            *  emoticons
      
            *  user-defined hooks for messages arriving and chat window events
      
         presence:
      
            *  signed presence (if you install an optional extension)
      
            *  avatars
      
            *  browsing
      
      
      
      Shchepin, et al.        Expires September 2, 2015               [Page 4]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
            *  groupchat and roster invitations
      
            *  conference room bookmarks
      
            *  annotations about roster items
      
            *  vCards
      
            *  user-defined hooks for presence changes
      
         windowing:
      
            *  configurable look-and-feel via a resources database
      
            *  unicode
      
            *  tabbed/non-tabbed interface
      
            *  sound notifications
      
            *  nested roster groups
      
            *  roster metacontacts
      
            *  auto-away
      
            *  for Unix: spell checking, KDE or freedesktop docking, and
               WMaker icons
      
            *  for Windows: taskbar icons
      
      2.  Requirements
      
         You should already have installed:
      
         o  Tcl/Tk version 8.5.8 [4] (or later, Tcl/Tk 8.6.3 or later is
            recommended).  Note, that if you want to use Tkabber in IPv6
            environment, you'll have to install Tcl/Tk 8.6.
      
         o  tcllib version 1.8 [5] (or later, tcllib 1.16 or later is required
            for SCRAM SASL mechanism support).
      
         o  BWidget 1.9 [6] (or later)
      
         Most systems already come with these packages pre-installed.  If not,
         various Unix systems have them available as ready-made packages.
         Otherwise, go to the URLs above and click on the appropriate download
         link for your system.  Both _tcllib_ and _BWidget_ are script
      
      
      
      Shchepin, et al.        Expires September 2, 2015               [Page 5]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         libraries -- no compiling is necessary.  In the case of _Tcl/Tk_,
         there are many ready-made binary packages available on the download
         site.
      
         The ActiveTcl [7] distribution contains all three packages (along
         with the _tls_ and _Img_ package mentioned below); so, you may want
         to use that instead of three separate downloads.
      
         At your discretion, there are several optional packages that you may
         also install.  _Tkabber_ will run just fine without them, but if
         they're available _Tkabber_ will make additional features available
         to you.  So, here's the list:
      
         o  By default, the Tcl's DNS package uses TCP for its communication
            with DNS servers.  If your DNS server requires usin UDP then you
            may want to install Tcl UDP extension [8] version 1.0.8 (or
            later).  This extension works both for Unix and Windows.
      
      
      
         o  By default, communications between the server and client take
            place over a plaintext connection.  While this may not be a
            problem in some local, wired environments, if your server is
            distant or your client is wireless, then you may want to encrypt
            all the client/server traffic.
            Accordingly, you may to install tls version 1.4.1 [9] (or later).
            This package works on both Unix and Windows.  Note that if you're
            using Unix, then you'll also need to have _OpenSSL_ installed.
            Fortunately, this comes preinstalled on many Unix systems.  If
            it's not on your system, check OpenSSL source page [10].  (The
            Windows distribution of _tls_ comes with all the necessary DLLs.)
      
      
      
         o  _Tcl/Tk_ supports only a small number of image formats (i.e.,
            bitmaps, GIFs and portable pixmaps).  If presence information
            contains avatars, these may be in other formats (e.g., PNGs or
            JPGs).
            Accordingly, you may want to install Img version 1.2 [11] (or
            later).  This package works on both Unix and Windows.
      
      
      
         o  Tkabber comes bundled with pure-Tcl XML parser.  If its
            performance is insufficient, you may want to install tDOM version
            0.8.0 [12] (or later) and use expat based XML parser.
      
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015               [Page 6]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         o  Another option in Unix is to compress connection between client
            and server (it currently disables encryption).
            There's no special requirements for traffic compression in Tcl/Tk
            8.6, but if you're using Tcl/Tk 8.5 and want to compress traffic
            you should install ZTcl version 1.0b4 [13] (or later) and Tclmore
            version 0.7b1 [14] (or later).
            (At the time of 0.11.0 release _ZTcl_ and _Tclmore_ home page were
            unavailable, so you may grab them from a mirror [15].)
      
      
      
         o  By default, end-to-end communications between two or more Jabber
            clients is plaintext.  Depending on your environment, this may not
            be a problem for you.  Alternatively, you may want to digitally-
            sign all of your outgoing messages, and allow others to encrypt
            their messages to you.
            Accordingly, you may want to install the _TclGPG_ package.
            Depending on what's already installed on your system, you may have
            to download upto two software bits:
      
            *  TclGPG [16] (available only in a Fossil [17] repository at
               present);
      
            *  GPG version 1.0.7 [18] (or later).
            Another alternative is to use Off-the-record messaging protocol
            [19], if your contact supports it.  The OTR plugin is included
            into _Tkabber plugins collection_ starting from version 1.1 and
            requires a few packages from _Tcllib_, namely the _aes_, _asn_,
            _base64_, _math::bignum_, _sha1_, _sha256_ packages.  Also, if
            you're using Windows, the Memchan [20] extension has to be
            installed to run the OTR plugin.
      
      
      
         o  If you're running Unix or Windows, then you may want _Tkabber_ to
            play predefined sounds when message or presence arrives.
            Accordingly, you may want to install Snack version 2.2.10 [21] (or
            later).
      
      
      
         o  If you're running Unix, then you may want _Tkabber_ to use the
            docking tray.
            Accordingly, you may want to install tktray version 1.3 [22] (or
            later) for freedesktop icon (supported by modern _KDE_ and
            _GNOME_).
      
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015               [Page 7]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         o  If you're running Windows, then you may want _Tkabber_ to use the
            system tray.
            Accordingly, you may want to install Winico version 0.6 [23] (or
            later).
      
      
      
         o  If you're a Tcl/Tk guru, then you may want to access the Tk
            console to debug things.
            Accordingly, you may want to install tkcon version 2.3 [24] (or
            later).
      
         Please keep in mind that these are all "optional extras" -- if
         they're not right for you or your environment, don't bother with
         them!
      
      3.  Download, install and run
      
         Latest stable version is 1.1.2 and available at
         http://tkabber.jabber.ru/download .
      
         Older versions can be found at http://files.jabber.ru/tkabber/ .
      
         You can always find the latest development version via Fossil [27].
         Execute the following commands:
      
      fossil clone https://chiselapp.com/user/sgolovan/repository/tkabber tkabber.fossil
      fossil clone https://chiselapp.com/user/sgolovan/repository/tclxmpp tclxmpp.fossil
      mkdir tkabber
      cd tkabber
      fossil open ../tkabber.fossil
      mkdir tclxmpp
      cd tclxmpp
      fossil open --nested ../../tclxmpp.fossil
      
         And if you want to test some plugins, then do
      
      fossil clone https://chiselapp.com/user/sgolovan/repository/tkabber-plugins tkabber-plugins.fossil
      mkdir tkabber-plugins
      cd tkabber-plugins
      fossil open ../tkabber-plugins.fossil
      
      
      
      
      
      
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015               [Page 8]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         And if you want to try unofficial plugins, then execute
      
      fossil clone https://chiselapp.com/user/sgolovan/repository/tkabber-contrib tkabber-contrib.fossil
      mkdir tkabber-contrib
      cd tkabber-contrib
      fossil open ../tkabber-contrib.fossil
      
         They usually include short readme with info on what they do and how
         to use them.
      
         If you use the Debian GNU/Linux distribution, you may want to get all
         required packages by using _apt_.  Just execute
      
         apt-get install tk tcllib bwidget
      
         or
      
         apt-get install tkabber
      
         to get the version included into Debian repository.
      
         No real installation is required, simply copy the "tkabber/"
         directory to a commonly-available area, and then either:
      
         o  put this directory in your search-path; or,
      
         o  make a calling script/shortcut to the file "tkabber.tcl" in that
            directory.
      
         Although _Tkabber_ comes with a Makefile, there's really not much to
         do -- most folks prefer to simply copy the distribution directory to
         somewhere in their home directory.
      
         From the shell, you can invoke _Tkabber_ as:
      
         % tkabber.tcl
      
         whilst on a windowing system, simply double-click on that file or a
         short-cut to it.
      
      
      
      
      
      
      
      
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015               [Page 9]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         If you're a Tcl/Tk guru and have installed _tkcon_, then you may want
         to invoke _Tkabber_ as:
      
         % tkcon.tcl -exec "" -root .tkconn -main "source tkabber.tcl"
      
         _Tkabber_ will automatically know that it's running under _tkcon_ and
         will start by hiding the _Tk_ console window.  Look under the
         "Services->Debug tools" menu to find the checkbutton to show the
         console.  Note that if _Tkcon_ is installed as a Tcl/Tk package then
         _Tkabber_ will add corresponding menu item under _Services->Debug
         tools_ automatically.
      
         Also you can setup _Tkabber_ as handler for XMPP/Jabber MIME Type
         [28].  For this you need to set hanler for "application/xmpp+xml"
         MIME type in your browser to something like this:
      
         tkabber -mime %s
      
      4.  Upgrading
      
      4.1.  Upgrading from version 1.0, 1.1 or 1.1.1
      
         Upgrading _Tkabber_ from version 1.0 doesn't require configuration
         changes.  You are advised to upgrade external plugins but it isn't
         strictly necessary.
      
      4.2.  Upgrading from version 0.11.0 or 0.11.1
      
         When upgrading _Tkabber_ from version 0.11.1 or earlier note that its
         plugin interface and several configuration options have been changed.
      
      4.2.1.  External plugins
      
         There are incompatible changes in Tkabber internals, which break the
         old plugins.  So, you'll have to upgrade them as well.  If a plugin
         author hasn't released a version compatible with _Tkabber_ 1.1 then
         you'll have to disable or remove that plugin.
      
      4.2.2.  Configuration options
      
         There are notable changes in specifying a set of proxy servers.  If
         you define proxy server in the global "loginconf" array then you'll
         have to do the following: In case if you use the _Customize_
         interface, you may open the _Manage proxy servers_ dialog window and
         add your proxy server there.  Note that if you're using the HTTPS
         proxy then you'll have to add it twice (one in the _Tunnel proxies_
         tab and the other in the _HTTP proxies_ tab, see section 'The proxy
         module' (Section 5.2.15) below).  If you define proxy server in the
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 10]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         _Tkabber_ config file then you have lines similar to the following in
         the config:
      
         set loginconf(proxy) https
         set loginconf(proxyhost) proxy.example.com
         set loginconf(proxyport) 3128
         set loginconf(proxyusername) ""
         set loginconf(proxypassword) ""
      
         Replace them by the following:
      
         set proxy1(type) https
         set proxy1(host) proxy.example.com
         set proxy1(port) 3128
         set proxy1(username) ""
         set proxy1(password) ""
         set proxy1(match) *
         set proxy1(exclude) "localhost* 127.0.0.* 172.* 192.168.* 10.*"
      
         set proxy2(type) http
         set proxy2(host) proxy.example.com
         set proxy2(port) 3128
         set proxy2(username) ""
         set proxy2(password) ""
         set proxy2(match) *
         set proxy2(exclude) "localhost* 127.0.0.* 172.* 192.168.* 10.*"
      
         set proxyconf(profile) Proxies
         set proxyconf(tunnel) {proxy1}
         set proxyconf(http) {proxy2}
      
         which will instruct _Tkabber_ to use these proxies for all
         connections.  If you need more complicated setup with several proxy
         profiles, read section 'The proxy module' (Section 5.2.15) below.
      
      4.3.  Upgrading from version 0.10.0
      
         When upgrading _Tkabber_ from version 0.10.0 or earlier read the
         above section on plugins (Section 4.2.1) and also note that several
         configuration options and user interface elements have been changed.
      
      4.3.1.  Configuration options
      
         There are notable changes in handling connection through proxy
         servers, managing fonts and balloon colors, and detecting breaks in
         underlying TCP connection to a server.
      
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 11]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
      4.3.1.1.  Proxy servers
      
         Since SOCKS4 and SOCKS5 proxy types were implemented in addition to
         HTTP proxy type, the whole set of connection options regarding proxy
         servers has been changed.  This means that after upgrade the old
         values stored using the Customize mechanism will be lost and the same
         values in "loginconf" arrays will not be recognized any longer.
      
         To learn how to adapt your current proxy settins to the current
         _Tkabber_ version, read section above (Section 4.2.2), but remember
         that variables in the "loginconf" array mentioned there have been
         changed between 0.10.0 and 0.11.0.  Use the map below as a reference
         which variable should actually be used:
      
         o  Variable "httpproxy"in 0.10.0 became "proxyhost" in 0.11.0.
      
         o  Variable "httpport" became "proxyport".
      
         o  Variable "httplogin" became "proxyusername".
      
         o  Variable "httppassword" became "proxypassword".
      
      4.3.1.2.  Resources to control fonts
      
         Fonts handling has been partially reworked: the global variable
         "font" that controls chat and roster fonts has been removed and now
         _Tkabber_ relies on _Tk_ option database to manage these settings.
         You can override roster and chat fonts independently of each other.
         To do that on systems not based on X Window use _Customize_ options
         described below.
      
         The main consequence of this change is that now the fonts are taken
         from _Tk_ option database and if it contains sane values you don't
         need to touch anything (until the update you had to tweak the "font"
         variable because it was set to font "fixed" by default).  The
         variable "font" does not have any special meaning starting from
         0.11.0 release.
      
         The second consequence is that you are now able to set fonts for chat
         and roster windows separately from each other using this list as a
         reference:
      
         o  "*font" _Tk_ option database resource sets default font for all
            widgets used in _Tkabber_.
      
         o  "*Chat*Text.font" _Tk_ option database resource can be used to
            override font used for chat windows.  This resource can be
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 12]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
            overridden by the "::ifacetk::options(font)" option from the "Main
            Interface" group of _Customize_ settings.
      
         o  "*Roster*font" _Tk_ option database resource can be used to
            override font used for roster windows.  This resource can be
            overridden by the "::ifacetk::options(roster_font)" option from
            the "Main Interface" group of _Customize_ settings.
      
      4.3.1.3.  Keep-alives and dead link detection
      
         Keep-alive mechanism that was used to keep NATP devices from
         disconnecting idle XMPP sessions was accompanied in 0.10.0 with "XMPP
         ping" mechanism which also implemented dead link detection with
         support for disconnecting upon detection of network outage.
      
         In version 0.11.0, the old keep-alive mechanism has been dropped, so
         the following two global options have no effect now:
      
         o  "keep_alive"
      
         o  "keep_alive_interval"
      
         In order to get the same functionality, enable XMPP ping using these
         options in the "IQ" group of Customize settings:
      
         o  Enabling "::plugins::ping::options(ping)" will make _Tkabber_
            periodically send xmpp:ping IQ request to the server.
      
         o  Set "::plugins::ping::options(timeout)" option to a number of
            seconds _Tkabber_ should wait for either a xmpp:ping reply or an
            error to arrive from the server; if there is no answer from the
            server during this timeout, the socket for this connection will be
            forcibly disconnected.
      
      4.3.1.4.  Resources to control appearance of balloon windows
      
         Resources controlling the appearance of balloon windows have been
         made more generic.  If you use custom _Tk_ option database settings
         for balloon windows, change the relevant resources using this map:
      
         o  Change references to "*Balloon.background" and
            "*Balloon.foreground" resources to "*Balloon*background" and
            "*Balloon*foreground", respectively.
      
         o  Change references to "*Balloon*padX" and "*Balloon*padY" resources
            to "*Balloon.text.padX" and "*Balloon.text.padY", respectively.
      
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 13]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
      4.3.1.5.  Support for external XML parser
      
         Support for _TclXML_ as an external XML parser has been removed
         (since _TclXML_ has anyway been unable to support partial XML
         processing) along with the global variable "use_external_tclxml"
         which controlled the loading of _TclXML_.
      
         Now expat-based _Tcl_ package _tDOM_ is supported as an external XML
         parser.  It is enabled by default if it is installed.
      
      4.3.2.  User interface
      
         There are notable changes in systray mouse gestures, appearance of a
         main tabbed window, and in behavior of paned window splitters.
      
      4.3.2.1.  System tray icon mouse gestures
      
         Mouse gestures bound to system tray (system notification area) icon
         have been reworked:
      
         o  Single click on it with the left mouse button now unconditionally
            brings the main _Tkabber_ window to front, possibly deiconifying
            it first.
      
         o  Single click with the middle mouse button now unconditionally
            iconifies the main _Tkabber_ window.
      
         This differs from the previois behaviour where single click with the
         left mouse button on _Tkabber_'s system tray icon toggled the
         iconified/visible state of the main _Tkabber_ window.
      
      4.3.2.2.  New tab management widget
      
         The _notebook_ widget which was used to render tabs in tabbed
         interface mode has been replaced with a new custom widget providing
         the ability for multi-row placement of tabs and docking them to the
         left or right sides of the chat window (in addition to top or bottom
         docking available in 0.10.0 version and earlier).
      
         If you adjusted any specific _Tk_ option database resources
         pertaining to that _notebook_ widget, you have to change them keeping
         in mind that the new widget is just a bunch of _Tk_ buttons (class
         "Button") placed in a frame (called ".nb" as before).  The class name
         for the new widget is "ButtonBar".
      
         So if you explicitly set, say "*Notebook*font" option, you have to
         change it to "*ButtonBar*font" and so on.
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 14]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
      4.3.2.3.  Window splitters
      
         Window splitters (thin vertical and horizontal windows used to change
         relative sizes of windows between which a splitter is placed) have
         been changed to "Windows" style.  This differs from previous "Motif"
         style which implemented explicit "grip box" on each splitter which
         was the only "active point" of a splitter.
      
      4.4.  Upgrading from version 0.9.9
      
         When upgrading _Tkabber_ from version 0.9.9 or earlier read the above
         section (Section 4.3) and also note the following:
      
         o  On Macintosh or Microsoft Windows _Tkabber_ will copy it's
            configuration directory to a new location (see the next section
            (Section 5) for details).  If the transfer of the config directory
            goes smoothly you may delete old ""~/.tkabber"" directory and
            replace its name in your config file by "$::configdir".
      
         o  Also, _Tkabber_ will convert chatlogs directory to a new format.
      
         o  Also, _Tkabber_ changed the way it works with emoticons.  Instead
            of loading them in config file you may put you faivorite emoticons
            directory into "$::configdir/plugins" directory, restart Tkabber
            and then choose emoticons set using Customize GUI.
      
      5.  Configuration
      
         _Tkabber_ maintains its configuration using a set of files placed in
         a special configuration directory which location depends on the
         operating system _Tkabber_ runs on.  These locations are:
      
         o  Unix systems: ""~/.tkabber"";
      
         o  Macintosh: ""~/Library/Application Support/Tkabber"";
      
         o  Under Microsoft Windows this location is governed by the policy of
            the particular flavor of this OS, but the general rule is that the
            _Tkabber_ configuration directory is named ""Tkabber"" and is
            located in the special system folder for storing application-
            specific data.  For example, under Windows XP this will be
            something like ""C:\Documents and Settings\USERNAME\Application
            Data\Tkabber"", where ""USERNAME"" is the login name of a
            particular operating system's user.
      
         _Tkabber_ also honors the value of the ""TKABBER_HOME"" environment
         variable -- if it exists the whole OS-based guessing of the
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 15]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         configuration directory location is cancelled and the value of this
         environment variable is used instead.
      
         Once the pathname of the _Tkabber_ configuration directory is known,
         its value is assigned to the ""configdir"" global Tcl variable which
         can be accessed from within the main _Tkabber_ configuration file
         (see below).
      
         One of the first things that _Tkabber_ does when it's starting up is
         reading a file located in its configuration directory under the name
         ""config.tcl"".  This is a _Tcl_ source file, so obviously, it's a
         lot easier to maintain this file if you know the Tcl programming
         language.  If you're not familiar with it, that's okay -- most things
         you'll need to do are pretty simple!  (In fact, if you don't have
         your own configuration file, you'll get the vanilla _Tkabber_, which
         hopefully you'll find quite usable.)
      
         Note that almost all _Tkabber_ options can be cofigured using
         graphical interface (menu Tkabber->Customize), so editing
         configuration file is not strictly necessary.
      
         _Tkabber_ is configured in four stages:
      
         o  in the pre-load stage, configuration options which guide the
            loading process are set;
      
         o  in the post-load stage, configuration options for each module are
            set;
      
         o  in the menu-load stage, the user is given an option to re-arrange
            _Tkabber's_ menu bar; and,
      
         o  the final-load stage allows any last changes to be made before the
            "login" dialog window is displayed to the user.
      
         Let's look at each, in turn.
      
      5.1.  Pre-load
      
      
      
      
      
      
      
      
      
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 16]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         There are a few things that you may let _Tkabber_ know immediately.
         These are:
      
         # tabbed interface
      
         set ifacetk::options(use_tabbar) 1
      
      
         # primary look-and-feel
      
         set load_default_xrdb 1
      
         option add *font \
                "-monotype-arial-medium-r-normal-*-13-*-*-*-*-*-iso10646-1" \
                userDefault
      
      
         # cryptography by default
      
         set ssj::options(sign-traffic)    0
         set ssj::options(encrypt-traffic) 0
      
      
         # debugging output
      
         set debug_lvls {xmpp warning}
      
      
         # splash window
      
         set show_splash_window 0
      
      
         # force english labels instead of native language
      
         ::msgcat::mclocale en
      
         # use mozilla firefox to open web urls in text
      
         set webbrowser "firefox -new-tab %s"
      
      5.1.1.  Tabbed Interface
      
      
      
      
      
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 17]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         The first of these options, "ifacetk::options(use_tabbar)", tells
         _Tkabber_ whether you want a tabbed interface or not.  If not, here's
         what to put in your configuration file:
      
         set ifacetk::options(use_tabbar) 0
      
         Although _Tkabber_ immediately applies most of its configuration
         changes, in order to apply changed option
         "ifacetk::options(use_tabbar)" you have to restart _Tkabber_. So,
         basically you have two options: set "ifacetk::options(use_tabbar)" at
         the beginning of your configuration file, or using graphical
         interface save the option and restart _Tkabber_.
      
      5.1.2.  Fonts and colors
      
         Many aspects of the _Tkabber_'s visual appearance such as fonts,
         colors and geometry of windows can be configured using the Tk option
         database. [29]
      
         The corresponding _Tk_'s option [30] command can be used in the
         _Tkabber_'s configuration file in any acceptable way: from small
         tweaks to reading files containing elaborate sets of configuration
         commands; ready-to-use examples of such files are included in the
         distribution and are located under the "examples/xrdb" directory.
      
         The _Tk_ toolkit is able to initialize its option database from the
         _XRDB_ (X Resource Database) if its availability is detected at run
         time.  This means that any settings described here can be tuned via
         the standard XRDB mechanism (see "man xrdb").
      
         Beware though that the _Tk_'s semantics of matching option
         specifications against the option database differ in some subtle
         details from that of the _Xt_ toolkit.  The most notable one is the
         priority of options: _Tk_ prefers the latest option it sees, while
         _Xt_ prefers "the most specific" one.
      
         When specifying _Tkabber_-specific options in your _XRDB_ file use
         the "Tkabber" class as the root element of the options.
      
         See Appendix B for a list of all the resources that you can set to
         control _Tkabber's_ look-and-feel.
      
      
      
      
      
      
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 18]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         Probably the most commonly used way to configure _Tkabber_'s visual
         appearance (especially on Windows platforms which lack _XRDB_
         mechanism) is to put all the necessary settings in some file and then
         ask _Tk_ to update its option database from it, like this:
      
             set load_default_xrdb 0
             option readfile $::configdir/newlook.xrdb userDefault
      
         The first line tells _Tkabber_ not to load its default "xrdb" file,
         whilst the second line tells _Tkabber_ which file to load instead.
         Look at the provided example "xrdb" files to get the idea about how
         they are organised.  Of course, you can use any of that files as a
         template.  And of course, you can simply specify any of the example
         files instead of your own to the "option readfile" command to get the
         provided "theme".
      
         Alternatively, if you're a Tcl "old timer", you can always do:
      
             set load_default_xrdb 0
             tk_bisque
      
         to set the palette to a pleasing color scheme.  Read more about this
         in "man palette".
      
         You can also customize the fonts _Tkabber_ uses to render its user
         interface:
      
             option add *font \
                 "-monotype-arial-medium-r-normal-*-13-*-*-*-*-*-iso10646-1" \
                 userDefault
      
         The above setting (operating on the Tk option database) selects the
         font used for all UI elements like buttons and labels and roster and
         conversation windows.  Obviously, you should choose fonts that suit
         your taste.
      
         If you want to specify another font for roster labels use the
         following option:
      
             option add *Roster*font \
                    "-misc-fixed-medium-r-normal-*-12-*-*-*-*-*-iso10646-1" \
                    userDefault
      
         When picking fonts, observe these rules:
      
         o  Under X, encoding (charset) of fonts must match that of your
            locale.
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 19]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         o  Ensure that the specified font exists, since if it's not, _Tk_
            will try hard to pick the most suitable one which often yields not
            what you want.  (The best bet is to first pick the font using some
            tool like "xfontsel".)
      
         Note that when specifying settings using the _Tkabber_'s
         configuration files (i.e. not using _XRDB_ directly) you are not
         forced to use "X-style" (XLFD) font descriptions and may instead
         specify fonts using sometimes more convenient _Tk_ features described
         in Tk font manual page [31].
      
      5.1.3.  Cryptography by default
      
         Next, you may want to _Tkabber_ to use cryptography by default.
         There are two options:
      
         o  whether the traffic you send should be digitally-signed; and,
      
         o  if you have cryptographic information for someone, should the
            default action be to encipher your traffic for them.
      
         (By defining these options early on, _Tkabber_ will complain
         immediately if it isn't able to load its cryptographic module;
         otherwise, the default behavior is to proceed without any
         cryptographic buttons, menus, and so on.)
      
      5.1.4.  Debugging Output
      
         _Tkabber_ has a lot of debugging output.  By default, it gets printed
         to the standard output by a Tcl procedure called "debugmsg" (if
         there's standard output available).  However, only information about
         those modules listed in a variable called "debug_lvls" will be
         printed.
      
         If you know how to program Tcl, then this will seem rather obvious:
      
         set debug_lvls [list message presence ssj warning]
      
         # if you want a different behavior,
         #     define your own...
      
         proc debugmsg {module msg} {
         #    ...
         }
      
      
      
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 20]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         Most users won't care about "debugmsg" because they're running
         _Tkabber_ under an application launcher so the standard output is
         never seen.  However, if this isn't the case for you, and you just
         don't want to see any of this stuff, put this one line in your
         configuration file:
      
         set debug_lvls {}
      
      5.1.5.  Splash window
      
         By default, when _Tkabber_ startup, it show loading process in splash
         window.  To disable this feature, put this in your configuration
         file:
      
         set show_splash_window 0
      
      5.1.6.  I18n/L10n
      
         _Tkabber_ can show all messages in user's native language.  This is
         done by using Tcl's built-in _msgcat_ package which looks for a
         directory called "msgs/" wherever you installed _Tkabber_, and then
         uses the "LC_MESSAGES" environment variable (or "LANG" if
         "LC_MESSAGES" not set) to select the appropriate file.  If you wish,
         you can force use of a particular language by putting a line like
         this in your configuration file:
      
         ::msgcat::mclocale en
      
      5.1.7.  Browse URL
      
         _Tkabber_ executes a browser when you click on a URL in chat windows,
         or in user info window, or in headlines window etc.  It uses some
         heuristics to find which browsers are installed in the system and
         invokes the first browser it finds.
      
         If _Tkabber_'s decision on which browser to use is suboptimal to you,
         or if you want to add some options to the browser command line (open
         URL in a new tab, or in a new window etc.) you may set the varable
         "webbrowser" like the following:
      
         set webbrowser "firefox -new-tab %s"
      
         Note, that the "%s" in the string (it doesn't have to be at the end)
         will be replaced by an actual URL when the command will be run.
         Also, if your favorite browser's path contains spaces, enclose it in
         braces.
      
         The following figures shows some examples of setting this variable
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 21]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         for Windows:
      
         set webbrowser "{C:/Program Files/Opera/opera.exe} %s"
      
         set webbrowser \
             "{C:/Program Files/Mozilla Firefox/firefox.exe} -new-window %s"
      
         set webbrowser "{C:/Program Files/Internet Explorer/iexplore.exe} %s"
      
         for Unix:
      
         set webbrowser "iceweasel -new-tab %s"
      
         set webbrowser "chromium-browser %s"
      
      5.1.8.  Searching
      
         _Tkabber_ allows the user to perform textual searching in certain
         classes of its windows.  This searching is controlled by several
         settings which can be specified in this section.
      
         These settings are described in detail in Section 7.1.
      
      5.2.  Post-load
      
         After _Tkabber_ reads your configuration file, it loads all of its
         own modules, it then invokes a procedure called "postload".  This
         procedure is supposed to perform module-specific configuration.
      
         The default version of this procedure doesn't do anything.  If you
         want to configure one more module modules, then you need to define
         the procedure in your configuration file, e.g.,
      
       proc postload {} {
       # look-and-feel
      
           set pixmaps::options(pixmaps_theme) Default
      
           global alert colors alert_lvls
      
           set alert_lvls(error)        1
           set alert_lvls(server)       1
           set alert_lvls(message)      2
           set alert_lvls(mesg_to_user) 3
           set alert_colors             {Black DarkBlue Blue Red}
      
           set ifacetk::options(raise_new_tab) 1
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 22]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
       # tray icon
      
           set ::plugins::tktray::options(enable) 1
      
       # the autoaway module
      
           set plugins::autoaway::options(awaytime)  5
           set plugins::autoaway::options(xatime)   15
           set plugins::autoaway::options(status) \
               "Automatically away due to idle"
           set plugins::autoaway::options(drop_priority) 1
      
      
       # the avatar module
      
           set avatar::options(announce) 0
           set avatar::options(share)    0
      
      
       # the chat module
      
           set chat::options(stop_scroll)          0
           set plugins::options(timestamp_format)  {[%R]}
      
      
       # the clientinfo module
      
           set plugins::clientinfo::options(autoask) 0
      
      
       # the conferenceinfo module
      
           set plugins::conferenceinfo::options(autoask)        0
           set plugins::conferenceinfo::options(interval)       1
           set plugins::conferenceinfo::options(err_interval)  60
      
      
       # the cryptographic module
      
           set ssj::options(encrypt,fred@example.com) 1
      
      
       # the emoticon module
      
           set plugins::emoticons::options(theme) \
                       $::configdir/emoticons/rythmbox
      
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 23]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
       # the file transfer module
      
           set ft::options(download_dir) "/tmp"
      
      
       # the groupchat module
      
           global gra_group gra_server
           global gr_nick gr_group gr_server
           global defaultnick
      
           set defaultnick(adhoc@conference.example.com) publius
           set defaultnick(*@conference.example.com) cicerone
      
      
       # the ispell module
      
           set plugins::ispell::options(enable)              1
           set plugins::ispell::options(executable)          /usr/bin/hunspell
           set plugins::ispell::options(command_line)        -d ru_RU,en_US
           set plugins::ispell::options(dictionary_encoding) ""
           set plugins::ispell::options(check_every_symbol)  0
      
       # the stream initiation module
      
           set si::transport(allowed,http://jabber.org/protocol/bytestreams) 0
           set si::transport(allowed,http://jabber.org/protocol/ibb) 1
      
      
       # the logger module
      
           set logger::options(logdir)        [file join $::configdir logs]
           set logger::options(log_chat)      1
           set logger::options(log_groupchat) 1
      
       # the proxy module
      
           global proxy1 proxy2 proxy3 proxyconf1 proxyconf2 proxyconf
      
           set proxy1(type)     https
           set proxy1(host)     proxy.example.com
           set proxy1(port)     3128
           set proxy1(username) ""
           set proxy1(password) ""
           set proxy1(match)    *
           set proxy1(exclude)  "localhost* 127.0.0.* 172.* 192.168.* 10.*"
      
           set proxy2(type)     http
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 24]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
           set proxy2(host)     proxy.example.com
           set proxy2(port)     3128
           set proxy2(username) ""
           set proxy2(password) ""
           set proxy2(match)    *
           set proxy2(exclude)  "localhost* 127.0.0.* 172.* 192.168.* 10.*"
      
           set proxy3(type)     socks5
           set proxy3(host)     proxy.example.com
           set proxy3(port)     1080
           set proxy3(username) ""
           set proxy3(password) ""
           set proxy3(match)    *
           set proxy3(exclude)  "localhost* 127.0.0.* 172.* 192.168.* 10.*"
      
           set proxyconf1(profile) Home
           set proxyconf1(tunnel)  {}
           set proxyconf1(http)    {}
      
           set proxyconf2(profile) Work
           set proxyconf2(tunnel)  {proxy1 proxy3}
           set proxyconf2(http)    {proxy2}
      
           array set proxyconf [array get proxyconf2]
      
       # the login module
      
           global loginconf loginconf1 loginconf2 autologin
      
           set loginconf(user)           ""
           set loginconf(password)       ""
           set loginconf(server)         example.com
           set loginconf(resource)       tkabber
           set loginconf(priority)       16
           set loginconf(usealtserver)   0
           set loginconf(altserver)      ""
           set loginconf(altport)        5422
           set loginconf(stream_options) plaintext
           set loginconf(usesasl)        1
           set loginconf(allowauthplain) 0
      
           # The following variables are useful when your jabber-server
           # (example.com) does not have SRV or A-record in DNS
           set loginconf(usealtserver)  1
           set loginconf(altserver)     "jabber.example.com"
      
           set loginconf1(profile)      "Default Account"
           set loginconf1(user)         mrose
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 25]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
           set loginconf2(profile)      "Test Account"
           set loginconf2(user)         test
      
           array set loginconf          [array get loginconf1]
      
           set autologin 0
      
      
       # the message module
      
           set message::options(headlines,cache)    1
           set message::options(headlines,multiple) 1
      
      
       # the raw xml input module
      
           set plugins::rawxml::set options(pretty_print) 0
           set plugins::rawxml::set options(indent)       2
      
      
       # the roster module
      
           set roster::show_only_online            1
           set roster::roster(collapsed,RSS)       1
           set roster::roster(collapsed,Undefined) 1
      
           set roster::aliases(friend@some.host) \
               {friend@other.host friend@another.host}
           set roster::use_aliases                 1
      
      
       # the sound module
      
           set sound::options(mute)                   0
           set sound::options(mute_if_focus)          0
           set sound::options(notify_online)          0
           set sound::options(mute_groupchat_delayed) 1
           set sound::options(mute_chat_delayed)      0
           set sound::options(external_play_program) /usr/bin/aplay
           set sound::options(external_play_program_options) -q
           set sound::options(delay)
      
           set sound::options(connected_sound)                     ""
           set sound::options(presence_available_sound)            ""
           set sound::options(presence_unavailable_sound)          ""
           set sound::options(groupchat_server_message_sound)      ""
           set sound::options(groupchat_their_message_to_me_sound) ""
       }
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 26]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         This isn't nearly as complicated as it seems.  Let's break it down by
         individual module
      
      5.2.1.  Look-and-Feel
      
         _Tkabber_ is shameless in borrowing icons from other Jabber clients.
         By setting "pixmaps::options(pixmaps_theme)", you can select a family
         of related icons.  Besides ""Default"", you can choose one of
         ""Gabber"", ""JAJC"", ""Jarl"", ""Psi"", ""ICQ"", or a few other
         themes.
      
         If you want, you can have _Tkabber_ use a different theme by putting
         custom theme subdirectory to "$::configdir/pixmaps/" directory (tilde
         means home directory). _Tkabber_ knows that it is a theme directory
         by looking for "icondef.xml" file in the directory.  To find out the
         structure of icon definition file, look through _XEP-0038_ and go to
         where you installed _Tkabber_ and take a look at the directory called
         ""pixmaps/default/"".
      
         If you're using the tabbed window interface, _Tkabber_ needs a way of
         telling you that something has changed in a window that's not on top.
         This is where the an array called _alert_lvls_ and a list called
         _alert_colors_ come in.  The array maps an incoming message to a
         priority number from zero to three.  The list, which is indexed
         starting at _zero_, indicates what color the tab should use to let
         you know that something's changed.  So, the way to read the example
         is that receiving:
      
         o  an error or server message will cause the tab of a lowered window
            to go dark blue;
      
         o  a groupchat or headline message will cause the tab to go blue;
            and,
      
         o  a chat message addressed directly to you will cause the tab to go
            red.
      
         By default, whenever a new tab is created, it is automatically
         raised.  If you don't like this behavior, add this line:
      
         set ifacetk::options(raise_new_tab) 0
      
      5.2.2.  The system tray icon (for Unix)
      
         This module is presently available only for Unix
      
         To enable the system tray icon you have to install _tktray_ extension
         and set the config variable "plugins::tktray::options(enable)" to 1.
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 27]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         If you want to control the tray icon appearance and/or position,
         consult the documentation for your desktop environment or window
         manager.  Note, that the Tkabber's tray icon has WM class
         _TkabberIcon_.
      
      5.2.3.  The Autoaway Module
      
         There are two variables that control when _Tkabber_ automatically
         marks you as away: "plugins::autoaway::options(awaytime)" and
         "plugins::autoaway::options(xatime)".  Both define the idle threshold
         in minutes (the number does not have to be integer).
      
         If variable "plugins::autoaway::options(drop_priority)" is set in 1
         then _Tkabber_ will set priority to 0 when moving in extended away
         state.
      
         Variable "plugins::autoaway::options(status)" allows to specify text
         status, which is set when _Tkabber_ is moving in away state.
      
      5.2.4.  The Avatar Module
      
         There are two variables that you can set to control whether _Tkabber_
         will allow others to see your avatar:
      
         o  "avatar::options(announce)" determines whether your presence
            information indicates that you have an avatar; and,
      
         o  "avatar::options(share)" determines whether requests for your
            avatar will be honored.
      
      5.2.5.  The Chat Module
      
         The variable named "chat::options(stop_scroll)" determines whether a
         chat window should automatically scroll down to the bottom whenever
         something new comes in.
      
         You can also set format of time stamp that displayed in beginning of
         each chat message.  Refer to _Tcl_ documentation for description of
         format.  E.g., to display it in ""dd:mm:ss"" format, add this line:
      
         set plugins::options(timestamp_format) {[%T]}
      
      5.2.6.  The Clientinfo Module
      
      
      
      
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 28]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         This module shows in popup balloons information of used by this user
         client name, version, and OS.  You can allow or deny automatic asking
         of this info from users by setting this variable to 1 or 0:
      
         set plugins::clientinfo::options(autoask) 1
      
      5.2.7.  The Conferenceinfo Module
      
         After you join a conference that's listed in your roster, then
         whenever you mouse over that roster entry, you'll see a popup listing
         the conference's participants.  If you want to see this popup,
         regardless of whether you are currently joined with the conference,
         add this line to your post-load:
      
         set plugins::conferenceinfo::options(autoask) 1
      
         You can also set interval between these requests with these two
         variables:
      
         set plugins::conferenceinfo::options(interval)       1
         set plugins::conferenceinfo::options(err_interval)  60
      
         The second variable defines how many minutes to wait after receiving
         an error reply before trying again.  (Usually an error reply
         indicates that the server hosting the conference doesn't support
         browsing, so it makes sense not to try that often.
      
      5.2.8.  The Cryptographic Module
      
         Earlier (Section 5.1) we saw an example where the "ssj::options"
         array from the cryptographic module was set during the preload.
      
         In addition to "signed-traffic" and "encrypt-traffic", you can also
         tell _Tkabber_ whether to encrypt for a particular JID, e.g.,
      
             set ssj::options(encrypt,fred@example.com) 1
      
      5.2.9.  The Emoticons Module
      
         The procedure called _plugins::emoticons::load_dir_ is used to load
         emoticon definitions from a directory.  The directory contains a file
         called ""icondef.xml"", which defines the mapping between each image
         and its textual emoticon (To find out what this file looks like, go
         to where you installed _Tkabber_ and take a look at the file called
         ""emoticons/default/icondef.xml"" or read XEP-0038 [32].)
      
      
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 29]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         If you have just a few icons, and you don't want to create a
         directory and a textual mapping, you can use the procedure called
         "plugins::emoticons::add", e.g.,
      
             plugins::emoticons::add ":beer:" \
                 [image create photo -file $::configdir/emoticons/beer.gif]
      
         If you want to disable all emoticons, you can simply load empty
         directory.  Put in postload function
      
             plugins::emoticons::load_dir ""
      
      5.2.10.  The File Transfer Module
      
         You can set directory in which files will be saved by default:
      
             set ft::options(download_dir) "/tmp"
      
      5.2.11.  The Groupchat Module
      
         There are several variables that set the dialog window defaults for
         adding a groupchat to your roster, or joining a groupchat:
      
         add to roster dialog window:  "gra_group" and "gra_server" specify
            the default room and conference server, repectively; and,
      
         join dialog window:  "gr_nick", "gr_group" and "gr_server" specify
            the default nickname, room, and conference server, respectively.
      
         Note that variables "gra_server", "gr_nick" and "gr_server" overriden
         in login procedure, so better place for changing them is in
         "connected_hook" (see below).
      
         You may want to have different nicknames for different groupchats.
         Accordingly, the array called _defaultnick_ is used to set the
         default nickname for when you enter a conference.  The array is
         indexed by the JID of the room, e.g.,
      
             set defaultnick(adhoc@conference.example.com) publius
      
         Another possibility is to put pattern in parentheses.  The following
         example shows how to specify default nickname for all conferences at
         _conference.example.com_:
      
             set defaultnick(*@conference.example.com) ciceroni
      
         Exact JID's take the higher precedence than patterns.
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 30]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
      5.2.12.  The Ispell Module
      
         On Unix, _Tkabber_ can check spelling of what you entered by calling
         an external program _ispell_.  To enable this feature, add following
         lines to postload function:
      
         set plugins::ispell::options(enable) 1
      
         If you enabled this module, then you can also define:
      
         o  the path to the _ispell_, or _aspell_, or _hunspell_ executable by
            setting "plugins::ispell::options(executable)"
      
         o  the _ispell_ command line options, which can specify dictionaries
            to use, by setting "plugins::ispell::options(command_line)"; and,
      
         o  the encoding of the output by setting
            "plugins::ispell::options(dictionary_encoding)".
      
         If you don't care about putting a large load on your process, then
         you can also set "plugins::ispell::options(check_every_symbol)" to 1
         to check correctness of current word after every entered symbol.
         (Usually you don't need to set this option.)
      
      5.2.13.  The Stream Initiation Module
      
         Stream initiation profile is defined in _XEP-0095_ with two
         transports (_XEP-0047_ - IBB, _XEP-0065_ - SOCKS5 bytestreams).  With
         it you can specify what transports you can use, and via negotiation
         choose more appropriate one.  _Tkabber_ comes with two transport
         implementations:
      
         bytestreams:  that allows you to connect to any node that supports
            "bytestreams" transport (mediated connection is not supported
            yet);
      
         ibb:  that uses your "Jabber" connection to transmit the data (which
            may slowdown other traffic to you).
      
         If your machine is behind a NAT, then you can't use the "bytestreams"
         transport, so you should disable it:
      
           set si::transport(allowed,http://jabber.org/protocol/bytestreams) 0
      
      
      
      
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 31]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
      5.2.14.  The Logger Module
      
         You can set directory to store logs:
      
             set logger::options(logdir) [file join $::configdir logs]
      
         Also you can allow or disallow storing of private and group chats
         logs:
      
             set logger::options(log_chat)      1
             set logger::options(log_groupchat) 1
      
      5.2.15.  The Proxy Module
      
         Starting from version 1.0 _Tkabber_ does not keep proxy settings in
         the "loginconf" array.  It uses proxy profiles defined in separate
         arrays.
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 32]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         First, you may want to specify a set of proxy servers.  You can have
         multiple proxy servers defined in the config file (to use in
         different environments, or if in your company different proxies are
         used to connect to different hosts).  To do so, define global arrays
         (their names could be arbitrary, but "proxy<number>" looks natural):
      
             set proxy1(type)     https
             set proxy1(host)     proxy.example.com
             set proxy1(port)     3128
             set proxy1(username) ""
             set proxy1(password) ""
             set proxy1(match)    *
             set proxy1(exclude)  "localhost* 127.0.0.* 172.* 192.168.* 10.*"
      
             set proxy2(type)     http
             set proxy2(host)     proxy.example.com
             set proxy2(port)     3128
             set proxy2(username) ""
             set proxy2(password) ""
             set proxy2(match)    *
             set proxy2(exclude)  "localhost* 127.0.0.* 172.* 192.168.* 10.*"
      
             set proxy3(type)     socks5
             set proxy3(host)     proxy.example.com
             set proxy3(port)     1080
             set proxy3(username) ""
             set proxy3(password) ""
             set proxy3(match)    *
             set proxy3(exclude)  "localhost* 127.0.0.* 172.* 192.168.* 10.*"
      
         Field "type" is one of the following: _"socks4"_, _"socks5"_,
         _"https"_, _"http"_. The firat three types are tunnelling proxies.
         If you enable them, _Tkabber_ will use them to tunnel its TCP
         connections (in case of _"https"_ this means using _CONNECT_ method
         for HTTP proxy).  The other one is used when _Tkabber_ needs to fetch
         some data via _GET_ or _POST_ method of the HTTP protocol (e.g., when
         utilizing BOSH or HTTP-poll connection).
      
         Fields "host", "port", "username" and "password" are selfexplanatory.
      
         There are two fields which need some explanation: "match" and
         "exclude".  When Tkabber needs to connect to a certain _host_ or to
         get an HTTP document it searches proxies in order they appear in the
         corresponding proxyconf list (see below) and uses the first proxy for
         which the _host_ matches one of the patterns from the "match" field
         but doesn't match any of the patterns from the "exclude" field.  The
         matching uses patterns convention from the "string match" _Tcl_
         command.
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 33]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         Second, you may want to define proxy profiles, and switch between
         them when the environment changes (it's useful for portable
         computers).  To do so, you may define global arrays named
         "proxyconf<number>" where numbers must start from 1 and be
         consecutive, otherwise _Tkabber_ GUI wouldn't be able to switch to
         them:
      
             set proxyconf1(profile) Home
             set proxyconf1(tunnel)  {}
             set proxyconf1(http)    {}
      
             set proxyconf2(profile) Work
             set proxyconf2(tunnel)  {proxy1 proxy3}
             set proxyconf2(http)    {proxy2}
      
             array set proxyconf [array get proxyconf2]
      
         Here, two proxy profiles are defined.  The first one instructs
         _Tkabber_ not to use any proxies and directly connect to any host.
         The second one defines two tunnel proxies and one HTTP proxy.  Note
         that HTTPS and HTTP proxy are the same, but they should appear in
         both "tunnel" and "http" fields anyway.  The last line chooses the
         default proxy profile, which is _Work_ in the example above.
      
         Also, you can edit proxy settings using _Tkabber_ GUI under
         _Tkabber->Manage proxy servers_ menu item.
      
      5.2.16.  The Login Module
      
         The first task is to initialize the configuration defaults for the
         _login_ module.  As you can see above, the global array "loginconf"
         has a whole bunch of elements, e.g., "user", "password", and so on.
      
         Elements "loginconf(user)" and "loginconf(password)"specify username
         and password to authenticate at your _Jabber_ server.
      
         Element "loginconf(server)" must be set to _Jabber_ server name (the
         part of you _JID_ after "@".
      
         Element "loginconf(stream_options)" is set to one of the following
         values:
      
         o  plaintext -- use plaintext connection;
      
         o  encrypted -- use encrypted (via STARTTLS mechanism) connection
            (this option requires tls extension to be installed);
      
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 34]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         o  ssl -- use encrypted (via legacy SSL mechanism) connection (this
            option requires tls extension to be installed);
      
         o  compressed -- use compressed connection (this option requires Ztcl
            extension to be installed).
      
         _Tkabber_ tries to resolve _Jabber_ server name using _SRV_ first and
         usual _A_ records in _DNS_.  If the resolution fails (for example if
         you are in LAN environment without _DNS_) you can force _Tkabber_ to
         connect to the server using "loginconf(altserver)" and
         "loginconf(altport)" options (do not forget to set
         "loginconf(usealtserver)" to "1").
      
         Another option is to use _BOSH_ (XEP-0124 and XEP-0206) connect
         method (if your server supports it) and tunnel _XMPP_ traffic through
         _HTTP_.  To enable _BOSH_ set "loginconf(usebosh)" to "1". _Tkabber_
         then tries to find connect _URL_ using _TXT_ record in _DNS_ (see
         XEP-0156).  You can specify _URL_ manually by setting
         "loginconf(boshurl)".
      
         And another option is to use _HTTP_-polling connect method (if your
         server supports it) and tunnel _XMPP_ traffic through _HTTP_.  To
         enable _HTTP_-polling set "loginconf(usehttppoll)" to "1". _Tkabber_
         then tries to find connect _URL_ using _TXT_ record in _DNS_ (see
         XEP-0156).  You can specify _URL_ manually by setting
         "loginconf(pollurl)".
      
         This collection of elements, which is termed a login profile, is what
         populates the dialog window you'll see when _Tkabber_ wants to
         connect to the server.
      
         It turns out that _Tkabber_ lets you have as many different login
         profiles as you want.  If you want more than just one, they're named
         "loginconf1", "loginconf2", and so on.
      
         What the example above shows is the default values for all profiles
         being set in "loginconf", and then two profiles, one called ""Default
         Account"" and the other called ""Test Account"" being created.
      
         If you want to automatically login to server, then you can set the
         "autologin" variable to "1".
      
         If you set the "autologin" variable to "-1", then _Tkabber_ will not
         automatically login and will not show login dialog.
      
         Default value for "autologin" is "0".  In this case _Tkabber_ shows
         login dialog.
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 35]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
      5.2.17.  The Message Module
      
         By default, when you restart _Tkabber_ it won't remember the
         headlines you received.  If you want _Tkabber_ to remember headlines
         whenever you run it, set "message::options(headlines,cache)" to "1".
      
         By default, _Tkabber_ will put all headline messages into a single
         window.  If you want _Tkabber_ to use a seperate window for each
         headline source, set "message::options(headlines,multiple)" to "1".
      
      5.2.18.  The Raw XML Input Module
      
         With this module you can monitor incoming/outgoing traffic from
         connection to server and send custom XML stanzas.  Also you can
         switch on "pretty print" option to see incoming and outgoing XML
         stanzas pretty printed.  Note, that with this option they may be
         drawed incorrectly, e.g. for XHTML tags.  Also you can set
         indentation level via "indent" option.
      
      5.2.19.  The Roster Module
      
         By default, your entire roster is shown, even those items that aren't
         online.  The variable called "roster::show_only_online" controls
         this.
      
         Similarly by default, each item in every category is shown in the
         roster.  If you want to hide the items in a given category, the array
         called "roster::roster" lets you do this.  In the example, we see
         that two groups (""RSS"" and ""Undefined"") start with their items
         hidden.
      
         Some peoples use several JIDs.  _Tkabber_ lets you specify an alias
         for people like these, so it will show only one entry in the roster.
         In the example, we see that user "friend@some.host" have aliases
         "friend@other.host" and "friend@another.host".  You can also disable
         all aliases by setting "roster::use_aliases" to "0".
      
      5.2.20.  The Sound Module
      
         _Tkabber_ can play sounds on some events.  It can use for this
         _snack_ library or external program that can play _WAV_ files.  Sound
         notifications is enabled when _Tkabber_ starts.
      
         If you want to start _Tkabber_ with sound muted add the following
         line:
      
         set sound::options(mute) 1
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 36]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         If you want _Tkabber_ to stop notifying you when you are not online
         (in away or dnd state) add the following line:
      
         set sound::options(notify_online) 1
      
         If you want _Tkabber_ to mute sound when it is focued (and you are
         paying enough attention to it) add the following line:
      
         set sound::options(mute_if_focus) 1
      
         You can also mute sounds of delayed groupchat messages and delayed
         personal chat messages:
      
         set sound::options(mute_groupchat_delayed) 1
         set sound::options(mute_chat_delayed)      0
      
         If you want to use external program for playing sounds and possibly
         this program's options, then also add something like this (these
         options are suitable for Linux users with ALSA installed):
      
         set sound::options(external_play_program) /usr/bin/aplay
         set sound::options(external_play_program_options) -q
      
         You can also set minimal interval (in milliseconds) between playing
         different sounds.
      
         set sound::options(delay) 200
      
         _Tkabber_ allows you to specify the filename it will play notifying
         about some more or less important events.  These are:
      
         o  "sound::options(connected_sound)" -- sound playing when _Tkabber_
            is connected to the server;
      
         o  "sound::options(presence_available_sound)" -- sound playing when
            available presence is coming;
      
         o  "sound::options(presence_unavailable_sound)" -- sound playing when
            unavailable presence is coming;
      
         o  "sound::options(chat_my_message_sound)" -- sound playing when you
            send one-to-one chat message;
      
         o  "sound::options(chat_their_message_sound)" -- sound playing when
            you receive one-to-one chat message;
      
         o  "sound::options(groupchat_server_message_sound)" -- sound playing
            when you receive groupchat message from server;
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 37]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         o  "sound::options(groupchat_my_message_sound)" -- sound playing when
            you receive groupchat message from server;
      
         o  "sound::options(groupchat_their_message_sound)" -- sound playing
            when you receive groupchat message from another user;
      
         o  "sound::options(groupchat_their_message_to_me_sound)" -- sound
            playing when you receive highlighted (usually personally
            addressed) groupchat message from another user.
      
         If you want to disable sound notification for some of the events,
         then you can add line like this:
      
         set sound::options(connected_sound)                     ""
         set sound::options(presence_available_sound)            ""
         set sound::options(presence_unavailable_sound)          ""
         set sound::options(groupchat_server_message_sound)      ""
         set sound::options(groupchat_their_message_to_me_sound) ""
      
      5.3.  Menu-load
      
         After _Tkabber_ invokes your "postload" procedure, it starts building
         the GUI.  One of the most important things it does is build up a list
         that specifies its menu bar.  It then invokes a procedure called
         "menuload", which is allowed to modify that specification before
         _Tkabber_ uses it.
      
         The default version of this procedure is the identity function,
         i.e..,
      
         proc menuload {description} { return $description }
      
         If you _really_ want to change the menubar specification, then here's
         how to get started:
      
         1.  Go to where you installed the _BWidget_ library and take a look
             at the file called ""BWman/MainFrame.html"".  The documentation
             for the ""-menu"" option explains the syntax of the
             specification.
      
         2.  Go to where you installed _Tkabber_ and take a look at the file
             called ""iface.tcl"".  Look for the line that starts with ""set
             descmenu"".  This will show you the specification given to your
             "menuload" procedure.
      
         3.  Go to where you installed _Tkabber_ and take a look at the file
             called ""examples/mtr-config.tcl"".  Look at the "menuload"
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 38]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
             procedure defined there.  It lays out _Tkabber's_ menu bar
             similar to _Gabber's_.
      
         4.  Finally, study the procedures listed here.
      
      5.3.1.  The Avatar Module
      
         The procedure called "avatar::store_on_server" stores your avatar on
         the server.
      
      5.3.2.  The Browser Module
      
         The procedure called "browser::open" opens a new browser window.
      
      5.3.3.  The Groupchat Module
      
         The procedure called "add_group_dialog" displays a dialog window when
         you want to add a groupchat to your roster.  Similarly, the procedure
         called "join_group_dialog" displays a dialog window when you want to
         join a groupchat.
      
      5.3.4.  The Login Module
      
         The procedure called "show_login_dialog" displays a dialog window
         when you want to login to the server.  (Prior to attempting to login,
         if necessary it will logout).  Naturally, the procedure called
         "logout" does just that; however, if you want get a dialog window for
         confirmation, use "show_logout_dialog" instead.
      
      5.3.5.  The Message Module
      
         If you want to send a message to someone, the procedure called
         "message::send_dialog" will put up a dialog window.  It takes upto
         three optional arguments: the recipient JID, the subject, and the
         thread.
      
         If you want to get added to someone's roster, the procedure called
         "message::send_subscribe_dialog" will put up a dialog window.  It
         takes one optional argument: the recipient JID.
      
      5.3.6.  The Presence Module
      
         If you want to display information about a user, the procedure called
         "userinfo::open" will put up a dialog window.  It takes two optional
         arguments: the user's JID; and, whether or not the dialog window
         should be editable.
      
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 39]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         Obviously, the second argument makes sense only if it's your own
         information, i.e.,
      
             global loginconf
      
             userinfo::open \
                 ${loginconf(user)}@$loginconf(server)/$loginconf(resource) 1
      
         There are also two variables that you can use to set your own
         presence: "userstatus" and "textstatus".  The first variable takes
         one of five values:
      
         o  available;
      
         o  chat;
      
         o  away;
      
         o  xa;
      
         o  dnd; or,
      
         o  invisible.
      
         The second variable takes any textual value.
      
         Changes to your presence information are propagated only when
         "userstatus" is changed.  Accordingly, if you make a change to
         "textstatus", be sure to write "userstatus" immediately afterwards,
         even if it's a no-op, e.g.,
      
             global userstatus textstatus
      
             set textstatus "Out to lunch"
             set userstatus $userstatus
      
      5.3.7.  Miscellany
      
         Finally, you can use the procedure named "help_window" to display
         some textual help.  This procedure takes two arguments: the title for
         the window; and, the text to display.
      
         Also, instead of calling "exit" to terminate _Tkabber_, please use
         the "quit" procedure instead.
      
      
      
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 40]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
      5.4.  Final-Load
      
         Finally, right before _Tkabber_ goes to display the login dialog, it
         invokes a procedure called "finload", which does whatever you want it
         to.
      
      6.  Extensibility
      
         In addition to various configuration mechanisms, _Tkabber_ lets you
         define procedures, termed "hooks" that get run when certain events
         happen.
      
         Here's an example.  When _Tkabber_ receives a chat message, how does
         it know what to process and what to draw?  The short answer is that
         it doesn't need to know anything, all it does is:
      
         hook::run draw_message_hook $chatid $from $type $body $extras
      
         The "hook::run" procedure invokes whatever hooks have been defined
         for "draw_message_hook".  In fact, more than ten procedures may get
         invoked to satisfy this hook!
      
         Here's how it works: _Tkabber_ comes with a number of plugins, which
         get loaded automatically.  Each plugin makes one or more calls that
         look like this:
      
         hook::add draw_message_hook [namespace current]::my_draw_hook $prio
      
         where the last two parameters are: the name of a procedure to run;
         and, a relative integer priority.
      
         When "hook::run" is invoked for "draw_message_hook", each of these
         procedures is called, in the priority order (from smallest to
         largest).  If one of the procedures wants to prevent the later
         procedures from being called, it returns the string ""stop"".
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 41]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         To continue with the example, in between the pre-load and post-load
         stages of configuration, the following calls get made by different
         plugins:
      
         hook::add draw_message_hook [list ...::events::process_x 0] 0
         hook::add draw_message_hook ...::chatstate::process_x 1
         hook::add draw_message_hook ...::check_draw_empty_body 4
         hook::add draw_message_hook ...::chat_open_window 5
         hook::add draw_message_hook [list ...::events::process_x 1] 6
         hook::add draw_message_hook ...::draw_signed 6
         hook::add draw_message_hook ...::draw_encrypted 7
         hook::add draw_message_hook ...::handle_error 10
         hook::add draw_message_hook ...::handle_info 10
         hook::add draw_message_hook ...::draw_timestamp 15
         hook::add draw_message_hook    ::logger::log_message 15
         hook::add draw_message_hook ...::set_message_timestamp 15
         hook::add draw_message_hook ...::add_number_of_messages_to_title 18
         hook::add draw_message_hook ...::chat_message_notify19
         hook::add draw_message_hook ...::handle_server_message 20
         hook::add draw_message_hook ...::roster::update_chat_activity 50
         hook::add draw_message_hook ...::check_nick 60
         hook::add draw_message_hook    ::wmdock::msg_recv 70
         hook::add draw_message_hook ...::handle_last_nick 79
         hook::add draw_message_hook ...::add_bookmark 80
         hook::add draw_message_hook ...::handle_me 83
         hook::add draw_message_hook ...::xhtml::draw_xhtml_message 85
         hook::add draw_message_hook ...::draw_normal_message 87
      
         Many of these procedures look at the incoming chat message and
         operate on only certain kinds of messages.  Some of these procedures
         may return ""stop"", e.g., "handle_me" which handles chat bodies that
         start with ""/me"" and ?draw_xhtml_message? which visualizes _XHTML_
         formatted messages.  (In this example, the actual namespaces were
         replaced with ""...:"" to make it more readable).
      
         Now let's look at the different kind of hooks that _Tkabber_ knows
         about.
      
      6.1.  Message Hooks
      
         When _Tkabber_ receives a message stanza it calls two hooks:
      
         rewrite_message_hook \
             xlib from id type is_subject subject body err thread priority x
         process_message_hook \
             $xlib $from $id $type $is_subject $subject $body $err $thread \
             $priority $x
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 42]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         The first hook takes eleven variable names as arguments, so the
         calling procedures can rewrite them.  This means that a procedure in
         this hook should call "upvar 2 $varbody body" and use the "body"
         variable to change the actual message body.  For example, this allows
         _Tkabber_ to put decrypted message into the "body" variable if it is
         encrypted.
      
         The second hook does the job of showing message to the user (or doing
         something else with it if it's a special message like part of an in-
         band file transfer.
      
         When you are about to send a chat or normal message to the wire, a
         hook is run:
      
       rewrite_outgoing_message_hook xlib to id type subject body err thread x
      
         The hook takes nine variable names as arguments, so the calling
         procedures can rewrite them.  This means that a procedure in this
         hook should call "upvar 2 $varbody body" and use the "body" variable
         to change the actual message body.  For example, this allows
         _Tkabber_ to encrypt message and put the encrypted message into the
         "body" variable to send.  This hook is introduced in _Tkabber_ 1.1,
         and is used by the OTR plugin, so the latter will not work in
         _Tkabber_ 1.0 and older.
      
      6.2.  Chat Hooks
      
         When _Tkabber_ decides that it needs to open a (tabbed) window for a
         chat or groupchat, two hooks are run:
      
         open_chat_pre_hook  $chatid $type
         open_chat_post_hook $chatid $type
      
         Both hooks are given two parameters: the chatid (ID of the chat or
         conference room window, you always can obtain JID using
         "chat::get_jid" and connection token using "chat::get_xlib"
         routines); and, and the type of chat (either ""chat"" or
         ""groupchat"").
      
         Similarly, when _Tkabber_ encounters activity on a tabbed window, a
         hook is run:
      
         raise_chat_tab_hook $path $chatid
      
         The hook is given two parameters: the path of the _Tk_ widget for the
         tabbed window; and, the chatid of the chat or conference room window.
      
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 43]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         When you want to send a chat message, a hook is run:
      
         chat_send_message_hook $chatid $user $body $type
      
         The hook is given four parameters: the chatid of the recipient; the
         localpart of your login identity; the body of the message; and, the
         type of chat.
      
         draw_message_hook $chatid $from $type $body $extras
      
         The hook is given five parameters: the chatid of the sender window
         (JID includes a resource); the JID of the sender (without the
         resource); the type of chat; the body of the message; and, a nested-
         list of additional payload elements.  (This last parameter isn't
         documented in this version of the documentation.)
      
         Chat windows have menubuttons, and two hooks are used to add items in
         menu:
      
         chat_create_user_menu_hook $path $xlib $jid
         chat_create_conference_menu_hook $path $xlib $jid
      
         The first is used in user chat windows, and second in groupchat ones.
         Hooks are given three parameters: the path of the _Tk_ menu widget;
         connection token; and, the JID of user or conference.
      
         In groupchat windows it is possible to complete participants' nicks
         or commands by pressing TAB key.  List of completions is generated by
         running this hook:
      
         generate_completions_hook $chatid $compsvar $wordstart $line
      
         The hook is given four parameters: the chatid of conference window;
         name of global variable, in which current list of possible
         completions is stored; index of position where completion must be
         inserted; and content of text widget where completion is requested.
      
         When someone enters/exits conference, the following hooks are called:
      
         chat_user_enter $group $nick
         chat_user_exit  $group $nick
      
         The hooks are given two parameters: chatid of conference and nick of
         participant.
      
      
      
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 44]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         When someone changes his/her nickname in a conference room, the
         following hook is called:
      
         room_nickname_changed_hook $chatid $nick $new_nick
      
         The hook is given three parameters: chatid of conference old nickname
         and the new nickname of participant.
      
      6.3.  Login Hooks
      
         Two hooks are invoked whenever a session is connected or
         disconnected:
      
         connected_hook $xlib
      
         disconnected_hook $xlib
      
         Both hooks are given one parameter: connection token (_Tkabber_
         allows several connections at once).
      
      6.4.  Presence Hooks
      
         When our presence status changes, a hook is run:
      
         change_our_presence_post_hook $status
      
         The hook is given one parameter: the new presence status value, i.e.,
         one of:
      
         o  available;
      
         o  chat;
      
         o  away;
      
         o  xa;
      
         o  dnd; or
      
         o  unavailable.
      
         Similarly, when someone else's presence changes, a hook is run:
      
         on_change_user_presence_hook $label $status
      
         The hook is given two parameters: the label associated with the JID
         (e.g., "fred") or the JID itself (e.g., "fred@example.com") if no
         label exists in the roster; and, the user's new status.
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 45]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         And for all received presence packets, a hook is run:
      
         client_presence_hook $xlib $from $type $x $args
      
         The hook is given four parameters: connection token, who send this
         presence, type of presence (e.g., "error", "unavailable"), list of
         extended subtags and parameters of this presence (e.g., "-show xa
         -status online").
      
      6.5.  Info/Query Hook
      
         When an IQ stanza is received, a hook is run:
      
         client_iq_hook $xlib $from $type $queries $args
      
         The hook is given four compulsory parameters: connection token, who
         sent this query/response type of stanza (e.g., "get", "set", "result"
         or "error"), list of query subelements (usually it contains only one
         element), list of optional arguments (e.g., "-lang language -to jid
         -id id -x $list_of_other_attributes").
      
      6.6.  Roster Hooks
      
         When an item is added to the roster window, one of the four hooks is
         run to add stuff to the menu associated with that item:
      
         roster_conference_popup_menu_hook $path $xlib $jid
      
         roster_service_popup_menu_hook $path $xlib $jid
      
         roster_jid_popup_menu_hook $path $xlib $jid
      
         roster_group_popup_menu_hook $path $xlib $name
      
         When run, each hook is given three parameters: the path of the _Tk_
         menu widget; the connection token; and, a JID of the roster item (or
         the name of the roster group for the last one).
      
         Also the following hook is run to add stuff to the menu in
         groupchats:
      
         roster_create_groupchat_user_menu_hook $path $xlib $jid
      
         The hook is given three parameters: the path of the _Tk_ menu widget;
         the connection token; and, a JID of user.
      
      
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 46]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         The following hook is run to add stuff to the popup balloon for each
         roster item:
      
         roster_user_popup_info_hook $varname $xlib $jid
      
         The hook is given three parameters: the variable name in which
         current popup text is stored, the connection token, and the JID of
         the roster item.
      
      6.7.  Miscellaneous Hooks
      
         There are three "obvious" hooks:
      
         postload_hook
      
         finload_hook
      
         quit_hook
      
         The first two, by default, run the "postload" and "finload"
         procedures, respectively. "postload_hook" is run after all code has
         been loaded and before initializing main _Tkabber_ window.  After
         that "finload_hook" is run.  The final hook is called just before
         _Tkabber_ terminates (cf., Section 5.3.7).
      
         You can add custom pages to userinfo window using
      
         userinfo_hook $path $xlib $jid $editable
      
         It is run with four arguments: the userinfo notebook widget name; the
         connection token; the JID of the user; and a boolean parameter which
         indicates whether the form is editable.
      
      7.  User Interface basics
      
      7.1.  Searching
      
         Search panel may be invoked in certain classes of _Tkabber_ windows
         using the "<<OpenSearchPanel>>" Tk virtual event which is bound by
         default to the "<Control-S>" keyboard command.
      
         Search panel can be dismissed by pressing the "<Escape>" key and the
         default search action ("search down") is activated by pressing the
         "<Return>" key while entering the search pattern.
      
         Search panel is currenlty available in:
      
         o  Chat and groupchat windows;
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 47]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         o  Service discovery window;
      
         o  Chat history logs;
      
         o  All windows of the "Chats history" tool.
      
         o  Headlines window.
      
         o  Raw XML log window.
      
         o  MUC affiliations and roles lists.
      
         Searching may be customized using the settings located under the
         _Plugins \u002D-> Search_ group of the _Customize_ window.  These
         setings are:
      
         o  "::plugins::search::options(case)": perform case-sensitive
            searching (_off_ by default);
      
         o  "::plugins::search::options(mode)": selects searching mode which
            can be one of:
      
            *  _substring_ -- use simple substring search: the typed search
               string is taken verbatim and then the attempt to locate it is
               performed.  This is the default mode.
      
            *  _glob_ -- uses "glob-style" (or "shell-style") matching:
               special symbols are recognized and they provide for
               "wildcarding":
      
               +  _*_ matches zero or more characters;
      
               +  _?_ matches exactly one character;
      
               +  _[_ and _]_ define character classes, e.g., "[A-Z]" will
                  match any character in the series "A", "B", ... "Z".
      
               The full syntax is described in Tcl string manual page [33].
               That is, this search mode can be convenient for those who want
               more general yet simple approach to searching and is familiar
               with the "shell globbing" concept found in Unix shells.
      
            *  _regexp_ -- provides for searching using full-blown regular
               expressions engine.  The full syntax is described in Tcl
               re_syntax manual page [34].
      
      
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 48]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
      8.  References
      
      8.1.  URIs
      
         [1] http://tkabber.jabber.ru/
      
         [2] http://www.jabber.org/
      
         [3] https://otr.cypherpunks.ca/
      
         [4] http://sourceforge.net/project/showfiles.php?group_id=10894
      
         [5] http://sourceforge.net/project/showfiles.php?group_id=12883
      
         [6] http://sourceforge.net/project/showfiles.php?group_id=12883
      
         [7] http://www.activestate.com/Products/ActiveTcl
      
         [8] http://sourceforge.net/projects/tcludp/
      
         [9] http://sourceforge.net/project/showfiles.php?group_id=13248
      
         [10] http://www.openssl.org/source/
      
         [11] http://sourceforge.net/projects/tkimg/
      
         [12] http://www.tdom.org/
      
         [13] https://gna.org/projects/ztcl/
      
         [14] https://gna.org/projects/ztcl/
      
         [15] http://sgolovan.nes.ru/jabber/ztcl/
      
         [16] https://chiselapp.com/user/sgolovan/repository/tclgpg/
      
         [17] http://fossil-scm.org
      
         [18] http://www.gnupg.org/download.html
      
         [19] https://otr.cypherpunks.ca/
      
         [20] http://memchan.sourceforge.net/
      
         [21] http://www.speech.kth.se/snack/download.html
      
         [22] http://sw4me.com/wiki/Tktray
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 49]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         [23] http://sourceforge.net/projects/tktable/
      
         [24] http://tkcon.sourceforge.net
      
         [27] http://fossil-scm.org
      
         [28] http://www.xmpp.org/extensions/xep-0081.html
      
         [29] http://wiki.tcl.tk/1727
      
         [30] http://www.tcl.tk/man/tcl8.6/TkCmd/option.htm
      
         [31] http://tcl.tk/man/tcl8.6/TkCmd/font.htm#M13
      
         [32] http://www.xmpp.org/extensions/xep-0038.html
      
         [33] http://www.tcl.tk/man/tcl8.6/TclCmd/string.htm#M35
      
         [34] http://www.tcl.tk/man/tcl8.6/TclCmd/re_syntax.htm
      
      Appendix A.  Releases History
      
      A.1.  Main changes in 1.1.2+
      
         o  Dropped Tcl/Tk 8.4 support.  Now Tcl/Tk 8.5 is required
      
      A.2.  Main changes in 1.1.2
      
         o  Fixed a bug in displaying search results and copying JID from the
            search results to clipboard
      
         o  Fixed a few bugs with nonexistent canvas tags in Georoster and
            Poker plugins
      
         o  Fixed a restoring user status from autoaway
      
         o  A few other fixes and minor enhancements
      
         o  This is the last release which supports Tcl/Tk 8.4 (with the
            exceptions of the OTR and Poker plugins)
      
      A.3.  Main changes in 1.1.1
      
         o  Fixed a few bugs in passing URL to web browsers
      
         o  Fixed a regression when message intended to be GPG-encrypted is
            sent plaintext
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 50]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         o  Fixed a few crashes in OTR plugin
      
         o  A few other fixes and enhancements
      
      A.4.  Main changes in 1.1
      
         o  Added new OTR plugin (requires Tcl/Tk 8.5 to operate)
      
         o  Roster versioning (XEP-0237 and RFC-6121)
      
         o  Added new Battleship game plugin
      
         o  A few fixes and enhancements
      
      A.5.  Main changes in 1.0
      
         o  Completely rewritten Tkabber internals
      
         o  Dropped Tcl/Tk 8.3 support.  Now Tcl/Tk 8.4 is required
      
         o  Partial IPv6 support (requires Tcl/Tk 8.6)
      
         o  Switched from TclGPGME to TclGPG for encryption and signing
      
         o  Added new connection method BOSH (XEP-0124 and XEP-0206)
      
         o  Disabled SSLv2 and enabled TLSv1 TLS options
      
         o  Added user nicknames (XEP-0172) support.
      
         o  Updated the CAPTCHA forms (XEP-0158) support
      
         o  Added metacontacts (XEP-0209) support
      
         o  Implemented multiple proxy profiles
      
         o  Implemented remote controlling from a locally executed script
      
         o  Added new plugins: floatingcontact, poker
      
         o  Rewritten most plugins to support disabling and unloading on the
            fly
      
         o  A few interface enhancements (search in MUC affiliations lists,
            proxy management)
      
         o  Many fixes and enhancements
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 51]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
      A.6.  Main changes in 0.11.1
      
         o  New default sound theme by Serge Yudin
      
         o  Added new plugins: quotelastmsg, singularity, stripes
      
         o  Many fixes and enhancements
      
      A.7.  Main changes in 0.11.0
      
         o  New tabbed user interface.  Tab headers now occupy several rows
            and tab bar can be docked to the left and right sides of chat
            window
      
         o  Roster filter
      
         o  Added support for pixmaps (in particular emoticons) JISP archives
            (XEP-0038)
      
         o  Added support for SOCKS4a and SOCKS5 proxy for the main connection
      
         o  Added user location support (XEP-0080)
      
         o  Added user mood support (XEP-0107)
      
         o  Added user activity support (XEP-0108)
      
         o  Added user tune support (XEP-0118)
      
         o  Added entity capabilities (XEP-0115 v.1.5, only reporting) support
      
         o  Added basic robot challenges support (XEP-0158, v.0.9)
      
         o  Added partial data forms media element support (XEP-0221, v.0.2,
            URIs and images only)
      
         o  Roster is now exported to XML instead of Tcl list
      
         o  Added support for entity time (XEP-0202)
      
         o  Tkabber version is now reported in disco#info (XEP-0232)
      
         o  Moved deprecated Jabber Browser (XEP-0011) to an external plugin
      
         o  Moved Jidlink file transfer to an external plugin
      
         o  Added several new plugins: attline, ctcomp, custom-urls,
            floatinglog, gmail, openurl, presencecmd, receipts
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 52]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         o  Many fixes and enhancements
      
      A.8.  Main changes in 0.10.0
      
         o  New artwork by Artem Bannikov
      
         o  Mediated SOCKS5 connection support for file transfer (XEP-0065)
      
         o  Blocking communicaation with users not in roster (using XEP-0016
            via simple interface)
      
         o  Translatable outgoing error messages support (based on recipient's
            xml:lang)
      
         o  Remote controlling clients support (XEP-0146)
      
         o  Extended stanza addressing support (XEP-0033)
      
         o  New chats history tool with search over the all chatlog files
      
         o  Roster item icons are chosen based on Disco queries to item server
      
         o  Search in Disco, Browser, Headlines, RawXML, and Customize windows
      
         o  New internal plugins: abbrev allows to abbreviate words in chat
            input windows, postpone stores/restores current input window
            content
      
         o  New external plugins (aniemoticons, latex, tkabber-khim, traffic,
            renju)
      
         o  Emoticons theme now can be loaded using GUI
      
         o  Most Tkabber's tabs can now be stored on exit and restored on
            start
      
         o  XMPP ping support (XEP-0199).  Reconnecting based on XMPP ping
            replies
      
         o  Delayed delivery now recognizes XEP-0203 timestamps
      
         o  Added optional 'My Resources' roster group, which contains other
            connected resources of the same JID
      
         o  Many fixes and enhancements
      
      
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 53]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
      A.9.  Main changes in 0.9.9
      
         o  Improved privacy lists interface
      
         o  Support for stream compression (XEP-0138)
      
         o  Support for SRV DNS-records
      
         o  Support for TXT DNS-records (XEP-0156)
      
         o  Support for ad-hoc commands (XEP-0050)
      
         o  Improved headlines support
      
         o  Chat state notification support (XEP-0085)
      
         o  Many fixes and enhancements
      
      A.10.  Main changes in 0.9.8
      
         o  Support for STARTTLS
      
         o  Reorganized menu
      
         o  Support for searching in chat window
      
         o  Support for annotations about roster items (XEP-0145)
      
         o  Support for conference rooms bookmarks (XEP-0048)
      
         o  Added multilogin support for GPGME
      
         o  Better support for xml:lang
      
         o  Support for service discovery extensions (XEP-0128)
      
         o  Support for NTLM authentication
      
         o  Many fixes and enhancements
      
      A.11.  Main changes in 0.9.7beta
      
         o  Updated support for file transfer (XEP-0095, XEP-0096, XEP-0047,
            XEP-0065)
      
         o  Support for colored nicks and messages in conference
      
         o  Better multiple logins support
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 54]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         o  Updated support for xml:lang
      
         o  Support for IDNA (RFC3490)
      
         o  Many fixes and enhancements
      
      A.12.  Main changes in 0.9.6beta
      
         o  Multiple logins support
      
         o  History now splitted by month
      
         o  Animated emoticons support
      
         o  Many user interface improvements
      
         o  More XMPP support
      
         o  More translations
      
         o  Bugfixes
      
      A.13.  Main changes in 0.9.5beta
      
         o  Nested roster groups
      
         o  Messages emphasizing
      
         o  User interface improvements
      
         o  Support for XMPP/Jabber MIME Type
      
         o  Bugfixes
      
      Appendix B.  Tk option database resources
      
         Here is list of the most essential _Tkabber_-specific _Tk option
         database_ resources that you need to change look:
      
         Tkabber.geometry  Geometry of main window.
      
         *Chat.chatgeometry
      
         *Chat.groupchatgeometry
      
         *Customize.geometry
      
         *RawXML.geometry
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 55]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         *Stats.geometry
      
         *Messages.geometry
      
         *JDisco.geometry  Geometry of various windows (when not using tabs).
      
         *mainRosterWidth  The width of the main roster window.
      
         *Chat.inputheight
      
         *RawXML.inputheight  Height of input windows in chat and raw XML
            windows.
      
         *Balloon.background
      
         *Balloon.foreground  Background and foreground colors of popup
            balloon.
      
         *Balloon.style  Behaviour of popup balloon: can be "delay" (balloon
            appeared after some time) and "follow" (balloon appeared
            immediately and follows mouse).
      
         *JDisco.fill  Color of service discovery browser item name.
      
         *JDisco.identitycolor  Color of service discovery browser item
            identity.
      
         *JDisco.featurecolor  Color of service discovery browser entity
            feature.
      
         *JDisco*Tree*background  Background of service discovery browser.
      
         *Chat.meforeground  Color of user's messages in chat windows.
      
         *Chat.theyforeground  Color of other peoples messages in chat
            windows.
      
         *Chat.serverlabelforeground  Color of label before server message.
      
         *Chat.serverforeground  Color of server messages in chat windows.
      
         *Chat.errforeground  Color of error messages in chat windows.
      
         *Chat.urlforeground  Color of URLs in chat windows.
      
         *Chat.urlactiveforeground  Color of mouse highlighted URLs in chat
            windows.
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 56]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         *JDisco.fill  Default color of items in Service Discovery Browser.
      
         *JDisco.featurecolor  Default color of feature items in Service
            Discovery Browser.
      
         *JDisco.identitycolor  Default color of identity items in Service
            Discovery Browser.
      
         *JDisco.optioncolor  Default color of option items in Service
            Discovery Browser.
      
         *JDisco*Tree*background  Default color of background in Service
            Discovery Browser.
      
         *alertColor0
      
         *alertColor1
      
         *alertColor2
      
         *alertColor3  Tabs alert colors.
      
         *Roster.cbackground  Roster background color.
      
         *Roster.groupindent  Indentation for group title.
      
         *Roster.groupiconindent  Indentation for group icon.
      
         *Roster.jidindent  Indentation for item name.
      
         *Roster.jidmultindent  Indentation for item with multiple resources.
      
         *Roster.subjidindent  Indentation for item resource.
      
         *Roster.iconindent  Indentation for item icon.
      
         *Roster.subitemtype
      
         *Roster.subiconindent  Indentation for resource icon.
      
         *Roster.textuppad  Top pad for item's names.
      
         *Roster.textdownpad  Bottom pad for item's names.
      
         *Roster.linepad  Vertical distance between items.
      
         *Roster.foreground  Color of item's names.
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 57]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         *Roster.jidfill  Background of roster item.
      
         *Roster.jidhlfill  Background of roster item when mouse is over.
      
         *Roster.jidborder  Color of item's border.
      
         *Roster.groupfill
      
         *Roster.grouphlfill
      
         *Roster.groupborder  The same to roster groups.
      
         *Roster.groupcfill  Background color of collapsed group.
      
         *Roster.stalkerforeground
      
         *Roster.unavailableforeground
      
         *Roster.dndforeground
      
         *Roster.xaforeground
      
         *Roster.awayforeground
      
         *Roster.availableforeground
      
         *Roster.chatforeground  Colors of item name for different presences.
      
      Appendix C.  Documentation TODO
      
         The next revision of this documentation should discuss:
      
         o  Post-load:
      
            *  "chat_height" and "chat_width" (appear to be no-ops).
      
         o  Menu-load:
      
            *  "change_password_dialog"
      
            *  "conference::create_room_dialog"
      
            *  "disco::browser::open_win"
      
            *  "message::send_msg"
      
            *  "privacy::request_lists"
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 58]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
            *  "rawxml::open_window"
      
            *  "userinfo::show_info_dialog"
      
         o  Hooks: the additional payload format.
      
      Appendix D.  Acknowledgements
      
         Rebecca Malamud was kind enough to design the "enlightened feather"
         motif used in the _Tkabber_ look-and-feel.
      
         The "new look" appeared in the 0.10.0 release ("golden feather" and
         "blue feather" pixmap themes and the "Earth bulb" logo) was designed
         by Artem Bannikov.
      
         The new sound theme appeared in 0.11.1 release was created by Serge
         Yudin
      
      Appendix E.  Copyrights
      
         Copyright (C) 2002-2025 Alexey Shchepin
      
         _Tkabber_ 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.
      
         _Tkabber_ 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.
      
      Authors' Addresses
      
         Alexey Yurievich Shchepin
         Process-One
      
         Email: alexey@process-one.net
      
      
      
      
      
      
      
      
      
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 59]
      
                                   Tkabber 1.1.2+                   March 2015
      
      
         Marshall T. Rose
         Dover Beach Consulting, Inc.
         POB 255268
         Sacramento, CA  95865-5268
         US
      
         Phone: +1 916 483 8878
         Fax:   +1 916 483 8848
         Email: mrose@dbc.mtview.ca.us
      
      
         Sergei Golovan
         New Economic School
      
         Email: sgolovan@nes.ru
      
      
         Michail Yurievich Litvak
         Colocall Ltd.
      
         Email: mci@shadow.in.ua
      
      
         Konstantin Khomoutov
         Service 007
      
         Email: khomoutov@gmail.com
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      Shchepin, et al.        Expires September 2, 2015              [Page 60]
      �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������tkabber/balloon.tcl���������������������������������������������������������������������������������0000644�0000000�0000000�00000015145�14777013213�0014211�0����������������������������������������������������������������������������������������������������ustar�00nobody��������������������������nobody�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# balloon.tcl --
      #
      #       This file is a part of the Tkabber XMPP client. It implements
      #       floating balloon help windows.
      
      option add *Balloon*background LightYellow widgetDefault
      option add *Balloon*foreground Black       widgetDefault
      option add *Balloon.style      delay       widgetDefault
      option add *Balloon.text.padX  0.5m       widgetDefault
      option add *Balloon.text.padY  0.5m       widgetDefault
      
      
      toplevel .balloon -borderwidth 0 -class Balloon
      
      bind .balloon <Any-Motion> \
               [list balloon::default_balloon .balloon leave %X %Y]
      
      pack [message .balloon.text -text "" \
                                  -aspect 5000 \
                                  -width 0 \
                                  -relief solid \
                                  -borderwidth 0.25m]
      
      if {$::tcl_platform(platform) == "macintosh"} {
          catch { unsupported1 style .balloon floating sideTitlebar }
      } elseif {$::aquaP} {
          ::tk::unsupported::MacWindowStyle style .balloon help none
      } else {
          wm transient .balloon .
      }
      
      wm withdraw .balloon
      
      namespace eval balloon {
          variable _id ""
          variable _delay 600
          variable _cur ""
          variable balloon_showed 0
          variable balloon_remove 0
      
          variable style [option get .balloon style Balloon]
      }
      
      proc balloon::set_text {text args} {
          if {[.balloon.text cget -text] eq $text} return
      
          set width 0
          set aspect 5000
          foreach {opt val} $args {
              switch -- $opt {
                  -width { set width $val }
                  -aspect { set aspect $val }
              }
          }
      
          after idle [list .balloon.text configure -text $text \
                                                   -aspect $aspect \
                                                   -width $width]
      }
      
      proc balloon::show {mx my} {
          variable balloon_showed
          variable balloon_remove
          variable max_bx
      
          if {[.balloon.text cget -text] == ""} {
              balloon::destroy
              return
          }
      
          set balloon_showed 1
          set balloon_remove 0
      
          set b_w [winfo reqwidth .balloon]
          set b_h [winfo reqheight .balloon]
      
          if {$::tcl_platform(platform) == "windows" && \
                  ($mx >= [winfo screenwidth .] || $my >= [winfo screenheight .] ||
                   $mx < 0 || $my < 0)} {
              set b_x [expr {$mx + 1}]
              set b_y [expr {$my + 1}]
          } else {
              set max_bx [expr {[winfo screenwidth .] - $b_w}]
              set max_by [expr {[winfo screenheight .] - $b_h}]
      
              set b_x [expr {$mx + [winfo pixels .balloon 3m]}]
              set b_y [expr {$my + [winfo pixels .balloon 4m]}]
      
              set b_x [::tcl::mathfunc::max [::tcl::mathfunc::min $b_x $max_bx] 0]
              set b_y [::tcl::mathfunc::max [::tcl::mathfunc::min $b_y $max_by] 0]
      
              if {($mx >= $b_x) && ($mx <= $b_x+$b_w)} {
                  if {($my >= $b_y) && ($my <= $b_y+$b_h)} {
                      set b_y1 [expr {$my - 5 - $b_h}]
                      if {$b_y1 >= 0} {
                          set b_y $b_y1
                      }
                  }
                  set max_bx [::tcl::mathfunc::max $max_bx $b_h]
                  if {$b_x < $max_bx && $b_x <= $mx + [winfo pixels .balloon 3m] && $b_w <= $max_bx} {
                      set b_x [expr {$mx + [winfo pixels .balloon 3m]}]
                  }
              }
          }
      
          wm overrideredirect .balloon 1
          wm geometry .balloon +$b_x+$b_y
          wm deiconify .balloon
      
          # need the raise in case we're ballooning over a detached menu (emoticons)
          raise .balloon
      }
      
      proc balloon::set_delay {w mx my} {
          global tcl_platform
          variable balloon_showed
          variable balloon_remove
          variable _id
          variable _delay
          variable _cur
      
          if {$_cur != $w} {
              if {$_id != ""} {
                  after cancel $_id
              }
              set _id [after $_delay "balloon::show $mx $my"]
              set _cur $w
              wm withdraw .balloon
              if {$tcl_platform(platform) == "unix"} {
                  wm overrideredirect .balloon 0
              }
              set balloon_showed 0
              set balloon_remove 0
          } else {
              set balloon_remove 0
              if {$balloon_showed == 0} {
                  if {$_id != ""} {
                      after cancel $_id
                  }
                  set _id [after $_delay "balloon::show $mx $my"]
              }
          }
      }
      
      proc balloon::on_mouse_move {w mx my} {
          variable style
      
          switch -- $style {
              delay  {set_delay $w $mx $my}
              follow {show $mx $my}
          }
      }
      
      proc balloon::destroy {} {
          global tcl_platform
          variable balloon_showed
          variable balloon_remove
          variable _id
      
          if {$_id != ""} {
              after cancel $_id
              set _id ""
          }
      
          set balloon_remove 1
          after 100 {
              if {$::balloon::balloon_remove} {
                  wm withdraw .balloon
                  if {$::tcl_platform(platform) == "unix"} {
                      wm overrideredirect .balloon 0
                  }
                  set ::balloon::balloon_showed 0
                  set ::balloon::balloon_remove 0
              }
          }
      }
      
      proc balloon::default_balloon {w action X Y args} {
          set sw $w
          set text ""
          set command ""
          set newargs $args
          # $args may contain odd number of members, so a bit unusual parsing
          set idx 0
          foreach {opt val} $args {
              switch -- $opt {
                  -text {
                      set text $val
                      set newargs [lreplace $newargs $idx [expr {$idx + 1}]]
                  }
                  -command {
                      set command $val
                      set newargs [lreplace $newargs $idx [expr {$idx + 1}]]
                  }
                  default {
                      incr idx 2
                  }
              }
          }
      
          if {$command != ""} {
              set newargs [lassign [{*}$command {*}$newargs] sw text]
          }
      
          switch -- $action {
              enter {
                  balloon::set_text $text {*}$newargs
              }
      
              motion {
                  balloon::set_text $text {*}$newargs
                  balloon::on_mouse_move $sw $X $Y
              }
      
              leave {
                  balloon::destroy
              }
          }
      }
      
      proc balloon::setup {w args} {
          # Try to bind in Tree widget
          if {![catch {
                    $w bindText <Any-Enter> \
                         [list [namespace current]::default_balloon %W enter %X %Y \
                               {*}[double% $args]]
               }]} {
              $w bindText <Any-Motion> \
                   [list [namespace current]::default_balloon %W motion %X %Y \
                         {*}[double% $args]]
              $w bindText <Any-Leave> \
                   [list balloon::default_balloon %W leave %X %Y]
          } else {
              bind $w <Any-Enter> \
                   [list [namespace current]::default_balloon %W enter %X %Y \
                         {*}[double% $args]]
              bind $w <Any-Motion> \
                   [list [namespace current]::default_balloon %W motion %X %Y \
                         {*}[double% $args]]
              bind $w <Any-Leave> \
                   [list balloon::default_balloon %W leave %X %Y]
          }
      }
      
      # vim:ft=tcl:ts=8:sw=4:sts=4:et
      ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������tkabber/chats.tcl�����������������������������������������������������������������������������������0000644�0000000�0000000�00000126152�14777013213�0013666�0����������������������������������������������������������������������������������������������������ustar�00nobody��������������������������nobody�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# chats.tcl --
      #
      #       This file is a part of the Tkabber XMPP client. It implements user
      #       interface for the main Tkabber purpose: for chats.
      
      package require textutil
      
      if {$::darktheme} {
          option add *Chat.theyforeground        cornflowerblue  widgetDefault
          option add *Chat.meforeground          coral3          widgetDefault
          option add *Chat.highlightforeground   coral3          widgetDefault
          option add *Chat.serverlabelforeground darkolivegreen3 widgetDefault
          option add *Chat.serverforeground      darkolivegreen3 widgetDefault
          option add *Chat.infoforeground        cornflowerblue  widgetDefault
          option add *Chat.errforeground         coral3          widgetDefault
      } else {
          option add *Chat.theyforeground        dodgerblue4 widgetDefault
          option add *Chat.meforeground          firebrick4  widgetDefault
          option add *Chat.highlightforeground   firebrick4  widgetDefault
          option add *Chat.serverlabelforeground DarkGreen   widgetDefault
          option add *Chat.serverforeground      DarkGreen   widgetDefault
          option add *Chat.infoforeground        dodgerblue4 widgetDefault
          option add *Chat.errforeground         firebrick   widgetDefault
      }
      
      option add *Chat.inputheight           3           widgetDefault
      
      namespace eval chat {
          variable enrichid 0
          custom::defgroup Chat [::msgcat::mc "Chat options."] -group Tkabber
          custom::defvar options(smart_scroll) 1 \
              [::msgcat::mc "Enable chat window autoscroll only when\
                             last message is shown."] \
              -type boolean -group Chat
          custom::defvar options(stop_scroll) 0 \
              [::msgcat::mc "Stop chat window autoscroll."] \
              -type boolean -group Chat
          custom::defvar options(display_status_description) 1 \
              [::msgcat::mc "Display description of user status in chat windows."] \
              -type boolean -group Chat
          custom::defvar options(gen_status_change_msgs) 0 \
              [::msgcat::mc "Generate chat messages when chat peer\
                  changes his/her status and/or status message"] \
              -type boolean -group Chat
      
          custom::defvar open_chat_list {} [::msgcat::mc "List of users for chat."] \
                  -group Hidden
      
      }
      
      set chat_width 50
      set chat_height 18
      
      plugins::load [file join plugins chat]
      
      proc chat::open_chat_dialog {} {
          variable open_chat_jid
          variable open_chat_list
          variable open_chat_xlib
      
          if {[llength [connections]] == 0} return
      
          set gw .open_chat
          catch { destroy $gw }
      
          set xlib [lindex [connections] 0]
          set open_chat_xlib [connection_jid $xlib]
      
          Dialog $gw -title [::msgcat::mc "Open chat"] -anchor e \
                  -default 0 -cancel 1
      
          set gf [$gw getframe]
          grid columnconfigure $gf 1 -weight 1
      
          set open_chat_jid ""
      
          label $gf.ljid -text [::msgcat::mc "JID:"]
          Combobox $gf.jid -textvariable [namespace current]::open_chat_jid \
                  -values [linsert $open_chat_list 0 ""] -width 35
      
          grid $gf.ljid -row 0 -column 0 -sticky e
          grid $gf.jid  -row 0 -column 1 -sticky ew
      
          if {[llength [connections]] > 1} {
              set connections {}
              foreach c [connections] {
                  lappend connections [connection_jid $c]
              }
              label $gf.lconnection -text [::msgcat::mc "Connection:"]
              Combobox $gf.connection \
                       -textvariable [namespace current]::open_chat_xlib \
                       -values $connections
      
              grid $gf.lconnection -row 1 -column 0 -sticky e
              grid $gf.connection  -row 1 -column 1 -sticky ew
          }
      
          $gw add -text [::msgcat::mc "Chat"] \
                  -command "[namespace current]::open_chat $gw"
          $gw add -text [::msgcat::mc "Cancel"] -command "destroy $gw"
      
          $gw draw $gf.jid
      }
      
      proc chat::open_chat {gw} {
          variable open_chat_jid
          variable open_chat_list
          variable open_chat_xlib
      
          destroy $gw
      
          if {[llength [connections]] == 0} return
      
          foreach c [connections] {
              if {[connection_jid $c] == $open_chat_xlib} {
                  set xlib $c
              }
          }
          if {![info exists xlib]} {
              set xlib [lindex [connections] 0]
          }
      
          set open_chat_list [update_combo_list $open_chat_list $open_chat_jid 20]
          open_to_user $xlib $open_chat_jid
      }
      
      # chat::close --
      #  Closes the container chat window for a chat identified
      #  by given chat ID. Has the same effect as if the user closed
      #  the chat's window using the UI.
      proc chat::close {chatid} {
          ifacetk::destroy_win [winid $chatid]
      }
      
      proc chat::get_nick {xlib jid type} {
          variable chats
      
          set nick $jid
          switch -- $type {
              chat {
                  set group [::xmpp::jid::stripResource $jid]
                  set chatid1 [chatid $xlib $group]
                  if {[is_groupchat $chatid1]} {
                      set nick [::xmpp::jid::resource $jid]
                  } else {
                      set rjid [roster::find_jid $xlib $jid]
                      set nick [roster::itemconfig $xlib $rjid -name]
                      if {$rjid == "" || $nick == ""} {
                          if {[::xmpp::jid::node $jid] != ""} {
                              set nick [::xmpp::jid::node $jid]
                          } else {
                              set nick $jid
                          }
                      }
                  }
              }
              groupchat {
                  set nick [::xmpp::jid::resource $jid]
              }
          }
          return $nick
      }
      
      proc chat::winid {chatid} {
          set xlib [get_xlib $chatid]
          set jid [get_jid $chatid]
          set tag [jid_to_tag $jid]
          return .chat_[psuffix $xlib]_$tag
      }
      
      proc chat::winid_to_chatid {winid} {
          variable chat_id
          expr {[info exists chat_id($winid)] ? $chat_id($winid) : ""}
      }
      
      proc chat::chatid {xlib jid} {
          return [list $xlib $jid]
      }
      
      proc chat::get_xlib {chatid} {
          return [lindex $chatid 0]
      }
      
      proc chat::get_jid {chatid} {
          return [lindex $chatid 1]
      }
      
      ###############################################################################
      
      proc client:message {xlib from type x args} {
          set id ""
          set body ""
          set is_subject 0
          set subject ""
          set thread ""
          set priority ""
          set err {}
          foreach {key val} $args {
              switch -- $key {
                  -id {
                      set id $val
                  }
                  -body {
                      set body $val
                  }
                  -subject {
                      set is_subject 1
                      set subject $val
                  }
                  -error {
                      set err $val
                  }
              }
          }
      
          debugmsg chat "MESSAGE: $xlib; $from; $id; $type; $is_subject;\
                         $subject; $body; $err; $thread; $priority; $x"
      
          hook::run rewrite_message_hook xlib from id type is_subject \
                                         subject body err thread priority x
      
          debugmsg chat "REWRITTEN MESSAGE: $xlib; $from; $id; $type; $is_subject;\
                         $subject; $body; $err; $thread; $priority; $x"
      
          hook::run process_message_hook $xlib $from $id $type $is_subject \
                                         $subject $body $err $thread $priority $x
      }
      
      ###############################################################################
      
      proc chat::rewrite_message \
           {vxlib vfrom vid vtype vis_subject vsubject \
            vbody verr vthread vpriority vx} {
          upvar 2 $vfrom from
          upvar 2 $vtype type
          variable options
      
          if {$type == ""} {
              # If message lacks type set it to 'normal' as required by RFC
              set type normal
          }
      
          set from [::xmpp::jid::normalize $from]
      }
      
      hook::add rewrite_message_hook [namespace current]::chat::rewrite_message 60
      
      ###############################################################################
      
      proc chat::process_message_fallback \
           {xlib from id type is_subject subject body err thread priority x} {
          variable chats
      
          set chatid [chatid $xlib $from]
      
          switch -- $type {
              chat {
                  if {$thread != ""} {
                      set chats(thread,$chatid) $thread
                  }
                  set chats(id,$chatid) $id
              }
              groupchat {
                  set chatid [chatid $xlib [::xmpp::jid::stripResource $from]]
      
                  if {![is_groupchat $chatid]} return
      
                  if {$is_subject} {
                      set_subject $chatid $subject
                      if {[string equal $body ""]} {
                          set nick [::xmpp::jid::resource $from]
                          if {[string equal $nick ""]} {
                              set body \
                                  [::msgcat::mc "Subject is set to: %s" $subject]
                          } else {
                              set body \
                                  [::msgcat::mc "/me has set the subject to: %s" \
                                                $subject]
                          }
                      }
                  }
              }
              error {
                  if {[is_groupchat $chatid]} {
                      if {$is_subject} {
                          set body "subject: "
                          restore_subject $chatid
                      } else {
                          set body ""
                      }
                      append body [error_to_string $err]
                  } else {
                      if {$is_subject && $subject != ""} {
                          set body "[::msgcat::mc {Subject:}] $subject\n$body"
                      }
                      set body "[error_to_string $err]\n$body"
                  }
              }
              default {
                  debugmsg chat "MESSAGE: UNSUPPORTED message type '$type'"
              }
          }
      
          #chat::open_window $chatid $type
      
          chat::add_message $chatid $from $type $body $x
          if {[llength $x] > 0} {
              message::show_dialog \
                      $xlib $from $id $type $subject $body $thread $priority $x 0
          }
      }
      
      hook::add process_message_hook \
          [namespace current]::chat::process_message_fallback 99
      
      ###############################################################################
      
      proc chat::window_titles {chatid} {
          set xlib [get_xlib $chatid]
          set jid [get_jid $chatid]
          set rjid [roster::find_jid $xlib $jid]
          set chatname [roster::itemconfig $xlib $rjid -name]
          if {$rjid != "" && $chatname != ""} {
              if {[is_groupchat [chatid $xlib $rjid]] && ![is_groupchat $chatid]} {
                  set titlename $jid
                  set tabtitlename [get_nick $xlib $jid chat]
              } else {
                  set titlename $chatname
                  set tabtitlename $chatname
              }
          } else {
              set titlename $jid
              if {[is_groupchat $chatid]} {
                  set tabtitlename [::xmpp::jid::node $jid]
              } else {
                  set tabtitlename [get_nick $xlib $jid chat]
              }
          }
          if {$tabtitlename == ""} {
              set tabtitlename $titlename
          }
          return [list $tabtitlename [::msgcat::mc "%s - Chat" $titlename]]
      }
      
      proc chat::reconnect_groupchats {xlib} {
          variable chats
      
          foreach chatid [opened $xlib] {
              if {[is_groupchat $chatid]} {
                  if {[info exists ::muc::muc_password($chatid)]} {
                      set password $::muc::muc_password($chatid)
                  } else {
                      set password ""
                  }
                  muc::join_group $xlib \
                                  [get_jid $chatid] \
                                  [get_our_groupchat_nick $chatid] \
                                  $password
              }
          }
      }
      
      hook::add connected_hook [namespace current]::chat::reconnect_groupchats 99
      
      proc chat::disconnect_groupchats {xlib} {
          variable chats
          global statusdesc
      
          foreach chatid [opened $xlib] {
              if {![winfo exists [chat_win $chatid]]} return
      
              set jid [get_jid $chatid]
      
              if {[is_groupchat $chatid]} {
                  muc::reset_group $chatid
                  client:presence $xlib $jid unavailable "" {}
                  foreach jid [get_jids_of_user $xlib $jid] {
                      client:presence $xlib $jid unavailable "" {}
                  }
              }
              add_message $chatid $jid error [::msgcat::mc "Disconnected"] {}
      
              set cw [winid $chatid]
      
              if {[winfo exists $cw.status.icon]} {
                  $cw.status.icon configure \
                      -image [ifacetk::roster::get_jid_icon $xlib $jid unavailable] \
                      -helptext ""
              }
      
              if {[winfo exists $cw.status.desc]} {
                  $cw.status.desc configure \
                      -text "($statusdesc(unavailable))" \
                      -helptext ""
              }
          }
      }
      
      hook::add disconnected_hook [namespace current]::chat::disconnect_groupchats
      
      proc chat::open_window {chatid type args} {
          global chat_width chat_height
          variable chats
          variable chat_id
          variable options
          global statusdesc
      
          set xlib [get_xlib $chatid]
          set jid [get_jid $chatid]
          set jid [::xmpp::jid::normalize $jid]
          set chatid [chatid $xlib $jid]
      
          set cw [winid $chatid]
      
          set cleanroster 1
          foreach {key val} $args {
              switch -- $key {
                  -cleanroster { set cleanroster $val }
              }
          }
      
          if {[winfo exists $cw]} {
              if {!$::usetabbar && \
                      [info exists ::raise_on_activity] && $::raise_on_activity} {
                  if {$type == "chat"} {
                      wm deiconify $cw
                  }
                  raise $cw
              }
              return
          }
      
          switch -- $type {
              chat -
              groupchat { }
              error {
                  # TODO: check JID category
                  set type chat
              }
          }
      
          hook::run open_chat_pre_hook $chatid $type
      
          set chats(type,$chatid) $type
          set chats(subject,$chatid) ""
          set chats(exit_status,$chatid) ""
          add_to_opened $chatid
      
          set chat_id($cw) $chatid
      
          lassign [chat::window_titles $chatid] chats(tabtitlename,$chatid) \
              chats(titlename,$chatid)
      
          add_win $cw -title $chats(titlename,$chatid) \
              -tabtitle $chats(tabtitlename,$chatid) \
              -class Chat -type $type \
              -raisecmd "focus \[chat::input_win [list $chatid]\]
                         hook::run raise_chat_tab_hook [list $cw] [list $chatid]"
      
          Frame $cw.status
          pack $cw.status -side top -fill x
          if {[string equal $type chat]} {
              set status [get_user_status $xlib $jid]
              Label $cw.status.icon \
                  -image [ifacetk::roster::get_jid_icon $xlib $jid $status] \
                  -helptext [get_user_status_desc $xlib $jid]
              pack $cw.status.icon -side left
              if {$options(display_status_description)} {
                  Label $cw.status.desc -text "($statusdesc($status))" \
                      -helptext [get_user_status_desc $xlib $jid]
                  pack $cw.status.desc -side left
              }
          }
      
          set mb $cw.status.mb
          set m $mb.menu
          if {[string equal $type chat]} {
              MenuToolbutton $mb -text $jid -menu $m
              menu $m -tearoff 0 \
                      -postcommand [namespace code \
                                              [list create_user_menu $m $chatid]]
              pack $mb -side left
          } else {
              MenuToolbutton $mb -text [::msgcat::mc "Subject:"] \
                             -direction below -menu $m
              menu $m -tearoff 0 \
                      -postcommand [namespace code \
                                          [list create_conference_menu $m $chatid]]
              pack $mb -side left
      
              Entry $cw.status.subject \
                  -xscrollcommand [list [namespace current]::set_subject_tooltip \
                                        $chatid]
              pack $cw.status.subject -side left -fill x -expand yes
      
              bind $cw.status.subject <Return> \
                  [list chat::change_subject [double% $chatid]]
      
              bind $cw.status.subject <Escape> \
                  [list chat::restore_subject [double% $chatid]]
      
              balloon::setup $cw.status.subject \
                  -command [list [namespace current]::set_subject_balloon $chatid]
          }
          foreach tag [bind Menubutton] {
              if {[string first 1 $tag] >= 0} {
                  regsub -all 1 $tag 3 new
                  bind $cw.status.mb $new [bind Menubutton $tag]
              }
          }
      
          PanedWin $cw.pw0 -orient vertical
          pack $cw.pw0 -fill both -expand yes
      
      
          set upw [PanedWinAdd $cw.pw0 -weight 1]
          set dow [PanedWinAdd $cw.pw0 -weight 0]
      
          set isw [ScrolledWindow $cw.isw -scrollbar vertical]
          pack $cw.isw -fill both -expand yes -side bottom -in $dow
          set chats(inputwin,$chatid) \
              [Wrapped [textUndoable $cw.input -width $chat_width \
                                               -height [option get $cw inputheight \
                                                                       Chat] \
                                               -wrap word]]
          $isw setwidget $cw.input
          [winfo parent $dow] configure -height [winfo reqheight $cw.input]
      
          if {[string equal $type groupchat]} {
              PanedWin $cw.pw -orient horizontal
              pack $cw.pw -fill both -expand yes -in $upw
      
              set cf [PanedWinAdd $cw.pw -weight 1]
      
              set uw [PanedWinAdd $cw.pw -weight 0]
              set chats(userswin,$chatid) $uw.users
      
              set rosterwidth [option get . chatRosterWidth [winfo class .]]
              if {$rosterwidth == ""} {
                  set rosterwidth [winfo pixels . 3c]
              }
      
              ifacetk::roster::create $uw.users -width $rosterwidth \
                  -popup ifacetk::roster::groupchat_popup_menu \
                  -singleclick [list [namespace current]::user_singleclick $chatid] \
                  -doubleclick ifacetk::roster::jid_doubleclick \
                  -draginitcmd [namespace current]::draginitcmd \
                  -dropovercmd [list [namespace current]::dropovercmd $chatid] \
                  -dropcmd [list [namespace current]::dropcmd $chatid]
              pack $uw.users -fill both -side right -expand yes
              [winfo parent $uw] configure -width $rosterwidth
      
              set pack_in $cf
          } else {
              set cf $cw
              set pack_in $upw
          }
      
          set csw [ScrolledWindow $cf.csw -scrollbar vertical -auto none]
          pack $csw -expand yes -fill both -side top -in $pack_in
      
          ::richtext::richtext $cf.chat \
              -width $chat_width -height $chat_height \
              -wrap word
      
          set chats(chatwin,$chatid) $cf.chat
      
          ::plugins::chatlog::config $cf.chat \
              -theyforeground [query_optiondb $cw theyforeground] \
              -meforeground [query_optiondb $cw meforeground] \
              -serverlabelforeground [query_optiondb $cw serverlabelforeground] \
              -serverforeground [query_optiondb $cw serverforeground] \
              -infoforeground [query_optiondb $cw infoforeground] \
              -errforeground [query_optiondb $cw errforeground] \
              -highlightforeground [query_optiondb $cw highlightforeground]
      
          $csw setwidget $cf.chat
      
          reverse_scroll [chat_win $chatid]
      
          focus [input_win $chatid]
      
          bind [input_win $chatid] <Shift-Key-Return> { }
      
          bind [input_win $chatid] <Key-Return> [double% "
              chat::send_message [list $cw] [list $chatid] [list $type]
              break"]
      
          set wr [Wrapped [chat_win $chatid]]
      
          regsub -all %W [bind Text <Prior>] [double% $wr] prior_binding
          regsub -all %W [bind Text <Next>] [double% $wr] next_binding
          bind [input_win $chatid] <Meta-Prior> $prior_binding
          bind [input_win $chatid] <Meta-Next> $next_binding
          bind [input_win $chatid] <Alt-Prior> $prior_binding
          bind [input_win $chatid] <Alt-Next> $next_binding
          bind [input_win $chatid] <Meta-Prior> +break
          bind [input_win $chatid] <Meta-Next> +break
          bind [input_win $chatid] <Alt-Prior> +break
          bind [input_win $chatid] <Alt-Next> +break
          bind [input_win $chatid] <Control-Meta-Prior> continue
          bind [input_win $chatid] <Control-Meta-Next> continue
          bind [input_win $chatid] <Control-Alt-Prior> continue
          bind [input_win $chatid] <Control-Alt-Next> continue
      
          regsub -all %W [bind Text <Control-Home>] [double% $wr] home_binding
          regsub -all %W [bind Text <Control-End>] [double% $wr] end_binding
          bind [input_win $chatid] <Control-Meta-Home> $home_binding
          bind [input_win $chatid] <Control-Meta-End> $end_binding
          bind [input_win $chatid] <Control-Alt-Home> $home_binding
          bind [input_win $chatid] <Control-Alt-End> $end_binding
          bind [input_win $chatid] <Control-Meta-Home> +break
          bind [input_win $chatid] <Control-Meta-End> +break
          bind [input_win $chatid] <Control-Alt-Home> +break
          bind [input_win $chatid] <Control-Alt-End> +break
      
          bind $cw <Destroy> [list chat::close_window [double% $chatid]]
      
          hook::run open_chat_post_hook $chatid $type
      }
      
      ###############################################################################
      
      proc chat::activate {chatid} {
          raise_win [winid $chatid]
          focus -force [input_win $chatid]
      }
      
      ###############################################################################
      
      # This proc is used by the "richtext widget" to query the option DB for
      # it's attributes which are really maintained by the main chat window
      proc chat::query_optiondb {w option} {
          option get $w $option Chat
      }
      
      ###############################################################################
      
      proc chat::draginitcmd {target x y top} {
          return {}
      }
      
      ###############################################################################
      
      proc chat::dropovercmd {chatid target source event x y op type data} {
          variable chats
      
          set chat_xlib [get_xlib $chatid]
          lassign $data jid_xlib jid
      
          if {$source != ".roster.canvas" || [is_disconnected $chatid] || \
                  $chat_xlib != $jid_xlib || \
                  ![::roster::itemconfig $jid_xlib $jid -isuser]} {
              DropSite::setcursor dot
              return 0
          } else {
              DropSite::setcursor based_arrow_down
              return 1
          }
      }
      
      ###############################################################################
      
      proc chat::dropcmd {chatid target source x y op type data} {
          set group [get_jid $chatid]
          lassign $data xlib jid
          set reason [::msgcat::mc "Please join %s" $group]
      
          if {[muc::is_compatible $group]} {
              muc::invite_muc $xlib $group $jid $reason
          } else {
              muc::invite_xconference $xlib $group $jid $reason
          }
      }
      
      ###############################################################################
      
      proc chat::user_singleclick {chatid tags cjid jids} {
          lassign $cjid xlib jid
          set nick [get_nick $xlib $jid groupchat]
          hook::run groupchat_roster_user_singleclick_hook $chatid $nick
      }
      
      ###############################################################################
      
      proc chat::bind_window_click {chatid type} {
          set cw [Wrapped [chat::chat_win $chatid]]
          bind $cw <ButtonPress-1><ButtonRelease-1> \
              [list hook::run chat_window_click_hook [double% $chatid] %W %x %y]
      }
      
      hook::add open_chat_post_hook [namespace current]::chat::bind_window_click
      
      ###############################################################################
      
      proc chat::close_window {chatid} {
          variable chats
          variable chat_id
      
          if {![is_opened $chatid]} return
      
          remove_from_opened $chatid
      
          set xlib [get_xlib $chatid]
          set jid [get_jid $chatid]
      
          set cw [winid $chatid]
          unset chat_id($cw)
      
          if {[is_groupchat $chatid]} {
              muc::leave_group $chatid $chats(exit_status,$chatid)
              client:presence $xlib $jid unavailable "" {}
              foreach jid [get_jids_of_user $xlib $jid] {
                  client:presence $xlib $jid unavailable "" {}
              }
          }
      
          destroy $cw
          hook::run close_chat_post_hook $chatid
      }
      
      ##############################################################################
      
      proc chat::trace_room_nickname_change {chatid nick new_nick} {
          set xlib [get_xlib $chatid]
          set group [get_jid $chatid]
          set from $group/$nick
          set to $group/$new_nick
          set chatid1 [chatid $xlib $from]
      
          if {$chatid1 ni [::chat::opened]} return
      
          set msg [::msgcat::mc "%s has changed nick to %s." $nick $new_nick]
          ::chat::add_message $chatid1 "" chat $msg {}
      
          set cw [chat_win $chatid1]
          $cw config -state normal
          $cw delete {end - 1 char} ;# zap trailing newline
          $cw insert end " "
          set tooltip [::msgcat::mc "Opens a new chat window\
              for the new nick of the room occupant"]
          ::plugins::urls::render_url $cw url $tooltip {} \
              -title [::msgcat::mc "Open new conversation"] \
              -command [list [namespace current]::open_to_user $xlib $to]
          $cw insert end \n
          $cw config -state disabled
      }
      
      hook::add room_nickname_changed_hook chat::trace_room_nickname_change
      
      ##############################################################################
      
      proc chat::check_xlib {xlib chatid} {
          if {[get_xlib $chatid] == $xlib} {
              return 1
          } else {
              return 0
          }
      }
      
      proc chat::check_jid {xlib jid chatid} {
          if {[get_xlib $chatid] != $xlib} {
              return 0
          } elseif {[get_jid $chatid] != $jid && \
                  [::xmpp::jid::stripResource [get_jid $chatid]] != $jid} {
              return 0
          } else {
              return 1
          }
      }
      
      ##############################################################################
      
      proc chat::opened {{xlib {}} {jid {}}} {
          variable chats
      
          if {![info exists chats(opened)]} {
              return {}
          } elseif {$jid != {}} {
              return [lfilter [list [namespace current]::check_jid $xlib $jid] \
                              $chats(opened)]
          } elseif {$xlib != {}} {
              return [lfilter [list [namespace current]::check_xlib $xlib] \
                              $chats(opened)]
          } else {
              return $chats(opened)
          }
      }
      
      proc chat::is_opened {chatid} {
          variable chats
      
          if {[info exists chats(opened)] && $chatid in $chats(opened)} {
              return 1
          } else {
              return 0
          }
      }
      
      proc chat::add_to_opened {chatid} {
          variable chats
      
          lappend chats(opened) $chatid
          set chats(opened) [lsort -unique $chats(opened)]
      }
      
      proc chat::remove_from_opened {chatid} {
          variable chats
      
          set idx [lsearch -exact $chats(opened) $chatid]
          if {$idx >= 0} {
              set chats(opened) [lreplace $chats(opened) $idx $idx]
          }
      }
      
      ##############################################################################
      
      proc chat::users_win {chatid} {
          variable chats
          if {[info exists chats(userswin,$chatid)]} {
              return $chats(userswin,$chatid)
          } else {
              return ""
          }
      }
      
      proc chat::chat_win {chatid} {
          variable chats
          if {[info exists chats(chatwin,$chatid)]} {
              return $chats(chatwin,$chatid)
          } else {
              return ""
          }
      }
      
      proc chat::input_win {chatid} {
          variable chats
          if {[info exists chats(inputwin,$chatid)]} {
              return $chats(inputwin,$chatid)
          } else {
              return ""
          }
      }
      
      ##############################################################################
      
      proc chat::is_chat {chatid} {
          variable chats
          if {[info exists chats(type,$chatid)]} {
              return [string equal $chats(type,$chatid) chat]
          } else {
              return 1
          }
      }
      
      proc chat::is_groupchat {chatid} {
          variable chats
          if {[info exists chats(type,$chatid)]} {
              return [string equal $chats(type,$chatid) groupchat]
          } else {
              return 0
          }
      }
      
      ##############################################################################
      
      proc chat::is_disconnected {chatid} {
          if {[is_groupchat $chatid] &&
                      ![string equal [muc::status $chatid] connected]} {
              return 1
          } else {
              return 0
          }
      }
      
      ##############################################################################
      
      proc chat::create_user_menu {m chatid} {
          $m delete 0 end
          foreach mm [winfo children $m] {
              destroy $mm
          }
      
          set xlib [get_xlib $chatid]
          set jid [get_jid $chatid]
      
          hook::run chat_create_user_menu_hook $m $xlib $jid
      
          return $m
      }
      
      proc chat::create_conference_menu {m chatid} {
          $m delete 0 end
          foreach mm [winfo children $m] {
              destroy $mm
          }
      
          set xlib [get_xlib $chatid]
          set jid [get_jid $chatid]
      
          hook::run chat_create_conference_menu_hook $m $xlib $jid
      
          return $m
      }
      
      proc chat::add_separator {m xlib jid} {
          $m add separator
      }
      
      hook::add chat_create_user_menu_hook chat::add_separator 40
      hook::add chat_create_user_menu_hook chat::add_separator 42
      hook::add chat_create_user_menu_hook chat::add_separator 50
      hook::add chat_create_user_menu_hook chat::add_separator 70
      hook::add chat_create_user_menu_hook chat::add_separator 85
      hook::add chat_create_conference_menu_hook chat::add_separator 40
      hook::add chat_create_conference_menu_hook chat::add_separator 42
      hook::add chat_create_conference_menu_hook chat::add_separator 50
      
      proc chat::send_message {cw chatid type} {
          set iw [input_win $chatid]
      
          set xlib [get_xlib $chatid]
      
          if {[catch { set user [connection_user $xlib] }]} {
              set user ""
          }
      
          set body [$iw get 1.0 "end -1 chars"]
      
          debugmsg chat "SEND_MESSAGE:\
       [list $chatid] [list $user] [list $body] [list $type]"
      
          set chatw [chat_win $chatid]
          $chatw mark set start_message "end -1 chars"
          $chatw mark gravity start_message left
      
          hook::run chat_send_message_hook $chatid $user $body $type
      
          $iw delete 1.0 end
          catch {$iw edit reset}
      }
      
      proc chat::add_message {chatid from type body x} {
          variable chats
          variable options
      
          if {[catch {lindex [info level -1] 0} parent]} {
              set parent "{}"
          }
      
          debugmsg chat "ADD_MESSAGE: $parent $chatid $from $type $body $x"
      
          if {[is_opened $chatid]} {
              set chatw [chat_win $chatid]
      
              if {[lindex [$chatw yview] 1] == 1} {
                  set scroll 1
              } else {
                  set scroll 0
              }
          } else {
              set scroll 1
          }
      
          hook::run draw_message_hook $chatid $from $type $body $x
      
          if {[is_opened $chatid]} {
              set chatw [chat_win $chatid]
      
              if {![$chatw compare "end -1 chars linestart" == "end -1 chars"]} {
                  $chatw insert end "\n"
              }
      
              # In the last condition we work around the underscrolling if the chat
              # window wasn't maped yet. It's unlikely that mapped chat window will
              # be exactly 1 pixel tall.
              if {$body != "" && !$options(stop_scroll) && \
                      (!$options(smart_scroll) || \
                           ($options(smart_scroll) && $scroll) || \
                           [chat::is_our_jid $chatid $from] || \
                           [winfo height $chatw] == 1)} {
                  after idle [list catch [list $chatw yview moveto 1]]
              }
      
              $chatw configure -state disabled
          }
      
          hook::run draw_message_post_hook $chatid $from $type $body $x
      }
      
      proc chat::add_open_to_user_menu_item {m xlib jid} {
          $m add command -label [::msgcat::mc "Start chat"] \
              -command [list chat::open_to_user $xlib $jid]
      }
      
      hook::add roster_create_groupchat_user_menu_hook \
          [namespace current]::chat::add_open_to_user_menu_item 10
      hook::add roster_jid_popup_menu_hook \
          [namespace current]::chat::add_open_to_user_menu_item 10
      hook::add message_dialog_menu_hook \
          [namespace current]::chat::add_open_to_user_menu_item 10
      hook::add search_popup_menu_hook \
          [namespace current]::chat::add_open_to_user_menu_item 10
      
      proc chat::open_to_user {xlib user args} {
          set msg ""
          foreach {opt val} $args {
              switch -- $opt {
                  -message { set msg $val }
              }
          }
      
          if {$xlib == ""} {
              set xlib [lindex [connections] 0]
          }
      
          set jid [get_jid_of_user $xlib $user]
      
          if {[string equal $jid ""]} {
              set jid $user
          }
      
          set jid [::xmpp::jid::normalize $jid]
      
          set chatid [chatid $xlib $jid]
          set cw [winid $chatid]
          if {![winfo exists $cw]} {
              chat::open_window $chatid chat
          }
          raise_win $cw
          focus -force [input_win $chatid]
      
          if {![string equal $msg ""]} {
              debugmsg chat "SEND_MESSAGE ON OPEN:\
                  [list $chatid] [connection_user $xlib] [list $msg] chat"
      
              set chatw [chat_win $chatid]
              $chatw mark set start_message "end -1 chars"
              $chatw mark gravity start_message left
      
              hook::run chat_send_message_hook $chatid [connection_user $xlib] \
                  $msg chat
          }
      }
      
      ###############################################################################
      
      proc chat::change_presence {xlib jid type x args} {
          variable options
          global statusdesc
      
          debugmsg chat "PRESENCE: $xlib $jid $type $x $args"
      
          set chatid [chatid $xlib $jid]
      
          if {![is_opened $chatid] || [is_groupchat $chatid]} return
      
          switch -- $type {
              error -
              unavailable { set status $type }
              available {
                  set status available
                  foreach {key val} $args {
                      switch -- $key {
                          -show { set status [normalize_show $val] }
                      }
                  }
              }
              default { return }
          }
      
          # This case traces both chat and private groupchat conversations:
          if {$options(gen_status_change_msgs)} {
              set msg [get_nick $xlib $jid chat]
              append msg " " [::get_long_status_desc [::get_user_status $xlib $jid]]
              set desc [::get_user_status_desc $xlib $jid]
              if {![string equal $desc ""]} {
                  append msg " ($desc)"
              }
              ::chat::add_message $chatid "" chat $msg {}
          }
      
          set cw [winid $chatid]
      
          if {[winfo exists $cw.status.icon]} {
              $cw.status.icon configure \
                  -image [ifacetk::roster::get_jid_icon $xlib $jid $status] \
                  -helptext [get_user_status_desc $xlib $jid]
          }
      
          if {[winfo exists $cw.status.desc]} {
              $cw.status.desc configure \
                      -text "($statusdesc([get_user_status $xlib $jid]))" \
                      -helptext [get_user_status_desc $xlib $jid]
          }
      
          set user [::xmpp::jid::stripResource $jid]
          set cw [winid [chatid $xlib $user]]
      
          if {[winfo exists $cw.status.icon]} {
              $cw.status.icon configure \
                  -image [ifacetk::roster::get_jid_icon \
                              $xlib $user [get_user_status $xlib $user]] \
                  -helptext [get_user_status_desc $xlib $user]
          }
      }
      
      hook::add client_presence_hook chat::change_presence 70
      
      ###############################################################################
      
      proc chat::process_roster_event {chatid jid nick status args} {
          debugmsg chat "ROSTER: $chatid $jid $nick $status"
      
          if {[string equal $nick ""]} return
      
          chat::redraw_roster_after_idle $chatid
      }
      
      namespace eval chat {
          variable g2l
          array set g2l [list 1 [::msgcat::mc "Moderators"] \
                              2 [::msgcat::mc "Participants"] \
                              3 [::msgcat::mc "Visitors"] \
                              4 [::msgcat::mc "Users"]]
      }
      
      proc chat::redraw_roster {chatid} {
          variable g2l
      
          set userswin [users_win $chatid]
      
          if {![winfo exists $userswin]} return
      
          ifacetk::roster::clear $userswin 0
      
          set xlib [get_xlib $chatid]
          set group [get_jid $chatid]
      
          set levels {}
          foreach nick [::muc::roster $chatid] {
              set jid $group/$nick
              set role [::muc::get_role $xlib $jid]
      
              switch -- $role {
                  moderator   {set level 1}
                  participant {set level 2}
                  visitor     {set level 3}
                  default     {set level 4}
              }
              lappend levels $level
              lappend levelusers($level) [list $jid $nick]
          }
          set levels [lsort -unique $levels]
      
          foreach level $levels {
              ifacetk::roster::addline $userswin group \
                  "$g2l($level) ([llength $levelusers($level)])" $level $level {} 0
      
              foreach item [lsort -index 1 -dictionary $levelusers($level)] {
                  lassign $item jid nick
                  set status [get_user_status $xlib $jid]
      
                  if {$::plugins::nickcolors::options(use_colored_roster_nicks)} {
                      set foreground [plugins::nickcolors::get_color $nick]
                  } else {
                      set foreground [ifacetk::roster::get_foreground $status]
                  }
                  ifacetk::roster::addline $userswin jid $nick \
                      [list $xlib $jid] $level {} 0 \
                      {} roster/user/$status $foreground
              }
          }
      
          ifacetk::roster::update_scrollregion $userswin
      }
      
      proc chat::redraw_roster_after_idle {group} {
          variable afterid
      
          if {[info exists afterid($group)]} \
              return
      
          set afterid($group) [after idle "
              chat::redraw_roster [list $group]
              unset [list ::chat::afterid($group)]
          "]
      }
      
      proc chat::restore_subject {chatid} {
          variable chats
      
          set sw [winid $chatid].status.subject
      
          if {[is_opened $chatid] && [winfo exists $sw]} {
              $sw delete 0 end
              $sw insert 0 $chats(subject,$chatid)
          }
      }
      
      proc chat::set_subject {chatid subject} {
          variable chats
      
          set cw [winid $chatid]
      
          if {[is_opened $chatid]} {
              $cw.status.subject delete 0 end
              $cw.status.subject insert 0 $subject
              set chats(subject,$chatid) $subject
          }
      }
      
      proc chat::change_subject {chatid} {
          set cw [winid $chatid]
          set xlib [get_xlib $chatid]
          set jid [get_jid $chatid]
      
          set subject [$cw.status.subject get]
      
          message::send_msg $xlib $jid -type groupchat -subject $subject
      }
      
      proc chat::set_subject_balloon {chatid} {
          variable chats
      
          set sw [winid $chatid].status.subject
      
          if {[info exists chats(subject_tooltip,$chatid)]} {
              return [list $chatid $chats(subject_tooltip,$chatid) \
                           -width [winfo width $sw]]
          } else {
              return [list $chatid ""]
          }
      }
      
      proc chat::set_subject_tooltip {chatid lo hi} {
          variable chats
      
          set sw [winid $chatid].status.subject
      
          if {![winfo exists $sw]} return
      
          if {($lo == 0) && ($hi == 1)} {
              set chats(subject_tooltip,$chatid) ""
          } else {
              set chats(subject_tooltip,$chatid) [$sw get]
          }
      }
      
      proc chat::is_our_jid {chatid jid} {
          return [string equal [our_jid $chatid] $jid]
      }
      
      proc chat::our_jid {chatid} {
          variable chats
      
          set xlib [get_xlib $chatid]
          set jid [get_jid $chatid]
      
          if {![info exists chats(type,$chatid)]} {
              return ""
          }
      
          switch -- $chats(type,$chatid) {
              groupchat {
                  return $jid/[get_our_groupchat_nick $chatid]
              }
              chat {
                  set group [::xmpp::jid::stripResource $jid]
                  set groupid [chatid $xlib $group]
                  if {[is_groupchat $groupid]} {
                      return $group/[get_our_groupchat_nick $groupid]
                  } else {
                      return [connection_jid $xlib]
                  }
              }
          }
      
          return ""
      }
      
      ###############################################################################
      
      proc chat::add_invite_menu_item {m xlib jid} {
          $m add command -label [::msgcat::mc "Invite to conference..."] \
                 -command [list chat::invite_dialog $xlib $jid 0]
      }
      
      hook::add chat_create_user_menu_hook \
          [namespace current]::chat::add_invite_menu_item 20
      hook::add roster_create_groupchat_user_menu_hook \
          [namespace current]::chat::add_invite_menu_item 20
      hook::add roster_jid_popup_menu_hook \
          [namespace current]::chat::add_invite_menu_item 20
      hook::add message_dialog_menu_hook \
          [namespace current]::chat::add_invite_menu_item 20
      hook::add search_popup_menu_hook \
          [namespace current]::chat::add_invite_menu_item 20
      
      proc chat::add_invite2_menu_item {m xlib jid} {
          $m add command -label [::msgcat::mc "Invite users..."] \
                 -command [list chat::invite_dialog2 $xlib $jid 0]
      }
      
      hook::add chat_create_conference_menu_hook \
          [namespace current]::chat::add_invite2_menu_item 20
      
      ###############################################################################
      
      proc chat::invite_dialog {xlib user {ignore_muc 0} args} {
          variable chats
          global invite_gc
      
          set jid [get_jid_of_user $xlib $user]
      
          if {[string equal $jid ""]} {
              set jid $user
          }
      
          set gw .invite
          catch { destroy $gw }
      
          if {[catch { set nick [roster::get_label $user] }]} {
              if {[catch {set nick [roster::get_label \
                                        [::xmpp::jid::stripResource $user]] }]} {
                  if {[catch { set nick [chat::get_nick $xlib \
                                                        $user groupchat] }]} {
                      set nick $user
                  }
              }
          }
      
          set titles {}
          set jids {}
          foreach chatid [lsort [lfilter [namespace current]::is_groupchat \
                                         [opened $xlib]]] {
              lappend jids $chatid [get_jid $chatid]
              lappend titles $chatid [::xmpp::jid::node [get_jid $chatid]]
          }
          if {[llength $titles] == 0} {
              MessageDlg ${gw}_err -aspect 50000 -icon info \
                  -message \
                      [::msgcat::mc "No conferences for %s in progress..." \
                          [connection_jid $xlib]] \
                  -type user \
                  -buttons ok -default 0 -cancel 0
              return
          }
      
          CbDialog $gw [::msgcat::mc "Invite %s to conferences" $nick] \
              [list [::msgcat::mc "Invite"] \
                    "chat::invitation [list $jid] 0 $ignore_muc
                     destroy $gw" \
                    [::msgcat::mc "Cancel"] "destroy $gw"] \
              invite_gc $titles $jids
      }
      
      proc chat::invite_dialog2 {xlib jid ignore_muc args} {
          variable chats
          global invite_gc
      
          set gw .invite
          catch { destroy $gw }
      
          set title [::xmpp::jid::node $jid]
      
          set choices {}
          set balloons {}
          foreach choice [roster::get_jids $xlib] {
              if {[roster::itemconfig $xlib $choice -category] ne "conference"} {
                  lappend choices \
                          [list $xlib $choice] [roster::get_label $xlib $choice]
                  lappend balloons [list $xlib $choice] $choice
              }
          }
          if {[llength $choices] == 0} {
              MessageDlg ${gw}_err -aspect 50000 -icon info \
                  -message \
                      [::msgcat::mc "No users in %s roster..." \
                           [connection_jid $xlib]] \
                  -type user \
                  -buttons ok -default 0 -cancel 0
              return
          }
      
          CbDialog $gw [::msgcat::mc "Invite users to %s" $title] \
              [list [::msgcat::mc "Invite"] \
                    "chat::invitation [list $jid] 1 $ignore_muc
                     destroy $gw" \
                    [::msgcat::mc "Cancel"] "destroy $gw"] \
              invite_gc $choices $balloons
      }
      
      proc chat::invitation {jid usersP ignore_muc {reason ""}} {
          global invite_gc
      
          foreach choice [array names invite_gc] {
              if {$invite_gc($choice)} {
                  lassign $choice con gc
                  if {$usersP} {
                      set to $gc
                      set group $jid
                  } else {
                      set to $jid
                      set group $gc
                  }
                  if {[string equal $reason ""]} {
                      set reas [::msgcat::mc "Please join %s" $group]
                  } else {
                      set reas $reason
                  }
                  if {!$ignore_muc && [muc::is_compatible $group]} {
                      muc::invite_muc $con $group $to $reas
                  } else {
                      muc::invite_xconference $con $group $to $reas
                  }
              }
          }
      }
      
      #############################################################################
      
      proc chat::restore_window {cjid type nick xlib jid} {
          set chatid [chatid $xlib $cjid]
      
          if {$type == "groupchat"} {
              set_our_groupchat_nick $chatid $nick
          }
      
          # TODO: Password?
          open_window $chatid $type
          set cw [winid $chatid]
          raise_win $cw
      }
      
      #############################################################################
      
      proc chat::save_session {vsession} {
          upvar 2 $vsession session
          global usetabbar
          variable chats
          variable chat_id
      
          # TODO
          if {!$usetabbar} return
      
          set prio 0
          foreach page [.nb pages] {
              set path [ifacetk::nbpath $page]
      
              if {[info exists chat_id($path)]} {
                  set chatid $chat_id($path)
      
                  set xlib [get_xlib $chatid]
                  set jid [get_jid $chatid]
                  set type $chats(type,$chatid)
      
                  if {$type == "groupchat"} {
                      set nick [get_our_groupchat_nick $chatid]
                  } else {
                      set nick ""
                  }
      
                  set user [connection_requested_user $xlib]
                  set server [connection_requested_server $xlib]
                  set resource [connection_requested_resource $xlib]
      
                  lappend session [list $prio $user $server $resource \
                      [list [namespace current]::restore_window $jid $type $nick] \
                  ]
              }
              incr prio
          }
      }
      
      hook::add save_session_hook [namespace current]::chat::save_session
      
      #############################################################################
      
      # vim:ft=tcl:ts=8:sw=4:sts=4:et
      ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������tkabber/configdir.tcl�������������������������������������������������������������������������������0000644�0000000�0000000�00000011112�14777013213�0014515�0����������������������������������������������������������������������������������������������������ustar�00nobody��������������������������nobody�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# configdir.tcl --
      #
      #       This file is a part of the Tkabber XMPP client. It provides the
      #       necessary heuristics for deducing the location of Tkabber config
      #       directory depending on the current platform.
      
      namespace eval config {}
      
      # Deduces the location of the "Application Data" directory
      # (in its wide sense) on the current Windows platform.
      # See: http://ru.tkabber.jabe.ru/index.php/Config_dir
      proc config::appdata_windows {} {
          global env
      
          if {[info exists env(APPDATA)]} {
              return $env(APPDATA)
          }
      
          if {![catch {package require registry}]} {
              set key {HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders}
              if {![catch {registry get $key AppData} dir]} {
                  return $dir
              }
          }
      
          return {}
      }
      
      # Copies the contents of dir $from under dir $to using bells'n'whistles.
      # NOTE that at the time of invocation:
      # * $from MUST exist
      # * $to MUST NOT exist.
      # Returns true if copying succeeded, false otherwise.
      proc config::transfer_dir {from to} {
          wm withdraw .
          wm title . [::msgcat::mc "Attention"]
          # Use [message] instead of [Message] wrapper because this script is
          # executed before the Tkabber requires BWidget or know if it uses Ttk
          # instead of Tk.
          pack [message .msg \
                        -aspect 50000 \
                        -text [::msgcat::mc "Please, be patient while Tkabber\
                                             configuration directory is being\
                                             transferred\
                                             to the new location"]] \
               -fill both -expand yes
          #::tk::PlaceWindow .
          wm deiconify .
      
          set failed [catch {file copy $from $to} err]
      
          # Use [tk_messageBox] instead of BWidget's [DialogMsg] because the latter
          # is unavailable at the time this procedure is called.
          if {$failed} {
              tk_messageBox .errormsg \
                            -icon error \
                            -title [::msgcat::mc "Error"] \
                            -message [::msgcat::mc "Tkabber configuration directory\
                                                    transfer failed with:\n%s\n\
                                                    Tkabber will use the old\
                                                    directory:\n%s" \
                                                   $err $from] \
                            -type ok
          } else {
              set to [file nativename $to]
              tk_messageBox .infomsg \
                            -icon info \
                            -title [::msgcat::mc "Attention"] \
                            -message [::msgcat::mc "Your new Tkabber config\
                                                    directory is now:\n%s\nYou\
                                                    can delete the old one:\n%s" \
                                                   $to $from] \
                            -type ok
          }
      
          destroy .msg
      
          expr {!$failed}
      }
      
      # Based on the current platform, chooses the location of the Tkabber's
      # config dir and sets the "configdir" global variable to its pathname.
      # "TKABBER_HOME" env var overrides any guessing.
      # NOTE that this proc now tries to copy contents of the "old-style"
      # ~/.tkabber config dir to the new location, if needed, to provide
      # smooth upgrade for Tkabber users on Windows.
      # This behaviour should be lifted eventually in the future.
      
      if {[catch {file home}]} {
          # Tcl 8
      
          set home ~
      } else {
          # Tcl 9-
      
          set home [file home]
      }
      
      if {![info exists env(TKABBER_HOME)]} {
          switch -- $tcl_platform(platform) {
              unix {
                  set configdir [file join $home .tkabber]
              }
              windows {
                  set dir [config::appdata_windows]
                  if {$dir != {}} {
                      set configdir [file join $dir Tkabber]
                  } else {
                  # Fallback default (depends on Tcl's idea about ~):
                  set configdir [file join $home .tkabber]
                  }
              }
              macintosh {
                  set configdir [file join $home Library "Application Support" Tkabber]
              }
          }
      
          set env(TKABBER_HOME) $configdir
      } else {
          set configdir $env(TKABBER_HOME)
      }
      
      set configdir [file normalize $configdir]
      
      # This should be lifted in the next release after introduction
      # of configdir.
      # TODO: what perms does the dest dir of [file copy] receive?
      # Since it's only needed for Windows, we don't really care now.
      if {![file exists $configdir] && [file isdir [file join $home .tkabber]]} {
          if {![config::transfer_dir [file join $home .tkabber] $configdir]} {
              # Transfer error-case fallback:
              set configdir [file join $home .tkabber]
          }
      }
      
      file mkdir $configdir
      
      # vim:ft=tcl:ts=8:sw=4:sts=4:et
      ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������tkabber/contrib�������������������������������������������������������������������������������������0000755�0000000�0000000�00000000000�14777013213�0013432�5����������������������������������������������������������������������������������������������������ustar�00nobody��������������������������nobody�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������tkabber/contrib/extract-translations����������������������������������������������������������������0000755�0000000�0000000�00000000000�14777013213�0017623�5����������������������������������������������������������������������������������������������������ustar�00nobody��������������������������nobody�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������tkabber/contrib/extract-translations/extract.tcl����������������������������������������������������0000755�0000000�0000000�00000016614�14777013213�0022073�0����������������������������������������������������������������������������������������������������ustar�00nobody��������������������������nobody�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/tclsh
      
      # extract.tcl --
      #
      #       Extract all msgcat or trans messages for a given language.
      #
      # Author: Vincent Ricard <vincent@magicninja.org>
      # Modified: Sergei Golovan <sgolovan@nes.ru>
      
      package require fileutil
      package require cmdline
      
      set msgcat_regexp0 \
          {::msgcat::mcset [a-zA-Z]+[ \t\r\n]+\"(([^\"]|\\\")*)\"}
      set msgcat_regexp1 \
          {\[::msgcat::mc[ \t\r\n]+\"(([^\"]|\\\")*)\"}
      set msgcat_regexp2 \
          {\[::msgcat::mc[ \t\r\n]+{([^\}]*)}}
      set msgcat_regexp3 \
          {\[::msgcat::mc[ \t\r\n]+([^ \t\r\n\{\"\[\]]*)}
      
      set trans_regexp0 \
          {::trans::trset [a-zA-Z]+[ \t\r\n]+\"(([^\"]|\\\")*)\"}
      set trans_regexp1 \
          {\[::trans::trans[ \t\r\n]+(\$[^ \t\r\n]+[ \t\r\n]+)?\"(([^\"]|\\\")*)\"}
      set trans_regexp2 \
          {\[::trans::trans[ \t\r\n]+(\$[^ \t\r\n]+[ \t\r\n]+)?{([^\}]*)}}
      set trans_regexp3 \
          {\[::trans::trans[ \t\r\n]+(\$[^ \t\r\n]+[ \t\r\n]+)?([^ \t\r\n\{\"\[\]]*)}
      
      set options {
          {trans       "Extract ::trans messages (::msgcat messages by default)"}
          {unused      "Show unused translated messages"}
          {lang.arg ?? "Prepare messages for specified language, default is"}
          {showvars.secret "Show translatable strings with variables only"}
      }
      set usage ": extract.tcl \[options\] directory \[msgfile\]\noptions:"
      if {[catch {
               array set params [::cmdline::getoptions argv $options $usage]
           } msg]} {
          puts stderr $msg
          exit 1
      }
      
      switch -- [llength $argv] {
          1 {
              set sourceDir [lindex $argv 0]
              set translationFile ""
          }
          2 {
              set sourceDir [lindex $argv 0]
              set translationFile [lindex $argv 1]
          }
          default {
              puts stderr [::cmdline::usage $options $usage]
              exit 1
          }
      }
      
      set sourceDir [lindex $argv 0]
      set trans $params(trans)
      set invertMatch $params(unused)
      set lang $params(lang)
      if {$lang == "??"} {
          # take lang from the message file name
          regexp {([-a-z]+)\.msg$} $translationFile -> lang
      }
      set showvars $params(showvars)
      
      proc key_with_var {___key} {
          # The only variable which is defined here is ___key, but
          # it isn't likely to appear in translatable messages
          catch [list eval list $___key]
      }
      
      # Read all tcl file from sourceDir
      set tclFileList [::fileutil::findByPattern $sourceDir -glob -- *tcl]
      foreach filename $tclFileList {
          set fd [open $filename]
      
          while {[gets $fd line] >= 0} {
              while {[regexp {(^|[^\B])(\B\B)*\B$} $line] && [gets $fd line1] >= 0} {
                  set line [string replace $line end end " [string trimleft $line1]"]
              }
      
              set line1 $line
              # Search: [ ::msgcat::mc "translation key"
              while {[regexp -- $msgcat_regexp1 $line1 whole key] || \
                          [regexp -- $msgcat_regexp2 $line1 whole key] || \
                          [regexp -- $msgcat_regexp3 $line1 whole key]} {
                  if {$key != "" && ((![key_with_var $key] && !$showvars) || \
                                     ([key_with_var $key] && $showvars))} {
                      if {![info exists mkeyHash($filename)]} {
                          # Create a new list (with the current key) for this file
                          set mkeyHash($filename) [list $key]
                      } elseif {[lsearch -exact $mkeyHash($filename) $key] < 0} {
                          # key doesn't exist for this file
                          lappend mkeyHash($filename) $key
                      }
                  }
                  set idx [string first $whole $line1]
                  set line1 [string replace $line1 0 \
                                    [expr {$idx + [string length $whole] - 1}]]
              }
      
              set line1 $line
              # Search: [ ::trans::trans "translation key"
              while {[regexp -- $trans_regexp1 $line1 whole _lang key] || \
                          [regexp -- $trans_regexp2 $line1 whole _lang key] || \
                          [regexp -- $trans_regexp3 $line1 whole _lang key]} {
                  if {$key != "" && ((![key_with_var $key] && !$showvars) || \
                                     ([key_with_var $key] && $showvars))} {
                      if {![info exists tkeyHash($filename)]} {
                          # Create a new list (with the current key) for this file
                          set tkeyHash($filename) [list $key]
                      } elseif {[lsearch -exact $tkeyHash($filename) $key] < 0} {
                          # key doesn't exist for this file
                          lappend tkeyHash($filename) $key
                      }
                  }
                  set idx [string first $whole $line1]
                  set line1 [string replace $line1 0 \
                                    [expr {$idx + [string length $whole] - 1}]]
              }
          }
          close $fd
      }
      
      proc remove_duplicate_keys {hashname} {
          upvar 1 $hashname hash
      
          set fileList [array names hash]
          for {set i 0} {$i < [llength $fileList]} {incr i} {
              for {set j [expr $i + 1]} {$j < [llength $fileList]} {incr j} {
                  foreach k $hash([lindex $fileList $i]) {
                      set J [lindex $fileList $j]
                      set ix [lsearch -exact $hash($J) $k]
                      if {-1 < $ix} {
                          set hash($J) [lreplace $hash($J) $ix $ix]
                      }
                  }
              }
          }
      }
      
      # Remove duplicated keys (through all files)
      remove_duplicate_keys mkeyHash
      remove_duplicate_keys tkeyHash
      
      proc read_translation_file {filename regexp} {
          # Read translation file
          set fd [open $filename]
          fconfigure $fd -encoding utf-8
          set translated [list]
      
          while {[gets $fd line] >= 0} {
              while {[regexp {(^|[^\B])(\B\B)*\B$} $line] && [gets $fd line1] >= 0} {
                  set line [string replace $line end end " [string trimleft $line1]"]
              }
              if {[regexp -- $regexp $line whole key]} {
                  lappend translated $key
              }
          }
          close $fd
      
          return $translated
      }
      
      proc print_all_results {hashname prefix lang} {
          upvar 1 $hashname hash
      
          foreach f [array names hash] {
              if {[llength $hash($f)] > 0} {
                  puts "# $f"
                  foreach k [lsort $hash($f)] {
                      puts "$prefix $lang \"$k\""
                  }
                  puts ""
              }
          }
      }
      
      if {$showvars} {
          print_all_results mkeyHash ::msgcat::mcset $lang
          print_all_results tkeyHash ::trans::trset $lang
          exit 0
      }
      
      if {$trans} {
          upvar 0 tkeyHash hash
          set regexp $trans_regexp0
          set prefix ::trans::trset
      } else {
          upvar 0 mkeyHash hash
          set regexp $msgcat_regexp0
          set prefix ::msgcat::mcset
      }
      
      if {$translationFile != "" && [file readable $translationFile]} {
      
          set translated [read_translation_file $translationFile $regexp]
      
          if {!$invertMatch} {
              # Display untranslated keys
              foreach f [array names hash] {
                  set displayFileName 1
                  foreach k [lsort $hash($f)] {
                      if {[lsearch -exact $translated $k] < 0} {
                          if {$displayFileName} {
                              set displayFileName 0
                              puts "# $f"
                          }
                          puts "$prefix $lang \"$k\""
                      }
                  }
                  if {!$displayFileName} {
                      puts ""
                  }
              }
          } else {
              # Remove useless keys
              foreach t [lsort $translated] {
                  set found 0
                  foreach f [array names hash] {
                      if {[lsearch -exact $hash($f) $t] >= 0} {
                          set found 1
                      }
                  }
                  if {!$found} {
                      puts "\"$t\""
                  }
              }
          }
      } else {
          if {!$invertMatch} {
              # Print result
              print_all_results hash $prefix $lang
          }
      }
      
      # vim:ft=tcl:ts=8:sw=4:sts=4:et
      ��������������������������������������������������������������������������������������������������������������������tkabber/contrib/gabber-docking-24x24����������������������������������������������������������������0000755�0000000�0000000�00000000000�14777013213�0017051�5����������������������������������������������������������������������������������������������������ustar�00nobody��������������������������nobody�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������tkabber/contrib/gabber-docking-24x24/gabber-docking-24x24.zip���������������������������������������0000644�0000000�0000000�00000005165�14777013213�0023302�0����������������������������������������������������������������������������������������������������ustar�00nobody��������������������������nobody�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PK����hO.î™Ha��l��
      ���available.gifs÷t³°L”``XÊ�ÿ¯gþ¿˜øj§Û“-Žÿï—ü¿÷óDø½uÖ×—›þÿñÿ“êÿWR?ì÷½¸PÿÔl­ÿË_ïr¿¼Øðè4µ[«,¾	ÞÛ§xb¦æ›ÝÛ;eMWÿ>~C“dccã™3gííí8ðŸ6@ñŸ¨sQjbIjŠByfI†BHFª‚»§o�ƒâOF.{Aže`+80¿ÀCGªÿÄ’¢“9Vó½Dd™˜š¹öŠñ°»4Ýþ¢%ÖÓöØ1މ…ÕE`¢Ï­‹—‡èTx2°ˆKÖ	H66qJIswvòóv…:1HÊLÊšÁ +'+?·‰AAqÁB%ÙåóflÚ¼e«»#ƒ5�PK����hO.àêy��l�����available-away.gifs÷t³°L”``XÊ�'(oèUš[%:³\xÛdõÍ“TVuÊN*ìÏ῱ÕsÇt…
      Ý™¼m)<;¦jÌ«ëÎäkNäžT ¸¬Eº6š³5‰§2Šc}bi{ccã™3gííí8ðŸÆ@ñŸ¨sQjbIjŠByfI†BHFª‚»§o�ƒâOF.Aže`+p˜Pà¡#ÕbIÑÉ«ù^
      "²LLMŒ\{ÅxØ]šnÑct;ìÇÄÂvÔ™¡ÓãÖŃŒÜ3´*<XÄjEøÅ›8…$¸;»ù„xºBÄ%'åÍ`’–’™ÛÄ +·`¡¼Ôòy36mÞ²ÕÝ‘Á�PK����hO.2Ö4��$�����available-chat.gifs÷t³°L”``ha�ÓK4O-Ö8±PíüJ½kÍon±9¹Hýê³;;ž:·B÷îNÇÏ7~<jz}:êÆ&ËÇC^ž{s&æñAŸW2îírú|#ÿ? øOÔ¹(5±$5E¡<³$C!$#UÁÝÓ7€Añ'#ƒ<ƒÈ	 Ç0°v<PïKÉœ—±j]Îë}Z
      Ì4Ø)œÐwicz¨àp!b_‹ÏB‰ãŽLDX¸2nãg?ðñ—ÂÄuœ
      3Ì¿…-ÒcdcixtP…‡G¸T%‡ÁÁÉ…AD´¹Å2ÍŠA,Õƒƒ›Ñx²x_›�ÿ\[A!áÞyš³L7nÚ¼e«®"ƒ5�PK����hO.mxù��� �����available-dnd.gifs÷t³°L”``ha``bbù÷èÊ¿KG>ï[ýrÓ¬{Ëz¯Ík9Ö•¿¯)åܤ’Måá˲|¦ºLŒ´YUØà­÷ŸD øOÔ¹(5±$5E¡<³$C!$#UÁÝÓ7€Añ'#ƒ�ƒ€ÃÀÚ¢ Ò—’9/cÕºœ×û4Îoȹ¥Ý÷j;÷›Í&”1±°41.L0áëÈx.rbÃQ¦†	†RWf—2œàc0‘Ü£<›û¹ICB‹wñ/µºÌÛ¬ø
      
      ê
      ¸ÊUêÊ
      ØËJÒb­ƒ[8›S˜3¬Ùù,àååáæâàL3t^c°ný†ÚŠÖ�PK����hO.tŒÏÂ%��*�����available-xa.gifs÷t³°L”``ha�oÿÿŸýõï§ÿkýŸsé÷±ÿÅÛ¾e­{7áø¯Ö£–•[s×h&ÎYóèOýö[3.þÉ[~¡ëÐÃÕÿæ¬IZú̧}OÐÔ³GþØ”o’hþ
      ÿ‰:¥&–¤¦(”g–d(„d¤*¸{ú0(þdaäbgÐ9äÖ¾ê})™ó2V­Ëy½OSáü†œ[Ú}¯¶s¿Ù¼`BSãÂ�¾ŽÃyxšY,ˆ8!ÑÃöUMA¦_—9Á ç¨u£´PâzÞ{‡ªÜ-<R„E²«’U£EÄÊ¢¹Xâ¬YÅ$$s*§²Lµfë—ÉégídžëÊ.µZŠ—7{Ê
      Wçm;vîÚ­­È`
      �PK���¬¶….rôÅ��«��
      ���invisible.gifs÷t³°L”``øÎ�†††–––NNN^^^AAAQQQÉÉÉÙÙÙÅÅÅÕÕÕ---===[{$ŽMQ<vìØ¹9šçλ¶ÔðùV§÷{Èëÿ¹ ÿç¢þ_Kþ-ûÿ= *þÿˆªÿÿ¿öŒ‚Á
      ²020È3è€r(O0pt0ØsÈxlXp°™CX+æÄ†…‡Û¹=X
      xÄy$p||ÔÆËÁ%ðàÆ…Åí|œ|EŠ<’69		©§;„õv,jl˜ÍÉèSèÄÈÂÍÄÀ«Åx¨••».Œ…áàAÆ•¢ö
      ¥¯\:#u*6$$G0°Fè¥r<hlÚªú0m®÷v½»
      Ö�PK����hO._aôý��������unavailable.gifs÷t³°L”``ha�šššòòò¸¸¸ˆˆˆÆÆÆÚÚÚüüü   ??¿­[·vttTTT¤¤¤¸»»;99577ÇÇÇ{zzÚÛÛûûûgffZ[[›››—––ž9s&!!!00ðÀÿa@ñŸ¨sQjbIjŠByfI†BHFª‚»§o�ƒâOF.y@Ža`M{ Þ—’9/cÕºœ×û´˜?p°r¸ð!V‚Ý¥éú'M±ž¶ÇŽ1Œ,l¬.}fm<Øè¸4Dç†HÇ—=¼#æÌH{YúÆ0sE¶RÃÓ¾ùg±J²J2H‡·ʰvùõULœ4¹B‘Á�PK�����hO.î™Ha��l��
      ��������� �€����available.gifPK�����hO.àêy��l����������� �€J��available-away.gifPK�����hO.2Ö4��$����������� �€Œ��available-chat.gifPK�����hO.mxù��� ����������� �€Ñ��available-dnd.gifPK�����hO.tŒÏÂ%��*����������� �€ù��available-xa.gifPK����¬¶….rôÅ��«��
      ��������� �€L��invisible.gifPK�����hO._aôý�������������� �€…��unavailable.gifPK������°��¯���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������tkabber/contrib/starkit�����������������������������������������������������������������������������0000755�0000000�0000000�00000000000�14777013213�0015113�5����������������������������������������������������������������������������������������������������ustar�00nobody��������������������������nobody�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������tkabber/contrib/starkit/README����������������������������������������������������������������������0000644�0000000�0000000�00000013761�14777013213�0016062�0����������������������������������������������������������������������������������������������������ustar�00nobody��������������������������nobody�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������This file describes a sample startup script
      for Tkabber starkits/starpacks.
      
      I. Purpose.
      
      The "main.tcl" file is the "main startup script" for starkits; it is
      a Tcl script which task is to "bootstrap" the application wrapped in starkit.
      
      Although this script is a sample, it's ready, without any modifications,
      to be used for creation of a working starkit.
      
      Note that throughout this text the "starkit" term is used to refer to
      both Tkabber's starkits and starpacks since there is no difference between them
      in this context.
      
      
      II. Prerequisites.
      
      This scripts expects the starkit's VFS directory to be organised
      in this way:
      VFS_root_dir/ -- starkit's VFS root directory;
        lib/        -- Tcl/Tk extensions (like BWidget);
        tkabber/    -- Tkabber's code (tkabber.tcl must be placed here);
        ...
        main.tcl    -- the starkit startup script.
      
      
      III. How it works.
      
      Besides the usual starkit initialization which is described in [1], this
      script performs two major tasks:
      * Defines the "starkit_init" Tcl procedure;
      * Sources the main Tkabber script -- "tkabber.tcl".
      
      Tkabber checks if the Tcl command named "starkit_init" is present in the
      global namespace and executes it (without passing any arguments to it) if it
      exists. At the time of calling "starkit_init" several global Tkabber
      variables are guaranteed to exist:
      * "rootdir", which is set to the full pathname of the directory
        containing the "tkabber.tcl" script;
      * "configdir", which holds the full pathname of the Tkabber's
        user configuration directory;
      * "toolkit_version", which holds the Tcl interpreter version.
      Also the hooks subsystem is guaranteed to be initialized so that the
      "starkit_init" procedure could make use of Tkabber hooks.
      
      The purpose of the "starkit_init" procedure is to make some preparations
      before the bulk of the Tkabber code is loaded but after Tkabber managed
      to initialize some subsystems/variables which might be crucial for the
      proper initialization of the starkit. The "starkit_init" procedure in
      the "main.tcl" script discussed here performs the following steps:
      
      * Appends the " (starkit)" string to the "toolkit_version" variable.
        This is done since the toolkit version is reported in response to the
        XMPP iq:version request, so it helps Tkabber supporters to better
        know a configuration a particular user runs.
      
      * "Forgets" about a Tcl package named "zlib" which is internal to
        any tclkit and confuses Tkabber forcing it to think that the XMPP
        stream compression can be used (which, in fact, requires another package --
        "ztcl" -- which, in turn, provides another Tcl package named "zlib").
      
      * Looks into two special directories and sources all the files whose
        names match the "*.kit" pattern. These directories are:
        * The directory where the running starkit is located;
        * The Tkabber's user configuration directory (held in the global
          variable named "configdir").
        This allows to bring some Tcl/Tk packages wrapped in starkits in.
        Two popular starkits known to work with Tkabber's starkit are
        img.kit (containing the Img package) [2] and the snack.kit (containing
        the Snack sound kit package) [2].
      
        If one or more of the kit files fail to load, a warning message with
        collected error messages is shown to the user and the loading
        process continues after the user dismisses this dialog.
      
      * Restores the "::starkit::topdir" variable which could be mangled by
        external starkits.
      
      * Sources the main Tkabber's script "tkabber.tcl".
      
      So, the outline of Tkabber bootstrapping process looks like this:
      
      * "main.tcl" is sourced by the tclkit reading the Tkabber's starkit.
      * "main.tcl" creates the global "starkit_init" procedure and sources the
        main Tkabber script, transferring control to Tkabber's code.
      * Tkabber performs some initialization steps, then finds the "starkit_init"
        command and executes it, effectively "calling the starkit code out".
      * "starkit_init" does its initialization steps, possibly bringing some
        external Tcl/Tk packages in, then gives control back to Tkabber.
      * Tkabber then continues with its loading as usually.
      
      
      IV. Differences between 0.10.0 and pre-0.10.0 starkits:
      
      Versions of Tkabber earlier that 0.10.0 had more limited support for
      starkits. Since 0.10.0 Tkabber has received some changes that allow to
      create fully-functional and customizable starkits without patching the
      Tkabber's code (as must have been done earlier).
      
      In short, the differences include:
      
      * The "rootdir" global variable is now initialized based on the actual
        full pathname of the "tkabber.tcl" script, so that Tkabber's code
        can now be located in an arbitrary directory in the starkit VFS.
        Note though that the sample "main.tcl" does make its assumption about
        where Tkabber's code is located.
      
      * Tkabber now "calls out" the starkit code in the course of its
        initialization process which differs from the old way the things
        worked when transferring the control to Tkabber's code was the
        last thing the starkit's initialization code did.
      
      * The official Tkabber starkits/starpacks made a Tcl package from the
        Tkabber's source tree. There were not much point to do so, that's why
        the discussed "main.tcl" just sources the main Tkabber script now.
      
      
      V. Additional stuff.
      
      Ruslan Rakhmanin [3] has created a sample "Windows Tkabber starpack
      tool" which contains all necessary files to build a Tkabber starpack for
      Windows in the Windows environment (Windows 2000 and later is required).
      To build starpack using this tool you only need (recent) Tkabber sources.
      
      Also this starpack tool uses a modified tclkit which contains a full set
      of cp* Windows charsets (which original tclkits lack) thus providing
      the full support for non-Latin-1 alphabets.
      
      There's an article (written in Russian) on the official Tkabber wiki
      describing this tool [4].
      
      A direct link to the RAR-archive containing this tool is [5].
      
      
      VI. Reference materials:
      
      1. http://wiki.tcl.tk/8186
      2. http://mini.net/sdarchive/
      3. xmpp:archimed@jabber.ru
      4. http://ru.tkabber.jabe.ru/index.php/Tkabber_starpack
      5. http://ru.tkabber.jabe.ru/images/ru.tkabber.jabe.ru/a/ad/Tkabber_win32_starpack_template.rar
      ���������������tkabber/contrib/starkit/main.tcl��������������������������������������������������������������������0000644�0000000�0000000�00000002523�14777013213�0016624�0����������������������������������������������������������������������������������������������������ustar�00nobody��������������������������nobody�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# main.tcl --
      #
      #       Sample startup file for the Tkabber starkit.
      #       See README for details.
      
      # See: http://wiki.tcl.tk/8186
      package require starkit
      if {[string equal [starkit::startup] sourced]} return
      
      # Linux tclkits don't load Tk themselves:
      package require Tk
      
      proc starkit_init {args} {
          global configdir toolkit_version
          variable starkit::topdir
      
          # Prevent bogus zlib package from confusing Tkabber
          # (stream compression doesn't work in starkits using vanilla Tkabber):
          package forget zlib
      
          append toolkit_version " (starkit)"
      
          set spath $configdir
          if {[info exists topdir]} {
              lappend spath [file dirname $topdir]
          }
      
          # Preserve the value of ::starkit::topdir before loading
          # another starkits, see: http://wiki.tcl.tk/8186
          set top $topdir
      
          set log ""
          foreach dir $spath {
              foreach kit [glob -type f -dir $dir -nocomplain *.kit] {
                  set failed [catch { source $kit } err]
                  if {$failed} {
                      append log "\nFile: $kit\nError: $err"
                  }
              }
          }
      
          set topdir $top
      
          if {$log != ""} {
              tk_messageBox -icon error -title "Startup problem" \
                            -message "Failed to load some .kit files:\n$log"
          }
      }
      
      source [file join [file dirname [info script]] tkabber tkabber.tcl]
      
      # vim:ft=tcl:ts=8:sw=4:sts=4:et
      �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������tkabber/custom.tcl����������������������������������������������������������������������������������0000644�0000000�0000000�00000067032�14777013213�0014077�0����������������������������������������������������������������������������������������������������ustar�00nobody��������������������������nobody�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# custom.tcl --
      #
      #       This file is a part of the Tkabber XMPP client. It implements the
      #       customization interface and infrastructure.
      
      if {$::darktheme} {
          option add *Customize.varforeground       cornflowerblue widgetDefault
          option add *Customize.groupnameforeground cornflowerblue widgetDefault
      } else {
          option add *Customize.varforeground       dodgerblue4 widgetDefault
          option add *Customize.groupnameforeground dodgerblue4 widgetDefault
      }
      
      namespace eval custom {
          variable options
      
          # Filename for saving options
          set options(customfile) [file join $::configdir custom.tcl]
      
          # -1: stored values haven't been restored yet (only config changes vars)
          # 0: stored values are being restored now
          # 1: stored values have been restored (changes may be stored)
          variable custom_loaded -1
      }
      
      proc custom::defgroup {id doc args} {
          variable group
      
          if {![info exists group(members,$id)]} {
              set group(members,$id) {}
          }
          if {![info exists group(subgroups,$id)]} {
              set group(subgroups,$id) {}
          }
          set group(doc,$id) $doc
          set group(tag,$id) $id
          if {![info exists group(parents,$id)]} {
              set group(parents,$id) {}
          }
      
          foreach {attr val} $args {
              switch -- $attr {
                  -tag {set group(tag,$id) $val}
                  -group {
                      lappend group(subgroups,$val) [list group $id]
                      set group(subgroups,$val) \
                          [lsort -unique $group(subgroups,$val)]
                      lappend group(parents,$id) $val
                      set group(parents,$id) [lsort -unique $group(parents,$id)]
                  }
                  -type {
                      set group(type,$id) $val
                  }
              }
          }
      }
      
      
      proc custom::defvar {vname value doc args} {
          variable var
          variable group
      
          set fullname [uplevel 1 {namespace current}]::$vname
      
          if {[info exists $fullname]} {
              set v [set $fullname]
      
              if {![info exists var(default,$fullname)]} {
                  set var(config,$fullname) $v
              }
      
              # Removing any existing trace
              unset $fullname
              set $fullname $v
          } else {
              set $fullname $value
          }
      
          trace add variable $fullname write \
                [list [namespace current]::on_var_change $fullname]
      
          set var(default,$fullname) $value
          set var(doc,$fullname) $doc
          set var(type,$fullname) string
          set var(state,$fullname) ""
      
          eval { configvar $fullname } $args
      }
      
      proc custom::on_var_change {varname args} {
          variable options
          variable var
          variable custom_loaded
      
          switch -- $custom_loaded {
              -1 {
                  set var(config,$varname) [set $varname]
              }
              0 { }
              1 {
                  # Store variable if it has been changed by
                  # any procedure which is not in ::custom namespace
                  if {[namespace qualifiers [caller]] != [namespace current]} {
                      # Don't store loginconf here
                      # (storing all loginconf except password may be
                      # confusing)
                      if {![regexp {^(::)+loginconf\(.*\)} $varname]} {
                          store_vars $varname
                      }
                  }
              }
          }
      }
      
      proc custom::add_radio_options {vname values} {
          variable var
      
          set fullname [uplevel 1 {namespace current}]::$vname
      
          if {![info exists $fullname]} {
              return
          }
      
          set var(values,$fullname) [concat $var(values,$fullname) $values]
      }
      
      proc custom::configvar {fullname args} {
          variable var
          variable group
      
          if {![info exists $fullname]} {
              error "No such variable: $fullname"
          }
      
          foreach {attr val} $args {
              switch -- $attr {
                  -type {
                      set var(type,$fullname) $val
                  }
                  -group {
                      if {![info exists group(members,$val)]} {
                          set group(members,$val) {}
                      }
                      if {[list var $fullname] ni $group(members,$val)} {
                          lappend group(members,$val) [list var $fullname]
                      }
                  }
                  -values {
                      set var(values,$fullname) $val
                  }
                  -layout {
                      set var(layout,$fullname) $val
                  }
              }
          }
      
          switch -- $var(type,$fullname) {
              radio {
                  set q 0
                  foreach {v d} $var(values,$fullname) {
                      if {$v == [set $fullname]} {
                          set q 1
                      }
                  }
                  if {!$q} {
                      set $fullname $var(default,$fullname)
                  }
              }
          }
      
          foreach {attr val} $args {
              switch -- $attr {
                  -command {
                      trace add variable $fullname write $val
                  }
              }
          }
      }
      
      custom::defgroup Tkabber \
          [::msgcat::mc "Customization of the One True Jabber Client."]
      
      custom::defgroup Hidden "Hidden group" -group Tkabber -tag "Hidden group" \
          -type hidden
      
      ###############################################################################
      
      proc custom::open_window {gid} {
          set w .customize
          if {[winfo exists $w]} {
              raise_win $w
              goto $gid
              focus [Wrapped $w.fields]
              return
          }
      
          add_win $w -title [::msgcat::mc "Customize"] \
              -tabtitle [::msgcat::mc "Customize"] \
              -class Customize \
              -raise 1 \
              -raisecmd {focus [Wrapped .customize.fields]}
      
      
          set sw [ScrolledWindow $w.sw]
          if {[catch {$w cget -background} bg]} {
              set bg [ttk::style configure . -background]
          }
          set t [Text $w.fields -wrap word -takefocus 1]
          $t configure -background $bg
          $sw setwidget $t
      
      
          Frame $w.navigate
          Button $w.navigate.back -text <- \
              -width 3 \
              -command [list [namespace current]::history_move 1]
          Button $w.navigate.forward -text -> \
              -width 3 \
              -command [list [namespace current]::history_move -1]
          Button $w.navigate.toplevel -text Tkabber \
              -command [list [namespace current]::goto Tkabber]
          Label $w.navigate.lab -text [::msgcat::mc "Group:"]
          Entry $w.navigate.entry -textvariable [namespace current]::curgroup \
              -command [list [namespace current]::go]
          Button $w.navigate.browse -text [::msgcat::mc "Open"] \
              -command [list [namespace current]::go]
      
          pack $w.navigate.back $w.navigate.forward \
              $w.navigate.toplevel $w.navigate.lab -side left
          pack $w.navigate.entry -side left -expand yes -fill x
          pack $w.navigate.browse -side left
          pack $w.navigate -side top -fill x
      
      
          pack $sw -side top -fill both -expand yes
      
      
          $t tag configure var -underline no \
              -foreground [option get $w varforeground Customize]
          $t tag configure groupname -underline no \
              -foreground [option get $w groupnameforeground Customize]
      
          bind [Wrapped $t] <Key-Down> [list %W yview scroll 1 unit]
          bind [Wrapped $t] <Key-Up> [list %W yview scroll -1 unit]
          bind [Wrapped $t] <Key-Next> [list %W yview scroll 1 page]
          bind [Wrapped $t] <Key-Prior> [list %W yview scroll -1 page]
          bind [Wrapped $t] <1> [list focus %W]
      
          variable history
          set history(pos) 0
          set history(list) {}
      
          variable curgroup $gid
      
          hook::run open_custom_post_hook $w
      
          update idletasks
          goto $gid
      
          focus [Wrapped $t]
      }
      
      proc custom::go {} {
          variable curgroup
          goto $curgroup
      }
      
      proc custom::goto {gid} {
          history_add $gid
          fill_group .customize.fields $gid 0
      }
      
      proc custom::fill_group {t gid offset} {
          variable group
          variable var
          variable curgroup
      
          set curgroup $gid
      
          $t configure -state normal
      
          $t delete 1.0 end
      
          if {![info exists group(members,$gid)]} {
              $t configure -state disabled
              return
          }
      
          set i 0
      
          if {[info exists group(parents,$gid)] && $group(parents,$gid) != {}} {
              foreach parent $group(parents,$gid) {
                  set b [Button $t.gr$i -text $group(tag,$parent) \
                             -cursor left_ptr \
                             -command [list [namespace current]::goto $parent]]
                  $t window create end -window $b
                  $t insert end " "
                  bindscroll $b $t
      
                  incr i
              }
              if {[llength $group(parents,$gid)] == 1} {
                  $t insert end [::msgcat::mc "Parent group"]
              } else {
                  $t insert end [::msgcat::mc "Parent groups"]
              }
              $t insert end "\n\n"
          }
      
          set butwidth 0
          foreach member [concat $group(members,$gid) \
                              [lsort -dictionary -index 1 $group(subgroups,$gid)]] {
              lassign $member type data
              switch -- $type {
                  group {
                      if {[info exists group(type,$data)] &&
                                  $group(type,$data) eq "hidden"} {
                          continue
                      }
                      $t insert end "\n"
                      set b [Button $t.gr$i -text "$group(tag,$data)" \
                                 -width $butwidth \
                                 -cursor left_ptr \
                                 -command [list [namespace current]::goto $data]]
                      $t window create end -window $b
                      if {$butwidth < [string length "$group(tag,$data)"]} {
                          set butwidth [string length "$group(tag,$data)"]
                          for {set j 0} {$j <= $i} {incr j} {
                              if {[winfo exists $t.gr$j]} {
                                  $t.gr$j configure -width $butwidth
                              }
                          }
                      }
                      bindscroll $b $t
      
                      $t insert end " $group(doc,$data)"
      
                      bindtags $b [lreplace [bindtags $b] 1 0 $t]
      
                      $t insert end "\n"
                  }
                  var {
                      $t insert end $data var ": "
      
                      fill_var $t $data $i
      
                      $t insert end "\n"
      
                  }
              }
              incr i
          }
      
          $t configure -state disabled
          $t yview moveto $offset
      }
      
      proc custom::fill_var {t varname idx} {
          variable var
          variable tmp
      
          switch -- $var(type,$varname) {
              string {
                  catch {unset tmp($varname)}
                  trace add variable [namespace current]::tmp($varname) write \
                      [list [namespace current]::on_edit $varname]
                  set tmp($varname) [set $varname]
                  set e [Entry $t.entry$idx \
                             -textvariable [namespace current]::tmp($varname)]
                  $t window create end -window $e
                  bindscroll $e $t
                  $t insert end "\n"
              }
      
              password {
                  catch {unset tmp($varname)}
                  trace add variable [namespace current]::tmp($varname) write \
                      [list [namespace current]::on_edit $varname]
                  set tmp($varname) [set $varname]
                  set e [Entry $t.entry$idx -show * \
                             -textvariable [namespace current]::tmp($varname)]
                  $t window create end -window $e
                  bindscroll $e $t
                  $t insert end "\n"
              }
      
              boolean {
                  catch {unset tmp($varname)}
                  trace add variable [namespace current]::tmp($varname) write \
                      [list [namespace current]::on_edit $varname]
                  set tmp($varname) [set $varname]
                  set cb [Checkbutton $t.cb$idx -cursor left_ptr \
                              -variable [namespace current]::tmp($varname)]
                  $t window create end -window $cb
                  bindscroll $cb $t
                  $t insert end "\n"
              }
      
              integer {
                  catch {unset tmp($varname)}
                  trace add variable [namespace current]::tmp($varname) write \
                      [list [namespace current]::on_edit $varname]
                  set tmp($varname) [set $varname]
                  set e [Spinbox $t.spin$idx -1000000000 1000000000 1 \
                                 [namespace current]::tmp($varname)]
                  $t window create end -window $e
                  bindscroll $e $t
                  $t insert end "\n"
              }
      
              options {
                  catch {unset tmp($varname)}
                  catch {unset var(temp,$varname)}
                  trace add variable [namespace current]::tmp($varname) write \
                      [list [namespace current]::on_edit $varname]
                  trace add variable [namespace current]::var(temp,$varname) write \
                      [list [namespace current]::on_change $t $varname]
                  set var(temp,$varname) [set $varname]
                  set tmp($varname) [set $varname]
                  set options {}
                  foreach {val text} $var(values,$varname) {
                      lappend options $text
                  }
                  set opt [eval [list OptionMenu $t.opt$idx \
                                      [namespace current]::var(temp,$varname)] \
                                $options]
                  $t.opt$idx configure -cursor left_ptr
                  $t window create end -window $t.opt$idx
                  bindscroll $t.opt$idx $t
                  $t insert end "\n"
              }
      
              list {
                  if {![info exists var(values,$varname)]} return
      
                  catch {unset tmp($varname)}
                  trace add variable [namespace current]::tmp($varname) write \
                      [list [namespace current]::on_edit $varname]
                  set tmp($varname) [set $varname]
                  set fr [frame $t.fr$idx -cursor left_ptr]
                  trace add variable [namespace current]::tmp($varname) write \
                      [list [namespace current]::on_change $fr.lb $varname]
                  set sw [ScrolledWindow $fr.sw]
                  set lb [Listbox $fr.lb -cursor left_ptr \
                              -selectmode extended -height 3 -exportselection false]
                  eval [list $lb] insert end $var(values,$varname)
                  $sw setwidget $lb
                  pack $sw
                  foreach i $tmp($varname) {
                      $lb selection set $i
                  }
                  bind $lb <<ListboxSelect>> \
                      [double% "set [namespace current]::tmp($varname) \
                                \[$lb curselection\]"]
                  $t window create end -window $fr -align top
                  $t insert end "\n"
              }
      
              radio {
                  catch {unset tmp($varname)}
                  trace add variable [namespace current]::tmp($varname) write \
                      [list [namespace current]::on_edit $varname]
                  set tmp($varname) [set $varname]
                  if {[info exists var(layout,$varname)] && \
                              [string first v $var(layout,$varname)] == 0} {
                      set anchor w
                      set side top
                  } else {
                      set anchor n
                      set side left
                  }
                  set fr [Frame $t.fr$idx -cursor left_ptr]
                  set i 0
                  foreach {val displ} $var(values,$varname) {
                      set rb [Radiobutton $fr.rb$i -cursor left_ptr \
                                  -text $displ -value $val \
                                  -variable [namespace current]::tmp($varname)]
                      pack $rb -anchor $anchor -side $side
                      bindscroll $rb $t
                      incr i
                  }
                  $t window create end -window $fr -align top
                  bindscroll $fr $t
                  $t insert end "\n"
              }
      
              font {
                  catch {unset tmp($varname)}
                  trace add variable [namespace current]::tmp($varname) write \
                      [list [namespace current]::on_edit $varname]
                  set tmp($varname) [set $varname]
                  set fr [Frame $t.fr$idx -cursor left_ptr]
                  trace add variable [namespace current]::tmp($varname) write \
                      [list [namespace current]::on_change $fr.selectfont $varname]
                  set sf [SelectFont $fr.selectfont -type toolbar \
                              -font $tmp($varname) \
                              -command [list [namespace current]::on_set_font \
                                            $fr.selectfont $varname]]
                  pack $sf
                  bindscroll $sf $t
                  $t window create end -window $fr
                  bindscroll $fr $t
                  $t insert end "\n"
              }
      
              file {
                  catch {unset tmp($varname)}
                  trace add variable [namespace current]::tmp($varname) write \
                      [list [namespace current]::on_edit $varname]
                  set tmp($varname) [set $varname]
                  set e [Entry $t.entry$idx -width 30 \
                             -textvariable [namespace current]::tmp($varname)]
                  set browse \
                      [Button $t.browse$idx -text [::msgcat::mc "Browse..."] \
                           -cursor left_ptr \
                           -command [list [namespace current]::get_filename \
                                          $varname]]
                  $t window create end -window $e
                  $t window create end -window $browse
                  bindscroll $e $t
                  bindscroll $browse $t
                  $t insert end "\n"
              }
      
              default {
                  $t insert end "\n"
              }
          }
      
          set b [Menubutton $t.stb$idx -text [::msgcat::mc "State"] \
                     -cursor left_ptr \
                     -menu $t.stb$idx.statemenu]
          create_state_menu $b.statemenu $varname
          $t window create end -window $b
          bindscroll $b $t
          set l [Label $t.stl$idx \
                     -textvariable [namespace current]::var(state,$varname)]
          $t insert end " "
          $t window create end -window $l
          bindscroll $l $t
          $t insert end "\n"
      
          $t insert end "$var(doc,$varname)\n"
      }
      
      proc custom::get_filename {varname} {
          variable tmp
      
          set args {}
          if {$tmp($varname) == ""} {
              lappend args -initialdir $::configdir
          } else {
              lappend args -initialdir [file dirname $tmp($varname)] \
                  -initialfile [file tail $tmp($varname)]
          }
          set filename [eval tk_getOpenFile $args]
          if {$filename != ""} {
              set tmp($varname) $filename
          }
      }
      
      proc custom::on_change {w varname args} {
          variable var
          variable tmp
      
          if {![winfo exists $w]} {
              return
          }
      
          switch -- $var(type,$varname) {
              font {
                  $w configure -font $tmp($varname)
              }
              list {
                  $w selection clear 0 end
                  foreach i $tmp($varname) {
                      $w selection set $i
                  }
              }
              options {
                  foreach {val text} $var(values,$varname) {
                      if {$text == $var(temp,$varname) && \
                              (![info exists tmp($varname)] || \
                               $tmp($varname) != $val)} {
                          set tmp($varname) $val
                          break
                      }
                  }
              }
          }
      }
      
      proc custom::on_set_font {sf varname} {
          variable tmp
      
          set tmp($varname) [$sf cget -font]
      }
      
      proc custom::on_edit {varname args} {
          variable var
          variable tmp
          variable saved
      
          switch -- $var(type,$varname) {
              options {
                  foreach {val text} $var(values,$varname) {
                      if {$tmp($varname) == $val && \
                              (![info exists var(temp,$varname)] || \
                               $var(temp,$varname) != $text)} {
                          set var(temp,$varname) $text
                          break
                      }
                  }
              }
          }
      
          set is_default [string equal [set $varname] $var(default,$varname)]
          if {[info exists var(config,$varname)]} {
              set is_config [string equal [set $varname] $var(config,$varname)]
          } else {
              set is_config -1
          }
          set is_current [string equal [set $varname] $tmp($varname)]
          if {[info exists saved($varname)]} {
              set is_saved [string equal [set $varname] $saved($varname)]
          } else {
              set is_saved -1
          }
      
          if {!$is_current} {
              set st [::msgcat::mc "value is changed, but the option is not set."]
          } else {
              switch -glob -- $is_default,$is_config,$is_saved {
                  0,0,1 -
                  0,-1,1 {
                      set st [::msgcat::mc "the option is set and saved."]
                  }
                  *,*,0 -
                  0,0,-1 -
                  0,-1,-1 {
                      set st [::msgcat::mc "the option is set, but not saved."]
                  }
                  *,1,* {
                      set st [::msgcat::mc "the option is taken from config file."]
                  }
                  1,*,* {
                      set st [::msgcat::mc "the option is set to its default value."]
                  }
              }
          }
      
          set var(state,$varname) $st
      }
      
      
      proc custom::create_state_menu {m varname} {
          variable var
          variable saved
      
          if {[winfo exists $m]} {
              destroy $m
          }
      
          menu $m -tearoff 0
          $m add command -label [::msgcat::mc "Set for current session only"] \
              -command [list [namespace current]::set_for_current_sess $varname]
          $m add command \
              -label [::msgcat::mc "Set for current and future sessions"] \
              -command [list [namespace current]::save_var $varname]
          $m add command -label [::msgcat::mc "Reset to current value"] \
              -command [list [namespace current]::reset_to_current $varname]
          $m add command -label [::msgcat::mc "Reset to saved value"] \
              -command [list [namespace current]::reset_to_saved $varname] \
              -state [expr {[info exists saved($varname)] ? "normal" : "disabled"}]
          $m add command -label [::msgcat::mc "Reset to value from config file"] \
              -command [list [namespace current]::reset_to_config $varname] \
              -state \
                  [expr {[info exists var(config,$varname)] ? "normal" : "disabled"}]
          $m add command -label [::msgcat::mc "Reset to default value"] \
              -command [list [namespace current]::reset_to_default $varname]
      
          return $m
      }
      
      proc custom::set_for_current_sess {varname} {
          variable var
          variable tmp
          variable saved
      
          set $varname $tmp($varname)
      
          on_edit $varname
      }
      
      proc custom::reset_to_current {varname} {
          variable var
          variable tmp
          variable saved
      
          set tmp($varname) [set $varname]
      
          on_edit $varname
      }
      
      proc custom::reset_to_saved {varname} {
          variable var
          variable tmp
          variable saved
      
          if {![info exists saved($varname)]} return
      
          set tmp($varname) $saved($varname)
          set $varname $saved($varname)
      
          on_edit $varname
      }
      
      proc custom::reset_to_config {varname} {
          variable var
          variable tmp
          variable saved
      
          if {![info exists var(config,$varname)]} return
      
          set tmp($varname) $var(config,$varname)
          set $varname $var(config,$varname)
      
          on_edit $varname
      }
      
      proc custom::reset_to_default {varname} {
          variable var
          variable tmp
          variable saved
      
          set tmp($varname) $var(default,$varname)
          set $varname $var(default,$varname)
      
          on_edit $varname
      }
      
      proc custom::save_var {varname} {
          variable var
          variable tmp
          variable saved
      
          set saved($varname) $tmp($varname)
          set $varname $tmp($varname)
      
          store
      
          on_edit $varname
      }
      
      proc custom::store {} {
          variable var
          variable saved
          variable options
      
          lassign [TempFile] tempfile fd
          fconfigure $fd -encoding utf-8
      
          foreach varname [array names saved] {
              if {[info exists var(config,$varname)]} {
                  if {$saved($varname) != $var(config,$varname)} {
                      puts $fd [list [list $varname $saved($varname)]]
                  }
              } else {
                  if {![info exists var(default,$varname)] || \
                          $saved($varname) != $var(default,$varname)} {
                      puts $fd [list [list $varname $saved($varname)]]
                  }
              }
          }
      
          close $fd
          catch {file attributes $tempfile -permissions 00600}
          file rename -force $tempfile $options(customfile)
      }
      
      proc ::custom::TempFile {} {
          set maxtries 10
          set access [list RDWR CREAT EXCL TRUNC]
          set permission 0600
          set fd ""
      
          for {set i 0} {$i < $maxtries} {incr i} {
              set newname [file join $::configdir custom[rand 1000000000]]
      
              if {![file exists $newname]} {
                  if {![catch {open $newname $access $permission} fd]} {
                      fconfigure $fd -translation binary
                      return [list $newname $fd]
                  }
              }
          }
          if {$fd == ""} {
              return -code error \
                     "failed to find an unused temporary file name"
          } else {
              return -code error \
                     [format "failed to open a temporary file: %s" $fd]
          }
      }
      
      proc custom::store_vars {args} {
          variable saved
      
          foreach varname $args {
              set saved($varname) [set $varname]
          }
      
          store
      }
      
      proc custom::restore {} {
          variable var
          variable saved
          variable options
          variable custom_loaded
      
          set custom_loaded 0
      
          if {[file readable $options(customfile)]} {
              set fd [open $options(customfile) r]
              fconfigure $fd -encoding utf-8
      
              set opts [read $fd]
              close $fd
      
              foreach opt $opts {
                  lassign $opt varname value
      
                  # HACK: ::plugins::loaded(*) variables must be processed first
                  if {[string match ::plugins::loaded(*) $varname]} {
                      set saved($varname) $value
                      catch {set $varname $value}
                  }
              }
      
              foreach opt $opts {
                  lassign $opt varname value
      
                  # HACK: matching variables other than ::plugins::loaded(*)
                  # TODO: What to do with variables which namespace isn't created?
                  if {![string match ::plugins::loaded(*) $varname]} {
                      set saved($varname) $value
                      catch {set $varname $value}
                  }
              }
          }
      
          foreach idx [array names var default,*] {
              set varname [string range $idx 8 end]
      
              if {![info exists saved($varname)]} {
                  # We have to trigger commands bound to the variable
                  # if it was set in config or as default
                  catch {set $varname [set $varname]}
              }
          }
      
          set custom_loaded 1
      }
      
      hook::add postload_hook custom::restore 60
      
      
      proc custom::update_page_offset {} {
          variable history
      
          if {[llength $history(list)] == 0} return
      
          lassign [.customize.fields yview] offset
          lassign [lindex $history(list) $history(pos)] page
      
          set history(list) [lreplace $history(list) $history(pos) $history(pos) \
                                      [list $page $offset]]
      }
      
      proc custom::history_move {shift} {
          variable history
          variable curgroup
      
          set newpos [expr {$history(pos) + $shift}]
      
          if {$newpos < 0} {
              return
          }
      
          if {$newpos >= [llength $history(list)]} {
              return
          }
      
          update_page_offset
      
          lassign [lindex $history(list) $newpos] newgroup offset
          set history(pos) $newpos
          history_set_buttons
      
          set curgroup $newgroup
      
          fill_group .customize.fields $newgroup $offset
      }
      
      
      proc custom::history_add {gid} {
          variable history
      
          update_page_offset
      
          set history(list) [lreplace $history(list) 0 [expr {$history(pos) - 1}]]
      
          set history(list) [linsert $history(list) 0 [list $gid 0]]
          set history(pos) 0
          history_set_buttons
      
          debugmsg custom [array get history]
      }
      
      proc custom::history_set_buttons {} {
          variable history
      
          if {$history(pos) == 0} {
              .customize.navigate.forward configure -state disabled
          } else {
              .customize.navigate.forward configure -state normal
          }
      
          if {$history(pos) + 1 == [llength $history(list)]} {
              .customize.navigate.back configure -state disabled
          } else {
              .customize.navigate.back configure -state normal
          }
      }
      
      ##############################################################################
      
      proc custom::restore_window {gid args} {
          open_window $gid
      }
      
      proc custom::save_session {vsession} {
          upvar 2 $vsession session
          global usetabbar
          variable history
      
          # We don't need JID at all, so make it empty (special case)
          set user     ""
          set server   ""
          set resource ""
      
          # TODO
          if {!$usetabbar} return
      
          set prio 0
          foreach page [.nb pages] {
              set path [ifacetk::nbpath $page]
      
              if {[string equal $path .customize]} {
                  lassign [lindex $history(list) $history(pos)] gid
                  lappend session [list $prio $user $server $resource \
                      [list [namespace current]::restore_window $gid] \
                  ]
              }
              incr prio
          }
      }
      
      hook::add save_session_hook [namespace current]::custom::save_session
      
      # vim:ft=tcl:ts=8:sw=4:sts=4:et
      ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������tkabber/datagathering.tcl���������������������������������������������������������������������������0000644�0000000�0000000�00000040537�14777013213�0015370�0����������������������������������������������������������������������������������������������������ustar�00nobody��������������������������nobody�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# datagathering.tcl --
      #
      #       This file is a part of the Tkabber XMPP client. It implements the
      #       user interface part for Data Forms (XEP-0004) support.
      
      package require xmpp::data
      
      namespace eval data {
          disco::register_feature jabber:x:data
      }
      
      proc data::fill_fields {g items} {
          variable data
      
          lassign [::xmpp::data::findForm $items] type form
      
          if {[string equal $type form]} {
              set data(x,$g) 1
              set fields [::xmpp::data::parseForm $form]
          } else {
              set fields [parse_fields $items]
          }
      
          return [fill_fields_x $g $fields]
      }
      
      
      proc data::parse_fields {items} {
          set res {}
          foreach item $items {
              ::xmpp::xml::split $item tag xmlns attrs cdata subels
      
              switch -- $tag {
                  instructions {
                      set res [linsert $res 0 instructions $cdata]
                  }
                  x {}
                  default {
                      switch -- $tag {
                          key -
                          registered {set type hidden}
                          password   {set type text-private}
                          default    {set type text-single}
                      }
      
                      lappend res field \
                              [list $tag $type "" "" false {} [list $cdata] {}]
                  }
              }
          }
      
          return $res
      }
      
      proc data::cleanup {g} {
          variable data
      
          array unset data *,$g
      }
      
      proc data::get_tags {g} {
          variable data
      
          if {[info exists data(x,$g)]} {
              return [get_tags_x $g]
          }
      
          set restags {}
      
          if {[info exists data(varlist,$g)]} {
              foreach var $data(varlist,$g) {
                  lappend restags [::xmpp::xml::create $var \
                                              -cdata $data(var,$var,$g)]
              }
          }
      
          return $restags
      }
      
      proc data::get_fields {g} {
          variable data
      
          set res {}
      
          if {[info exists data(varlist,$g)]} {
              foreach var $data(varlist,$g) {
                  if {[info exists data(multi,$var,$g)]} {
                      lappend res $var $data(var,$var,$g)
                  } elseif {[info exists data(text,$var,$g)]} {
                      set data(var,$var,$g) [$data(text,$var,$g) get 1.0 "end -1c"]
                      lappend res $var [split $data(var,$var,$g) \n]
                  } else {
                      lappend res $var [list $data(var,$var,$g)]
                  }
              }
          }
      
          return $res
      }
      
      proc data::add_label {g row label {required 0}} {
          if {$label != ""} {
              if {$required} {
                  set prefix *
              } else {
                  set prefix ""
              }
              if {![string is punct [string index $label end]]} {
                  set suffix :
              } else {
                  set suffix ""
              }
              Label $g.label$row -text ${prefix}${label}$suffix
              grid $g.label$row -row $row -column 0 -sticky en
          }
      }
      
      proc data::render_media {g row media_list} {
          foreach item $media_list {
              set unsupported 1
              foreach {type uri} $item {
                  if {[string first cid: $uri] == 0} {
                      set cid [string range $uri 4 end]
                      switch -glob -- $type {
                          image/* {
                              # TODO: Request BOB data if it isn't present
                              set tdata [::xmpp::bob::get $cid]
                              if {[llength $tdata] < 2} {
                                  continue
                              }
                              lassign $tdata type data
                              if {![catch {image create photo -data $data} img]} {
                                  Label $g.mediaimg$row -image $img
                                  bind $g.mediaimg$row <Destroy> \
                                          [list image delete [double% $img]]
                                  grid $g.mediaimg$row -row $row -column 1 -sticky ew
                                  set unsupported 0
                                  incr row
                              }
                          }
                          default {
                              # TODO
                          }
                      }
                  } else {
                      render_url $g.mediauri$row $uri $uri \
                                 -background [get_conf $g -background]
                      grid $g.mediauri$row -row $row -column 1 -sticky ew
                      set unsupported 0
                      incr row
                  }
              }
              if {$unsupported} {
                  # No supported media item
                  return -code error "No supported types for a media element"
              }
          }
          return $row
      }
      
      proc data::fill_fields_x {g items} {
          variable data
      
          set row 0
          set data(varlist,$g) {}
          set data(allvarlist,$g) {}
          set focus ""
      
          grid columnconfig $g 1 -weight 1 -minsize 0
      
          foreach {tag item} $items {
              switch -- $tag {
                  instructions {
                      Message $g.instructions$row -text $item -width 15c
                      grid $g.instructions$row -row $row -column 0 \
                          -columnspan 2 -sticky w -pady 2m
                      incr row
                  }
                  title {
                      set top [winfo toplevel $g]
                      if {$top != "."} {
                          wm title $top $item
                          wm iconname $top $item
                      }
                  }
                  field {
                      set widget [fill_field_x $g $row $item]
                      if {$focus == ""} {
                          set focus $widget
                      }
                      incr row
                  }
                  default {
                      debugmsg filetransfer "XDATA: unknown tag $tag"
                  }
              }
          }
      
          # FIX THIS
          set data(varlist,$g) $data(allvarlist,$g)
      
          return $focus
      }
      
      
      proc data::fill_field_x {g row item} {
          variable data
      
          lassign $item var type label desc required options vals media_list
      
          if {$type == ""} {
              set type text-single
          }
          if {$label == ""} {
              set label $var
          }
          set data(var,$var,$g) [lindex $vals 0]
          set widget ""
      
          switch -- $type {
              jid-single -
              text-single -
              text-private {
                  add_label $g $row $label $required
                  set row [render_media $g $row $media_list]
                  Entry $g.entry$row \
                      -textvariable [namespace current]::data(var,$var,$g)
                  if {$type == "text-private"} {
                      $g.entry$row configure -show *
                  }
                  grid $g.entry$row  -row $row -column 1 -sticky we
                  set widget $g.entry$row
                  if {$desc != ""} {
                      balloon::setup $g.entry$row -text $desc
                  }
              }
              jid-multi -
              text-multi {
                  add_label $g $row $label $required
                  set row [render_media $g $row $media_list]
                  set sw [ScrolledWindow $g.textsw$row -scrollbar vertical]
                  textUndoable $g.text$row -height 6 -width 50
                  $sw setwidget $g.text$row
                  bind $g.text$row <Control-Key-Return> { }
                  bind $g.text$row <Return> "[bind Text <Return>]\nbreak"
                  set data(var,$var,$g) [join $vals \n]
                  $g.text$row insert end $data(var,$var,$g)
                  grid $sw -row $row -column 1 -sticky we
                  set data(text,$var,$g) $g.text$row
                  set widget $g.text$row
                  if {$desc != ""} {
                      balloon::setup $g.text$row -text $desc
                  }
              }
              boolean {
                  switch -- $data(var,$var,$g) {
                      1 -
                      0 {
                          set onvalue 1
                          set offvalue 0
                      }
                      true -
                      false {
                          set onvalue true
                          set offvalue false
                      }
                      default {
                          set onvalue 1
                          set offvalue 0
                          set data(var,$var,$g) 0
                      }
                  }
                  add_label $g $row $label $required
                  set row [render_media $g $row $media_list]
                  Checkbutton $g.cb$row \
                      -variable [namespace current]::data(var,$var,$g) \
                      -onvalue $onvalue -offvalue $offvalue
                  grid $g.cb$row  -row $row -column 1 -sticky w
                  set widget $g.cb$row
                  if {$desc != ""} {
                      balloon::setup $g.cb$row -text $desc
                  }
              }
              fixed {
                  add_label $g $row $label $required
                  set row [render_media $g $row $media_list]
                  Message $g.m$row -text [join $vals \n] -width 10c
                  grid $g.m$row -row $row -column 1 -sticky w
                  set dont_report 1
                  if {$desc != ""} {
                      balloon::setup $g.m$row -text $desc
                  }
              }
              list-single {
                  add_label $g $row $label $required
                  set row [render_media $g $row $media_list]
                  set height 0
                  set data(combol$row,$var,$g) {}
                  foreach {lab val} $options {
                      lappend data(combol$row,$var,$g) $lab
                      incr height
                      if {[string equal $data(var,$var,$g) $val]} {
                          set data(combov$row,$var,$g) $lab
                      }
                  }
                  if {$height > 10} {
                      set height 10
                  }
                  set cb [Combobox $g.combo$row \
                              -height $height \
                              -editable no \
                              -values $data(combol$row,$var,$g) \
                              -textvariable \
                              [namespace current]::data(combov$row,$var,$g)]
                  grid $cb -row $row -column 1 -sticky we
                  trace add variable [namespace current]::data(combov$row,$var,$g) write \
                      [list data::trace_combo $options \
                           [namespace current]::data(var,$var,$g)]
                  set widget $g.combo$row
                  if {$desc != ""} {
                      balloon::setup $g.combo$row -text $desc
                  }
              }
              list-multi {
                  add_label $g $row $label $required
                  set row [render_media $g $row $media_list]
                  set sw [ScrolledWindow $g.sw$row]
                  set l [Listbox $g.lb$row -height 6 \
                             -selectmode extended -exportselection no]
                  $sw setwidget $l
                  foreach {lab val} $options {
                      $l insert end $lab
                      if {$val in $vals} {
                          $l selection set end
                      }
                  }
                  grid $sw  -row $row -column 1 -sticky we
                  set data(multi,$var,$g) 1
                  trace_listmulti $l $options \
                      ::data::data(var,$var,$g)
                  bind $l <<ListboxSelect>> \
                      [list data::trace_listmulti %W [double% $options] \
                           [double% [namespace current]::data(var,$var,$g)]]
                  set widget $sw
                  if {$desc != ""} {
                      balloon::setup $g.lb$row -text $desc
                  }
              }
              hidden {}
      
              default {
                  debugmsg filetransfer "XDATA: unknown field type '$type'"
              }
          }
      
          if {![info exists dont_report]} {
              lappend data(allvarlist,$g) $var
          }
          return $widget
      }
      
      proc data::trace_combo {assoc dst name1 name2 op} {
          foreach {lab val} $assoc {
              if {[string equal $lab [set ${name1}($name2)]]} {
                  set $dst $val
              }
          }
      }
      
      proc data::trace_listmulti {l assoc dst} {
          set $dst {}
          foreach idx [$l curselection] {
              #debugmsg filetransfer [lindex $assoc [expr $idx * 2 + 1]]
              lappend $dst [lindex $assoc [expr $idx * 2 + 1]]
          }
      }
      
      
      proc data::get_tags_x {g} {
          return [list [::xmpp::data::submitForm [get_fields $g]]]
      }
      
      ###############################################################################
      
      proc data::draw_window {items send_cmd args} {
          variable winid
      
          if {![info exists winid]} {
              set winid 0
          }
      
          set w .datagathering[incr winid]
      
          if {[winfo exists $w]} {
              destroy $w
          }
      
          set cancel_cmd destroy
          set title ""
          foreach {key val} $args {
              switch -- $key {
                  -cancelCommand { set cancel_cmd $val }
                  -title { set title $val }
              }
          }
      
          Toplevel $w -class XData
          wm group $w .
          wm title $w $title
          wm iconname $w $title
          wm transient $w .
          wm withdraw $w
          set geometry [option get $w geometry XData]
          if {$geometry != ""} {
              wm geometry $w $geometry
          }
      
          set sw [ScrolledWindow $w.sw]
          set sf [ScrollableFrame $w.fields -constrainedwidth yes]
          set f [$sf getframe]
          $sf configure -height 10
          $sw setwidget $sf
          if {[catch {data::fill_fields $f $items} focus]} {
              destroy $w
              return -code error $focus
          }
      
          set bbox [ButtonBox $w.bbox -spacing 2m -padx 2m -default 0]
          pack $bbox -side bottom -anchor e -padx 2m -pady 2m
          $bbox add -text [::msgcat::mc "Send"] \
              -command [list eval $send_cmd [list $w] \[data::get_tags $f\]]
          $bbox add -text [::msgcat::mc "Cancel"] \
              -command [list eval $cancel_cmd [list $w]]
          bind $w <Return> [list ButtonBox::invoke [double% $bbox] default]
          bind $w <Escape> [list ButtonBox::invoke [double% $bbox] 1]
          bind $f <Destroy> [list [namespace current]::cleanup %W]
      
          bindscroll $f $sf
      
          set hf [Frame $w.error]
          pack $hf -side top
          set vf [Frame $w.vf]
          pack $vf -side left -pady 2m
          pack $sw -side top -expand yes -fill both -padx 2m -pady 2m
      
          update idletasks
          $hf configure -width [expr {[winfo reqwidth $f] + [winfo pixels $f 1c]}]
      
          set h [winfo reqheight $f]
          set sh [winfo screenheight $w]
          if {$h > $sh - [winfo pixels $f 5c]} {
              set h [expr {$sh - [winfo pixels $f 5c]}]
          }
          $vf configure -height $h
      
          BWidget::place $w 0 0 center
      
          wm deiconify $w
          if {$focus != ""} {
              focus $focus
          }
      
          return $w
      }
      
      proc data::destroy_windows {xlib} {
          foreach w [winfo children .] {
              if {![string match .datagathering* $w]} continue
      
              # HACK: search for $xlib in the send data command for the window
              set cmd [$w.bbox itemcget 0 -command]
              if {[string match "* $xlib *" $cmd]} {
                  destroy $w
              }
          }
      }
      
      hook::add disconnected_hook [namespace current]::data::destroy_windows
      
      ###############################################################################
      
      proc data::request_data {xmlns xlib jid node args} {
          if {$node == ""} {
              set vars {}
          } else {
              set vars [list node $node]
          }
      
          ::xmpp::sendIQ $xlib get \
              -query [::xmpp::xml::create query \
                                          -xmlns $xmlns \
                                          -attrs $vars] \
              -to $jid \
              -command [list [namespace current]::receive_data $xlib $xmlns \
                                                               $jid $node]
      }
      
      proc data::receive_data {xlib xmlns jid node res child} {
          if {[string equal $res abort]} {
              return
          }
      
          if {[string equal $res error]} {
              set ew .data_err
              if {[winfo exists $ew]} {
                  destroy $ew
              }
              MessageDlg $ew -aspect 50000 -icon error \
                  -message [::msgcat::mc "Error requesting data: %s" \
                                         [error_to_string $child]] \
                  -type user -buttons ok -default 0 -cancel 0
              return
          }
      
          ::xmpp::xml::split $child tag xmlns attrs cdata subels
      
          data::draw_window $subels \
              [list [namespace current]::send_data $xlib $xmlns $jid $node] \
              -cancelCommand [list [namespace current]::cancel_data $xlib $xmlns \
                                                                    $jid $node]
      }
      
      proc data::cancel_data {xlib xmlns jid node w} {
          send_data $xlib $xmlns $jid $node $w [list [::xmpp::data::cancelForm]]
      }
      
      proc data::send_data {xlib xmlns jid node w restags} {
          set subels $restags
          set attrs {}
      
          if {$node != ""} {
              lappend attrs node $node
          }
      
          destroy $w.error.msg
          $w.bbox itemconfigure 0 -state disabled
      
          ::xmpp::sendIQ $xlib set \
                  -query [::xmpp::xml::create query \
                                              -xmlns $xmlns \
                                              -attrs $attrs \
                                              -subelements $subels] \
                  -to $jid \
                  -command [list [namespace current]::test_error_res $w]
      }
      
      proc data::test_error_res {w res child} {
          if {![winfo exists $w]} {
              return
          }
      
          if {[string equal $res ok]} {
              destroy $w
              return
          }
      
          $w.bbox itemconfigure 0 -state normal
      
          set m [Message $w.error.msg \
                         -anchor center \
                         -width [winfo width $w.error] \
                         -text [error_to_string $child] \
                         -pady 2m]
          $m configure -foreground [option get $m errorForeground Message]
          pack $m -fill x
      }
      
      # vim:ft=tcl:ts=8:sw=4:sts=4:et
      �����������������������������������������������������������������������������������������������������������������������������������������������������������������tkabber/default.tcl���������������������������������������������������������������������������������0000644�0000000�0000000�00000011144�14777013213�0014202�0����������������������������������������������������������������������������������������������������ustar�00nobody��������������������������nobody�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# default.tcl --
      #
      #       This file is a part of the Tkabber XMPP browser. It defines the default
      #       empty postload and finload procedure and the browseurl procedure which
      #       is called when user clicks on an HTTP link in chatlog windows.
      
      proc postload {} {}
      
      proc menuload {menudesc} { return $menudesc }
      
      proc finload  {} {}
      
      proc browser_loadopt {} {
          custom::defvar webbrowser "" \
              [::msgcat::mc "Command to be run when you click a URL\
                             in a message. '%s' will be replaced with this\
                             URL (e.g. \"chromium %s >>& /dev/null\" or\
                             \"{C:/Program Files (x86)/Mozilla\
                             Firefox/firefox.exe} %s\")."] \
              -group IFace -type string
      }
      
      hook::add postload_hook browser_loadopt
      
      proc browseurl {url} {
          global env tcl_platform
      
          set_status $url
          update idletask
      
          set url [string map {\u0009 %09 \u000a %0a \u000d %0d \u0020 %20
                               \" %22 \' %27 \< %3c \> %3e
                               \{ %7b \| %7c \} %7d \\ %5c} $url]
      
          debugmsg browseurl "Mapped URL: '$url'"
      
          if {[info exists ::webbrowser] && $::webbrowser != ""} {
              # If user specified a browser, use it
              
              set cmd {exec}
              if {[catch {llength $::webbrowser}]} {
                  error "Can't process the \$::webbrowser variable.\
                         It must be a list of words."
              } else {
                  if {$tcl_platform(platform) eq "windows" && \
                          $tcl_platform(os) eq "Windows NT" && \
                          [regexp -nocase {^(.*[\\/])?cmd(\.exe)?$} \
                                          [lindex $::webbrowser 0]]} {
                      set url [string map {& ^&} $url]
                  }
      
                  foreach word $::webbrowser {
                      lappend cmd [format $word $url]
                  }
              }
              lappend cmd &
              eval $cmd
              return
          }
      
          switch -- $tcl_platform(platform) {
              windows {
                  # The windows NT shell treats '&' as a special character. Using
                  # a '^' will escape it. See http://wiki.tcl.tk/557 for more info.
      
                  if {[string compare $tcl_platform(os) "Windows NT"] == 0} {
                      set url [string map {& ^&} $url]
                  }
                  if {[catch {eval exec [auto_execok start] [list $url] &} emsg]} {
                      MessageDlg .browse_err \
                                 -icon error \
                                 -aspect 50000 \
                                 -buttons ok \
                                 -default 0 \
                                 -cancel 0 \
                                 -type user \
                                 -message \
                                      [::msgcat::mc "Error displaying %s in\
                                                     browser\n\n%s" \
                                                    $url $emsg]
                  }
              }
              macintosh {
                  if {[info exists env(BROWSER)]} {
                      set browser $env(BROWSER)
                  } else {
                      set browser "Browse the Internet"
                  }
                  AppleScript execute \
                      "tell application \"$browser\"\nopen url \"$url\"\nend tell\n"
              }
              default {
                  if {[info exists env(BROWSER)]} {
                      set browser $env(BROWSER)
                  } else {
                      foreach b [list xdg-open sensible-browser \
                                      chrome chromium \
                                      firefox mozilla-firefox iceweasel \
                                      mozilla netscape \
                                      opera konqeror] {
                          if {[llength [set e [auto_execok $b]]] > 0} {
                              set browser [lindex $e 0]
                              break
                          }
                      }
                  }
                  if {![info exists browser]} {
                      if {[string equal $tcl_platform(os) Darwin]} {
                          exec open $url &
                      } else {
                          MessageDlg .browse_err \
                                     -icon error \
                                     -aspect 50000 \
                                     -message [::msgcat::mc "Please define\
                                                             environment variable\
                                                             BROWSER"] \
                                     -type user \
                                     -buttons ok \
                                     -default 0 \
                                     -cancel 0
                      }
                  } else {
                      debugmsg browseurl "Browser: '$browser'"
                      exec $browser $url &
                  }
              }
          }
      
          set_status ""
      }
      
      # vim:ft=tcl:ts=8:sw=4:sts=4:et
      ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������tkabber/disco.tcl�����������������������������������������������������������������������������������0000644�0000000�0000000�00000017104�14777013213�0013661�0����������������������������������������������������������������������������������������������������ustar�00nobody��������������������������nobody�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# disco.tcl --
      #
      #       This file is a part of the Tkabber XMPP client. It implements an
      #       interface part for the Service Discovery mechanism (XEP-0030).
      
      package require xmpp::disco
      
      namespace eval disco {
          variable supported_nodes
          variable supported_features {}
          variable root_nodes {}
          variable additional_items
      }
      
      proc disco::new {xlib} {
          variable tokens
      
          if {![info exists tokens($xlib)]} {
              set tokens($xlib) \
                  [::xmpp::disco::new $xlib \
                          -infocommand [namespace code info_query_get_handler] \
                          -itemscommand [namespace code items_query_get_handler]]
          }
      }
      
      ##############################################################################
      
      proc disco::request_items {xlib jid args} {
          variable tokens
      
          set node ""
          set handler {}
          set cache no
      
          foreach {attr val} $args {
              switch -- $attr {
                  -node    {set node $val}
                  -command {set handler $val}
                  -cache   {set cache $val}
              }
          }
      
          ::xmpp::disco::requestItems $tokens($xlib) $jid \
                  -node $node \
                  -cache $cache \
                  -command [namespace code [list parse_items \
                                                 $xlib $jid $node $handler]]
      }
      
      proc disco::parse_items {xlib jid node handler status items} {
          if {![string equal $status ok]} {
              if {$handler != ""} {
                  eval $handler [list status $items]
              }
              hook::run disco_items_hook $xlib $jid $node $status $items
              return
          }
      
          debugmsg disco "ITEMS: [list $items]"
      
          if {$handler != ""} {
              eval $handler [list ok $items]
          }
          hook::run disco_items_hook $xlib $jid $node ok $items
          return
      }
      
      ##############################################################################
      
      proc disco::request_info {xlib jid args} {
          variable tokens
      
          set node ""
          set handler {}
          set cache no
      
          foreach {attr val} $args {
              switch -- $attr {
                  -node    {set node $val}
                  -command {set handler $val}
                  -cache   {set cache $val}
              }
          }
      
          ::xmpp::disco::requestInfo $tokens($xlib) $jid \
                  -node $node \
                  -cache $cache \
                  -command [namespace code [list parse_info \
                                                 $xlib $jid $node $handler]]
      }
      
      proc disco::parse_info {xlib jid node handler status info} {
          variable additional_nodes
      
          if {![string equal $status ok]} {
              if {$handler != ""} {
                  eval $handler [list $status $info {} {}]
              }
              hook::run disco_info_hook $xlib $jid $node $status $info {} {} {}
              return
          }
      
          lassign $info identities features extras
          set featured_nodes {}
      
          foreach feature $features {
              if {($node == "") && [info exists additional_nodes($feature)]} {
                  lappend featured_nodes \
                          [concat [list jid $jid] $additional_nodes($feature)]
              }
          }
      
          set featured_nodes [lsort -unique $featured_nodes]
      
          debugmsg disco \
              "INFO: IDENTITIES [list $identities] FEATURES [list $features]\
               EXTRAS [list $extras] FEATURED NODES [list $featured_nodes]"
      
          if {$handler != ""} {
              eval $handler [list ok $identities $features $extras]
          }
          hook::run disco_info_hook $xlib $jid $node ok $identities $features \
                                    $extras $featured_nodes
          return
      }
      
      ###############################################################################
      
      proc disco::register_featured_node {feature node name} {
          variable additional_nodes
      
          set additional_nodes($feature) [list node $node name $name]
      }
      
      ###############################################################################
      
      proc disco::info_query_get_handler {xlib from node lang} {
          variable supported_nodes
          variable node_handlers
          variable supported_features
          variable feature_handlers
          variable extra_handlers
      
          if {![string equal $node ""]} {
              if {![info exists supported_nodes($node)]} {
                  # Probably temporary node
                  set res {error cancel not-allowed}
                  hook::run disco_node_reply_hook \
                            res info $node $xlib $from $lang
                  return $res
              } else {
                  # Permanent node
                  return [eval $node_handlers($node) \
                               [list info $xlib $from $lang]]
              }
          } else {
              set identities [list [list category client \
                                         type     pc \
                                         name     Tkabber]]
      
              set features [lsort -unique [concat [::xmpp::iq::registered $xlib] \
                                                  $supported_features]]
              set extras {}
      
              if {[info exists extra_handlers]} {
                  foreach h $extra_handlers {
                      set res [eval $h [list $xlib $from $lang]]
                      if {[llength $res] > 0} {
                          lappend extras $res
                      }
                  }
              }
      
              return [list result $identities $features $extras]
          }
      }
      
      ###############################################################################
      
      proc disco::items_query_get_handler {xlib from node lang} {
          variable supported_nodes
          variable node_handlers
          variable root_nodes
      
          if {![string equal $node ""]} {
              if {![info exists supported_nodes($node)]} {
                  # Probably temporary node
                  set res {error cancel not-allowed}
                  hook::run disco_node_reply_hook \
                            res items $node $xlib $from $lang
                  return $res
              } else {
                  # Permanent node
                  return [eval $node_handlers($node) \
                               [list items $xlib $from $lang]]
              }
          } else {
              set items {}
      
              set myjid [my_jid $xlib $from]
      
              foreach node $root_nodes {
                  set item [list jid $myjid]
                  if {![string equal $supported_nodes($node) ""]} {
                      lappend item name \
                              [::trans::trans $lang $supported_nodes($node)]
                  }
                  if {![string equal $node ""]} {
                      lappend item node $node
                  }
                  lappend items $item
              }
      
              return [list result $items]
          }
      }
      
      ###############################################################################
      
      proc disco::register_feature {feature {handler ""}} {
          variable supported_features
          variable feature_handlers
      
          if {[lsearch $supported_features $feature] < 0} {
              lappend supported_features $feature
          }
          set feature_handlers($feature) $handler
      }
      
      ###############################################################################
      
      proc disco::unregister_feature {feature} {
          variable supported_features
          variable feature_handlers
      
          if {[set idx [lsearch $supported_features $feature]] >= 0} {
              set supported_features [lreplace $supported_features $idx $idx]
              unset feature_handlers($feature)
          }
      }
      
      ###############################################################################
      
      proc disco::register_node {node handler {name ""}} {
          variable root_nodes
      
          lappend root_nodes $node
          register_subnode $node $handler $name
      }
      
      ###############################################################################
      
      proc disco::register_subnode {node handler {name ""}} {
          variable supported_nodes
          variable node_handlers
      
          set supported_nodes($node) $name
          set node_handlers($node) $handler
      }
      
      ###############################################################################
      
      proc disco::register_extra {handler} {
          variable extra_handlers
      
          lappend extra_handlers $handler
      }
      
      # vim:ft=tcl:ts=8:sw=4:sts=4:et
      ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������tkabber/doc�����������������������������������������������������������������������������������������0000755�0000000�0000000�00000000000�14777013213�0012537�5����������������������������������������������������������������������������������������������������ustar�00nobody��������������������������nobody�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������tkabber/doc/tkabber.html����������������������������������������������������������������������������0000644�0000000�0000000�00000407041�14777013213�0015124�0����������������������������������������������������������������������������������������������������ustar�00nobody��������������������������nobody�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
      
      <html lang="en" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
      <head profile="http://www.w3.org/2006/03/hcard http://dublincore.org/documents/2008/08/04/dc-html/">
        <meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
      
        <title>Tkabber 1.1.2+
      
        
      
        
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
        
        
      
        
        
        
        
        
      
      
      
      
      
        
      A. Shchepin
      Process-One
      M. Rose
      Dover Beach Consulting, Inc.
      S. Golovan
      New Economic School
      M. Litvak
      Colocall Ltd.
      K. Khomoutov
      Service 007
      March 2015

      Tkabber 1.1.2+

      Abstract

      Tkabber is an open source Jabber client, written in Tcl/Tk. This memo describes the installation, configuration, and extension of Tkabber.


      Table of Contents

      1. Features

      Tkabber provides a Tcl/Tk interface to the Jabber/XMPP instant messaging and presence service.

      Tcl/Tk is a graphical scripting language that runs on the Unix, Windows, and Macintosh platforms. The choice of Tcl/Tk for a Jabber client is three-fold:

      • it is portable: once you install a Tcl/Tk interpreter on your system, the Tkabber script "just runs" — without having to compile anything;
      • it is customizable: Tkabber reads a configuration file when it starts that tells it the settings of various parameters; and,
      • it is extensible: the configuration file is actually a Tcl script, so you can replace or augment entire portions of Tkabber (if you're so inclined).

      Tkabber is fully-featured:

      sessions:
      • TCP, BOSH and HTTP-polling session transports
      • XMPP SRV and TXT DNS-records handling
      • hashed passwords
      • SASL authentication
      • encrypted sessions (if you install an optional extension)
      • compressed sessions (if you install an optional extension)
      • login via SOCKS4a, SOCKS5 or HTTPS proxy
      • IPv6 support (from Tcl/Tk 8.6)
      • user-defined hooks for connection establishment and release
      • XMPP/Jabber MIME type

      messages:
      • privacy rules
      • GPG-signed/encrypted messages (if you install an optional extension)
      • Off-the-record (OTR) messaging
      • file transfers (HTTP, SOCKS bytestream, DTCP and IBB transports)
      • groupchat (GroupChat-1.0 and Multi-User Chat conferencing protocols)
      • headline messages
      • message events
      • completions of nick and commands
      • hyperlinks
      • emoticons
      • user-defined hooks for messages arriving and chat window events
      presence:
      • signed presence (if you install an optional extension)
      • avatars
      • browsing
      • groupchat and roster invitations
      • conference room bookmarks
      • annotations about roster items
      • vCards
      • user-defined hooks for presence changes
      windowing:
      • configurable look-and-feel via a resources database
      • unicode
      • tabbed/non-tabbed interface
      • sound notifications
      • nested roster groups
      • roster metacontacts
      • auto-away
      • for Unix: spell checking, KDE or freedesktop docking, and WMaker icons
      • for Windows: taskbar icons

      2. Requirements

      You should already have installed: tcllib and BWidget are script libraries — no compiling is necessary. In the case of Tcl/Tk, there are many ready-made binary packages available on the download site.

      • Tcl/Tk version 8.5.8 (or later, Tcl/Tk 8.6.3 or later is recommended). Note, that if you want to use Tkabber in IPv6 environment, you'll have to install Tcl/Tk 8.6.
      • tcllib version 1.8 (or later, tcllib 1.16 or later is required for SCRAM SASL mechanism support).
      • BWidget 1.9 (or later)

      Most systems already come with these packages pre-installed. If not, various Unix systems have them available as ready-made packages. Otherwise, go to the URLs above and click on the appropriate download link for your system. Both

      The ActiveTcl distribution contains all three packages (along with the tls and Img package mentioned below); so, you may want to use that instead of three separate downloads.

      At your discretion, there are several optional packages that you may also install. Tkabber will run just fine without them, but if they're available Tkabber will make additional features available to you. So, here's the list:

      • By default, the Tcl's DNS package uses TCP for its communication with DNS servers. If your DNS server requires usin UDP then you may want to install Tcl UDP extension version 1.0.8 (or later). This extension works both for Unix and Windows.

      • By default, communications between the server and client take place over a plaintext connection. While this may not be a problem in some local, wired environments, if your server is distant or your client is wireless, then you may want to encrypt all the client/server traffic.
        Accordingly, you may to install tls version 1.4.1 (or later). This package works on both Unix and Windows. Note that if you're using Unix, then you'll also need to have OpenSSL installed. Fortunately, this comes preinstalled on many Unix systems. If it's not on your system, check OpenSSL source page. (The Windows distribution of tls comes with all the necessary DLLs.)

      • Tcl/Tk supports only a small number of image formats (i.e., bitmaps, GIFs and portable pixmaps). If presence information contains avatars, these may be in other formats (e.g., PNGs or JPGs).
        Accordingly, you may want to install Img version 1.2 (or later). This package works on both Unix and Windows.

      • Tkabber comes bundled with pure-Tcl XML parser. If its performance is insufficient, you may want to install tDOM version 0.8.0 (or later) and use expat based XML parser.

      • Another option in Unix is to compress connection between client and server (it currently disables encryption).
        There's no special requirements for traffic compression in Tcl/Tk 8.6, but if you're using Tcl/Tk 8.5 and want to compress traffic you should install ZTcl version 1.0b4 (or later) and Tclmore version 0.7b1 (or later).
        (At the time of 0.11.0 release ZTcl and Tclmore home page were unavailable, so you may grab them from a mirror.)

      • By default, end-to-end communications between two or more Jabber clients is plaintext. Depending on your environment, this may not be a problem for you. Alternatively, you may want to digitally-sign all of your outgoing messages, and allow others to encrypt their messages to you.
        Accordingly, you may want to install the TclGPG package. Depending on what's already installed on your system, you may have to download upto two software bits:


        Another alternative is to use Off-the-record messaging protocol, if your contact supports it. The OTR plugin is included into Tkabber plugins collection starting from version 1.1 and requires a few packages from Tcllib, namely the aes, asn, base64, math::bignum, sha1, sha256 packages. Also, if you're using Windows, the Memchan extension has to be installed to run the OTR plugin.

      • If you're running Unix or Windows, then you may want Tkabber to play predefined sounds when message or presence arrives.
        Accordingly, you may want to install Snack version 2.2.10 (or later).

      • If you're running Unix, then you may want Tkabber to use the docking tray.
        Accordingly, you may want to install tktray version 1.3 (or later) for freedesktop icon (supported by modern KDE and GNOME).

      • If you're running Windows, then you may want Tkabber to use the system tray.
        Accordingly, you may want to install Winico version 0.6 (or later).

      • If you're a Tcl/Tk guru, then you may want to access the Tk console to debug things.
        Accordingly, you may want to install tkcon version 2.3 (or later).

      Please keep in mind that these are all "optional extras" — if they're not right for you or your environment, don't bother with them!

      3. Download, install and run

      Latest stable version is 1.1.2 and available at http://tkabber.jabber.ru/download.

      Older versions can be found at http://files.jabber.ru/tkabber/.

      You can always find the latest development version via Fossil. Execute the following commands:

      fossil clone https://chiselapp.com/user/sgolovan/repository/tkabber tkabber.fossil
      fossil clone https://chiselapp.com/user/sgolovan/repository/tclxmpp tclxmpp.fossil
      mkdir tkabber
      cd tkabber
      fossil open ../tkabber.fossil
      mkdir tclxmpp
      cd tclxmpp
      fossil open --nested ../../tclxmpp.fossil
      

      And if you want to test some plugins, then do

      fossil clone https://chiselapp.com/user/sgolovan/repository/tkabber-plugins tkabber-plugins.fossil
      mkdir tkabber-plugins
      cd tkabber-plugins
      fossil open ../tkabber-plugins.fossil
      

      And if you want to try unofficial plugins, then execute

      fossil clone https://chiselapp.com/user/sgolovan/repository/tkabber-contrib tkabber-contrib.fossil
      mkdir tkabber-contrib
      cd tkabber-contrib
      fossil open ../tkabber-contrib.fossil
      

      They usually include short readme with info on what they do and how to use them.

      If you use the Debian GNU/Linux distribution, you may want to get all required packages by using apt. Just execute

      apt-get install tk tcllib bwidget
      

      or

      apt-get install tkabber
      

      to get the version included into Debian repository.

      No real installation is required, simply copy the tkabber/ directory to a commonly-available area, and then either: Tkabber comes with a Makefile, there's really not much to do — most folks prefer to simply copy the distribution directory to somewhere in their home directory.

      • put this directory in your search-path; or,
      • make a calling script/shortcut to the file tkabber.tcl in that directory.

      Although

      From the shell, you can invoke Tkabber as:

      % tkabber.tcl
      

      whilst on a windowing system, simply double-click on that file or a short-cut to it.

      If you're a Tcl/Tk guru and have installed tkcon, then you may want to invoke Tkabber as:

      % tkcon.tcl -exec "" -root .tkconn -main "source tkabber.tcl"
      

      Tkabber will automatically know that it's running under tkcon and will start by hiding the Tk console window. Look under the Services->Debug tools menu to find the checkbutton to show the console. Note that if Tkcon is installed as a Tcl/Tk package then Tkabber will add corresponding menu item under Services->Debug tools automatically.

      Also you can setup Tkabber as handler for XMPP/Jabber MIME Type . For this you need to set hanler for application/xmpp+xml MIME type in your browser to something like this:

      tkabber -mime %s
      

      4. Upgrading

      4.1. Upgrading from version 1.0, 1.1 or 1.1.1

      Upgrading Tkabber from version 1.0 doesn't require configuration changes. You are advised to upgrade external plugins but it isn't strictly necessary.

      4.2. Upgrading from version 0.11.0 or 0.11.1

      When upgrading Tkabber from version 0.11.1 or earlier note that its plugin interface and several configuration options have been changed.

      4.2.1. External plugins

      There are incompatible changes in Tkabber internals, which break the old plugins. So, you'll have to upgrade them as well. If a plugin author hasn't released a version compatible with Tkabber 1.1 then you'll have to disable or remove that plugin.

      4.2.2. Configuration options

      There are notable changes in specifying a set of proxy servers. If you define proxy server in the global loginconf array then you'll have to do the following: In case if you use the Customize interface, you may open the Manage proxy servers dialog window and add your proxy server there. Note that if you're using the HTTPS proxy then you'll have to add it twice (one in the Tunnel proxies tab and the other in the HTTP proxies tab, see section 'The proxy module' [s.postload-proxy] below). If you define proxy server in the Tkabber config file then you have lines similar to the following in the config:

      set loginconf(proxy) https
      set loginconf(proxyhost) proxy.example.com
      set loginconf(proxyport) 3128
      set loginconf(proxyusername) ""
      set loginconf(proxypassword) ""
      

      Replace them by the following:

      set proxy1(type) https
      set proxy1(host) proxy.example.com
      set proxy1(port) 3128
      set proxy1(username) ""
      set proxy1(password) ""
      set proxy1(match) *
      set proxy1(exclude) "localhost* 127.0.0.* 172.* 192.168.* 10.*"
      
      set proxy2(type) http
      set proxy2(host) proxy.example.com
      set proxy2(port) 3128
      set proxy2(username) ""
      set proxy2(password) ""
      set proxy2(match) *
      set proxy2(exclude) "localhost* 127.0.0.* 172.* 192.168.* 10.*"
      
      set proxyconf(profile) Proxies
      set proxyconf(tunnel) {proxy1}
      set proxyconf(http) {proxy2}
      

      which will instruct Tkabber to use these proxies for all connections. If you need more complicated setup with several proxy profiles, read section 'The proxy module' [s.postload-proxy] below.

      4.3. Upgrading from version 0.10.0

      When upgrading Tkabber from version 0.10.0 or earlier read the above section on plugins [ss.upgrading0.11.1.plugins] and also note that several configuration options and user interface elements have been changed.

      4.3.1. Configuration options

      There are notable changes in handling connection through proxy servers, managing fonts and balloon colors, and detecting breaks in underlying TCP connection to a server.

      4.3.1.1. Proxy servers

      Since SOCKS4 and SOCKS5 proxy types were implemented in addition to HTTP proxy type, the whole set of connection options regarding proxy servers has been changed. This means that after upgrade the old values stored using the Customize mechanism will be lost and the same values in loginconf arrays will not be recognized any longer.

      To learn how to adapt your current proxy settins to the current Tkabber version, read section above [ss.upgrading0.11.1.conf], but remember that variables in the loginconf array mentioned there have been changed between 0.10.0 and 0.11.0. Use the map below as a reference which variable should actually be used:

      • Variable "httpproxy"in 0.10.0 became "proxyhost" in 0.11.0.
      • Variable "httpport" became "proxyport".
      • Variable "httplogin" became "proxyusername".
      • Variable "httppassword" became "proxypassword".

      4.3.1.2. Resources to control fonts

      Fonts handling has been partially reworked: the global variable font that controls chat and roster fonts has been removed and now Tkabber relies on Tk option database to manage these settings. You can override roster and chat fonts independently of each other. To do that on systems not based on X Window use Customize options described below.

      The main consequence of this change is that now the fonts are taken from Tk option database and if it contains sane values you don't need to touch anything (until the update you had to tweak the font variable because it was set to font "fixed" by default). The variable font does not have any special meaning starting from 0.11.0 release.

      The second consequence is that you are now able to set fonts for chat and roster windows separately from each other using this list as a reference:

      • *font Tk option database resource sets default font for all widgets used in Tkabber.
      • *Chat*Text.font Tk option database resource can be used to override font used for chat windows. This resource can be overridden by the ::ifacetk::options(font) option from the "Main Interface" group of Customize settings.
      • *Roster*font Tk option database resource can be used to override font used for roster windows. This resource can be overridden by the ::ifacetk::options(roster_font) option from the "Main Interface" group of Customize settings.

      4.3.1.3. Keep-alives and dead link detection

      Keep-alive mechanism that was used to keep NATP devices from disconnecting idle XMPP sessions was accompanied in 0.10.0 with "XMPP ping" mechanism which also implemented dead link detection with support for disconnecting upon detection of network outage.

      In version 0.11.0, the old keep-alive mechanism has been dropped, so the following two global options have no effect now:

      • keep_alive
      • keep_alive_interval

      In order to get the same functionality, enable XMPP ping using these options in the "IQ" group of Customize settings:

      • Enabling ::plugins::ping::options(ping) will make Tkabber periodically send xmpp:ping IQ request to the server.
      • Set ::plugins::ping::options(timeout) option to a number of seconds Tkabber should wait for either a xmpp:ping reply or an error to arrive from the server; if there is no answer from the server during this timeout, the socket for this connection will be forcibly disconnected.

      4.3.1.4. Resources to control appearance of balloon windows

      Resources controlling the appearance of balloon windows have been made more generic. If you use custom Tk option database settings for balloon windows, change the relevant resources using this map:

      • Change references to *Balloon.background and *Balloon.foreground resources to *Balloon*background and *Balloon*foreground, respectively.
      • Change references to *Balloon*padX and *Balloon*padY resources to *Balloon.text.padX and *Balloon.text.padY, respectively.

      4.3.1.5. Support for external XML parser

      Support for TclXML as an external XML parser has been removed (since TclXML has anyway been unable to support partial XML processing) along with the global variable use_external_tclxml which controlled the loading of TclXML.

      Now expat-based Tcl package tDOM is supported as an external XML parser. It is enabled by default if it is installed.

      4.3.2. User interface

      There are notable changes in systray mouse gestures, appearance of a main tabbed window, and in behavior of paned window splitters.

      4.3.2.1. System tray icon mouse gestures

      Mouse gestures bound to system tray (system notification area) icon have been reworked:

      • Single click on it with the left mouse button now unconditionally brings the main Tkabber window to front, possibly deiconifying it first.
      • Single click with the middle mouse button now unconditionally iconifies the main Tkabber window.

      This differs from the previois behaviour where single click with the left mouse button on Tkabber's system tray icon toggled the iconified/visible state of the main Tkabber window.

      4.3.2.2. New tab management widget

      The notebook widget which was used to render tabs in tabbed interface mode has been replaced with a new custom widget providing the ability for multi-row placement of tabs and docking them to the left or right sides of the chat window (in addition to top or bottom docking available in 0.10.0 version and earlier).

      If you adjusted any specific Tk option database resources pertaining to that notebook widget, you have to change them keeping in mind that the new widget is just a bunch of Tk buttons (class Button) placed in a frame (called .nb as before). The class name for the new widget is ButtonBar.

      So if you explicitly set, say *Notebook*font option, you have to change it to *ButtonBar*font and so on.

      4.3.2.3. Window splitters

      Window splitters (thin vertical and horizontal windows used to change relative sizes of windows between which a splitter is placed) have been changed to "Windows" style. This differs from previous "Motif" style which implemented explicit "grip box" on each splitter which was the only "active point" of a splitter.

      4.4. Upgrading from version 0.9.9

      When upgrading Tkabber from version 0.9.9 or earlier read the above section [s.upgrading0.10.0] and also note the following:

      • On Macintosh or Microsoft Windows Tkabber will copy it's configuration directory to a new location (see the next section [s.configuration] for details). If the transfer of the config directory goes smoothly you may delete old "~/.tkabber" directory and replace its name in your config file by $::configdir.
      • Also, Tkabber will convert chatlogs directory to a new format.
      • Also, Tkabber changed the way it works with emoticons. Instead of loading them in config file you may put you faivorite emoticons directory into $::configdir/plugins directory, restart Tkabber and then choose emoticons set using Customize GUI.

      5. Configuration

      Tkabber maintains its configuration using a set of files placed in a special configuration directory which location depends on the operating system Tkabber runs on. These locations are:

      • Unix systems: "~/.tkabber";
      • Macintosh: "~/Library/Application Support/Tkabber";
      • Under Microsoft Windows this location is governed by the policy of the particular flavor of this OS, but the general rule is that the Tkabber configuration directory is named "Tkabber" and is located in the special system folder for storing application-specific data. For example, under Windows XP this will be something like "C:\Documents and Settings\USERNAME\Application Data\Tkabber", where "USERNAME" is the login name of a particular operating system's user.

      Tkabber also honors the value of the "TKABBER_HOME" environment variable — if it exists the whole OS-based guessing of the configuration directory location is cancelled and the value of this environment variable is used instead.

      Once the pathname of the Tkabber configuration directory is known, its value is assigned to the "configdir" global Tcl variable which can be accessed from within the main Tkabber configuration file (see below).

      One of the first things that Tkabber does when it's starting up is reading a file located in its configuration directory under the name "config.tcl". This is a Tcl source file, so obviously, it's a lot easier to maintain this file if you know the Tcl programming language. If you're not familiar with it, that's okay — most things you'll need to do are pretty simple! (In fact, if you don't have your own configuration file, you'll get the vanilla Tkabber, which hopefully you'll find quite usable.)

      Note that almost all Tkabber options can be cofigured using graphical interface (menu Tkabber->Customize), so editing configuration file is not strictly necessary.

      Tkabber is configured in four stages:

      • in the pre-load stage, configuration options which guide the loading process are set;
      • in the post-load stage, configuration options for each module are set;
      • in the menu-load stage, the user is given an option to re-arrange Tkabber's menu bar; and,
      • the final-load stage allows any last changes to be made before the "login" dialog window is displayed to the user.

      Let's look at each, in turn.

      5.1. Pre-load

      There are a few things that you may let Tkabber know immediately. These are:

      # tabbed interface
      
      set ifacetk::options(use_tabbar) 1
      
      
      # primary look-and-feel
      
      set load_default_xrdb 1
      
      option add *font \
             "-monotype-arial-medium-r-normal-*-13-*-*-*-*-*-iso10646-1" \
             userDefault
      
      
      # cryptography by default
      
      set ssj::options(sign-traffic)    0
      set ssj::options(encrypt-traffic) 0
      
      
      # debugging output
      
      set debug_lvls {xmpp warning}
      
      
      # splash window
      
      set show_splash_window 0
      
      
      # force english labels instead of native language
      
      ::msgcat::mclocale en
      
      # use mozilla firefox to open web urls in text
      
      set webbrowser "firefox -new-tab %s"
      

      5.1.1. Tabbed Interface

      The first of these options, ifacetk::options(use_tabbar), tells Tkabber whether you want a tabbed interface or not. If not, here's what to put in your configuration file:

      set ifacetk::options(use_tabbar) 0
      

      Although Tkabber immediately applies most of its configuration changes, in order to apply changed option ifacetk::options(use_tabbar) you have to restart Tkabber. So, basically you have two options: set ifacetk::options(use_tabbar) at the beginning of your configuration file, or using graphical interface save the option and restart Tkabber.

      5.1.2. Fonts and colors

      Many aspects of the Tkabber's visual appearance such as fonts, colors and geometry of windows can be configured using the Tk option database.

      The corresponding Tk's option command can be used in the Tkabber's configuration file in any acceptable way: from small tweaks to reading files containing elaborate sets of configuration commands; ready-to-use examples of such files are included in the distribution and are located under the "examples/xrdb" directory.

      The Tk toolkit is able to initialize its option database from the XRDB (X Resource Database) if its availability is detected at run time. This means that any settings described here can be tuned via the standard XRDB mechanism (see man xrdb).

      Beware though that the Tk's semantics of matching option specifications against the option database differ in some subtle details from that of the Xt toolkit. The most notable one is the priority of options: Tk prefers the latest option it sees, while Xt prefers "the most specific" one.

      When specifying Tkabber-specific options in your XRDB file use the "Tkabber" class as the root element of the options.

      See Appendix B for a list of all the resources that you can set to control Tkabber's look-and-feel.

      Probably the most commonly used way to configure Tkabber's visual appearance (especially on Windows platforms which lack XRDB mechanism) is to put all the necessary settings in some file and then ask Tk to update its option database from it, like this:

          set load_default_xrdb 0
          option readfile $::configdir/newlook.xrdb userDefault
      

      The first line tells Tkabber not to load its default "xrdb" file, whilst the second line tells Tkabber which file to load instead. Look at the provided example "xrdb" files to get the idea about how they are organised. Of course, you can use any of that files as a template. And of course, you can simply specify any of the example files instead of your own to the option readfile command to get the provided "theme".

      Alternatively, if you're a Tcl "old timer", you can always do:

          set load_default_xrdb 0
          tk_bisque
      

      to set the palette to a pleasing color scheme. Read more about this in man palette.

      You can also customize the fonts Tkabber uses to render its user interface:

          option add *font \
              "-monotype-arial-medium-r-normal-*-13-*-*-*-*-*-iso10646-1" \
              userDefault
      

      The above setting (operating on the Tk option database) selects the font used for all UI elements like buttons and labels and roster and conversation windows. Obviously, you should choose fonts that suit your taste.

      If you want to specify another font for roster labels use the following option:

          option add *Roster*font \
                 "-misc-fixed-medium-r-normal-*-12-*-*-*-*-*-iso10646-1" \
                 userDefault
      

      When picking fonts, observe these rules: Tkabber's configuration files (i.e. not using XRDB directly) you are not forced to use "X-style" (XLFD) font descriptions and may instead specify fonts using sometimes more convenient Tk features described in Tk font manual page.

      • Under X, encoding (charset) of fonts must match that of your locale.
      • Ensure that the specified font exists, since if it's not, Tk will try hard to pick the most suitable one which often yields not what you want. (The best bet is to first pick the font using some tool like xfontsel.)

      Note that when specifying settings using the

      5.1.3. Cryptography by default

      Next, you may want to Tkabber to use cryptography by default. There are two options: Tkabber will complain immediately if it isn't able to load its cryptographic module; otherwise, the default behavior is to proceed without any cryptographic buttons, menus, and so on.)

      • whether the traffic you send should be digitally-signed; and,
      • if you have cryptographic information for someone, should the default action be to encipher your traffic for them.

      (By defining these options early on,

      5.1.4. Debugging Output

      Tkabber has a lot of debugging output. By default, it gets printed to the standard output by a Tcl procedure called debugmsg (if there's standard output available). However, only information about those modules listed in a variable called debug_lvls will be printed.

      If you know how to program Tcl, then this will seem rather obvious:

      set debug_lvls [list message presence ssj warning]
      
      # if you want a different behavior,
      #     define your own...
      
      proc debugmsg {module msg} {
      #    ...
      }
      

      Most users won't care about debugmsg because they're running Tkabber under an application launcher so the standard output is never seen. However, if this isn't the case for you, and you just don't want to see any of this stuff, put this one line in your configuration file:

      set debug_lvls {}
      

      5.1.5. Splash window

      By default, when Tkabber startup, it show loading process in splash window. To disable this feature, put this in your configuration file:

      set show_splash_window 0
      

      5.1.6. I18n/L10n

      Tkabber can show all messages in user's native language. This is done by using Tcl's built-in msgcat package which looks for a directory called msgs/ wherever you installed Tkabber, and then uses the LC_MESSAGES environment variable (or LANG if LC_MESSAGES not set) to select the appropriate file. If you wish, you can force use of a particular language by putting a line like this in your configuration file:

      ::msgcat::mclocale en
      

      5.1.7. Browse URL

      Tkabber executes a browser when you click on a URL in chat windows, or in user info window, or in headlines window etc. It uses some heuristics to find which browsers are installed in the system and invokes the first browser it finds.

      If Tkabber's decision on which browser to use is suboptimal to you, or if you want to add some options to the browser command line (open URL in a new tab, or in a new window etc.) you may set the varable webbrowser like the following:

      set webbrowser "firefox -new-tab %s"
      

      Note, that the %s in the string (it doesn't have to be at the end) will be replaced by an actual URL when the command will be run. Also, if your favorite browser's path contains spaces, enclose it in braces.

      The following figures shows some examples of setting this variable

      for Windows:

      set webbrowser "{C:/Program Files/Opera/opera.exe} %s"
      
      set webbrowser \
          "{C:/Program Files/Mozilla Firefox/firefox.exe} -new-window %s"
      
      set webbrowser "{C:/Program Files/Internet Explorer/iexplore.exe} %s"
      

      for Unix:

      set webbrowser "iceweasel -new-tab %s"
      
      set webbrowser "chromium-browser %s"
      

      5.1.8. Searching

      Tkabber allows the user to perform textual searching in certain classes of its windows. This searching is controlled by several settings which can be specified in this section.

      These settings are described in detail in Section 7.1.

      5.2. Post-load

      After Tkabber reads your configuration file, it loads all of its own modules, it then invokes a procedure called postload. This procedure is supposed to perform module-specific configuration.

      The default version of this procedure doesn't do anything. If you want to configure one more module modules, then you need to define the procedure in your configuration file, e.g.,

      proc postload {} {
      # look-and-feel
      
          set pixmaps::options(pixmaps_theme) Default
      
          global alert colors alert_lvls
      
          set alert_lvls(error)        1
          set alert_lvls(server)       1
          set alert_lvls(message)      2
          set alert_lvls(mesg_to_user) 3
          set alert_colors             {Black DarkBlue Blue Red}
      
          set ifacetk::options(raise_new_tab) 1
      
      # tray icon
      
          set ::plugins::tktray::options(enable) 1
      
      # the autoaway module
      
          set plugins::autoaway::options(awaytime)  5
          set plugins::autoaway::options(xatime)   15
          set plugins::autoaway::options(status) \
              "Automatically away due to idle"
          set plugins::autoaway::options(drop_priority) 1
      
      
      # the avatar module
      
          set avatar::options(announce) 0
          set avatar::options(share)    0
      
      
      # the chat module
      
          set chat::options(stop_scroll)          0
          set plugins::options(timestamp_format)  {[%R]}
      
      
      # the clientinfo module
      
          set plugins::clientinfo::options(autoask) 0
      
      
      # the conferenceinfo module
      
          set plugins::conferenceinfo::options(autoask)        0
          set plugins::conferenceinfo::options(interval)       1
          set plugins::conferenceinfo::options(err_interval)  60
      
      
      # the cryptographic module
      
          set ssj::options(encrypt,fred@example.com) 1
      
      
      # the emoticon module
      
          set plugins::emoticons::options(theme) \
                      $::configdir/emoticons/rythmbox
      
      
      # the file transfer module
      
          set ft::options(download_dir) "/tmp"
      
      
      # the groupchat module
      
          global gra_group gra_server
          global gr_nick gr_group gr_server
          global defaultnick
      
          set defaultnick(adhoc@conference.example.com) publius
          set defaultnick(*@conference.example.com) cicerone
      
      
      # the ispell module
      
          set plugins::ispell::options(enable)              1
          set plugins::ispell::options(executable)          /usr/bin/hunspell
          set plugins::ispell::options(command_line)        -d ru_RU,en_US
          set plugins::ispell::options(dictionary_encoding) ""
          set plugins::ispell::options(check_every_symbol)  0
      
      # the stream initiation module
      
          set si::transport(allowed,http://jabber.org/protocol/bytestreams) 0
          set si::transport(allowed,http://jabber.org/protocol/ibb) 1
      
      
      # the logger module
      
          set logger::options(logdir)        [file join $::configdir logs]
          set logger::options(log_chat)      1
          set logger::options(log_groupchat) 1
      
      # the proxy module
      
          global proxy1 proxy2 proxy3 proxyconf1 proxyconf2 proxyconf
      
          set proxy1(type)     https
          set proxy1(host)     proxy.example.com
          set proxy1(port)     3128
          set proxy1(username) ""
          set proxy1(password) ""
          set proxy1(match)    *
          set proxy1(exclude)  "localhost* 127.0.0.* 172.* 192.168.* 10.*"
      
          set proxy2(type)     http
          set proxy2(host)     proxy.example.com
          set proxy2(port)     3128
          set proxy2(username) ""
          set proxy2(password) ""
          set proxy2(match)    *
          set proxy2(exclude)  "localhost* 127.0.0.* 172.* 192.168.* 10.*"
      
          set proxy3(type)     socks5
          set proxy3(host)     proxy.example.com
          set proxy3(port)     1080
          set proxy3(username) ""
          set proxy3(password) ""
          set proxy3(match)    *
          set proxy3(exclude)  "localhost* 127.0.0.* 172.* 192.168.* 10.*"
      
          set proxyconf1(profile) Home
          set proxyconf1(tunnel)  {}
          set proxyconf1(http)    {}
      
          set proxyconf2(profile) Work
          set proxyconf2(tunnel)  {proxy1 proxy3}
          set proxyconf2(http)    {proxy2}
      
          array set proxyconf [array get proxyconf2]
      
      # the login module
      
          global loginconf loginconf1 loginconf2 autologin
      
          set loginconf(user)           ""
          set loginconf(password)       ""
          set loginconf(server)         example.com
          set loginconf(resource)       tkabber
          set loginconf(priority)       16
          set loginconf(usealtserver)   0
          set loginconf(altserver)      ""
          set loginconf(altport)        5422
          set loginconf(stream_options) plaintext
          set loginconf(usesasl)        1
          set loginconf(allowauthplain) 0
      
          # The following variables are useful when your jabber-server
          # (example.com) does not have SRV or A-record in DNS
          set loginconf(usealtserver)  1
          set loginconf(altserver)     "jabber.example.com"
      
          set loginconf1(profile)      "Default Account"
          set loginconf1(user)         mrose
      
          set loginconf2(profile)      "Test Account"
          set loginconf2(user)         test
      
          array set loginconf          [array get loginconf1]
      
          set autologin 0
      
      
      # the message module
      
          set message::options(headlines,cache)    1
          set message::options(headlines,multiple) 1
      
      
      # the raw xml input module
      
          set plugins::rawxml::set options(pretty_print) 0
          set plugins::rawxml::set options(indent)       2
      
      
      # the roster module
      
          set roster::show_only_online            1
          set roster::roster(collapsed,RSS)       1
          set roster::roster(collapsed,Undefined) 1
      
          set roster::aliases(friend@some.host) \
              {friend@other.host friend@another.host}
          set roster::use_aliases                 1
      
      
      # the sound module
      
          set sound::options(mute)                   0
          set sound::options(mute_if_focus)          0
          set sound::options(notify_online)          0
          set sound::options(mute_groupchat_delayed) 1
          set sound::options(mute_chat_delayed)      0
          set sound::options(external_play_program) /usr/bin/aplay
          set sound::options(external_play_program_options) -q
          set sound::options(delay)
      
          set sound::options(connected_sound)                     ""
          set sound::options(presence_available_sound)            ""
          set sound::options(presence_unavailable_sound)          ""
          set sound::options(groupchat_server_message_sound)      ""
          set sound::options(groupchat_their_message_to_me_sound) ""
      }
      

      This isn't nearly as complicated as it seems. Let's break it down by individual module

      5.2.1. Look-and-Feel

      Tkabber is shameless in borrowing icons from other Jabber clients. By setting pixmaps::options(pixmaps_theme), you can select a family of related icons. Besides "Default", you can choose one of "Gabber", "JAJC", "Jarl", "Psi", "ICQ", or a few other themes.

      If you want, you can have Tkabber use a different theme by putting custom theme subdirectory to $::configdir/pixmaps/ directory (tilde means home directory). Tkabber knows that it is a theme directory by looking for icondef.xml file in the directory. To find out the structure of icon definition file, look through XEP-0038 and go to where you installed Tkabber and take a look at the directory called "pixmaps/default/".

      If you're using the tabbed window interface, Tkabber needs a way of telling you that something has changed in a window that's not on top. This is where the an array called alert_lvls and a list called alert_colors come in. The array maps an incoming message to a priority number from zero to three. The list, which is indexed starting at zero, indicates what color the tab should use to let you know that something's changed. So, the way to read the example is that receiving:

      • an error or server message will cause the tab of a lowered window to go dark blue;
      • a groupchat or headline message will cause the tab to go blue; and,
      • a chat message addressed directly to you will cause the tab to go red.

      By default, whenever a new tab is created, it is automatically raised. If you don't like this behavior, add this line:

      set ifacetk::options(raise_new_tab) 0

      5.2.2. The system tray icon (for Unix)

      This module is presently available only for Unix

      To enable the system tray icon you have to install tktray extension and set the config variable plugins::tktray::options(enable) to 1.

      If you want to control the tray icon appearance and/or position, consult the documentation for your desktop environment or window manager. Note, that the Tkabber's tray icon has WM class TkabberIcon.

      5.2.3. The Autoaway Module

      There are two variables that control when Tkabber automatically marks you as away: plugins::autoaway::options(awaytime) and plugins::autoaway::options(xatime). Both define the idle threshold in minutes (the number does not have to be integer).

      If variable plugins::autoaway::options(drop_priority) is set in 1 then Tkabber will set priority to 0 when moving in extended away state.

      Variable plugins::autoaway::options(status) allows to specify text status, which is set when Tkabber is moving in away state.

      5.2.4. The Avatar Module

      There are two variables that you can set to control whether Tkabber will allow others to see your avatar:

      • avatar::options(announce) determines whether your presence information indicates that you have an avatar; and,
      • avatar::options(share) determines whether requests for your avatar will be honored.

      5.2.5. The Chat Module

      The variable named chat::options(stop_scroll) determines whether a chat window should automatically scroll down to the bottom whenever something new comes in.

      You can also set format of time stamp that displayed in beginning of each chat message. Refer to Tcl documentation for description of format. E.g., to display it in "dd:mm:ss" format, add this line:

      set plugins::options(timestamp_format) {[%T]}
      

      5.2.6. The Clientinfo Module

      This module shows in popup balloons information of used by this user client name, version, and OS. You can allow or deny automatic asking of this info from users by setting this variable to 1 or 0:

      set plugins::clientinfo::options(autoask) 1

      5.2.7. The Conferenceinfo Module

      After you join a conference that's listed in your roster, then whenever you mouse over that roster entry, you'll see a popup listing the conference's participants. If you want to see this popup, regardless of whether you are currently joined with the conference, add this line to your post-load:

      set plugins::conferenceinfo::options(autoask) 1

      You can also set interval between these requests with these two variables:

      set plugins::conferenceinfo::options(interval)       1
      set plugins::conferenceinfo::options(err_interval)  60
      

      The second variable defines how many minutes to wait after receiving an error reply before trying again. (Usually an error reply indicates that the server hosting the conference doesn't support browsing, so it makes sense not to try that often.

      5.2.8. The Cryptographic Module

      Earlier [s.preload] we saw an example where the ssj::options array from the cryptographic module was set during the preload.

      In addition to signed-traffic and encrypt-traffic, you can also tell Tkabber whether to encrypt for a particular JID, e.g.,

          set ssj::options(encrypt,fred@example.com) 1
      

      5.2.9. The Emoticons Module

      The procedure called plugins::emoticons::load_dir is used to load emoticon definitions from a directory. The directory contains a file called "icondef.xml", which defines the mapping between each image and its textual emoticon (To find out what this file looks like, go to where you installed Tkabber and take a look at the file called "emoticons/default/icondef.xml" or read XEP-0038.)

      If you have just a few icons, and you don't want to create a directory and a textual mapping, you can use the procedure called plugins::emoticons::add, e.g.,

          plugins::emoticons::add ":beer:" \
              [image create photo -file $::configdir/emoticons/beer.gif]
      

      If you want to disable all emoticons, you can simply load empty directory. Put in postload function

          plugins::emoticons::load_dir ""
      

      5.2.10. The File Transfer Module

      You can set directory in which files will be saved by default:

          set ft::options(download_dir) "/tmp"
      

      5.2.11. The Groupchat Module

      There are several variables that set the dialog window defaults for adding a groupchat to your roster, or joining a groupchat: gra_server, gr_nick and gr_server overriden in login procedure, so better place for changing them is in connected_hook (see below).

      add to roster dialog window:
      gra_group and gra_server specify the default room and conference server, repectively; and,
      join dialog window:
      gr_nick, gr_group and gr_server specify the default nickname, room, and conference server, respectively.

      Note that variables

      You may want to have different nicknames for different groupchats. Accordingly, the array called defaultnick is used to set the default nickname for when you enter a conference. The array is indexed by the JID of the room, e.g.,

          set defaultnick(adhoc@conference.example.com) publius
      

      Another possibility is to put pattern in parentheses. The following example shows how to specify default nickname for all conferences at conference.example.com:

          set defaultnick(*@conference.example.com) ciceroni
      

      Exact JID's take the higher precedence than patterns.

      5.2.12. The Ispell Module

      On Unix, Tkabber can check spelling of what you entered by calling an external program ispell. To enable this feature, add following lines to postload function:

      set plugins::ispell::options(enable) 1
      

      If you enabled this module, then you can also define: plugins::ispell::options(check_every_symbol) to 1 to check correctness of current word after every entered symbol. (Usually you don't need to set this option.)

      • the path to the ispell, or aspell, or hunspell executable by setting plugins::ispell::options(executable)
      • the ispell command line options, which can specify dictionaries to use, by setting plugins::ispell::options(command_line); and,
      • the encoding of the output by setting plugins::ispell::options(dictionary_encoding).

      If you don't care about putting a large load on your process, then you can also set

      5.2.13. The Stream Initiation Module

      Stream initiation profile is defined in XEP-0095 with two transports (XEP-0047 - IBB, XEP-0065 - SOCKS5 bytestreams). With it you can specify what transports you can use, and via negotiation choose more appropriate one. Tkabber comes with two transport implementations:

      bytestreams:
      that allows you to connect to any node that supports bytestreams transport (mediated connection is not supported yet);
      ibb:
      that uses your Jabber connection to transmit the data (which may slowdown other traffic to you).

      If your machine is behind a NAT, then you can't use the bytestreams transport, so you should disable it:

          set si::transport(allowed,http://jabber.org/protocol/bytestreams) 0
      

      5.2.14. The Logger Module

      You can set directory to store logs:

          set logger::options(logdir) [file join $::configdir logs]
      

      Also you can allow or disallow storing of private and group chats logs:

          set logger::options(log_chat)      1
          set logger::options(log_groupchat) 1
      

      5.2.15. The Proxy Module

      Starting from version 1.0 Tkabber does not keep proxy settings in the loginconf array. It uses proxy profiles defined in separate arrays.

      First, you may want to specify a set of proxy servers. You can have multiple proxy servers defined in the config file (to use in different environments, or if in your company different proxies are used to connect to different hosts). To do so, define global arrays (their names could be arbitrary, but proxy<number> looks natural):

          set proxy1(type)     https
          set proxy1(host)     proxy.example.com
          set proxy1(port)     3128
          set proxy1(username) ""
          set proxy1(password) ""
          set proxy1(match)    *
          set proxy1(exclude)  "localhost* 127.0.0.* 172.* 192.168.* 10.*"
      
          set proxy2(type)     http
          set proxy2(host)     proxy.example.com
          set proxy2(port)     3128
          set proxy2(username) ""
          set proxy2(password) ""
          set proxy2(match)    *
          set proxy2(exclude)  "localhost* 127.0.0.* 172.* 192.168.* 10.*"
      
          set proxy3(type)     socks5
          set proxy3(host)     proxy.example.com
          set proxy3(port)     1080
          set proxy3(username) ""
          set proxy3(password) ""
          set proxy3(match)    *
          set proxy3(exclude)  "localhost* 127.0.0.* 172.* 192.168.* 10.*"
      

      Field type is one of the following: "socks4", "socks5", "https", "http". The firat three types are tunnelling proxies. If you enable them, Tkabber will use them to tunnel its TCP connections (in case of "https" this means using CONNECT method for HTTP proxy). The other one is used when Tkabber needs to fetch some data via GET or POST method of the HTTP protocol (e.g., when utilizing BOSH or HTTP-poll connection).

      Fields host, port, username and password are selfexplanatory.

      There are two fields which need some explanation: match and exclude. When Tkabber needs to connect to a certain host or to get an HTTP document it searches proxies in order they appear in the corresponding proxyconf list (see below) and uses the first proxy for which the host matches one of the patterns from the match field but doesn't match any of the patterns from the exclude field. The matching uses patterns convention from the string match Tcl command.

      Second, you may want to define proxy profiles, and switch between them when the environment changes (it's useful for portable computers). To do so, you may define global arrays named proxyconf<number> where numbers must start from 1 and be consecutive, otherwise Tkabber GUI wouldn't be able to switch to them:

          set proxyconf1(profile) Home
          set proxyconf1(tunnel)  {}
          set proxyconf1(http)    {}
      
          set proxyconf2(profile) Work
          set proxyconf2(tunnel)  {proxy1 proxy3}
          set proxyconf2(http)    {proxy2}
      
          array set proxyconf [array get proxyconf2]
      

      Here, two proxy profiles are defined. The first one instructs Tkabber not to use any proxies and directly connect to any host. The second one defines two tunnel proxies and one HTTP proxy. Note that HTTPS and HTTP proxy are the same, but they should appear in both tunnel and http fields anyway. The last line chooses the default proxy profile, which is Work in the example above.

      Also, you can edit proxy settings using Tkabber GUI under Tkabber->Manage proxy servers menu item.

      5.2.16. The Login Module

      The first task is to initialize the configuration defaults for the login module. As you can see above, the global array loginconf has a whole bunch of elements, e.g., user, password, and so on.

      Elements loginconf(user) and loginconf(password)specify username and password to authenticate at your Jabber server.

      Element loginconf(server) must be set to Jabber server name (the part of you JID after @.

      Element loginconf(stream_options) is set to one of the following values:

      • plaintext — use plaintext connection;
      • encrypted — use encrypted (via STARTTLS mechanism) connection (this option requires tls extension to be installed);
      • ssl — use encrypted (via legacy SSL mechanism) connection (this option requires tls extension to be installed);
      • compressed — use compressed connection (this option requires Ztcl extension to be installed).

      Tkabber tries to resolve Jabber server name using SRV first and usual A records in DNS. If the resolution fails (for example if you are in LAN environment without DNS) you can force Tkabber to connect to the server using loginconf(altserver) and loginconf(altport) options (do not forget to set loginconf(usealtserver) to 1).

      Another option is to use BOSH (XEP-0124 and XEP-0206) connect method (if your server supports it) and tunnel XMPP traffic through HTTP. To enable BOSH set loginconf(usebosh) to 1. Tkabber then tries to find connect URL using TXT record in DNS (see XEP-0156). You can specify URL manually by setting loginconf(boshurl).

      And another option is to use HTTP-polling connect method (if your server supports it) and tunnel XMPP traffic through HTTP. To enable HTTP-polling set loginconf(usehttppoll) to 1. Tkabber then tries to find connect URL using TXT record in DNS (see XEP-0156). You can specify URL manually by setting loginconf(pollurl).

      This collection of elements, which is termed a login profile, is what populates the dialog window you'll see when Tkabber wants to connect to the server.

      It turns out that Tkabber lets you have as many different login profiles as you want. If you want more than just one, they're named loginconf1, loginconf2, and so on.

      What the example above shows is the default values for all profiles being set in loginconf, and then two profiles, one called "Default Account" and the other called "Test Account" being created.

      If you want to automatically login to server, then you can set the autologin variable to 1.

      If you set the autologin variable to -1, then Tkabber will not automatically login and will not show login dialog.

      Default value for autologin is 0. In this case Tkabber shows login dialog.

      5.2.17. The Message Module

      By default, when you restart Tkabber it won't remember the headlines you received. If you want Tkabber to remember headlines whenever you run it, set message::options(headlines,cache) to 1.

      By default, Tkabber will put all headline messages into a single window. If you want Tkabber to use a seperate window for each headline source, set message::options(headlines,multiple) to 1.

      5.2.18. The Raw XML Input Module

      With this module you can monitor incoming/outgoing traffic from connection to server and send custom XML stanzas. Also you can switch on pretty print option to see incoming and outgoing XML stanzas pretty printed. Note, that with this option they may be drawed incorrectly, e.g. for XHTML tags. Also you can set indentation level via indent option.

      5.2.19. The Roster Module

      By default, your entire roster is shown, even those items that aren't online. The variable called roster::show_only_online controls this.

      Similarly by default, each item in every category is shown in the roster. If you want to hide the items in a given category, the array called roster::roster lets you do this. In the example, we see that two groups ("RSS" and "Undefined") start with their items hidden.

      Some peoples use several JIDs. Tkabber lets you specify an alias for people like these, so it will show only one entry in the roster. In the example, we see that user friend@some.host have aliases friend@other.host and friend@another.host. You can also disable all aliases by setting roster::use_aliases to 0.

      5.2.20. The Sound Module

      Tkabber can play sounds on some events. It can use for this snack library or external program that can play WAV files. Sound notifications is enabled when Tkabber starts.

      If you want to start Tkabber with sound muted add the following line:

      set sound::options(mute) 1 

      If you want Tkabber to stop notifying you when you are not online (in away or dnd state) add the following line:

      set sound::options(notify_online) 1 

      If you want Tkabber to mute sound when it is focued (and you are paying enough attention to it) add the following line:

      set sound::options(mute_if_focus) 1 

      You can also mute sounds of delayed groupchat messages and delayed personal chat messages:

      set sound::options(mute_groupchat_delayed) 1
      set sound::options(mute_chat_delayed)      0
      

      If you want to use external program for playing sounds and possibly this program's options, then also add something like this (these options are suitable for Linux users with ALSA installed):

      set sound::options(external_play_program) /usr/bin/aplay
      set sound::options(external_play_program_options) -q
      

      You can also set minimal interval (in milliseconds) between playing different sounds.

      set sound::options(delay) 200

      Tkabber allows you to specify the filename it will play notifying about some more or less important events. These are:

      • sound::options(connected_sound) — sound playing when Tkabber is connected to the server;
      • sound::options(presence_available_sound) — sound playing when available presence is coming;
      • sound::options(presence_unavailable_sound) — sound playing when unavailable presence is coming;
      • sound::options(chat_my_message_sound) — sound playing when you send one-to-one chat message;
      • sound::options(chat_their_message_sound) — sound playing when you receive one-to-one chat message;
      • sound::options(groupchat_server_message_sound) — sound playing when you receive groupchat message from server;
      • sound::options(groupchat_my_message_sound) — sound playing when you receive groupchat message from server;
      • sound::options(groupchat_their_message_sound) — sound playing when you receive groupchat message from another user;
      • sound::options(groupchat_their_message_to_me_sound) — sound playing when you receive highlighted (usually personally addressed) groupchat message from another user.

      If you want to disable sound notification for some of the events, then you can add line like this:

      set sound::options(connected_sound)                     ""
      set sound::options(presence_available_sound)            ""
      set sound::options(presence_unavailable_sound)          ""
      set sound::options(groupchat_server_message_sound)      ""
      set sound::options(groupchat_their_message_to_me_sound) ""
      

      5.3. Menu-load

      After Tkabber invokes your postload procedure, it starts building the GUI. One of the most important things it does is build up a list that specifies its menu bar. It then invokes a procedure called menuload, which is allowed to modify that specification before Tkabber uses it.

      The default version of this procedure is the identity function, i.e..,

      proc menuload {description} { return $description }
      

      If you really want to change the menubar specification, then here's how to get started:

      1. Go to where you installed the BWidget library and take a look at the file called "BWman/MainFrame.html". The documentation for the "-menu" option explains the syntax of the specification.
      2. Go to where you installed Tkabber and take a look at the file called "iface.tcl". Look for the line that starts with "set descmenu". This will show you the specification given to your menuload procedure.
      3. Go to where you installed Tkabber and take a look at the file called "examples/mtr-config.tcl". Look at the menuload procedure defined there. It lays out Tkabber's menu bar similar to Gabber's.
      4. Finally, study the procedures listed here.

      5.3.1. The Avatar Module

      The procedure called avatar::store_on_server stores your avatar on the server.

      5.3.2. The Browser Module

      The procedure called browser::open opens a new browser window.

      5.3.3. The Groupchat Module

      The procedure called add_group_dialog displays a dialog window when you want to add a groupchat to your roster. Similarly, the procedure called join_group_dialog displays a dialog window when you want to join a groupchat.

      5.3.4. The Login Module

      The procedure called show_login_dialog displays a dialog window when you want to login to the server. (Prior to attempting to login, if necessary it will logout). Naturally, the procedure called logout does just that; however, if you want get a dialog window for confirmation, use show_logout_dialog instead.

      5.3.5. The Message Module

      If you want to send a message to someone, the procedure called message::send_dialog will put up a dialog window. It takes upto three optional arguments: the recipient JID, the subject, and the thread.

      If you want to get added to someone's roster, the procedure called message::send_subscribe_dialog will put up a dialog window. It takes one optional argument: the recipient JID.

      5.3.6. The Presence Module

      If you want to display information about a user, the procedure called userinfo::open will put up a dialog window. It takes two optional arguments: the user's JID; and, whether or not the dialog window should be editable.

      Obviously, the second argument makes sense only if it's your own information, i.e.,

          global loginconf
      
          userinfo::open \
              ${loginconf(user)}@$loginconf(server)/$loginconf(resource) 1
      

      There are also two variables that you can use to set your own presence: userstatus and textstatus. The first variable takes one of five values:

      • available;
      • chat;
      • away;
      • xa;
      • dnd; or,
      • invisible.

      The second variable takes any textual value.

      Changes to your presence information are propagated only when userstatus is changed. Accordingly, if you make a change to textstatus, be sure to write userstatus immediately afterwards, even if it's a no-op, e.g.,

          global userstatus textstatus
      
          set textstatus "Out to lunch"
          set userstatus $userstatus
      

      5.3.7. Miscellany

      Finally, you can use the procedure named help_window to display some textual help. This procedure takes two arguments: the title for the window; and, the text to display.

      Also, instead of calling exit to terminate Tkabber, please use the quit procedure instead.

      5.4. Final-Load

      Finally, right before Tkabber goes to display the login dialog, it invokes a procedure called finload, which does whatever you want it to.

      6. Extensibility

      In addition to various configuration mechanisms, Tkabber lets you define procedures, termed "hooks" that get run when certain events happen.

      Here's an example. When Tkabber receives a chat message, how does it know what to process and what to draw? The short answer is that it doesn't need to know anything, all it does is:

      hook::run draw_message_hook $chatid $from $type $body $extras
      

      The hook::run procedure invokes whatever hooks have been defined for draw_message_hook. In fact, more than ten procedures may get invoked to satisfy this hook!

      Here's how it works: Tkabber comes with a number of plugins, which get loaded automatically. Each plugin makes one or more calls that look like this:

      hook::add draw_message_hook [namespace current]::my_draw_hook $prio
      

      where the last two parameters are: the name of a procedure to run; and, a relative integer priority.

      When hook::run is invoked for draw_message_hook, each of these procedures is called, in the priority order (from smallest to largest). If one of the procedures wants to prevent the later procedures from being called, it returns the string "stop".

      To continue with the example, in between the pre-load and post-load stages of configuration, the following calls get made by different plugins:

      hook::add draw_message_hook [list ...::events::process_x 0] 0
      hook::add draw_message_hook ...::chatstate::process_x 1
      hook::add draw_message_hook ...::check_draw_empty_body 4
      hook::add draw_message_hook ...::chat_open_window 5
      hook::add draw_message_hook [list ...::events::process_x 1] 6
      hook::add draw_message_hook ...::draw_signed 6
      hook::add draw_message_hook ...::draw_encrypted 7
      hook::add draw_message_hook ...::handle_error 10
      hook::add draw_message_hook ...::handle_info 10
      hook::add draw_message_hook ...::draw_timestamp 15
      hook::add draw_message_hook    ::logger::log_message 15
      hook::add draw_message_hook ...::set_message_timestamp 15
      hook::add draw_message_hook ...::add_number_of_messages_to_title 18
      hook::add draw_message_hook ...::chat_message_notify19
      hook::add draw_message_hook ...::handle_server_message 20
      hook::add draw_message_hook ...::roster::update_chat_activity 50
      hook::add draw_message_hook ...::check_nick 60
      hook::add draw_message_hook    ::wmdock::msg_recv 70
      hook::add draw_message_hook ...::handle_last_nick 79
      hook::add draw_message_hook ...::add_bookmark 80
      hook::add draw_message_hook ...::handle_me 83
      hook::add draw_message_hook ...::xhtml::draw_xhtml_message 85
      hook::add draw_message_hook ...::draw_normal_message 87
      

      Many of these procedures look at the incoming chat message and operate on only certain kinds of messages. Some of these procedures may return "stop", e.g., handle_me which handles chat bodies that start with "/me" and draw_xhtml_message which visualizes XHTML formatted messages. (In this example, the actual namespaces were replaced with "...:" to make it more readable).

      Now let's look at the different kind of hooks that Tkabber knows about.

      6.1. Message Hooks

      When Tkabber receives a message stanza it calls two hooks:

      rewrite_message_hook \
          xlib from id type is_subject subject body err thread priority x
      process_message_hook \
          $xlib $from $id $type $is_subject $subject $body $err $thread \
          $priority $x
      

      The first hook takes eleven variable names as arguments, so the calling procedures can rewrite them. This means that a procedure in this hook should call upvar 2 $varbody body and use the body variable to change the actual message body. For example, this allows Tkabber to put decrypted message into the body variable if it is encrypted.

      The second hook does the job of showing message to the user (or doing something else with it if it's a special message like part of an in-band file transfer.

      When you are about to send a chat or normal message to the wire, a hook is run:

      rewrite_outgoing_message_hook xlib to id type subject body err thread x
      

      The hook takes nine variable names as arguments, so the calling procedures can rewrite them. This means that a procedure in this hook should call upvar 2 $varbody body and use the body variable to change the actual message body. For example, this allows Tkabber to encrypt message and put the encrypted message into the body variable to send. This hook is introduced in Tkabber 1.1, and is used by the OTR plugin, so the latter will not work in Tkabber 1.0 and older.

      6.2. Chat Hooks

      When Tkabber decides that it needs to open a (tabbed) window for a chat or groupchat, two hooks are run:

      open_chat_pre_hook  $chatid $type
      open_chat_post_hook $chatid $type
      

      Both hooks are given two parameters: the chatid (ID of the chat or conference room window, you always can obtain JID using chat::get_jid and connection token using chat::get_xlib routines); and, and the type of chat (either "chat" or "groupchat").

      Similarly, when Tkabber encounters activity on a tabbed window, a hook is run:

      raise_chat_tab_hook $path $chatid
      

      The hook is given two parameters: the path of the Tk widget for the tabbed window; and, the chatid of the chat or conference room window.

      When you want to send a chat message, a hook is run:

      chat_send_message_hook $chatid $user $body $type
      

      The hook is given four parameters: the chatid of the recipient; the localpart of your login identity; the body of the message; and, the type of chat.

      draw_message_hook $chatid $from $type $body $extras
      

      The hook is given five parameters: the chatid of the sender window (JID includes a resource); the JID of the sender (without the resource); the type of chat; the body of the message; and, a nested-list of additional payload elements. (This last parameter isn't documented in this version of the documentation.)

      Chat windows have menubuttons, and two hooks are used to add items in menu:

      chat_create_user_menu_hook $path $xlib $jid
      chat_create_conference_menu_hook $path $xlib $jid
      

      The first is used in user chat windows, and second in groupchat ones. Hooks are given three parameters: the path of the Tk menu widget; connection token; and, the JID of user or conference.

      In groupchat windows it is possible to complete participants' nicks or commands by pressing TAB key. List of completions is generated by running this hook:

      generate_completions_hook $chatid $compsvar $wordstart $line
      

      The hook is given four parameters: the chatid of conference window; name of global variable, in which current list of possible completions is stored; index of position where completion must be inserted; and content of text widget where completion is requested.

      When someone enters/exits conference, the following hooks are called:

      chat_user_enter $group $nick
      chat_user_exit  $group $nick
      

      The hooks are given two parameters: chatid of conference and nick of participant.

      When someone changes his/her nickname in a conference room, the following hook is called:

      room_nickname_changed_hook $chatid $nick $new_nick
      

      The hook is given three parameters: chatid of conference old nickname and the new nickname of participant.

      6.3. Login Hooks

      Two hooks are invoked whenever a session is connected or disconnected:

      connected_hook $xlib
      
      disconnected_hook $xlib
      

      Both hooks are given one parameter: connection token (Tkabber allows several connections at once).

      6.4. Presence Hooks

      When our presence status changes, a hook is run:

      change_our_presence_post_hook $status
      

      The hook is given one parameter: the new presence status value, i.e., one of:

      • available;
      • chat;
      • away;
      • xa;
      • dnd; or
      • unavailable.

      Similarly, when someone else's presence changes, a hook is run:

      on_change_user_presence_hook $label $status
      

      The hook is given two parameters: the label associated with the JID (e.g., "fred") or the JID itself (e.g., "fred@example.com") if no label exists in the roster; and, the user's new status.

      And for all received presence packets, a hook is run:

      client_presence_hook $xlib $from $type $x $args
      

      The hook is given four parameters: connection token, who send this presence, type of presence (e.g., "error", "unavailable"), list of extended subtags and parameters of this presence (e.g., "-show xa -status online").

      6.5. Info/Query Hook

      When an IQ stanza is received, a hook is run:

      client_iq_hook $xlib $from $type $queries $args
      

      The hook is given four compulsory parameters: connection token, who sent this query/response type of stanza (e.g., "get", "set", "result" or "error"), list of query subelements (usually it contains only one element), list of optional arguments (e.g., "-lang language -to jid -id id -x $list_of_other_attributes").

      6.6. Roster Hooks

      When an item is added to the roster window, one of the four hooks is run to add stuff to the menu associated with that item:

      roster_conference_popup_menu_hook $path $xlib $jid
      
      roster_service_popup_menu_hook $path $xlib $jid
      
      roster_jid_popup_menu_hook $path $xlib $jid
      
      roster_group_popup_menu_hook $path $xlib $name
      

      When run, each hook is given three parameters: the path of the Tk menu widget; the connection token; and, a JID of the roster item (or the name of the roster group for the last one).

      Also the following hook is run to add stuff to the menu in groupchats:

      roster_create_groupchat_user_menu_hook $path $xlib $jid
      

      The hook is given three parameters: the path of the Tk menu widget; the connection token; and, a JID of user.

      The following hook is run to add stuff to the popup balloon for each roster item:

      roster_user_popup_info_hook $varname $xlib $jid
      

      The hook is given three parameters: the variable name in which current popup text is stored, the connection token, and the JID of the roster item.

      6.7. Miscellaneous Hooks

      There are three "obvious" hooks:

      postload_hook
      
      finload_hook
      
      quit_hook
      

      The first two, by default, run the postload and finload procedures, respectively. postload_hook is run after all code has been loaded and before initializing main Tkabber window. After that finload_hook is run. The final hook is called just before Tkabber terminates (cf., Section 5.3.7).

      You can add custom pages to userinfo window using

      userinfo_hook $path $xlib $jid $editable
      

      It is run with four arguments: the userinfo notebook widget name; the connection token; the JID of the user; and a boolean parameter which indicates whether the form is editable.

      7. User Interface basics

      7.1. Searching

      Search panel may be invoked in certain classes of Tkabber windows using the <<OpenSearchPanel>> Tk virtual event which is bound by default to the <Control-S> keyboard command.

      Search panel can be dismissed by pressing the <Escape> key and the default search action ("search down") is activated by pressing the <Return> key while entering the search pattern.

      Search panel is currenlty available in:

      • Chat and groupchat windows;
      • Service discovery window;
      • Chat history logs;
      • All windows of the "Chats history" tool.
      • Headlines window.
      • Raw XML log window.
      • MUC affiliations and roles lists.

      Searching may be customized using the settings located under the Plugins → Search group of the Customize window. These setings are:

      • ::plugins::search::options(case): perform case-sensitive searching (off by default);
      • ::plugins::search::options(mode): selects searching mode which can be one of:
        • substring — use simple substring search: the typed search string is taken verbatim and then the attempt to locate it is performed. This is the default mode.
        • glob — uses "glob-style" (or "shell-style") matching: special symbols are recognized and they provide for "wildcarding":
          • * matches zero or more characters;
          • ? matches exactly one character;
          • [ and ] define character classes, e.g., [A-Z] will match any character in the series "A", "B", ... "Z".

          The full syntax is described in

          Tcl string manual page. That is, this search mode can be convenient for those who want more general yet simple approach to searching and is familiar with the "shell globbing" concept found in Unix shells.
        • regexp — provides for searching using full-blown regular expressions engine. The full syntax is described in Tcl re_syntax manual page.

      Appendix A. Releases History

      A.1. Main changes in 1.1.2+

      • Dropped Tcl/Tk 8.4 support. Now Tcl/Tk 8.5 is required

      A.2. Main changes in 1.1.2

      • Fixed a bug in displaying search results and copying JID from the search results to clipboard
      • Fixed a few bugs with nonexistent canvas tags in Georoster and Poker plugins
      • Fixed a restoring user status from autoaway
      • A few other fixes and minor enhancements
      • This is the last release which supports Tcl/Tk 8.4 (with the exceptions of the OTR and Poker plugins)

      A.3. Main changes in 1.1.1

      • Fixed a few bugs in passing URL to web browsers
      • Fixed a regression when message intended to be GPG-encrypted is sent plaintext
      • Fixed a few crashes in OTR plugin
      • A few other fixes and enhancements

      A.4. Main changes in 1.1

      • Added new OTR plugin (requires Tcl/Tk 8.5 to operate)
      • Roster versioning (XEP-0237 and RFC-6121)
      • Added new Battleship game plugin
      • A few fixes and enhancements

      A.5. Main changes in 1.0

      • Completely rewritten Tkabber internals
      • Dropped Tcl/Tk 8.3 support. Now Tcl/Tk 8.4 is required
      • Partial IPv6 support (requires Tcl/Tk 8.6)
      • Switched from TclGPGME to TclGPG for encryption and signing
      • Added new connection method BOSH (XEP-0124 and XEP-0206)
      • Disabled SSLv2 and enabled TLSv1 TLS options
      • Added user nicknames (XEP-0172) support.
      • Updated the CAPTCHA forms (XEP-0158) support
      • Added metacontacts (XEP-0209) support
      • Implemented multiple proxy profiles
      • Implemented remote controlling from a locally executed script
      • Added new plugins: floatingcontact, poker
      • Rewritten most plugins to support disabling and unloading on the fly
      • A few interface enhancements (search in MUC affiliations lists, proxy management)
      • Many fixes and enhancements

      A.6. Main changes in 0.11.1

      • New default sound theme by Serge Yudin
      • Added new plugins: quotelastmsg, singularity, stripes
      • Many fixes and enhancements

      A.7. Main changes in 0.11.0

      • New tabbed user interface. Tab headers now occupy several rows and tab bar can be docked to the left and right sides of chat window
      • Roster filter
      • Added support for pixmaps (in particular emoticons) JISP archives (XEP-0038)
      • Added support for SOCKS4a and SOCKS5 proxy for the main connection
      • Added user location support (XEP-0080)
      • Added user mood support (XEP-0107)
      • Added user activity support (XEP-0108)
      • Added user tune support (XEP-0118)
      • Added entity capabilities (XEP-0115 v.1.5, only reporting) support
      • Added basic robot challenges support (XEP-0158, v.0.9)
      • Added partial data forms media element support (XEP-0221, v.0.2, URIs and images only)
      • Roster is now exported to XML instead of Tcl list
      • Added support for entity time (XEP-0202)
      • Tkabber version is now reported in disco#info (XEP-0232)
      • Moved deprecated Jabber Browser (XEP-0011) to an external plugin
      • Moved Jidlink file transfer to an external plugin
      • Added several new plugins: attline, ctcomp, custom-urls, floatinglog, gmail, openurl, presencecmd, receipts
      • Many fixes and enhancements

      A.8. Main changes in 0.10.0

      • New artwork by Artem Bannikov
      • Mediated SOCKS5 connection support for file transfer (XEP-0065)
      • Blocking communicaation with users not in roster (using XEP-0016 via simple interface)
      • Translatable outgoing error messages support (based on recipient's xml:lang)
      • Remote controlling clients support (XEP-0146)
      • Extended stanza addressing support (XEP-0033)
      • New chats history tool with search over the all chatlog files
      • Roster item icons are chosen based on Disco queries to item server
      • Search in Disco, Browser, Headlines, RawXML, and Customize windows
      • New internal plugins: abbrev allows to abbreviate words in chat input windows, postpone stores/restores current input window content
      • New external plugins (aniemoticons, latex, tkabber-khim, traffic, renju)
      • Emoticons theme now can be loaded using GUI
      • Most Tkabber's tabs can now be stored on exit and restored on start
      • XMPP ping support (XEP-0199). Reconnecting based on XMPP ping replies
      • Delayed delivery now recognizes XEP-0203 timestamps
      • Added optional 'My Resources' roster group, which contains other connected resources of the same JID
      • Many fixes and enhancements

      A.9. Main changes in 0.9.9

      • Improved privacy lists interface
      • Support for stream compression (XEP-0138)
      • Support for SRV DNS-records
      • Support for TXT DNS-records (XEP-0156)
      • Support for ad-hoc commands (XEP-0050)
      • Improved headlines support
      • Chat state notification support (XEP-0085)
      • Many fixes and enhancements

      A.10. Main changes in 0.9.8

      • Support for STARTTLS
      • Reorganized menu
      • Support for searching in chat window
      • Support for annotations about roster items (XEP-0145)
      • Support for conference rooms bookmarks (XEP-0048)
      • Added multilogin support for GPGME
      • Better support for xml:lang
      • Support for service discovery extensions (XEP-0128)
      • Support for NTLM authentication
      • Many fixes and enhancements

      A.11. Main changes in 0.9.7beta

      • Updated support for file transfer (XEP-0095, XEP-0096, XEP-0047, XEP-0065)
      • Support for colored nicks and messages in conference
      • Better multiple logins support
      • Updated support for xml:lang
      • Support for IDNA (RFC3490)
      • Many fixes and enhancements

      A.12. Main changes in 0.9.6beta

      • Multiple logins support
      • History now splitted by month
      • Animated emoticons support
      • Many user interface improvements
      • More XMPP support
      • More translations
      • Bugfixes

      A.13. Main changes in 0.9.5beta

      • Nested roster groups
      • Messages emphasizing
      • User interface improvements
      • Support for XMPP/Jabber MIME Type
      • Bugfixes

      Appendix B. Tk option database resources

      Here is list of the most essential Tkabber-specific Tk option database resources that you need to change look:

      Tkabber.geometry
      Geometry of main window.
      *Chat.chatgeometry
      *Chat.groupchatgeometry
      *Customize.geometry
      *RawXML.geometry
      *Stats.geometry
      *Messages.geometry
      *JDisco.geometry
      Geometry of various windows (when not using tabs).
      *mainRosterWidth
      The width of the main roster window.
      *Chat.inputheight
      *RawXML.inputheight
      Height of input windows in chat and raw XML windows.
      *Balloon.background
      *Balloon.foreground
      Background and foreground colors of popup balloon.
      *Balloon.style
      Behaviour of popup balloon: can be delay (balloon appeared after some time) and follow (balloon appeared immediately and follows mouse).
      *JDisco.fill
      Color of service discovery browser item name.
      *JDisco.identitycolor
      Color of service discovery browser item identity.
      *JDisco.featurecolor
      Color of service discovery browser entity feature.
      *JDisco*Tree*background
      Background of service discovery browser.
      *Chat.meforeground
      Color of user's messages in chat windows.
      *Chat.theyforeground
      Color of other peoples messages in chat windows.
      *Chat.serverlabelforeground
      Color of label before server message.
      *Chat.serverforeground
      Color of server messages in chat windows.
      *Chat.errforeground
      Color of error messages in chat windows.
      *Chat.urlforeground
      Color of URLs in chat windows.
      *Chat.urlactiveforeground
      Color of mouse highlighted URLs in chat windows.
      *JDisco.fill
      Default color of items in Service Discovery Browser.
      *JDisco.featurecolor
      Default color of feature items in Service Discovery Browser.
      *JDisco.identitycolor
      Default color of identity items in Service Discovery Browser.
      *JDisco.optioncolor
      Default color of option items in Service Discovery Browser.
      *JDisco*Tree*background
      Default color of background in Service Discovery Browser.
      *alertColor0
      *alertColor1
      *alertColor2
      *alertColor3
      Tabs alert colors.
      *Roster.cbackground
      Roster background color.
      *Roster.groupindent
      Indentation for group title.
      *Roster.groupiconindent
      Indentation for group icon.
      *Roster.jidindent
      Indentation for item name.
      *Roster.jidmultindent
      Indentation for item with multiple resources.
      *Roster.subjidindent
      Indentation for item resource.
      *Roster.iconindent
      Indentation for item icon.
      *Roster.subitemtype
      *Roster.subiconindent
      Indentation for resource icon.
      *Roster.textuppad
      Top pad for item's names.
      *Roster.textdownpad
      Bottom pad for item's names.
      *Roster.linepad
      Vertical distance between items.
      *Roster.foreground
      Color of item's names.
      *Roster.jidfill
      Background of roster item.
      *Roster.jidhlfill
      Background of roster item when mouse is over.
      *Roster.jidborder
      Color of item's border.
      *Roster.groupfill
      *Roster.grouphlfill
      *Roster.groupborder
      The same to roster groups.
      *Roster.groupcfill
      Background color of collapsed group.
      *Roster.stalkerforeground
      *Roster.unavailableforeground
      *Roster.dndforeground
      *Roster.xaforeground
      *Roster.awayforeground
      *Roster.availableforeground
      *Roster.chatforeground
      Colors of item name for different presences.

      Appendix C. Documentation TODO

      The next revision of this documentation should discuss:

      • Post-load:
        • chat_height and chat_width (appear to be no-ops).
      • Menu-load:
        • change_password_dialog
        • conference::create_room_dialog
        • disco::browser::open_win
        • message::send_msg
        • privacy::request_lists
        • rawxml::open_window
        • userinfo::show_info_dialog
      • Hooks: the additional payload format.

      Appendix D. Acknowledgements

      Rebecca Malamud was kind enough to design the "enlightened feather" motif used in the Tkabber look-and-feel.

      The "new look" appeared in the 0.10.0 release ("golden feather" and "blue feather" pixmap themes and the "Earth bulb" logo) was designed by Artem Bannikov.

      The new sound theme appeared in 0.11.1 release was created by Serge Yudin

      Appendix E. Copyrights

      Copyright © 2002-2025 Alexey Shchepin

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

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

      Authors' Addresses

      Alexey Yurievich Shchepin Process-One EMail: alexey@process-one.net
      Marshall T. Rose Dover Beach Consulting, Inc. POB 255268 Sacramento, CA 95865-5268 US Phone: +1 916 483 8878 Fax: +1 916 483 8848 EMail: mrose@dbc.mtview.ca.us
      Sergei Golovan New Economic School EMail: sgolovan@nes.ru
      Michail Yurievich Litvak Colocall Ltd. EMail: mci@shadow.in.ua
      Konstantin Khomoutov Service 007 EMail: khomoutov@gmail.com
      tkabber/doc/tkabber.xml000064400000000000000000003530351477701321300147630ustar00nobodynobody Tkabber 1.1.2+ Process-One
      alexey@process-one.net
      Dover Beach Consulting, Inc.
      POB 255268 Sacramento CA 95865-5268 US +1 916 483 8878 +1 916 483 8848 mrose@dbc.mtview.ca.us
      New Economic School
      sgolovan@nes.ru
      Colocall Ltd.
      mci@shadow.in.ua
      Service 007
      khomoutov@gmail.com
      Tkabber is an open source Jabber client, written in Tcl/Tk. This memo describes the installation, configuration, and extension of Tkabber.
      Tkabber provides a Tcl/Tk interface to the Jabber/XMPP instant messaging and presence service. Tcl/Tk is a graphical scripting language that runs on the Unix, Windows, and Macintosh platforms. The choice of Tcl/Tk for a Jabber client is three-fold: it is portable: once you install a Tcl/Tk interpreter on your system, the Tkabber script "just runs" — without having to compile anything; it is customizable: Tkabber reads a configuration file when it starts that tells it the settings of various parameters; and, it is extensible: the configuration file is actually a Tcl script, so you can replace or augment entire portions of Tkabber (if you're so inclined). Tkabber is fully-featured: TCP, BOSH and HTTP-polling session transports XMPP SRV and TXT DNS-records handling hashed passwords SASL authentication encrypted sessions (if you install an optional extension) compressed sessions (if you install an optional extension) login via SOCKS4a, SOCKS5 or HTTPS proxy IPv6 support (from Tcl/Tk 8.6) user-defined hooks for connection establishment and release XMPP/Jabber MIME type privacy rules GPG-signed/encrypted messages (if you install an optional extension) Off-the-record (OTR) messaging file transfers (HTTP, SOCKS bytestream, DTCP and IBB transports) groupchat (GroupChat-1.0 and Multi-User Chat conferencing protocols) headline messages message events completions of nick and commands hyperlinks emoticons user-defined hooks for messages arriving and chat window events signed presence (if you install an optional extension) avatars browsing groupchat and roster invitations conference room bookmarks annotations about roster items vCards user-defined hooks for presence changes configurable look-and-feel via a resources database unicode tabbed/non-tabbed interface sound notifications nested roster groups roster metacontacts auto-away for Unix: spell checking, KDE or freedesktop docking, and WMaker icons for Windows: taskbar icons
      You should already have installed: Tcl/Tk version 8.5.8 (or later, Tcl/Tk 8.6.3 or later is recommended). Note, that if you want to use Tkabber in IPv6 environment, you'll have to install Tcl/Tk 8.6. tcllib version 1.8 (or later, tcllib 1.16 or later is required for SCRAM SASL mechanism support). BWidget 1.9 (or later) Most systems already come with these packages pre-installed. If not, various Unix systems have them available as ready-made packages. Otherwise, go to the URLs above and click on the appropriate download link for your system. Both tcllib and BWidget are script libraries — no compiling is necessary. In the case of Tcl/Tk, there are many ready-made binary packages available on the download site. The ActiveTcl distribution contains all three packages (along with the tls and Img package mentioned below); so, you may want to use that instead of three separate downloads. At your discretion, there are several optional packages that you may also install. Tkabber will run just fine without them, but if they're available Tkabber will make additional features available to you. So, here's the list: By default, the Tcl's DNS package uses TCP for its communication with DNS servers. If your DNS server requires usin UDP then you may want to install Tcl UDP extension version 1.0.8 (or later). This extension works both for Unix and Windows. By default, communications between the server and client take place over a plaintext connection. While this may not be a problem in some local, wired environments, if your server is distant or your client is wireless, then you may want to encrypt all the client/server traffic. Accordingly, you may to install tls version 1.4.1 (or later). This package works on both Unix and Windows. Note that if you're using Unix, then you'll also need to have OpenSSL installed. Fortunately, this comes preinstalled on many Unix systems. If it's not on your system, check OpenSSL source page. (The Windows distribution of tls comes with all the necessary DLLs.) Tcl/Tk supports only a small number of image formats (i.e., bitmaps, GIFs and portable pixmaps). If presence information contains avatars, these may be in other formats (e.g., PNGs or JPGs). Accordingly, you may want to install Img version 1.2 (or later). This package works on both Unix and Windows. Tkabber comes bundled with pure-Tcl XML parser. If its performance is insufficient, you may want to install tDOM version 0.8.0 (or later) and use expat based XML parser. Another option in Unix is to compress connection between client and server (it currently disables encryption). There's no special requirements for traffic compression in Tcl/Tk 8.6, but if you're using Tcl/Tk 8.5 and want to compress traffic you should install ZTcl version 1.0b4 (or later) and Tclmore version 0.7b1 (or later). (At the time of 0.11.0 release ZTcl and Tclmore home page were unavailable, so you may grab them from a mirror.) By default, end-to-end communications between two or more Jabber clients is plaintext. Depending on your environment, this may not be a problem for you. Alternatively, you may want to digitally-sign all of your outgoing messages, and allow others to encrypt their messages to you. Accordingly, you may want to install the TclGPG package. Depending on what's already installed on your system, you may have to download upto two software bits: TclGPG (available only in a Fossil repository at present); GPG version 1.0.7 (or later). Another alternative is to use Off-the-record messaging protocol, if your contact supports it. The OTR plugin is included into Tkabber plugins collection starting from version 1.1 and requires a few packages from Tcllib, namely the aes, asn, base64, math::bignum, sha1, sha256 packages. Also, if you're using Windows, the Memchan extension has to be installed to run the OTR plugin. If you're running Unix or Windows, then you may want Tkabber to play predefined sounds when message or presence arrives. Accordingly, you may want to install Snack version 2.2.10 (or later). If you're running Unix, then you may want Tkabber to use the docking tray. Accordingly, you may want to install tktray version 1.3 (or later) for freedesktop icon (supported by modern KDE and GNOME). If you're running Windows, then you may want Tkabber to use the system tray. Accordingly, you may want to install Winico version 0.6 (or later). If you're a Tcl/Tk guru, then you may want to access the Tk console to debug things. Accordingly, you may want to install tkcon version 2.3 (or later). Please keep in mind that these are all "optional extras" — if they're not right for you or your environment, don't bother with them!
      Latest stable version is 1.1.2 and available at http://tkabber.jabber.ru/download. Older versions can be found at http://files.jabber.ru/tkabber/.
      You can always find the latest development version via Fossil. Execute the following commands:
      And if you want to test some plugins, then do
      And if you want to try unofficial plugins, then execute They usually include short readme with info on what they do and how to use them.
      If you use the Debian GNU/Linux distribution, you may want to get all required packages by using apt. Just execute
      or to get the version included into Debian repository.
      No real installation is required, simply copy the tkabber/ directory to a commonly-available area, and then either: put this directory in your search-path; or, make a calling script/shortcut to the file tkabber.tcl in that directory. Although Tkabber comes with a Makefile, there's really not much to do — most folks prefer to simply copy the distribution directory to somewhere in their home directory.
      From the shell, you can invoke Tkabber as: whilst on a windowing system, simply double-click on that file or a short-cut to it.
      If you're a Tcl/Tk guru and have installed tkcon, then you may want to invoke Tkabber as: Tkabber will automatically know that it's running under tkcon and will start by hiding the Tk console window. Look under the Services->Debug tools menu to find the checkbutton to show the console. Note that if Tkcon is installed as a Tcl/Tk package then Tkabber will add corresponding menu item under Services->Debug tools automatically.
      Also you can setup Tkabber as handler for XMPP/Jabber MIME Type . For this you need to set hanler for application/xmpp+xml MIME type in your browser to something like this: tkabber -mime %s
      Upgrading Tkabber from version 1.0 doesn't require configuration changes. You are advised to upgrade external plugins but it isn't strictly necessary.
      When upgrading Tkabber from version 0.11.1 or earlier note that its plugin interface and several configuration options have been changed.
      There are incompatible changes in Tkabber internals, which break the old plugins. So, you'll have to upgrade them as well. If a plugin author hasn't released a version compatible with Tkabber 1.1 then you'll have to disable or remove that plugin.
      There are notable changes in specifying a set of proxy servers. If you define proxy server in the global loginconf array then you'll have to do the following: In case if you use the Customize interface, you may open the Manage proxy servers dialog window and add your proxy server there. Note that if you're using the HTTPS proxy then you'll have to add it twice (one in the Tunnel proxies tab and the other in the HTTP proxies tab, see section 'The proxy module' below). If you define proxy server in the Tkabber config file then you have lines similar to the following in the config:
      Replace them by the following: which will instruct Tkabber to use these proxies for all connections. If you need more complicated setup with several proxy profiles, read section 'The proxy module' below.
      When upgrading Tkabber from version 0.10.0 or earlier read the above section on plugins and also note that several configuration options and user interface elements have been changed.
      There are notable changes in handling connection through proxy servers, managing fonts and balloon colors, and detecting breaks in underlying TCP connection to a server.
      Since SOCKS4 and SOCKS5 proxy types were implemented in addition to HTTP proxy type, the whole set of connection options regarding proxy servers has been changed. This means that after upgrade the old values stored using the Customize mechanism will be lost and the same values in loginconf arrays will not be recognized any longer. To learn how to adapt your current proxy settins to the current Tkabber version, read section above, but remember that variables in the loginconf array mentioned there have been changed between 0.10.0 and 0.11.0. Use the map below as a reference which variable should actually be used: Variable "httpproxy"in 0.10.0 became "proxyhost" in 0.11.0. Variable "httpport" became "proxyport". Variable "httplogin" became "proxyusername". Variable "httppassword" became "proxypassword".
      Fonts handling has been partially reworked: the global variable font that controls chat and roster fonts has been removed and now Tkabber relies on Tk option database to manage these settings. You can override roster and chat fonts independently of each other. To do that on systems not based on X Window use Customize options described below. The main consequence of this change is that now the fonts are taken from Tk option database and if it contains sane values you don't need to touch anything (until the update you had to tweak the font variable because it was set to font "fixed" by default). The variable font does not have any special meaning starting from 0.11.0 release. The second consequence is that you are now able to set fonts for chat and roster windows separately from each other using this list as a reference: *font Tk option database resource sets default font for all widgets used in Tkabber. *Chat*Text.font Tk option database resource can be used to override font used for chat windows. This resource can be overridden by the ::ifacetk::options(font) option from the "Main Interface" group of Customize settings. *Roster*font Tk option database resource can be used to override font used for roster windows. This resource can be overridden by the ::ifacetk::options(roster_font) option from the "Main Interface" group of Customize settings.
      Keep-alive mechanism that was used to keep NATP devices from disconnecting idle XMPP sessions was accompanied in 0.10.0 with "XMPP ping" mechanism which also implemented dead link detection with support for disconnecting upon detection of network outage. In version 0.11.0, the old keep-alive mechanism has been dropped, so the following two global options have no effect now: keep_alive keep_alive_interval In order to get the same functionality, enable XMPP ping using these options in the "IQ" group of Customize settings: Enabling ::plugins::ping::options(ping) will make Tkabber periodically send xmpp:ping IQ request to the server. Set ::plugins::ping::options(timeout) option to a number of seconds Tkabber should wait for either a xmpp:ping reply or an error to arrive from the server; if there is no answer from the server during this timeout, the socket for this connection will be forcibly disconnected.
      Resources controlling the appearance of balloon windows have been made more generic. If you use custom Tk option database settings for balloon windows, change the relevant resources using this map: Change references to *Balloon.background and *Balloon.foreground resources to *Balloon*background and *Balloon*foreground, respectively. Change references to *Balloon*padX and *Balloon*padY resources to *Balloon.text.padX and *Balloon.text.padY, respectively.
      Support for TclXML as an external XML parser has been removed (since TclXML has anyway been unable to support partial XML processing) along with the global variable use_external_tclxml which controlled the loading of TclXML. Now expat-based Tcl package tDOM is supported as an external XML parser. It is enabled by default if it is installed.
      There are notable changes in systray mouse gestures, appearance of a main tabbed window, and in behavior of paned window splitters.
      Mouse gestures bound to system tray (system notification area) icon have been reworked: Single click on it with the left mouse button now unconditionally brings the main Tkabber window to front, possibly deiconifying it first. Single click with the middle mouse button now unconditionally iconifies the main Tkabber window. This differs from the previois behaviour where single click with the left mouse button on Tkabber's system tray icon toggled the iconified/visible state of the main Tkabber window.
      The notebook widget which was used to render tabs in tabbed interface mode has been replaced with a new custom widget providing the ability for multi-row placement of tabs and docking them to the left or right sides of the chat window (in addition to top or bottom docking available in 0.10.0 version and earlier). If you adjusted any specific Tk option database resources pertaining to that notebook widget, you have to change them keeping in mind that the new widget is just a bunch of Tk buttons (class Button) placed in a frame (called .nb as before). The class name for the new widget is ButtonBar. So if you explicitly set, say *Notebook*font option, you have to change it to *ButtonBar*font and so on.
      Window splitters (thin vertical and horizontal windows used to change relative sizes of windows between which a splitter is placed) have been changed to "Windows" style. This differs from previous "Motif" style which implemented explicit "grip box" on each splitter which was the only "active point" of a splitter.
      When upgrading Tkabber from version 0.9.9 or earlier read the above section and also note the following: On Macintosh or Microsoft Windows Tkabber will copy it's configuration directory to a new location (see the next section for details). If the transfer of the config directory goes smoothly you may delete old "~/.tkabber" directory and replace its name in your config file by $::configdir. Also, Tkabber will convert chatlogs directory to a new format. Also, Tkabber changed the way it works with emoticons. Instead of loading them in config file you may put you faivorite emoticons directory into $::configdir/plugins directory, restart Tkabber and then choose emoticons set using Customize GUI.
      Tkabber maintains its configuration using a set of files placed in a special configuration directory which location depends on the operating system Tkabber runs on. These locations are: Unix systems: "~/.tkabber"; Macintosh: "~/Library/Application Support/Tkabber"; Under Microsoft Windows this location is governed by the policy of the particular flavor of this OS, but the general rule is that the Tkabber configuration directory is named "Tkabber" and is located in the special system folder for storing application-specific data. For example, under Windows XP this will be something like "C:\Documents and Settings\USERNAME\Application Data\Tkabber", where "USERNAME" is the login name of a particular operating system's user. Tkabber also honors the value of the "TKABBER_HOME" environment variable — if it exists the whole OS-based guessing of the configuration directory location is cancelled and the value of this environment variable is used instead. Once the pathname of the Tkabber configuration directory is known, its value is assigned to the "configdir" global Tcl variable which can be accessed from within the main Tkabber configuration file (see below). One of the first things that Tkabber does when it's starting up is reading a file located in its configuration directory under the name "config.tcl". This is a Tcl source file, so obviously, it's a lot easier to maintain this file if you know the Tcl programming language. If you're not familiar with it, that's okay — most things you'll need to do are pretty simple! (In fact, if you don't have your own configuration file, you'll get the vanilla Tkabber, which hopefully you'll find quite usable.) Note that almost all Tkabber options can be cofigured using graphical interface (menu Tkabber->Customize), so editing configuration file is not strictly necessary. Tkabber is configured in four stages: in the pre-load stage, configuration options which guide the loading process are set; in the post-load stage, configuration options for each module are set; in the menu-load stage, the user is given an option to re-arrange Tkabber's menu bar; and, the final-load stage allows any last changes to be made before the "login" dialog window is displayed to the user. Let's look at each, in turn.
      There are a few things that you may let Tkabber know immediately. These are:
      The first of these options, ifacetk::options(use_tabbar), tells Tkabber whether you want a tabbed interface or not. If not, here's what to put in your configuration file: Although Tkabber immediately applies most of its configuration changes, in order to apply changed option ifacetk::options(use_tabbar) you have to restart Tkabber. So, basically you have two options: set ifacetk::options(use_tabbar) at the beginning of your configuration file, or using graphical interface save the option and restart Tkabber.
      Many aspects of the Tkabber's visual appearance such as fonts, colors and geometry of windows can be configured using the Tk option database. The corresponding Tk's option command can be used in the Tkabber's configuration file in any acceptable way: from small tweaks to reading files containing elaborate sets of configuration commands; ready-to-use examples of such files are included in the distribution and are located under the "examples/xrdb" directory. The Tk toolkit is able to initialize its option database from the XRDB (X Resource Database) if its availability is detected at run time. This means that any settings described here can be tuned via the standard XRDB mechanism (see man xrdb). Beware though that the Tk's semantics of matching option specifications against the option database differ in some subtle details from that of the Xt toolkit. The most notable one is the priority of options: Tk prefers the latest option it sees, while Xt prefers "the most specific" one. When specifying Tkabber-specific options in your XRDB file use the "Tkabber" class as the root element of the options. See for a list of all the resources that you can set to control Tkabber's look-and-feel.
      Probably the most commonly used way to configure Tkabber's visual appearance (especially on Windows platforms which lack XRDB mechanism) is to put all the necessary settings in some file and then ask Tk to update its option database from it, like this: The first line tells Tkabber not to load its default "xrdb" file, whilst the second line tells Tkabber which file to load instead. Look at the provided example "xrdb" files to get the idea about how they are organised. Of course, you can use any of that files as a template. And of course, you can simply specify any of the example files instead of your own to the option readfile command to get the provided "theme".
      Alternatively, if you're a Tcl "old timer", you can always do: to set the palette to a pleasing color scheme. Read more about this in man palette.
      You can also customize the fonts Tkabber uses to render its user interface: The above setting (operating on the Tk option database) selects the font used for all UI elements like buttons and labels and roster and conversation windows. Obviously, you should choose fonts that suit your taste.
      If you want to specify another font for roster labels use the following option:
      When picking fonts, observe these rules: Under X, encoding (charset) of fonts must match that of your locale. Ensure that the specified font exists, since if it's not, Tk will try hard to pick the most suitable one which often yields not what you want. (The best bet is to first pick the font using some tool like xfontsel.) Note that when specifying settings using the Tkabber's configuration files (i.e. not using XRDB directly) you are not forced to use "X-style" (XLFD) font descriptions and may instead specify fonts using sometimes more convenient Tk features described in Tk font manual page.
      Next, you may want to Tkabber to use cryptography by default. There are two options: whether the traffic you send should be digitally-signed; and, if you have cryptographic information for someone, should the default action be to encipher your traffic for them. (By defining these options early on, Tkabber will complain immediately if it isn't able to load its cryptographic module; otherwise, the default behavior is to proceed without any cryptographic buttons, menus, and so on.)
      Tkabber has a lot of debugging output. By default, it gets printed to the standard output by a Tcl procedure called debugmsg (if there's standard output available). However, only information about those modules listed in a variable called debug_lvls will be printed.
      If you know how to program Tcl, then this will seem rather obvious:
      Most users won't care about debugmsg because they're running Tkabber under an application launcher so the standard output is never seen. However, if this isn't the case for you, and you just don't want to see any of this stuff, put this one line in your configuration file:
      By default, when Tkabber startup, it show loading process in splash window. To disable this feature, put this in your configuration file:
      Tkabber can show all messages in user's native language. This is done by using Tcl's built-in msgcat package which looks for a directory called msgs/ wherever you installed Tkabber, and then uses the LC_MESSAGES environment variable (or LANG if LC_MESSAGES not set) to select the appropriate file. If you wish, you can force use of a particular language by putting a line like this in your configuration file:
      Tkabber executes a browser when you click on a URL in chat windows, or in user info window, or in headlines window etc. It uses some heuristics to find which browsers are installed in the system and invokes the first browser it finds.
      If Tkabber's decision on which browser to use is suboptimal to you, or if you want to add some options to the browser command line (open URL in a new tab, or in a new window etc.) you may set the varable webbrowser like the following: Note, that the %s in the string (it doesn't have to be at the end) will be replaced by an actual URL when the command will be run. Also, if your favorite browser's path contains spaces, enclose it in braces.
      The following figures shows some examples of setting this variable
      for Windows:
      for Unix:
      Tkabber allows the user to perform textual searching in certain classes of its windows. This searching is controlled by several settings which can be specified in this section. These settings are described in detail in .
      After Tkabber reads your configuration file, it loads all of its own modules, it then invokes a procedure called postload. This procedure is supposed to perform module-specific configuration.
      The default version of this procedure doesn't do anything. If you want to configure one more module modules, then you need to define the procedure in your configuration file, e.g., This isn't nearly as complicated as it seems. Let's break it down by individual module
      Tkabber is shameless in borrowing icons from other Jabber clients. By setting pixmaps::options(pixmaps_theme), you can select a family of related icons. Besides "Default", you can choose one of "Gabber", "JAJC", "Jarl", "Psi", "ICQ", or a few other themes. If you want, you can have Tkabber use a different theme by putting custom theme subdirectory to $::configdir/pixmaps/ directory (tilde means home directory). Tkabber knows that it is a theme directory by looking for icondef.xml file in the directory. To find out the structure of icon definition file, look through XEP-0038 and go to where you installed Tkabber and take a look at the directory called "pixmaps/default/". If you're using the tabbed window interface, Tkabber needs a way of telling you that something has changed in a window that's not on top. This is where the an array called alert_lvls and a list called alert_colors come in. The array maps an incoming message to a priority number from zero to three. The list, which is indexed starting at zero, indicates what color the tab should use to let you know that something's changed. So, the way to read the example is that receiving: an error or server message will cause the tab of a lowered window to go dark blue; a groupchat or headline message will cause the tab to go blue; and, a chat message addressed directly to you will cause the tab to go red.
      By default, whenever a new tab is created, it is automatically raised. If you don't like this behavior, add this line: set ifacetk::options(raise_new_tab) 0
      This module is presently available only for Unix To enable the system tray icon you have to install tktray extension and set the config variable plugins::tktray::options(enable) to 1. If you want to control the tray icon appearance and/or position, consult the documentation for your desktop environment or window manager. Note, that the Tkabber's tray icon has WM class TkabberIcon.
      There are two variables that control when Tkabber automatically marks you as away: plugins::autoaway::options(awaytime) and plugins::autoaway::options(xatime). Both define the idle threshold in minutes (the number does not have to be integer). If variable plugins::autoaway::options(drop_priority) is set in 1 then Tkabber will set priority to 0 when moving in extended away state. Variable plugins::autoaway::options(status) allows to specify text status, which is set when Tkabber is moving in away state.
      There are two variables that you can set to control whether Tkabber will allow others to see your avatar: avatar::options(announce) determines whether your presence information indicates that you have an avatar; and, avatar::options(share) determines whether requests for your avatar will be honored.
      The variable named chat::options(stop_scroll) determines whether a chat window should automatically scroll down to the bottom whenever something new comes in.
      You can also set format of time stamp that displayed in beginning of each chat message. Refer to Tcl documentation for description of format. E.g., to display it in "dd:mm:ss" format, add this line: set plugins::options(timestamp_format) {[%T]}
      This module shows in popup balloons information of used by this user client name, version, and OS. You can allow or deny automatic asking of this info from users by setting this variable to 1 or 0: set plugins::clientinfo::options(autoask) 1
      After you join a conference that's listed in your roster, then whenever you mouse over that roster entry, you'll see a popup listing the conference's participants. If you want to see this popup, regardless of whether you are currently joined with the conference, add this line to your post-load: set plugins::conferenceinfo::options(autoask) 1
      You can also set interval between these requests with these two variables: The second variable defines how many minutes to wait after receiving an error reply before trying again. (Usually an error reply indicates that the server hosting the conference doesn't support browsing, so it makes sense not to try that often.
      Earlier we saw an example where the ssj::options array from the cryptographic module was set during the preload.
      In addition to signed-traffic and encrypt-traffic, you can also tell Tkabber whether to encrypt for a particular JID, e.g.,
      The procedure called plugins::emoticons::load_dir is used to load emoticon definitions from a directory. The directory contains a file called "icondef.xml", which defines the mapping between each image and its textual emoticon (To find out what this file looks like, go to where you installed Tkabber and take a look at the file called "emoticons/default/icondef.xml" or read XEP-0038.)
      If you have just a few icons, and you don't want to create a directory and a textual mapping, you can use the procedure called plugins::emoticons::add, e.g.,
      If you want to disable all emoticons, you can simply load empty directory. Put in postload function
      You can set directory in which files will be saved by default:
      There are several variables that set the dialog window defaults for adding a groupchat to your roster, or joining a groupchat: gra_group and gra_server specify the default room and conference server, repectively; and, gr_nick, gr_group and gr_server specify the default nickname, room, and conference server, respectively. Note that variables gra_server, gr_nick and gr_server overriden in login procedure, so better place for changing them is in connected_hook (see below).
      You may want to have different nicknames for different groupchats. Accordingly, the array called defaultnick is used to set the default nickname for when you enter a conference. The array is indexed by the JID of the room, e.g.,
      Another possibility is to put pattern in parentheses. The following example shows how to specify default nickname for all conferences at conference.example.com: Exact JID's take the higher precedence than patterns.
      On Unix, Tkabber can check spelling of what you entered by calling an external program ispell. To enable this feature, add following lines to postload function: set plugins::ispell::options(enable) 1
      If you enabled this module, then you can also define: the path to the ispell, or aspell, or hunspell executable by setting plugins::ispell::options(executable) the ispell command line options, which can specify dictionaries to use, by setting plugins::ispell::options(command_line); and, the encoding of the output by setting plugins::ispell::options(dictionary_encoding). If you don't care about putting a large load on your process, then you can also set plugins::ispell::options(check_every_symbol) to 1 to check correctness of current word after every entered symbol. (Usually you don't need to set this option.)
      Stream initiation profile is defined in XEP-0095 with two transports (XEP-0047 - IBB, XEP-0065 - SOCKS5 bytestreams). With it you can specify what transports you can use, and via negotiation choose more appropriate one. Tkabber comes with two transport implementations: that allows you to connect to any node that supports bytestreams transport (mediated connection is not supported yet); that uses your Jabber connection to transmit the data (which may slowdown other traffic to you).
      If your machine is behind a NAT, then you can't use the bytestreams transport, so you should disable it:
      You can set directory to store logs: set logger::options(logdir) [file join $::configdir logs]
      Also you can allow or disallow storing of private and group chats logs: set logger::options(log_chat) 1 set logger::options(log_groupchat) 1
      Starting from version 1.0 Tkabber does not keep proxy settings in the loginconf array. It uses proxy profiles defined in separate arrays.
      First, you may want to specify a set of proxy servers. You can have multiple proxy servers defined in the config file (to use in different environments, or if in your company different proxies are used to connect to different hosts). To do so, define global arrays (their names could be arbitrary, but proxy<number> looks natural): Field type is one of the following: "socks4", "socks5", "https", "http". The firat three types are tunnelling proxies. If you enable them, Tkabber will use them to tunnel its TCP connections (in case of "https" this means using CONNECT method for HTTP proxy). The other one is used when Tkabber needs to fetch some data via GET or POST method of the HTTP protocol (e.g., when utilizing BOSH or HTTP-poll connection).
      Fields host, port, username and password are selfexplanatory. There are two fields which need some explanation: match and exclude. When Tkabber needs to connect to a certain host or to get an HTTP document it searches proxies in order they appear in the corresponding proxyconf list (see below) and uses the first proxy for which the host matches one of the patterns from the match field but doesn't match any of the patterns from the exclude field. The matching uses patterns convention from the string match Tcl command.
      Second, you may want to define proxy profiles, and switch between them when the environment changes (it's useful for portable computers). To do so, you may define global arrays named proxyconf<number> where numbers must start from 1 and be consecutive, otherwise Tkabber GUI wouldn't be able to switch to them: Here, two proxy profiles are defined. The first one instructs Tkabber not to use any proxies and directly connect to any host. The second one defines two tunnel proxies and one HTTP proxy. Note that HTTPS and HTTP proxy are the same, but they should appear in both tunnel and http fields anyway. The last line chooses the default proxy profile, which is Work in the example above.
      Also, you can edit proxy settings using Tkabber GUI under Tkabber->Manage proxy servers menu item.
      The first task is to initialize the configuration defaults for the login module. As you can see above, the global array loginconf has a whole bunch of elements, e.g., user, password, and so on. Elements loginconf(user) and loginconf(password)specify username and password to authenticate at your Jabber server. Element loginconf(server) must be set to Jabber server name (the part of you JID after @. Element loginconf(stream_options) is set to one of the following values: plaintext — use plaintext connection; encrypted — use encrypted (via STARTTLS mechanism) connection (this option requires tls extension to be installed); ssl — use encrypted (via legacy SSL mechanism) connection (this option requires tls extension to be installed); compressed — use compressed connection (this option requires Ztcl extension to be installed). Tkabber tries to resolve Jabber server name using SRV first and usual A records in DNS. If the resolution fails (for example if you are in LAN environment without DNS) you can force Tkabber to connect to the server using loginconf(altserver) and loginconf(altport) options (do not forget to set loginconf(usealtserver) to 1). Another option is to use BOSH (XEP-0124 and XEP-0206) connect method (if your server supports it) and tunnel XMPP traffic through HTTP. To enable BOSH set loginconf(usebosh) to 1. Tkabber then tries to find connect URL using TXT record in DNS (see XEP-0156). You can specify URL manually by setting loginconf(boshurl). And another option is to use HTTP-polling connect method (if your server supports it) and tunnel XMPP traffic through HTTP. To enable HTTP-polling set loginconf(usehttppoll) to 1. Tkabber then tries to find connect URL using TXT record in DNS (see XEP-0156). You can specify URL manually by setting loginconf(pollurl). This collection of elements, which is termed a login profile, is what populates the dialog window you'll see when Tkabber wants to connect to the server. It turns out that Tkabber lets you have as many different login profiles as you want. If you want more than just one, they're named loginconf1, loginconf2, and so on. What the example above shows is the default values for all profiles being set in loginconf, and then two profiles, one called "Default Account" and the other called "Test Account" being created. If you want to automatically login to server, then you can set the autologin variable to 1. If you set the autologin variable to -1, then Tkabber will not automatically login and will not show login dialog. Default value for autologin is 0. In this case Tkabber shows login dialog.
      By default, when you restart Tkabber it won't remember the headlines you received. If you want Tkabber to remember headlines whenever you run it, set message::options(headlines,cache) to 1. By default, Tkabber will put all headline messages into a single window. If you want Tkabber to use a seperate window for each headline source, set message::options(headlines,multiple) to 1.
      With this module you can monitor incoming/outgoing traffic from connection to server and send custom XML stanzas. Also you can switch on pretty print option to see incoming and outgoing XML stanzas pretty printed. Note, that with this option they may be drawed incorrectly, e.g. for XHTML tags. Also you can set indentation level via indent option.
      By default, your entire roster is shown, even those items that aren't online. The variable called roster::show_only_online controls this. Similarly by default, each item in every category is shown in the roster. If you want to hide the items in a given category, the array called roster::roster lets you do this. In the example, we see that two groups ("RSS" and "Undefined") start with their items hidden. Some peoples use several JIDs. Tkabber lets you specify an alias for people like these, so it will show only one entry in the roster. In the example, we see that user friend@some.host have aliases friend@other.host and friend@another.host. You can also disable all aliases by setting roster::use_aliases to 0.
      Tkabber can play sounds on some events. It can use for this snack library or external program that can play WAV files. Sound notifications is enabled when Tkabber starts.
      If you want to start Tkabber with sound muted add the following line: set sound::options(mute) 1
      If you want Tkabber to stop notifying you when you are not online (in away or dnd state) add the following line: set sound::options(notify_online) 1
      If you want Tkabber to mute sound when it is focued (and you are paying enough attention to it) add the following line: set sound::options(mute_if_focus) 1
      You can also mute sounds of delayed groupchat messages and delayed personal chat messages: set sound::options(mute_groupchat_delayed) 1 set sound::options(mute_chat_delayed) 0
      If you want to use external program for playing sounds and possibly this program's options, then also add something like this (these options are suitable for Linux users with ALSA installed): set sound::options(external_play_program) /usr/bin/aplay set sound::options(external_play_program_options) -q
      You can also set minimal interval (in milliseconds) between playing different sounds. set sound::options(delay) 200
      Tkabber allows you to specify the filename it will play notifying about some more or less important events. These are: sound::options(connected_sound) — sound playing when Tkabber is connected to the server; sound::options(presence_available_sound) — sound playing when available presence is coming; sound::options(presence_unavailable_sound) — sound playing when unavailable presence is coming; sound::options(chat_my_message_sound) — sound playing when you send one-to-one chat message; sound::options(chat_their_message_sound) — sound playing when you receive one-to-one chat message; sound::options(groupchat_server_message_sound) — sound playing when you receive groupchat message from server; sound::options(groupchat_my_message_sound) — sound playing when you receive groupchat message from server; sound::options(groupchat_their_message_sound) — sound playing when you receive groupchat message from another user; sound::options(groupchat_their_message_to_me_sound) — sound playing when you receive highlighted (usually personally addressed) groupchat message from another user.
      If you want to disable sound notification for some of the events, then you can add line like this:
      After Tkabber invokes your postload procedure, it starts building the GUI. One of the most important things it does is build up a list that specifies its menu bar. It then invokes a procedure called menuload, which is allowed to modify that specification before Tkabber uses it.
      The default version of this procedure is the identity function, i.e..,
      If you really want to change the menubar specification, then here's how to get started: Go to where you installed the BWidget library and take a look at the file called "BWman/MainFrame.html". The documentation for the "-menu" option explains the syntax of the specification. Go to where you installed Tkabber and take a look at the file called "iface.tcl". Look for the line that starts with "set descmenu". This will show you the specification given to your menuload procedure. Go to where you installed Tkabber and take a look at the file called "examples/mtr-config.tcl". Look at the menuload procedure defined there. It lays out Tkabber's menu bar similar to Gabber's. Finally, study the procedures listed here.
      The procedure called avatar::store_on_server stores your avatar on the server.
      The procedure called browser::open opens a new browser window.
      The procedure called add_group_dialog displays a dialog window when you want to add a groupchat to your roster. Similarly, the procedure called join_group_dialog displays a dialog window when you want to join a groupchat.
      The procedure called show_login_dialog displays a dialog window when you want to login to the server. (Prior to attempting to login, if necessary it will logout). Naturally, the procedure called logout does just that; however, if you want get a dialog window for confirmation, use show_logout_dialog instead.
      If you want to send a message to someone, the procedure called message::send_dialog will put up a dialog window. It takes upto three optional arguments: the recipient JID, the subject, and the thread. If you want to get added to someone's roster, the procedure called message::send_subscribe_dialog will put up a dialog window. It takes one optional argument: the recipient JID.
      If you want to display information about a user, the procedure called userinfo::open will put up a dialog window. It takes two optional arguments: the user's JID; and, whether or not the dialog window should be editable.
      Obviously, the second argument makes sense only if it's your own information, i.e.,
      There are also two variables that you can use to set your own presence: userstatus and textstatus. The first variable takes one of five values: available; chat; away; xa; dnd; or, invisible. The second variable takes any textual value.
      Changes to your presence information are propagated only when userstatus is changed. Accordingly, if you make a change to textstatus, be sure to write userstatus immediately afterwards, even if it's a no-op, e.g.,
      Finally, you can use the procedure named help_window to display some textual help. This procedure takes two arguments: the title for the window; and, the text to display. Also, instead of calling exit to terminate Tkabber, please use the quit procedure instead.
      Finally, right before Tkabber goes to display the login dialog, it invokes a procedure called finload, which does whatever you want it to.
      In addition to various configuration mechanisms, Tkabber lets you define procedures, termed "hooks" that get run when certain events happen.
      Here's an example. When Tkabber receives a chat message, how does it know what to process and what to draw? The short answer is that it doesn't need to know anything, all it does is: The hook::run procedure invokes whatever hooks have been defined for draw_message_hook. In fact, more than ten procedures may get invoked to satisfy this hook!
      Here's how it works: Tkabber comes with a number of plugins, which get loaded automatically. Each plugin makes one or more calls that look like this: where the last two parameters are: the name of a procedure to run; and, a relative integer priority.
      When hook::run is invoked for draw_message_hook, each of these procedures is called, in the priority order (from smallest to largest). If one of the procedures wants to prevent the later procedures from being called, it returns the string "stop".
      To continue with the example, in between the pre-load and post-load stages of configuration, the following calls get made by different plugins: Many of these procedures look at the incoming chat message and operate on only certain kinds of messages. Some of these procedures may return "stop", e.g., handle_me which handles chat bodies that start with "/me" and draw_xhtml_message which visualizes XHTML formatted messages. (In this example, the actual namespaces were replaced with "...:" to make it more readable).
      Now let's look at the different kind of hooks that Tkabber knows about.
      When Tkabber receives a message stanza it calls two hooks:
      The first hook takes eleven variable names as arguments, so the calling procedures can rewrite them. This means that a procedure in this hook should call upvar 2 $varbody body and use the body variable to change the actual message body. For example, this allows Tkabber to put decrypted message into the body variable if it is encrypted. The second hook does the job of showing message to the user (or doing something else with it if it's a special message like part of an in-band file transfer.
      When you are about to send a chat or normal message to the wire, a hook is run: The hook takes nine variable names as arguments, so the calling procedures can rewrite them. This means that a procedure in this hook should call upvar 2 $varbody body and use the body variable to change the actual message body. For example, this allows Tkabber to encrypt message and put the encrypted message into the body variable to send. This hook is introduced in Tkabber 1.1, and is used by the OTR plugin, so the latter will not work in Tkabber 1.0 and older.
      When Tkabber decides that it needs to open a (tabbed) window for a chat or groupchat, two hooks are run: Both hooks are given two parameters: the chatid (ID of the chat or conference room window, you always can obtain JID using chat::get_jid and connection token using chat::get_xlib routines); and, and the type of chat (either "chat" or "groupchat").
      Similarly, when Tkabber encounters activity on a tabbed window, a hook is run: The hook is given two parameters: the path of the Tk widget for the tabbed window; and, the chatid of the chat or conference room window.
      When you want to send a chat message, a hook is run: The hook is given four parameters: the chatid of the recipient; the localpart of your login identity; the body of the message; and, the type of chat.
      The hook is given five parameters: the chatid of the sender window (JID includes a resource); the JID of the sender (without the resource); the type of chat; the body of the message; and, a nested-list of additional payload elements. (This last parameter isn't documented in this version of the documentation.)
      Chat windows have menubuttons, and two hooks are used to add items in menu: The first is used in user chat windows, and second in groupchat ones. Hooks are given three parameters: the path of the Tk menu widget; connection token; and, the JID of user or conference.
      In groupchat windows it is possible to complete participants' nicks or commands by pressing TAB key. List of completions is generated by running this hook: The hook is given four parameters: the chatid of conference window; name of global variable, in which current list of possible completions is stored; index of position where completion must be inserted; and content of text widget where completion is requested.
      When someone enters/exits conference, the following hooks are called: The hooks are given two parameters: chatid of conference and nick of participant.
      When someone changes his/her nickname in a conference room, the following hook is called: The hook is given three parameters: chatid of conference old nickname and the new nickname of participant.
      Two hooks are invoked whenever a session is connected or disconnected: Both hooks are given one parameter: connection token (Tkabber allows several connections at once).
      When our presence status changes, a hook is run:
      The hook is given one parameter: the new presence status value, i.e., one of: available; chat; away; xa; dnd; or unavailable.
      Similarly, when someone else's presence changes, a hook is run: The hook is given two parameters: the label associated with the JID (e.g., "fred") or the JID itself (e.g., "fred@example.com") if no label exists in the roster; and, the user's new status.
      And for all received presence packets, a hook is run: The hook is given four parameters: connection token, who send this presence, type of presence (e.g., "error", "unavailable"), list of extended subtags and parameters of this presence (e.g., "-show xa -status online").
      When an IQ stanza is received, a hook is run: The hook is given four compulsory parameters: connection token, who sent this query/response type of stanza (e.g., "get", "set", "result" or "error"), list of query subelements (usually it contains only one element), list of optional arguments (e.g., "-lang language -to jid -id id -x $list_of_other_attributes").
      When an item is added to the roster window, one of the four hooks is run to add stuff to the menu associated with that item: When run, each hook is given three parameters: the path of the Tk menu widget; the connection token; and, a JID of the roster item (or the name of the roster group for the last one).
      Also the following hook is run to add stuff to the menu in groupchats: The hook is given three parameters: the path of the Tk menu widget; the connection token; and, a JID of user.
      The following hook is run to add stuff to the popup balloon for each roster item: The hook is given three parameters: the variable name in which current popup text is stored, the connection token, and the JID of the roster item.
      There are three "obvious" hooks: The first two, by default, run the postload and finload procedures, respectively. postload_hook is run after all code has been loaded and before initializing main Tkabber window. After that finload_hook is run. The final hook is called just before Tkabber terminates (cf., ).
      You can add custom pages to userinfo window using It is run with four arguments: the userinfo notebook widget name; the connection token; the JID of the user; and a boolean parameter which indicates whether the form is editable.
      Search panel may be invoked in certain classes of Tkabber windows using the <<OpenSearchPanel>> Tk virtual event which is bound by default to the <Control-S> keyboard command. Search panel can be dismissed by pressing the <Escape> key and the default search action ("search down") is activated by pressing the <Return> key while entering the search pattern. Search panel is currenlty available in: Chat and groupchat windows; Service discovery window; Chat history logs; All windows of the "Chats history" tool. Headlines window. Raw XML log window. MUC affiliations and roles lists. Searching may be customized using the settings located under the Plugins → Search group of the Customize window. These setings are: ::plugins::search::options(case): perform case-sensitive searching (off by default); ::plugins::search::options(mode): selects searching mode which can be one of: substring — use simple substring search: the typed search string is taken verbatim and then the attempt to locate it is performed. This is the default mode. glob — uses "glob-style" (or "shell-style") matching: special symbols are recognized and they provide for "wildcarding": * matches zero or more characters; ? matches exactly one character; [ and ] define character classes, e.g., [A-Z] will match any character in the series "A", "B", ... "Z". The full syntax is described in Tcl string manual page. That is, this search mode can be convenient for those who want more general yet simple approach to searching and is familiar with the "shell globbing" concept found in Unix shells. regexp — provides for searching using full-blown regular expressions engine. The full syntax is described in Tcl re_syntax manual page.
      Dropped Tcl/Tk 8.4 support. Now Tcl/Tk 8.5 is required
      Fixed a bug in displaying search results and copying JID from the search results to clipboard Fixed a few bugs with nonexistent canvas tags in Georoster and Poker plugins Fixed a restoring user status from autoaway A few other fixes and minor enhancements This is the last release which supports Tcl/Tk 8.4 (with the exceptions of the OTR and Poker plugins)
      Fixed a few bugs in passing URL to web browsers Fixed a regression when message intended to be GPG-encrypted is sent plaintext Fixed a few crashes in OTR plugin A few other fixes and enhancements
      Added new OTR plugin (requires Tcl/Tk 8.5 to operate) Roster versioning (XEP-0237 and RFC-6121) Added new Battleship game plugin A few fixes and enhancements
      Completely rewritten Tkabber internals Dropped Tcl/Tk 8.3 support. Now Tcl/Tk 8.4 is required Partial IPv6 support (requires Tcl/Tk 8.6) Switched from TclGPGME to TclGPG for encryption and signing Added new connection method BOSH (XEP-0124 and XEP-0206) Disabled SSLv2 and enabled TLSv1 TLS options Added user nicknames (XEP-0172) support. Updated the CAPTCHA forms (XEP-0158) support Added metacontacts (XEP-0209) support Implemented multiple proxy profiles Implemented remote controlling from a locally executed script Added new plugins: floatingcontact, poker Rewritten most plugins to support disabling and unloading on the fly A few interface enhancements (search in MUC affiliations lists, proxy management) Many fixes and enhancements
      New default sound theme by Serge Yudin Added new plugins: quotelastmsg, singularity, stripes Many fixes and enhancements
      New tabbed user interface. Tab headers now occupy several rows and tab bar can be docked to the left and right sides of chat window Roster filter Added support for pixmaps (in particular emoticons) JISP archives (XEP-0038) Added support for SOCKS4a and SOCKS5 proxy for the main connection Added user location support (XEP-0080) Added user mood support (XEP-0107) Added user activity support (XEP-0108) Added user tune support (XEP-0118) Added entity capabilities (XEP-0115 v.1.5, only reporting) support Added basic robot challenges support (XEP-0158, v.0.9) Added partial data forms media element support (XEP-0221, v.0.2, URIs and images only) Roster is now exported to XML instead of Tcl list Added support for entity time (XEP-0202) Tkabber version is now reported in disco#info (XEP-0232) Moved deprecated Jabber Browser (XEP-0011) to an external plugin Moved Jidlink file transfer to an external plugin Added several new plugins: attline, ctcomp, custom-urls, floatinglog, gmail, openurl, presencecmd, receipts Many fixes and enhancements
      New artwork by Artem Bannikov Mediated SOCKS5 connection support for file transfer (XEP-0065) Blocking communicaation with users not in roster (using XEP-0016 via simple interface) Translatable outgoing error messages support (based on recipient's xml:lang) Remote controlling clients support (XEP-0146) Extended stanza addressing support (XEP-0033) New chats history tool with search over the all chatlog files Roster item icons are chosen based on Disco queries to item server Search in Disco, Browser, Headlines, RawXML, and Customize windows New internal plugins: abbrev allows to abbreviate words in chat input windows, postpone stores/restores current input window content New external plugins (aniemoticons, latex, tkabber-khim, traffic, renju) Emoticons theme now can be loaded using GUI Most Tkabber's tabs can now be stored on exit and restored on start XMPP ping support (XEP-0199). Reconnecting based on XMPP ping replies Delayed delivery now recognizes XEP-0203 timestamps Added optional 'My Resources' roster group, which contains other connected resources of the same JID Many fixes and enhancements
      Improved privacy lists interface Support for stream compression (XEP-0138) Support for SRV DNS-records Support for TXT DNS-records (XEP-0156) Support for ad-hoc commands (XEP-0050) Improved headlines support Chat state notification support (XEP-0085) Many fixes and enhancements
      Support for STARTTLS Reorganized menu Support for searching in chat window Support for annotations about roster items (XEP-0145) Support for conference rooms bookmarks (XEP-0048) Added multilogin support for GPGME Better support for xml:lang Support for service discovery extensions (XEP-0128) Support for NTLM authentication Many fixes and enhancements
      Updated support for file transfer (XEP-0095, XEP-0096, XEP-0047, XEP-0065) Support for colored nicks and messages in conference Better multiple logins support Updated support for xml:lang Support for IDNA (RFC3490) Many fixes and enhancements
      Multiple logins support History now splitted by month Animated emoticons support Many user interface improvements More XMPP support More translations Bugfixes
      Nested roster groups Messages emphasizing User interface improvements Support for XMPP/Jabber MIME Type Bugfixes
      Here is list of the most essential Tkabber-specific Tk option database resources that you need to change look: Geometry of main window. Geometry of various windows (when not using tabs). The width of the main roster window. Height of input windows in chat and raw XML windows. Background and foreground colors of popup balloon. Behaviour of popup balloon: can be delay (balloon appeared after some time) and follow (balloon appeared immediately and follows mouse). Color of service discovery browser item name. Color of service discovery browser item identity. Color of service discovery browser entity feature. Background of service discovery browser. Color of user's messages in chat windows. Color of other peoples messages in chat windows. Color of label before server message. Color of server messages in chat windows. Color of error messages in chat windows. Color of URLs in chat windows. Color of mouse highlighted URLs in chat windows. Default color of items in Service Discovery Browser. Default color of feature items in Service Discovery Browser. Default color of identity items in Service Discovery Browser. Default color of option items in Service Discovery Browser. Default color of background in Service Discovery Browser. Tabs alert colors. Roster background color. Indentation for group title. Indentation for group icon. Indentation for item name. Indentation for item with multiple resources. Indentation for item resource. Indentation for item icon. Indentation for resource icon. Top pad for item's names. Bottom pad for item's names. Vertical distance between items. Color of item's names. Background of roster item. Background of roster item when mouse is over. Color of item's border. The same to roster groups. Background color of collapsed group. Colors of item name for different presences.
      The next revision of this documentation should discuss: Post-load: chat_height and chat_width (appear to be no-ops). Menu-load: change_password_dialog conference::create_room_dialog disco::browser::open_win message::send_msg privacy::request_lists rawxml::open_window userinfo::show_info_dialog Hooks: the additional payload format.
      Rebecca Malamud was kind enough to design the "enlightened feather" motif used in the Tkabber look-and-feel. The "new look" appeared in the 0.10.0 release ("golden feather" and "blue feather" pixmap themes and the "Earth bulb" logo) was designed by Artem Bannikov. The new sound theme appeared in 0.11.1 release was created by Serge Yudin
      Copyright © 2002-2025 Alexey Shchepin Tkabber 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. Tkabber 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.
      tkabber/emoticons000075500000000000000000000000001477701321300137725ustar00nobodynobodytkabber/emoticons/default000075500000000000000000000000001477701321300154165ustar00nobodynobodytkabber/emoticons/default/beer.gif000064400000000000000000000012501477701321300170770ustar00nobodynobodyGIF89aöG>/>=%%(+2E\-_2b.e8r9OBTFTH%^S/ZS=iHmQpJyZhY&fZ2z]2~`yj;VVXZ\c^`c\bzqhKggd`g|vvvddlrˆLˆ\™U‰fˆq”ošq…t9—~.®~‡|SŒ|a€ÿÿŸ’´Œ¼–š”J¡Ÿ^§›iÊ’Ú£†…†’”–—˜›œ¤ žŸ§¦¦­¯´±¯°´´©µ¶¸ÃÂËÓ×ÄÔÔÖæâÞèæèúøû!ùG,þ€84:<>>99-GG<@G"$&" 9D9G"$$$"$# EE8G%$$$"$#=@G$$$ :EGG(006&5'#!GGGG %%$€GGG;tkabber/emoticons/default/facegrinning.gif000064400000000000000000000001511477701321300206130ustar00nobodynobodyGIF89a‘YÿÈÿÿÿÿÿÿ!ù,:œ ™Ç“áb ZyjxR´Iaøi×ù(ªºU€ ¼°ìº3Ïív÷®Ã“å~ÀŽóµŠ©ÓȨ;tkabber/emoticons/default/facehappy.gif000064400000000000000000000001351477701321300201230ustar00nobodynobodyGIF89a‘ÿÿÿÿÿ!ù,.”™Ç’áb!Zyê½I <¡‰!hnVª~-§+sù)eöv”|jd¾C;tkabber/emoticons/default/faceironic.gif000064400000000000000000000001361477701321300202660ustar00nobodynobodyGIF89a‘ÿÿÿÿÿ!ù,/”™Ç’áb!Zyê½I <¡‰!hnVª~mX‚§²’°ÚÙo®o<";52ŠŸ ;tkabber/emoticons/default/facesad.gif000064400000000000000000000001361477701321300175520ustar00nobodynobodyGIF89a‘Œ­ÿÿÿÿ!ù,/”™Ç’ábAÆ ÂÁøJ”Eb¥ud¦—*¶« Ÿ¨2:ÖøÙðµíY#C56 £;tkabber/emoticons/default/facestartled.gif000064400000000000000000000001371477701321300206260ustar00nobodynobodyGIF89a‘ÿÿÿÿÿ!ù,0”™Ç’áb!Zyê½I <¡‰!hnVª~-žÊJ†VÇöèÉbGÑMðP;tkabber/emoticons/default/facestraight.gif000064400000000000000000000001331477701321300206250ustar00nobodynobodyGIF89a‘ÿÿÿÿÿ!ù,,”™Ç’áb!Zyê½I <¡‰!hnVª~-‡*JI¾cýv^«gà×ð);tkabber/emoticons/default/facewinking.gif000064400000000000000000000001361477701321300204510ustar00nobodynobodyGIF89a‘ÿÿÿÿÿ!ù,/”™Ç’áb!Zyê½ý}Z*R nÖ£ri+JêèÈ+VŸ&žÏ ™4Š£;tkabber/emoticons/default/faceyukky.gif000064400000000000000000000001411477701321300201530ustar00nobodynobodyGIF89a‘Ìÿÿ)Jÿÿÿ!ù,2œ™Ç“áb!Zyê½I <¡‰!hnVª~aûŠÊ,“’à¥w :Æ;¡¬IÃ1k;tkabber/emoticons/default/icondef.xml000064400000000000000000000026031477701321300176270ustar00nobodynobody Default 0.0.3 Tkabber's emoticons. Alexey Shchepin 2002-08-12 :-) :) facehappy.gif :-( :( facesad.gif :-O facestartled.gif :-| facestraight.gif :-/ :-\ faceironic.gif :-D :D facegrinning.gif ;-) ;) facewinking.gif :-P :P faceyukky.gif :beer: (B) beer.gif tkabber/examples000075500000000000000000000000001477701321300136105ustar00nobodynobodytkabber/examples/configs000075500000000000000000000000001477701321300152405ustar00nobodynobodytkabber/examples/configs/badlop-config-home.tcl000064400000000000000000000027741477701321300214670ustar00nobodynobody# Language #::msgcat::mclocale en # Now we will load Badlop's configuration file, if available. # It will set a bunch of options. # It's not a good idea to modify 'badlop-config.tcl' # as it will be updated often to add more and more options. # If you want to change any of them, copy the corresponding line (or lines) # from that file, insert it on the following section ('finload_hook') so # your personal options will always be securely saved on your own config # file. if {[file exists $rootdir/examples/configs/badlop-config.tcl]} { source $rootdir/examples/configs/badlop-config.tcl } # Configure here your own options hook::add finload_hook { # Set here your Jabber account information # 1. User: # set ::loginconf(user) ******** # 2. Server: # set ::loginconf(server) ******** # 3. Password: # set ::loginconf(password) ******** # You can modify the resource, for example put 'home', or 'laptop/work' # set ::loginconf(resource) TkabberP # If you have installed all the needed to run SSL, you can activate it # set ::loginconf(usessl) 0 # For example, if you do not want sound, uncomment this line # set sound::options(sound) 0 # set ::BROWSER c:/Mozilla/mozillafirebird.exe # option add *font -monotype-arial-medium-r-*-*-11-*-100-100-*-*-iso10646-1 # set font -monotype-arial-medium-r-*-*-11-*-100-100-*-*-iso10646-1 } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/examples/configs/badlop-config.tcl000064400000000000000000000256251477701321300205410ustar00nobodynobody# Badlop's config file for Tkabber 20031201 # - based on MTR and TeopeTuK config files (available on 'examples/' # directory) # - includes references to Tkabber documentation (available on 'doc/' # directory) # - contributions: # Marcansoft for Linux options # Report any error or suggestion to badlop@ono.com # Configuration ------------------------------------------------------- PRELOAD # 2. Configuration # 2.1 Pre-load # 2.1.1 Tabbed Interface # set usetabbar 1 # 2.1.2 Primary Look-and-Feel set pixmaps_theme gush set load_default_xrdb 0 option readfile $rootdir/examples/xrdb/badlop-dark.xrdb userDefault # option add *font fixed userDefault switch -- [winfo screenwidth .]x[winfo screenheight .] { 1400x1050 - 1280x1024 { option add Tkabber.geometry =788x550-0+0 userDefault } 1024x768 { option add Tkabber.geometry =700x520-30+170 userDefault # sets font of most of labels in widgets, option add *font \ -monotype-arial-medium-r-*-*-11-*-100-100-*-*-iso10646-1 # sets font of chat and roster text set font -monotype-arial-medium-r-*-*-11-*-100-100-*-*-iso10646-1 } 800x600 { option add Tkabber.geometry =600x420-30+100 userDefault # sets font of most of labels in widgets, option add *font \ -monotype-arial-medium-r-*-*-9-*-100-100-*-*-iso10646-1 # sets font of chat and roster text set font -monotype-arial-medium-r-*-*-9-*-100-100-*-*-iso10646-1 } default { #option add Tkabber.geometry =630x412-0+0 userDefault } } # 2.1.3 Cryptography by default # set ssj::options(one-passphrase) 1 # set ssj::options(sign-traffic) 1 # set ssj::options(encrypt-traffic) 1 # 2.1.4 Using of external TclXML library # set use_external_tclxml 1 # 2.1.5 Use ispell to check spelling # set use_ispell 1 # 2.1.6 Debugging Output # set debug_lvls {jlib warning} # set debug_lvls [list message presence ssj warning] # set debug_lvls [list zerobot] # set debug_lvls [list jlib plugins] # set debug_winP 0 # 2.1.7 Splash window # set show_splash_window 1 # 2.1.8 Periodically send empty string to server # set keep_alive 0 # set keep_alive_interval 10 # 2.1.9 I18n/L10n # ::msgcat::mclocale es # Other non documented: # Remove the four button bar at the top of the roster # hook::add finload_hook {.mainframe showtoolbar 0 0} # Define here the route to your prefered web browser # if {$tcl_platform(platform) == "unix"} { # # Linux users # proc browseurl {url} { # exec mozilla $url &} # } else { # # Windows users # proc browseurl {url} { # exec "c:/Mozilla/MozillaFirebird.exe" $url & # } # } # global BROWSER # if {$tcl_platform(platform) == "unix"} { # # Linux users # set ::BROWSER mozilla # } else { # # Windows users # set ::BROWSER explorer # } # proc browseurl {url} { # exec $::BROWSER $url & # } # show SSL warnings # set ::tls_warnings 0 # Join groupchats automatically at the start #proc connload {connid} { # muc::join_group $connid jabber@conference.jabber.org badlop } #hook::add connected_hook connload 1000 # 2.2 Post-load ------------------------------------------------------ POSTLOAD proc postload {} { # 2.2.1 Look-and-Feel # set raise_new_tab 0 # 2.2.2 The Autoaway Module # set plugins::autoaway::options(awaytime) [expr 2*60*1000] # set plugins::autoaway::options(xatime) [expr 15*60*1000] # set plugins::autoaway::options(status) "Idle" # set plugins::autoaway::options(drop_priority) 0 # 2.2.3 The Avatar Module # if {[file exists $configdir/avatar.gif]} { # avatar::load_file $configdir/avatar.gif # } else { # avatar::load_file $::rootdir/pixmaps/default/tkabber/mainlogo.gif # } # set avatar::options(announce) 1 # set avatar::options(share) 1 # 2.2.4 The Chat Module (chat, normal) # set chat::options(stop_scroll) 0 # set chat::options(smart_scroll) 1 # set chat::options(display_status_description) 1 # Examples: # [%R] -- [20:37] # [%T] -- [20:37:12] # [%a %b %d %H:%M:%S %Z %Y] -- [Thu Jan 01 03:00:00 MSK 1970] # set plugins::options(timestamp_format) {[%R]} # 2.2.5 The Clientinfo Module # set plugins::clientinfo::options(autoask) 1 # 2.2.6 The Conferenceinfo Module # set plugins::conferenceinfo::options(autoask) 1 # set plugins::conferenceinfo::options(interval) 300 # set plugins::conferenceinfo::options(err_interval) 3600 # 2.2.7 The Cryptographic Module # set ssj::options(encrypt,fred@example.com) 1 # 2.2.8 The Emoticons Module # plugins::emoticons::load_dir $::rootdir/emoticons/rhymbox-1.0 # 2.2.9 The File Transfer Module # if {$::tcl_platform(platform) == "unix"} { # Linux users # set ft::options(download_dir) "$env(HOME)" # } else { # Windows users # set ft::options(download_dir) "c:/" # } # 2.2.10 The Groupchat Module # global gra_group gra_server # global gr_nick gr_group gr_server gr_v2 # global defaultnick # set defaultnick(talks@conference.jabber.org) teo # 2.2.11 The Ispell Module # set plugins::ispell::options(executable) ispell/bin/ispell.exe # set plugins::ispell::options(executable) /usr/bin/ispell # set plugins::ispell::options(dictionary) spanish # set plugins::ispell::options(check_every_symbol) 0 # set plugins::ispell::options(dictionary_encoding) koi8-r # 2.2.12 The Jidlink Module # set jidlink::transport(allowed,dtcp-passive) 0 # 2.2.13 The Logger Module # set logger::options(logdir) $configdir/logs # set logger::options(log_chat) 1 # set logger::options(log_groupchat) 1 # 2.2.14 The Login Module global loginconf autologin loginconf1 loginconf2 # Jabber account: set loginconf1(profile) Default # set loginconf1(user) ++++++++ # set loginconf1(password) ++++++++ # set loginconf1(server) ++++++++ # Other Jabber account: set loginconf2(profile) Secondary # set loginconf2(user) -------- # set loginconf2(password) -------- # set loginconf2(server) -------- # set loginconf(usedigest) 1 # set loginconf(resource) TkabberP # set loginconf(port) 5222 # set loginconf(priority) 3 # set loginconf(usessl) 0 # set loginconf(sslport) 5223 # set loginconf(useproxy) 0 # set loginconf(httpproxy) localhost # set loginconf(httpproxyport) 3128 # set loginconf(replace_opened) 0 # array set loginconf [array get loginconf1] set autologin 0 # 2.2.15 The Message Module # set message::options(headlines,cache) 1 # set message::options(headlines,multiple) 1 # 2.2.16 The Raw XML Input Module # set plugins::rawxml::options(pretty_print) 1 # set plugins::rawxml::options(indent) 2 # 2.2.17 The Roster Module # set roster::show_only_online 1 # set roster::show_transport_icons 1 # set roster::show_transport_user_icons 1 # set roster::roster(collapsed,Transports) 1 # set roster::roster(collapsed,Conferences) 1 # set roster::roster(collapsed,Undefined) 1 # set roster::options(show_subscription) 1 # set roster::options(show_conference_user_info) 1 # set roster::use_aliases 0 # set roster::aliases(perico@servidor.org) \ # {perico@servidor2.com} # 2.2.18 The Sound Module # set sound::options(sound) 1 # set sound::options(mute) 0 # set sound::options(mute_groupchat_delayed) 1 # set sound::options(mute_chat_delayed) 1 # set sound::options(delay) 200 set sound::options(theme) "psi" # if {$::tcl_platform(platform) == "unix"} { # Linux users # If no sound is available, use one of the following: #set sound::options(external_play_program) /usr/bin/play #set sound::options(external_play_program) artsplay # } else { # Windows users # set sound::options(external_play_program) plwav.exe # } # Others non documented: # .. The XHTML Module # set plugins::xhtml::options(enable) 1 # plugins::emoticons::load_dir $configdir/cool-emoticon-theme # Set theme for chess plugin # set plugins::chess::theme 1 # special key bindings (due to KDE) bind . {ifacetk::tab_move .nb -1} bind . {ifacetk::tab_move .nb 1} bind . {ifacetk::current_tab_move .nb -1} bind . {ifacetk::current_tab_move .nb 1} bind . { if {[.nb raise] != ""} { eval destroy [pack slaves [.nb getframe [.nb raise]]] .nb delete [.nb raise] 1 ifacetk::tab_move .nb 0 } } # Change presence indicator #bind . {set userstatus chat} bind . {set userstatus available} #bind . {set userstatus away} bind . {set userstatus xa} bind . {set userstatus dnd} #bind . {set userstatus invisible} # Set search behaviour # set search::show_all 1 # Georoster plugin # MTR's config file for tkabber # If you want to use Georoster, uncomment the lines that start with a '#'. # The lines that start with ' #' are not necessary. # source $configdir/tkabber-plugins/georoster/georoster.tcl # automatically open GeoRoster window # set georoster::options(automatic) 0 # show cities on map (none, markers, or all) # set georoster::options(showcities) all # file defining city names & locations, localized for XX #set georoster::options(citiesfile) \ # $configdir/tkabber-plugins/georoster/earth.XX # file defining ISO 3166 country codes #set georoster::options(3166file) iso3166 # default country to use, if unspecified in vCard #set georoster::options(default_country) us # file defining region/locality names & locations, for country XX #set georoster::options(coords,XX) \ # $configdir/tkabber-plugins/georoster/XX.coords # file containing gif to use as background for map #set georoster::options(mapfile) \ # $configdir/tkabber-plugins/georoster/colormap.jpg # procedures to map from x/y to lo/la, and back again #proc georoster::lo {x y} #proc georoster::la {x y} #proc georoster::x {lo la} #proc georoster::y {lo la} # hook to locate a given jid: #proc XX {jid update} { # if {$success} { # eval $update [list $la $lo] # return stop # } #} #hook::add georoster:locate_hook [namespace current]::XX } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/examples/configs/config.tcl000064400000000000000000000033571477701321300173000ustar00nobodynobody# config.tcl -- # # Sample config file for Tkabber # login settings set loginconf(user) aleksey set loginconf(password) secret set loginconf(resource) tkabber set loginconf(server) jabber.ru # Also instead of above login settings you can setup few different profiles: #set loginconf1(profile) "Local test login" #set loginconf1(user) test #set loginconf1(password) test #set loginconf1(resource) tkabber #set loginconf1(server) localhost #set loginconf2(profile) "aleksey@jabber.ru" #set loginconf2(user) aleksey #set loginconf2(password) secret #set loginconf2(resource) tkabber #set loginconf2(server) jabber.ru # And by default use first profile: #array set loginconf [array get loginconf1] # For different you can set different default nicks: #set defaultnick(cool@conference.jabber.org) mY_cOOl_NIcK # You can choose different set of icons: #set pixmaps_theme gabber #set pixmaps_theme psi # Use this to load X resources #option readfile $configdir/teopetuk.xrdb userDefault # Popup balloons on roster and browser can work in two styles: "delay" & # "follow". #option add *Balloon.style follow userDefault # Define 'browseurl' to browse urls with your favorite browser. # For konqueror: #proc browseurl {url} { # exec konqueror $url & #} # For galeon: #proc browseurl {url} { # exec galeon -n $url & #} # This function called after loading of tkabber's modules (maybe removed in the # future) proc postload {} { # To setup your avatar uncomment this: #avatar::load_file $configdir/myface.gif # If you download some emoticons theme, and untar it e.g. in # ~/.tkabber/cool-emoticon-theme, then you can load it as follow: #plugins::emoticons::load_dir $configdir/cool-emoticon-theme } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/examples/configs/mtr-config.tcl000064400000000000000000000333071477701321300200760ustar00nobodynobody# MTR's config file for tkabber (now with Aqua support!) set ssj::options(one-passphrase) 1 set ssj::options(sign-traffic) 1 set ssj::options(encrypt-traffic) 1 set use_ispell 1 set debug_lvls [list zerobot] set debug_winP 1 set show_splash_window 1 proc debugmsg {module msg} { global debug_lvls w global debug_fd debug_winP if {![info exists debug_fd]} { catch { file rename -force -- $::configdir/tkabber.log \ $::configdir/tkabber0.log } set debug_fd [open $::configdir/tkabber.log \ { WRONLY CREAT TRUNC APPEND }] fconfigure $debug_fd -buffering line } puts $debug_fd [format "%s %-12.12s %s" \ [clock format [clock seconds] -format "%m/%d %T"] \ $module $msg] if {([lsearch -exact $debug_lvls $module] < 0) || (!$debug_winP)} { return } set dw $w.debug if {![winfo exists $dw]} { add_win $dw -title Debug -tabtitle debug -class Chat [ScrolledWindow $dw.sw] setwidget \ [text $dw.body -yscrollcommand [list $dw.scroll set]] pack $dw.sw -side bottom -fill both -expand yes $dw.body tag configure module \ -foreground [option get $dw theyforeground Chat] $dw.body tag configure proc \ -foreground [option get $dw meforeground Chat] $dw.body tag configure error \ -foreground [option get $dw errforeground Chat] } $dw.body insert end [format "%-12.12s" $module] module " " set tag normal switch -- $module { jlib { if {[set x [string first "(jlib::" $msg]] > 0} { set tag error } if {[set y [string first ")" $msg]] > 0} { $dw.body insert end \ [string range $msg [expr $x+7] [expr $y-1]] proc \ "\n" set msg [string trimleft \ [string range $msg [expr $y+1] end]] } } default { } } $dw.body insert end [string trimright $msg] $tag $dw.body insert end "\n" if {!$::chat::options(stop_scroll)} { $dw.body see end } } if {$aquaP} { set load_default_xrdb 1 set font {Monoco 12 normal} option add *font $font userDefault } else { set load_default_xrdb 0 option readfile $configdir/../src/tkabber/tkabber/examples/ice.xrdb userDefault option add *font fixed userDefault } switch -- [winfo screenwidth .]x[winfo screenheight .] { 1440x900 - 1440x879 { option add Tkabber.geometry =710x481+730+21 userDefault } 1400x1050 - 1280x1024 { option add Tkabber.geometry =788x550-0+0 userDefault } 1024x768 - default { option add Tkabber.geometry =630x412-0+0 userDefault } } proc config_postload {} { # the emoticon module plugins::emoticons::load_dir $::configdir/emoticons/rythmbox # the georoster module source $::configdir/../src/tkabber/tkabber-plugins/georoster/georoster.tcl # source $::configdir/proprietary/georoster-prop.tcl namespace eval georoster { variable mapnum 1 variable mapwidth variable mapheight variable options set options(showcities) none switch -- [winfo screenwidth .]x[winfo screenheight .] { 1440x900 { set mapwidth 812 set mapheight 422 } 1400x1050 - 1280x1024 { set mapwidth 975 set mapheight 506 } 1024x768 - default { set mapwidth 650 set mapheight 338 set options(mapfile) \ $::configdir/../src/tkabber/tkabber-plugins/georoster/bwmap4.gif proc lo {x y} {expr {($x*2 - 649)*18/65 + 10}} proc la {x y} {expr {(371 - $y*2)*9/40}} proc x {lo la} {expr {(649+(($lo-10)*65/18))/2}} proc y {lo la} {expr {(371-($la * 40/9))/2}} } } variable M_PI 3.14159265358979323846 variable M_PI_2 [expr $M_PI/2.0] variable deg_to_rad [expr $M_PI/180.0] variable TWO_PI [expr $M_PI*2.0] variable M_DEG [expr 180/$M_PI] variable M_INVDEG [expr $M_PI/180] variable del_lon [expr $TWO_PI/$mapwidth] variable del_lat [expr $M_PI/$mapheight] variable lon_array for {set i 0} {$i < $mapwidth} {incr i} { set lon_array($i) [expr (($i+0.5)*$del_lon-$M_PI)] } variable lat_array for {set i 0} {$i < $mapheight} {incr i} { set lat_array($i) [expr ($M_PI_2 - ($i+0.5)*$del_lat)] } proc sp2px {lo la} { variable M_PI variable M_PI_2 variable TWO_PI variable del_lon variable del_lat variable mapwidth variable mapheight if {$lo > $M_PI} { set lo [expr $lo-$TWO_PI] } elseif {$lo < -$M_PI} { set lo [expr $lo+$TWO_PI] } set x [expr round(($lo+$M_PI)/$del_lon + 0.5)] if {$x >= $mapwidth} { incr x -$mapwidth } elseif {$x < 0} { incr x $mapwidth } set y [expr round(($M_PI_2-$la)/$del_lat + 0.5)] if {$y >= $mapheight} { set y [expr $mapheight-1] } return [list $x $y] } proc refresh {} { variable mapcmd variable mapnum variable mapwidth variable mapheight if {![winfo exists .georoster.c]} { return [after [expr 60*1000] [namespace current]::refresh] } set file [file join $::configdir georoster_${mapnum}.gif] if {[catch { exec xplanet -geometry =${mapwidth}x${mapheight} \ -projection rectangular \ -num_times 1 \ -output $file & } result]} { set_status "unable to create new georoster image: $result" } else { after [expr 60*1000] \ [list [namespace current]::refresh_aux $file] } } proc refresh_aux {file} { variable mapimage image delete $mapimage set mapimage [image create photo -file $file] catch { file delete -- $file } [set c .georoster.c] delete map $c create image 0 0 -image $mapimage -anchor nw -tag map $c configure -scrollregion [list 0 0 [image width $mapimage] \ [image height $mapimage]] proc x {lo la} { variable M_INVDEG lindex [sp2px [expr $lo*$M_INVDEG] [expr $la*$M_INVDEG]] 0 } proc y {lo la} { variable M_INVDEG lindex [sp2px [expr $lo*$M_INVDEG] [expr $la*$M_INVDEG]] 1 } proc lo {x y} { variable lon_array variable M_DEG if {[set x [expr int($x)]] < 0} { set x 0 } elseif {![info exists lon_array($x)]} { return 180 } return [expr $lon_array($x)*$M_DEG] } proc la {x y} { variable lat_array variable M_DEG if {[set y [expr int($y)]] < 0} { set y 0 } elseif {![info exists lat_array($x)]} { return -90 } return [expr $lat_array($y)*$M_DEG] } redraw $c after [expr 10*60*1000] [list [namespace current]::refresh] } } # special key bindings (due to KDE) bind . {ifacetk::tab_move .nb -1} bind . {ifacetk::tab_move .nb 1} bind . {ifacetk::current_tab_move .nb -1} bind . {ifacetk::current_tab_move .nb 1} bind . { if {[.nb raise] != ""} { eval destroy [pack slaves [.nb getframe [.nb raise]]] .nb delete [.nb raise] 1 ifacetk::tab_move .nb 0 } } } hook::add postload_hook config_postload 9 proc roster_user_popup_info {info connid user} { set text [set $info] if {([set x [string first "(" $text]] > 0) \ && ([string compare [string index $text end] ")"] == 0) \ && ([string first "\n" [string range $text $x end]] > 0)} { set start [string range $text 0 [expr $x-1]] if {[set y [string last ":" $start]] > 0} { set start [string range $start 0 [expr $y-1]] } set $info $start append $info "\n " append $info [string map [list "\n" "\n "] \ [string range $text [expr $x+1] end-1]] } } hook::add roster_user_popup_info_hook \ [namespace current]::roster_user_popup_info 1 namespace eval jbot { proc open_chat_post {chatid type} { global usetabbar if {[string equal [chat::get_nick [chat::get_xlib $chatid] \ [chat::get_jid $chatid] $type]/$type \ jbot/chat]} { set cw [chat::winid $chatid] pack forget $cw.csw pack $cw.csw -expand yes -fill both -side left destroy $cw.status $cw.input $cw.pw0 if {$usetabbar} { .nb itemconfigure [string range [win_id tab $cw] 1 end] \ -text jbot \ -raisecmd "hook::run raise_chat_tab_hook [list $cw] \ [list $chatid]" } return stop } } proc draw_message {chatid from type body x} { if {[string equal [chat::get_nick [chat::get_xlib $chatid] \ $from $type]/$type jbot/chat]} { set cw [chat::chat_win $chatid] foreach line [split [string trimright $body] "\n"] { if {[string equal [string index $line 15] " "]} { $cw insert end [string range $line 0 15] me set line [string range $line 16 end] if {([set d [string first " " $line]] > 0) \ && (([string first ": " $line] > $d) || ([string first "last message repeated" \ $line] > $d))} { $cw insert end [string range $line 0 $d] they set line [string range $line [expr $d+1] end] } } if {[set d [string first ": " $line]] > 0} { $cw insert end [string range $line 0 $d] me set line [string range $line [expr $d+1] end] } $cw insert end "$line\n" "" } return stop } } proc normalize_chat_id \ {vconnid vfrom vid vtype vis_subject vsubject vbody verr vthread vpriority vx} { upvar 2 $vconnid connid upvar 2 $vfrom from upvar 2 $vtype type if {![string equal $type chat]} return if {[string equal [chat::get_nick $connid $from $type] jbot]} { set from [::xmpp::jid::stripResource $from]/syslog } } hook::add open_chat_post_hook [namespace current]::open_chat_post 1 hook::add draw_message_hook [namespace current]::draw_message 1 hook::add rewrite_message_hook [namespace current]::normalize_chat_id 1 } hook::add finload_hook georoster::refresh 100 proc config_connload {connid} { return foreach g [list xmpp] { muc::join_group $connid ${g}@ietf.xmpp.org mrose } muc::join_group $connid wgchairs@conference.psg.com mrose } hook::add connected_hook config_connload 1000 if {![catch { package require tclCarbonNotification }]} { proc config_tab_set_updated {path updated level} { switch -- $level { message { switch -glob -- $path { .chat_*_jbot* - .headlines_* { } default { tclCarbonNotification 1 "" } } } mesg_to_user { tclCarbonNotification 1 "" } default { } } } hook::add tab_set_updated config_tab_set_updated 10 } if {(![file exists [set file .jsendrc.tcl]]) \ && (![file exists [set file $configdir/../.jsendrc.tcl]])} { return } source $file namespace eval zerobot { proc examine_message {connid from id type is_subject subject body err thread priority x} { global userstatus switch -- $userstatus { away - xa { if {([string length [set body [checkP $from $type $subject \ $body $x]]] > 0) \ && ([catch { notify $from $body } result])} { debugmsg zerobot "notify: $result" } } default { reset } } } hook::add process_message_hook [namespace current]::examine_message 10 } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/examples/configs/teo-config.tcl000064400000000000000000000156411477701321300200640ustar00nobodynobody# TeopeTuK config file for Tkabber # Loading X resources option readfile $configdir/teopetuk.xrdb userDefault #option readfile $configdir/light.xrdb userDefault # Loading non-raising buttons #source $configdir/button.tcl # Setting Balloon style option add *Balloon.style delay userDefault # Set message locale explicitly #msgcat::mclocale ru #set font "-monotype-arial unicode-medium-r-*-*-14-*-90-100-*-*-iso10646-1" set font "-monotype-arial-medium-r-*-*-13-*-100-100-*-*-iso10646-1" set usetabbar 1 set autologin 0 set ssj::options(sign-traffic) 0 set ssj::options(encrypt-traffic) 0 set pixmaps_theme gabber #set pixmaps_theme psi # Login settings, common for all profiles set loginconf(usedigest) 1 set loginconf(httpproxy) sun set loginconf(httpproxyport) 3128 set loginconf(priority) 0 # Every 10 minutes send empty message to the server # to avoid proxy disconnect set keep_alive 1 set keep_alive_interval 10 # Login profiles setup set loginconf1(profile) "teopetuk@jabber.ru" set loginconf1(user) teopetuk set loginconf1(password) "" set loginconf1(server) jabber.ru set loginconf1(resource) tkabber set loginconf1(usealtserver) 0 set loginconf1(altserver) "" set loginconf1(useproxy) 1 set loginconf2(profile) "teopetuk@amessage.info" set loginconf2(user) teopetuk set loginconf2(password) "" set loginconf2(server) amessage.info set loginconf2(resource) tkabber set loginconf2(usealtserver) 0 set loginconf2(altserver) "" set loginconf2(useproxy) 1 # Set default profile array set loginconf [array get loginconf2] # Set default conference nicks set defaultnick(talks@conference.jabber.ru) teo set defaultnick(debian@conference.jabber.ru) teo #set defaultnick(talks@conference.jabber.ru) "\u0473\u0463\u0461" #set defaultnick(talks@conference.jupiter.golovan.ru) "\u0473\u0463\u0461" #set defaultnick(talks@conference.jupiter.golovan.ru) "\u03c4\u03b5\u03bf" # Check spelling using ispell module set use_ispell 1 # Set procedure for launching browser proc browseurl {url} { exec galeon -w $url & } proc postload {} { # Set initial roster options set roster::show_only_online 1 set roster::show_transport_icons 1 set roster::show_transport_user_icons 1 set roster::roster(collapsed,Agents) 1 #set roster::aliases(teopetuk@amessage.info) {258151@aim.jabber.ru} #set roster::aliases(teo@jupiter.golovan.ru) {petr@golovan.ru} #set roster::use_aliases 0 # Set search behaviour set search::show_all 1 # Set sound module options set sound::options(sound) 1 set sound::options(theme) "$::configdir/sounds" set sound::options(external_play_program) "esdplay" # Set autoaway module options set plugins::autoaway::options(awaytime) [expr 5*60*1000] set plugins::autoaway::options(xatime) [expr 15*60*1000] # Set ispell module options set plugins::ispell::options(dictionary) engrus set plugins::ispell::options(dictionary_encoding) koi8-r # Define the set of emoticons (empty set) set plugins::emoticons::options(theme) "" } # Debug window handling (mostly taken from MTR config file) #set debug_lvls [list presence ssj warning] set debug_lvls [list jlib plugins] set debug_winP 0 proc menuload {menudesc} { set newmenu [lindex $menudesc end] lappend newmenu \ [list checkbutton "Debug window" {} {} {} \ -variable debug_winP \ -command debug_window_update] lappend newmenu [list cascad Debug {} {} 1 [debug_buttons]] return [lreplace $menudesc end end $newmenu] } proc debug_buttons {} { global debug_levels debug_lvls set buttons {} foreach l [list avatar browser chat completion \ conference filetransfer filters iq \ jlib logger login message \ nick plugins presence register \ roster search ssj tkabber \ userinfo warning] { if {[lsearch -exact $debug_lvls $l] >= 0} { set debug_levels($l) 1 } else { set debug_levels($l) 0 } lappend buttons [list checkbutton $l {} {} {} \ -variable debug_levels($l) -command debug_update] } return $buttons } proc debug_window_update {} { global w debug_winP usetabbar if {!$debug_winP && [winfo exists $w.debug]} { if {$usetabbar} { foreach tab [.nb pages] { if {[lsearch -exact [pack slaves [.nb getframe $tab]] \ $w.debug] >= 0} { eval destroy [pack slaves [.nb getframe $tab]] .nb delete $tab 1 tab_move .nb 0 } } } else { destroy $w.debug } } } proc debug_update {} { global debug_levels debug_lvls set debug_lvls {} foreach {k v} [array get debug_levels] { if {$v} { lappend debug_lvls $k } } } proc debugmsg {module msg} { global debug_lvls w global debug_fd debug_winP if {![info exists debug_fd]} { catch { file rename -force -- $::configdir/tkabber.log \ $::configdir/tkabber0.log } set debug_fd [open $::configdir/tkabber.log \ { WRONLY CREAT TRUNC APPEND }] fconfigure $debug_fd -buffering line } puts $debug_fd [format "%s %-12.12s %s" \ [clock format [clock seconds] -format "%m/%d %T"] \ $module $msg] if {([lsearch -exact $debug_lvls $module] < 0) || (!$debug_winP)} { return } set dw $w.debug if {![winfo exists $dw]} { add_win $dw -title Debug -tabtitle debug [ScrolledWindow $dw.sw] setwidget \ [text $dw.body -yscrollcommand [list $dw.scroll set]] pack $dw.sw -side bottom -fill both -expand yes $dw.body tag configure module -foreground red3 $dw.body tag configure proc -foreground blue $dw.body tag configure error -foreground red } $dw.body insert end [format "%s: %-12.12s" \ [clock format [clock seconds] -format "%m/%d %T"] \ $module] module " " set tag normal switch -- $module { jlib { if {[set x [string first "(jlib::" $msg]] > 0} { set tag error } if {[set y [string first ")" $msg]] > 0} { $dw.body insert end \ [string range $msg [expr $x+7] [expr $y-1]] proc \ "\n" set msg [string trimleft \ [string range $msg [expr $y+1] end]] } } default { } } $dw.body insert end [string trimright $msg] $tag $dw.body insert end "\n\n" } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/examples/tclCarbonNotification-1.0.0000075500000000000000000000000001477701321300205205ustar00nobodynobodytkabber/examples/tclCarbonNotification-1.0.0/build.sh000075500000000000000000000000611477701321300222320ustar00nobodynobody#!/bin/sh critcl -pkg tclCarbonNotification.tcl tkabber/examples/tclCarbonNotification-1.0.0/tclCarbonNotification.tcl000064400000000000000000000012611477701321300255610ustar00nobodynobodypackage require critcl package provide tclCarbonNotification 1.0 lappend critcl::v::compile -framework Carbon critcl::ccode { #include } critcl::cproc tclCarbonNotification {int bounce char* msg} ok { OSErr err; NMRec request; Str255 message; request.nmMark = bounce; if (strlen(msg)) { CopyCStringToPascal(msg, message); request.nmStr = (StringPtr)&message; } else { request.nmStr = NULL; } request.qType = nmType; request.nmSound = NULL; request.nmResp = NULL; err = NMInstall(&request); if (err != noErr) return TCL_ERROR; return TCL_OK; } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/examples/tools000075500000000000000000000000001477701321300147505ustar00nobodynobodytkabber/examples/tools/howto.txt000064400000000000000000000061611477701321300167340ustar00nobodynobody[ howto.txt - Thu Mar 6 10:02:15 2003 - a few explanations - /mtr ] 0. make sure that you have copied the jabberlib-tclxml/ to the library area for your tcl installation, typical names might be: /usr/local/lib/tcl/jabberlib-tclxml/ /usr/pkg/lib/tcl/jabberlib-tclxml/ 1. all of these scripts look for a file called ".jsendrc.tcl" in the current directory, and then in the home directory. if present, this file can be used to define a tcl list called "args" that contains default key/value pairs. e.g., % cat > ~/.jsendrc.tcl set args {-from fred@example.com/bedrock -password wilma} ^D % chmod 0600 ~/.jsendrc.tcl 2. the jsend.tcl script is used from the shell to send jabber messages. it operates in two modes: one-shot and following. here's an example of the one-shot mode: % jsend.tcl barney@example.com -body "hello world." in contrast, following mode is similar to the "tail" command: % jsend.tcl barney@example.com -follow /var/log/syslog & 3. the jsend.tcl script has a lot of options, type % jsend.tcl -help to see them all. the command syntax is: % jsend.tcl "recipient" -k1 v1 -k2 v2 ... for example, by default, the jsend.tcl script will want to use tls to talk to its jabber server, if you want to use plaintext instead, use % jsend.tcl barney@example.com -tls false if you use "-" for the recipient, then the jsend.tcl script will send to every subscriber on the roster of the user that it's logged in as, e.g., % jsend.tcl - -from fred@example.com -body "hello world." will send "hello world." to everyone on fred's roster. 4. you may want to run the jsend.tcl script at system startup. the jbot script can be put in /etc/rc.d/ on netbsd systems. you'll need to: - edit it to reflect where you've installed the jsend.tcl script; and, - decide whether to put the jabber login information in the rc script or in the command line arguments you can use the jbot script as the basis for writing your own startup script on bsd-derived systems. 5. the rssbot.tcl script runs as an rss/jabber gateway. the gateway accepts commands from the subscribers on the roster of the user that it's logged in as. the commands allow each subscriber to manage which RSS/RDF files are monitored, and so on. 6. to find out about the options available in the rssbot.tcl script, type % rssbot.tcl -help the command syntax for the rssbot.tcl script is: % rssbot.tcl -k1 v1 -k2 2 7. you probably want to run the rssbot.tcl script at system startup. the rssbot script can be put in /etc/rc.d/ on netbsd systems. 8. neither the jsend.tcl nor rssbot.tcl scripts manage their roster. you'll need to login to a jabber server and configure their roster accordingly. why? because the roster acts as an access control mechanism for each script. if you want random folks to arbitrarily access these services, modify the scripts to taste. ####### tkabber/examples/tools/jbot000064400000000000000000000005531477701321300157130ustar00nobodynobody#!/bin/sh # # PROVIDE: jbot # REQUIRE: syslogd . /etc/rc.subr name="jbot" rcvar=$name command="/usr/pkg/bin/jsend.tcl" command_interpreter=tclsh pidfile="/var/run/${name}.pid" command_args="-pidfile $pidfile &" # the first argument is the destination (or, if "-", use the roster) jbot_flags="- -follow /var/log/jbot" load_rc_config $name run_rc_command "$1" tkabber/examples/tools/jsend.tcl000064400000000000000000000400411477701321300166350ustar00nobodynobody#!/bin/sh # the next line restarts using the correct interpreter \ exec tclsh "$0" "$0" "$@" package require -exact jabberlib 0.10.1 package require mime package require sha1 package require tls proc jlib::sendit {stayP to args} { global env variable lib variable roster variable sendit_result array set options [list -to $to \ -from "" \ -password "" \ -host "" \ -port "" \ -activity "" \ -type chat \ -subject "" \ -body "" \ -xhtml "" \ -description "" \ -url "" \ -tls true] array set options $args if {![string compare $options(-host) ""]} { set options(-host) [info hostname] } set params [list from] if {[string compare $options(-to) "-"]} { lappend params to } foreach k $params { if {[string first @ $options(-$k)] < 0} { if {[set x [string first / $options(-$k)]] >= 0} { set options(-$k) [string replace $options(-$k) $x $x \ @$options(-host)/] } else { append options(-$k) @$options(-host) } } if {([string first @ $options(-$k)] == 0) \ && ([info exists env(USER)])} { set options(-$k) $env(USER)$options(-$k) } } if {[string compare $options(-to) "-"]} { set options(-to) [list $options(-to)] } foreach k [list tls] { switch -- [string tolower $options(-$k)] { 1 - 0 {} false - no - off { set options(-$k) 0 } true - yes - on { set options(-$k) 1 } default { error "invalid value for -$k: $options(-$k)" } } } array set aprops [lindex [mime::parseaddress $options(-from)] 0] if {[set x [string first / $aprops(domain)]] >= 0} { set aprops(resource) [string range $aprops(domain) [expr $x+1] end] set aprops(domain) [string range $aprops(domain) 0 [expr $x-1]] } else { set aprops(resource) "jsend" } if {(![string compare $options(-body) ""]) && ($stayP < 2)} { set options(-body) [read -nonewline stdin] } set options(-xlist) {} if {[string compare $options(-url)$options(-description) ""]} { lappend options(-xlist) \ [jlib::wrapper:createtag x \ -vars [list xmlns jabber:x:oob] \ -subtags [list [jlib::wrapper:createtag url \ -chdata $options(-url)] \ [jlib::wrapper:createtag desc \ -chdata $options(-description)]]] } if {([string compare $options(-xhtml) ""]) \ && ([string compare $options(-body) ""]) \ && ($stayP < 1)} { lappend options(-xlist) \ [jlib::wrapper:createtag html \ -vars [list xmlns http://jabber.org/protocol/xhtml-im] \ -subtags [list [jlib::wrapper:createtag body \ -vars [list xmlns \ http://www.w3.org/1999/xhtml] \ -subtags [jsend::parse_xhtml $options(-xhtml)]]]] } if {![string compare $options(-type) announce]} { set options(-type) normal set announce [sha1::sha1 \ [clock seconds]$options(-subject)$options(-body)] lappend options(-xlist) \ [jlib::wrapper:createtag x \ -vars [list xmlns \ http://2entwine.com/protocol/gush-announce-1_0] \ -subtags [list [jlib::wrapper:createtag id \ -chdata $announce]]] } set lib(lastwhat) $options(-activity) if {[catch { clock scan $options(-time) } lib(lastwhen)]} { set lib(lastwhen) [clock seconds] } set params {} foreach k [list body subject type xlist] { if {[string compare $options(-$k) ""]} { lappend params -$k $options(-$k) } } if {[llength [jlib::connections]] <= 0} { set connid [jlib::new -user $aprops(local) \ -server $aprops(domain) \ -resource $aprops(resource)] if {$options(-tls)} { set transport tls if {[string compare $options(-port) ""]} { set port $options(-port) } else { set port 5223 } } else { set transport tcp if {[string compare $options(-port) ""]} { set port $options(-port) } else { set port 5222 } } jlib::connect $connid \ -transport $transport \ -host [idna::domain_toascii $aprops(domain)] \ -port $port \ -password $options(-password) jlib::login $connid [namespace current]::sendit_aux vwait [namespace current]::sendit_result if {[string compare [lindex $sendit_result 0] OK]} { error [lindex $sendit_result 1] } roster_get -command [namespace current]::roster_get_aux vwait [namespace current]::sendit_result } else { set connid [lindex [jlib::connections] 0] } if {![string compare $options(-to) "-"]} { set options(-to) $roster(users) } if {$stayP > 1} { jlib::send_presence -stat Online \ -connection $connid if {![string compare $options(-type) groupchat]} { set nick $aprops(local)@$aprops(domain)/@aprops(resource) set nick [string range [sha1::sha1 $nick+[clock seconds]] 0 7] foreach to $options(-to) { jlib::send_presence -to $to/$nick \ -connection $connid } } return 1 } foreach to $options(-to) { switch -- [eval [list jlib::send_msg $to -connection $connid] $params] { -1 - -2 { if {$stayP} { set cmd [list ::LOG] } else { set cmd [list error] } eval $cmd [list "error writing to socket, continuing..."] return 0 } default { } } } if {!$stayP} { set jsend::stayP 0 jlib::disconnect $connid } return 1 } proc jlib::sendit_aux {result args} { variable sendit_result set sendit_result [list $result $args] } proc jlib::roster_get_aux {what args} { variable sendit_result set sendit_result $what } proc client:message {args} { # ::LOG "client:message $args" } proc client:presence {args} { # ::LOG "client:presence $args" } proc client:iqreply {connid from userid id type lang child} { jlib::wrapper:splitxml $child tag vars isempty chdata children set xmlns [jlib::wrapper:getattr $vars xmlns] ::LOG "client:iqreply $from $userid $id $type $lang $xmlns" set result result set now [clock seconds] switch -- $type/$xmlns { get/jabber:iq:browse { foreach ns [list browse last time version] { lappend tags [jlib::wrapper:createtag ns -chdata $ns] } set xmldata [jlib::wrapper:createtag user \ -vars [list xmlns $xmlns type client] \ -subtags $tags] } get/jabber:iq:last { set xmldata [jlib::wrapper:createtag query \ -vars [list xmlns $xmlns \ seconds \ [expr $now-$jlib::lib(lastwhen)]] \ -chdata $jlib::lib(lastwhat)] } get/jabber:iq:time { set gmtP true foreach {k f} [list utc "%Y%m%dT%T" \ tz "%Z" \ display "%a %b %d %H:%M:%S %Z %Y"] { lappend tags [jlib::wrapper:createtag $k \ -chdata [clock format $now \ -format $f \ -gmt $gmtP]] set gmtP false } set xmldata [jlib::wrapper:createtag query \ -vars [list xmlns $xmlns] \ -subtags $tags] } get/jabber:iq:version { global argv0 tcl_platform foreach {k v} [list name [file tail [file rootname $argv0]] \ version "1.0 (Tcl [info patchlevel])" \ os "$tcl_platform(os) $tcl_platform(osVersion)"] { lappend tags [jlib::wrapper:createtag $k -chdata $v] set gmtP false } set xmldata [jlib::wrapper:createtag query \ -vars [list xmlns $xmlns] \ -subtags $tags] } default { set result error set xmldata [jlib::wrapper:createtag error \ -vars [list code 501] \ -chdata "not implemented"] } } jlib::send_iq $result $xmldata -to $from -id $id -connection $connid } proc client:roster_push {args} {} proc client:roster_item {args} {} proc client:reconnect {connid} { jsend::reconnect } proc client:disconnect {connid} { jsend::reconnect } proc client:status {args} { ::LOG "client:status $args" } namespace eval jsend { variable stayP 1 } proc jsend::follow {file argv} { proc [namespace current]::reconnect {} \ [list [namespace current]::reconnect_aux $argv] if {[catch { eval [list jlib::sendit 2] $argv } result]} { ::bgerror $result return } set buffer "" set fd "" set newP 1 array set st [list dev 0 ino 0 size 0] for {set i 0} {1} {incr i} { if {[expr $i%5] == 0} { if {[catch { file stat $file st2 } result]} { ::LOG $result break } if {($st(dev) != $st2(dev)) \ || ($st(ino) != $st2(ino)) \ || ($st(size) > $st2(size))} { if {$newP} { catch { close $fd } } fconfigure [set fd [open $file { RDONLY }]] -blocking off unset st array set st [array get st2] if {(!$newP) && (![string compare $st(type) file])} { seek $fd 0 end } if {!$newP} { set newP 0 } if {[string length $buffer] > 0} { if {[catch { eval [list jlib::sendit 1] $argv \ [parse $buffer] \ [list -body $buffer] } result]} { ::LOG $result break } elseif {$result} { set buffer "" } } } } if {[fblocked $fd]} { } elseif {[catch { set len [string length [set line [read $fd]]] append buffer $line } result]} { ::LOG $result break } elseif {[set x [string first "\n" $buffer]] < 0} { } else { set body [string range $buffer 0 [expr {$x-1}]] while {[catch { eval [list jlib::sendit 1] $argv [parse $body] \ [list -body $body] } result]} { ::LOG $result } if {$result} { set buffer [string range $buffer [expr $x+1] end] } } after 1000 "set alarmP 1" vwait alarmP } } proc jsend::parse {line} { set args {} if {![string equal [string index $line 15] " "]} { return $args } catch { lappend args -time [clock scan [string range $line 0 14]] } set line [string range $line 16 end] if {([set d [string first " " $line]] > 0) \ && ([string first ": " $line] > $d)} { lappend args -activity [string trim [string range $line $d end]] } return $args } proc jsend::reconnect_aux {argv} { variable stayP while {$stayP} { after [expr 60*1000] if {![catch { eval [list jlib::sendit 2] $argv } result]} { break } ::LOG $result } } proc jsend::parse_xhtml {text} { variable xhtml set wrap [jlib::wrapper:new [list [namespace current]::wrap_xhtml start] \ [list [namespace current]::wrap_xhtml end] \ [list [namespace current]::wrap_xhtml parse]] jlib::wrapper:parser $wrap parse "$text" jlib::wrapper:reset $wrap return $xhtml } proc jsend::wrap_xhtml {mode args} { variable xhtml if {![string compare $mode parse]} { set xhtml $args } } proc ::LOG {text} { # puts stderr $text } proc ::debugmsg {args} { # ::LOG "debugmsg: $args" } proc ::bgerror {err} { global errorInfo ::LOG "$err\n$errorInfo" } set status 1 array set jlib::lib [list lastwhen [clock seconds] lastwhat ""] if {![string compare [file tail [lindex $argv 0]] "jsend.tcl"]} { incr argc -1 set argv [lrange $argv 1 end] } if {(([set x [lsearch -exact $argv -help]] >= 0) \ || ([set x [lsearch -exact $argv --help]] >= 0)) \ && (($x == 0) || ([expr $x%2]))} { puts stdout "usage: jsend.tcl recipient ?options...? -follow file -pidfile file -from jid -password string -type string (e.g., 'chat') -subject string -body string -xhtml string -description string -url string -tls boolean (e.g., 'true') If recipient is '-', roster is used. If both '-body' and '-follow' are absent, the standard input is used. The file .jsendrc.tcl is consulted, e.g., set args {-from fred@example.com/bedrock -password wilma} for default values." set status 0 } elseif {($argc < 1) || (![expr $argc%2])} { puts stderr "usage: jsend.tcl recipent ?-key value?..." } elseif {[catch { if {([file exists [set file .jsendrc.tcl]]) \ || ([file exists [set file ~/.jsendrc.tcl]])} { set args {} source $file array set at [list -permissions 600] array set at [file attributes $file] if {([set x [lsearch -exact $args "-password"]] > 0) \ && (![expr $x%2]) \ && (![string match *00 $at(-permissions)])} { error "file should be mode 0600" } if {[llength $args] > 0} { set argv [eval [list linsert $argv 1] $args] } } } result]} { puts stderr "error in $file: $result" } elseif {([set x [lsearch -exact $argv "-follow"]] > 0) && ([expr $x%2])} { set keep_alive 1 set keep_alive_interval 3 if {([set y [lsearch -exact $argv "-pidfile"]] > 0) && ([expr $y%2])} { set fd [open [set pf [lindex $argv [expr $y+1]]] \ { WRONLY CREAT TRUNC }] puts $fd [pid] close $fd } jsend::follow [lindex $argv [expr $x+1]] $argv catch { file delete -- $pf } } elseif {[catch { eval [list jlib::sendit 0] $argv } result]} { puts stderr $result } else { set status 0 } exit $status # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/examples/tools/rssbot000064400000000000000000000004761477701321300162750ustar00nobodynobody#!/bin/sh # # PROVIDE: rssbot # REQUIRE: DAEMON . /etc/rc.subr name="rssbot" rcvar=$name command="/usr/pkg/libexec/rssbot.tcl" command_interpreter=tclsh pidfile="/var/run/${name}.pid" command_args="-from ${name}/`hostname -s` -pidfile $pidfile -logfile /tmp/${name}.log &" load_rc_config $name run_rc_command "$1" tkabber/examples/tools/rssbot.tcl000064400000000000000000001021031477701321300170440ustar00nobodynobody#!/bin/sh # the following restarts using tclsh \ PATH=/usr/bin:/bin:/usr/pkg/bin:/usr/local/bin:/sbin:/usr/sbin \ LD_LIBRARY_PATH=/usr/pkg/lib:/usr/lib:/usr/local/lib \ export PATH LD_LIBRARY_PATH; exec tclsh "$0" "$@" package require jabberlib -exact 0.10.1 package require http 2 package require mime package require tls package require uri proc jlib::sendit {stayP to args} { global env variable lib variable roster variable sendit_result array set options [list -to $to \ -from "" \ -password "" \ -host "" \ -port "" \ -activity "" \ -type headline \ -subject "" \ -body "" \ -description "" \ -url "" \ -tls true] array set options $args if {![string compare $options(-host) ""]} { set options(-host) [info hostname] } set params [list from] foreach k $params { if {[string first @ $options(-$k)] < 0} { if {[set x [string first / $options(-$k)]] >= 0} { set options(-$k) [string replace $options(-$k) $x $x \ @$options(-host)/] } else { append options(-$k) @$options(-host) } } if {([string first @ $options(-$k)] == 0) \ && ([info exists env(USER)])} { set options(-$k) $env(USER)$options(-$k) } } foreach k [list tls] { switch -- [string tolower $options(-$k)] { 1 - 0 {} false - no - off { set options(-$k) 0 } true - yes - on { set options(-$k) 1 } default { error "invalid value for -$k: $options(-$k)" } } } array set aprops [lindex [mime::parseaddress $options(-from)] 0] if {[set x [string first / $aprops(domain)]] >= 0} { set aprops(resource) [string range $aprops(domain) [expr $x+1] end] set aprops(domain) [string range $aprops(domain) 0 [expr $x-1]] } else { set aprops(resource) "rssbot" } set options(-xlist) {} if {[string compare $options(-url)$options(-description) ""]} { lappend options(-xlist) \ [jlib::wrapper:createtag x \ -vars [list xmlns jabber:x:oob] \ -subtags [list [jlib::wrapper:createtag url \ -chdata $options(-url)] \ [jlib::wrapper:createtag desc \ -chdata $options(-description)]]] } set lib(lastwhat) $options(-activity) if {[catch { clock scan $options(-time) } lib(lastwhen)]} { set lib(lastwhen) [clock seconds] } set params {} foreach k [list body subject type xlist] { if {[string compare $options(-$k) ""]} { lappend params -$k $options(-$k) } } if {[llength [jlib::connections] <= 0} { set connid [jlib::new -user $aprops(local) \ -server $aprops(domain) \ -resource $aprops(resource)] if {$options(-tls)} { set transport tls if {[string compare $options(-port) ""]} { set port $options(-port) } else { set port 5223 } } else { set transport tcp if {[string compare $options(-port) ""]} { set port $options(-port) } else { set port 5222 } } jlib::connect $connid \ -transport $transport \ -host [idna::domain_toascii $aprops(domain)] \ -port $port \ -password $options(-password) jlib::login $connid [namespace current]::sendit_aux vwait [namespace current]::sendit_result if {[string compare [lindex $sendit_result 0] OK]} { error [lindex [stanzaerror::error_to_list [lindex $sendit_result 1]] } roster_get -command [namespace current]::roster_get_aux vwait [namespace current]::sendit_result } else { set connid [lindex [jlib::connections] 0] } if {$stayP > 1} { jlib::send_presence -stat Online \ -connection $connid return 1 } foreach to $options(-to) { switch -- [eval [list jlib::send_msg $to -connection $connid] $params] { -1 - -2 { if {$stayP} { set cmd [list ::LOG] } else { set cmd [list error] } eval $cmd [list "error writing to socket, continuing..."] return 0 } default { } } } if {!$stayP} { jlib::disconnect $connid } return 1 } proc jlib::sendit_aux {result args} { variable sendit_result set sendit_result [list $result $args] } proc jlib::roster_get_aux {what} { variable sendit_result set sendit_result $what } proc client:message {connid from id type is_subject subject body err thread priority x} { ::LOG "client:message $from $body" if {![regexp {(.*@.*)/.*} $from x jid]} { set jid $from } switch -- $type { normal - chat { } "" { set type chat } default { ::LOG "$from ignoring $type" return } } if {[catch { rssbot::message $jid $body } answer]} { ::LOG "$jid/$body: $answer" set answer "internal error, sorry! ($answer)" } if {[catch { jlib::sendit 1 "" \ -to $from \ -activity "$jid: $body" \ -type $type \ -subject $subject \ -body $answer } result]} { ::LOG "$from: $result" } } proc client:presence {connid from type x args} { ::LOG "client:presence $args" if {![regexp {(.*@.*)/.*} $from x jid]} { set jid $from } switch -- $type { available - unavailable { } "" { set type available } default { ::LOG "$from ignoring $type" return } } rssbot::presence $jid $type } proc client:iqreply {connid from userid id type lang child} { jlib::wrapper:splitxml $child tag vars isempty chdata children set xmlns [jlib::wrapper:getattr $vars xmlns] ::LOG "client:iqreply $from $userid $id $type $lang $xmlns" set result result set now [clock seconds] switch -- $type/$xmlns { get/jabber:iq:browse { foreach ns [list browse last time version] { lappend tags [jlib::wrapper:createtag ns -chdata $ns] } set xmldata [jlib::wrapper:createtag user \ -vars [list xmlns $xmlns type client] \ -subtags $tags] } get/jabber:iq:last { set xmldata [jlib::wrapper:createtag query \ -vars [list xmlns $xmlns \ seconds \ [expr $now-$jlib::lib(lastwhen)]] \ -chdata $jlib::lib(lastwhat)] } get/jabber:iq:time { set gmtP true foreach {k f} [list utc "%Y%m%dT%T" \ tz "%Z" \ display "%a %b %d %H:%M:%S %Z %Y"] { lappend tags [jlib::wrapper:createtag $k \ -chdata [clock format $now \ -format $f \ -gmt $gmtP]] set gmtP false } set xmldata [jlib::wrapper:createtag query \ -vars [list xmlns $xmlns] \ -subtags $tags] } get/jabber:iq:version { global argv0 tcl_platform foreach {k v} [list name [file tail [file rootname $argv0]] \ version "1.0 (Tcl [info patchlevel])" \ os "$tcl_platform(os) $tcl_platform(osVersion)"] { lappend tags [jlib::wrapper:createtag $k -chdata $v] set gmtP false } set xmldata [jlib::wrapper:createtag query \ -vars [list xmlns $xmlns] \ -subtags $tags] } default { set result error set xmldata [jlib::wrapper:createtag error \ -vars [list code 501] \ -chdata "not implemented"] } } jlib::send_iq $result $xmldata -to $from -id $id -connection $connid } proc client:roster_push {args} {} proc client:roster_item {args} {} proc client:reconnect {connid} { rssbot::reconnect } proc client:disconnect {connid} { rssbot::reconnect } namespace eval rssbot {} # state variables # mtime - modified time # ntime - expiration time # # # articles(source,url) [list mtime ... ntime ... args { ... } source "..."] # sources(site) [list mtime ... ntime ...] # subscribers(jid) [list mtime ... sites { ... } status "..."] # proc rssbot::begin {argv} { global doneP variable iqP variable loopID variable parser variable articles variable sources variable subscribers proc [namespace current]::reconnect {} \ [list [namespace current]::reconnect_aux $argv] if {[catch { set loopID "" [set parser [xml::parser]] configure \ -elementstartcommand [list [namespace current]::element \ begin] \ -elementendcommand [list [namespace current]::element \ end] \ -characterdatacommand [list [namespace current]::pcdata] \ -errorcommand [list [namespace current]::error] array set articles {} array set sources {} array set subscribers {} eval [list jlib::sendit 2 ""] $argv set iqP 0 foreach array [list articles sources subscribers] { incr iqP jlib::send_iq get \ [jlib::wrapper:createtag query \ -vars [list xmlns jabber:iq:private] \ -subtags [list [jlib::wrapper:createtag $array \ -vars [list xmlns rssbot.$array]]]] \ -connection [jlib::route ""] \ -command [list [namespace current]::iq_private 0] } while {$iqP > 0} { vwait [namespace current]::iqP } loop $argv } result]} { set doneP 1 bgerror $result } } proc rssbot::loop {argv} { variable loopID set loopID "" if {[catch { loop_aux $argv } result]} { bgerror $result } set loopID [after [expr 5*60*1000] [list [namespace current]::loop $argv]] } proc rssbot::loop_aux {argv} { variable articles variable sources variable subscribers array set updateP [list articles 0 sources 0 subscribers 0] set sites {} foreach jid [array names subscribers] { array set props $subscribers($jid) if {![string compare $props(status) available]} { foreach site $props(sites) { if {[lsearch -exact $sites $site] < 0} { lappend sites $site } } } } set now [clock seconds] foreach site $sites { catch { array unset sprops } array set sprops [list ntime 0] catch { array set sprops $sources($site) } if {$sprops(ntime) > $now} { continue } if {[catch { ::http::geturl $site } httpT]} { ::LOG "$site: $httpT" continue } switch -exact -- [set status [::http::status $httpT]] { ok { if {![string match 2* [set ncode [::http::ncode $httpT]]]} { ::LOG "$site: returns code $ncode" } else { catch { unset state } upvar #0 $httpT state catch { unset array meta } array set meta $state(meta) if {![info exists meta(Last-Modified)]} { set mtime $now } elseif {[catch { clock scan $meta(Last-Modified) } t]} { ::LOG "$site: invalid Last-Modified meta-data $meta(Last-Modified)" set mtime $now } else { set mtime $t } foreach {k v} [process $site $mtime [expr $now+(5*60)] \ $now [::http::data $httpT]] { if {$v} { set updateP($k) 1 } } } } timeout - default { ::LOG "$site: $status" } } ::http::cleanup $httpT } foreach jid [array names subscribers] { catch { array unset props } array set props $subscribers($jid) if {[catch { set props(mtime) } mtime]} { set mtime 0 } set xtime 0 foreach site $props(sites) { foreach article [array names articles] { catch { array unset aprops } array set aprops $articles($article) if {$aprops(ntime) <= $now} { unset articles($article) set updateP(articles) 1 continue } if {[string first "$site," $article]} { continue } if {$aprops(mtime) <= $mtime} { continue } if {[catch { eval [list jlib::sendit 1 $jid] $argv \ $aprops(args) } result]} { ::LOG "$jid: $result" } else { if {$xtime < $aprops(mtime)} { set xtime $aprops(mtime) } set jlib::lib(lastwhat) $aprops(source) set jlib::lib(lastwhen) $aprops(mtime) } } } if {$xtime > $mtime} { set updateP(subscribers) 1 set props(mtime) $xtime set subscribers($jid) [array get props] } } foreach array [list articles sources subscribers] { if {$updateP($array)} { jlib::send_iq set \ [jlib::wrapper:createtag query \ -vars [list xmlns jabber:iq:private] \ -subtags [list [jlib::wrapper:createtag $array \ -vars [list xmlns rssbot.$array] \ -chdata [array get $array]]]] \ -connection [jlib::route ""] \ -command [list [namespace current]::iq_private 1] } } } proc rssbot::process {site mtime ntime now data} { variable info variable parser variable stack variable sources array set info [list site $site ctime $mtime now $now articleP 0] set stack {} if {[catch { $parser parse $data } result]} { ::LOG "$site: $result" } else { set sources($site) [list mtime $mtime ntime $ntime] } return [list articles $info(articleP) sources $info(articleP)] } proc rssbot::element {tag name {av {}} args} { variable info variable stack variable articles switch -- $tag { begin { set parent [lindex [lindex $stack end] 0] lappend stack [list $name $av] switch -- $parent/$name { channel/title { array set info [list subject ""] } channel/item - rdf:RDF/item - RDF/item { array set info [list description "" \ body "" \ url "" \ date ""] } } } end { set stack [lreplace $stack end end] set parent [lindex [lindex $stack end] 0] switch -- $parent/$name { channel/item - rdf:RDF/item - RDF/item { } default { return } } if {[string compare $info(date) ""]} { if {![string compare [string range $info(date) 22 22] ":"]} { set info(date) [string replace $info(date) 22 22] } if {[catch { clock scan $info(date) } info(mtime)]} { ::LOG "$info(site): invalid dc:date $info(date)" set info(mtime) $info(ctime) } } else { set info(mtime) $info(ctime) } if {![string compare [set url $info(url)] ""]} { ::LOG "$info(site): missing URL in item" return } set ntime [expr $info(mtime)+(2*24*60*60)] if {$ntime <= $info(now)} { return } set site $info(site) if {[info exists articles($site,$url)]} { return } if {![string compare $info(body) ""]} { set info(body) [string trim "$info(description)\n$info(url)"] } set args {} foreach k [list subject body description url] { lappend args -$k [string trim $info($k)] } set articles($site,$url) \ [list mtime $info(mtime) \ ntime $ntime \ source [string trim $info(subject)] \ args $args] set info(articleP) 1 } } } proc rssbot::pcdata {text} { variable info variable stack if {![string compare [string trim $text] ""]} { return } set name [lindex [lindex $stack end] 0] set parent [lindex [lindex $stack end-1] 0] switch -- $parent/$name { channel/title { append info(subject) $text } item/title { append info(description) $text } item/link { append info(url) $text } item/description { append info(body) $text } item/dc:date - item/date { append info(date) $text } } } proc rssbot::error {args} { return -code error [join $args " "] } proc rssbot::message {jid request} { variable loopID variable articles variable sources variable subscribers if {[catch { split [string trim $request] } args]} { return $args } set answer "" set updateP 0 set arrayL [list subscribers] set fmt "%a %b %d %H:%M:%S %Z %Y" switch -glob -- [set arg0 [string tolower [lindex $args 0]]] { he* { set answer {commands are: subscribe URL unsubscribe [URL ...] reset [DATE-TIME] list dump [URL ...] flush help} } sub* { if {[llength $args] <= 1} { return "usage: subscribe URL ..." } array set props [list mtime 0 sites {} status available] if {([catch { array set props $subscribers($jid) }]) \ && ([lsearch -exact $jlib::roster(users) $jid] < 0)} { return "not authorized" } set s "" foreach arg [lrange $args 1 end] { if {![string compare $arg ""]} { append answer $s "invalid source: empty URL" } elseif {[lsearch -exact $props(sites) $arg] >= 0} { append answer $s "already subscribed to $arg" } elseif {[catch { uri::split $arg } result]} { append answer $s "invalid source: $arg ($result)" } else { lappend props(sites) $arg set updateP 1 append answer $s "added subscription to $arg" } set s "\n" } } unsub* { if {![info exists subscribers($jid)]} { return "no subscriptions" } array set props $subscribers($jid) if {[llength $args] <= 1} { set props(sites) {} set updateP 1 set s "" foreach site $props(sites) { append answer $s "cancelled subscription to $site" set s "\n" } } else { set s "" foreach arg [lrange $args 1 end] { if {[set x [lsearch -exact $props(sites) $arg]] < 0} { append answer $s "not subscribed to $arg" } else { set props(sites) [lreplace $props(sites) $x $x] set updateP 1 append answer $s "cancelled subscription to $arg" } set s "\n" } } } reset { if {![info exists subscribers($jid)]} { return "no subscriptions" } array set props $subscribers($jid) append answer "subscription history reset" if {[llength $args] <= 1} { set props(mtime) 0 } elseif {[catch { clock scan [concat [lrange $args 1 end]] \ -base [clock seconds] } m]} { return "invalid date-time: [concat [lrange $args 1 end]] ($m)" } else { set props(mtime) $m append answer " to [clock format $m -format $fmt]" } set updateP 1 } list { if {![info exists subscribers($jid)]} { return "no subscriptions" } array set props $subscribers($jid) set s "" foreach site $props(sites) { append answer $s $site set s "\n" } } dump { if {![info exists subscribers($jid)]} { return [jlib::wrapper:createtag subscriber \ -vars [list jid $jid]] } array set props $subscribers($jid) set tags {} if {[info exists props(mtime)]} { set chdata [clock format $props(mtime) -format $fmt] } else { set chdata never } lappend tags [jlib::wrapper:createtag updated -chdata $chdata] foreach site $props(sites) { if {([llength $args] > 1) && ([lsearch -exact [lrange $args 1 end] $site] \ < 0)} { continue } catch { unset array sprops } array set sprops $sources($site) set stags {} lappend stags [jlib::wrapper:createtag url -chdata $site] lappend stags [jlib::wrapper:createtag modified \ -chdata [clock format $sprops(mtime) \ -format $fmt]] lappend stags [jlib::wrapper:createtag expires \ -chdata [clock format $sprops(ntime) \ -format $fmt]] set atags {} foreach article [array names articles] { if {[string first "$site," $article]} { continue } set url [string range $article [string length $site,] end] catch { array unset aprops } array set aprops $articles($article) set atag {} lappend atag [jlib::wrapper:createtag url -chdata $url] lappend atag [jlib::wrapper:createtag modified \ -chdata [clock format $aprops(mtime) \ -format $fmt]] lappend atag [jlib::wrapper:createtag expires \ -chdata [clock format $aprops(ntime) \ -format $fmt]] lappend atag [jlib::wrapper:createtag args \ -chdata $aprops(args)] lappend atags [jlib::wrapper:createtag article \ -subtags $atag] } lappend stags [jlib::wrapper:createtag articles \ -subtags $atags] lappend tags [jlib::wrapper:createtag site \ -subtags $stags] } set answer [jlib::wrapper:createxml \ [jlib::wrapper:createtag subscriber \ -vars [list jid $jid] \ -subtags [list [jlib::wrapper:createtag \ sites -subtags $tags]]]] } flush { if {![info exists subscribers($jid)]} { return "no subscriptions" } array set props $subscribers($jid) foreach array [set arrayL [list articles sources]] { lappend arrayL $array array unset $array array set $array {} } set updateP 1 append answer "cache flushed" } default { append answer "unknown request: $arg0\n" append answer "try \"help\" instead" } } if {$updateP} { set subscribers($jid) [array get props] foreach array $arrayL { jlib::send_iq set \ [jlib::wrapper:createtag query \ -vars [list xmlns jabber:iq:private] \ -subtags [list [jlib::wrapper:createtag $array \ -vars [list xmlns rssbot.$array] \ -chdata [array get $array]]]] \ -connection [jlib::route ""] \ -command [list [namespace current]::iq_private 1] } if {[string compare $loopID ""]} { set script [lindex [after info $loopID] 0] after cancel $loopID set loopID [after idle $script] } } return $answer } proc rssbot::presence {jid status} { variable loopID variable articles variable sources variable subscribers if {![info exists subscribers($jid)]} { ::LOG "$jid not subscribed?!?" return } array set props $subscribers($jid) if {[string compare $props(status) $status]} { set props(status) $status set subscribers($jid) [array get props] jlib::send_iq set \ [jlib::wrapper:createtag query \ -vars [list xmlns jabber:iq:private] \ -subtags [list [jlib::wrapper:createtag subscribers \ -vars [list xmlns rssbot.subscribers] \ -chdata [array get subscribers]]]] \ -connection [jlib::route ""] \ -command [list [namespace current]::iq_private 1] if {(![string compare $status available]) \ && ([string compare $loopID ""])} { set script [lindex [after info $loopID] 0] after cancel $loopID set loopID [after idle $script] } } } proc rssbot::reconnect_aux {argv} { while {1} { after [expr 60*1000] if {![catch { eval [list jlib::sendit 2 ""] $argv } result]} { break } ::LOG $result } } proc rssbot::iq_private {setP status child} { global doneP variable iqP variable articles variable sources variable subscribers if {[set code [catch { if {[string compare $status OK]} { error "iq_private: [lindex $child 0]" } if {$setP} { return } jlib::wrapper:splitxml $child tag vars isempty chdata children set xmlns [jlib::wrapper:getattr $vars xmlns] jlib::wrapper:splitxml [lindex $children 0] tag vars isempty chdata \ children set xmlns [jlib::wrapper:getattr $vars xmlns] if {[catch { llength $chdata }]} { error "iq_private: bad data: $chdata" } if {$isempty} { set chdata {} } switch -- $xmlns { rssbot.articles - rssbot.sources - rssbot.subscribers { array set [string range $xmlns 7 end] $chdata } default { error "iq_private: unexpected namespace: $xmlns" } } incr iqP -1 } result]]} { if {$code == 2} { return } set doneP 1 set iqP 0 bgerror $result } } set debugP 0 set logFile "" proc ::LOG {message} { global debugP logFile if {$debugP > 0} { puts stderr $message } if {([string first "DEBUG " $message] == 0) \ || (![string compare $logFile ""]) \ || ([catch { set fd [open $logFile { WRONLY CREAT APPEND }] }])} { return } regsub -all "\n" $message " " message set now [clock seconds] if {[set x [string first . [set host [info hostname]]]] > 0} { set host [string range $host 0 [expr $x-1]] } catch { puts -nonewline $fd \ [format "%s %2d %s %s personal\[%d\]: %s\n" \ [clock format $now -format %b] \ [string trimleft [clock format $now -format %d] 0] \ [clock format $now -format %T] $host \ [expr [pid]%65535] $message] } catch { close $fd } } proc ::bgerror {err} { global errorInfo ::LOG "$err\n$errorInfo" } set status 1 array set jlib::lib [list lastwhen [clock seconds] lastwhat ""] if {(([set x [lsearch -exact $argv -help]] >= 0) \ || ([set x [lsearch -exact $argv --help]] >= 0)) \ && (![expr $x%2])} { puts stdout "usage: rssbot.tcl ?options...? -pidfile file -from jid -password string -tls boolean (e.g., 'true') The file .jsendrc.tcl is consulted, e.g., set args {-from fred@example.com/bedrock -password wilma} for default values." set status 0 } elseif {[expr $argc%2]} { puts stderr "usage: rssbot.tcl ?-key value?..." } elseif {[catch { if {([file exists [set file .jsendrc.tcl]]) \ || ([file exists [set file ~/.jsendrc.tcl]])} { set args {} source $file array set at [list -permissions 600] array set at [file attributes $file] if {([set x [lsearch -exact $args "-password"]] > 0) \ && (![expr $x%2]) \ && (![string match *00 $at(-permissions)])} { error "file should be mode 0600" } if {[llength $args] > 0} { set argv [eval [list linsert $argv 0] $args] } } } result]} { puts stderr "error in $file: $result" } else { if {([set x [lsearch -exact $argv -debug]] >= 0) && (![expr $x%2])} { switch -- [string tolower [lindex $argv [expr $x+1]]] { 1 - true - yes - on { set debugP 1 } } } if {([set x [lsearch -exact $argv -logfile]] >= 0) && (![expr $x%2])} { set logFile [lindex $argv [expr $x+1]] } set keep_alive 1 set keep_alive_interval 5 if {([set x [lsearch -exact $argv "-pidfile"]] >= 0) && (![expr $x%2])} { set fd [open [set pf [lindex $argv [expr $x+1]]] \ { WRONLY CREAT TRUNC }] puts $fd [pid] close $fd } after idle [list rssbot::begin $argv] set doneP 0 vwait doneP catch { file delete -- $pf } set status 0 } exit $status # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/examples/xrdb000075500000000000000000000000001477701321300145475ustar00nobodynobodytkabber/examples/xrdb/badlop-dark.xrdb000064400000000000000000000251351477701321300176750ustar00nobodynobody! Badlop-Dark.xrdb theme for Tkabber (based on dark2.xrdb) ! Font for drawing text (except chats and roster font) !*font: {Arial 10} ! Main window geometry ! [tamaño horizontal] ! x[tamaño vertical] ! -[separacion con borde derecho de pantalla] ! +[separación con borde superior de lapantalla] !!Tkabber.geometry: 700x520-30+170 ! Chat window geometry (in no tabs mode) !*Chat.geometry: 300x500-70+350 ! notabs !!*Chat.geometry: 300x500-70+350 !!*Chat.groupchatgeometry: 600x500 !!*Chat.chatgeometry: 500x500 ! Browser and Headlines window geometry (in no tabs mode) !!*JBrowser.geometry: 350x350 !!*JDisco.geometry: 500x500 ! Roster width (tabbed interface only) !!Tkabber.mainRosterWidth: 150 ! Roster width in groupchat windows !!Tkabber.chatRosterWidth: 80 ! Scrollbar bed color *troughColor: #424242 *background: #5e5e5e *readonlyBackground: #3f3f3f *foreground: #ffffff ! Colors, which are used when mouse is over the item *activeBackground: #550066 *activeForeground: #ffffff *disabledBackground: #3f3f3f *disabledForeground: #aaaaaa ! Colors and border width selected item *selectBackground: #550066 *selectForeground: #ffffff *selectBorderWidth: 0 *inactiveSelectBackground: #550066 ! Color for checkboxes *selectColor: #4f135b *Menu*selectColor: #ffffff ! Color of traversal highlight rectangle *highlightBackground: #5e5e5e *highlightColor: #000000 ! Color of insertion cursor *insertBackground: #ffffff ! Currently there is only progressbar (at the splash screen) *ProgressBar.foreground: #550066 ! Flatten ComboBox and ArrowButton +++ !!*Spinbox.borderWidth: 1 *Spinbox.background: #424242 *Spinbox.buttonBackground: #5e5e5e !!*SpinBox.borderWidth: 1 *SpinBox*Entry*highlightBackground: #424242 !!*ComboBox.borderWidth: 1 !!*ArrowButton*borderWidth: 1 *ArrowButton.borderWidth: 0 *ArrowButton.highlightThickness: 0 ! Colors for multicolumn listboxes (as in search result window) *Mclistbox.background: #424242 *Mclistbox.labelActiveBackground: #550066 *Mclistbox.labelBackground: #5e5e5e *Mclistbox.labelForeground: #ffffff *Mclistbox.labelActiveForeground: #ffffff ! Button and Menubutton colors ! Generic button *Button.background: #5e5e5e *Button.activeBackground: #550066 ! Generic menubutton *Menubutton.background: #5e5e5e *Menubutton.activeBackground: #550066 ! Buttons in chat and message windows *Chat*Button.background: #5e5e5e *Chat*Menubutton.background: #5e5e5e *Message*Menubutton.background: #5e5e5e *bbox.Button.background: #5e5e5e ! Menu colors *Menu.background: #5e5e5e *Menu.activeBackground: #550066 ! Main toolbar buttons *mainframe.topf.tb0.bbox.Button.background: #5e5e5e ! Sign/encrypt message buttons *bottom.buttons1.Button.background: #5e5e5e ! Type of subitem in roster (1 - display number of resources, ! 2 - display arrow, 3 - display both, 0 - display nothing *Roster.subitemtype: 3 ! Roster background color *Roster.cbackground: #424242 ! Inactive metaJID background color *Roster.metajidfill: #505050 ! Active metaJID background color *Roster.metajidhlfill: #520a60 ! Color of border around metaJID *Roster.metajidborder: #505050 ! Inactive JID background color *Roster.jidfill: #424242 ! Active JID background color *Roster.jidhlfill: #4f135b ! Color of border around JID *Roster.jidborder: #424242 ! Inctive group background color *Roster.groupfill: #5e5e5e ! Inactive closed group background color *Roster.groupcfill: #5e5e5e ! Active group background color *Roster.grouphlfill: #550066 ! Color of border around group *Roster.groupborder: #5e5e5e ! Indent of group names !!*Roster.groupindent: 21 ! Indent of JIDs !!*Roster.jidindent: 42 ! Indent of second order JIDs ! (resources for those who is logged in multiple times) !!*Roster.subjidindent: 62 ! Indent of group icons (closed or open arrow icon) !!*Roster.groupiconindent: 2 ! Indent of group icons when subitemtype is 2 or 3 !!*Roster.subgroupiconindent: 2 ! Indent of regular JID icons (status icon) !!*Roster.iconindent: 21 ! Indent of second order JID icons !!*Roster.subiconindent: 42 ! Additional amount of text height !!*Roster.textuppad: 0 !!*Roster.textdownpad: 0 ! Vertical distance between adjacent items !!*Roster.linepad: 2 ! Foregrounds of JID label ! (stalkerforeground is for contacts with pending subscription) *Roster.stalkerforeground: #d2b48c ! Other colors are selfexplanatory *Roster.unavailableforeground: #b8b8b8 *Roster.dndforeground: #ffc1c1 *Roster.xaforeground: #c1cdcd *Roster.awayforeground: #c1cdcd *Roster.availableforeground: #ffffff *Roster.chatforeground: #ffffff ! Colors in chat and groupchat windows *Chat*Text*Label.background: #66685e ! Color of other people nicknames *Chat.theyforeground: #ff7f50 ! Color of my nickname *Chat.meforeground: #add8e6 ! Colors of server messages *Chat.serverlabelforeground: #caff70 *Chat.serverforeground: #ff69b4 ! Color of error messages *Chat.errforeground: #ff6a6a ! Color of inactive urls in text *urlforeground: #add8e6 ! Color of active urls in text *urlactiveforeground: #add8e6 ! Colors of erroneous words (when ispell module is using) *Text.errorColor: #ff7f50 *Text.comboColor: #add8e6 *Chat.inputheight: 3 ! Colors of tab labels (when in tabbed mode) ! Usual color *alertColor0: #ffffff ! Color when server message is arrived *alertColor1: #ff69b4 ! Color when message is arrived *alertColor2: #add8e6 ! Color when personally addressed message is arrived *alertColor3: #ff7f50 ! Colors for browser and discovery service windows *JBrowser.fill: #ffffff *JBrowser.activefill: #ffffff *JBrowser.border: #424242 ! ale *JBrowser.nscolor: #b8b8b8 *JBrowser.nsactivecolor: #b8b8b8 *JBrowser.cbackground: #b8b8b8 ! White *JBrowser.foreground: #b8b8b8 ! Black !!*JBrowser.levelindent: 24 !!*JBrowser.indent: 3 !!*JBrowser.nsindent: 2 !!*JBrowser.linepad: 2 !!*JBrowser.toppad: 1 !!*JBrowser.bottompad: 1 !!*JBrowser.icontextpad: 2 ! MidnightBlue ! Blue *JDisco.fill: #ffffff *JDisco.activefill: #ffffff *JDisco.border: #424242 *JDisco.featurecolor: #b8b8b8 *JDisco.identitycolor: #b4eeb4 *JDisco.optioncolor: #ff69b4 *Tree*background: #424242 *linesfill: #ffffff *crossfill: #000000 ! ale *JDisco.cbackground: #ffffff *JDisco.foreground: #000000 ! Tooltip options *Balloon*background: #424242 *Balloon*foreground: #ffffff *DynamicHelp.background: #424242 *DynamicHelp.foreground: #ffffff *Baloon.style: delay *Listbox.background: #424242 *Listbox.foreground: #ffffff !!*Listbox.borderWidth: 1 *Text.background: #424242 *Text.foreground: #ffffff !!*Text.borderWidth: 1 *Entry.background: #424242 *Entry.foreground: #ffffff !!*Entry.borderWidth: 1 *NoteBook*Entry.background: #424242 *NoteBook*Entry.disabledBackground: #5e5e5e *NoteBook*Entry.foreground: #ffffff !!*Button.borderWidth: 1 !!*Menu.activeBorderWidth: 1 !!*Menu.borderWidth: 1 !!*Menubutton.borderWidth: 1 *Buttonbox*borderWidth: 0 *Buttonbox*activeBorderWidth: 0 ! ale *Search.itemBackground: #ffffff ! ale *RawXML.inforeground: #e0c3c3 *RawXML.outforeground: #a3a3ff *RawXML.intagforeground: #e0c3c3 *RawXML.inattrforeground: #e0c3c3 *RawXML.invalueforeground: #d1aef2 *RawXML.incdataforeground: #b2dcff *RawXML.outtagforeground: #efb3ef *RawXML.outattrforeground: #efb3ef *RawXML.outvalueforeground: #c9ffc9 *RawXML.outcdataforeground: #b6b6f9 *RawXML.inputheight: 4 !!*Scrollbar.width: 8 ! vim:ft=xdefaults:ts=8:sw=4:sts=4:et tkabber/examples/xrdb/black.xrdb000064400000000000000000000072051477701321300165670ustar00nobodynobody*background: black *foreground: grey *disabledBackground: black *disabledForeground: grey50 *readonlyBackground: #000000 *errorForeground: coral3 *activeBackground: grey30 *activeForeground: grey100 *selectBackground: grey *selectForeground: black *selectBorderWidth: 0 *inactiveSelectBackground: grey *selectColor: black *Menu*selectColor: grey *highlightSearchBackground: #c1eec1 *highlightBackground: black *highlightColor: grey *insertBackground: grey *troughColor: black !!*Spinbox.borderWidth: 1 *Spinbox.background: black *Spinbox.buttonBackground: black !!*SpinBox.borderWidth: 1 *SpinBox*Entry*highlightBackground: black !!*ComboBox.borderWidth: 1 *ArrowButton.borderWidth: 0 *ArrowButton.highlightThickness: 0 *Mclistbox.background: black *Mclistbox.labelBackground: black *Mclistbox.labelForeground: grey *Mclistbox.labelActiveBackground: grey30 *Mclistbox.labelActiveForeground: grey100 *Roster.cbackground: Black *Roster.metajidfill: Gray15 *Roster.metajidhlfill: #4a396f *Roster.metajidborder: Gray15 *Roster.jidfill: Black *Roster.jidhlfill: #382b54 *Roster.jidborder: Black *Roster.groupfill: Gray30 *Roster.groupcfill: Gray30 *Roster.grouphlfill: MediumPurple4 *Roster.groupborder: Black *JBrowser.fill: Grey *JBrowser.activefill: Grey *JBrowser.border: Black *JBrowser.nscolor: LightSteelBlue3 *JBrowser.nsactivecolor: LightSteelBlue3 *linesfill: Grey *crossfill: Grey *JDisco.fill: Grey *JDisco.activefill: Grey *JDisco.border: Black *JDisco.featurecolor: LightSteelBlue3 *JDisco.identitycolor: darkolivegreen3 *JDisco.optioncolor: mediumorchid3 *Tree*background: Black *Roster.stalkerforeground: grey40 *Roster.unavailableforeground: grey40 *Roster.dndforeground: grey45 *Roster.xaforeground: grey50 *Roster.awayforeground: grey50 *Roster.availableforeground: grey55 *Roster.chatforeground: grey55 *Chat*Text*Label.background: black *Chat.theyforeground: cornflowerblue *Chat.meforeground: coral3 *Chat.serverlabelforeground: darkolivegreen3 *Chat.serverforeground: mediumorchid3 *Chat.infoforeground: cornflowerblue *Chat.errforeground: coral3 *urlforeground: cornflowerblue *urlactiveforeground: skyblue *Text.errorColor: coral3 *Text.comboColor: cornflowerblue *ProgressBar.foreground: grey *alertColor0: Grey *alertColor1: mediumorchid3 *alertColor2: cornflowerblue *alertColor3: coral3 *NoteBook*Entry.background: #000000 *NoteBook*Entry.disabledBackground: #000000 *NoteBook*Entry.foreground: grey *Customize.varforeground: cornflowerblue ! vim:ft=xdefaults:ts=8:sw=4:sts=4:et tkabber/examples/xrdb/dark.xrdb000064400000000000000000000164331477701321300164370ustar00nobodynobody! Main window geometry !!Tkabber.geometry: 788x550-70+100 !Tkabber.geometry: 180x400-70+100 ! Chat window geometry (in no tabs mode) !!*Chat.geometry: 500x500 ! Browser and Headlines window geometry (in no tabs mode) !!*JBrowser.geometry: 500x500 ! Roster width (tabbed interface only) !!Tkabber.mainRosterWidth: 120 ! Roster width in groupchat windows !!Tkabber.chatRosterWidth: 90 ! Scrollbar bed color *troughColor: #424242 *background: #5e5e5e *foreground: #ffffff *readonlyBackground: #5e5e5e *disabledBackground: #5e5e5e *disabledForeground: #cccccc *errorForeground: indianred1 ! Colors, which are used when mouse is over the item *activeBackground: #550066 *activeForeground: #ffffff ! Colors and border width selected item *selectBackground: #550066 *selectForeground: #ffffff *selectBorderWidth: 0 *inactiveSelectBackground: #550066 ! Color for checkboxes *selectColor: #4f135b *Menu*selectColor: #ffffff ! Color of traversal highlight rectangle *highlightBackground: #5e5e5e *highlightColor: #000000 ! Color of insertion cursor *insertBackground: #ffffff ! Font for drawing text (except chats and roster font) !!*font: {Arial 10} ! Currently there is only progressbar (at the splash screen) *ProgressBar.foreground: #550066 ! Flatten ComboBox and ArrowButton !!*Spinbox.borderWidth: 1 *Spinbox.background: #424242 *Spinbox.buttonBackground: #5e5e5e !!*SpinBox.borderWidth: 1 *SpinBox*Entry*highlightBackground: #424242 !!*ComboBox.borderWidth: 1 *ArrowButton.borderWidth: 0 *ArrowButton.highlightThickness: 0 ! Colors for multicolumn listboxes (as in search result window) *Mclistbox.background: #424242 *Mclistbox.labelActiveBackground: #550066 *Mclistbox.labelBackground: #5e5e5e *Mclistbox.labelForeground: #ffffff *Mclistbox.labelActiveForeground: #ffffff ! Type of subitem in roster (1 - display number of resources, ! 2 - display arrow, 3 - display both, 0 - display nothing *Roster.subitemtype: 3 ! Roster background color *Roster.cbackground: #424242 ! Inactive metaJID background color *Roster.metajidfill: #505050 ! Active metaJID background color *Roster.metajidhlfill: #520a60 ! Color of border around metaJID *Roster.metajidborder: #505050 ! Inactive JID background color *Roster.jidfill: #424242 ! Active JID background color *Roster.jidhlfill: #4f135b ! Color of border around JID *Roster.jidborder: #424242 ! Inctive group background color *Roster.groupfill: #5e5e5e ! Inactive closed group background color *Roster.groupcfill: #5e5e5e ! Active group background color *Roster.grouphlfill: #550066 ! Color of border around group *Roster.groupborder: #5e5e5e ! Indent of group names !!*Roster.groupindent: 21 ! Indent of JIDs !!*Roster.jidindent: 42 ! Indent of second order JIDs ! (resources for those who is logged in multiple times) !!*Roster.subjidindent: 62 ! Indent of group icons (closed or open arrow icon) !!*Roster.groupiconindent: 2 ! Indent of group icons when subitemtype is 2 or 3 !!*Roster.subgroupiconindent: 2 ! Indent of regular JID icons (status icon) !!*Roster.iconindent: 21 ! Indent of second order JID icons !!*Roster.subiconindent: 42 ! Additional amount of text height !!*Roster.textuppad: 0 !!*Roster.textdownpad: 0 ! Vertical distance between adjacent items !!*Roster.linepad: 2 ! Foregrounds of JID label ! (stalkerforeground is for contacts with pending subscription) *Roster.stalkerforeground: tan ! Other colors are selfexplanatory *Roster.unavailableforeground: grey72 *Roster.dndforeground: rosybrown1 *Roster.xaforeground: azure3 *Roster.awayforeground: azure3 *Roster.availableforeground: #ffffff *Roster.chatforeground: #ffffff ! Colors in chat and groupchat windows *Chat*Text*Label.background: #424242 ! Color of other people nicknames *Chat.theyforeground: coral ! Color of my nickname *Chat.meforeground: lightblue ! Colors of server messages *Chat.serverlabelforeground: darkolivegreen1 *Chat.serverforeground: hotpink ! Color of info & error messages *Chat.infoforeground: lightblue *Chat.errforeground: indianred1 ! Color of inactive urls in text *urlforeground: lightblue ! Color of active urls in text *urlactiveforeground: lightblue1 ! Colors of erroneous words (when ispell module is using) *Text.errorColor: coral *Text.comboColor: lightblue ! Colors of tab labels (when in tabbed mode) ! Usual color *alertColor0: white ! Color when server message is arrived *alertColor1: hotpink ! Color when message is arrived *alertColor2: lightblue ! Color when personally addressed message is arrived *alertColor3: coral ! Colors for browser and discovery service windows *JBrowser.fill: #ffffff *JBrowser.activefill: #ffffff *JBrowser.border: #424242 *JBrowser.nscolor: grey72 *JBrowser.nsactivecolor: grey72 *JDisco.fill: #ffffff *JDisco.activefill: #ffffff *JDisco.border: #424242 *JDisco.featurecolor: grey72 *JDisco.identitycolor: DarkSeaGreen2 *JDisco.optioncolor: HotPink *Tree*background: #424242 *linesfill: #ffffff *crossfill: #ffffff *Customize.varforeground: lightblue ! Tooltip options *Balloon*background: #424242 *Balloon*foreground: #ffffff *DynamicHelp.background: #424242 *DynamicHelp.foreground: #ffffff *Listbox.background: #424242 *Listbox.foreground: #ffffff !!*Listbox.borderWidth: 1 *Text.background: #424242 *Text.foreground: #ffffff !!*Text.borderWidth: 1 *Entry.background: #424242 *Entry.foreground: #ffffff !!*Entry.borderWidth: 1 *NoteBook*Entry.background: #424242 *NoteBook*Entry.disabledBackground: #5e5e5e *NoteBook*Entry.foreground: #ffffff !!*Button.borderWidth: 1 !!*Menu.activeBorderWidth: 1 !!*Menu.borderWidth: 1 !!*Menubutton.borderWidth: 1 *Buttonbox*borderWidth: 0 *Buttonbox*activeBorderWidth: 0 ! vim:ft=xdefaults:ts=8:sw=4:sts=4:et tkabber/examples/xrdb/dark2.xrdb000064400000000000000000000173771477701321300165310ustar00nobodynobody! Main window geometry !!Tkabber.geometry: 788x550-70+100 !Tkabber.geometry: 180x400-70+100 ! Chat window geometry (in no tabs mode) !!*Chat.geometry: 500x500 ! Browser and Headlines window geometry (in no tabs mode) !!*JBrowser.geometry: 500x500 ! Roster width (tabbed interface only) !!Tkabber.mainRosterWidth: 110 ! Roster width in groupchat windows !!Tkabber.chatRosterWidth: 100 ! Scrollbar bed color *troughColor: #2c2c2c *background: #3f3f3f *foreground: #bfbfae *readonlyBackground: #3f3f3f *disabledForeground: #a9a999 *errorForeground: #f99393 *disabledBackground: #3f3f3f ! Colors, which are used when mouse is over the item *activeBackground: #616151 *activeForeground: #ffffff ! Colors and border width selected item *selectBackground: #4c4c3f *selectForeground: #bfbfae *selectBorderWidth: 0 *inactiveSelectBackground: #4c4c3f ! Color for checkboxes *selectColor: #616151 *Menu*selectColor: #bfbfae ! Color of traversal highlight rectangle *highlightBackground: #3f3f3f *highlightColor: #000000 ! Color of insertion cursor *insertBackground: #bfbfae ! Font for drawing text (except chats and roster font) !!*font: {Arial 10} ! Currently there is only progressbar (at the splash screen) *ProgressBar.foreground: #616151 ! Flatten ComboBox and ArrowButton !*Spinbox.borderWidth: 1 *Spinbox.background: #66685e *Spinbox.buttonBackground: #3f3f3f !*SpinBox.borderWidth: 1 *SpinBox*Entry*highlightBackground: #66685e !*ComboBox.borderWidth: 1 *ArrowButton.borderWidth: 0 *ArrowButton.highlightThickness: 0 ! Colors for multicolumn listboxes (as in search result window) *Mclistbox.background: #66685e *Mclistbox.labelActiveBackground: #616151 *Mclistbox.labelBackground: #3f3f3f *Mclistbox.labelForeground: #bfbfae *Mclistbox.labelActiveForeground: #ffffff ! Type of subitem in roster (1 - display number of resources, ! 2 - display arrow, 3 - display both, 0 - display nothing *Roster.subitemtype: 3 ! Roster background color *Roster.cbackground: #66685e ! Inactive metaJID background color *Roster.metajidfill: #5e5f52 ! Active metaJID background color *Roster.metajidhlfill: #4c4c3f ! Color of border around metaJID *Roster.metajidborder: #5e5f52 ! Inactive JID background color *Roster.jidfill: #66685e ! Active JID background color *Roster.jidhlfill: #4c4c3f ! Color of border around JID *Roster.jidborder: #66685e ! Inactive group background color *Roster.groupfill: #575747 ! Inactive closed group background color *Roster.groupcfill: #575747 ! Active group background color *Roster.grouphlfill: #4c4c3f ! Color of border around group *Roster.groupborder: #575747 ! Indent of group names !!*Roster.groupindent: 21 ! Indent of JIDs !!*Roster.jidindent: 42 ! Indent of second order JIDs ! (resources for those who is logged in multiple times) !!*Roster.subjidindent: 62 ! Indent of group icons (closed or open arrow icon) !!*Roster.groupiconindent: 2 ! Indent of group icons when subitemtype is 2 or 3 !!*Roster.subgroupiconindent: 2 ! Indent of regular JID icons (status icon) !!*Roster.iconindent: 21 ! Indent of second order JID icons !!*Roster.subiconindent: 42 ! Additional amount of text height !!*Roster.textuppad: 0 !!*Roster.textdownpad: 0 ! Vertical distance between adjacent items !!*Roster.linepad: 2 ! Foregrounds of JID label ! (stalkerforeground is for contacts with pending subscription) *Roster.stalkerforeground: tan ! Other colors are selfexplanatory *Roster.unavailableforeground: #b5b5a6 *Roster.dndforeground: #ccb5a6 *Roster.xaforeground: #bfbfae *Roster.awayforeground: #bfbfae *Roster.availableforeground: #ccccbb *Roster.chatforeground: #ccccbb ! Colors in chat and groupchat windows *Chat*Text*Label.background: #66685e ! Color of other people nicknames *Chat.theyforeground: #f99393 ! Color of my nickname *Chat.meforeground: #add8cc ! Colors of server messages *Chat.serverlabelforeground: #bbe8bb *Chat.serverforeground: #e899b5 ! Color of info & error messages *Chat.infoforeground: #add8cc *Chat.errforeground: #f99393 ! Color of inactive urls in text *urlforeground: #add8cc ! Color of active urls in text *urlactiveforeground: #c0ede0 ! Colors of erroneous words (when ispell module is using) *Text.errorColor: #f99393 *Text.comboColor: #add8cc *Customize.varforeground: #add8cc ! Colors of tab labels (when in tabbed mode) ! Usual color *alertColor0: #bfbfae ! Color when server message is arrived *alertColor1: #e899b5 ! Color when message is arrived *alertColor2: #add8cc ! Color when personally addressed message is arrived *alertColor3: #f99393 ! Colors for Raw XML window *RawXML.inforeground: #f99393 *RawXML.outforeground: #add8cc *RawXML.intagforeground: #f99393 *RawXML.inattrforeground: #f99393 *RawXML.invalueforeground: #e899b5 *RawXML.incdataforeground: #add8cc *RawXML.outtagforeground: #e899b5 *RawXML.outattrforeground: #e899b5 *RawXML.outvalueforeground: #bbe8bb *RawXML.outcdataforeground: #add8cc ! Colors for browser and discovery service windows *JBrowser.fill: #bfbfae *JBrowser.activefill: #bfbfae *JBrowser.border: #66685e *JBrowser.nscolor: #cfdfbe *JBrowser.nsactivecolor: #cfdfbe *JDisco.fill: #bfbfae *JDisco.activefill: #bfbfae *JDisco.border: #66685e *JDisco.featurecolor: #cfdfbe *JDisco.identitycolor: #bbe8bb *JDisco.optioncolor: #e899b5 *Tree*background: #66685e *linesfill: #bfbfae *crossfill: #bfbfae ! Tooltip options *Balloon*background: #bfbfae *Balloon*foreground: #000000 *DynamicHelp.background: #bfbfae *DynamicHelp.foreground: #000000 *Listbox.background: #66685e *Listbox.foreground: #bfbfae !!*Listbox.borderWidth: 1 *Text.background: #66685e *Text.foreground: #bfbfae !!*Text.borderWidth: 1 *Entry.background: #66685e *Entry.foreground: #bfbfae !!*Entry.borderWidth: 1 *NoteBook*Entry.background: #66685e *NoteBook*Entry.disabledBackground: #3f3f3f *NoteBook*Entry.foreground: #bfbfae !!*Button.borderWidth: 1 !!*Menu.activeBorderWidth: 1 !!*Menu.borderWidth: 1 !!*Menubutton.borderWidth: 1 *Buttonbox*borderWidth: 0 *Buttonbox*activeBorderWidth: 0 !!*Scrollbar.width: 8 ! vim:ft=xdefaults:ts=8:sw=4:sts=4:et tkabber/examples/xrdb/green.xrdb000064400000000000000000000131121477701321300166050ustar00nobodynobody! Main window geometry !!Tkabber.geometry: 788x550-70+100 !Tkabber.geometry: 200x350-70+100 ! Chat window geometry (in no tabs mode) !!*Chat.geometry: 500x500 ! Browser and Headlines window geometry (in no tabs mode) !!*JBrowser.geometry: 500x500 ! Roster width (tabbed interface only) !!Tkabber.mainRosterWidth: 120 ! Roster width in groupchat windows !!Tkabber.chatRosterWidth: 90 *background: ForestGreen *foreground: LawnGreen *readonlyBackground: ForestGreen *disabledBackground: ForestGreen *disabledForeground: PaleGreen3 *activeBackground: PaleGreen3 *activeForeground: DarkOliveGreen *selectBackground: LawnGreen *selectForeground: ForestGreen *inactiveSelectBackground: LawnGreen *highlightBackground: ForestGreen *highlightForeground: LawnGreen *selectColor: MediumSeaGreen *Menu*selectColor: LawnGreen *selectBorderWidth: 0 *insertBackground: LawnGreen *troughColor: ForestGreen *errorForeground: orange !!*font: {Arial 10} *ProgressBar.foreground: PaleGreen2 !!*Spinbox.borderWidth: 1 *Spinbox.background: ForestGreen *Spinbox.buttonBackground: ForestGreen !!*SpinBox.borderWidth: 1 *SpinBox*Entry*highlightBackground: ForestGreen !!*ComboBox.borderWidth: 1 *ArrowButton.borderWidth: 0 *ArrowButton.highlightThickness: 0 *Mclistbox.background: ForestGreen *Mclistbox.labelActiveBackground: PaleGreen3 *Mclistbox.labelBackground: ForestGreen *Mclistbox.labelForeground: LawnGreen *Mclistbox.labelActiveForeground: DarkOliveGreen *Roster.subitemtype: 3 *Roster.cbackground: ForestGreen *Roster.metajidfill: #117811 *Roster.metajidhlfill: #117811 *Roster.metajidborder: #117811 *Roster.jidfill: ForestGreen *Roster.jidhlfill: ForestGreen *Roster.jidborder: ForestGreen *Roster.groupfill: DarkGreen *Roster.groupcfill: DarkGreen *Roster.grouphlfill: DarkGreen *Roster.groupborder: DarkGreen !!*Roster.groupindent: 21 !!*Roster.jidindent: 42 !!*Roster.subjidindent: 62 !!*Roster.groupiconindent: 2 !!*Roster.subgroupiconindent: 2 !!*Roster.iconindent: 21 !!*Roster.subiconindent: 42 !!*Roster.textuppad: 0 !!*Roster.textdownpad: 0 !!*Roster.linepad: 2 *Roster.stalkerforeground: LimeGreen *Roster.unavailableforeground: PaleGreen2 *Roster.dndforeground: PaleGreen3 *Roster.xaforeground: PaleGreen1 *Roster.awayforeground: PaleGreen *Roster.availableforeground: LawnGreen *Roster.chatforeground: LawnGreen *Chat*Text*Label.background: ForestGreen *Chat.theyforeground: DarkSeaGreen2 *Chat.meforeground: DarkOliveGreen2 *Chat.serverlabelforeground: DarkSeaGreen3 *Chat.serverforeground: DarkSeaGreen3 *Chat.infoforeground: DarkSeaGreen2 *Chat.errforeground: orange *urlforeground: DarkOliveGreen2 *urlactiveforeground: Green *Text.errorColor: orange *Text.comboColor: Yellow *alertColor0: PaleGreen3 *alertColor1: PaleGreen2 *alertColor2: PaleGreen3 *alertColor3: LawnGreen *JBrowser.fill: LawnGreen *JBrowser.activefill: White *JBrowser.border: Pink *JBrowser.nscolor: MediumSeaGreen *JBrowser.nsactivecolor: Blue *JDisco.fill: LawnGreen *JDisco.activefill: White *JDisco.border: Pink *JDisco.featurecolor: MediumSeaGreen *JDisco.identitycolor: MediumSeaGreen *JDisco.optioncolor: MediumSeaGreen *Tree*background: ForestGreen *linesfill: LawnGreen *crossfill: LawnGreen *Balloon*background: ForestGreen *Balloon*foreground: PaleGreen *DynamicHelp.background: ForestGreen *DynamicHelp.foreground: PaleGreen *Listbox.background: ForestGreen *Listbox.foreground: PaleGreen !!*Listbox.borderWidth: 1 *Text.background: ForestGreen *Text.foreground: PaleGreen !!*Text.borderWidth: 1 *Entry.background: ForestGreen *Entry.foreground: LawnGreen !!*Entry.borderWidth: 1 *NoteBook*Entry.background: ForestGreen *NoteBook*Entry.disabledBackground: ForestGreen *NoteBook*Entry.foreground: LawnGreen !!*Button.borderWidth: 1 !!*Menu.activeBorderWidth: 1 !!*Menu.borderWidth: 1 !!*Menubutton.borderWidth: 1 *Buttonbox*borderWidth: 0 *Buttonbox*activeBorderWidth: 0 *Customize.varforeground: DarkOliveGreen2 ! vim:ft=xdefaults:ts=8:sw=4:sts=4:et tkabber/examples/xrdb/ice.xrdb000064400000000000000000000213331477701321300162510ustar00nobodynobody! Main window geometry !!Tkabber.geometry: 788x550-70+100 !Tkabber.geometry: 180x400-70+100 ! Chat window geometry (in no tabs mode) !!*Chat.geometry: 500x500 ! Browser and Headlines window geometry (in no tabs mode) !!*JBrowser.geometry: 500x500 ! Roster width (tabbed interface only) !!Tkabber.mainRosterWidth: 120 ! Roster width in groupchat windows !!Tkabber.chatRosterWidth: 90 ! Scrollbar bed color *troughColor: #c1c1cc *background: #d3d3dd *foreground: #000000 *readonlyBackground: #d3d3dd *disabledBackground: #d3d3dd *disabledForeground: #535373 *errorForeground: firebrick4 ! Colors, which are used when mouse is over the item *activeBackground: #c2c2e3 *activeForeground: #000000 ! Colors and border width selected item *selectBackground: #b2b2f1 *selectForeground: #336699 !!*selectBorderWidth: 1 *inactiveSelectBackground: #b2b2f1 ! Color for checkboxes *selectColor: #ababb5 *Menu*selectColor: #000000 ! Color of traversal highlight rectangle *highlightBackground: #d3d3dd *highlightColor: #666666 ! Color of insertion cursor *insertBackground: #000000 ! Font for drawing text (except chats and roster font) !!*font: {Arial 10} ! Currently there is only progressbar (at the splash screen) *ProgressBar.foreground: #b2b2f1 ! Flatten ComboBox and ArrowButton !!*Spinbox.borderWidth: 1 *Spinbox.background: #e5e5f7 *Spinbox.buttonBackground: #d3d3dd !!*SpinBox.borderWidth: 1 *SpinBox*Entry*highlightBackground: #e5e5f7 !!*ComboBox.borderWidth: 1 *ArrowButton.borderWidth: 0 *ArrowButton.highlightThickness: 0 ! Colors for multicolumn listboxes (as in search result window) *Mclistbox.background: #e5e5f7 *Mclistbox.labelActiveBackground: #c2c2e3 *Mclistbox.labelBackground: #c6c6cf *Mclistbox.labelForeground: #000000 *Mclistbox.labelActiveForeground: #000000 *Button.background: #c6c6cf *Menubutton.background: #c6c6cf *Menu.activeBackground: #c2c2e3 *Chat*Button.background: #d3d3dd *Chat*Menubutton.background: #d3d3dd *Message*Menubutton.background: #d3d3dd *bbox.Button.background: #c6c6cf *mainframe.topf.tb0.bbox.Button.background: #d3d3dd *bottom.buttons1.Button.background: #d3d3dd ! Type of subitem in roster (1 - display number of resources, ! 2 - display arrow, 3 - display both, 0 - display nothing *Roster.subitemtype: 3 ! Roster background color *Roster.cbackground: #e5e5f7 ! Inactive metaJID background color *Roster.metajidfill: #dcdcea ! Active metaJID background color *Roster.metajidhlfill: #c2c2e3 ! Color of border around metaJID *Roster.metajidborder: #dcdcea ! Inactive JID background color *Roster.jidfill: #e5e5f7 ! Active JID background color *Roster.jidhlfill: #c2c2e3 ! Color of border around JID *Roster.jidborder: #e5e5f7 ! Inctive group background color *Roster.groupfill: #d3d3dd ! Inactive closed group background color *Roster.groupcfill: #d3d3dd ! Active group background color *Roster.grouphlfill: #c2c2e3 ! Color of border around group *Roster.groupborder: #d3d3dd ! Indent of group names !!*Roster.groupindent: 21 ! Indent of JIDs !!*Roster.jidindent: 42 ! Indent of second order JIDs ! (resources for those who is logged in multiple times) !!*Roster.subjidindent: 62 ! Indent of group icons (closed or open arrow icon) !!*Roster.groupiconindent: 2 ! Indent of group icons when subitemtype is 2 or 3 !!*Roster.subgroupiconindent: 2 ! Indent of regular JID icons (status icon) !!*Roster.iconindent: 21 ! Indent of second order JID icons !!*Roster.subiconindent: 42 ! Additional amount of text height !!*Roster.textuppad: 0 !!*Roster.textdownpad: 0 ! Vertical distance between adjacent items !!*Roster.linepad: 2 ! Foregrounds of JID label ! (stalkerforeground is for contacts with pending subscription) *Roster.stalkerforeground: #663333 ! Other colors are selfexplanatory *Roster.unavailableforeground: #515151 *Roster.dndforeground: #515129 *Roster.xaforeground: #0b3760 *Roster.awayforeground: #0b3760 *Roster.availableforeground: dodgerblue4 *Roster.chatforeground: dodgerblue4 ! Colors in chat and groupchat windows *Chat*Text*Label.background: #e5e5f7 ! Color of other people nicknames *Chat.theyforeground: firebrick4 ! Color of my nickname *Chat.meforeground: dodgerblue4 ! Colors of server messages *Chat.serverlabelforeground: seagreen *Chat.serverforeground: #4b3a70 ! Color of info & error messages *Chat.infoforeground: dodgerblue4 *Chat.errforeground: firebrick4 ! Color of inactive urls in text *urlforeground: dodgerblue4 ! Color of active urls in text *urlactiveforeground: dodgerblue3 ! Colors of erroneous words (when ispell module is using) *Text.errorColor: firebrick4 *Text.comboColor: dodgerblue4 ! Colors of tab labels (when in tabbed mode) ! Usual color *alertColor0: black ! Color when server message is arrived *alertColor1: mediumpurple4 ! Color when message is arrived *alertColor2: dodgerblue4 ! Color when personally addressed message is arrived *alertColor3: firebrick4 ! Colors for browser and discovery service windows *JBrowser.fill: #000000 *JBrowser.activefill: #000000 *JBrowser.border: #e5e5f7 *JBrowser.nscolor: #666666 *JBrowser.nsactivecolor: #666666 *JDisco.fill: #000000 *JDisco.activefill: #000000 *JDisco.border: #e5e5f7 *JDisco.featurecolor: #666666 *JDisco.identitycolor: DarkGreen *JDisco.optioncolor: DarkViolet *Tree*background: #e5e5f7 *linesfill: #000000 *crossfill: #000000 ! Tooltip options *Balloon*background: #c2c2e3 *Balloon*foreground: #000000 *DynamicHelp.background: #c2c2e3 *DynamicHelp.foreground: #000000 *Listbox.background: #e5e5f7 *Listbox.foreground: #000000 !!*Listbox.borderWidth: 1 *Text.background: #e5e5f7 *Text.foreground: #000000 !!*Text.borderWidth: 1 *Entry.background: #e5e5f7 *Entry.foreground: #000000 !!*Entry.borderWidth: 1 *NoteBook*Entry.background: #e5e5f7 *NoteBook*Entry.disabledBackground: #d3d3dd *NoteBook*Entry.foreground: #000000 !!*Menu.activeBorderWidth: 1 !!*Menu.borderWidth: 1 !!*Menubutton.borderWidth: 1 *ButtonBox*borderWidth: 0 *ButtonBox*activeBorderWidth: 0 !!*Button.borderWidth: 1 *Customize.varforeground: dodgerblue4 ! vim:ft=xdefaults:ts=8:sw=4:sts=4:et tkabber/examples/xrdb/light.xrdb000064400000000000000000000213311477701321300166160ustar00nobodynobody! Main window geometry !!Tkabber.geometry: 788x550-70+100 !Tkabber.geometry: 180x400-70+100 ! Chat window geometry (in no tabs mode) !!*Chat.geometry: 500x500 ! Browser and Headlines window geometry (in no tabs mode) !!*JBrowser.geometry: 500x500 ! Roster width (tabbed interface only) !!Tkabber.mainRosterWidth: 120 ! Roster width in groupchat windows !!Tkabber.chatRosterWidth: 90 ! Scrollbar bed color *troughColor: #e3e3e3 *background: #f0f0f0 *foreground: #000000 *readonlyBackground: #f0f0f0 *disabledBackground: #f0f0f0 *disabledForeground: #999999 *errorForeground: firebrick4 ! Colors, which are used when mouse is over the item *activeBackground: #c7e1ff *activeForeground: #0000d1 ! Colors and border width selected item *selectBackground: #e8f3ff *selectForeground: #0000d1 *selectBorderWidth: 0 *inactiveSelectBackground: #e8f3ff ! Color for checkboxes *selectColor: #c7e1ff *Menu*selectColor: #6b99ff ! Color of traversal highlight rectangle *highlightBackground: #f0f0f0 *highlightColor: #6b99ff ! Color of insertion cursor *insertBackground: #000000 ! Font for drawing text (except chats and roster font) !!*font: {Arial 10} ! Currently there is only progressbar (at the splash screen) *ProgressBar.foreground: #6b99ff ! Flatten ComboBox and ArrowButton !!*Spinbox.borderWidth: 1 *Spinbox.background: #f8f8f8 *Spinbox.buttonBackground: #f0f0f0 !!*SpinBox.borderWidth: 1 *SpinBox*Entry*highlightBackground: #f8f8f8 !!*ComboBox.borderWidth: 1 *ArrowButton.borderWidth: 0 *ArrowButton.highlightThickness: 0 ! Colors for multicolumn listboxes (as in search result window) *Mclistbox.background: #f0f0f0 *Mclistbox.labelActiveBackground: #c7e1ff *Mclistbox.labelBackground: #e1e1e1 *Mclistbox.labelForeground: #000000 *Mclistbox.labelActiveForeground: #0000d1 *Button.background: #e1e1e1 *Menubutton.background: #e1e1e1 *Menu.activeBackground: #c7e1ff *Chat*Button.background: #f0f0f0 *Chat*Menubutton.background: #f0f0f0 *Message*Menubutton.background: #f0f0f0 *bbox.Button.background: #e1e1e1 *mainframe.topf.tb0.bbox.Button.background: #f0f0f0 *bottom.buttons1.Button.background: #f0f0f0 ! Type of subitem in roster (1 - display number of resources, ! 2 - display arrow, 3 - display both, 0 - display nothing *Roster.subitemtype: 3 ! Roster background color *Roster.cbackground: #f8f8f8 ! Inactive metaJID background color *Roster.metajidfill: #f4f4f4 ! Active metaJID background color *Roster.metajidhlfill: #c7e1ff ! Color of border around metaJID *Roster.metajidborder: #f4f4f4 ! Inactive JID background color *Roster.jidfill: #f8f8f8 ! Active JID background color *Roster.jidhlfill: #c7e1ff ! Color of border around JID *Roster.jidborder: #f8f8f8 ! Inctive group background color *Roster.groupfill: #f0f0f0 ! Inactive closed group background color *Roster.groupcfill: #f0f0f0 ! Active group background color *Roster.grouphlfill: #c7e1ff ! Color of border around group *Roster.groupborder: #f0f0f0 ! Indent of group names !!*Roster.groupindent: 21 ! Indent of JIDs !!*Roster.jidindent: 42 ! Indent of second order JIDs ! (resources for those who is logged in multiple times) !!*Roster.subjidindent: 62 ! Indent of group icons (closed or open arrow icon) !!*Roster.groupiconindent: 2 ! Indent of group icons when subitemtype is 2 or 3 !!*Roster.subgroupiconindent: 2 ! Indent of regular JID icons (status icon) !!*Roster.iconindent: 21 ! Indent of second order JID icons !!*Roster.subiconindent: 42 ! Additional amount of text height !!*Roster.textuppad: 0 !!*Roster.textdownpad: 0 ! Vertical distance between adjacent items !!*Roster.linepad: 2 ! Foregrounds of JID label ! (stalkerforeground is for contacts with pending subscription) *Roster.stalkerforeground: #663333 ! Other colors are selfexplanatory *Roster.unavailableforeground: #515151 *Roster.dndforeground: #515129 *Roster.xaforeground: #0b3760 *Roster.awayforeground: #0b3760 *Roster.availableforeground: dodgerblue4 *Roster.chatforeground: dodgerblue4 ! Colors in chat and groupchat windows *Chat*Text*Label.background: #f8f8f8 ! Color of other people nicknames *Chat.theyforeground: firebrick4 ! Color of my nickname *Chat.meforeground: dodgerblue4 ! Colors of server messages *Chat.serverlabelforeground: seagreen *Chat.serverforeground: #4b3a70 ! Color of info & error messages *Chat.infoforeground: dodgerblue4 *Chat.errforeground: firebrick4 ! Color of inactive urls in text *urlforeground: dodgerblue4 ! Color of active urls in text *urlactiveforeground: dodgerblue3 ! Colors of erroneous words (when ispell module is using) *Text.errorColor: firebrick4 *Text.comboColor: dodgerblue4 ! Colors of tab labels (when in tabbed mode) ! Usual color *alertColor0: black ! Color when server message is arrived *alertColor1: mediumpurple4 ! Color when message is arrived *alertColor2: dodgerblue4 ! Color when personally addressed message is arrived *alertColor3: firebrick4 ! Colors for browser and discovery service windows *JBrowser.fill: #000000 *JBrowser.activefill: #000000 *JBrowser.border: #f8f8f8 *JBrowser.nscolor: #2f6099 *JBrowser.nsactivecolor: #2f6099 *JDisco.fill: #000000 *JDisco.activefill: #000000 *JDisco.border: #f8f8f8 *JDisco.featurecolor: #2f6099 *JDisco.identitycolor: DarkGreen *JDisco.optioncolor: DarkViolet *Tree*background: #f8f8f8 *linesfill: #000000 *crossfill: #000000 *Customize.varforeground: dodgerblue4 ! Tooltip options *Balloon*background: #fffae6 *Balloon*foreground: #000000 *DynamicHelp.background: #fffae6 *DynamicHelp.foreground: #000000 *Listbox.background: #f8f8f8 *Listbox.foreground: #000000 !!*Listbox.borderWidth: 1 *Text.background: #f8f8f8 *Text.foreground: #000000 !!*Text.borderWidth: 1 *Entry.background: #f8f8f8 *Entry.foreground: #000000 !!*Entry.borderWidth: 1 *NoteBook*Entry.background: #f8f8f8 *NoteBook*Entry.disabledBackground: #f0f0f0 *NoteBook*Entry.foreground: #000000 !!*Menu.activeBorderWidth: 1 !!*Menu.borderWidth: 1 !!*Menubutton.borderWidth: 1 *ButtonBox*borderWidth: 0 *ButtonBox*activeBorderWidth: 0 !!*Button.borderWidth: 1 ! vim:ft=xdefaults:ts=8:sw=4:sts=4:et tkabber/examples/xrdb/lighthouse.xrdb000064400000000000000000000213001477701321300176560ustar00nobodynobody! Main window geometry !!Tkabber.geometry: 800x600-70+100 !Tkabber.geometry: 236x879-70+0 ! Chat window geometry (in no tabs mode) !!*Chat.geometry: 500x500 ! Browser and Headlines window geometry (in no tabs mode) !!*JBrowser.geometry: 500x500 ! Roster width (tabbed interface only) !!Tkabber.mainRosterWidth: 110 ! Roster width in groupchat windows !!Tkabber.chatRosterWidth: 105 ! Scrollbar bed color *troughColor: #ddddd0 *background: #eeeee0 *foreground: #000000 *readonlyBackground: #eeeee0 *disabledForeground: #747474 *disabledBackground: #d6d6d6 ! Colors, which are used when mouse is over the item *activeBackground: #fffff0 *activeForeground: #000000 ! Colors and border width selected item *selectBackground: #5f7ca8 *selectForeground: #f5f5f5 *selectBorderWidth: 0 *inactiveSelectBackground: #5f7ca8 ! Color for checkboxes *selectColor: #ddddd0 *Menu*selectColor: #5f7ca8 ! Color of traversal highlight rectangle *highlightBackground: #eeeee0 *highlightColor: #000000 ! Color of insertion cursor *insertBackground: #000000 ! Font for drawing text (except chats and roster font) !*font: {Unifont 10} !!*font: {Verdana 10} ! Currently there is only progressbar (at the splash screen) *ProgressBar.foreground: #334080 ! Flatten Spinbox, ComboBox and ArrowButton !!*Spinbox.borderWidth: 1 *Spinbox.background: #f5f5f5 *Spinbox.buttonBackground: #eeeee0 !!*SpinBox.borderWidth: 1 *SpinBox*Entry*highlightBackground: #ddddd0 !!*ComboBox.borderWidth: 1 *ArrowButton.borderWidth: 0 *ArrowButton.highlightThickness: 0 ! Colors for multicolumn listboxes (as in search result window) *Mclistbox.background: #f5f5f5 *Mclistbox.labelActiveBackground: #fffff0 *Mclistbox.labelBackground: #ddddd0 ! Type of subitem in roster (1 - display number of resources, ! 2 - display arrow, 3 - display both, 0 - display nothing *Roster.subitemtype: 3 ! Roster background color *Roster.cbackground: #f5f5f5 ! Inactive metaJID background color *Roster.metajidfill: #e0e0da ! Active metaJID background color *Roster.metajidhlfill: #ccccc0 ! Color of border around metaJID *Roster.metajidborder: #e0e0da ! JID background color *Roster.jidfill: #f5f5f5 ! Active JID background color *Roster.jidhlfill: #ddddd0 ! Color of border around JID *Roster.jidborder: #f5f5f5 ! group background color *Roster.groupfill: #ccccc0 ! closed group background color *Roster.groupcfill: #e9e9e9 ! Active group background color *Roster.grouphlfill: #bbbbb0 ! Color of border around group *Roster.groupborder: #eeeee0 ! Indent of group names !!*Roster.groupindent: 21 ! Indent of JIDs !!*Roster.jidindent: 42 ! Indent of second order JIDs ! (resources for those who is logged in multiple times) !!*Roster.subjidindent: 62 ! Indent of group icons (closed or open arrow icon) !!*Roster.groupiconindent: 2 ! Indent of group icons when subitemtype is 2 or 3 !!*Roster.subgroupiconindent: 2 ! Indent of regular JID icons (status icon) !!*Roster.iconindent: 21 ! Indent of second order JID icons !!*Roster.subiconindent: 42 ! Additional amount of text height !!*Roster.textuppad: 0 !!*Roster.textdownpad: 0 ! Vertical distance between adjacent items !!*Roster.linepad: 2 ! Foregrounds of JID label ! (stalkerforeground is for contacts with pending subscription) *Roster.stalkerforeground: #663333 ! Other colors are selfexplanatory *Roster.unavailableforeground: #515151 *Roster.dndforeground: #515129 *Roster.xaforeground: #0b3760 *Roster.awayforeground: #0b3760 *Roster.availableforeground: dodgerblue4 *Roster.chatforeground: dodgerblue4 ! Colors in chat and groupchat windows *Chat*Text.background: #f5f5f5 ! Color of other people nicknames *Chat.theyforeground: firebrick4 ! Color of my nickname *Chat.meforeground: dodgerblue4 ! Colors of server messages *Chat.serverlabelforeground: seagreen *Chat.serverforeground: #4b3a70 ! Color of error messages *Chat.errforeground: firebrick ! Color of inactive urls in text *urlforeground: dodgerblue4 ! Color of active urls in text *urlactiveforeground: dodgerblue3 ! Colors of erroneous words (when ispell module is using) *Text.errorColor: firebrick4 *Text.comboColor: dodgerblue4 ! Colors of tab labels (when in tabbed mode) ! Usual color *alertColor0: black ! Color when server message is arrived *alertColor1: mediumpurple4 ! Color when message is arrived *alertColor2: dodgerblue4 ! Color when personally addressed message is arrived *alertColor3: firebrick4 ! Colors for browser and discovery service windows *JBrowser.fill: #000000 *JBrowser.activefill: #f5f5f5 *JBrowser.border: #eeeee0 *JBrowser.nscolor: #747474 *JBrowser.nsactivecolor: #747474 *JDisco.fill: #000000 *JDisco.activefill: #f5f5f5 *JDisco.border: #eeeee0 *JDisco.featurecolor: #747474 *JDisco.identitycolor: DarkGreen *JDisco.optioncolor: DarkViolet *Tree*background: #f5f5f5 ! Tooltip options *Balloon*background: #ffeeaa *Balloon*foreground: #000000 *DynamicHelp.background: #ffeeaa *DynamicHelp.foreground: #000000 *Listbox.background: #f5f5f5 *Listbox.foreground: #000000 !!*Listbox.borderWidth: 1 *Text.background: #f5f5f5 *Text.foreground: #000000 !!*Text.borderWidth: 1 *Entry.background: #f5f5f5 *Entry.foreground: #000000 !!*Entry.borderWidth: 1 *NoteBook*Entry.background: #f5f5f5 *NoteBook*Entry.disabledBackground: #e9e9e9 *NoteBook*Entry.foreground: #000000 !!*Button.borderWidth: 1 *Button.background: #ddddd0 *Button.activeBackground: #fffff0 ! Main toolbar buttons *mainframe.topf.tb0.bbox.Button.background: #eeeee0 *mainframe.topf.tb1.bbox.Button.background: #eeeee0 *mainframe.topf.tb2.bbox.Button.background: #eeeee0 *mainframe.topf.tb3.bbox.Button.background: #eeeee0 *mainframe.topf.tb4.bbox.Button.background: #eeeee0 *mainframe.topf.tb5.bbox.Button.background: #eeeee0 ! Sign/encrypt message buttons *bottom.buttons1.Button.background: #eeeee0 *Chat*Button.background: #eeeee0 !!*Menu.activeBorderWidth: 1 !!*Menu.borderWidth: 1 !!*Menubutton.borderWidth: 1 *Menu.activeBackground: #5f7ca8 *Menu.activeForeground: #f5f5f5 *Menubutton.activeBackground: #fffff0 *Menubutton.activeForeground: #000000 *Buttonbox*borderWidth: 0 *Buttonbox*activeBorderWidth: 0 ! vim:ft=xdefaults:ts=8:sw=4:sts=4:et tkabber/examples/xrdb/ocean-deep.xrdb000064400000000000000000000314521477701321300175140ustar00nobodynobody! Ocean Deep theme for Tkabber ! (c) 2004 Badlop ! 2004-06-26 ! Based on Ocean Deep colour theme for Vim ! --------------------------------------------------------------- GEOMETRY ---- ! Main window geometry ! [horizontal size] ! x[vertical size] ! -[separation with right screen edge] ! +[separation with upper screen edge] !!Tkabber.geometry: 700x520-30+170 ! Roster width (tabbed interface only) !!Tkabber.mainRosterWidth: 150 ! Roster width in groupchat windows !!Tkabber.chatRosterWidth: 80 ! Chat window geometry (in no tabs mode) !!*Chat.geometry: 300x500-70+350 !!*Chat.groupchatgeometry: 600x500 !!*Chat.chatgeometry: 500x500 ! Other windows geometry (in no tabs mode) !!*JBrowser.geometry: 350x350 !!*JDisco.geometry: 500x500 !!*Customize.geometry: 600x500 !!*RawXML.geometry: 500x500 !!*Messages.geometry: 600x500 ! ------------------------------------------------------------ MAIN WINDOW ---- ! Font for drawing text (except chats and roster font) !*font: {Arial 10} ! Main font color *foreground: #d5faff ! Color of insertion cursor *insertBackground: #ffbbbb ! Background of all windows and tabs *background: #103040 ! Menu colors (main Tkabber menus...) *Menu.background: #01476a *Menu.activeBackground: #01656a ! ---------------------------------------------------------------- WIDGETS ---- ! ------------------------------------------- PROGRESS BAR ---- ! Scrollbar bed color *troughColor: #0F4866 !!*Scrollbar.width: 8 ! Currently there is only progressbar (at the splash screen) *ProgressBar.foreground: #0F4866 ! ------------------------------------------- RADIO BUTTON ---- ! Colors and border width selected item (in radialbutton) *selectBackground: #005a56 *selectForeground: #fffeff *selectBorderWidth: 0 *inactiveSelectBackground: #005a56 *errorForeground: #ff7f50 ! ---------------------------------------------- CHECK BOX ---- ! Checkbox background *selectColor: #0c232a *Menu*selectColor: #d5faff ! ----------------------------------------------- TEXT BOX ---- ! Disabled Text boxes *disabledBackground: #103040 *disabledForeground: #85aaaf ! Textbox entry (like user: in Login window) *Entry.background: #0c232e *Entry.foreground: #fffefe *Entry.disabledBackground: #103040 *Entry.readonlyBackground: #103040 !!*Entry.borderWidth: 1 ! Textbox like in VCard editor *NoteBook*Entry.background: #0c232e *NoteBook*Entry.disabledBackground: #103040 *NoteBook*Entry.foreground: #fffffe ! ----------------------------------------------- LIST BOX ---- !* Colors for multicolumn listboxes (as in search result window) *Mclistbox.background: #0c232e *Mclistbox.labelActiveBackground: #1d5875 *Mclistbox.labelBackground: #0F4866 *Mclistbox.labelForeground: #d5faff *Mclistbox.labelActiveForeground: #d5faff ! ---------------------------------------------- TOOL TIPS ---- ! Tooltip options *Balloon*background: #0c232e *Balloon*foreground: #fffbfb *DynamicHelp.background: #0c232e *DynamicHelp.foreground: #ffffff *Baloon.style: delay ! Listbox widget (like in Customize->Chat->vcard-items) *Listbox.background: #0c232e *Listbox.foreground: #ffffff !!*Listbox.borderWidth: 1 ! ------------------------------------------------ BUTTONS ---- !!*Button.borderWidth: 1 !!*Menu.activeBorderWidth: 1 !!*Menu.borderWidth: 1 !!*Menubutton.borderWidth: 1 *Buttonbox*borderWidth: 0 *Buttonbox*activeBorderWidth: 0 *Search.itemBackground: #ffffff !* Flatten ComboBox and ArrowButton +++ !!*Spinbox.borderWidth: 1 *Spinbox.background: #0c232e *Spinbox.buttonBackground: #103040 !!*SpinBox.borderWidth: 1 *SpinBox*Entry*highlightBackground: #0c232e !!*ComboBox.borderWidth: 1 !!*ArrowButton*borderWidth: 1 *ArrowButton.borderWidth: 0 *ArrowButton.highlightThickness: 0 ! Button and Menubutton colors ! Generic button *Button.background: #0F4866 ! Button background when mouse is over it *Button.activeBackground: #1d5875 ! Generic menubutton (like in Login window->Profiles) *Menubutton.background: #0F4864 *Menubutton.activeBackground: #1d5875 ! Buttons in chat and message windows *Chat*Button.background: #103040 ! Button with JID in Chat window *Chat*Menubutton.background: #0f4864 *Message*Menubutton.background: #0f4863 ! Common button background *bbox.Button.background: #0f4865 ! ---------------------------------------------------------------- TOOLBAR ---- ! Main toolbar buttons *mainframe.topf.tb0.bbox.Button.background: #103040 ! Sign/encrypt message buttons *bottom.buttons1.Button.background: #103040 ! ----------------------------------------------------------------- ROSTER ---- ! Type of subitem in roster (1 - display number of resources, ! 2 - display arrow, 3 - display both, 0 - display nothing *Roster.subitemtype: 3 ! --------------------------------------------------- JIDS ---- ! Roster background color *Roster.cbackground: #0c232e ! Inactive metaJID background color *Roster.metajidfill: #123a45 ! Active metaJID background color *Roster.metajidhlfill: #014d72 ! Color of border around metaJID *Roster.metajidborder: #123a45 ! Inactive JID background color *Roster.jidfill: #0c232b ! Active JID background color *Roster.jidhlfill: #004567 ! Color of border around JID *Roster.jidborder: #0c232c ! ------------------------------------------------- GROUPS ---- ! Inactive group background color *Roster.groupfill: #18515f ! Inactive closed group background color *Roster.groupcfill: #1b485f ! Active group background color *Roster.grouphlfill: #03557d ! Color of border around group *Roster.groupborder: #103041 ! ---------------------------------------------- POSITIONS ---- ! Indent of group names !!*Roster.groupindent: 21 ! Indent of JIDs !!*Roster.jidindent: 42 ! Indent of second order JIDs ! (resources for those who is logged in multiple times) !!*Roster.subjidindent: 62 ! Indent of group icons (closed or open arrow icon) !!*Roster.groupiconindent: 2 ! Indent of group icons when subitemtype is 2 or 3 !!*Roster.subgroupiconindent: 2 ! Indent of regular JID icons (status icon) !!*Roster.iconindent: 21 ! Indent of second order JID icons !!*Roster.subiconindent: 42 ! Additional amount of text height !!*Roster.textuppad: 0 !!*Roster.textdownpad: 0 ! Vertical distance between adjacent items !!*Roster.linepad: 2 ! ----------------------------------------------- PRESENCE ---- ! Foregrounds of JID label ! (stalkerforeground is for contacts with pending subscription) *Roster.stalkerforeground: #d2b48c ! Other colors are selfexplanatory *Roster.unavailableforeground: #b8b8b8 *Roster.dndforeground: #ffc1c1 *Roster.xaforeground: #c1cdcd *Roster.awayforeground: #c1cdcd *Roster.availableforeground: #ffffff *Roster.chatforeground: #ffffff ! ------------------------------------------------------------------- TABS ---- ! Colors used when mouse is over the item (a tab header) *activeBackground: #1d5875 *activeForeground: #d7f2ff ! Colors of tab labels font (when in tabbed mode) *NoteBook*Entry.readonlyBackground: #1e3837 ! Usual color *alertColor0: #ffffff ! Color when server message is arrived *alertColor1: #ff69b4 ! Color when message is arrived *alertColor2: #add8e6 ! Color when personally addressed message is arrived *alertColor3: #ff7f50 ! ------------------------------------------------------------------- CHAT ---- ! Text in chats, messages *Text.background: #0c232e *Text.foreground: #fbfffe !!*Text.borderWidth: 1 ! Colors in chat and groupchat windows *Chat*Text*Label.background: #66685e ! Color of other people nicknames *Chat.theyforeground: #ff7f50 ! Color of my nickname *Chat.meforeground: #add8e6 ! Colors of server messages (--- foo leave the room) *Chat.serverlabelforeground: #caff70 *Chat.serverforeground: #ff69b4 ! Color of info & error messages *Chat.infoforeground: #add8e6 *Chat.errforeground: #ff6a6a ! Color of inactive urls in text *urlforeground: #add8e6 ! Color of active urls in text *urlactiveforeground: #add8e6 ! Colors of erroneous words (when ispell module is using) *Text.errorColor: #ff7f50 *Text.comboColor: #add8e6 *Chat.inputheight: 3 ! -------------------------------------------------------------- DISCOVERY ---- ! Colors for browser and discovery service windows ! Window background *Tree*background: #0c232e ! lines in the tree *linesfill: #d5fafa ! [+] and [-] tree symbols *crossfill: #d5fafa ! ---------------------------------------------- J BROWSER ---- ! Jabber Browser ! Nodes names font color ('Public Conferencing'...) *JBrowser.fill: #ffffff ! Nodes atributes font color ('Search', 'Register'...) *JBrowser.nscolor: #b8b8b8 !!*JBrowser.levelindent: 24 !!*JBrowser.indent: 3 !!*JBrowser.nsindent: 2 !!*JBrowser.linepad: 2 !!*JBrowser.toppad: 1 !!*JBrowser.bottompad: 1 !!*JBrowser.icontextpad: 2 ! -------------------------------------------- J DISCOVERY ---- ! Jabber Discovery ! Subnodes *JDisco.fill: #ffffff ! Features available *JDisco.featurecolor: #b8b8b8 ! Identity name *JDisco.identitycolor: #b4eeb4 *JDisco.optioncolor: #ff69b4 ! ------------------------------------------------------------------ MORE ---- ! ---------------------------------------------------------------------- ---- *Customize.varforeground: #D5FAFA *Customize.groupnameforeground: #D5FAFA *RawXML.inforeground: #e0c3c3 *RawXML.outforeground: #a3a3ff *RawXML.intagforeground: #e0c3c3 *RawXML.inattrforeground: #e0c3c3 *RawXML.invalueforeground: #d1aef2 *RawXML.incdataforeground: #b2dcff *RawXML.outtagforeground: #efb3ef *RawXML.outattrforeground: #efb3ef *RawXML.outvalueforeground: #c9ffc9 *RawXML.outcdataforeground: #b6b6f9 *RawXML.inputheight: 4 !* Color of traversal highlight rectangle *highlightBackground: #103040 *highlightColor: #d5faff ! vim:ft=xdefaults:ts=8:sw=4:sts=4:et tkabber/examples/xrdb/teopetuk.xrdb000064400000000000000000000173221477701321300173540ustar00nobodynobody! Main window geometry !!Tkabber.geometry: 950x700-70+100 !Tkabber.geometry: 180x400-70+100 ! Chat window geometry (in no tabs mode) !!*Chat.chatgeometry: 550x500 !!*Chat.groupchatgeometry: 600x500 ! Browser and Headlines window geometry (in no tabs mode) !!*JBrowser.geometry: 550x500 ! Roster width (tabbed interface only) !!Tkabber.mainRosterWidth: 110 ! Roster width in groupchat windows !!Tkabber.chatRosterWidth: 105 ! Scrollbar bed color *troughColor: #cccccc *background: #dddddd *readonlyBackground: #dddddd *foreground: #000000 *disabledForeground: #888888 *errorForeground: firebrick ! Colors, which are used when mouse is over the item *activeBackground: #ebebeb *activeForeground: #000000 ! Colors and border width selected item !*selectBackground: #334080 *selectBackground: #d1eeee *selectForeground: #000000 *selectBorderWidth: 0 *inactiveSelectBackground: #d1eeee ! Color for highlighting found items *highlightSearchBackground: #c1eec1 ! Color for checkboxes *selectColor: #f4f4f4 *Menu*selectColor: #000000 ! Color of traversal highlight rectangle *highlightBackground: #dddddd *highlightColor: #000000 ! Color of insertion cursor *insertBackground: #000000 ! Font for drawing text (except chats and roster font) !*font: {Arial 10} ! Currently there is only progressbar (at the splash screen) *ProgressBar.foreground: #334080 !!*ProgressBar*borderWidth: 1 ! Flatten Spinbox, ComboBox and ArrowButton !!*Spinbox.borderWidth: 1 *Spinbox.background: #eeeeee *Spinbox.buttonBackground: #dddddd *Spinbox.disabledBackground: #dddddd !!*SpinBox.borderWidth: 1 *SpinBox*Entry*highlightBackground: #eeeeee !!*ComboBox.borderWidth: 1 *ArrowButton.borderWidth: 0 *ArrowButton.highlightThickness: 0 ! Colors for multicolumn listboxes (as in search result window) *Mclistbox.background: #eeeeee *Mclistbox.labelActiveBackground: #ebebeb *Mclistbox.labelBackground: #dddddd ! Type of subitem in roster (1 - display number of resources, ! 2 - display arrow, 3 - display both, 0 - display nothing *Roster.subitemtype: 3 ! Roster background color *Roster.cbackground: #eeeeee ! Inactive metaJID background color *Roster.metajidfill: #e7e7e7 ! Active metaJID background color *Roster.metajidhlfill: #c5e7e7 ! Color of border around metaJID *Roster.metajidborder: #e7e7e7 ! Inactive JID background color *Roster.jidfill: #eeeeee ! Active JID background color *Roster.jidhlfill: #d1eeee ! Color of border around JID *Roster.jidborder: #eeeeee ! Inctive group background color *Roster.groupfill: #dddddd ! Inactive closed group background color *Roster.groupcfill: #dddddd ! Active group background color *Roster.grouphlfill: #b4cdcd ! Color of border around group *Roster.groupborder: #dddddd ! Indent of group names !!*Roster.groupindent: 21 ! Indent of JIDs !!*Roster.jidindent: 42 !!*Roster.jidmultindent: 42 ! Indent of second order JIDs ! (resources for those who is logged in multiple times) !!*Roster.subjidindent: 62 ! Indent of group icons (closed or open arrow icon) !!*Roster.groupiconindent: 2 ! Indent of group icons when subitemtype is 2 or 3 !!*Roster.subgroupiconindent: 2 ! Indent of regular JID icons (status icon) !!*Roster.iconindent: 21 ! Indent of second order JID icons !!*Roster.subiconindent: 42 ! Additional amount of text height !!*Roster.textuppad: 0 !!*Roster.textdownpad: 0 ! Vertical distance between adjacent items !!*Roster.linepad: 2 ! Foregrounds of JID label ! (stalkerforeground is for contacts with pending subscription) *Roster.stalkerforeground: #663333 ! Other colors are selfexplanatory *Roster.unavailableforeground: #515151 *Roster.dndforeground: #515129 *Roster.xaforeground: #0b3760 *Roster.awayforeground: #0b3760 *Roster.availableforeground: dodgerblue4 *Roster.chatforeground: dodgerblue4 ! Colors in chat and groupchat windows *Chat*Text*Label.background: #eeeeee ! Color of other people nicknames !*Chat.theyforeground: firebrick4 *Chat.theyforeground: dodgerblue4 ! Color of my nickname !*Chat.meforeground: dodgerblue4 *Chat.meforeground: firebrick4 *Chat.highlightforeground: firebrick4 ! Colors of server messages *Chat.serverlabelforeground: DarkGreen *Chat.serverforeground: DarkGreen ! Color of info & error messages *Chat.infoforeground: dodgerblue4 *Chat.errforeground: firebrick ! Color of inactive urls in text *urlforeground: dodgerblue4 ! Color of active urls in text *urlactiveforeground: dodgerblue3 ! Colors of erroneous words (when ispell module is using) *Text.errorColor: firebrick4 *Text.comboColor: dodgerblue4 ! Colors of tab labels (when in tabbed mode) ! Usual color *alertColor0: black ! Color when server message is arrived *alertColor1: DarkViolet ! Color when message is arrived *alertColor2: dodgerblue4 ! Color when personally addressed message is arrived *alertColor3: firebrick4 ! Colors for browser and discovery service windows *JBrowser.fill: #000000 *JBrowser.activefill: #000000 *JBrowser.border: #eeeeee *JBrowser.nscolor: #666666 *JBrowser.nsactivecolor: #666666 *JDisco.fill: #000000 *JDisco.activefill: #000000 *JDisco.border: #eeeeee *JDisco.featurecolor: #666666 *JDisco.identitycolor: DarkGreen *JDisco.optioncolor: DarkViolet *Tree*background: #eeeeee *linesfill: #000000 *crossfill: #000000 *Customize.varforeground: dodgerblue4 ! Tooltip options *Balloon*background: #ffeeaa *Balloon*foreground: #000000 *DynamicHelp.background: #ffeeaa *DynamicHelp.foreground: #000000 *Listbox.background: #eeeeee *Listbox.foreground: #000000 !!*Listbox.borderWidth: 1 *Text.background: #eeeeee *Text.foreground: #000000 !!*Text.borderWidth: 1 *Entry.background: #eeeeee *Entry.foreground: #000000 !!*Entry.borderWidth: 1 *NoteBook*Entry.background: #eeeeee *NoteBook*Entry.disabledBackground: #dddddd *NoteBook*Entry.readonlyBackground: #dddddd *NoteBook*Entry.foreground: #000000 !!*Button.borderWidth: 1 !!*Menu.activeBorderWidth: 1 !!*Menu.borderWidth: 1 !!*Menubutton.borderWidth: 1 *Buttonbox*borderWidth: 0 *Buttonbox*activeBorderWidth: 0 !!*Scrollbar.width: 8 ! vim:ft=xdefaults:ts=8:sw=4:sts=4:et tkabber/examples/xrdb/warm.xrdb000064400000000000000000000221201477701321300164520ustar00nobodynobody! Main window geometry !!Tkabber.geometry: 788x550-70+100 !Tkabber.geometry: 180x400-70+100 ! Chat window geometry (in no tabs mode) !!*Chat.groupchatgeometry: 600x500 !!*Chat.chatgeometry: 500x500 ! Browser and Headlines window geometry (in no tabs mode) !!*JBrowser.geometry: 500x500 !!*JDisco.geometry: 500x500 ! Roster width (tabbed interface only) !!Tkabber.mainRosterWidth: 120 ! Roster width in groupchat windows !!Tkabber.chatRosterWidth: 90 ! Scrollbar bed color *troughColor: #856b3b *background: #d0b073 *foreground: #000000 ! Color of disabled items *disabledBackground: #d0b073 *disabledForeground: #633333 *readonlyBackground: #d0b073 *errorForeground: firebrick ! Colors, which are used when mouse is over the item *activeBackground: #996b3b *activeForeground: #000000 ! Colors and border width selected item *selectBackground: #b38047 *selectForeground: #000000 *selectBorderWidth: 0 *inactiveSelectBackground: #b38047 ! Color for checkboxes *selectColor: #fdc408 ! Color of traversal highlight rectangle *highlightBackground: #d0b073 *highlightColor: #e00000 ! Color of insertion cursor *insertBackground: #000000 ! Font for drawing text (except chats and roster) !!*font: {Arial 10} ! Currently there is only progressbar (at the splash screen) *ProgressBar.foreground: #996b3b ! Flatten ComboBox and ArrowButton !!*Spinbox.borderWidth: 1 *Spinbox.background: #b38047 !!*SpinBox.borderWidth: 1 *SpinBox*Entry*highlightBackground: #b38047 !!*ComboBox.borderWidth: 1 *ArrowButton.borderWidth: 0 *ArrowButton.highlightThickness: 0 ! Colors for listboxes and multicolumn listboxes (as in search result window) *Listbox.background: #f0f0cc *Listbox.foreground: #000000 !!*Listbox.borderWidth: 1 *Mclistbox.background: #f0f0cc *Mclistbox.labelActiveBackground: #b38047 *Mclistbox.labelBackground: #996b3b *Mclistbox.labelForeground: #000000 *Mclistbox.labelActiveForeground: #000000 ! Button and Menubutton colors ! Generic button *Button.background: #996b3b *Button.activeBackground: #b38047 ! Generic menubutton *Menubutton.background: #996b3b *Menubutton.activeBackground: #b38047 ! Buttons in chat and message windows *Chat*Button.background: #d0b073 *Chat*Menubutton.background: #d0b073 *Message*Menubutton.background: #d0b073 *bbox.Button.background: #996b3b ! Menu colors *Menu.background: #996b3b *Menu.activeBackground: #d0b073 ! Main toolbar buttons *mainframe.topf.tb0.bbox.Button.background: #d0b073 ! Sign/encrypt message buttons *bottom.buttons1.Button.background: #d0b073 ! Type of subitem in roster (1 - display number of resources, ! 2 - display arrow, 3 - display both, 0 - display nothing *Roster.subitemtype: 3 ! Roster background color *Roster.cbackground: #f0f0cc ! Inactive metaJID background color *Roster.metajidfill: #e0d09f ! Active metaJID background color *Roster.metajidhlfill: #b38047 ! Color of border around metaJID *Roster.metajidborder: #e0d09f ! Inactive JID background color *Roster.jidfill: #f0f0cc ! Active JID background color *Roster.jidhlfill: #b38047 ! Color of border around JID *Roster.jidborder: #f0f0cc ! Inctive group background color *Roster.groupfill: #d0b073 ! Inactive closed group background color *Roster.groupcfill: #d0b073 ! Active group background color *Roster.grouphlfill: #b38047 ! Color of border around group *Roster.groupborder: #d0b073 ! Indent of group names !!*Roster.groupindent: 21 ! Indent of JIDs !!*Roster.jidindent: 42 ! Indent of second order JIDs ! (resources for those who is logged in multiple times) !!*Roster.subjidindent: 62 ! Indent of group icons (closed or open arrow icon) !!*Roster.groupiconindent: 2 ! Indent of group icons when subitemtype is 2 or 3 !!*Roster.subgroupiconindent: 2 ! Indent of regular JID icons (status icon) !!*Roster.iconindent: 21 ! Indent of second order JID icons !!*Roster.subiconindent: 42 ! Additional amount of text height !!*Roster.textuppad: 0 !!*Roster.textdownpad: 0 ! Vertical distance between adjacent items !!*Roster.linepad: 2 ! Foregrounds of JID label ! (stalkerforeground is for contacts with pending subscription) *Roster.stalkerforeground: #663333 ! Other colors are selfexplanatory *Roster.unavailableforeground: #515151 *Roster.dndforeground: #515129 *Roster.xaforeground: #0b3760 *Roster.awayforeground: #0b3760 *Roster.availableforeground: dodgerblue4 *Roster.chatforeground: dodgerblue4 ! Colors in chat and groupchat windows *Chat*Text*Label.background: #f0f0cc ! Color of other people nicknames *Chat.theyforeground: firebrick4 ! Color of my nickname *Chat.meforeground: dodgerblue4 ! Colors of server messages *Chat.serverlabelforeground: seagreen *Chat.serverforeground: #4b3a70 ! Color of info & error messages *Chat.infoforeground: dodgerblue4 *Chat.errforeground: firebrick4 ! Color of inactive urls in text *urlforeground: dodgerblue4 ! Color of active urls in text *urlactiveforeground: dodgerblue3 ! Colors of erroneous words (when ispell module is using) *Text.errorColor: firebrick *Text.comboColor: dodgerblue4 ! Colors of tab labels (when in tabbed mode) ! Usual color *alertColor0: black ! Color when server message is arrived *alertColor1: mediumpurple4 ! Color when message is arrived *alertColor2: dodgerblue4 ! Color when personally addressed message is arrived *alertColor3: firebrick4 ! Colors for browser and discovery service windows *JBrowser.fill: #000000 *JBrowser.activefill: #000000 *JBrowser.border: #f0f0cc *JBrowser.nscolor: #966666 *JBrowser.nsactivecolor: #966666 *JDisco.fill: #000000 *JDisco.activefill: #000000 *JDisco.border: #f0f0cc *JDisco.featurecolor: #966666 *JDisco.identitycolor: DarkGreen *JDisco.optioncolor: DarkViolet *Tree*background: #f0f0cc *linesfill: #000000 *crossfill: #000000 ! Tooltip options *Balloon*background: #d0b073 *Balloon*foreground: #000000 *DynamicHelp.background: #d0b073 *DynamicHelp.foreground: #000000 *Text.background: #f0f0cc *Text.foreground: #000000 !!*Text.borderWidth: 1 *Entry.background: #b38047 *Entry.foreground: #000000 !!*Entry.borderWidth: 1 *NoteBook*Entry.background: #b38047 *NoteBook*Entry.disabledBackground: #d0b073 *NoteBook*Entry.foreground: #000000 !!*Menu.activeBorderWidth: 1 !!*Menu.borderWidth: 1 !!*Menubutton.borderWidth: 1 *ButtonBox*borderWidth: 0 *ButtonBox*activeBorderWidth: 0 !!*Button.borderWidth: 1 *Customize.varforeground: firebrick4 ! vim:ft=xdefaults:ts=8:sw=4:sts=4:et tkabber/filetransfer.tcl000064400000000000000000000230071477701321300152430ustar00nobodynobody# filetransfer.tcl -- # # This file is a part of the Tkabber XMPP client. It implements the user # interface part and infrastructure (registering different protocols) # for file transfer. namespace eval ft { custom::defgroup {File Transfer} [::msgcat::mc "File Transfer options."] \ -group Tkabber variable default_dir switch -- $::tcl_platform(platform) { windows { if {[info exists $::env(TEMP)]} { set default_dir $::env(TEMP) } else { set default_dir "C:\\TEMP" } } default { set default_dir "/tmp" } } # TODO macintosh? custom::defvar options(download_dir) $default_dir \ [::msgcat::mc "Default directory for downloaded files."] \ -type string -group {File Transfer} variable winid 0 variable protocols set protocols(names) {} } ############################################################################### proc ft::register_protocol {name args} { variable protocols set priority 50 set label $name foreach {key val} $args { switch -- $key { -priority { set priority $val } -label { set label $val } -options { set options $val } -send { set send $val } -receive { set receive $val } -close { set close $val } -closed { set closed $val } default { return -code error "[namespace current]::register_protocol:\ Illegal option $key" } } } lappend protocols(names) [list $name $priority] set protocols(names) [lsort -integer -index 1 $protocols(names)] set protocols(label,$name) $label foreach option {options send receive close closed} { if {[info exists $option]} { set protocols($option,$name) [set $option] } } } proc ft::unregister_protocol {name} { variable protocols while {[set idx [lsearch -glob $protocols(names) [list $name *]]] >= 0} { set protocols(names) [lreplace $protocols(names) $idx $idx] } array unset protocols *,$name } plugins::load [file join plugins filetransfer] ############################################################################### namespace eval ft { variable protocols variable values {} variable name_prio variable name variable priority foreach name_prio $protocols(names) { lassign $name_prio name priority lappend values $name $protocols(label,$name) } custom::defvar options(default_proto) [lindex $values 0] \ [::msgcat::mc "Default protocol for sending files."] \ -type options \ -values $values \ -group {File Transfer} } ############################################################################### proc ft::get_POSIX_error_desc {} { global errorCode set class [lindex $errorCode 0] if {$class != "POSIX"} { return [::msgcat::mc "unknown"] } else { return [::msgcat::mc [lindex $errorCode 2]] } } proc ft::report_cannot_open_file {f filename error} { report_error $f [::msgcat::mc "Can't open file \"%s\": %s" \ $filename $error] } proc ft::report_error {f errormsg} { set m $f.errormsg catch {destroy $m} Message $m -aspect 50000 \ -text $errormsg \ -pady 1m $m configure -foreground [option get $m errorForeground Message] grid $m -row 0 -column 0 -sticky ewns -columnspan 4 } proc ft::hide_error_msg {f} { catch {destroy $f.errormsg} } ############################################################################### proc ft::create_menu {m xlib jid} { variable protocols if {[llength $protocols(names)] > 0} { $m add command -label [::msgcat::mc "Send file..."] \ -command [list [namespace current]::send_file_dialog \ $xlib $jid] } } hook::add chat_create_user_menu_hook \ [namespace current]::ft::create_menu 46 hook::add roster_create_groupchat_user_menu_hook \ [namespace current]::ft::create_menu 46 hook::add roster_jid_popup_menu_hook \ [namespace current]::ft::create_menu 46 hook::add message_dialog_menu_hook \ [namespace current]::ft::create_menu 46 hook::add search_popup_menu_hook \ [namespace current]::ft::create_menu 46 ############################################################################### # # Draw a send file dialog # proc ft::send_file_dialog {xlib jid args} { variable winid variable options variable protocols set token [namespace current]::[incr winid] upvar #0 $token state set w .sfd$winid set state(w) $w set state(jid) $jid set state(xlib) $xlib Dialog $w -title [::msgcat::mc "Send file to %s" $jid] \ -anchor e -modal none \ -transient 0 -default 0 -cancel 1 $w add -text [::msgcat::mc "Send"] \ -command [list [namespace current]::send_file_negotiate $token] $w add -text [::msgcat::mc "Cancel"] -command [list destroy $w] bind $w \ [list [namespace current]::send_file_close [double% $token] %W] set f [$w getframe] set state(f) $f Label $f.lfile -text [::msgcat::mc "File path:"] Entry $f.file -textvariable ${token}(filename) Button $f.browsefile -text [::msgcat::mc "Browse..."] \ -command [list [namespace current]::set_send_file_name $token $w] Label $f.ldesc -text [::msgcat::mc "Description:"] set sw [ScrolledWindow $f.sw -scrollbar vertical] textUndoable $f.desc -width 55 -height 4 -wrap word $sw setwidget $f.desc set values {} foreach name_prio $protocols(names) { lassign $name_prio name priority lappend values $protocols(label,$name) if {$options(default_proto) == $name} { set state(protocol) $protocols(label,$name) } } if {![info exists state(protocol)]} { set state(protocol) [lindex $values 0] } Label $f.lproto -text [::msgcat::mc "Protocol:"] eval [list OptionMenu $f.proto ${token}(protocol)] $values Progressbar $f.pb -variable ${token}(progress) set state(pb) $f.pb set state(progress) 0 # Grid row 0 is used for displaying error messages grid $f.lfile -row 1 -column 0 -sticky e grid $f.file -row 1 -column 1 -sticky ew grid $f.browsefile -row 1 -column 2 -sticky ew grid $f.ldesc -row 2 -column 0 -sticky en grid $f.sw -row 2 -column 1 -sticky ewns -columnspan 2 grid $f.lproto -row 3 -column 0 -sticky e grid $f.proto -row 3 -column 1 -sticky ew -columnspan 2 -pady 1m # Grid row 4 vill be used for displaying protocol options grid $f.pb -row 5 -column 0 -sticky ew -columnspan 3 grid columnconfigure $f 1 -weight 1 grid rowconfigure $f 2 -weight 1 $w draw $f.file } proc ft::set_send_file_name {token w} { variable $token upvar 0 $token state set file [tk_getOpenFile -parent $w] if {$file != ""} { set state(filename) $file } } ############################################################################### proc ft::send_file_negotiate {token} { upvar #0 $token state variable chunk_size variable protocols hide_error_msg $state(f) $state(w) itemconfigure 0 -state disabled set state(desc) [$state(f).desc get 0.0 "end -1c"] if {[catch {open $state(filename)} fd]} { report_cannot_open_file $state(f) $state(filename) \ [get_POSIX_error_desc] $state(w) itemconfigure 0 -state normal return } debugmsg filetransfer "SENDFILE: $state(filename)" set state(fd) $fd fconfigure $fd -translation binary set state(name) [file tail $state(filename)] set size [file size $state(filename)] set state(size) $size if {$size == 0} { $state(pb) configure -maximum 1 set state(progress) -1 } else { $state(pb) configure -maximum $size } foreach name_prio $protocols(names) { lassign $name_prio proto priority if {$state(protocol) == $protocols(label,$proto)} { break } } set state(proto) $proto set state(command) [list [namespace current]::send_file_callback $token] # Use $token as filetransfer ID and state array variable eval $protocols(send,$proto) [list $token] } ############################################################################### proc ft::send_file_close {token w} { upvar #0 $token state variable protocols if {[winfo toplevel $w] != $w} return catch {eval $protocols(close,$state(proto)) $token} catch {close $state(fd)} catch {unset $token} } ############################################################################### proc ft::send_file_callback {token res {msg ""}} { upvar #0 $token state # Peer's reply may arrive after window is closed. if {![info exists state(w)] || ![winfo exists $state(w)]} return switch -- $res { error { if {$state(size) > 0} { set state(progress) 0 } report_error $state(f) $msg catch {eval $protocols(close,$state(proto)) $token} catch {close $state(fd)} $state(w) itemconfigure 0 -state normal } progress { if {$state(size) > 0} { set state(progress) $msg } } default { destroy $state(w) } } } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/hooks.tcl000064400000000000000000000044231477701321300137030ustar00nobodynobody# hooks.tcl -- # # This file is a part of the Tkabber XMPP client. It implements the # hooks infrastructure. namespace eval hook {} proc hook::add {hook func {seq 50}} { variable F variable $hook if {![info exists F(flags,$hook)]} { set F(flags,$hook) {} } lappend $hook [list $func $seq] set $hook [lsort -real -index 1 [lsort -unique [set $hook]]] } proc hook::remove {hook func {seq ""}} { variable $hook if {$seq ne ""} { set idx [lsearch -exact [set $hook] [list $func $seq]] set $hook [lreplace [set $hook] $idx $idx] } else { foreach idx [lsearch -all -exact -index 0 [set $hook] $func] { set $hook [lreplace [set $hook] $idx $idx] } } } proc hook::is_empty {hook} { variable $hook if {![info exists $hook] || [llength [set $hook]] == 0} { return 1 } else { return 0 } } proc hook::set_flag {hook flag} { variable F if {![info exists F(flags,$hook)]} { set F(flags,$hook) {} } set idx [lsearch -exact $F(flags,$hook) $flag] set F(flags,$hook) [lreplace $F(flags,$hook) $idx $idx] } proc hook::unset_flag {hook flag} { variable F if {![info exists F(flags,$hook)]} { set F(flags,$hook) {} } if {$flag ni $F(flags,$hook)} { lappend F(flags,$hook) $flag } } proc hook::is_flag {hook flag} { variable F if {![info exists F(flags,$hook)]} { set F(flags,$hook) {} } return [expr {$flag ni $F(flags,$hook)}] } proc hook::run {hook args} { variable F variable $hook if {![info exists $hook]} { return } set F(flags,$hook) {} foreach func_prio [set $hook] { set func [lindex $func_prio 0] set code [catch { eval $func $args } state] debugmsg hook "$hook: $func -> $state (code $code)" if {$code == 1} { # return -code error (which would be weird) or just error ::bgerror [format "Hook %s failed\nProcedure %s returned code\ %s\n%s" $hook $func $code $state] } if {$code == 3 || ($code == 0 && [string equal $state stop])} { # return -code break or return stop break } } } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/idna.tcl000064400000000000000000000071611477701321300134750ustar00nobodynobody# idna.tcl -- # # This file is a part of the Tkabber XMPP client. It provides support # for Internationalizing Domain Names in Applications (IDNA, RFC 3490). # # Copyright (c) 2005 Alexey Shchepin # # SYNOPSIS # idna::domain_toascii domain package provide idna 1.0 ########################################################################## namespace eval idna {} ########################################################################## proc idna::domain_toascii {domain} { set domain [string tolower $domain] set parts [split $domain "\u002E\u3002\uFF0E\uFF61"] set res {} foreach p $parts { set r [toascii $p] lappend res $r } return [join $res .] } ########################################################################## proc idna::toascii {name} { # TODO: Steps 2, 3 and 5 from RFC3490 if {![string is ascii $name]} { set name [punycode_encode $name] set name "xn--$name" } return $name } ########################################################################## proc idna::punycode_encode {input} { set base 36 set tmin 1 set tmax 26 set skew 38 set damp 700 set initial_bias 72 set initial_n 0x80 set n $initial_n set delta 0 set out 0 set bias $initial_bias set output "" set input_length [string length $input] set nonbasic {} for {set j 0} {$j < $input_length} {incr j} { set c [string index $input $j] if {[string is ascii $c]} { append output $c } else { lappend nonbasic $c } } set nonbasic [lsort -unique $nonbasic] set h [set b [string length $output]]; if {$b > 0} { append output - } while {$h < $input_length} { set m [scan [string index $nonbasic 0] %c] set nonbasic [lrange $nonbasic 1 end] incr delta [expr {($m - $n) * ($h + 1)}] set n $m for {set j 0} {$j < $input_length} {incr j} { set c [scan [string index $input $j] %c] if {$c < $n} { incr delta } elseif {$c == $n} { for {set q $delta; set k $base} {1} {incr k $base} { set t [expr {$k <= $bias ? $tmin : $k >= $bias + $tmax ? $tmax : $k - $bias}] if {$q < $t} break; append output \ [punycode_encode_digit \ [expr {$t + ($q - $t) % ($base - $t)}]] set q [expr {($q - $t) / ($base - $t)}] } append output [punycode_encode_digit $q] set bias [punycode_adapt \ $delta [expr {$h + 1}] [expr {$h == $b}]] set delta 0 incr h } } incr delta incr n } return $output; } ########################################################################## proc idna::punycode_adapt {delta numpoints firsttime} { set base 36 set tmin 1 set tmax 26 set skew 38 set damp 700 set delta [expr {$firsttime ? $delta / $damp : $delta >> 1}] incr delta [expr {$delta / $numpoints}] for {set k 0} {$delta > (($base - $tmin) * $tmax) / 2} {incr k $base} { set delta [expr {$delta / ($base - $tmin)}]; } return [expr {$k + ($base - $tmin + 1) * $delta / ($delta + $skew)}] } ########################################################################## proc idna::punycode_encode_digit {d} { return [format %c [expr {$d + 22 + 75 * ($d < 26)}]] } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/iface.tcl000064400000000000000000000072721477701321300136340ustar00nobodynobody# iface.tcl -- # # This file is a part of the Tkabber XMPP client. It implements a few # procedures which are used in Tkabber's user interface. set user_status_list [list \ available [::msgcat::mc "Available"] \ chat [::msgcat::mc "Free to chat"] \ away [::msgcat::mc "Away"] \ xa [::msgcat::mc "Extended away"] \ dnd [::msgcat::mc "Do not disturb"] \ invisible [::msgcat::mc "Invisible"] \ unavailable [::msgcat::mc "Not logged in"]] array set ssl_certificate_fields [list \ subject [::msgcat::mc "Subject"] \ issuer [::msgcat::mc "Issuer"] \ notBefore [::msgcat::mc "Begin date"] \ notAfter [::msgcat::mc "Expiry date"] \ serial [::msgcat::mc "Serial number"] \ cipher [::msgcat::mc "Cipher"] \ sbits [::msgcat::mc "Session key bits"] \ sha1_hash [::msgcat::mc "SHA1 hash"]] proc update_tls_info {xlib args} { global tls_info catch {unset tls_info($xlib)} if {[llength $args] > 0} { set tls_info($xlib) $args } } hook::add disconnected_hook update_tls_info proc ssl_info {} { global ssl_certificate_fields global tls_info set server_list {} set msg_list {} foreach xlib [connections] { if {[info exists tls_info($xlib)]} { set server [connection_server $xlib] if {$server in $server_list} { continue } else { lappend server_list $server lappend msg_list $server } set info {} foreach {k v} $tls_info($xlib) { switch -- $k { subject - issuer { set v [regsub -all {\s*[/,]\s*(\w+=)} $v \n\t\\1] } } if {![string equal $v ""]} { if {[info exists ssl_certificate_fields($k)]} { append info [format "%s: %s\n" \ $ssl_certificate_fields($k) $v] } else { append info [format "%s: %s\n" $k $v] } } } lappend msg_list [string trim $info] } } return $msg_list } proc update_ssl_info {} { global tls_warning_info global tls_info set state disabled set len [llength [connections]] set fg normal if {$len} { set balloon "" foreach xlib [connections] { if {$len > 1} { append balloon "[connection_jid $xlib]: " } if {[info exists tls_info($xlib)]} { if {![info exists tls_warning_info($xlib)] || [string equal $tls_warning_info($xlib) ""]} { append balloon [::msgcat::mc "Enabled\n"] } else { append balloon $tls_warning_info($xlib) set fg warning } set state normal } else { append balloon [::msgcat::mc "Disabled\n"] } } } else { set balloon [::msgcat::mc "Disconnected"] } return [list $state $fg [string trim $balloon]] } ############################################################################### set status_afterid "" proc client:status {xlib text} { set_status $text } proc set_status {text} { global status global status_afterid after cancel $status_afterid set status $text hook::run set_status_hook $text set status_afterid [after 5000 clear_status] } proc clear_status {} { global status set status "" hook::run clear_status_hook } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/ifacetk000075500000000000000000000000001477701321300134005ustar00nobodynobodytkabber/ifacetk/buttonbar.tcl000064400000000000000000000560061477701321300161720ustar00nobodynobody# buttonbar.tcl -- # # This file is a part of the Tkabber XMPP client. It implements multirow # tabs (by placing buttons on a grid) on top of BWidget infrastructure. # ---------------------------------------------------------------------------- # Index of commands: # - ButtonBar::create # - ButtonBar::configure # - ButtonBar::cget # - ButtonBar::insert # - ButtonBar::delete # - ButtonBar::move # - ButtonBar::itemconfigure # - ButtonBar::itemcget # - ButtonBar::setfocus # - ButtonBar::index # ---------------------------------------------------------------------------- namespace eval ButtonBar { Widget::define ButtonBar ButtonBar Button variable declare { {-orient Enum horizontal 0 {horizontal vertical}} {-minwidth Int 0 0 "%d >= 0"} {-maxwidth Int 200 0 "%d >= 0"} {-padx TkResource "" 0 button} {-pady TkResource "" 0 button} {-command String "" 0} {-pages String "" 0} } if {[catch {Widget::theme}] || ![Widget::theme]} { lappend declare \ {-background TkResource "" 0 frame} \ {-bg Synonym -background} } Widget::declare ButtonBar $declare Widget::addmap ButtonBar "" :cmd {} bind ButtonBar [list [namespace current]::_destroy %W] } # ---------------------------------------------------------------------------- # Command ButtonBar::create # ---------------------------------------------------------------------------- proc ButtonBar::create {path args} { Widget::init ButtonBar $path $args variable $path upvar 0 $path data if {![catch {Widget::theme}] && [Widget::theme]} { eval [list ttk::frame $path] [Widget::subcget $path :cmd] \ [list -class ButtonBar] ttk::frame $path.spacer -width [winfo screenwidth $path] } else { eval [list frame $path] [Widget::subcget $path :cmd] \ [list -class ButtonBar -takefocus 0 -highlightthickness 0] # For 8.4+ we don't want to inherit the padding catch {$path configure -padx 0 -pady 0} frame $path.spacer -width [winfo screenwidth $path] } bind $path [list [namespace current]::_configure %W] set data(buttons) [list] set data(active) "" set data(bindtabs) [list] return [Widget::create ButtonBar $path] } # ---------------------------------------------------------------------------- # Command ButtonBar::configure # ---------------------------------------------------------------------------- proc ButtonBar::configure {path args} { variable $path upvar 0 $path data set res [Widget::configure $path $args] if {[Widget::hasChanged $path -orient val] || \ [Widget::hasChanged $path -minwidth val] || \ [Widget::hasChanged $path -maxwidth val]} { _redraw $path } return $res } # ---------------------------------------------------------------------------- # Command ButtonBar::cget # ---------------------------------------------------------------------------- proc ButtonBar::cget {path option} { return [Widget::cget $path $option] } # ---------------------------------------------------------------------------- # Command ButtonBar::_option # ---------------------------------------------------------------------------- proc ButtonBar::_itemoption {path name option} { if {![catch {Widget::theme}] && [Widget::theme]} { switch -- $option { -font { return [ttk::style lookup ButtonBar.$name.TButton -font {} TkDefaultFont] } -padx { return [lindex [ttk::style lookup ButtonBar.$name.TButton \ -padding] 0] } -pady { return [lindex [ttk::style lookup ButtonBar.$name.TButton \ -padding] 1] } -bd - -borderwidth { set bd [ttk::style lookup ButtonBar.$name.TButton \ -borderwidth] if {$bd ne ""} { return $bd } else { return 0 } } -highlightthickness { set hl [ttk::style lookup ButtonBar.$name.TButton \ -highlightthickness] if {$hl ne ""} { return $hl } else { return 0 } } } } return [lindex [Button::configure [_but $path $name] $option] 4] } # ---------------------------------------------------------------------------- # Command ButtonBar::insert # ---------------------------------------------------------------------------- proc ButtonBar::insert {path idx name args} { variable $path upvar 0 $path data set but [_but $path $name] set data(buttons) [linsert $data(buttons) $idx $name] set newargs {} foreach {key val} $args { switch -- $key { -raisecmd { set data(raisecmd,$name) $val } default { lappend newargs $key $val } } } if {[catch {Widget::theme}] || ![Widget::theme]} { lappend newargs -padx [Widget::getoption $path -padx] \ -pady [Widget::getoption $path -pady] \ -anchor w } eval [list Button::create $but \ -command [list [namespace current]::activate $path $name]] \ $newargs if {![catch {Widget::theme}] && [Widget::theme]} { ttk::style configure ButtonBar.$name.TButton \ -padding [list [Widget::getoption $path -padx] \ [Widget::getoption $path -pady]] \ -anchor w $but:cmd configure -style ButtonBar.$name.TButton } _calc_text $path $name bind $but [list [namespace current]::_itemconfigure \ [_escape $path] [_escape $name]] foreach {event script} $data(bindtabs) { bind $but $event [linsert $script end [_escape $name]] } DragSite::register $but \ -draginitcmd [list [namespace current]::_draginitcmd $path $name] DropSite::register $but \ -dropcmd [list [namespace current]::_dropcmd $path $name] \ -droptypes [list ButtonBar:$path] _redraw $path if {![string equal [Widget::getoption $path -pages] ""]} { set res [[Widget::getoption $path -pages] add $name] } else { set res $but } if {[llength $data(buttons)] == 1} { activate $path $name -nocmd } return $res } proc ButtonBar::_draginitcmd {path name target x y top} { activate $path $name return [list ButtonBar:$path {move} $name] } proc ButtonBar::_dropcmd {path tname target source X Y op type name} { move $path $name [index $path $tname] } # ---------------------------------------------------------------------------- # Command ButtonBar::move # ---------------------------------------------------------------------------- proc ButtonBar::move {path name idx} { variable $path upvar 0 $path data set i [lsearch -exact $data(buttons) $name] if {$i >= 0} { set data(buttons) [linsert [lreplace $data(buttons) $i $i] $idx $name] _redraw $path } } # ---------------------------------------------------------------------------- # Command ButtonBar::delete # ---------------------------------------------------------------------------- proc ButtonBar::delete {path name {destroyframe 1}} { variable $path upvar 0 $path data set i [lsearch -exact $data(buttons) $name] if {$i >= 0} { set data(buttons) [lreplace $data(buttons) $i $i] destroy [_but $path $name] if {![string equal [Widget::getoption $path -pages] ""]} { [Widget::getoption $path -pages] delete $name } if {[llength $data(buttons)] == 0} { set data(active) "" } catch {unset data(raisecmd,$name)} catch {unset data(text,$name)} catch {unset data(width,$name)} catch {unset data(height,$name)} _redraw $path # TODO: Delete style ButtonBar.$name.TButton } } # ---------------------------------------------------------------------------- # Command ButtonBar::activate # ---------------------------------------------------------------------------- proc ButtonBar::activate {path name {nocmd ""}} { variable $path upvar 0 $path data set active "" foreach n $data(buttons) { set but [_but $path $n] if {![catch {Widget::theme}] && [Widget::theme]} { if {[string equal $n $name]} { $but:cmd state {pressed active} set active $n } else { $but:cmd state {!pressed !active} } } else { if {[string equal $n $name]} { Button::configure $but -relief sunken -state active set active $n } else { Button::configure $but -relief raised -state normal } } } if {![string equal [Widget::getoption $path -pages] ""]} { [Widget::getoption $path -pages] raise $active } if {$nocmd != "-nocmd" && $active != $data(active)} { if {[info exists data(raisecmd,$name)]} { uplevel #0 $data(raisecmd,$name) } set cmd [Widget::getoption $path -command] if {$cmd != ""} { uplevel #0 $cmd [list $active] } } set data(active) $active } # ---------------------------------------------------------------------------- # Command ButtonBar::itemconfigure # ---------------------------------------------------------------------------- proc ButtonBar::itemconfigure {path name args} { variable $path upvar 0 $path data set but [_but $path $name] if {[llength $args] == 1} { set key [lindex $args 0] switch -- $key { -text { set res $data(text,$name) } -raisecmd { if {[info exists data(raisecmd,$name)]} { set res [list -raisecmd raisecmd Raisecmd "" \ $data(raisecmd,$name)] } else { set res [list -raisecmd raisecmd Raisecmd "" ""] } } -font - -foreground - -activeforeground { if {![catch {Widget::theme}] && [Widget::theme]} { # TODO: Do we really need this for Ttk? set val [ttk::style configure ButtonBar.$name.TButton $key] set def [ttk::style configure TButton $key] set res [list $key {} {} $def $val] } else { set res [Button:configure $but $key] } } default { set res [Button:configure $but $key] } } return $res } else { set opts {} foreach {key val} $args { switch -- $key { -raisecmd { set data(raisecmd,$name) $val } -foreground - -activeforeground { if {![catch {Widget::theme}] && [Widget::theme]} { ttk::style configure ButtonBar.$name.TButton \ -foreground $val } else { lappend opts $key $val } } -font { if {![catch {Widget::theme}] && [Widget::theme]} { ttk::style configure ButtonBar.$name.TButton -font $val } else { lappend opts $key $val } } default { lappend opts $key $val } } } if {[llength $opts] > 0} { set res [eval [list Button::configure $but] $opts] } else { set res "" } set tf 0 foreach {key val} $args { switch -- $key { -text - -font { set tf 1 } } } if {$tf} { _calc_text $path $name _reconfigure_text $path $name } } return $res } # ---------------------------------------------------------------------------- # Command ButtonBar::itemcget # ---------------------------------------------------------------------------- proc ButtonBar::itemcget {path name option} { variable $path upvar 0 $path data switch -- $option { -text { set res $data(text,$name) } -raisecmd { if {[info exists data(raisecmd,$name)]} { set res $data(raisecmd,$name) } else { set res "" } } -font - -foreground - -activeforeground { if {![catch {Widget::theme}] && [Widget::theme]} { set res [ttk::style lookup ButtonBar.$name.TButton $option] } else { set res [Button::cget [_but $path $name] $option] } } default { set res [Button::cget [_but $path $name] $option] } } return $res } # ---------------------------------------------------------------------------- # Command ButtonBar::setfocus # ---------------------------------------------------------------------------- proc ButtonBar::setfocus {path name} { set but [_but $path $name] if { [winfo exists $but] } { focus $but } } # ---------------------------------------------------------------------------- # Command ButtonBar::index # ---------------------------------------------------------------------------- proc ButtonBar::index {path name} { variable $path upvar 0 $path data return [lsearch -exact $data(buttons) $name] } # ---------------------------------------------------------------------------- # Command ButtonBar::_configure # ---------------------------------------------------------------------------- proc ButtonBar::_configure {path} { variable $path upvar 0 $path data set w [winfo width $path] set h [winfo height $path] if {![info exists data(width)] || $data(width) != $w || \ ![info exists data(height)] || $data(height) != $h} { set data(width) $w set data(height) $h _redraw $path } } # ---------------------------------------------------------------------------- # Command ButtonBar::_redraw # ---------------------------------------------------------------------------- proc ButtonBar::_redraw {path} { variable $path upvar 0 $path data array unset data configured,* $path:cmd configure -width 0 grid forget $path.spacer set cols [lindex [grid size $path] 0] set rows [lindex [grid size $path] 1] for {set c 0} {$c < $cols} {incr c} { grid columnconfigure $path $c -weight 0 -minsize 0 catch {grid columnconfigure $path $c -uniform {}} } for {set r 0} {$r < $rows} {incr r} { grid rowconfigure $path $r -weight 0 -minsize 0 catch {grid rowconfigure $path $r -uniform {}} } set num [llength $data(buttons)] if {$num == 0} return # Change buttons stacking order foreach name $data(buttons) { ::raise [_but $path $name] } set min [winfo pixels $path [Widget::getoption $path -minwidth]] set max [winfo pixels $path [Widget::getoption $path -maxwidth]] if {$min > $max} { set max $min } if {[string equal [Widget::getoption $path -orient] "horizontal"]} { set w [winfo width $path] if {$min == 0} { set cols $num } else { set cols [expr {int($w / $min)}] if {$cols > $num} { set cols $num } } if {[expr {$max * $cols}] < $w} { set weight 2 set minsize $max grid $path.spacer -column $cols -row 0 grid columnconfigure $path $cols -weight 1 -minsize 0 } else { set weight 1 set minsize $min } set c 0 set r 0 foreach name $data(buttons) { grid [_but $path $name] -column $c -row $r -sticky nsew grid columnconfigure $path $c -weight $weight -minsize $minsize catch {grid columnconfigure $path $c -uniform 1} incr c if {$c >= $cols} { set c 0 incr r } } } else { set h [winfo height $path] set c 0 set r 0 set th 0 set num 0 foreach name $data(buttons) { _reconfigure_text $path $name } foreach name $data(buttons) { set but [_but $path $name] if {[info exists data(height,$name)]} { incr th $data(height,$name) } else { incr th [winfo reqheight $but] } if {($c > 0 && $r >= $num) || ($c == 0 && $th > $h)} { set r 0 incr c } elseif {$c == 0} { incr num } grid $but -column $c -row $r -sticky nsew grid rowconfigure $path $r -weight 0 -minsize 0 grid columnconfigure $path $c -weight 0 -minsize $max incr r } grid rowconfigure $path $num -weight 10000000 -minsize 0 } } # ---------------------------------------------------------------------------- # Command ButtonBar::_destroy # ---------------------------------------------------------------------------- proc ButtonBar::_destroy {path} { variable $path upvar 0 $path data Widget::destroy $path unset data } # ---------------------------------------------------------------------------- # Command ButtonBar::_but # ---------------------------------------------------------------------------- proc ButtonBar::_but {path name} { return $path.b:$name } # ---------------------------------------------------------------------------- # Command ButtonBar::pages # ---------------------------------------------------------------------------- proc ButtonBar::pages {path {first ""} {last ""}} { variable $path upvar 0 $path data if {[string equal $first ""]} { return $data(buttons) } elseif {[string equal $last ""]} { return [lindex $data(buttons) $first] } else { return [lrange $data(buttons) $first $last] } } # ---------------------------------------------------------------------------- # Command ButtonBar::raise # ---------------------------------------------------------------------------- proc ButtonBar::raise {path {name ""}} { variable $path upvar 0 $path data if {[string equal $name ""]} { return $data(active) } else { activate $path $name } } # ---------------------------------------------------------------------------- # Command ButtonBar::getframe # ---------------------------------------------------------------------------- proc ButtonBar::getframe {path name} { if {![string equal [Widget::getoption $path -pages] ""]} { return [[Widget::getoption $path -pages] getframe $name] } else { return "" } } # ---------------------------------------------------------------------------- # Command ButtonBar::bindtabs # ---------------------------------------------------------------------------- proc ButtonBar::bindtabs {path event script} { variable $path upvar 0 $path data lappend data(bindtabs) $event $script foreach name $data(buttons) { bind [_but $path $name] $event [linsert $script end [_escape $name]] } } # ---------------------------------------------------------------------------- # Command ButtonBar::see # ---------------------------------------------------------------------------- proc ButtonBar::see {path name} { return "" } # ---------------------------------------------------------------------------- # Command ButtonBar::_itemconfigure # ---------------------------------------------------------------------------- proc ButtonBar::_itemconfigure {path name} { variable $path upvar 0 $path data if {[info exists data(configured,$name)]} return set data(configured,$name) 1 set but [_but $path $name] set w [winfo width $but] if {![info exists data(text,$name)] || ![info exists data(width,$name)] || $data(width,$name) != $w} { set data(width,$name) $w _reconfigure_text $path $name } set data(height,$name) [winfo height $but] } # ---------------------------------------------------------------------------- # Command ButtonBar::_calc_text # ---------------------------------------------------------------------------- proc ButtonBar::_calc_text {path name} { variable $path upvar 0 $path data set text [_itemoption $path $name -text] set font [_itemoption $path $name -font] set data(text,$name) [list $text [font measure $font $text]] set len [string length $text] for {set ind 0} {$ind < $len} {incr ind} { lappend data(text,$name) \ [font measure $font [string range $text 0 $ind]\u2026] } } # ---------------------------------------------------------------------------- # Command ButtonBar::_reconfigure_text # ---------------------------------------------------------------------------- proc ButtonBar::_reconfigure_text {path name} { variable $path upvar 0 $path data if {![info exists data(text,$name)]} return set but [_but $path $name] set padx [winfo pixels $path [_itemoption $path $name -padx]] set bd [winfo pixels $path [_itemoption $path $name -borderwidth]] set hl [winfo pixels $path [_itemoption $path $name -highlightthickness]] set w [winfo width $but] set min [winfo pixels $path [Widget::getoption $path -minwidth]] set max [winfo pixels $path [Widget::getoption $path -maxwidth]] if {$min > $max} { set max $min } set tw [expr {$w - 2*($padx + $bd + $hl + 1)}] set mw [expr {$max - 2*($padx + $bd + $hl + 1)}] set text [lindex $data(text,$name) 0] set textw [lindex $data(text,$name) 1] Button::configure $but -text $text -helptext "" if {$textw <= $tw && $textw <= $mw} { return } set i -1 foreach textw [lrange $data(text,$name) 2 end] { if {$textw > $tw || $textw > $mw} { Button::configure $but -text [string range $text 0 $i]\u2026 \ -helptext $text return } incr i } } # ---------------------------------------------------------------------------- # Command ButtonBar::_escape # ---------------------------------------------------------------------------- proc ButtonBar::_escape {str} { string map {% %%} $str } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/ifacetk/default.tcl000064400000000000000000000145341477701321300156160ustar00nobodynobody# default.tcl -- # # This file is a part of the Tkabber XMPP client. It defines the # default geometry for Tkabber windows, fonts for rosters and # chatlog windows, and provides a few useful bindings. set priority 21 option add *Chat.chatgeometry [winfo pixels . 12c]x[winfo pixels . 12c] $priority option add *Chat.groupchatgeometry [winfo pixels . 15c]x[winfo pixels . 15c] $priority option add *Customize.geometry [winfo pixels . 18c]x[winfo pixels . 15c] $priority option add *RawXML.geometry [winfo pixels . 15c]x[winfo pixels . 15c] $priority option add *Stats.geometry [winfo pixels . 15c]x[winfo pixels . 15c] $priority option add *Messages.geometry [winfo pixels . 18c]x[winfo pixels . 15c] $priority option add *JDisco.geometry [winfo pixels . 15c]x[winfo pixels . 15c] $priority option add *insertWidth [winfo pixels . 0.25m] $priority option add *RawXML.inputheight 4 $priority option add *font TkDefaultFont $priority option add *Menubutton.indicatorOn 1 $priority option add *Chat*Menubutton.indicatorOn 0 $priority option add *Message*Menubutton.indicatorOn 0 $priority option add *Menubutton.relief raise $priority option add *Chat*Menubutton.relief flat $priority option add *Message*Menubutton.relief flat $priority if {$::darktheme} { # Color of inactive urls in text option add *urlforeground cornflowerblue $priority # Color of active urls in text option add *urlactiveforeground skyblue $priority # Colors of erroneous words (when ispell module is using) option add *Text.errorColor coral3 $priority option add *Text.comboColor cornflowerblue $priority # Color for highlighting found items option add *highlightSearchBackground #b1ddb1 $priority } else { # Color of inactive urls in text option add *urlforeground dodgerblue4 $priority # Color of active urls in text option add *urlactiveforeground dodgerblue3 $priority # Colors of erroneous words (when ispell module is using) option add *Text.errorColor firebrick4 $priority option add *Text.comboColor dodgerblue4 $priority # Color for highlighting found items option add *highlightSearchBackground #c1eec1 $priority } if {$::tcl_platform(platform) eq "unix" && \ ([catch {tk::pkgconfig get fontsystem} fontsystem] || \ $fontsystem ne "xft")} { set ::XLFDFonts 1 } else { set ::XLFDFonts 0 } proc create_default_fonts {class} { global ${class}Font ${class}BoldFont ${class}ItalicFont \ ${class}BoldItalicFont # Getting the default font in text widget set f [frame .tmpframe -class $class] set t [text $f.tmptext] set ${class}Font [lindex [$t configure -font] 4] font create ${class}Font {*}[font actual [set ${class}Font]] set ${class}BoldFont [option get .tmpframe boldFont $class] set ${class}ItalicFont [option get .tmpframe italicFont $class] set ${class}BoldItalicFont [option get .tmpframe boldItalicFont $class] destroy $f if {!$::XLFDFonts} { set ::default_${class}_font \ [list [font actual ${class}Font -family] \ [font actual ${class}Font -size]] set ${class}Font ${class}Font } if {!$::XLFDFonts || [set ${class}BoldFont] eq ""} { set ${class}BoldFont \ [font create ${class}BoldFont {*}[font configure ${class}Font] \ -weight bold] } if {!$::XLFDFonts || [set ${class}ItalicFont] eq ""} { set ${class}ItalicFont \ [font create ${class}ItalicFont {*}[font configure ${class}Font] \ -slant italic] } if {!$::XLFDFonts || [set ${class}BoldItalicFont] eq ""} { set ${class}BoldItalicFont \ [font create ${class}BoldItalicFont \ {*}[font configure ${class}Font] \ -weight bold -slant italic] } } proc redefine_fonts {class args} { font configure ${class}Font {*}$args font configure ${class}BoldFont {*}[font configure ${class}Font] \ -weight bold font configure ${class}ItalicFont {*}[font configure ${class}Font] \ -slant italic font configure ${class}BoldItalicFont {*}[font configure ${class}Font] \ -weight bold -slant italic } create_default_fonts Chat create_default_fonts Roster if {![info exists usetabbar]} { set usetabbar 1 } bind Text <> { %W yview scroll -5 units } bind Text <> { %W yview scroll 5 units } bind Listbox <> { %W yview scroll -5 units } bind Listbox <> { %W yview scroll 5 units } bind Treeview <> { %W yview scroll -5 units } bind Treeview <> { %W yview scroll 5 units } bind Text <> { %W xview scroll -10 units } bind Text <> { %W xview scroll 10 units } bind Listbox <> { %W xview scroll -10 units } bind Listbox <> { %W xview scroll 10 units } bind Treeview <> { %W xview scroll -10 units } bind Treeview <> { %W xview scroll 10 units } if {([catch {tk windowingsystem}] && $::tcl_platform(platform) eq "unix") || (![catch {tk windowingsystem}] && [tk windowingsystem] eq "x11")} { event add <> <4> event add <> <5> event add <> event add <> } if {$::tcl_platform(platform) eq "windows"} { # workaround for shortcuts in russian keyboard layout event add <> event add <> event add <> event add <> event add <> event add <> event add <> } if {[event info <>] eq ""} { # tk < 8.6 if {$::aquaP} { # workaround for tk < 8.6.1 set context 2 } else { set context 3 } event add <> <$context> } if {[event info <>] eq ""} { if {$::aquaP} { set middle 2 } else { set middle 3 } event add <> <$middle> } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/ifacetk/iface.tcl000064400000000000000000001533331477701321300152420ustar00nobodynobody# iface.tcl -- # # This file is a part of the Tkabber XMPP client. It creates the main # Tkabber window. namespace eval ifacetk { variable options custom::defgroup IFace \ [::msgcat::mc "Options for main interface."] \ -group Tkabber -tag "Main Interface" custom::defvar options(use_tabbar) 1 \ [::msgcat::mc \ "Use Tabbed Interface (you need to restart)."] \ -group IFace -type boolean custom::defvar options(tabs_side) top \ [::msgcat::mc "Side where to place tabs in tabbed mode."] \ -group IFace -type options \ -values [list top [::msgcat::mc "Top"] \ bottom [::msgcat::mc "Bottom"] \ left [::msgcat::mc "Left"] \ right [::msgcat::mc "Right"]] \ -command [namespace current]::configure_tabs custom::defvar options(tab_minwidth) [winfo pixels . 25m] \ [::msgcat::mc "Minimum width of tab buttons in tabbed mode."] \ -group IFace -type integer \ -command [namespace current]::configure_tabs custom::defvar options(tab_maxwidth) [winfo pixels . 30m] \ [::msgcat::mc "Maximum width of tab buttons in tabbed mode."] \ -group IFace -type integer \ -command [namespace current]::configure_tabs custom::defvar options(show_toolbar) 1 \ [::msgcat::mc "Show Toolbar."] \ -group IFace -type boolean \ -command [namespace current]::switch_toolbar custom::defvar options(show_presencebar) 1 \ [::msgcat::mc "Show presence bar."] \ -group IFace -type boolean \ -command [namespace current]::switch_presencebar custom::defvar options(show_statusbar) 1 \ [::msgcat::mc "Show status bar."] \ -group IFace -type boolean \ -command [namespace current]::switch_statusbar if {!$::XLFDFonts} { custom::defvar options(font) $::default_Chat_font \ [::msgcat::mc "Font to use in chat windows."] \ -group IFace -type font \ -command [list [namespace current]::switch_font font Chat] custom::defvar options(roster_font) $::default_Roster_font \ [::msgcat::mc "Font to use in roster windows."] \ -group IFace -type font \ -command [list [namespace current]::switch_font roster_font Roster] } custom::defvar options(raise_new_tab) 1 \ [::msgcat::mc "Raise new tab."] \ -group IFace -type boolean custom::defvar options(message_numbers_in_tabs) 1 \ [::msgcat::mc "Show number of unread messages in tab titles."] \ -group IFace -type boolean custom::defvar options(only_personal_messages_in_window_title) 0 \ [::msgcat::mc "Show only the number of personal unread messages\ in window title."] \ -group IFace -type boolean custom::defvar options(update_title_delay) 600 \ [::msgcat::mc "Delay between getting focus and updating window or\ tab title in milliseconds."] \ -group IFace -type integer custom::defvar options(show_tearoffs) 1 \ [::msgcat::mc "Show menu tearoffs when possible."] \ -group IFace -type boolean custom::defvar options(closebuttonaction) close \ [::msgcat::mc "What action does the close button."] \ -group IFace -type options \ -values [list \ close [::msgcat::mc "Close Tkabber"] \ nothing [::msgcat::mc "Do nothing"] \ minimize [::msgcat::mc "Minimize"] \ iconize [::msgcat::mc "Iconize"] \ systray [::msgcat::mc "Minimize to systray (if systray\ icon is enabled, otherwise do\ nothing)"] \ ] custom::defvar status_history [list] \ [::msgcat::mc "History of availability status messages"] \ -type string \ -group Hidden custom::defvar options(max_status_history) 10 \ [::msgcat::mc "Maximum number of status messages to keep.\ If the history size reaches this threshold,\ the oldest message will be deleted automatically\ when a new one is recorded."] \ -type integer -group IFace proc isource {file} { set dir [file dirname [info script]] source [file join $dir $file] } isource login.tcl isource roster.tcl isource systray.tcl isource muc.tcl variable after_focused_id "" variable number_msg variable personal_msg namespace export raise_win add_win destroy_win tab_set_updated } source [file join [file dirname [info script]] buttonbar.tcl] proc ifacetk::configure_tabs {args} { variable options global usetabbar variable tabs if {$usetabbar} { if {[string is integer -strict $options(tab_minwidth)] && \ $options(tab_minwidth) >= 0} { set minwidth $options(tab_minwidth) } else { set minwidth [winfo pixels . 25m] } if {[string is integer -strict $options(tab_maxwidth)] && \ $options(tab_maxwidth) >= 0} { set maxwidth $options(tab_maxwidth) } else { set maxwidth [winfo pixels . 25m] } switch -- $options(tabs_side) { bottom { set row 2 set col 1 set orient horizontal } left { set row 1 set col 0 set orient vertical } right { set row 1 set col 2 set orient vertical } default { set row 0 set col 1 set orient horizontal } } grid .nb -row $row -column $col -sticky nswe -in $tabs .nb configure -minwidth $minwidth -maxwidth $maxwidth -orient $orient } } if {$::darktheme} { option add *errorForeground coral3 widgetDefault } else { option add *errorForeground red widgetDefault } wm protocol . WM_SAVE_YOURSELF session_checkpoint wm protocol . WM_DELETE_WINDOW \ [list [namespace current]::ifacetk::wm_delete_window] proc ifacetk::wm_delete_window {} { variable options hook::run protocol_wm_delete_window_hook $options(closebuttonaction) } proc ifacetk::closebuttonproc {action} { variable options switch -- $action { nothing {} minimize { wm iconify . } iconize { wm iconify . wm state . withdrawn } close - default { quit } } } hook::add protocol_wm_delete_window_hook \ [namespace current]::ifacetk::closebuttonproc set xselection "" proc EncodeTextSelection {txt offset len} { set elided "" if {"emphasized" in [$txt tag names] && \ [$txt tag cget emphasized -elide]} { set elided emphasized } elseif {"nonemphasized" in [$txt tag names] && \ [$txt tag cget nonemphasized -elide]} { set elided nonemphasized } if {[string equal $elided ""]} { set sel [$txt tag ranges sel] if {[llength $sel] == 0} { set ::xselection "" } else { set ::xselection [eval [list $txt get] $sel] } } else { lassign [$txt tag ranges sel] selstart selstop set sel $selstart set ::xselection "" while {[set range [$txt tag nextrange $elided $sel $selstop]] ne ""} { append ::xselection [$txt get $sel [lindex $range 0]] set sel [lindex $range 1] } append ::xselection [$txt get $sel $selstop] } encoding convertto \ [string range $::xselection $offset [expr {$offset + $len - 1}]] } proc EncodeEntrySelection {txt offset len} { if [$txt selection present] { set idx1 [$txt index sel.first] set idx2 [$txt index sel.last] set ::xselection [string range [$txt get] $idx1 $idx2] encoding convertto \ [string range $::xselection $offset [expr {$offset + $len - 1}]] } else { set ::xselection "" } } if {[string equal $tcl_platform(platform) unix]} { proc ::tk::GetSelection {w {sel PRIMARY}} { if {![catch {selection get -displayof $w \ -selection $sel -type UTF8_STRING} txt]} { return $txt } elseif {![catch {selection get -displayof $w -selection $sel} txt]} { if {[selection own] == ""} { return [encoding convertfrom $txt] } else { return $::xselection } } else { return -code error "could not find default selection" } } bind Text { selection handle %W "EncodeTextSelection %W" } bind Entry { selection handle %W "EncodeEntrySelection %W" } } proc ifacetk::load_descmenu {} { global descmenu variable options set descmenu \ [list "&Tkabber" {} tkabber $options(show_tearoffs) \ [list \ [list cascade [::msgcat::mc "Presence"] {} presence $options(show_tearoffs) \ [list \ [list command [::msgcat::mc "Available"] {} {} {} \ -command {set userstatus available}] \ [list command [::msgcat::mc "Free to chat"] {} {} {} \ -command {set userstatus chat}] \ [list command [::msgcat::mc "Away"] {} {} {} \ -command {set userstatus away}] \ [list command [::msgcat::mc "Extended away"] {} {} {} \ -command {set userstatus xa}] \ [list command [::msgcat::mc "Do not disturb"] {} {} {} \ -command {set userstatus dnd}] \ {separator} \ [list command [::msgcat::mc "Change priority..."] {} {} {} \ -command {change_priority_dialog}]]] \ [list command [::msgcat::mc "Log in..."] {} {} {Ctrl l} \ -command [list [namespace current]::login_dialog]] \ [list command [::msgcat::mc "Log out"] {} {} {Ctrl j} \ -command [list [namespace current]::logout_dialog]] \ [list command [::msgcat::mc "Log out with reason..."] {} {} {} \ -command {show_logout_dialog}] \ [list command [::msgcat::mc "Open login log"] {} {} {} \ -command {login_log_window}] \ {separator} \ [list command [::msgcat::mc "Change password..."] {} {} {} \ -command {::register::password [lindex [connections] 0]}] \ [list command [::msgcat::mc "Edit my info..."] {} {} {} \ -command { if {[llength [connections]] > 0} { set xlib [lindex [connections] 0] userinfo::open $xlib [connection_bare_jid $xlib] \ -editable 1 \ }}] \ [list cascade [::msgcat::mc "Privacy rules"] {} privacy $options(show_tearoffs) \ [list \ [list checkbutton [::msgcat::mc "Activate lists at startup"] {} {} {} \ -variable ::privacy::options(activate_at_startup)] \ [list command [string trim [::msgcat::mc "Edit invisible list "]] {} {} {} \ -command {privacy::edit_special_list "" invisible}] \ [list command [string trim [::msgcat::mc "Edit ignore list "]] {} {} {} \ -command {privacy::edit_special_list "" ignore}] \ [list command [string trim [::msgcat::mc "Edit conference list "]] {} {} {} \ -command {privacy::edit_special_list "" conference}] \ [list checkbutton [::msgcat::mc "Accept messages from roster users only"] {} {} {} \ -variable ::privacy::accept_from_roster_only \ -command {privacy::on_accept_from_roster_only_change ""}] \ {separator} \ [list command [::msgcat::mc "Manually edit rules"] {} {} {} \ -command {privacy::request_lists ""}]]] \ {separator} \ [list cascade [::msgcat::mc "View"] {} {} $options(show_tearoffs) \ [list \ [list checkbutton [::msgcat::mc "Toolbar"] \ {} {} {} \ -variable [namespace current]::options(show_toolbar)] \ [list checkbutton [::msgcat::mc "Presence bar"] \ {} {} {} \ -variable [namespace current]::options(show_presencebar)] \ [list checkbutton [::msgcat::mc "Status bar"] \ {} {} {} \ -variable [namespace current]::options(show_statusbar)] \ ]] \ [list cascade [::msgcat::mc "Roster"] {} roster $options(show_tearoffs) \ [list \ [list checkbutton [::msgcat::mc "Show online users only"] \ {} {} {} \ -variable [namespace current]::roster::show_only_online] \ [list checkbutton [::msgcat::mc "Show own resources"] {} {} {} \ -variable [namespace current]::roster::options(show_own_resources)] \ [list checkbutton [::msgcat::mc "Use roster filter"] {} {} {} \ -variable [namespace current]::roster::options(use_filter)] \ [list checkbutton [::msgcat::mc "Enable metacontacts"] {} {} {} \ -variable [namespace current]::roster::options(enable_metacontacts)] \ [list command [::msgcat::mc "Add group by regexp on JIDs..."] {} {} {} \ -command [namespace current]::roster::add_group_by_jid_regexp_dialog] \ ]] \ [list cascade [::msgcat::mc "Chats"] {} chats $options(show_tearoffs) \ [list \ [list checkbutton [::msgcat::mc "Generate enter/exit messages"] {} {} {} \ -variable ::muc::options(gen_enter_exit_msgs)] \ [list checkbutton [::msgcat::mc "Smart autoscroll"] {} {} {} \ -variable ::chat::options(smart_scroll)] \ [list checkbutton [::msgcat::mc "Stop autoscroll"] {} {} {} \ -variable ::chat::options(stop_scroll)] \ [list checkbutton [::msgcat::mc "Emphasize"] {} {} {} \ -variable ::plugins::stylecodes::options(emphasize)] \ [list checkbutton [::msgcat::mc "Show emoticons"] {} {} {} \ -variable ::plugins::emoticons::options(show_emoticons)] \ {separator} \ ]] \ {separator} \ [list command [::msgcat::mc "Manage proxy servers"] {} {} {} \ -command {proxy::open}] \ [list command [::msgcat::mc "Customize"] {} {} {} \ -command {custom::open_window Tkabber}] \ {separator} \ [list command [::msgcat::mc "Quit"] {} {} {} \ -command {quit}] \ ] \ [::msgcat::mc "&Services"] {} services $options(show_tearoffs) \ [list \ [list command [::msgcat::mc "Add user to roster..."] {} {} {} \ -command {message::send_subscribe_dialog ""}] \ {separator} \ [list command [::msgcat::mc "Send message..."] {} {} {} \ -command {message::send_dialog}] \ [list command [::msgcat::mc "Open chat..."] {} {} {} \ -command {chat::open_chat_dialog}] \ [list command [::msgcat::mc "Join group..."] {} {} {}\ -command {join_group_dialog ""}] \ [list command [::msgcat::mc "Show user or service info..."] {} {} {} \ -command {userinfo::show_info_dialog}] \ {separator} \ [list command [::msgcat::mc "Service Discovery"] {} {} {} \ -command {disco::browser::open_win "" ""}] \ {separator} \ [list command [::msgcat::mc "Message archive"] {} {} {} \ -command {message_archive::show_archive}] \ [list cascade [::msgcat::mc "Plugins"] {} plugins $options(show_tearoffs) \ ] \ {separator} \ [list cascade [::msgcat::mc "Admin tools"] {} admin $options(show_tearoffs) \ [list \ [list command [::msgcat::mc "Send broadcast message..."] {} {} {} \ -command {ifacetk::send_announce_message announce/online}] \ [list command [::msgcat::mc "Send message of the day..."] {} {} {} \ -command {ifacetk::send_announce_message announce/motd}] \ [list command [::msgcat::mc "Update message of the day..."] {} {} {} \ -command {ifacetk::send_announce_message announce/motd/update}] \ [list command [::msgcat::mc "Delete message of the day"] {} {} {} \ -command {ifacetk::send_announce_message announce/motd/delete}] \ {separator} \ ]] \ [list cascade [::msgcat::mc "Debug tools"] {} debug $options(show_tearoffs) \ ] \ ] \ [::msgcat::mc "&Help"] {} help $options(show_tearoffs) \ [list \ [list command [::msgcat::mc "Quick help"] {} {} {} \ -command ifacetk::quick_help_window] \ [list command [::msgcat::mc "About"] {} {} {} \ -command ifacetk::about_window] \ ] \ ] set descmenu [menuload $descmenu] } ############################################################################### proc ifacetk::send_announce_message {resource} { if {[llength [connections]] == 0} return set xlib [lindex [connections] 0] set server [connection_server $xlib] if {[string equal $resource announce/motd/delete]} { message::send_msg $xlib $server/$resource -type normal } else { message::send_dialog -to $server/$resource -connection $xlib } } ############################################################################### proc ifacetk::quick_help_window {} { set w .quick_help if {[winfo exists $w]} { destroy $w } Dialog $w -anchor e \ -title [::msgcat::mc "Quick Help"] \ -side bottom \ -modal none \ -default 0 \ -cancel 0 $w add -text [::msgcat::mc "Close"] -command [list destroy $w] set frame [$w getframe] set sw [ScrolledWindow $frame.sw] pack $sw -fill both -expand yes set t [Text $frame.help -wrap none -takefocus 0] set tabstop [font measure [get_conf $t -font] \ " [::msgcat::mc {Middle mouse button}] "] $t configure -tabs $tabstop $sw setwidget $t $t insert 0.0 \ "[::msgcat::mc {Main window:}] $::tk_modify-L\t[::msgcat::mc {Log in}] $::tk_modify-J\t[::msgcat::mc {Log out}] [::msgcat::mc Tabs:] $::tk_modify-F4, [::msgcat::mc {Middle mouse button}]\t[::msgcat::mc {Close tab}] $::tk_modify-PgUp/Down\t[::msgcat::mc {Previous/Next tab}] $::tk_modify-Alt-PgUp/Down\t[::msgcat::mc {Move tab left/right}] Alt-\[1-9,0\]\t[::msgcat::mc {Switch to tab number 1-9,10}] $::tk_modify-R\t[::msgcat::mc {Hide/Show roster}] [::msgcat::mc Common:] $::tk_modify-S\t[::msgcat::mc {Activate search panel}] [::msgcat::mc Chats:] TAB\t[::msgcat::mc {Complete nickname or command}] $::tk_modify-Up/Down\t[::msgcat::mc {Previous/Next history message}] Alt-E\t[::msgcat::mc {Show palette of emoticons}] $::tk_modify-Z\t[::msgcat::mc {Undo}] $::tk_modify-Shift-Z\t[::msgcat::mc {Redo}] Alt-PgUp/Down\t[::msgcat::mc {Scroll chat window up/down}] [::msgcat::mc {Right mouse button}]\t[::msgcat::mc {Correct word}] [::msgcat::mc Systray:] [::msgcat::mc {Left mouse button}]\t[::msgcat::mc {Show main window}] [::msgcat::mc {Middle mouse button}]\t[::msgcat::mc {Hide main window}] [::msgcat::mc {Right mouse button}]\t[::msgcat::mc {Popup menu}]" $t configure -state disabled $w draw } proc ifacetk::about_window {} { global tkabber_version toolkit_version set w .about if {[winfo exists $w]} { destroy $w } Dialog $w -anchor e \ -title [::msgcat::mc "About"] \ -image tkabber/logo1 \ -side bottom \ -modal none \ -default 0 \ -cancel 0 $w add -text [::msgcat::mc "Close"] -command [list destroy $w] set frame [$w getframe] set m [Message $frame.msg -text " Tkabber $tkabber_version ($toolkit_version) Copyright \u00a9 2002-2025 [::msgcat::mc {Alexey Shchepin}] \n[::msgcat::mc Authors:] [::msgcat::mc {Alexey Shchepin}] [::msgcat::mc {Marshall T. Rose}] [::msgcat::mc {Sergei Golovan}] [::msgcat::mc {Michail Litvak}] [::msgcat::mc {Konstantin Khomoutov}] "] pack $m -side top -anchor w set t [text $frame.url -cursor [get_conf $frame.msg -cursor] \ -background [get_conf $frame.msg -background] \ -height 1 \ -width 25 \ -borderwidth 0 \ -highlightthickness 0 \ -takefocus 0] ::richtext::config $t -using url ::richtext::render_message $t " http://tkabber.jabber.ru/" "" $t delete {end - 1 char} $t configure -state disabled pack $t -side top -anchor w -fill x $w draw } proc ifacetk::switch_font {font class args} { variable options set opts [lassign $options($font) family size] set args [list -family $family -size $size] set bold 0 set italic 0 set underline 0 set overstrike 0 foreach opt $opts { switch -- $opt { bold { lappend args -weight bold set bold 1 } italic { lappend args -slant italic set italic 1 } underline { lappend args -underline 1 set underline 1 } overstrike { lappend args -overstrike 1 set overstrike 1 } } } if {!$bold} { lappend args -weight normal } if {!$italic} { lappend args -slant roman } if {!$underline} { lappend args -underline 0 } if {!$overstrike} { lappend args -overstrike 0 } eval redefine_fonts $class $args if {$class == "Roster"} { roster::redraw_after_idle foreach chatid [chat::opened] { if {[chat::is_groupchat $chatid]} { chat::redraw_roster_after_idle $chatid } } } } proc ifacetk::show_ssl_info {} { global ssl_certificate_fields if {[winfo exists .ssl_info]} { destroy .ssl_info } if {[llength [set msg_list [ssl_info]]] == 0} return Dialog .ssl_info -title [::msgcat::mc "SSL Info"] \ -anchor e \ -default 0 \ -cancel 0 \ -modal none .ssl_info add -text [::msgcat::mc "Close"] -command "destroy .ssl_info" set fr [.ssl_info getframe] if {[llength $msg_list] == 2} { lassign $msg_list server msg set page [Frame $fr.page] set title [::msgcat::mc "%s SSL Certificate Info" $server] grid [Label $page.title -text $title] -row 0 -column 0 -sticky ew grid [Message $page.info -aspect 50000 -text $msg] \ -row 1 -column 0 -sticky ew pack $page -expand yes -fill both -padx 1m -pady 1m } else { set nb [Notebook $fr.nb] pack $nb -expand yes -fill both -padx 0m -pady 0m set i 0 foreach {server msg} $msg_list { set page [$nb insert end page$i -text $server] set title [::msgcat::mc "%s SSL Certificate Info" $server] grid [Label $page.title -text $title] -row 0 -column 0 -sticky ew grid [Message $page.info -aspect 50000 -text $msg] \ -row 1 -column 0 -sticky ew incr i } catch {$nb compute_size} catch {$nb raise page0} } .ssl_info draw } proc ifacetk::update_ssl_ind {xlib} { global use_tls variable ssl_ind if {!$use_tls} return lassign [update_ssl_info] state fg balloon if {![string equal $fg warning]} { label .fake_label set fg [.fake_label cget -foreground] destroy .fake_label } else { set fg [option get $ssl_ind errorForeground Label] } $ssl_ind configure -state $state if {[string equal $state normal]} { $ssl_ind configure -foreground $fg } DynamicHelp::register $ssl_ind balloon $balloon } hook::add connected_hook [namespace current]::ifacetk::update_ssl_ind hook::add disconnected_hook [namespace current]::ifacetk::update_ssl_ind ############################################################################### proc ifacetk::add_toolbar_button {icon command helptext} { if {[catch {set bbox [.mainframe gettoolbar 0].bbox}] || \ ![winfo exists $bbox]} { return 0 } $bbox add -image $icon \ -takefocus 0 \ -relief link \ -command $command \ -helptext $helptext return [$bbox index end] } ############################################################################### proc ifacetk::set_toolbar_icon {index script args} { if {[catch {set bbox [.mainframe gettoolbar 0].bbox}] || \ ![winfo exists $bbox]} { return } set image [eval $script] $bbox itemconfigure $index -image $image } ############################################################################### proc ifacetk::online_icon {args} { if {$::ifacetk::roster::show_only_online} { return toolbar/show-online } else { return toolbar/show-offline } } proc ifacetk::fix_borders {w} { $w configure -borderwidth 0.25m foreach ww [winfo children $w] { fix_borders $ww } } proc ifacetk::create_main_window {} { global usetabbar global user_status_list global use_tls global descmenu variable mf variable rw variable rosterwidth variable ssl_ind variable main_window_title variable options variable status_history set main_window_title "Tkabber" wm title . $main_window_title wm iconname . $main_window_title wm group . . bind all <> {focus [Widget::focusPrev %W]} load_descmenu set mf [MainFrame .mainframe -menu $descmenu -textvariable status] $mf.frame configure -borderwidth 0.25m $mf.botf configure -borderwidth 0.25m fix_borders .menubar unset descmenu if {$use_tls} { set ssl_ind [$mf addindicator -text "SSL" -state disabled] $ssl_ind configure -relief flat DynamicHelp::register $ssl_ind balloon [::msgcat::mc "Disconnected"] bind $ssl_ind <1> [namespace current]::show_ssl_info } pack $mf -expand yes -fill both bind $mf quit set bbox [ButtonBox [$mf addtoolbar].bbox -spacing 0 -padx 0.25m -pady 0.25m] add_toolbar_button toolbar/add-user {message::send_subscribe_dialog ""} \ [::msgcat::mc "Add new user..."] add_toolbar_button toolbar/disco {disco::browser::open_win "" ""} \ [::msgcat::mc "Service Discovery"] add_toolbar_button toolbar/join-conference {join_group_dialog ""} \ [::msgcat::mc "Join group..."] set idx [add_toolbar_button [ifacetk::online_icon] \ [namespace current]::roster::switch_only_online \ [::msgcat::mc "Toggle showing offline users"]] trace add variable [namespace current]::roster::show_only_online write \ [list [namespace current]::set_toolbar_icon $idx \ [namespace current]::online_icon] pack $bbox -side left -anchor w switch_toolbar if {$options(use_tabbar)} { set usetabbar 1 } else { set usetabbar 0 } set ww 0 foreach {status str} $user_status_list { if {[string length $str] > $ww} { set ww [string length $str] } } Frame .presence Menubutton .presence.button -menu .presence.button.menu \ -textvariable userstatusdesc \ -direction above \ -width $ww disallow_presence_change "" set w .presence.status Combobox $w -textvariable textstatus \ -values $status_history \ -command {set userstatus $userstatus} trace add variable ::userstatus write \ [list [namespace current]::save_availability_status $w] bind $w <> \ [list [namespace current]::show_status_context_menu [double% $w]] catch { bind $w.e <> [bind $w <>] } if {$usetabbar} { pack .presence.button -side left pack .presence.status -side left -fill x -expand yes } else { pack .presence.button -side top -anchor w pack .presence.status -side top -fill x -expand yes -anchor w } grid .presence -row 3 -column 1 -sticky nswe -in [$mf getframe] if {[winfo exists [set m .presence.button.menu]]} { destroy $m } menu $m -tearoff $options(show_tearoffs) foreach {status str} $user_status_list { switch -- $status { invisible - unavailable {} default { $m add command \ -label $str \ -command [list set userstatus $status] } } } switch_presencebar switch_statusbar set rosterwidth [option get . mainRosterWidth [winfo class .]] if {$rosterwidth == ""} { set rosterwidth [winfo pixels . 3c] } grid columnconfigure [$mf getframe] 1 -weight 1 grid rowconfigure [$mf getframe] 1 -weight 1 if {$usetabbar} { set pw [PanedWin [$mf getframe].pw -orient horizontal] grid $pw -row 1 -column 1 -sticky nswe set rw [PanedWinAdd $pw -weight 0] set nw [PanedWinAdd $pw -weight 1] variable tabs set tabs $nw roster::create .roster -width $rosterwidth -height 300 \ -popup [namespace current]::roster::popup_menu \ -grouppopup [namespace current]::roster::group_popup_menu \ -singleclick [namespace current]::roster::user_singleclick \ -doubleclick [namespace current]::roster::jid_doubleclick \ -draginitcmd [namespace current]::roster::draginitcmd \ -dropcmd [namespace current]::roster::dropcmd grid .roster -row 0 -column 0 -sticky nswe -in $rw grid columnconfigure $rw 0 -weight 1 grid rowconfigure $rw 0 -weight 1 grid columnconfigure $nw 1 -weight 1 grid rowconfigure $nw 1 -weight 1 ButtonBar .nb -orient horizontal \ -pady 0.25m \ -padx 1m \ -pages .pages configure_tabs Frame $nw.fr -relief raised -borderwidth 0.25m grid $nw.fr -row 1 -column 1 -sticky nsew grid columnconfigure $nw.fr 0 -weight 1 grid rowconfigure $nw.fr 0 -weight 1 PagesManager .pages -width 400 grid .pages -row 0 -column 0 -padx 2m -pady 2m -in $nw.fr -sticky nsew $pw configure -width $rosterwidth event add <> bind . <> [list [namespace current]::collapse_roster] bind . [list [namespace current]::tab_move .nb -1] bind . [list [namespace current]::tab_move .nb 1] bind . \ [list [namespace current]::current_tab_move .nb -1] bind . \ [list [namespace current]::current_tab_move .nb -1] bind . \ [list [namespace current]::current_tab_move .nb 1] bind . \ [list [namespace current]::current_tab_move .nb 1] bind . { if {[.nb raise] != ""} { eval destroy [pack slaves [.nb getframe [.nb raise]]] .nb delete [.nb raise] 1 ifacetk::tab_move .nb 0 } } for {set i 1} {$i < 10} {incr i} { bind . \ [list [namespace current]::tab_raise_by_number .nb $i] bind . \ [list [namespace current]::tab_raise_by_number .nb $i] } bind . \ [list [namespace current]::tab_raise_by_number .nb 10] bind . \ [list [namespace current]::tab_raise_by_number .nb 10] set m [menu .tabsmenu -tearoff 0] $m add command -label [::msgcat::mc "Close"] -accelerator $::tk_close \ -command { if {[.nb raise] != ""} { eval destroy [pack slaves [.nb getframe $curmenutab]] .nb delete $curmenutab 1 ifacetk::tab_move .nb 0 } } $m add separator $m add command -label [::msgcat::mc "Close other tabs"] \ -command { foreach tab [.nb pages] { if {$tab != $curmenutab} { eval destroy [pack slaves [.nb getframe $tab]] .nb delete $tab 1 } } ifacetk::tab_move .nb 0 } $m add command -label [::msgcat::mc "Close all tabs"] \ -command { foreach tab [.nb pages] { eval destroy [pack slaves [.nb getframe $tab]] .nb delete $tab 1 } } .nb bindtabs <> [list [namespace current]::tab_menu %X %Y] .nb bindtabs <> [list [namespace current]::destroy_tab] .nb bindtabs <> [list [namespace current]::tab_move .nb -1] .nb bindtabs <> [list [namespace current]::tab_move .nb 1] set geometry [option get . geometry [winfo class .]] if {$geometry == ""} { set geometry 788x550 } } else { roster::create .roster -width $rosterwidth -height 300 \ -popup [namespace current]::roster::popup_menu \ -grouppopup [namespace current]::roster::group_popup_menu \ -singleclick [namespace current]::roster::user_singleclick \ -doubleclick [namespace current]::roster::jid_doubleclick \ -draginitcmd [namespace current]::roster::draginitcmd \ -dropcmd [namespace current]::roster::dropcmd grid .roster -row 1 -column 1 -sticky nswe -in [$mf getframe] set geometry [option get . geometry [winfo class .]] if {$geometry == ""} { set geometry 200x350 } } bind . [list [namespace current]::map_dot %W] wm geometry . $geometry define_alert_colors update idletasks } proc ifacetk::map_dot {w} { if {$w != "."} return hook::run map_window_hook $w } proc ifacetk::destroy_tab {page} { if {[.nb raise] != ""} { eval destroy [pack slaves [.nb getframe $page]] .nb delete $page 1 ifacetk::tab_move .nb 0 } } proc ifacetk::destroy_win {path} { global usetabbar if {$usetabbar} { if {[winfo exists $path]} { set page [ifacetk::nbpage $path] eval destroy [pack slaves [.nb getframe $page]] .nb delete $page 1 ifacetk::tab_move .nb 0 } } else { destroy $path } } hook::add finload_hook [namespace current]::ifacetk::create_main_window 1 proc ifacetk::allow_presence_change {xlib} { .presence.button configure -state normal set m [.mainframe getmenu tkabber] $m entryconfigure [$m index [::msgcat::mc "Presence"]] -state normal } proc ifacetk::disallow_presence_change {xlib} { if {[llength [connections]] == 0} { .presence.button configure -state disabled set m [.mainframe getmenu tkabber] $m entryconfigure [$m index [::msgcat::mc "Presence"]] -state disabled } } hook::add connected_hook [namespace current]::ifacetk::allow_presence_change hook::add disconnected_hook \ [namespace current]::ifacetk::disallow_presence_change proc ifacetk::on_open_chat_window {chatid type} { variable number_msg variable personal_msg set number_msg($chatid) 0 set personal_msg($chatid) 0 } proc ifacetk::on_close_chat_window {chatid} { variable number_msg variable personal_msg unset number_msg($chatid) unset personal_msg($chatid) update_main_window_title } hook::add open_chat_pre_hook [namespace current]::ifacetk::on_open_chat_window hook::add close_chat_post_hook \ [namespace current]::ifacetk::on_close_chat_window proc ifacetk::nbpage {path} { return [string range [win_id tab $path] 1 end] } proc ifacetk::nbpath {page} { return [lindex [pack slaves [.nb getframe $page]] 0] } proc ifacetk::update_chat_title {chatid} { global usetabbar variable options variable number_msg variable personal_msg set cw [chat::winid $chatid] if {$usetabbar} { set tabtitle $::chat::chats(tabtitlename,$chatid) if {$options(message_numbers_in_tabs) && ($number_msg($chatid) > 0)} { append tabtitle " ($number_msg($chatid))" } .nb itemconfigure [nbpage $cw] -text $tabtitle } else { if {$personal_msg($chatid) > 0} { set star "*" } else { set star "" } if {$options(only_personal_messages_in_window_title)} { set messages $personal_msg($chatid) } else { set messages $number_msg($chatid) } if {$messages > 0} { set title "($messages$star) $::chat::chats(titlename,$chatid)" } else { set title $::chat::chats(titlename,$chatid) } set_window_title_after_idle $cw $title } } proc ifacetk::update_chat_titles {} { foreach chatid [chat::opened] { lassign [chat::window_titles $chatid] \ ::chat::chats(tabtitlename,$chatid) \ ::chat::chats(titlename,$chatid) ifacetk::update_chat_title $chatid } } proc ifacetk::update_main_window_title {} { global usetabbar variable options variable main_window_title variable number_msg variable personal_msg if {!$usetabbar} return set star "" set messages 0 if {$options(only_personal_messages_in_window_title)} { set star "*" foreach chatid [chat::opened] { incr messages $personal_msg($chatid) } } else { foreach chatid [chat::opened] { incr messages $number_msg($chatid) if {$personal_msg($chatid) > 0} { set star "*" } } } if {$messages} { set title "($messages$star) $main_window_title" } else { set title $main_window_title } set_window_title_after_idle . $title } proc ifacetk::set_window_title_after_idle {w title} { variable title_after_id variable title_after_value set title_after_value($w) $title if {![info exists title_after_id($w)]} { set title_after_id($w) \ [after idle [namespace code [list set_window_title $w]]] } } proc ifacetk::set_window_title {w} { variable title_after_id variable title_after_value if {![winfo exists $w]} return wm title $w $title_after_value($w) wm iconname $w $title_after_value($w) unset title_after_id($w) unset title_after_value($w) } proc ifacetk::chat_window_is_active {chatid} { global usetabbar set cw [chat::winid $chatid] set w [winfo toplevel $cw] set f [focus] if {($f != "") && ($w == [winfo toplevel $f]) && \ (!$usetabbar || ([.nb raise] == [nbpage $cw]))} { return 1 } else { return 0 } } proc ifacetk::add_number_of_messages_to_title {chatid from type body extras} { global usetabbar variable number_msg variable personal_msg set xlib [chat::get_xlib $chatid] if {![catch {::plugins::mucignore::is_ignored $xlib $from $type} ignore] && $ignore != ""} { return } foreach xelem $extras { ::xmpp::xml::split $xelem tag xmlns attrs cdata subels # Don't add number to title if this 'empty' tag is present. It # indicates messages history in chat window. if {$tag eq "" && $xmlns eq "tkabber:x:nolog"} { return } } if {[chat_window_is_active $chatid]} return if {$from == ""} return if {$type == "chat"} { incr number_msg($chatid) incr personal_msg($chatid) } elseif {$type == "groupchat"} { set jid [chat::get_jid $chatid] set myjid [chat::our_jid $chatid] set mynick [chat::get_nick $xlib $myjid $type] if {![string equal $jid $from] && ![string equal $myjid $from]} { incr number_msg($chatid) } if {![string equal $jid $from] && ![string equal $myjid $from] && \ [check_message $mynick $body]} { incr personal_msg($chatid) } } update_chat_title $chatid update_main_window_title } hook::add draw_message_hook \ [namespace current]::ifacetk::add_number_of_messages_to_title 18 proc ifacetk::set_main_window_title_on_connect {xlib} { variable main_window_title set main_window_title "[connection_jid $xlib] - Tkabber" set_window_title_after_idle . $main_window_title } proc ifacetk::set_main_window_title_on_disconnect {xlib} { variable main_window_title if {[llength [connections]] == 0} { set main_window_title "Tkabber" } else { set main_window_title \ "[connection_jid [lindex [connections] end]] - Tkabber" } set_window_title_after_idle . $main_window_title } hook::add connected_hook \ [namespace current]::ifacetk::set_main_window_title_on_connect hook::add disconnected_hook \ [namespace current]::ifacetk::set_main_window_title_on_disconnect proc ifacetk::raise_win {path} { global usetabbar if {[winfo exists $path]} { if {$usetabbar} { .nb raise [nbpage $path] } } } proc ifacetk::add_win {path args} { global usetabbar variable options set title "" set tabtitle "" set class "" set raisecmd "" set type "" set raise 0 foreach {attr val} $args { switch -- $attr { -title {set title $val} -tabtitle {set tabtitle $val} -class {set class $val} -raisecmd {set raisecmd $val} -raise {set raise $val} -type {set type $val} default {error "Unknown option $attr"} } } if {$usetabbar} { set page [nbpage $path] set f [.nb insert end $page \ -text $tabtitle \ -raisecmd [list [namespace current]::tab_raise \ $path $raisecmd]] Frame $path -class $class pack $path -expand yes -fill both -in $f #tkwait visibility $path set ::tabcolors($page) "" if {$raise || $options(raise_new_tab) || [llength [.nb pages]] == 1} { after idle [list catch [list .nb raise $page]] } } else { toplevel $path -class $class -relief flat -borderwidth 2m wm group $path . wm title $path $title wm iconname $path $title set geometry [option get $path ${type}geometry $class] if {$geometry != ""} { wm geometry $path $geometry } } } bind . [list [namespace current]::ifacetk::get_focus %W] bind . [list [namespace current]::ifacetk::loose_focus %W] bind Chat [list [namespace current]::ifacetk::get_focus %W] bind Chat [list [namespace current]::ifacetk::loose_focus %W] proc ifacetk::tab_raise {path command} { tab_set_updated $path if {$command != ""} { eval $command } } proc ifacetk::get_focus {path} { if {![winfo exists $path]} return hook::run got_focus_hook $path } proc ifacetk::on_focus_got {path} { variable options variable after_focused_id if {$after_focused_id != ""} { after cancel $after_focused_id } set after_focused_id \ [after $options(update_title_delay) \ [list [namespace current]::set_title $path]] } hook::add got_focus_hook [namespace current]::ifacetk::on_focus_got proc ifacetk::set_title {path} { global usetabbar variable number_msg variable personal_msg if {![winfo exists $path]} return if {$usetabbar} { if {[set p [.nb raise]] != ""} { tab_set_updated $p } update_main_window_title } else { if {[info exists ::chat::chat_id($path)]} { set chatid $::chat::chat_id($path) set number_msg($chatid) 0 set personal_msg($chatid) 0 update_chat_title $chatid } } } proc ifacetk::loose_focus {path} { if {![winfo exists $path]} return hook::run lost_focus_hook $path } proc ifacetk::on_focus_lost {path} { variable after_focused_id if {$after_focused_id != ""} { after cancel $after_focused_id set after_focused_id "" } balloon::destroy } hook::add lost_focus_hook [namespace current]::ifacetk::on_focus_lost proc ifacetk::tab_move {nb shift args} { set len [llength [$nb pages]] if {$len > 0} { set newidx [expr [$nb index [$nb raise]] + $shift] if {$newidx < 0} { set newidx [expr $len - 1] } elseif {$newidx >= $len} { set newidx 0 } $nb see [lindex [$nb pages] $newidx] $nb raise [lindex [$nb pages] $newidx] } } proc ifacetk::current_tab_move {nb shift} { set len [llength [$nb pages]] if {$len > 0} { set newidx [expr [$nb index [$nb raise]] + $shift] if {$newidx < 0} { set newidx [expr $len - 1] } elseif {$newidx >= $len} { set newidx 0 } $nb move [$nb raise] $newidx $nb see [$nb raise] } } proc ifacetk::tab_raise_by_number {nb num} { set pages [$nb pages] incr num -1 set page [lindex $pages $num] if {$page != ""} { $nb raise $page } } proc ifacetk::define_alert_colors {} { global usetabbar global alert_colors if {$usetabbar} { # Colors of tab labels (when in tabbed mode) if {$::darktheme} { # Usual color option add *alertColor0 $::defaultforeground widgetDefault # Color when server message is arrived option add *alertColor1 mediumorchid3 widgetDefault # Color when message is arrived option add *alertColor2 cornflowerblue widgetDefault # Color when personally addressed message is arrived option add *alertColor3 coral3 widgetDefault } else { # Usual color option add *alertColor0 $::defaultforeground widgetDefault # Color when server message is arrived option add *alertColor1 DarkViolet widgetDefault # Color when message is arrived option add *alertColor2 dodgerblue4 widgetDefault # Color when personally addressed message is arrived option add *alertColor3 firebrick4 widgetDefault } set alert_colors [list \ [option get .nb alertColor0 ButtonBar] \ [option get .nb alertColor1 ButtonBar] \ [option get .nb alertColor2 ButtonBar] \ [option get .nb alertColor3 ButtonBar]] } } array set ::alert_lvls {info 1 error 1 server 1 message 2 mesg_to_user 3} proc ifacetk::tab_set_updated {path {updated 0} {level ""}} { global usetabbar global tabcolors global alert_lvls alert_colors variable number_msg variable personal_msg if {!$usetabbar} return set page [nbpage $path] if {[.nb index $page] < 0} { set page $path if {[.nb index $page] < 0} return set path [nbpath $page] } set st [wm state .] if {(![string equal $st normal] && ![string equal $st zoomed]) || \ ([string equal [focus -displayof .] ""])} { set backgroundP 1 } else { set backgroundP 0 } if {(!$updated) && $backgroundP} { return } if {$updated && \ (($page != [.nb raise]) && \ [info exists alert_lvls($level)] || \ $backgroundP)} { set lvlnum $alert_lvls($level) } else { set lvlnum 0 } if {!$updated || $tabcolors($page) < $lvlnum} { set color [lindex $alert_colors $lvlnum] .nb itemconfigure $page -foreground $color -activeforeground $color set tabcolors($page) $lvlnum hook::run tab_set_updated $path $updated $level } if {[info exists ::chat::chat_id($path)]} { if {!$updated || ($lvlnum == 0)} { set chatid $::chat::chat_id($path) set number_msg($chatid) 0 set personal_msg($chatid) 0 update_chat_title $chatid update_main_window_title } } } proc ifacetk::tab_menu {x y page} { global curmenutab set curmenutab $page tk_popup .tabsmenu $x $y } ############################################################################### proc ifacetk::collapse_roster {} { variable mf variable rosterwidth variable sashpos set pw [$mf getframe].pw set r [winfo width $pw.frame0] set s [PanedWinSashXPos $pw 0] if {$r == 1 || $r > $s} { PanedWinSashXPos $pw 0 $sashpos } else { set rosterwidth $r set sashpos [PanedWinSashXPos $pw 0] PanedWinSashXPos $pw 0 0 } } ############################################################################### proc ifacetk::switch_toolbar {args} { variable options variable mf $mf showtoolbar 0 $options(show_toolbar) } proc ifacetk::switch_presencebar {args} { global usetabbar variable options variable mf if {[winfo exists .presence]} { if {$options(show_presencebar)} { catch { grid .presence -row 3 -column 1 \ -sticky nswe -in [.mainframe getframe] .presence.status configure -takefocus 1 } } else { grid forget .presence .presence.status configure -takefocus 0 if {[focus] == ".presence.status"} { focus [Widget::focusPrev .presence.status] } } } } proc ifacetk::switch_statusbar {args} { variable options variable mf catch { if {$options(show_statusbar)} { pack $mf.botf -side bottom -fill x -before [$mf getframe] } else { pack forget $mf.botf } } } proc ifacetk::deiconify {} { wm deiconify . } hook::add finload_hook [namespace current]::ifacetk::deiconify 100 proc ifacetk::save_availability_status {w args} { variable status_history variable options set avstatus [$w get] if {$avstatus == ""} return if {[catch {$w getvalue} ix]} { set ix [$w current] } if {$ix >= 0} { set status_history \ [linsert [lreplace $status_history $ix $ix] end $avstatus] } elseif {[llength $status_history] < $options(max_status_history)} { lappend status_history $avstatus } else { set status_history \ [linsert [lrange $status_history 1 end] end $avstatus] } $w configure -values $status_history } proc ifacetk::show_status_context_menu w { set m $w.menu if {![winfo exists $m]} { menu $m -tearoff 0 $m add command \ -label [::msgcat::mc "Clear history"] \ -command [list [namespace current]::clear_status_history $w] } tk_popup $m [winfo pointerx $w] [winfo pointery $w] } proc ifacetk::clear_status_history w { variable status_history set status_history [list] $w configure -values $status_history } # This proc should be called by WM_SAVE_YOURSELF protocol callback. # On Windows (and Tk >= 8.4.13) this means WM_QUERYENDSESSION (so we should # quit), on Unix, an X session manager may call this repeatedly. proc session_checkpoint {} { global tcl_platform ::hook::run save_yourself_hook if {$tcl_platform(platform) == "windows"} quit } # Trap SIGTERM to quit gracefully on Unix when Tclx is available: if {$tcl_platform(platform) == "unix" && ![catch {package require Tclx}]} { signal trap SIGTERM quit } # Import add_win tab_set_updated to the root namespace: namespace import ::ifacetk::raise_win ::ifacetk::add_win \ ::ifacetk::destroy_win ::ifacetk::tab_set_updated # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/ifacetk/login.tcl000064400000000000000000000430631477701321300153010ustar00nobodynobody# login.tcl -- # # This file is a part of the Tkabber XMPP client. It implements the # login user dialog. proc enable_disable_field {field state} { if {[winfo exists $field]} { $field configure -state $state if {[focus] eq $field && $state eq "disabled"} { focus [Widget::focusPrev $field] } } } proc update_login_entries {l {i 0}} { global ltmp have_bosh have_http_poll if {$i} { array set ltmp [array get ::loginconf$i] array set loginconf [array get ltmp] } foreach ent {username server port password resource priority \ altserver proxyhost proxyport proxyusername proxypassword \ sslcertfile boshurl pollurl} { if {[winfo exists $l.$ent]} { catch { $l.$ent icursor end } } } set checks {} if {$have_bosh} { enable_disable_field $l.usebosh normal if {$ltmp(usebosh)} { enable_disable_field $l.usehttppoll disabled set checks {usebosh {lboshurl boshurl useboshkeys} {lpollurl pollurl usepollkeys dontusessl usecompress legacyssl encrypted sslcertfile lsslcertfile bsslcertfile}} } else { if {$have_http_poll} { enable_disable_field $l.usehttppoll normal if {$ltmp(usehttppoll)} { enable_disable_field $l.usebosh disabled } enable_disable_field $l.lboshurl disabled enable_disable_field $l.boshurl disabled enable_disable_field $l.useboshkeys disabled set checks {usehttppoll {lpollurl pollurl usepollkeys} {usebosh dontusessl usecompress legacyssl encrypted sslcertfile lsslcertfile bsslcertfile}} } else { set checks {usebosh {lboshurl boshurl useboshkeys} {dontusessl usecompress legacyssl encrypted sslcertfile lsslcertfile bsslcertfile}} } } } elseif {$have_http_poll} { enable_disable_field $l.usehttppoll normal set checks {usehttppoll {lpollurl pollurl usepollkeys} {dontusessl usecompress legacyssl encrypted sslcertfile lsslcertfile bsslcertfile}} } foreach {check enable disable} [concat $checks \ {usealtserver {altserver laltserver port lport} {}}] { if {![info exists ltmp($check)] || ![winfo exists $l.$check]} { continue } if {$ltmp($check) && [$l.$check cget -state] ne "disabled"} { set state1 normal set state2 disabled } else { set state1 disabled set state2 normal } foreach ent $enable { enable_disable_field $l.$ent $state1 } foreach ent $disable { enable_disable_field $l.$ent $state2 } } catch { if {[string equal $ltmp(proxy) none]} { foreach ent {proxyhost proxyport proxyusername proxypassword \ lproxyhost lproxyport lproxyusername lproxypassword} { $l.$ent configure -state disabled if {[string equal [focus] $l.$ent]} { focus [Widget::focusPrev $l.$ent] } } } else { foreach ent {proxyhost proxyport proxyusername proxypassword \ lproxyhost lproxyport lproxyusername lproxypassword} { $l.$ent configure -state normal } } } catch { if {![string equal [$l.dontusessl cget -state] disabled] && \ ($ltmp(stream_options) == "ssl" || \ $ltmp(stream_options) == "encrypted")} { $l.sslcertfile configure -state normal $l.lsslcertfile configure -state normal $l.bsslcertfile configure -state normal } else { $l.sslcertfile configure -state disabled $l.lsslcertfile configure -state disabled $l.bsslcertfile configure -state disabled if {[string equal [focus] $l.sslcertfile] || \ [string equal [focus] $l.bsslcertfile]} { focus [Widget::focusPrev $l.sslcertfile] } } } } proc login_dialog {} { global loginconf global ltmp global use_tls have_compress have_sasl have_bosh have_http_poll have_proxy if {[winfo exists .login]} { focus -force .login return } array set ltmp [array get loginconf] Dialog .login -title [::msgcat::mc "Login"] \ -anchor e \ -default 0 \ -cancel 1 wm resizable .login 0 0 set l [.login getframe] catch {$l configure -padding {0.25m 0.25m}} catch {$l configure -padx 0.25m -pady 0.25m} set n 1 while {[info exists ::loginconf$n]} {incr n} incr n -1 if {$n} { Menubutton $l.profiles -text [::msgcat::mc "Profiles"] \ -menu $l.profiles.menu set m [menu $l.profiles.menu -tearoff 0] for {set i 1} {$i <= $n} {incr i} { if {[info exists ::loginconf${i}(profile)]} { set lab [set ::loginconf${i}(profile)] } else { set lab "[::msgcat::mc Profile] $i" } if {$i <= 10} { set j [expr {$i % 10}] $m add command -label $lab -accelerator "$::tk_modify-$j" \ -command [list [namespace current]::update_login_entries \ $l $i] bind .login \ [list [namespace current]::update_login_entries \ [double% $l] $i] } else { $m add command -label $lab \ -command [list [namespace current]::update_login_entries \ $l $i] } } grid $l.profiles -row 0 -column 0 -sticky e } set nb [Notebook $l.nb] set account_page \ [$nb insert end account_page -text [::msgcat::mc "Account"]] Label $l.lusername -text [::msgcat::mc "Username:"] Entry $l.username -textvariable ltmp(user) Label $l.lserver -text [::msgcat::mc "Server:"] Entry $l.server -textvariable ltmp(server) Label $l.lpassword -text [::msgcat::mc "Password:"] Entry $l.password -show * -textvariable ltmp(password) Label $l.lresource -text [::msgcat::mc "Resource:"] Entry $l.resource -textvariable ltmp(resource) Label $l.lpriority -text [::msgcat::mc "Priority:"] Spinbox $l.priority -1000 1000 1 ltmp(priority) grid $l.lusername -row 0 -column 0 -sticky e -in $account_page grid $l.username -row 0 -column 1 -sticky ew -in $account_page grid $l.lserver -row 0 -column 2 -sticky e -in $account_page grid $l.server -row 0 -column 3 -sticky ew -in $account_page grid $l.lpassword -row 1 -column 0 -sticky e -in $account_page grid $l.password -row 1 -column 1 -sticky ew -in $account_page grid $l.lresource -row 2 -column 0 -sticky e -in $account_page grid $l.resource -row 2 -column 1 -sticky ew -in $account_page grid $l.lpriority -row 2 -column 2 -sticky e -in $account_page grid $l.priority -row 2 -column 3 -sticky ew -in $account_page grid columnconfigure $account_page 1 -weight 3 grid columnconfigure $account_page 2 -weight 1 grid columnconfigure $account_page 3 -weight 3 set connection_page \ [$nb insert end connection_page -text [::msgcat::mc "Connection"]] Checkbutton $l.usealtserver \ -text [::msgcat::mc "Explicitly specify host and port to connect"] \ -variable ltmp(usealtserver) \ -command [list [namespace current]::update_login_entries $l] Label $l.laltserver -text [::msgcat::mc "Host:"] Entry $l.altserver -textvariable ltmp(altserver) Label $l.lport -text [::msgcat::mc "Port:"] Spinbox $l.port 0 65535 1 ltmp(altport) grid $l.usealtserver -row 0 -column 0 -sticky w -columnspan 4 \ -in $connection_page grid $l.laltserver -row 1 -column 0 -sticky e -in $connection_page grid $l.altserver -row 1 -column 1 -sticky ew -in $connection_page grid $l.lport -row 1 -column 2 -sticky e -in $connection_page grid $l.port -row 1 -column 3 -sticky we -in $connection_page Checkbutton $l.replace -text [::msgcat::mc "Replace opened connections"] \ -variable ltmp(replace_opened) grid $l.replace -row 3 -column 0 -sticky w -columnspan 2 \ -in $connection_page Checkbutton $l.sm -text [::msgcat::mc "Use stream management"] \ -variable ltmp(stream_management) grid $l.sm -row 3 -column 2 -sticky e -columnspan 2 -in $connection_page grid columnconfigure $connection_page 1 -weight 6 grid columnconfigure $connection_page 2 -weight 1 set auth_page \ [$nb insert end auth_page -text [::msgcat::mc "Authentication"]] Checkbutton $l.allowauthplain \ -text [::msgcat::mc "Allow plaintext authentication mechanisms"] \ -variable ltmp(allowauthplain) \ -command [list [namespace current]::update_login_entries $l] grid $l.allowauthplain -row 0 -column 0 -sticky w -in $auth_page if {$have_sasl} { Checkbutton $l.usesasl \ -text [::msgcat::mc "Use SASL authentication"] \ -variable ltmp(usesasl) \ -command [list [namespace current]::update_login_entries $l] grid $l.usesasl -row 1 -column 0 -sticky w -in $auth_page } grid columnconfigure $auth_page 0 -weight 1 if {$use_tls || $have_compress} { if {$use_tls && $have_compress} { set page_label [::msgcat::mc "SSL & Compression"] } elseif {$have_compress} { set page_label [::msgcat::mc "Compression"] } else { set page_label [::msgcat::mc "SSL"] } set ssl_page [$nb insert end ssl_page -text $page_label] Radiobutton $l.dontusessl -text [::msgcat::mc "Plaintext"] \ -variable ltmp(stream_options) -value plaintext \ -command [list [namespace current]::update_login_entries $l] if {$have_compress} { Radiobutton $l.usecompress -text [::msgcat::mc "Compression"] \ -variable ltmp(stream_options) -value compressed \ -command [list [namespace current]::update_login_entries $l] } if {$use_tls} { Radiobutton $l.encrypted \ -text [::msgcat::mc "Encryption (STARTTLS)"] \ -variable ltmp(stream_options) -value encrypted \ -command [list [namespace current]::update_login_entries $l] Radiobutton $l.legacyssl \ -text [::msgcat::mc "Encryption (legacy SSL)"] \ -variable ltmp(stream_options) -value ssl \ -command [list [namespace current]::update_login_entries $l] Label $l.lsslcertfile -text [::msgcat::mc "SSL certificate:"] Entry $l.sslcertfile -textvariable ltmp(sslcertfile) Button $l.bsslcertfile -text [::msgcat::mc "Browse..."] \ -command [list eval set ltmp(sslcertfile) {[tk_getOpenFile]}] } set column 0 grid $l.dontusessl -row 0 -column $column -sticky w -in $ssl_page if {$have_compress} { grid $l.usecompress -row 0 -column [incr column] -sticky w \ -in $ssl_page } if {$use_tls} { grid $l.encrypted -row 0 -column [incr column] -sticky w \ -in $ssl_page grid $l.legacyssl -row 0 -column [incr column] -sticky w \ -in $ssl_page grid $l.lsslcertfile -row 1 -column 0 -sticky e -in $ssl_page grid $l.sslcertfile -row 1 -column 1 -sticky ew -columnspan 2 \ -in $ssl_page grid $l.bsslcertfile -row 1 -column 3 -sticky w -in $ssl_page } grid columnconfigure $ssl_page 1 -weight 1 grid columnconfigure $ssl_page 2 -weight 1 } if {$have_bosh} { set bosh_page [$nb insert end bosh_page -text [::msgcat::mc "BOSH"]] Checkbutton $l.usebosh -text [::msgcat::mc "Connect via BOSH"] \ -variable ltmp(usebosh) \ -command [list [namespace current]::update_login_entries $l] Label $l.lboshurl -text [::msgcat::mc "URL to use:"] Entry $l.boshurl -textvariable ltmp(boshurl) Checkbutton $l.useboshkeys \ -text [::msgcat::mc "Use client security keys"] \ -state disabled \ -variable ltmp(useboshkeys) \ -command [list [namespace current]::update_login_entries $l] grid $l.usebosh -row 0 -column 0 -sticky w -columnspan 3 -in $bosh_page grid $l.lboshurl -row 1 -column 0 -sticky e -in $bosh_page grid $l.boshurl -row 1 -column 1 -sticky ew -in $bosh_page grid $l.useboshkeys -row 2 -column 0 -sticky w -columnspan 3 \ -in $bosh_page grid columnconfigure $bosh_page 1 -weight 1 } if {$have_http_poll} { set httppoll_page \ [$nb insert end httpoll_page -text [::msgcat::mc "HTTP Poll"]] Checkbutton $l.usehttppoll \ -text [::msgcat::mc "Connect via HTTP polling"] \ -variable ltmp(usehttppoll) \ -command [list [namespace current]::update_login_entries $l] Label $l.lpollurl -text [::msgcat::mc "URL to poll:"] Entry $l.pollurl -textvariable ltmp(pollurl) Checkbutton $l.usepollkeys \ -text [::msgcat::mc "Use client security keys"] \ -state disabled \ -variable ltmp(usepollkeys) \ -command [list [namespace current]::update_login_entries $l] grid $l.usehttppoll -row 0 -column 0 -sticky w -columnspan 3 \ -in $httppoll_page grid $l.lpollurl -row 1 -column 0 -sticky e -in $httppoll_page grid $l.pollurl -row 1 -column 1 -sticky ew -in $httppoll_page grid $l.usepollkeys -row 2 -column 0 -sticky w -columnspan 3 \ -in $httppoll_page grid columnconfigure $httppoll_page 1 -weight 1 } catch {$nb compute_size} catch {$nb raise account_page} bind .login \ [list [namespace current]::tab_move [double% $nb] -1] bind .login \ [list [namespace current]::tab_move [double% $nb] 1] grid $nb -row 1 -column 0 .login add -text [::msgcat::mc "Log in"] -command { array set loginconf [array get ltmp] destroy .login if {$loginconf(replace_opened)} { logout } update login [array get loginconf] } .login add -text [::msgcat::mc "Cancel"] -command {destroy .login} update_login_entries $l if {[string equal $ltmp(user) ""]} { .login draw $l.username } elseif {[string equal $ltmp(password) ""]} { .login draw $l.password } else { .login draw $l.resource } } hook::add finload_hook { if {(![info exist ::autologin]) || ($::autologin == 0)} { ifacetk::login_dialog } elseif {$::autologin > 0} { logout update login [array get ::loginconf] } } 9999 proc logout_dialog {} { global logout_conn set w .logout if {[winfo exists $w]} { destroy $w } switch -- [llength [connections]] { 0 - 1 { logout return } } set lnames {} foreach xlib [connections] { lappend lnames $xlib [connection_jid $xlib] } if {[CbDialog $w [::msgcat::mc "Logout"] \ [list [::msgcat::mc "Log out"] [list $w enddialog 0] \ [::msgcat::mc "Cancel"] [list $w enddialog 1]] \ logout_conn $lnames {} -modal local] != 0} { return } foreach xlib [array names logout_conn] { if {$xlib in [connections] && $logout_conn($xlib)} { logout $xlib } } } # TODO proc change_password_dialog {} { global oldpassword newpassword password set oldpassword "" set newpassword "" set password "" if {[winfo exists .passwordchange]} { destroy .passwordchange } Dialog .passwordchange -title [::msgcat::mc "Change password"] \ -anchor e \ -default 0 \ -cancel 1 .passwordchange add -text [::msgcat::mc "OK"] -command { destroy .passwordchange send_change_password } .passwordchange add -text [::msgcat::mc "Cancel"] \ -command [list destroy .passwordchange] set p [.passwordchange getframe] Label $p.loldpass -text [::msgcat::mc "Old password:"] Entry $p.oldpass -show * -textvariable oldpassword Label $p.lnewpass -text [::msgcat::mc "New password:"] Entry $p.newpass -show * -textvariable newpassword Label $p.lpassword -text [::msgcat::mc "Repeat new password:"] Entry $p.password -show * -textvariable password grid $p.loldpass -row 0 -column 0 -sticky e grid $p.oldpass -row 0 -column 1 -sticky ew grid $p.lnewpass -row 1 -column 0 -sticky e grid $p.newpass -row 1 -column 1 -sticky ew grid $p.lpassword -row 2 -column 0 -sticky e grid $p.password -row 2 -column 1 -sticky ew focus $p.oldpass .passwordchange draw } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/ifacetk/muc.tcl000064400000000000000000000701441477701321300147550ustar00nobodynobody# muc.tcl -- # # This file is a part of the Tkabber XMPP client. It implements an # interface part of Multi-User Conferences (dialogs, menus). namespace eval muc { variable winid 0 # MUC affiliations and roles: variable e2l variable l2e array set e2l [list owner [::msgcat::mc "owner"] \ admin [::msgcat::mc "admin"] \ member [::msgcat::mc "member"] \ outcast [::msgcat::mc "outcast"] \ none [::msgcat::mc "none"] \ moderator [::msgcat::mc "moderator"] \ participant [::msgcat::mc "participant"] \ visitor [::msgcat::mc "visitor"]] variable maxl 0 variable n variable l foreach n [array names e2l] { set l2e($e2l($n)) $n set l [string length $e2l($n)] if {$l + 2 > $maxl} { set maxl [expr {$l + 2}] } } namespace export join_group_dialog add_muc_menu_items } namespace eval :: { custom::defvar gr_nick_list {} \ [::msgcat::mc "Join group dialog data (nicks)."] -group Hidden custom::defvar gr_group_list {} \ [::msgcat::mc "Join group dialog data (groups)."] -group Hidden custom::defvar gr_server_list {} \ [::msgcat::mc "Join group dialog data (servers)."] -group Hidden } ############################################################################### proc muc::join_group_dialog {xlib args} { global gr_nick_list gr_group_list gr_server_list if {[llength [connections]] == 0} return if {[llength $gr_group_list] > 0} { set gr_group [lindex $gr_group_list 0] } else { set gr_group jabber } if {[llength $gr_server_list] > 0} { set gr_server [lindex $gr_server_list 0] } else { set gr_server conference.jabber.org } if {[string equal $xlib ""]} { set xlib [lindex [connections] 0] } set gr_xlib [connection_jid $xlib] set gr_nick [get_group_nick $xlib [::xmpp::jid::jid $gr_group $gr_server]] set gr_passwd "" foreach {opt val} $args { switch -- $opt { -server {set gr_server $val} -group {set gr_group $val} -nick {set gr_nick $val} -password {set gr_passwd $val} } } set gw .joingroup catch { destroy $gw } Dialog $gw -title [::msgcat::mc "Join group"] \ -anchor e \ -default 0 \ -cancel 1 \ -modal none set gf [$gw getframe] grid columnconfigure $gf 1 -weight 1 Label $gf.lgroup -text [::msgcat::mc "Group:"] Combobox $gf.group -values $gr_group_list $gf.group set $gr_group Label $gf.lserver -text [::msgcat::mc "Server:"] Combobox $gf.server -values $gr_server_list $gf.server set $gr_server Label $gf.lnick -text [::msgcat::mc "Nick:"] Combobox $gf.nick -values $gr_nick_list $gf.nick set $gr_nick Label $gf.lpasswd -text [::msgcat::mc "Password:"] Entry $gf.passwd -text $gr_passwd -width 30 -show * grid $gf.lgroup -row 0 -column 0 -sticky e grid $gf.group -row 0 -column 1 -sticky ew grid $gf.lserver -row 1 -column 0 -sticky e grid $gf.server -row 1 -column 1 -sticky ew grid $gf.lnick -row 2 -column 0 -sticky e grid $gf.nick -row 2 -column 1 -sticky ew grid $gf.lpasswd -row 3 -column 0 -sticky e grid $gf.passwd -row 3 -column 1 -sticky ew if {[llength [connections]] > 1} { foreach c [connections] { lappend connections [connection_jid $c] } Label $gf.lxlib -text [::msgcat::mc "Connection:"] Combobox $gf.xlib -values $connections $gf.xlib set $gr_xlib grid $gf.lxlib -row 4 -column 0 -sticky e grid $gf.xlib -row 4 -column 1 -sticky ew } $gw add -text [::msgcat::mc "Join"] \ -command [namespace code [list join_group_dialog_continue $gw $gf]] $gw add -text [::msgcat::mc "Cancel"] -command [list destroy $gw] $gw draw $gf.gr_group } proc muc::join_group_dialog_continue {gw gf} { global gr_nick_list gr_group_list gr_server_list set gr_group [$gf.group get] set gr_server [$gf.server get] set gr_nick [$gf.nick get] set gr_passwd [$gf.passwd get] catch {set gr_xlib [$gf.xlib get]} destroy $gw set gr_group_list [update_combo_list $gr_group_list $gr_group 20] set gr_server_list [update_combo_list $gr_server_list $gr_server 10] set gr_nick_list [update_combo_list $gr_nick_list $gr_nick 10] if {[info exists gr_xlib]} { foreach c [connections] { if {[connection_jid $c] == $gr_xlib} { set xlib $c } } } if {![info exists xlib]} { set xlib [lindex [connections] 0] } muc::join_group_raise $xlib \ [::xmpp::jid::jid $gr_group $gr_server] \ $gr_nick \ $gr_passwd } ############################################################################### proc muc::add_groupchat_user_menu_items {type m xlib jid} { set group [::xmpp::jid::stripResource $jid] if {![muc::is_compatible $group]} return set chatid [chat::chatid $xlib $group] if {![chat::is_groupchat $chatid]} { return } switch -- $type { chat { set reschatid [chat::chatid $xlib $jid] } roster { set reschatid $chatid } } set mm [menu $m.muc -tearoff 0] $mm add command -label [::msgcat::mc "Whois"] \ -command [list muc::whois $xlib $jid $reschatid] $mm add command -label [::msgcat::mc "Kick"] \ -command [list muc::change_item_attr \ $xlib $jid role none down "" $reschatid] $mm add command -label [::msgcat::mc "Ban"] \ -command [list muc::change_item_attr \ $xlib $jid affiliation outcast down "" $reschatid] $mm add command -label [::msgcat::mc "Grant Voice"] \ -command [list muc::change_item_attr \ $xlib $jid role participant up "" $reschatid] $mm add command -label [::msgcat::mc "Revoke Voice"] \ -command [list muc::change_item_attr \ $xlib $jid role visitor down "" $reschatid] $mm add command -label [::msgcat::mc "Grant Membership"] \ -command [list muc::change_item_attr \ $xlib $jid affiliation member up "" $reschatid] $mm add command -label [::msgcat::mc "Revoke Membership"] \ -command [list muc::change_item_attr \ $xlib $jid affiliation none down "" $reschatid] $mm add command -label [::msgcat::mc "Grant Moderator Privileges"] \ -command [list muc::change_item_attr \ $xlib $jid role moderator up "" $reschatid] $mm add command -label [::msgcat::mc "Revoke Moderator Privileges"] \ -command [list muc::change_item_attr \ $xlib $jid role participant down "" $reschatid] $mm add command -label [::msgcat::mc "Grant Admin Privileges"] \ -command [list muc::change_item_attr \ $xlib $jid affiliation admin up "" $reschatid] $mm add command -label [::msgcat::mc "Revoke Admin Privileges"] \ -command [list muc::change_item_attr \ $xlib $jid affiliation member down "" $reschatid] #$mm add command -label [::msgcat::mc "Grant Owner Privileges"] \ # -command [list muc::change_item_attr \ # $xlib $jid affiliation owner up "" $reschatid] #$mm add command -label [::msgcat::mc "Revoke Owner Privileges"] \ # -command [list muc::change_item_attr \ # $xlib $jid affiliation admin down "" $reschatid] $m add cascade -label [::msgcat::mc "MUC"] -menu $mm } hook::add chat_create_user_menu_hook \ [list [namespace current]::muc::add_groupchat_user_menu_items \ chat] 43 hook::add roster_create_groupchat_user_menu_hook \ [list [namespace current]::muc::add_groupchat_user_menu_items \ roster] 39 ############################################################################### proc muc::add_muc_menu_items {m xlib group {state disabled}} { if {[muc::is_compatible $group]} { set state normal } set chatid [chat::chatid $xlib $group] set mm [menu $m.muc -tearoff 0] $mm add command -label [::msgcat::mc "Configure room"] \ -command [list muc::request_config $chatid] $mm add command -label [::msgcat::mc "Edit voice list"] \ -command [namespace code [list request_roles_list participant $chatid]] $mm add command -label [::msgcat::mc "Edit ban list"] \ -command [namespace code [list request_affiliations_list \ outcast $chatid]] $mm add command -label [::msgcat::mc "Edit member list"] \ -command [namespace code [list request_affiliations_list \ member $chatid]] $mm add command -label [::msgcat::mc "Edit moderator list"] \ -command [namespace code [list request_roles_list moderator $chatid]] $mm add command -label [::msgcat::mc "Edit admin list"] \ -command [namespace code [list request_affiliations_list \ admin $chatid]] $mm add command -label [::msgcat::mc "Edit owner list"] \ -command [namespace code [list request_affiliations_list \ owner $chatid]] $mm add separator $mm add command -label [::msgcat::mc "Destroy room"] \ -command [namespace code [list request_destruction_dialog \ $chatid "" ""]] $m add cascade -label [::msgcat::mc "MUC"] -menu $mm -state $state } hook::add chat_create_conference_menu_hook \ [namespace current]::muc::add_muc_menu_items 37 proc muc::add_edit_info_menu_item {m xlib group} { $m add command -label [::msgcat::mc "Edit room info..."] \ -command [list ::userinfo::open $xlib $group -editable 1] } hook::add chat_create_conference_menu_hook \ [namespace current]::muc::add_edit_info_menu_item 37 proc muc::disco_node_menu_setup {m bw tnode data parentdata} { lassign $data type xlib jid node switch -- $type { item - item2 { set identities [disco::browser::get_identities $bw $tnode] if {[llength $identities] == 0} { set identities \ [disco::browser::get_parent_identities $bw $tnode] } set features [disco::browser::get_features $bw $tnode] if {[llength $features] == 0} { set features [disco::browser::get_parent_features $bw $tnode] } # JID with resource is not a room JID if {[::xmpp::jid::removeResource $jid] != $jid} return # A room must have non-empty node if {[::xmpp::jid::node $jid] == ""} return foreach id $identities { if {[get_prop $id category] == "conference"} { if {"http://jabber.org/protocol/muc" in $features} { add_muc_menu_items $m $xlib $jid normal break } } } } } } hook::add disco_node_menu_hook \ [namespace current]::muc::disco_node_menu_setup 60 ############################################################################### proc muc::request_destruction_dialog {chatid alt reason} { set xlib [chat::get_xlib $chatid] set group [chat::get_jid $chatid] set w .muc_request_destruction if {[info exists $w]} { destroy $w } set res [MessageDlg $w \ -aspect 50000 \ -icon warning \ -type user \ -buttons [list [::msgcat::mc "Destroy room"] cancel] \ -default 1 \ -cancel 1 \ -message [::msgcat::mc "Conference room %s will be\ destroyed permanently.\n\nProceed?" \ $group]] if {!$res} { set args [list -command [list muc::test_error_res "destroy" $xlib \ $group $chatid]] if {![string equal $alt ""]} { lappend args -jid $alt } if {![string equal $reason ""]} { lappend args -reason $reason } eval [list ::xmpp::muc::destroy $xlib $group] $args } } ############################################################################### proc muc::request_affiliations_list {val chatid} { set xlib [chat::get_xlib $chatid] set group [chat::get_jid $chatid] ::xmpp::muc::requestAffiliations $xlib $group $val \ -command [namespace code [list receive_list affiliation \ $val $chatid]] } proc muc::request_roles_list {val chatid} { set xlib [chat::get_xlib $chatid] set group [chat::get_jid $chatid] ::xmpp::muc::requestRoles $xlib $group $val \ -command [namespace code [list receive_list role $val $chatid]] } proc muc::receive_list {attr val chatid res items} { variable e2l variable maxl set xlib [chat::get_xlib $chatid] set group [chat::get_jid $chatid] if {![string equal $res ok]} { chat::add_message $chatid $group error \ "$attr $val list: [error_to_string $items]" {} return } variable winid set w .muc_list$winid incr winid if {[winfo exists $w]} { destroy $w } # [format] is intentional here. After %s substitution, it becomes # one of the following: # [::msgcat::mc "Edit owner list"] # [::msgcat::mc "Edit admin list"] # [::msgcat::mc "Edit member list"] # [::msgcat::mc "Edit outcast list"] # [::msgcat::mc "Edit moderator list"] # [::msgcat::mc "Edit participant list"] # [::msgcat::mc "Edit visitor list"] Dialog $w -title [::msgcat::mc [format "Edit %s list" $val]] \ -modal none \ -anchor e \ -default 0 \ -cancel 1 set wf [$w getframe] set sw [ScrolledWindow $wf.sw] set lb [::mclistbox::mclistbox $sw.listbox \ -exportselection 0 \ -width 90 \ -height 16] bind $lb [namespace code [list list_cleanup %W]] bind $lb <> \ [namespace code [list update_fields %W [double% $val] \ [double% $w.fr1]]] $sw setwidget $lb fill_list $lb $items $attr $val $w add -text [::msgcat::mc "Update list"] \ -command [namespace code [list send_list $chatid $attr $val $w $lb]] $w add -text [::msgcat::mc "Cancel"] -command [list destroy $w] Frame $w.fr1 pack $w.fr1 -side bottom -in $wf -fill x -pady 1m grid columnconfigure $w.fr1 3 -weight 1 Label $w.fr1.lnick -text [::msgcat::mc "Nick"] Label $w.fr1.ljid -text [::msgcat::mc "JID"] switch -- $attr { role { Label $w.fr1.lattr -text [::msgcat::mc "Role"] } affiliation { Label $w.fr1.lattr -text [::msgcat::mc "Affiliation"] } } Label $w.fr1.lreason -text [::msgcat::mc "Reason"] grid $w.fr1.lnick -row 0 -column 0 -sticky w grid $w.fr1.ljid -row 0 -column 1 -sticky w grid $w.fr1.lattr -row 0 -column 2 -sticky w grid $w.fr1.lreason -row 0 -column 3 -sticky w Entry $w.fr1.nick1 -takefocus 0 $w.fr1.nick1:cmd configure -state readonly Entry $w.fr1.jid1 -takefocus 0 $w.fr1.jid1:cmd configure -state readonly switch -- $attr { role { Combobox $w.fr1.attr1 \ -values [list $e2l(moderator) $e2l(participant) \ $e2l(visitor) $e2l(none)] \ -editable no \ -width $maxl } affiliation { Combobox $w.fr1.attr1 \ -values [list $e2l(owner) $e2l(admin) $e2l(member) \ $e2l(none) $e2l(outcast)] \ -editable no \ -width $maxl } } $w.fr1.attr1 set $e2l($val) Entry $w.fr1.reason1 Button $w.fr1.update -text [::msgcat::mc "Update item"] \ -command [namespace code [list list_update_item $lb \ $attr $w.fr1]] grid $w.fr1.nick1 -row 1 -column 0 -sticky ew grid $w.fr1.jid1 -row 1 -column 1 -sticky ew grid $w.fr1.attr1 -row 1 -column 2 -sticky ew grid $w.fr1.reason1 -row 1 -column 3 -sticky ew grid $w.fr1.update -row 1 -column 4 -sticky ew Entry $w.fr1.nick2 Entry $w.fr1.jid2 switch -- $attr { role { Combobox $w.fr1.attr2 \ -values [list $e2l(moderator) $e2l(participant) \ $e2l(visitor) $e2l(none)] \ -editable no \ -width $maxl } affiliation { Combobox $w.fr1.attr2 \ -values [list $e2l(owner) $e2l(admin) $e2l(member) \ $e2l(none) $e2l(outcast)] \ -editable no \ -width $maxl } } $w.fr1.attr2 set $e2l($val) Entry $w.fr1.reason2 Button $w.fr1.add -text [::msgcat::mc "Add new item"] \ -command [namespace code [list list_add_item $lb $val \ $w.fr1]] grid $w.fr1.nick2 -row 2 -column 0 -sticky ew grid $w.fr1.jid2 -row 2 -column 1 -sticky ew grid $w.fr1.attr2 -row 2 -column 2 -sticky ew grid $w.fr1.reason2 -row 2 -column 3 -sticky ew grid $w.fr1.add -row 2 -column 4 -sticky ew Frame $w.fr1.fr Label $w.lall -text [::msgcat::mc "All items:"] pack $w.lall -side left -in $w.fr1.fr -padx 1m -pady 1m switch -- $attr { role { Combobox $w.roleall \ -values [list $e2l(moderator) $e2l(participant) \ $e2l(visitor) $e2l(none)] \ -editable no \ -width $maxl \ -modifycmd [namespace code [list change_all_items $lb \ $w.roleall $attr]] $w.roleall set $e2l($val) pack $w.roleall -side left -anchor w -in $w.fr1.fr -pady 1m } affiliation { Combobox $w.affiliationall \ -values [list $e2l(owner) $e2l(admin) $e2l(member) \ $e2l(none) $e2l(outcast)] \ -editable no \ -width $maxl \ -modifycmd [namespace code [list change_all_items $lb \ $w.affiliationall $attr]] $w.affiliationall set $e2l($val) pack $w.affiliationall -side left -in $w.fr1.fr -pady 1m } } grid $w.fr1.fr -row 3 -column 0 -columnspan 5 -sticky w pack $sw -side top -expand yes -fill both bindscroll $sw $lb hook::run open_muc_list_post_hook $w $sw $lb $w draw } ############################################################################### proc muc::update_fields {lb val fr} { set selection [$lb curselection] if {[llength $selection] == 0} { set nick "" set jid "" set attr $val set reason "" } else { set data [$lb get [lindex $selection 0]] lassign $data n nick jid attr reason } $fr.nick1:cmd configure -state normal $fr.nick1 delete 0 end $fr.nick1 insert 0 $nick $fr.nick1:cmd configure -state readonly $fr.jid1:cmd configure -state normal $fr.jid1 delete 0 end $fr.jid1 insert 0 $jid $fr.jid1:cmd configure -state readonly $fr.attr1 set $attr $fr.reason1 delete 0 end $fr.reason1 insert 0 $reason } proc muc::list_update_item {lb attr fr} { set selection [$lb curselection] if {[llength $selection] == 0} { return } set idx [lindex $selection 0] set data [lrange [$lb get $idx] 0 0] lappend data [$fr.nick1 get] \ [$fr.jid1 get] \ [$fr.attr1 get] \ [$fr.reason1 get] incr idx $lb insert $idx $data incr idx -1 $lb delete $idx $lb sel clear 0 end $lb sel set $idx } proc muc::change_all_items {lb combobox attr} { set value [$combobox get] set yposition [lindex [$lb yview] 0] set data [$lb get 0 end] set result {} set i 0 foreach row $data { lappend result [lreplace $row 3 3 $value] } $lb delete 0 end eval $lb insert end $result $lb yview moveto $yposition } ############################################################################### proc muc::fill_list {lb items attr val} { variable listdata variable e2l variable maxl set width(0) 1 set name(0) n $lb column add n -label [::msgcat::mc "#"] set width(1) [string length [::msgcat::mc "Nick"]] set name(1) nick $lb column add nick -label [::msgcat::mc "Nick"] \ -image search/sort/noArrow \ -command [list search::Sort $lb nick] set width(2) [string length [::msgcat::mc "JID"]] set name(2) jid $lb column add jid -label [::msgcat::mc "JID"] \ -image search/sort/downArrow \ -command [list search::Sort $lb jid] switch -- $attr { role { set width(3) [string length [::msgcat::mc "Role"]] if {$width(3) < $maxl} { set width(3) $maxl } set name(3) role $lb column add role -label [::msgcat::mc "Role"] \ -image search/sort/noArrow \ -command [list search::Sort $lb role] } affiliation { set width(3) [string length [::msgcat::mc "Affiliation"]] if {$width(3) < $maxl} { set width(3) $maxl } set name(3) affiliation $lb column add affiliation -label [::msgcat::mc "Affiliation"] \ -image search/sort/noArrow \ -command [list search::Sort $lb \ affiliation] } } set width(4) [string length [::msgcat::mc "Reason"]] set name(4) reason $lb column add reason -label [::msgcat::mc "Reason"] \ -image search/sort/noArrow \ -command [list search::Sort $lb reason] $lb column add lastcol -label "" -width 0 $lb configure -fillcolumn lastcol set items2 {} foreach item $items { lassign $item nick jid attribute reason lappend items2 [list $nick $jid $e2l($attribute) $reason] } for {set i 0} {$i < 5} {incr i} { incr width($i) 3 } set listdata($lb) [lsort -dictionary -index 1 $items2] set row 1 foreach item $listdata($lb) { set itemdata {} set i 0 foreach data [linsert $item 0 $row] { set wd [string length $data] if {$wd > $width($i)} { if {$wd > 50} { set width($i) 50 } else { set width($i) $wd } } lappend itemdata $data incr i } lappend itemdata "" $lb insert end $itemdata incr row } for {set i 0} {$i < 5} {incr i} { $lb column configure $name($i) -width [expr {$width($i) + 2}] } } ############################################################################### proc muc::list_add_item {lb val fr} { variable e2l set n [lindex [$lb get end] 0] if {[string equal $n ""]} { set n 0 } set data [list [incr n] \ [$fr.nick2 get] \ [$fr.jid2 get] \ [$fr.attr2 get] \ [$fr.reason2 get]] $lb insert end $data $fr.nick2 delete 0 end $fr.jid2 delete 0 end $fr.attr2 set $e2l($val) $fr.reason2 delete 0 end } ############################################################################### proc muc::send_list {chatid attr val w lb} { variable listdata variable l2e foreach item $listdata($lb) { set tmp([lrange $item 0 1]) $item } set items {} foreach item [$lb get 0 end] { lassign $item n nick jid val reason set nick $nick set jid $jid if {$nick == "" && $jid == ""} { continue } set val $val set reason $reason if {[info exists tmp([list $nick $jid])] && $tmp([list $nick $jid]) == [list $nick $jid $val $reason]} { continue } lappend items [list $nick $jid $l2e($val) $reason] } if {$items != {}} { set xlib [chat::get_xlib $chatid] set group [chat::get_jid $chatid] set newArgs [list \ -command [list muc::test_error_res \ [::msgcat::mc "Sending %s %s list" $attr $val] \ $xlib $group $chatid]] switch -- $attr { affiliation { eval [list ::xmpp::muc::sendAffiliations $xlib $group $items] \ $newArgs } role { eval [list ::xmpp::muc::sendRoles $xlib $group $items] $newArgs } } } destroy $w } proc muc::list_cleanup {f} { variable listdata catch {unset listdata($f)} } ############################################################################### proc muc::joingroup_disco_node_menu_setup {m bw tnode data parentdata} { lassign $data type xlib jid node switch -- $type { item - item2 { set identities [::disco::browser::get_identities $bw $tnode] if {[llength $identities] == 0} { set identities \ [::disco::browser::get_parent_identities $bw $tnode] } # JID with resource is not a room JID if {[::xmpp::jid::resource $jid] != ""} return foreach id $identities { if {[string equal [get_prop $id category] conference]} { $m add command -label [::msgcat::mc "Join group..."] \ -command [namespace code \ [list join_group_dialog $xlib \ -server [::xmpp::jid::server $jid] \ -group [::xmpp::jid::node $jid]]] break } } } } } hook::add disco_node_menu_hook \ [namespace current]::muc::joingroup_disco_node_menu_setup 45 ############################################################################### proc muc::join {xlib jid args} { set category conference foreach {opt val} $args { switch -- $opt { -category { set category $val } } } if {![string equal $category conference]} return if {![string equal [::xmpp::jid::node $jid] ""]} { muc::join_group_raise $xlib $jid [get_group_nick $xlib $jid] "" } else { join_group_dialog $xlib -server [::xmpp::jid::server $jid] -group {} } } hook::add postload_hook \ [list disco::browser::register_feature_handler jabber:iq:conference \ [namespace current]::muc::join \ -desc [list conference [::msgcat::mc "Join conference"]]] hook::add postload_hook \ [list disco::browser::register_feature_handler \ http://jabber.org/protocol/muc \ [namespace current]::muc::join \ -desc [list conference [::msgcat::mc "Join conference"]]] hook::add postload_hook \ [list disco::browser::register_feature_handler "gc-1.0" \ [namespace current]::muc::join \ -desc [list conference [::msgcat::mc "Join groupchat"]]] ############################################################################### namespace eval :: { namespace import ::ifacetk::muc::join_group_dialog \ ::ifacetk::muc::add_muc_menu_items } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/ifacetk/roster.tcl000064400000000000000000002414171477701321300155120ustar00nobodynobody# roster.tcl -- # # This file is a part of the Tkabebr XMPP client. It implements roster # widgets. button .fakebutton foreach {k v} [list background $::defaultbackground \ activebackground $::defaultforeground] { if {[string equal [set b$k [.fakebutton cget -$k]] ""]} { set b$k $v } } destroy .fakebutton option add *Roster.groupindent 5.5555m widgetDefault option add *Roster.jidindent 11.1111m widgetDefault option add *Roster.jidmultindent 11.1111m widgetDefault option add *Roster.subjidindent 16.4m widgetDefault option add *Roster.groupiconindent 0.53m widgetDefault option add *Roster.subgroupiconindent 0.53m widgetDefault option add *Roster.iconindent 5.5555m widgetDefault option add *Roster.subiconindent 11.1111m widgetDefault option add *Roster.textuppad 0 widgetDefault option add *Roster.textdownpad 0 widgetDefault option add *Roster.linepad 0.53m widgetDefault # Type of subitem in roster (1 - display number of resources, # 2 - display arrow, 3 - display both, 0 - display nothing) option add *Roster.subitemtype 3 widgetDefault option add *Roster.cbackground $::defaultbackground widgetDefault option add *Roster.foreground $::defaultforeground widgetDefault option add *Roster.jidfill $::defaultbackground widgetDefault option add *Roster.jidborder $::defaultbackground widgetDefault option add *Roster.connectionfill $::defaultbackground widgetDefault option add *Roster.connectioncfill $::defaultbackground widgetDefault option add *Roster.connectionhlfill $bactivebackground widgetDefault option add *Roster.connectionborder $bbackground widgetDefault unset bbackground bactivebackground if {$::darktheme} { option add *Roster.jidhlfill #2b4b76 widgetDefault option add *Roster.metajidfill #505050 widgetDefault option add *Roster.metajidhlfill #520a60 widgetDefault option add *Roster.metajidborder #505050 widgetDefault option add *Roster.groupfill #5e5e5e widgetDefault option add *Roster.groupcfill #5e5e5e widgetDefault option add *Roster.grouphlfill #215388 widgetDefault option add *Roster.groupborder #5e5e5e widgetDefault option add *Roster.unsubscribedforeground tan widgetDefault option add *Roster.unavailableforeground grey72 widgetDefault option add *Roster.dndforeground rosybrown1 widgetDefault option add *Roster.xaforeground azure3 widgetDefault option add *Roster.awayforeground azure3 widgetDefault option add *Roster.availableforeground #ffffff widgetDefault option add *Roster.chatforeground #ffffff widgetDefault option add *Roster.stalkerforeground tan widgetDefault } else { option add *Roster.jidhlfill #d1eeee widgetDefault option add *Roster.metajidfill #e7e7e7 widgetDefault option add *Roster.metajidhlfill #c5e7e7 widgetDefault option add *Roster.metajidborder #e7e7e7 widgetDefault option add *Roster.groupfill #dddddd widgetDefault option add *Roster.groupcfill #dddddd widgetDefault option add *Roster.grouphlfill #b4cdcd widgetDefault option add *Roster.groupborder #dddddd widgetDefault option add *Roster.unsubscribedforeground #663333 widgetDefault option add *Roster.unavailableforeground #515151 widgetDefault option add *Roster.dndforeground #515129 widgetDefault option add *Roster.xaforeground #0b3760 widgetDefault option add *Roster.awayforeground #0b3760 widgetDefault option add *Roster.availableforeground dodgerblue4 widgetDefault option add *Roster.chatforeground dodgerblue4 widgetDefault option add *Roster.stalkerforeground #663333 widgetDefault } namespace eval roster { custom::defgroup Roster [::msgcat::mc "Roster options."] -group Tkabber custom::defvar show_only_online 0 \ [::msgcat::mc "Show only online users in roster."] \ -type boolean -group Roster \ -command [namespace current]::redraw_after_idle custom::defvar show_transport_icons 0 \ [::msgcat::mc "Show native icons for transports/services in roster."] \ -type boolean -group Roster \ -command [namespace current]::redraw_after_idle custom::defvar show_transport_user_icons 0 \ [::msgcat::mc "Show native icons for contacts, connected to\ transports/services in roster."] \ -type boolean -group Roster \ -command [namespace current]::redraw_after_idle custom::defvar options(nested) 0 \ [::msgcat::mc "Enable nested roster groups."] \ -type boolean -group Roster \ -command [namespace current]::redraw_after_idle custom::defvar options(nested_delimiter) "::" \ [::msgcat::mc "Default nested roster group delimiter."] \ -type string -group Roster \ -command [namespace current]::redraw_after_idle custom::defvar options(show_own_resources) 0 \ [::msgcat::mc "Show my own resources in the roster."] \ -type boolean -group Roster \ -command [namespace current]::redraw_after_idle custom::defvar options(chats_group) 0 \ [::msgcat::mc "Add chats group in roster."] \ -type boolean -group Roster \ -command [namespace current]::redraw_after_idle custom::defvar options(use_filter) 0 \ [::msgcat::mc "Use roster filter."] \ -type boolean -group Roster \ -command [namespace current]::pack_filter_entry custom::defvar options(match_jids) 0 \ [::msgcat::mc "Match contact JIDs in addition to nicknames in\ roster filter."] \ -type boolean -group Roster \ -command [namespace current]::redraw_after_idle custom::defvar options(enable_metacontacts) 1 \ [::msgcat::mc "Enable grouping contacts into a single metacontact\ in roster."] \ -type boolean -group Roster \ -command [namespace current]::redraw_after_idle custom::defvar options(enable_metacontact_labels) 1 \ [::msgcat::mc "Always use main JID label for metacontact."] \ -type boolean -group Roster \ -command [namespace current]::redraw_after_idle custom::defvar options(free_drop) 1 \ [::msgcat::mc "Roster item may be dropped not only over group name\ but also over any item in group."] \ -type boolean -group Roster custom::defvar options(show_subscription) 0 \ [::msgcat::mc "Show subscription type in roster item tooltips."] \ -type boolean -group Roster custom::defvar options(show_conference_user_info) 0 \ [::msgcat::mc "Show detailed info on conference room members in\ roster item tooltips."] \ -type boolean -group Roster custom::defvar options(chat_on_doubleclick) 1 \ [::msgcat::mc "If set then open chat window/tab when user\ doubleclicks roster item.\ Otherwise open normal message window."] \ -type boolean -group Roster # {jid1 {group1 1 group2 0} jid2 {group3 0 group4 0}} custom::defvar collapsed_group_list {} \ [::msgcat::mc "Stored collapsed roster groups."] \ -type string -group Hidden # {jid1 {group1 1 group2 0} jid2 {group3 0 group4 0}} custom::defvar show_offline_group_list {} \ [::msgcat::mc "Stored show offline roster groups."] \ -type string -group Hidden custom::defvar options(filter) "" \ [::msgcat::mc "Roster filter."] \ -type string -group Hidden \ -command [namespace current]::redraw_after_idle variable menu_item_idx 0 variable undef_group_name $::roster::undef_group_name variable chats_group_name $::roster::chats_group_name variable own_resources_group_name $::roster::own_resources_group_name } proc roster::get_group_lists {xlib} { variable collapsed_group_list variable show_offline_group_list variable options variable roster set jid [::xmpp::jid::normalize [connection_bare_jid $xlib]] array set c $collapsed_group_list array set s $show_offline_group_list if {[info exists c($jid)]} { foreach {group val} $c($jid) { if {$options(nested)} { set gid [list $xlib [msplit $group $options(nested_delimiter)]] } else { set gid [list $xlib [list $group]] } set roster(collapsed,$gid) $val } } if {[info exists s($jid)]} { foreach {group val} $s($jid) { if {$options(nested)} { set gid [list $xlib [msplit $group $options(nested_delimiter)]] } else { set gid [list $xlib [list $group]] } set roster(show_offline,$gid) $val } } } hook::add connected_hook [namespace current]::roster::get_group_lists 1 proc roster::set_group_lists {xlib} { variable collapsed_group_list variable show_offline_group_list variable options variable roster variable undef_group_name variable chats_group_name set jid [::xmpp::jid::normalize [connection_bare_jid $xlib]] array set c $collapsed_group_list array set s $show_offline_group_list set groups [roster::get_groups $xlib -raw 1] lappend groups $undef_group_name $chats_group_name if {$options(nested)} { set tmp {} foreach group $groups { set tmp1 [msplit $group $options(nested_delimiter)] for {set i 0} {$i < [llength $tmp1]} {incr i} { lappend tmp [lrange $tmp1 0 $i] } } set groups [lsort -unique $tmp] } set c($jid) {} set s($jid) {} foreach group $groups { if {$options(nested)} { set grname [join $group $options(nested_delimiter)] set gid [list $xlib $group] } else { set grname $group set gid [list $xlib [list $group]] } if {[info exists roster(collapsed,$gid)] && $roster(collapsed,$gid)} { lappend c($jid) $grname $roster(collapsed,$gid) } if {[info exists roster(show_offline,$gid)] && $roster(show_offline,$gid)} { lappend s($jid) $grname $roster(show_offline,$gid) } } if {[llength $c($jid)] == 0} { unset c($jid) } if {[llength $s($jid)] == 0} { unset s($jid) } set collapsed_group_list [array get c] set show_offline_group_list [array get s] } hook::add disconnected_hook [namespace current]::roster::set_group_lists 40 proc roster::process_item {xlib jid name groups subsc ask} { after cancel [namespace parent]::update_chat_titles after idle [namespace parent]::update_chat_titles } hook::add roster_push_hook [namespace current]::roster::process_item 90 proc roster::create_filter_entry {} { Entry .roster_filter -textvariable [namespace current]::options(filter) \ -width 1 bind .roster_filter \ [list set [namespace current]::options(filter) ""] pack_filter_entry } hook::add finload_hook [namespace current]::roster::create_filter_entry proc roster::pack_filter_entry {args} { global usetabbar variable options if {![winfo exists .roster_filter]} return if {$options(use_filter)} { if {$usetabbar} { grid .roster_filter -row 1 \ -column 0 \ -sticky we \ -in $::ifacetk::rw } else { grid .roster_filter -row 2 \ -column 1 \ -sticky we \ -in [$::ifacetk::mf getframe] } focus .roster_filter } else { grid forget .roster_filter } redraw_after_idle } proc roster::filter_match {xlib jid} { variable options if {$options(use_filter) && $options(filter) != ""} { if {[string first [string tolower $options(filter)] \ [string tolower [::roster::get_label $xlib $jid]]] < 0} { if {!$options(match_jids) || \ [string first [string tolower $options(filter)] \ [string tolower $jid]] < 0} { return 0 } } } return 1 } proc roster::redraw {} { variable roster variable options variable config variable show_only_online variable show_transport_user_icons variable undef_group_name variable chats_group_name variable own_resources_group_name clear .roster 0 set connections [connections] switch -- [llength $connections] { 0 { update_scrollregion .roster return } 1 { set draw_connection 0 } default { set draw_connection 1 } } foreach xlib $connections { # TODO: Move to a plugin # Preparing metacontacts. array unset metajids array unset metagroups array unset groups_from_meta set metacontacted {} if {$options(enable_metacontacts) && \ [llength [info procs ::plugins::metacontacts::*]] > 0} { foreach tag [::plugins::metacontacts::get_all_tags $xlib] { set jids [::plugins::metacontacts::get_jids $xlib $tag] set metagroups($tag) {} set cgroups {} foreach jid $jids { # Skip JID if it doesn't match filter pattern or if it # isn't a JID of use set isuser [::roster::itemconfig $xlib $jid -isuser] if {$isuser == ""} { set isuser 1 } if {$isuser} { set cgroups \ [concat $cgroups \ [::roster::itemconfig $xlib $jid -group]] } if {$isuser && [filter_match $xlib $jid]} { lappend metagroups($tag) $jid lappend metacontacted $jid } } if {[llength $metagroups($tag)] == 0} continue set mjid [lindex $metagroups($tag) 0] set pjid [get_jid_of_user $xlib $mjid] set priority [get_jid_presence_info priority $xlib $pjid] set status [get_jid_status $xlib $pjid] foreach rjid [lrange $metagroups($tag) 1 end] { set jid [get_jid_of_user $xlib $rjid] set stat [get_jid_status $xlib $jid] if {[string equal $stat unavailable]} continue set prio [get_jid_presence_info priority $xlib $jid] if {$prio == ""} { set prio 0 } if {$prio > $priority || ($prio == $priority && [compare_status $stat $status] > 0)} { set mjid $rjid set pjid $jid set status $stat set priority $prio } } lappend metajids($mjid) $tag if {![info exists groups_from_meta($mjid)]} { set groups_from_meta($mjid) $cgroups } else { set groups_from_meta($mjid) \ [concat $groups_from_meta($mjid) $cgroups] } } foreach jid [array names metajids] { set metajids($jid) [lsort -unique $metajids($jid)] } set metacontacted [lsort -unique $metacontacted] } # Draw connection group if {$draw_connection} { if {![info exists roster(collapsed,[list xlib $xlib])]} { set roster(collapsed,[list xlib $xlib]) 0 } addline .roster connection \ [connection_jid $xlib] \ [list xlib $xlib] \ [list xlib $xlib] \ {} 0 if {$roster(collapsed,[list xlib $xlib])} { continue } } # Don't draw roster if it doesn't contain items if {[llength [::roster::get_jids $xlib]] == 0} { continue } # List of pairs {"group string for sorting", # "group split on delimiter"} set groups {} # Array of lists of JIDs in group array unset jidsingroup # Array of lists of JIDs in group descendants array unset jidsundergroup # Array of lists of subgroups array unset groupsundergroup array unset jstat array unset useronline foreach jid [::roster::get_jids $xlib] { # Skip JID if it doesn't match filter pattern if {![filter_match $xlib $jid]} continue # TODO: Move to the metacontacts plugin # Skip JID if it should be ignored because of metacontacts if {$jid in $metacontacted && ![info exists metajids($jid)]} { continue } # Add JID groups to a groups list set jid_groups [::roster::itemconfig $xlib $jid -group] if {[info exists groups_from_meta($jid)]} { set jid_groups [concat $jid_groups $groups_from_meta($jid)] } if {[llength $jid_groups] > 0} { foreach group $jid_groups { if {$options(nested)} { set sgroup [msplit $group $options(nested_delimiter)] } else { set sgroup [list $group] } # Use the fact that -dictionary sorting puts \u0000 before # any other character, so subgroups will be placed just # after their parent group lappend groups [list [join $sgroup "\u0000"] $sgroup] lappend jidsingroup($sgroup) $jid if {![info exists jidsundergroup($sgroup)]} { set jidsundergroup($sgroup) {} } if {![info exists groupsundergroup($sgroup)]} { set groupsundergroup($sgroup) {} } for {set i [expr {[llength $sgroup] - 2}]} {$i >= 0} \ {incr i -1} { # Adding all parent groups to a group list set sgr [lrange $sgroup 0 $i] lappend groups [list [join $sgr "\u0000"] $sgr] lappend jidsundergroup($sgr) $jid lappend groupsundergroup($sgr) $sgroup if {![info exists jidsingroup($sgr)]} { set jidsingroup($sgr) {} } } } } else { set sgroup [list $undef_group_name] lappend jidsingroup($sgroup) $jid if {![info exists jidsundergroup($sgroup)]} { set jidsundergroup($sgroup) {} } set groupsundergroup($sgroup) {} } } set groups [lsort -unique -dictionary -index 0 $groups] # FIXME: What to do with subgroups of $undef_group_name? # Putting undefined group to the and of list set ugroup [list $undef_group_name] if {[info exists jidsingroup($ugroup)]} { lappend groups [list [join $ugroup "\u0000"] $ugroup] } # Putting active chats group to the beginning if {$options(chats_group)} { set cgroup [list $chats_group_name] foreach chatid [chat::opened $xlib] { set jid [chat::get_jid $chatid] lappend jidsingroup($cgroup) $jid if {[roster::itemconfig $xlib $jid -isuser] eq ""} { roster::itemconfig $xlib $jid \ -name [chat::get_nick $xlib $jid chat] roster::itemconfig $xlib $jid -subsc none } } if {[info exists jidsingroup($cgroup)]} { set groups \ [linsert $groups 0 [list [join $cgroup "\u0000"] $cgroup]] } set groupsundergroup($cgroup) {} set jidsundergroup($cgroup) {} } # Putting own resources group to the beginning if {$options(show_own_resources)} { set cgroup [list $own_resources_group_name] set jid [::xmpp::jid::normalize [connection_bare_jid $xlib]] set jidsingroup($cgroup) [list $jid] set groups \ [linsert $groups 0 [list [join $cgroup "\u0000"] $cgroup]] roster::itemconfig $xlib $jid -subsc both set groupsundergroup($cgroup) {} set jidsundergroup($cgroup) {} } # Info on whether to show offline users in a group is needed for # subgroups too, so an extra loop foreach group $groups { set group [lindex $group 1] set gid [list $xlib $group] if {![info exists roster(show_offline,$gid)]} { set roster(show_offline,$gid) 0 } } # Drawing groups an JIDs in them foreach group $groups { set group [lindex $group 1] set gid [list $xlib $group] set jidsingroup($group) [lsort -unique $jidsingroup($group)] set groupsundergroup($group) \ [lsort -unique $groupsundergroup($group)] if {![info exists roster(collapsed,$gid)]} { set roster(collapsed,$gid) 0 } # How to indent the group (also, the number of its ancestors) set indent [expr {[llength $group] - 1}] # Whether to draw group at all set collapse 0 # Whether to show offline users in the group set show_offline_users 0 # Whether to show the group ??? set show_offline_group 0 foreach undergroup $groupsundergroup($group) { if {$roster(show_offline,[list $xlib $undergroup])} { set show_offline_group 1 break } } for {set i 0} {$i < $indent} {incr i} { set sgr [list $xlib [lrange $group 0 $i]] if {$roster(collapsed,$sgr)} { # Whether some ancestor is collapsed set collapse 1 break } if {$roster(show_offline,$sgr)} { # Whether showing offline users is required for some # ancestor set show_offline_users 1 set show_offline_group 1 } } # If some ancestor is collapsed don't draw the group if {$collapse} continue set group_label [lindex $group end] set online 0 set users 0 set not_users 0 foreach jid [concat $jidsingroup($group) $jidsundergroup($group)] { if {[::roster::itemconfig $xlib $jid -isuser]} { incr users if {![info exists jstat($jid)]} { set jstat($jid) [get_user_status $xlib $jid] } if {$jstat($jid) != "unavailable"} { incr online set useronline($jid) 1 } else { set useronline($jid) 0 } } else { incr not_users } } # Draw group label if {!$show_only_online || $show_offline_group || \ $roster(show_offline,$gid) || \ ($options(use_filter) && $options(filter) != "") || \ $online + $not_users > 0} { if {$users > 0} { append group_label " ($online/$users)" } addline .roster group $group_label $gid $gid {} $indent } # Draw group contents if it isn't collapsed if {!$roster(collapsed,$gid)} { set jid_labels {} foreach jid $jidsingroup($group) { lappend jid_labels \ [list $jid [::roster::get_label $xlib $jid]] } set jid_labels [lsort -index 1 -dictionary $jid_labels] foreach jid_label $jid_labels { lassign $jid_label jid label if {$options(chats_group)} { set chatid [chat::chatid $xlib $jid] if {[info exists ::chat::chats(messages,$chatid)] && \ $::chat::chats(messages,$chatid) > 0} { append label " ($::chat::chats(messages,$chatid))" } } set condition \ [expr {!$show_only_online || $show_offline_users || $roster(show_offline,$gid) || ($options(use_filter) && $options(filter) ne "")}] set cjid [list $xlib $jid] if {$condition || ![info exists useronline($jid)] || $useronline($jid)} { if {[info exists metajids($jid)]} { set jids {} foreach tag $metajids($jid) { foreach subjid $metagroups($tag) { # Metacontact members are necessarily # users, so don't check for this if {![info exists jstat($subjid)]} { set jstat($subjid) \ [get_user_status $xlib $subjid] } if {$jstat($subjid) != "unavailable"} { set useronline($subjid) 1 } else { set useronline($subjid) 0 } if {$condition || $useronline($subjid)} { lappend jids $subjid } } } set jids [lsort -unique $jids] set numjids [llength $jids] if {$options(enable_metacontact_labels)} { set tag [lindex $metajids($jid) 0] set mjid \ [lindex [::plugins::metacontacts::get_jids\ $xlib $tag] 0] set label [::roster::get_label $xlib $mjid] } if {($options(enable_metacontact_labels) && $numjids > 0) || $numjids > 1} { # Draw as a metacontact if {$config(subitemtype) & 1} { append label " ($numjids)" } addline .roster metajid $label $cjid $gid \ [list $xlib $metajids($jid)] \ $indent $jids \ [get_jid_icon $xlib $jid] \ [get_jid_foreground $xlib $jid] if {!$roster(metacollapsed,$gid,[list $xlib \ $metajids($jid)])} { set subjid_labels {} foreach subjid $jids { lappend subjid_labels \ [list $subjid [::roster::get_label\ $xlib $subjid]] } set subjid_labels \ [lsort -index 1 -dictionary \ $subjid_labels] foreach subjid_label $subjid_labels { lassign $subjid_label subjid label draw_jid $xlib $subjid $label $gid \ [list $xlib $metajids($jid)] \ $indent jstat } } } else { # Draw as an ordinary contact using a hack with # indent which allows to add metajid tag. The # hack depends on metajid indent equals to # group indent draw_jid $xlib $jid $label $gid \ [list $xlib $metajids($jid)] \ [expr {$indent - 1}] jstat } } else { draw_jid $xlib $jid $label $gid {} $indent jstat } } } } } } update_scrollregion .roster } proc roster::draw_jid {xlib jid label gid metajids indent jstatVar} { variable config variable roster variable show_transport_user_icons upvar $jstatVar jstat set cjid [list $xlib $jid] lassign [::roster::get_category_and_subtype $xlib $jid] category type set jids [get_jids_of_user $xlib $jid] set numjids [llength $jids] if {$category == "user" && $numjids > 1 && $config(subitemtype) > 0} { if {$config(subitemtype) & 1} { append label " ($numjids)" } addline .roster jid $label $cjid $gid $metajids $indent $jids \ [get_jid_icon $xlib $jid] \ [get_jid_foreground $xlib $jid] if {!$roster(jidcollapsed,$gid,$cjid)} { foreach subjid $jids { set subjid_resource [::xmpp::jid::resource $subjid] if {$subjid_resource != ""} { addline .roster jid2 \ $subjid_resource [list $xlib $subjid] \ $gid $metajids $indent \ [list $subjid] \ [get_jid_icon $xlib $subjid] \ [get_jid_foreground $xlib $subjid] } } } } elseif {$category == "user" && $numjids <= 1 && !$show_transport_user_icons} { if {[info exists jstat($jid)]} { set status $jstat($jid) } else { set status [get_user_status $xlib $jid] } set subsc [::roster::itemconfig $xlib $jid -subsc] if {([string equal $subsc from] || [string equal $subsc none]) && \ $status == "unavailable"} { set status unsubscribed } addline .roster jid $label $cjid $gid $metajids $indent $jids \ roster/user/$status \ $config(${status}foreground) } else { if {$category == "conference" && ($config(subitemtype) & 1) && $numjids > 1} { append label " ([incr numjids -1])" } addline .roster jid $label $cjid $gid $metajids $indent $jids \ [get_jid_icon $xlib $jid] \ [get_jid_foreground $xlib $jid] } } proc roster::redraw_after_idle {args} { variable redraw_afterid if {[info exists redraw_afterid]} return if {![winfo exists .roster.canvas]} return set redraw_afterid \ [after idle "[namespace current]::redraw unset [namespace current]::redraw_afterid"] } # Callback proc ::redraw_roster {args} { ifacetk::roster::redraw_after_idle } proc roster::get_jids_of_user {xlib user} { # TODO: metacontacts return [::get_jids_of_user $xlib $user] } proc roster::get_foreground {status} { variable config return $config(${status}foreground) } proc roster::get_jid_foreground {xlib jid} { variable config lassign [::roster::get_category_and_subtype $xlib $jid] category type switch -- $category { "" - user { return [get_user_foreground $xlib $jid] } conference { if {[get_jid_status $xlib $jid] != "unavailable"} { return $config(availableforeground) } else { return $config(unavailableforeground) } } server - gateway - service { return [get_service_foreground $xlib $jid $type] } default { return $config(foreground) } } } proc roster::get_service_foreground {xlib service type} { variable config switch -- $type { jud { return $config(foreground) } } if {![string equal [::roster::itemconfig $xlib $service -subsc] none]} { set status [get_user_status $xlib $service] return $config(${status}foreground) } else { return $config(unsubscribedforeground) } } proc roster::get_user_foreground {xlib user} { variable config set status [get_user_status $xlib $user] set subsc [::roster::itemconfig $xlib $user -subsc] if {[string equal $subsc ""]} { set ruser [::roster::find_jid $xlib $user] if {$ruser != ""} { set subsc [::roster::itemconfig $xlib $ruser -subsc] } else { set subsc none } } if {([string equal $subsc from] || [string equal $subsc none]) && \ $status == "unavailable"} { return $config(unsubscribedforeground) } else { return $config(${status}foreground) } } proc roster::get_jid_icon {xlib jid {status ""}} { lassign [::roster::get_category_and_subtype $xlib $jid] category type switch -- $category { "" - user { if {$status == ""} { set status [get_user_status $xlib $jid] } return [get_user_icon $xlib $jid $status] } conference { if {$status == ""} { set status [get_jid_status $xlib $jid] } if {$status != "unavailable"} { return roster/conference/available } return roster/conference/unavailable } server - gateway - service { if {$status == ""} { set status [get_user_status $xlib $jid] } return [get_service_icon $xlib $jid $type $status] } default { if {$status == ""} { set status [get_jid_status $xlib $jid] } return [get_user_icon $xlib $jid $status] } } } proc roster::get_service_icon {xlib service type status} { variable show_transport_icons if {$show_transport_icons} { switch -- $type { jud {return services/jud} sms {return services/sms} } if {[::roster::itemconfig $xlib $service -subsc] ne "none"} { if {![catch { image type services/$type/$status }]} { return services/$type/$status } else { return roster/user/$status } } else { return roster/user/unsubscribed } } else { if {[::roster::itemconfig $xlib $service -subsc] ne "none"} { return roster/user/$status } else { return roster/user/unsubscribed } } } proc roster::get_user_icon {xlib user status} { variable show_transport_user_icons set subsc [::roster::itemconfig $xlib $user -subsc] if {[string equal $subsc ""]} { set ruser [::roster::find_jid $xlib $user] if {$ruser != ""} { set subsc [::roster::itemconfig $xlib $ruser -subsc] } } if {!([string equal $subsc from] || [string equal $subsc none]) || \ $status != "unavailable"} { if {$show_transport_user_icons} { set service [::xmpp::jid::server $user] lassign [::roster::get_category_and_subtype $xlib $service] \ category type switch -glob -- $category/$type { directory/* - */jud { return services/jud } */sms { return services/sms } } if {![catch { image type services/$type/$status }]} { return services/$type/$status } else { return roster/user/$status } } else { return roster/user/$status } } else { return roster/user/unsubscribed } } proc roster::changeicon {w jid icon} { set c $w.canvas set tag [jid_to_tag $jid] $c itemconfigure jid$tag&&icon -image $icon } proc roster::changeforeground {w jid color} { set c $w.canvas set tag [jid_to_tag $jid] $c itemconfigure jid$tag&&text -fill $color } proc roster::create {w args} { variable iroster variable config set c $w.canvas set width 150 set height 100 set popupproc {} set grouppopupproc {} set singleclickproc {} set doubleclickproc {} foreach {attr val} $args { switch -- $attr { -width {set width $val} -height {set height $val} -popup {set popupproc $val} -grouppopup {set grouppopupproc $val} -singleclick {set singleclickproc $val} -doubleclick {set doubleclickproc $val} -draginitcmd {set draginitcmd $val} -dropovercmd {set dropovercmd $val} -dropcmd {set dropcmd $val} } } frame $w -relief flat -borderwidth 0 -class Roster set sw [ScrolledWindow $w.sw -scrollbar vertical] pack $sw -fill both -expand yes set config(groupindent) [winfo pixels $w [option get $w groupindent Roster]] set config(jidindent) [winfo pixels $w [option get $w jidindent Roster]] set config(jidmultindent) [winfo pixels $w [option get $w jidmultindent Roster]] set config(jid2indent) [winfo pixels $w [option get $w subjidindent Roster]] set config(groupiconindent) [winfo pixels $w [option get $w groupiconindent Roster]] set config(subgroupiconindent) [winfo pixels $w [option get $w subgroupiconindent Roster]] set config(iconindent) [winfo pixels $w [option get $w iconindent Roster]] set config(subiconindent) [winfo pixels $w [option get $w subiconindent Roster]] set config(textuppad) [winfo pixels $w [option get $w textuppad Roster]] set config(textdownpad) [winfo pixels $w [option get $w textdownpad Roster]] set config(linepad) [winfo pixels $w [option get $w linepad Roster]] set config(subitemtype) [option get $w subitemtype Roster] set config(background) [option get $w cbackground Roster] set config(metajidfill) [option get $w metajidfill Roster] set config(metajidhlfill) [option get $w metajidhlfill Roster] set config(metajidborder) [option get $w metajidborder Roster] set config(jidfill) [option get $w jidfill Roster] set config(jidhlfill) [option get $w jidhlfill Roster] set config(jidborder) [option get $w jidborder Roster] set config(jid2fill) $config(jidfill) set config(jid2hlfill) $config(jidhlfill) set config(jid2border) $config(jidborder) set config(groupfill) [option get $w groupfill Roster] set config(groupcfill) [option get $w groupcfill Roster] set config(grouphlfill) [option get $w grouphlfill Roster] set config(groupborder) [option get $w groupborder Roster] set config(connectionfill) [option get $w connectionfill Roster] set config(connectioncfill) [option get $w connectioncfill Roster] set config(connectionhlfill) [option get $w connectionhlfill Roster] set config(connectionborder) [option get $w connectionborder Roster] set config(foreground) [option get $w foreground Roster] set config(dndforeground) [option get $w dndforeground Roster] set config(xaforeground) [option get $w xaforeground Roster] set config(awayforeground) [option get $w awayforeground Roster] set config(availableforeground) [option get $w availableforeground Roster] set config(chatforeground) [option get $w chatforeground Roster] set config(unsubscribedforeground) \ [option get $w unsubscribedforeground Roster] set config(unavailableforeground) \ [option get $w unavailableforeground Roster] Canvas $c -bg $config(background) \ -scrollregion {0 0 0 0} \ -width $width -height $height if {$::interface eq "tk"} { $c configure -borderwidth 0.25m -relief sunken } $sw setwidget $c set iroster($w,ypos) 1 set iroster($w,width) 0 set iroster($w,popup) $popupproc set iroster($w,grouppopup) $grouppopupproc set iroster($w,singleclick) $singleclickproc set iroster($w,doubleclick) $doubleclickproc bindscroll $c if {[info exists draginitcmd]} { DragSite::register [Wrapped $c] -draginitcmd $draginitcmd } set args {} if {[info exists dropovercmd]} { lappend args -dropovercmd $dropovercmd } if {[info exists dropcmd]} { lappend args -dropcmd $dropcmd } if {[llength $args] > 0} { eval [list DropSite::register [Wrapped $c] -droptypes {JID}] $args } } proc roster::addline {w type text jid group metajids indent {jids {}} {icon ""} {foreground ""}} { variable options variable roster variable iroster variable config set c $w.canvas set tag [jid_to_tag $jid] set grouptag [jid_to_tag $group] set metatag [jid_to_tag $metajids] set ypad 1 set linespace [font metric $::RosterFont -linespace] set lineheight [expr {$linespace + $ypad}] set uy $iroster($w,ypos) set ly \ [expr {$uy + $lineheight + $config(textuppad) + $config(textdownpad)}] set levindent [expr $config(groupindent)*$indent] if {[string equal $metajids {}]} { set metaindent 0 } else { set metaindent $config(groupindent) } set border $config(${type}border) set hlfill $config(${type}hlfill) if {([string equal $type group] || [string equal $type connection]) && \ [info exists roster(collapsed,$jid)] && $roster(collapsed,$jid)} { set rfill $config(${type}cfill) } else { set rfill $config(${type}fill) } if {[string equal $type connection]} { set type group } $c create rectangle [expr {1 + $levindent}] $uy 10000 $ly \ -fill $rfill \ -outline $border \ -tags [list jid$tag group$grouptag meta$metatag $type rect] switch -- $type { metajid { set isuser 1 set y [expr {($uy + $ly)/2}] set x [expr {$config(iconindent) + $levindent}] if {$icon == ""} { set icon roster/user/unavailable } $c create image $x $y -image $icon \ -anchor w \ -tags [list jid$tag group$grouptag \ meta$metatag $type icon] if {[llength $jids] > 0} { if {[info exists roster(metacollapsed,$group,$metajids)] && \ !$roster(metacollapsed,$group,$metajids)} { set jid_state opened } else { set roster(metacollapsed,$group,$metajids) 1 set jid_state closed } if {$config(subitemtype) > 0 && ($config(subitemtype) & 2)} { set y [expr {($uy + $ly)/2}] set x [expr {$config(subgroupiconindent) + $levindent}] $c create image $x $y -image roster/group/$jid_state \ -anchor w \ -tags [list jid$tag group$grouptag \ meta$metatag $type group] } } else { set roster(metacollapsed,$group,$metajids) 1 } } jid { lassign $jid xlib jjid set isuser [::roster::itemconfig $xlib $jjid -isuser] if {[string equal $isuser ""]} { set isuser 1 } set y [expr {($uy + $ly)/2}] set x [expr {$config(iconindent) + $levindent + $metaindent}] if {$icon == ""} { set icon roster/user/unavailable } $c create image $x $y -image $icon \ -anchor w \ -tags [list jid$tag group$grouptag \ meta$metatag $type icon] if {[llength $jids] > 1} { if {[info exists roster(jidcollapsed,$group,$jid)] && !$roster(jidcollapsed,$group,$jid)} { set jid_state opened } else { set roster(jidcollapsed,$group,$jid) 1 set jid_state closed } if {$config(subitemtype) > 0 && ($config(subitemtype) & 2) && $isuser} { set y [expr {($uy + $ly)/2}] set x [expr {$config(subgroupiconindent) + $levindent + $metaindent}] $c create image $x $y -image roster/group/$jid_state \ -anchor w \ -tags [list jid$tag group$grouptag \ meta$metatag $type group] } } else { set roster(jidcollapsed,$group,$jid) 1 } } jid2 { set y [expr {($uy + $ly)/2}] set x [expr {$config(subiconindent) + $levindent + $metaindent}] if {$icon == ""} { set icon roster/user/unavailable } $c create image $x $y -image $icon \ -anchor w \ -tags [list jid$tag group$grouptag \ meta$metatag $type icon] } group { set y [expr {($uy + $ly)/2}] set x [expr {$config(groupiconindent) + $levindent}] if {[info exists roster(collapsed,$jid)] && $roster(collapsed,$jid)} { set group_state closed } else { set group_state opened } $c create image $x $y -image roster/group/$group_state \ -anchor w \ -tags [list jid$tag group$grouptag \ meta$metatag $type icon] } } switch -- $type { metajid { if {($config(subitemtype) > 0) && ($config(subitemtype) & 2) && (($options(enable_metacontact_labels) && [llength $jids] > 0) || [llength $jids] > 1)} { set x [expr {$config(jidmultindent) + $levindent}] } else { set x [expr {$config(jidindent) + $levindent}] } } jid { if {($config(subitemtype) > 0) && ($config(subitemtype) & 2) && \ $isuser && ([llength $jids] > 1)} { set x [expr {$config(jidmultindent) + $levindent}] } else { set x [expr {$config(jidindent) + $levindent}] } } default { set x [expr {$config(${type}indent) + $levindent}] } } switch -- $type { jid - jid2 { incr x $metaindent } } incr uy $config(textuppad) if {[string equal $foreground ""]} { switch -- $type { metajid - jid - jid2 { set foreground $config(unavailableforeground) } default { set foreground $config(foreground) } } } $c create text $x $uy -text $text \ -anchor nw \ -font $::RosterFont \ -fill $foreground \ -tags [list jid$tag group$grouptag \ meta$metatag $type text] set iroster($w,width) \ [::tcl::mathfunc::max $iroster($w,width) \ [expr {$x + [font measure $::RosterFont $text]}]] $c bind jid$tag&&$type \ [double% [list $c itemconfig jid$tag&&$type&&rect -fill $hlfill]] $c bind jid$tag&&$type \ [double% [list $c itemconfig jid$tag&&$type&&rect -fill $rfill]] set doubledjid [double% $jid] set doubledjids [double% $jids] set iroster($w,ypos) [expr {$ly + $config(linepad)}] switch -- $type { metajid - jid - jid2 { $c bind jid$tag&&$type \ [list [namespace current]::on_singleclick \ [double% $iroster($w,singleclick)] \ [double% $c] %x %y $doubledjid $doubledjids] $c bind jid$tag&&$type \ [list [namespace current]::on_doubleclick \ [double% $iroster($w,doubleclick)] $doubledjid \ $doubledjids] $c bind jid$tag&&$type \ +[list eval balloon::set_text \ \[[namespace current]::jids_popup_info \ [list $doubledjid] [list $doubledjids]\]] $c bind jid$tag&&$type \ [list eval balloon::on_mouse_move \ \[[namespace current]::jids_popup_info \ [list $doubledjid] [list $doubledjids]\] %X %Y] $c bind jid$tag&&$type {+ balloon::destroy} if {![string equal $iroster($w,popup) ""]} { $c bind jid$tag&&$type <> \ [list [double% $iroster($w,popup)] \ $doubledjid $doubledjids] } } default { if {$w == ".roster"} { $c bind jid$tag&&group \ [list [namespace current]::group_click $doubledjid] } if {![string equal $iroster($w,grouppopup) {}]} { $c bind jid$tag&&group <> \ [list [double% $iroster($w,grouppopup)] $doubledjid] } } } } proc roster::clear {w {updatescroll 1}} { variable iroster $w.canvas delete rect||icon||text||group set iroster($w,ypos) 1 set iroster($w,width) 0 if {$updatescroll} { update_scrollregion $w } } proc roster::update_scrollregion {w} { variable iroster $w.canvas configure \ -scrollregion [list 0 0 $iroster($w,width) $iroster($w,ypos)] } ############################################################################### proc roster::on_singleclick {command c x y cjid jids} { variable click_afterid if {$command == ""} return set xc [$c canvasx $x] set yc [$c canvasy $y] set tags [$c gettags [lindex [$c find closest $xc $yc] 0]] if {![info exists click_afterid]} { set click_afterid \ [after 300 [list [namespace current]::singleclick_run $command \ $tags $cjid $jids]] } else { after cancel $click_afterid unset click_afterid } } proc roster::singleclick_run {command tags cjid jids} { variable click_afterid if {[info exists click_afterid]} { unset click_afterid } eval $command [list $tags $cjid $jids] } proc roster::on_doubleclick {command cjid jids} { variable click_afterid if {[info exists click_afterid]} { after cancel $click_afterid unset click_afterid } if {$command == ""} return eval $command [list $cjid $jids] } ############################################################################### proc roster::jid_doubleclick {id ids} { lassign $id xlib jid lassign [::roster::get_category_and_subtype $xlib $jid] category subtype hook::run roster_jid_doubleclick $xlib $jid $category $subtype } ############################################################################### proc roster::doubleclick_fallback {xlib jid category subtype} { variable options if {$options(chat_on_doubleclick)} { chat::open_to_user $xlib $jid } else { message::send_dialog -to $jid } } hook::add roster_jid_doubleclick \ [namespace current]::roster::doubleclick_fallback 100 ############################################################################### proc roster::group_click {gid} { variable roster set roster(collapsed,$gid) [expr {!$roster(collapsed,$gid)}] redraw_after_idle } proc roster::jids_popup_info {id jids} { lassign $id xlib jid # TODO: metacontacts if {$jids == {}} { set jids [list $jid] } set text {} set i 0 foreach j [lsort $jids] { append text "\n[user_popup_info $xlib $j $i]" incr i } set text [string trimleft $text "\n"] return $text } proc roster::user_popup_info {xlib user i} { variable options variable user_popup_info global statusdesc lassign [::roster::get_category_and_subtype $xlib $user] category subtype set bare_user [::roster::find_jid $xlib $user] lassign [::roster::get_category_and_subtype $xlib $bare_user] \ category1 subtype1 set name $user switch -- $category { conference { set status $statusdesc([get_jid_status $xlib $user]) set desc "" } user - default { set status $statusdesc([get_user_status $xlib $user]) set desc [get_user_status_desc $xlib $user] if {[string equal $category1 conference] && $i > 0} { if {$options(show_conference_user_info)} { set name " [::xmpp::jid::resource $user]" } else { set name "\t[::xmpp::jid::resource $user]" } } } } if {(![string equal -nocase $status $desc]) && ($desc ne "")} { append status " ($desc)" } set subsc [::roster::itemconfig $xlib $bare_user -subsc] if {($options(show_subscription) && $subsc ne "") && !($category1 eq "conference" && $category eq "user")} { set subsc "\n\t[::msgcat::mc {Subscription:}] $subsc" set ask [::roster::itemconfig $xlib $bare_user -ask] if {![string equal $ask ""]} { set ask " [::msgcat::mc {Ask:}] $ask" } } else { set subsc "" set ask "" } set user_popup_info "" if {$category1 ne "conference" || $i == 0 || \ $options(show_conference_user_info)} { set user_popup_info "$name: $status$subsc$ask" hook::run roster_user_popup_info_hook \ [namespace which -variable user_popup_info] $xlib $user } return $user_popup_info } proc roster::switch_only_online {args} { variable show_only_online set show_only_online [expr {!$show_only_online}] } proc roster::is_online {xlib jid} { if {[::roster::itemconfig $xlib $jid -isuser]} { switch -- [get_user_status $xlib $jid] { unavailable {return 0} default {return 1} } } else { return 1 } } ############################################################################### proc roster::add_remove_item_menu_item {m xlib jid} { set rjid [roster::find_jid $xlib $jid] if {$jid != "" && $rjid == ""} { set state disabled } else { set state normal } $m add command -label [::msgcat::mc "Remove from roster..."] \ -command [list ifacetk::roster::remove_item_dialog $xlib $rjid] \ -state $state } hook::add chat_create_user_menu_hook \ [namespace current]::roster::add_remove_item_menu_item 90 hook::add roster_conference_popup_menu_hook \ [namespace current]::roster::add_remove_item_menu_item 90 hook::add roster_service_popup_menu_hook \ [namespace current]::roster::add_remove_item_menu_item 90 hook::add roster_jid_popup_menu_hook \ [namespace current]::roster::add_remove_item_menu_item 90 ############################################################################### proc roster::remove_item_dialog {xlib jid} { set res [MessageDlg .remove_item -aspect 50000 -icon question -type user \ -buttons {yes no} -default 0 -cancel 1 \ -message [::msgcat::mc "Are you sure to remove %s from roster?" $jid]] if {$res == 0} { ::roster::remove_item $xlib $jid } } proc roster::update_chat_activity {args} { variable options if {$options(chats_group)} { redraw_after_idle } } hook::add open_chat_post_hook [namespace current]::roster::redraw_after_idle hook::add close_chat_post_hook [namespace current]::roster::redraw_after_idle hook::add draw_message_hook [namespace current]::roster::update_chat_activity hook::add raise_chat_tab_hook [namespace current]::roster::update_chat_activity ############################################################################### proc roster::dropcmd {target source X Y op type data} { variable options debugmsg roster "$target $source $X $Y $op $type $data" set c .roster.canvas set x [expr {$X-[winfo rootx $c]}] set y [expr {$Y-[winfo rooty $c]}] set xc [$c canvasx $x] set yc [$c canvasy $y] set tags [$c gettags [lindex [$c find closest $xc $yc] 0]] if {$options(free_drop) && ![string equal $tags ""]} { lassign [tag_to_jid [string range [lindex $tags 1] 5 end]] xlib gr if {$xlib == "xlib"} { set xlib $gr set gr {} } } elseif {"group" in $tags} { lassign [tag_to_jid [string range [lindex $tags 0] 3 end]] xlib gr if {$xlib == "xlib"} { set xlib $gr set gr {} } } elseif {![string equal $tags ""]} { lassign [tag_to_jid [string range [lindex $tags 1] 5 end]] xlib set gr {} } else { set xlib [lindex [connections] 0] set gr {} } if {$options(nested)} { set gr [join $gr $options(nested_delimiter)] } else { set gr [lindex $gr 0] } debugmsg roster "GG: $gr; $tags" lassign $data _xlib jid category type name version fromgid set subsc "" if {[info exists fromgid]} { lassign $fromgid fromxlib fromgr if {$options(nested)} { set fromgr [join $fromgr $options(nested_delimiter)] } else { set fromgr [lindex $fromgr 0] } } if {$jid ni [::roster::get_jids $xlib]} { if {$gr != {}} { set groups [list $gr] } else { set groups {} } ::roster::itemconfig $xlib $jid -category $category -subtype $type \ -name $name -group $groups lassign [::roster::get_category_and_subtype $xlib $jid] ccategory ctype switch -- $ccategory { conference { ::roster::itemconfig $xlib $jid -subsc bookmark } user { ::xmpp::sendPresence $xlib -to $jid -type subscribe } } } else { set groups [::roster::itemconfig $xlib $jid -group] if {[info exists fromgid] && ($fromxlib == $xlib)} { set idx [lsearch -exact $groups $fromgr] if {$idx >= 0} { set groups [lreplace $groups $idx $idx] } } if {$gr != ""} { lappend groups $gr set groups [lsort -unique $groups] debugmsg roster $groups } ::roster::itemconfig $xlib $jid -category $category -subtype $type \ -name $name -group $groups } ::roster::send_item $xlib $jid } proc roster::draginitcmd {target x y top} { debugmsg roster "$target $x $y $top" balloon::destroy set c .roster.canvas set tags [$c gettags current] if {"jid" in $tags} { set grouptag [string range [lindex $tags 1] 5 end] set gid [tag_to_jid $grouptag] set tag [string range [lindex $tags 0] 3 end] set cjid [tag_to_jid $tag] lassign $cjid xlib jid set data [list $xlib $jid \ [::roster::itemconfig $xlib $jid -category] \ [::roster::itemconfig $xlib $jid -subtype] \ [::roster::itemconfig $xlib $jid -name] {} \ $gid] debugmsg roster $data return [list JID {move} $data] } else { return {} } } ############################################################################### proc roster::user_singleclick {tags cjid jids} { variable options variable roster lassign $cjid xlib jid set type [lindex $tags 3] set cgroup [tag_to_jid [string range [lindex $tags 1] 5 end]] set cmeta [tag_to_jid [string range [lindex $tags 2] 4 end]] switch -- $type { metajid { if {[llength $jids] > 1 || ($options(enable_metacontact_labels) && [llength $jids] > 0)} { set roster(metacollapsed,$cgroup,$cmeta) \ [expr {!$roster(metacollapsed,$cgroup,$cmeta)}] redraw_after_idle } } default { if {[roster::itemconfig $xlib $jid -isuser] && [llength $jids] > 1} { set roster(jidcollapsed,$cgroup,$cjid) \ [expr {!$roster(jidcollapsed,$cgroup,$cjid)}] redraw_after_idle } } } } ############################################################################### proc roster::popup_menu {id jids} { lassign $id xlib jid lassign [::roster::get_category_and_subtype $xlib $jid] category subtype switch -- $category { user {set menu [create_user_menu $xlib $jid $jids]} conference {set menu [conference_popup_menu $xlib $jid]} server - gateway - service {set menu [service_popup_menu $xlib $jid]} default {set menu [jid_popup_menu $xlib $jid]} } tk_popup $menu [winfo pointerx .] [winfo pointery .] } ############################################################################### proc roster::group_popup_menu {id} { variable options lassign $id xlib name if {$options(nested)} { set name [join $name $options(nested_delimiter)] } else { set name [lindex $name 0] } if {$xlib != "xlib"} { tk_popup [create_group_popup_menu $xlib $name] \ [winfo pointerx .] [winfo pointery .] } } ############################################################################### proc roster::groupchat_popup_menu {id jids} { lassign $id xlib jid tk_popup [create_groupchat_user_menu $xlib $jid] \ [winfo pointerx .] [winfo pointery .] } ############################################################################### proc roster::create_user_menu {xlib user jids} { set m .jidpopupmenu if {[winfo exists $m]} { destroy $m } menu $m -tearoff 0 set jids1 {} foreach jid $jids { set resources [get_jids_of_user $xlib $jid] if {[llength $resources] == 0} { lappend jids1 $jid } else { set jids1 [concat $jids1 [get_jids_of_user $xlib $jid]] } } set jids $jids1 switch -- [llength $jids] { 0 { hook::run roster_jid_popup_menu_hook $m $xlib $user return $m } 1 { hook::run roster_jid_popup_menu_hook $m $xlib [lindex $jids 0] return $m } default { foreach jid $jids { set m1 .jidpopupmenu[jid_to_tag $jid] if {[winfo exists $m1]} { destroy $m1 } menu $m1 -tearoff 0 hook::run roster_jid_popup_menu_hook $m1 $xlib $jid } add_menu_submenu $m .jidpopupmenu "" $jids foreach jid $jids { set m1 .jidpopupmenu[jid_to_tag $jid] if {[winfo exists $m1]} { destroy $m1 } } return $m } } } ############################################################################### proc roster::add_menu_submenu {m prefix suffix jids} { set m1 $prefix[jid_to_tag [lindex $jids 0]]$suffix for {set i 0} {[$m1 index $i] == $i} {incr i} { switch -- [$m1 type $i] { separator { $m add separator } cascade { set label [$m1 entrycget $i -label] set menu [$m1 entrycget $i -menu] set state [$m1 entrycget $i -state] set suffix2 [join [lrange [split $menu .] 2 end] .] set suffix3 [lindex [split $menu .] end] set m2 [menu $m.$suffix3 -tearoff 0] # TODO: Check if state is the same for all menus $m add cascade -label $label -menu $m2 -state $state add_menu_submenu $m2 $prefix .$suffix2 $jids } checkbutton { set label [$m1 entrycget $i -label] add_checkbutton_submenu $m $prefix $suffix $i $label $jids } radiobutton { set label [$m1 entrycget $i -label] add_radiobutton_submenu $m $prefix $suffix $i $label $jids } command { set label [$m1 entrycget $i -label] add_command_submenu $m $prefix $suffix $i $label $jids } } } } ############################################################################### proc roster::get_popup_command_list {m prefix suffix label jids args} { set command_list0 {} set command_list1 {} set command_list2 {} foreach jid $jids { set bjid [::xmpp::jid::stripResource $jid] set m1 $prefix[jid_to_tag $jid]$suffix if {![catch {$m1 index $label} idx] && $idx != "none"} { set command {} foreach opt $args { # In some commands menu path is used, which is destroyed after # the submenus are created lappend command [string map [list $m1 $m] \ [$m1 entrycget $idx $opt]] } lappend command_list0 [list $label $command] lappend command_list1 [list $jid $command] lappend command_list2 [list $bjid $command] } } set command_list0 [lsort -unique $command_list0] set command_list2 [lsort -unique $command_list2] set command_list3 [lsort -unique -index 0 $command_list2] if {[llength $command_list0] == 1} { return $command_list0 } elseif {[llength $command_list2] != [llength $command_list3]} { return $command_list1 } else { return $command_list2 } } proc roster::add_command_submenu {m prefix suffix i label jids} { set command_list [get_popup_command_list $m $prefix $suffix $label $jids \ -command -state] if {[llength $command_list] > 1} { set m2 [menu $m.$i -tearoff 0] $m add cascade -label $label -menu $m2 foreach jid_command $command_list { lassign $jid_command jid command $m2 add command -label $jid \ -command [lindex $command 0] \ -state [lindex $command 1] } } else { lassign [lindex [lindex $command_list 0] 1] command state $m add command -label $label \ -command $command \ -state $state } } proc roster::add_checkbutton_submenu {m prefix suffix i label jids} { set command_list [get_popup_command_list $m $prefix $suffix $label $jids \ -variable -command -state] if {[llength $command_list] > 1} { set m2 [menu $m.$i -tearoff 0] $m add cascade -label $label -menu $m2 foreach jid_command $command_list { lassign $jid_command jid command $m2 add checkbutton -label $jid \ -variable [lindex $command 0] \ -command [lindex $command 1] \ -state [lindex $command 2] } } else { lassign [lindex [lindex $command_list 0] 1] var command state $m add checkbutton -label $label \ -variable $var \ -command $command \ -state $state } } proc roster::add_radiobutton_submenu {m prefix suffix i label jids} { set command_list [get_popup_command_list $m $prefix $suffix $label $jids \ -value -variable -command -state] if {[llength $command_list] > 1} { set m2 [menu $m.$i -tearoff 0] $m add cascade -label $label -menu $m2 foreach jid_command $command_list { lassign $jid_command jid command $m2 add radiobutton -label $jid \ -value [lindex $command 0] \ -variable [lindex $command 1] \ -command [lindex $command 2] \ -state [lindex $command 3] } } else { lassign [lindex [lindex $command_list 0] 1] value var command state $m add radiobutton -label $label \ -value $value \ -variable $var \ -command $command \ -state $state } } ############################################################################### proc roster::add_separator {m xlib jid} { $m add separator } ############################################################################### proc roster::jid_popup_menu {xlib jid} { if {[winfo exists [set m .jidpopupmenu]]} { destroy $m } menu $m -tearoff 0 hook::run roster_jid_popup_menu_hook $m $xlib $jid return $m } hook::add roster_jid_popup_menu_hook \ [namespace current]::roster::add_separator 40 hook::add roster_jid_popup_menu_hook \ [namespace current]::roster::add_separator 50 hook::add roster_jid_popup_menu_hook \ [namespace current]::roster::add_separator 70 hook::add roster_jid_popup_menu_hook \ [namespace current]::roster::add_separator 85 ############################################################################### proc roster::conference_popup_menu {xlib jid} { if {[winfo exists [set m .confpopupmenu]]} { destroy $m } menu $m -tearoff 0 hook::run roster_conference_popup_menu_hook $m $xlib $jid return $m } hook::add roster_conference_popup_menu_hook \ [namespace current]::roster::add_separator 50 hook::add roster_conference_popup_menu_hook \ [namespace current]::roster::add_separator 70 hook::add roster_conference_popup_menu_hook \ [namespace current]::roster::add_separator 85 ############################################################################### proc roster::service_popup_menu {xlib jid} { if {[winfo exists [set m .servicepopupmenu]]} { destroy $m } menu $m -tearoff 0 hook::run roster_service_popup_menu_hook $m $xlib $jid return $m } hook::add roster_service_popup_menu_hook \ [namespace current]::roster::add_separator 50 hook::add roster_service_popup_menu_hook \ [namespace current]::roster::add_separator 70 hook::add roster_service_popup_menu_hook \ [namespace current]::roster::add_separator 85 ############################################################################### proc roster::create_groupchat_user_menu {xlib jid} { if {[winfo exists [set m .groupchatpopupmenu]]} { destroy $m } menu $m -tearoff 0 hook::run roster_create_groupchat_user_menu_hook $m $xlib $jid return $m } hook::add roster_create_groupchat_user_menu_hook \ [namespace current]::roster::add_separator 40 hook::add roster_create_groupchat_user_menu_hook \ [namespace current]::roster::add_separator 50 ############################################################################### proc roster::create_group_popup_menu {xlib name} { variable options variable chats_group_name if {$name == $chats_group_name} { set state disabled } else { set state normal } if {[winfo exists [set m .grouppopupmenu]]} { destroy $m } if {$options(nested)} { set oname [msplit $name $options(nested_delimiter)] } else { set oname $name } menu $m -tearoff 0 $m add command \ -label [::msgcat::mc "Send message to all users in group..."] \ -command [list ::message::send_dialog \ -to $name -group 1 -connection $xlib] $m add command \ -label [::msgcat::mc "Resubscribe to all users in group..."] \ -command [list ::roster::resubscribe_group $xlib $name] add_group_custom_presence_menu $m $xlib $name $m add checkbutton -label [::msgcat::mc "Show offline users"] \ -variable \ [namespace current]::roster(show_offline,[list $xlib $oname]) \ -command [list [namespace current]::redraw_after_idle] $m add command -label [::msgcat::mc "Rename group..."] \ -command [list [namespace current]::rename_group_dialog $xlib $name] \ -state $state $m add command -label [::msgcat::mc "Remove group..."] \ -command [list [namespace current]::remove_group_dialog $xlib $name] \ -state $state $m add command -label [::msgcat::mc "Remove all users in group..."] \ -command [list [namespace current]::remove_users_group_dialog \ $xlib $name] set last [$m index end] ::hook::run roster_group_popup_menu_hook $m $xlib $name if {[$m index end] > $last} { $m insert [expr $last + 1] separator } return $m } ############################################################################### proc roster::remove_group_dialog {xlib name} { set res [MessageDlg .remove_item -aspect 50000 -icon question -type user \ -buttons {yes no} -default 0 -cancel 1 \ -message [::msgcat::mc "Are you sure to remove group '%s'\ from roster? \n(Users which are in\ this group only, will be in undefined\ group.)" $name]] if {$res == 0} { roster::send_rename_group $xlib $name "" } } proc roster::remove_users_group_dialog {xlib name} { set res [MessageDlg .remove_item -aspect 50000 -icon question -type user \ -buttons {yes no} -default 0 -cancel 1 \ -message [::msgcat::mc "Are you sure to remove all users in\ group '%s' from roster? \n(Users\ which are not in this group only,\ will be removed from the roster as\ well.)" $name]] if {$res == 0} { roster::send_remove_users_group $xlib $name } } proc roster::rename_group_dialog {xlib name} { global new_roster_group_name set new_roster_group_name $name set w .roster_group_rename if {[winfo exists $w]} { destroy $w } Dialog $w -title [::msgcat::mc "Rename roster group"] \ -anchor e \ -default 0 \ -cancel 1 $w add -text [::msgcat::mc "OK"] -command \ [list [namespace current]::confirm_rename_group $w $xlib $name] $w add -text [::msgcat::mc "Cancel"] -command [list destroy $w] set p [$w getframe] Label $p.lgroupname -text [::msgcat::mc "New group name:"] Entry $p.groupname -textvariable new_roster_group_name grid $p.lgroupname -row 0 -column 0 -sticky e grid $p.groupname -row 0 -column 1 -sticky ew focus $p.groupname $w draw } proc roster::confirm_rename_group {w xlib name} { global new_roster_group_name variable roster destroy $w ::roster::send_rename_group $xlib $name $new_roster_group_name set gid [list $xlib $name] set newgid [list $xlib $new_roster_group_name] if {[info exists roster(collapsed,$gid)]} { set roster(collapsed,$newgid) $roster(collapsed,$gid) unset roster(collapsed,$gid) } if {[info exists roster(show_offline,$gid)]} { set roster(show_offline,$newgid) $roster(show_offline,$gid) unset roster(show_offline,$gid) } } proc roster::add_group_by_jid_regexp_dialog {} { global new_roster_group_rname global new_roster_group_regexp set w .roster_group_add_by_jid_regexp if {[winfo exists $w]} { destroy $w } Dialog $w -title [::msgcat::mc "Add roster group by JID regexp"] \ -anchor e -default 0 -cancel 1 $w add -text [::msgcat::mc "OK"] -command " destroy [list $w] roster::add_group_by_jid_regexp \ \$new_roster_group_rname \$new_roster_group_regexp " $w add -text [::msgcat::mc "Cancel"] -command [list destroy $w] set p [$w getframe] Label $p.lgroupname -text [::msgcat::mc "New group name:"] Entry $p.groupname -textvariable new_roster_group_rname Label $p.lregexp -text [::msgcat::mc "JID regexp:"] Entry $p.regexp -textvariable new_roster_group_regexp grid $p.lgroupname -row 0 -column 0 -sticky e grid $p.groupname -row 0 -column 1 -sticky ew grid $p.lregexp -row 1 -column 0 -sticky e grid $p.regexp -row 1 -column 1 -sticky ew focus $p.groupname $w draw } ############################################################################### proc roster::add_group_custom_presence_menu {m xlib name} { set mm [menu $m.custom_presence -tearoff 0] $mm add command -label [::msgcat::mc "Available"] \ -command [list roster::send_custom_presence_group $xlib $name \ available] $mm add command -label [::msgcat::mc "Free to chat"] \ -command [list roster::send_custom_presence_group $xlib $name chat] $mm add command -label [::msgcat::mc "Away"] \ -command [list roster::send_custom_presence_group $xlib $name away] $mm add command -label [::msgcat::mc "Extended away"] \ -command [list roster::send_custom_presence_group $xlib $name xa] $mm add command -label [::msgcat::mc "Do not disturb"] \ -command [list roster::send_custom_presence_group $xlib $name dnd] $mm add command -label [::msgcat::mc "Unavailable"] \ -command [list roster::send_custom_presence_group $xlib $name \ unavailable] $m add cascade -label [::msgcat::mc "Send custom presence"] -menu $mm } ############################################################################### # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/ifacetk/systray.tcl000064400000000000000000000243111477701321300157020ustar00nobodynobody# systray.tcl -- # # This file is a part of the Tkabber XMPP client. It implements # infrastructure for tray icon support. # # See also plugins/unix/tktray.tcl, plugins/unix/systray.tcl, # plugins/unix/dokingtray.tcl, plugins/windows/taskbar.tcl. namespace eval systray { variable saved_state normal variable saved_geometry variable balloon "" variable s2p array set s2p {} variable icons {} variable options custom::defgroup Systray [::msgcat::mc "Systray icon options."] \ -group IFace custom::defvar options(display_status) 0 \ [::msgcat::mc "Display status tooltip when main window is minimized\ to systray."] \ -group Systray -type boolean custom::defvar options(blink_type) 100 \ [::msgcat::mc "Systray icon blinks when there are unread messages."] \ -group Systray -type options \ -values [list 1 [::msgcat::mc "On any messages (including\ service messages)"] \ 2 [::msgcat::mc "On conference and personal\ messages"] \ 3 [::msgcat::mc "On personal messages only"] \ 100 [::msgcat::mc "Turn blinking off"]] custom::defvar options(display_muc_change) 1 \ [::msgcat::mc "Change icon on server and enter/exit groupchat\ messages."] \ -group Systray -type boolean custom::defvar options(display_muc_others) 1 \ [::msgcat::mc "Change icon on other users groupchat messages."] \ -group Systray -type boolean } ########################################################################## proc systray::token {icon} { return [namespace current]::$icon } ########################################################################## proc systray::create {icon args} { global curuserstatus variable icons set token [token $icon] if {[info exists $token]} { return -code error "Systray icon $icon exists" } lappend icons $icon upvar 0 $token state array set state {create "" configure "" destroy "" tray ""} foreach {key val} $args { switch -- $key { -createcommand { set state(create) $val } -configurecommand { set state(configure) $val } -destroycommand { set state(destroy) $val } -locationcommand { set state(location) $val } } } uplevel #0 $state(create) [list $icon] update $icon ::curuserstatus update $icon ::tabcolors foreach var [list curuserstatus tabcolors] { trace add variable ::$var write [namespace code [list update $icon]] } } ########################################################################## proc systray::destroy {icon} { variable icons catch { upvar 0 [token $icon] state uplevel #0 $state(destroy) [list $icon] unset state set id [lsearch -exact $icons $icon] if {$id >= 0} { set icons [lreplace $icons $id $id] } } foreach var [list curuserstatus tabcolors] { trace remove variable ::$var write [namespace code [list update $icon]] } } ########################################################################## proc systray::popupmenu {m} { set tearoff [set [namespace parent]::options(show_tearoffs)] menu $m -title [::msgcat::mc "Tkabber Systray"] -tearoff $tearoff $m add command -label [::msgcat::mc "About"] \ -command [list [namespace parent]::about_window] $m add separator hook::run systray_menu_hook $m return $m } ########################################################################## # Withdraws the main Tkabber window from the screen: proc systray::withdraw {} { variable saved_state variable saved_geometry if {[wmstate .] eq "withdrawn"} return set saved_state [wmstate .] set saved_geometry [wm geometry .] wm withdraw . } # Iconifies the main Tkabber window: proc systray::iconify {} { if {[wmstate .] eq "iconic"} return wm iconify . } # De-withdraws the main Tkabber window: proc systray::reshow {} { variable saved_state variable saved_geometry if {[wmstate .] ne "withdrawn"} return if {[info exists saved_state]} { if {$saved_state != "zoomed" && [info exists saved_geometry]} { wm geometry . $saved_geometry } wmstate . $saved_state } else { if {[info exists saved_geometry]} { wm geometry . $saved_geometry } wmstate . normal } wm deiconify . } # Restores the main Tkabber window from iconic or withdrawn states: proc systray::restore {} { switch -- [wmstate .] { iconic { wm deiconify . } withdrawn { reshow } default { wm deiconify . } } raise . hook::run restore_main_window_hook } proc systray::toggle_state {} { switch -- [wmstate .] { zoomed - normal { withdraw } iconic - withdrawn - default { restore } } } ########################################################################## proc systray::wm_win_iconify {action} { variable icons if {$action == "systray"} { if {[llength $icons] > 0} { toggle_state } return stop } } hook::add protocol_wm_delete_window_hook \ [namespace current]::systray::wm_win_iconify 40 ########################################################################## proc systray::quit {} { variable icons foreach icon $icons { destroy $icon } } hook::add quit_hook [namespace current]::systray::quit ########################################################################## proc systray::update {icon name1 {name2 ""} {op ""}} { global curuserstatus upvar 0 [token $icon] state if {![info exists state(tray)]} return switch -- [string trimleft $name1 :] { curuserstatus { if {$state(tray) == ""} { uplevel #0 $state(configure) [list $icon $curuserstatus] } } tabcolors { toggle $icon 1 } } } ########################################################################## proc systray::toggle {icon ff} { global curuserstatus tabcolors variable options upvar 0 [token $icon] state if {![info exists state(tray)]} return if {![winfo exists $icon]} return if {$state(tray) ne ""} { after cancel $state(tray) set state(tray) "" } set hitP 0 foreach {k v} [array get tabcolors] { if {[.nb index $k] < 0} { continue } if {($v ne "") && ($v > $hitP)} { set hitP $v } } if {($hitP == 0) || (($hitP == 1) && !$options(display_muc_change)) || (($hitP == 2) && !$options(display_muc_others))} { update $icon ::curuserstatus return } if {$options(blink_type) <= $hitP} { set state(tray) \ [after 500 [list [namespace current]::toggle $icon [expr {!$ff}]]] if {$ff} { uplevel #0 $state(configure) [list $icon message$hitP] } else { uplevel #0 $state(configure) [list $icon blank] } } else { set state(tray) message uplevel #0 $state(configure) [list $icon message$hitP] } } ########################################################################## proc systray::set_status {text} { variable options variable icons variable balloon if {!$options(display_status)} return if {[llength $icons] == 0} return set icon [lindex $icons 0] upvar 0 [token $icon] state switch -- [wmstate .] { normal { } default { if {[info exists balloon] && ($balloon != "")} { after cancel $balloon set balloon "" } if {![winfo exists $icon]} { return } balloon::set_text $text if {[info exists state(location)]} { lassign [uplevel #0 $state(location) [list $icon]] x y } else { set x [winfo rootx $icon] set y [winfo rooty $icon] } balloon::show $x $y set balloon [after 15000 balloon::destroy] } } } hook::add set_status_hook [namespace current]::systray::set_status ########################################################################## proc systray::clear_status {} { variable options variable icons variable balloon if {!$options(display_status)} return if {[llength $icons] == 0} return if {[info exists balloon] && ($balloon != "")} { after cancel $balloon set balloon "" } balloon::destroy } hook::add clear_status_hook [namespace current]::systray::clear_status ########################################################################## proc systray::balloon {icon} { return [list $icon [balloon_text]] } ########################################################################## proc systray::balloon_text {} { global userstatusdesc textstatus if {![string equal $textstatus ""]} { set status $textstatus } else { set status $userstatusdesc } return "Tkabber: $status" } ########################################################################## proc systray::create_menu {m} { $m add command -label [::msgcat::mc "Log in..."] \ -command ::ifacetk::login_dialog $m add command -label [::msgcat::mc "Log out"] \ -command ::ifacetk::logout_dialog $m add command -label [::msgcat::mc "Log out with reason..."] \ -command show_logout_dialog $m add separator $m add command -label [::msgcat::mc "Show main window"] \ -command [namespace code restore] $m add command -label [::msgcat::mc "Hide main window"] \ -command [namespace code withdraw] $m add separator $m add command -label [::msgcat::mc "Quit"] -command quit } hook::add systray_menu_hook \ [namespace current]::systray::create_menu # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/ifacetk/unix.tcl000064400000000000000000000146641477701321300151610ustar00nobodynobody# unix.tcl -- # # This file is a part of the Tkabber XMPP client. It add the # default XRDB options for the Tkabber widgets on Unix. set priority 21 # Scrollbar bed color option add *troughColor #cccccc $priority option add *background #dddddd $priority option add *readonlyBackground #dddddd $priority option add *foreground #000000 $priority option add *disabledForeground #888888 $priority option add *errorForeground firebrick $priority # Colors, which are used when mouse is over the item option add *activeBackground #ebebeb $priority option add *activeForeground #000000 $priority # Colors and border width selected item option add *selectBackground #d1eeee $priority option add *selectForeground #000000 $priority option add *selectBorderWidth 0 $priority option add *inactiveSelectBackground #d1eeee $priority # Color for checkboxes and radiobuttons option add *selectColor #f4f4f4 $priority option add *Menu*selectColor #000000 $priority # Color of traversal highlight rectangle option add *highlightBackground #dddddd $priority option add *highlightColor #666666 $priority # Color of insertion cursor option add *insertBackground #000000 $priority # Depth of scrollbars option add *Scrollbar*borderWidth [winfo pixels . 0.25m] $priority option add *Scrollbar*elementBorderWidth [winfo pixels . 0.25m] $priority # Menu border option add *Menu*borderWidth [winfo pixels . 0.25m] $priority # Progressbars are used in the splash screen and in the file transfer dialogs option add *ProgressBar.foreground #334080 $priority option add *ProgressBar*borderWidth [winfo pixels . 0.25m] $priority # Flatten Spinbox, ComboBox and ArrowButton option add *Spinbox.borderWidth [winfo pixels . 0.25m] $priority option add *Spinbox.background #eeeeee $priority option add *Spinbox.buttonBackground #dddddd $priority option add *Spinbox.disabledBackground #dddddd $priority option add *SpinBox.borderWidth [winfo pixels . 0.25m] $priority option add *SpinBox*Entry*highlightBackground #eeeeee $priority option add *ComboBox.borderWidth [winfo pixels . 0.25m] $priority option add *ArrowButton.borderWidth 0 $priority option add *ArrowButton.highlightThickness 0 $priority # Colors for multicolumn listboxes (as in search result window) option add *Mclistbox.background #eeeeee $priority option add *Mclistbox.labelActiveBackground #ebebeb $priority option add *Mclistbox.labelBackground #dddddd $priority option add *Mclistbox*borderWidth [winfo pixels . 0.25m] $priority option add *Mclistbox.highlightThickness [winfo pixels . 0.25m] $priority # Tree widget colors (service discovery) option add *Tree*background #eeeeee $priority option add *Tree*borderWidth [winfo pixels . 0.25m] $priority option add *Tree.highlightThickness [winfo pixels . 0.25m] $priority # Roster background option add *Roster.cbackground #eeeeee $priority option add *Roster.jidfill #eeeeee $priority option add *Roster.jidborder #eeeeee $priority option add *Roster.connectionfill #eeeeee $priority option add *Roster.connectioncfill #eeeeee $priority # Discovery tree branches color # Colors for browser and discovery service windows option add *JBrowser.fill #000000 $priority option add *JBrowser.activefill #000000 $priority option add *JBrowser.border #eeeeee $priority option add *JBrowser.nscolor #666666 $priority option add *JBrowser.nsactivecolor #666666 $priority option add *JBrowser.highlightThickness [winfo pixels . 0.25m] $priority option add *JDisco.fill #000000 $priority option add *JDisco.activefill #000000 $priority option add *JDisco.border #eeeeee $priority option add *JDisco.featurecolor #666666 $priority option add *JDisco.identitycolor DarkGreen $priority option add *JDisco.optioncolor DarkViolet $priority option add *JDisco.highlightThickness [winfo pixels . 0.25m] $priority option add *linesfill #000000 $priority option add *crossfill #000000 $priority # Tooltip options option add *Balloon*background #ffeeaa $priority option add *Balloon*foreground #000000 $priority option add *DynamicHelp.background #ffeeaa $priority option add *DynamicHelp.foreground #000000 $priority # Listbox colors (various lists) option add *Listbox.background #eeeeee $priority option add *Listbox.foreground #000000 $priority option add *Listbox.borderWidth [winfo pixels . 0.25m] $priority # Text main colors option add *Chat*Text*Label.background #eeeeee $priority option add *Text.background #eeeeee $priority option add *Text.foreground #000000 $priority option add *Text.borderWidth [winfo pixels . 0.25m] $priority option add *Text.highlightThickness [winfo pixels . 0.25m] $priority # Entry colors (ordinary and inside notebooks) option add *Entry.background #eeeeee $priority option add *Entry.foreground #000000 $priority option add *Entry.borderWidth [winfo pixels . 0.25m] $priority option add *Entry.highlightThickness [winfo pixels . 0.25m] $priority option add *NoteBook*Entry.background #eeeeee $priority option add *NoteBook*Entry.disabledBackground #dddddd $priority option add *NoteBook*Entry.readonlyBackground #dddddd $priority option add *NoteBook*Entry.foreground #000000 $priority option add *Button.borderWidth [winfo pixels . 0.25m] $priority option add *Button.highlightThickness [winfo pixels . 0.25m] $priority option add *Radiobutton.highlightThickness [winfo pixels . 0.25m] $priority option add *Checkbutton.highlightThickness [winfo pixels . 0.25m] $priority option add *Menu.activeBorderWidth [winfo pixels . 0.25m] $priority option add *Menu.borderWidth [winfo pixels . 0.25m] $priority option add *Menubutton.borderWidth [winfo pixels . 0.25m] $priority option add *Buttonbox*borderWidth 0 $priority option add *Buttonbox*activeBorderWidth 0 $priority option add *Customize.Text.Button.foreground black $priority option add *Scrollbar.width [winfo pixels . 2.5m] $priority # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/iq.tcl000064400000000000000000000033371477701321300131740ustar00nobodynobody# iq.tcl -- # # This file is a part of the Tkabber XMPP client. It provides very # general command client:iq which takes the IQ packet from the # TclXMPP library and runs an appropriate hook for it. namespace eval ::iq { variable options custom::defgroup IQ [::msgcat::mc "Info/Query options."] \ -group Tkabber custom::defvar options(show_iq_requests) 0 \ [::msgcat::mc "Show IQ requests in the status line."] \ -group IQ \ -type boolean custom::defvar options(shorten_iq_namespaces) 1 \ [::msgcat::mc "Strip leading \"http://jabber.org/protocol/\"\ from IQ namespaces in the status line."] \ -group IQ \ -type boolean } proc client:iq {xlib from type queries args} { debugmsg iq "$xlib $from $type $queries $args" eval {hook::run client_iq_hook $xlib $from $type $queries} $args } proc ::iq::show_iq_in_status {xlib from type queries args} { variable options if {$type != "set" && $type != "get"} return ::xmpp::xml::split [lindex $queries 0] tag xmlns attrs cdata subels if {$options(show_iq_requests) && \ ($from != "" && \ !([::xmpp::jid::equal $from [connection_server $xlib]] || \ [::xmpp::jid::equal $from [connection_bare_jid $xlib]] || \ [::xmpp::jid::equal $from [connection_jid $xlib]]))} { set xmlns_short $xmlns if {$options(shorten_iq_namespaces)} { regexp "^http://jabber.org/protocol/(.*)" $xmlns -> xmlns } set_status [::msgcat::mc "%s request from %s" $xmlns $from] } } hook::add client_iq_hook ::iq::show_iq_in_status plugins::load [file join plugins iq] # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/login.tcl000064400000000000000000001023451477701321300136720ustar00nobodynobody# login.tcl -- # # This file is a part of the Tkabber XMPP client. It implements the # login logic and options. package require xmpp::dns package require xmpp::auth package require xmpp::register if {[catch {package require xmpp::starttls}]} { set use_tls 0 } else { set use_tls 1 } if {[catch {package require xmpp::compress}]} { set have_compress 0 } else { set have_compress 1 } if {[catch {package require xmpp::sasl}]} { set have_sasl 0 } else { set have_sasl 1 } if {[catch {package require xmpp::transport::bosh}]} { set have_bosh 0 } else { set have_bosh 1 } if {[catch {package require xmpp::transport::poll}]} { set have_http_poll 0 } else { set have_http_poll 1 } custom::defgroup Warnings [::msgcat::mc "Warning display options."] \ -group Tkabber if {$use_tls} { custom::defvar tls_warnings 1 [::msgcat::mc "Display SSL warnings."] \ -group Warnings -type boolean } custom::defgroup Login \ [::msgcat::mc "Login options."] \ -group Tkabber custom::defvar autologin 0 \ [::msgcat::mc "Whether to automatically login to server or\ show the login window."] \ -group Login -type options \ -values [list 0 [::msgcat::mc "Show the login window"] \ 1 [::msgcat::mc "Autologin to the server"] \ -1 [::msgcat::mc "Don't show the login window"]] custom::defvar loginconf(user) "" \ [::msgcat::mc "User name."] \ -group Login -type string custom::defvar loginconf(server) "localhost" \ [::msgcat::mc "Server name."] \ -group Login -type string custom::defvar loginconf(password) "" \ [::msgcat::mc "Password."] \ -group Login -type password custom::defvar loginconf(resource) "tkabber" \ [::msgcat::mc "Resource."] \ -group Login -type string custom::defvar loginconf(priority) "8" \ [::msgcat::mc "Priority."] \ -group Login -type integer custom::defvar loginconf(connect_forever) 0 \ [::msgcat::mc "Retry to connect forever."] \ -group Login -type boolean # the default sequence goes: 15s, 30s, 1min, 2min, 4min, 8min, # 16min, 32min, 32min... custom::defvar loginconf(max_reconnect_interval) 32 \ [::msgcat::mc "Maximum time interval between unsuccessful connection\ retries to the server (in minutes)."] \ -group Login -type integer custom::defvar loginconf(allowauthplain) 0 \ [::msgcat::mc "Allow plaintext authentication mechanisms (when password\ is transmitted unencrypted)."] \ -group Login -type boolean if {$have_sasl} { custom::defvar loginconf(usesasl) 1 \ [::msgcat::mc "Use SASL authentication."] \ -group Login -type boolean } set values [list plaintext [::msgcat::mc "Plaintext"]] if {$have_compress} { lappend values compressed [::msgcat::mc "Compression"] } if {$use_tls} { lappend values encrypted [::msgcat::mc "Encryption (STARTTLS)"] \ ssl [::msgcat::mc "Encryption (legacy SSL)"] } if {$use_tls || $have_compress} { custom::defvar loginconf(stream_options) plaintext \ [::msgcat::mc "XMPP stream options when connecting to server."] \ -group Login -type options \ -values $values } if {$use_tls} { custom::defvar loginconf(sslcertfile) "" \ [::msgcat::mc "SSL client certificate file bundled with private\ key (optional)."] \ -group Login -type file custom::defvar loginconf(sslcacertstore) \ [expr {$tcl_platform(platform) eq "unix"? "/etc/ssl/certs" : ""}] \ [::msgcat::mc "SSL certification authority file or\ directory (optional)."] \ -group Login -type file } custom::defvar loginconf(usealtserver) 0 \ [::msgcat::mc "Use explicitly-specified server address and port."] \ -group Login -type boolean custom::defvar loginconf(altserver) "" \ [::msgcat::mc "Server name or IP-address."] \ -group Login -type string custom::defvar loginconf(altport) "5222" \ [::msgcat::mc "Server port."] \ -group Login -type integer custom::defvar loginconf(replace_opened) 1 \ [::msgcat::mc "Replace opened connections."] \ -group Login -type boolean custom::defvar loginconf(stream_management) 1 \ [::msgcat::mc "Use stream management protocol to acknowledge any stanza\ received from and sent to the server."] \ -group Login -type boolean if {$have_bosh} { custom::defvar loginconf(usebosh) 0 \ [::msgcat::mc "Use BOSH connection method."] \ -group Login -type boolean custom::defvar loginconf(boshurl) "" \ [::msgcat::mc "URL to connect to using BOSH."] \ -group Login -type string custom::defvar loginconf(useboshkeys) 1 \ [::msgcat::mc "Use BOSH client security keys (recommended)."] \ -group Login -type boolean custom::defvar loginconf(numberofboshkeys) 100 \ [::msgcat::mc "Number of BOSH client security keys to send\ before creating new key sequence."] \ -group Login -type integer custom::defvar loginconf(boshtimeout) 0 \ [::msgcat::mc "Timeout for waiting for BOSH responses (if set\ to zero, Tkabber will wait forever)."] \ -group Login -type integer custom::defvar loginconf(boshwait) 30000 \ [::msgcat::mc "Interval server can wait before responding to BOSH\ request (in milliseconds)."] \ -group Login -type integer custom::defvar loginconf(boshhold) 1 \ [::msgcat::mc "Maximum number of requests the connection manager is\ allowed to keep waiting at any time."] \ -group Login -type integer } if {$have_http_poll} { custom::defvar loginconf(usehttppoll) 0 \ [::msgcat::mc "Use HTTP poll connection method."] \ -group Login -type boolean custom::defvar loginconf(pollurl) "" \ [::msgcat::mc "URL to connect to."] \ -group Login -type string custom::defvar loginconf(usepollkeys) 1 \ [::msgcat::mc "Use HTTP poll client security keys (recommended)."] \ -group Login -type boolean custom::defvar loginconf(numberofpollkeys) 100 \ [::msgcat::mc "Number of HTTP poll client security keys to send\ before creating new key sequence."] \ -group Login -type integer custom::defvar loginconf(polltimeout) 0 \ [::msgcat::mc "Timeout for waiting for HTTP poll responses (if set\ to zero, Tkabber will wait forever)."] \ -group Login -type integer custom::defvar loginconf(pollmin) 6000 \ [::msgcat::mc "Minimum poll interval."] \ -group Login -type integer custom::defvar loginconf(pollmax) 60000 \ [::msgcat::mc "Maximum poll interval."] \ -group Login -type integer } custom::defvar reasonlist {} [::msgcat::mc "List of logout reasons."] \ -group Hidden ###################################################################### # connect errors mapping array set connect_error [list \ err_unknown [::msgcat::mc "Unknown error"] \ timeout [::msgcat::mc "Timeout"] \ network-failure [::msgcat::mc "Network failure"] \ err_authorization_required \ [::msgcat::mc "Proxy authentication required"] \ err_version [::msgcat::mc "Incorrect SOCKS version"] \ err_unsupported_method [::msgcat::mc "Unsupported SOCKS method"] \ err_authentication_unsupported \ [::msgcat::mc "Unsupported SOCKS authentication method"] \ err_authorization [::msgcat::mc "SOCKS authentication failed"] \ rsp_failure [::msgcat::mc "SOCKS request failed"] \ rsp_errconnect \ [::msgcat::mc "SOCKS server cannot identify username"] \ rsp_erruserid \ [::msgcat::mc "SOCKS server username identification failed"] \ rsp_notallowed \ [::msgcat::mc "SOCKS connection not allowed by ruleset"] \ rsp_netunreachable [::msgcat::mc "Network unreachable"] \ rsp_hostunreachable [::msgcat::mc "Host unreachable"] \ rsp_refused [::msgcat::mc "Connection refused by destination host"] \ rsp_expired [::msgcat::mc "TTL expired"] \ rsp_cmdunsupported [::msgcat::mc "SOCKS command not supported"] \ rsp_addrunsupported \ [::msgcat::mc "Address type not supported by SOCKS proxy"] \ err_unknown_address_type [::msgcat::mc "Unknown address type"]] # TLS info # # [::msgcat::mc "Certificate has expired"] # [::msgcat::mc "Self signed certificate"] ###################################################################### if {![info exists connections]} { set connections {} } proc connections {{all 0}} { global connections set res {} foreach c $connections { if {$all || [lindex $c 1]} { lappend res [lindex $c 0] } } return $res } proc add_to_connection {active xlib} { global connections set idx [lsearch -exact $connections [list $xlib 0]] set connections [lreplace $connections $idx $idx] set idx [lsearch -exact $connections [list $xlib 1]] set connections [lreplace $connections $idx $idx] lappend connections [list $xlib $active] } hook::add connected_hook [list add_to_connection 1] 1 proc remove_from_connection {xlib} { global connections set idx [lsearch -exact $connections [list $xlib 0]] set connections [lreplace $connections $idx $idx] set idx [lsearch -exact $connections [list $xlib 1]] set connections [lreplace $connections $idx $idx] } hook::add disconnected_hook remove_from_connection 1 proc connection_jid {xlib} { global connjid return $connjid($xlib) } proc connection_bare_jid {xlib} { global connjid return [::xmpp::jid::stripResource $connjid($xlib)] } proc connection_user {xlib} { global connjid return [::xmpp::jid::node $connjid($xlib)] } proc connection_server {xlib} { global connjid return [::xmpp::jid::server $connjid($xlib)] } proc connection_resource {xlib} { global connjid return [::xmpp::jid::resource $connjid($xlib)] } proc connection_requested_jid {xlib} { global connrjid return $connrjid($xlib) } proc connection_requested_user {xlib} { global connrjid return [::xmpp::jid::node $connrjid($xlib)] } proc connection_requested_server {xlib} { global connrjid return [::xmpp::jid::server $connrjid($xlib)] } proc connection_requested_resource {xlib} { global connrjid return [::xmpp::jid::resource $connrjid($xlib)] } ###################################################################### proc login {logindata} { global login_after_id array set lc $logindata set jid [::xmpp::jid::normalize [::xmpp::jid::jid $lc(user) \ $lc(server) \ $lc(resource)]] set lc(jid) $jid set logindata [array get lc] if {[info exists login_after_id($jid)]} { after cancel $login_after_id($jid) unset login_after_id($jid) } login_log $jid ok [::msgcat::mc "Starting login"] debugmsg login "Starting login ($jid)" set_status [::msgcat::mc "Connecting to %s" $lc(server)] login_connect $logindata } proc login_connected {xlib logindata status msg} { global connect_error global login_after_time array set lc $logindata switch -- $status { ok { # OK, connected. add_to_connection 0 $xlib debugmsg login "Connect successful $xlib" set login_after_time 7500 login_login $xlib $logindata } abort { # TODO debugmsg login "Connect aborted: $xlib $msg" login_log $lc(jid) abort $msg } default { # Nasty thing has happened. # $msg contains error message here. debugmsg login "Failed to connect: $xlib $status $msg" login_log $lc(jid) $status $msg if {$lc(connect_forever)} { login_retry $logindata } else { if {[winfo exists .connect_err]} { destroy .connect_err } if {[info exists connect_error($msg)]} { set msg $connect_error($msg) } set res [MessageDlg .connect_err -width 600 -icon error \ -message [::msgcat::mc "Failed to connect: %s" $msg] \ -type user \ -buttons [list abort [::msgcat::mc "Keep trying"]] \ -default 0 -cancel 0] if {$res} { set lc(connect_forever) 1 set logindata [array get lc] login_retry $logindata } } } } } proc login_retry {logindata} { global login_after_time global login_after_id array set lc $logindata if {![info exists login_after_time]} { set login_after_time 7500 } if {$login_after_time == 7500 || \ $login_after_time < $lc(max_reconnect_interval) * 60 * 1000} { # the default sequence goes: 15s, 30s, 1min, 2min, 4min, 8min, # 16min, 32min, 32min... set login_after_time \ [expr {min($login_after_time * 2, $lc(max_reconnect_interval) * 60 * 1000)}] } array set lc $logindata set jid $lc(jid) debugmsg login "Scheduling connect retry for $jid in ${login_after_time}ms" if {[info exists login_after_id($jid)]} { after cancel $login_after_id($jid) unset login_after_id($jid) } login_retry1 $login_after_time $jid $logindata } proc login_retry1 {interval jid logindata} { global login_after_id incr interval -1000 if {$interval <= 0} { login $logindata } else { set login_after_id($jid) \ [after 1000 [list login_retry1 $interval $jid $logindata]] set_status [::msgcat::mc "Login retry for %s in %s" $jid \ [format_time [expr {$interval/1000}]]] } } proc client:tls_callback {xlib args} { global tls_result tls_warnings global ssl_certificate_fields global tls_warning_info switch -- [lindex $args 0] { info { set_status [lindex $args 4] } verify { if {[set reason [lindex $args 5]] eq ""} { return 1 } set info [::msgcat::mc [string totitle $reason 0 0]] append tls_warning_info($xlib) "$info\n" if {!$tls_warnings} { return 1 } append info [::msgcat::mc ". Proceed?\n\n"] foreach {k v} [lindex $args 3] { switch -- $k { subject - issuer { set v [regsub -all {\s*[/,]\s*(\w+=)} $v \n\t\\1] } } if {$v ne ""} { if {[info exists ssl_certificate_fields($k)]} { append info [format "%s: %s\n" \ $ssl_certificate_fields($k) $v] } else { append info [format "%s: %s\n" $k $v] } } } set blocking [fconfigure [set fd [lindex $args 1]] -blocking] fconfigure $fd -blocking 1 set readable [fileevent $fd readable] fileevent $fd readable {} set res [MessageDlg .tls_callback -aspect 50000 -icon warning \ -type user -buttons {yes no} -default 1 \ -cancel 1 \ -message [string trim $info]] fileevent $fd readable $readable fconfigure $fd -blocking $blocking if {$res} { set res 0 } else { set res 1 } return $res } error { set tls_result [join [lrange $args 2 end] " "] } default { } } } proc create_xlib {jid} { global connhist connrjid connjid set njid [::xmpp::jid::normalize $jid] if {[info exists connhist($njid)] && $connhist($njid) ni [connections]} { set xlib $connhist($njid) } else { set xlib [::xmpp::new -messagecommand client:message \ -presencecommand client:presence \ -iqcommand client:iq \ -disconnectcommand client:disconnect \ -statuscommand client:status \ -errorcommand client:error \ -logcommand client:log] } if {![info exists connhist($njid)]} { set connhist($njid) $xlib } set connrjid($xlib) $jid set connjid($xlib) $jid disco::new $xlib return $xlib } proc login_connect {logindata} { global use_tls have_compress have_sasl have_bosh have_http_poll global tls_warning_info global reconnect array set lc $logindata set jid [::xmpp::jid::jid $lc(user) \ $lc(server) \ $lc(resource)] set xlib [create_xlib $jid] set tls_warning_info($xlib) "" set reconnect($xlib) 0 set ascii_server [idna::domain_toascii $lc(server)] set args {-proxyfilter ::proxy::proxyfilter} if {$have_bosh && $lc(usebosh)} { if {$lc(boshurl) != ""} { set url $lc(boshurl) } else { # TODO: Asynchronous DNS resolution if {[catch {::xmpp::dns::resolveBOSH $ascii_server} urls]} { set urls {} } if {[llength $urls] == 0} { set url "" } else { set url [lindex $urls 0] } } set transport bosh lappend args -transport bosh \ -timeout $lc(boshtimeout) \ -wait $lc(boshwait) \ -hold $lc(boshhold) \ -url $url \ -usekeys $lc(useboshkeys) \ -numkeys $lc(numberofboshkeys) \ ::xmpp::connect $xlib -command [list login_connect_result $xlib \ {} $logindata $args] \ {*}$args } elseif {$have_http_poll && $lc(usehttppoll)} { if {$lc(pollurl) != ""} { set url $lc(pollurl) } else { # TODO: Asynchronous DNS resolution if {[catch {::xmpp::dns::resolveHTTPPoll $ascii_server} urls]} { set urls {} } if {[llength $urls] == 0} { set url "" } else { set url [lindex $urls 0] } } set transport poll lappend args -transport poll \ -timeout $lc(polltimeout) \ -int $lc(pollmin) \ -min $lc(pollmin) \ -max $lc(pollmax) \ -url $url \ -usekeys $lc(usepollkeys) \ -numkeys $lc(numberofpollkeys) \ ::xmpp::connect $xlib -command [list login_connect_result $xlib \ {} $logindata $args] \ {*}$args } else { if {$lc(usealtserver)} { set hosts {} } else { # TODO: Asynchronous DNS resolution if {[catch {::xmpp::dns::resolveXMPPClient $ascii_server} hosts]} { set hosts {} } if {[llength $hosts] == 0} { set hosts [list [list $ascii_server 5222]] } } set transport tcp if {$use_tls && $lc(stream_options) == "ssl"} { set transport tls # Do some heuristic. # Traditionally legacy SSL port is 5223, # so let's add 1 to all ports from SRV reply set hosts1 {} foreach hp $hosts { lassign $hp host port lappend hosts1 [list $host [incr port]] } set hosts $hosts1 if {![catch ::tls::ciphers tls1.1]} { lappend args -tls1.1 1 } if {![catch ::tls::ciphers tls1.2]} { lappend args -tls1.2 1 } if {$lc(sslcertfile) ne ""} { lappend args -certfile $lc(sslcertfile) } if {$lc(sslcacertstore) ne ""} { lappend args -castore $lc(sslcacertstore) } lappend args -tls1 1 \ -verifycommand [list client:tls_callback $xlib] \ -infocommand [list update_tls_info $xlib] } lappend args -transport $transport if {$lc(usealtserver)} { set hosts [list [list [idna::domain_toascii $lc(altserver)] \ $lc(altport)]] } set hosts [lassign $hosts hp] lassign $hp host port global xmppTransport set xmppTransport($xlib) $transport ::xmpp::connect $xlib $host $port \ -command [list login_connect_result $xlib \ $hosts $logindata $args] \ {*}$args } } proc login_connect_result {xlib hosts logindata args status msg} { if {$status == "ok" || $status == "abort" || [llength $hosts] == 0} { login_connected $xlib $logindata $status $msg } else { set hosts [lassign $hosts hp] lassign $hp host port ::xmpp::connect $xlib $host $port \ -command [list login_connect_result $xlib \ $hosts $logindata $args] \ {*}$args } } ######################################################################## proc login_login {xlib logindata} { global use_tls have_compress have_sasl global loginconf_hist set loginconf_hist($xlib) $logindata array set lc $logindata if {($use_tls && $lc(stream_options) == "encrypted") || \ ($have_compress && $lc(stream_options) == "compressed") || \ ($have_sasl && $lc(usesasl)) || \ $lc(stream_management)} { ::xmpp::openStream $xlib $lc(server) \ -from [::xmpp::jid::jid $lc(user) $lc(server)] \ -version 1.0 \ -command [list login_login1 $xlib $logindata] } else { ::xmpp::openStream $xlib $lc(server) \ -from [::xmpp::jid::jid $lc(user) $lc(server)] \ -command [list login_login1 $xlib $logindata] } } proc login_login1 {xlib logindata status sessionid} { global use_tls have_compress if {$status != "ok"} { recv_auth_result $xlib $logindata $status $sessionid return } array set lc $logindata if {!$lc(usebosh) && !$lc(usehttppoll) && \ $use_tls && $lc(stream_options) == "encrypted"} { set opts {} if {![catch ::tls::ciphers tls1.1]} { lappend opts -tls1.1 1 } if {![catch ::tls::ciphers tls1.2]} { lappend opts -tls1.2 1 } if {$lc(sslcertfile) ne ""} { lappend opts -certfile $lc(sslcertfile) } if {$lc(sslcacertstore) ne ""} { lappend opts -castore $lc(sslcacertstore) } ::xmpp::starttls::starttls $xlib {*}$opts \ -command [list login_login2 $xlib $logindata] \ -tls1 1 \ -verifycommand [list client:tls_callback $xlib] \ -infocommand [list update_tls_info $xlib] } elseif {!$lc(usebosh) && !$lc(usehttppoll) && \ $have_compress && $lc(stream_options) == "compressed"} { ::xmpp::compress::compress $xlib \ -command [list login_login2 $xlib $logindata] } else { login_login2 $xlib $logindata $status $sessionid } } proc login_login2 {xlib logindata status sessionid} { global have_sasl if {$status != "ok"} { recv_auth_result $xlib $logindata $status $sessionid return } array set lc $logindata if {$lc(allowauthplain)} { set digest auto } else { set digest true } # Disable the X-GOOGLE-TOKEN SASL mechanism because it doesn't work anymore set disable {X-GOOGLE-TOKEN} if {$lc(stream_management)} { set sm enable } else { set sm disable } if {$have_sasl && $lc(usesasl)} { # SASL authentication ::xmpp::sasl::auth $xlib -username $lc(user) \ -password $lc(password) \ -resource $lc(resource) \ -digest $digest \ -disable $disable \ -sm $sm \ -command [list recv_auth_result $xlib \ $logindata] } else { # Non-SASL authentication ::xmpp::auth::auth $xlib -sessionid $sessionid \ -username $lc(user) \ -password $lc(password) \ -resource $lc(resource) \ -digest $digest \ -sm $sm \ -command [list recv_auth_result $xlib \ $logindata] } } ######################################################################## proc logout {{xlib {}}} { global login_after_id debugmsg login "LOGOUT $xlib" if {$xlib == {}} { foreach jid [array names login_after_id] { after cancel $login_after_id($jid) unset login_after_id($jid) } foreach xlib [connections 1] { login_log [connection_jid $xlib] ok "Logout" disconnected $xlib } } else { login_log [connection_jid $xlib] ok [::msgcat::mc "Logout"] disconnected $xlib } } proc client:disconnect {xlib} { global reconnect global loginconf_hist login_log [connection_jid $xlib] error [::msgcat::mc "Forced logout"] if {$reconnect($xlib)} { debugmsg login "RECONNECT $xlib" } else { debugmsg login "DISCONNECT $xlib" } disconnected $xlib if {$reconnect($xlib)} { after 1000 [list login $loginconf_hist($xlib)] } } proc connected {xlib logindata} { hook::run connected_hook $xlib } # TODO proc disconnected {xlib} { remove_from_login_after_id $xlib if {$xlib ni [connections]} { ::xmpp::disconnect $xlib return } hook::run disconnected_hook $xlib } hook::add disconnected_hook ::xmpp::disconnect 10 proc client:log {xlib dir type msg} { hook::run log_hook $xlib $dir $type $msg } proc remove_from_login_after_id {xlib} { global login_after_id set jid [::xmpp::jid::normalize [connection_requested_jid $xlib]] if {[info exists login_after_id($jid)]} { after cancel $login_after_id($jid) unset login_after_id($jid) } } proc recv_auth_result {xlib logindata status xml} { global connjid global reconnect array set lc $logindata switch -- $status { ok { set connjid($xlib) $xml set reconnect($xlib) 1 login_log $xml ok [::msgcat::mc "Login is successful"] connected $xlib $logindata } abort { # TODO debugmsg login \ "Authentication aborted: $xlib [error_to_string $xml]" login_log $lc(jid) abort [error_to_string $xml] logout $xlib } default { login_log $lc(jid) $status [error_to_string $xml] lassign [error_type_condition $xml] type cond if {$type eq "sasl" || $type eq "auth" && $cond eq "not-authorized"} { set res [MessageDlg [epath] -aspect 50000 -icon error \ -message [::msgcat::mc "Authentication failed:\ %s\nCreate new account?" \ [error_to_string $xml]] \ -type user -buttons {yes no} -default 0 -cancel 1] if {!$res} { ::register::open $xlib $lc(server) \ -command [list recv_register_result $xlib \ $logindata] return } } else { MessageDlg [epath] -aspect 50000 -icon error \ -message [::msgcat::mc "Authentication failed: %s" \ [error_to_string $xml]] \ -type user -buttons {ok} -default 0 -cancel 0 } logout $xlib } } } proc recv_register_result {xlib logindata status xml} { logout $xlib switch -- $status { ok { login $logindata } } } proc client:error {xlib condition message} { global reconnect login_log [connection_jid $xlib] error $message if {[winfo exists .client_error]} { destroy .client_error } switch -- $condition { bad-format - connection-timeout - invalid-from - invalid-id - invalid-namespace - invalid-xml - remote-connection-failed - restricted-xml - unsupported-encoding - unsupported-stanza-type - xml-not-well-formed { set reconnect($xlib) 1 } default { set reconnect($xlib) 0 } } NonmodalMessageDlg .client_error -aspect 50000 -icon error \ -message $message } # TODO proc show_logout_dialog {} { global reason reasonlist set lw .logout if {[winfo exists $lw]} { destroy $lw } Dialog $lw -title [::msgcat::mc "Logout with reason"] \ -anchor e -default 0 -cancel 1 set lf [$lw getframe] grid columnconfigure $lf 1 -weight 1 if {[llength $reasonlist]} {set reason [lindex $reasonlist 0]} Label $lf.lreason -text [::msgcat::mc "Reason:"] Combobox $lf.reason -textvariable reason \ -values $reasonlist -width 35 Label $lf.lpriority -text [::msgcat::mc "Priority:"] Entry $lf.priority -textvariable loginconf(priority) grid $lf.lreason -row 0 -column 0 -sticky e grid $lf.reason -row 0 -column 1 -sticky ew grid $lf.lpriority -row 1 -column 0 -sticky e grid $lf.priority -row 1 -column 1 -sticky ew $lw add -text [::msgcat::mc "Log out"] -command logout_reason $lw add -text [::msgcat::mc "Cancel"] -command "$lw withdraw" $lw draw $lf.reason } proc logout_reason {} { global logoutuserstatus logouttextstatus logoutpriority reason reasonlist set reasonlist [update_combo_list $reasonlist $reason 10] set lw .logout if {[winfo exists $lw]} { destroy $lw } # TODO set logoutpriority $::loginconf(priority) set logouttextstatus $reason set logoutuserstatus unavailable logout } proc login_log_window {} { global login_log if {![info exists login_log]} { set login_log {} } set w .login_log if {[winfo exists $w]} { raise_win $w return } add_win $w -title [::msgcat::mc "Login log"] \ -tabtitle [::msgcat::mc "Login log"] \ -class Chat \ -raisecmd [list focus $w.body] [ScrolledWindow $w.sw] setwidget \ [Text $w.body -state disabled -takefocus 1] bind $w.body <1> [list focus $w.body] pack $w.sw -side bottom -fill both -expand yes $w.body tag configure jid \ -foreground [option get $w meforeground Chat] $w.body tag configure ok \ -foreground [option get $w theyforeground Chat] $w.body tag configure error \ -foreground [option get $w errforeground Chat] # TODO #search::setup_panel $w foreach {timestamp jid status message} $login_log { log_window_append $timestamp $jid $status $message } $w.body see end raise_win $w } proc log_window_append {timestamp jid status message} { set w .login_log if {![winfo exists $w.body]} return $w.body configure -state normal set scroll [expr {[lindex [$w.body yview] 1] == 1}] $w.body insert end [clock format $timestamp -format "\[%m/%d %T\] "] "" \ $jid jid " " switch -- $status { ok {set tag ok} default {set tag error} } $w.body insert end $status $tag " " $w.body insert end [string trim $message] $w.body insert end "\n" if {$scroll} { $w.body see end } $w.body configure -state disabled } proc login_log {jid status message} { global login_log if {![info exists login_log]} { set login_log {} } set timestamp [clock seconds] lappend login_log $timestamp $jid $status $message log_window_append $timestamp $jid $status $message } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/messages.tcl000064400000000000000000000707171477701321300144000ustar00nobodynobody# messages.tcl -- # # This file is a part of the Tkabber XMPP client. It implements sending # and processing normal messages. namespace eval message { variable msgid 0 variable headid 0 variable options custom::defvar message_dest_list {} \ [::msgcat::mc "List of message destination JIDs."] \ -group Hidden custom::defgroup Messages [::msgcat::mc "Message and Headline options."] \ -group Tkabber disco::register_feature jabber:x:oob } proc message::process_message \ {xlib from id type is_subject subject body err thread priority x} { switch -- $type { normal { show_dialog $xlib $from $id $type $subject \ $body $thread $priority $x return stop } } return } hook::add process_message_hook \ [namespace current]::message::process_message 98 proc message::log_message \ {xlib from id type is_subject subject body err thread priority x} { if {$type != "normal" || $body == ""} return if {![hook::is_flag process_message_hook log]} return ::message_archive::log_message $from [connection_jid $xlib] \ $subject $body $x return } hook::add process_message_hook \ [namespace current]::message::log_message 97 proc message::show_dialog \ {xlib from id type subject body thread priority x {replyP 1}} { variable msgid set mw .msgshow[incr msgid] Toplevel $mw -class Message wm group $mw . if {$replyP} { set title [::msgcat::mc "Message from %s" $from] } else { set title [::msgcat::mc "Extras from %s" $from] } wm title $mw $title wm iconname $mw $title wm withdraw $mw Frame $mw.bottom pack $mw.bottom -side bottom -fill x if {$replyP} { set bbox [ButtonBox $mw.bottom.buttons -spacing 2m -padx 2m] $bbox add -text [::msgcat::mc "Reply"] \ -command [list message::send $mw $xlib] $bbox add -text [::msgcat::mc "Chat"] \ -command "chat::open_to_user [list $xlib] [list $from] destroy $mw" $bbox add -text [::msgcat::mc "Close"] -command [list destroy $mw] bind $mw "ButtonBox::invoke [double% $bbox] 0" bind $mw "ButtonBox::invoke [double% $bbox] 2" pack $bbox -side right -fill x -padx 2m -pady 2m } else { ButtonBox $mw.bottom.buttons -spacing 0 -padx 2m $mw.bottom.buttons add \ -text [::msgcat::mc "Close"] -command [list destroy $mw] bind $mw "ButtonBox::invoke [double% $mw.bottom.buttons] 0" bind $mw "ButtonBox::invoke [double% $mw.bottom.buttons] 0" } pack $mw.bottom.buttons -side right -fill x -padx 2m -pady 2m Frame $mw.frame pack $mw.frame -side top -fill both -expand yes -padx 2m -pady 2m Label $mw.thread -text $thread if {$replyP} { set title [::msgcat::mc "Message from:"] } else { set title [::msgcat::mc "Extras from:"] } Frame $mw.title pack $mw.title -side top -anchor w -fill x -expand no -in $mw.frame grid columnconfigure $mw.title 1 -weight 1 if {[llength [connections]] > 1} { Label $mw.title.lconnection -text [::msgcat::mc "Received by:"] Label $mw.title.connection -text " [connection_jid $xlib]" grid $mw.title.lconnection -row 0 -column 0 -sticky e grid $mw.title.connection -row 0 -column 1 -sticky w } Label $mw.title.lab -text $title MenuToolbutton $mw.title.mb -text $from -menu $mw.title.mb.menu menu $mw.title.mb.menu -tearoff 0 \ -postcommand [namespace code [list subject_menu $mw.title.mb.menu \ $xlib $from message]] grid $mw.title.lab -row 1 -column 0 -sticky e grid $mw.title.mb -row 1 -column 1 -sticky w foreach tag [bind Menubutton] { if {[string first 1 $tag] >= 0} { regsub -all 1 $tag 3 new bind $mw.title.mb $new [bind Menubutton $tag] } } Frame $mw.tspace pack $mw.tspace -side top -fill x -pady 0.5m -in $mw.frame Frame $mw.rf grid columnconfigure $mw.rf 1 -weight 1 set row 0 if {$replyP || $subject ne ""} { Label $mw.rf.lsubj -text [::msgcat::mc "Subject:"] Entry $mw.rf.subj $mw.rf.subj insert 0 $subject #set bgcolor [lindex [$mw.rf.subj configure -background] 4] #$mw.rf.subj configure -state readonly -readonlybackground $bgcolor $mw.rf.subj:cmd configure -state readonly grid $mw.rf.lsubj -row 0 -column 0 -sticky e grid $mw.rf.subj -row 0 -column 1 -sticky ew incr row } pack $mw.rf -side top -anchor w -fill x -in $mw.frame Frame $mw.rspace pack $mw.rspace -side top -fill x -in $mw.frame -pady 0.5m incr row set last $row hook::run message_process_x_hook row body \ $mw.rf $x $xlib $from $id $type $replyP if {!$replyP && $row == $last} { destroy $mw return } # Ignore messages with empty body and no (or unsupported, e.g. # jabber:x:event) extras if {$body eq "" && $row == $last} { destroy $mw return } ScrolledWindow $mw.rsw Text $mw.rbody -width 60 -height 8 -wrap word ::richtext::config $mw.rbody -using {url emoticon stylecode} ::richtext::render_message $mw.rbody $body "" $mw.rbody configure -state disabled pack $mw.rsw -side top -fill both -expand yes -in $mw.frame $mw.rsw setwidget $mw.rbody if {$replyP} { Button $mw.cite -text [::msgcat::mc "Quote"] \ -command [list message::quote $mw $body] pack $mw.cite -side top -anchor e -in $mw.frame Frame $mw.f grid columnconfigure $mw.f 1 -weight 1 #label $mw.f.lto -text To: Entry $mw.f.to -dropenabled 1 -droptypes {JID {}} \ -dropcmd [list message::jiddropcmd] $mw.f.to insert 0 $from Label $mw.f.lsubj -text [::msgcat::mc "Reply subject:"] Entry $mw.f.subj regsub {(^Re: )*} $subject {Re: } subject $mw.f.subj insert 0 $subject #grid $mw.f.lto -row 0 -column 0 -sticky e #grid $mw.f.to -row 0 -column 1 -sticky ew grid $mw.f.lsubj -row 1 -column 0 -sticky e grid $mw.f.subj -row 1 -column 1 -sticky ew pack $mw.f -side top -anchor w -fill x -in $mw.frame Frame $mw.space pack $mw.f -side top -anchor w -fill x -in $mw.frame -pady 1m ScrolledWindow $mw.sw pack $mw.sw -in $mw.frame -side top -fill both -expand yes textUndoable $mw.body -width 60 -height 8 -wrap word bind [Wrapped $mw.body] \ "ButtonBox::invoke [double% $bbox] 0 break" $mw.sw setwidget $mw.body focus [Wrapped $mw.body] hook::run open_message_post_hook $mw $xlib $from } BWidget::place $mw 0 0 center wm deiconify $mw } proc message::quote {mw body} { regsub -all {(^|\n)} $body {\1> } body $mw.body insert 0.0 $body $mw.body insert insert "\n" focus [Wrapped $mw.body] } proc message::process_x_oob {rowvar bodyvar f x xlib from id type replyP} { upvar 2 $rowvar row foreach xa $x { ::xmpp::xml::split $xa tag xmlns attrs cdata subels if {$xmlns ne "jabber:x:oob"} continue set desc "" set url "" foreach item $subels { ::xmpp::xml::split $item tag1 xmlns1 attrs1 cdata1 subels1 switch -- $tag1 { desc - url { set $tag1 $cdata1 } } } if {$url eq ""} { return $row } if {$desc eq ""} { set desc $url } Label $f.luser$row -text [::msgcat::mc "Attached URL:"] render_url $f.user$row $url $desc -background [get_conf $f -background] grid $f.luser$row -row $row -column 0 -sticky e grid $f.user$row -row $row -column 1 -sticky ew incr row } } hook::add message_process_x_hook message::process_x_oob 99 proc message::process_x_data {rowvar bodyvar f x xlib from id type replyP} { foreach xa $x { ::xmpp::xml::split $xa tag xmlns attrs cdata subels if {$xmlns eq "jabber:x:data" && [llength $subels] > 0} { data::draw_window [list $xa] \ [list message::send_x_data $xlib $from] } } } hook::add message_process_x_hook message::process_x_data 100 proc message::send_x_data {xlib to w restags} { ::xmpp::sendMessage $xlib $to -xlist $restags destroy $w } proc message::send_dialog_item {m xlib jid} { $m add command -label [::msgcat::mc "Send message..."] \ -command [list message::send_dialog \ -to $jid -connection $xlib] } hook::add roster_jid_popup_menu_hook message::send_dialog_item 15 hook::add message_dialog_menu_hook message::send_dialog_item 15 hook::add search_popup_menu_hook message::send_dialog_item 15 hook::add roster_create_groupchat_user_menu_hook message::send_dialog_item 15 package require sha1 proc message::generate_thread {from to} { return [sha1::sha1 $from$to[rand 1000000000]] } proc message::send_dialog {args} { variable msgid variable message_dest_list variable send_dialog_xlib if {[llength [connections]] == 0} return set to "" set subject "" set group 0 set cstate normal foreach {opt val} $args { switch -- $opt { -to { set to $val } -subject { set subject $val } -thread { set thread $val } -group { set group $val } -connection { set xlib $val set cstate disabled } } } if {![info exists xlib]} { set xlib [lindex [connections] 0] } set mw .msgsend[incr msgid] Toplevel $mw -class Message wm group $mw . set send_dialog_xlib($mw) [connection_jid $xlib] if {![info exists thread]} { set thread [generate_thread $send_dialog_xlib($mw) $to] } if {$group} { if {$to != ""} { set title [::msgcat::mc "Send message to group %s" $to] } else { set title [::msgcat::mc "Send message to group"] } } else { if {$to != ""} { set title [::msgcat::mc "Send message to %s" $to] } else { set title [::msgcat::mc "Send message"] } } wm title $mw $title wm iconname $mw $title wm withdraw $mw #frame $mw.subj #label $mw.subj.lab -text Subject: #entry $mw.subj.entry #$mw.subj.entry insert 0 $subject #pack $mw.subj.lab $mw.subj.entry -side left #pack $mw.subj -side top -anchor w Frame $mw.bottom pack $mw.bottom -side bottom -fill x set bbox [ButtonBox $mw.bottom.buttons -spacing 2m -padx 2m] $bbox add -text [::msgcat::mc "Send"] \ -command [list message::send0 $mw -group $group] $bbox add -text [::msgcat::mc "Cancel"] -command [list destroy $mw] bind $mw "ButtonBox::invoke [double% $bbox] 0" bind $mw "ButtonBox::invoke [double% $bbox] 1" pack $bbox -side right -fill x -padx 2m -pady 2m Label $mw.thread -text $thread Frame $mw.frame pack $mw.frame -side top -fill both -expand yes -padx 2m -pady 2m Frame $mw.f grid columnconfigure $mw.f 1 -weight 1 set connections {} if {[llength [connections]] > 1} { foreach c [connections] { lappend connections [connection_jid $c] } Label $mw.f.lconnection -text [::msgcat::mc "From: "] Combobox $mw.f.connection \ -textvariable [namespace current]::send_dialog_xlib($mw) \ -values $connections \ -state $cstate grid $mw.f.lconnection -row 0 -column 0 -sticky e grid $mw.f.connection -row 0 -column 1 -sticky ew } if {$group} { # TODO reflect changes in xlib Label $mw.f.lto -text [::msgcat::mc "Group: "] Combobox $mw.f.to \ -values [roster::get_groups $xlib \ -nested $::ifacetk::roster::options(nested) \ -delimiter \ $::ifacetk::roster::options(nested_delimiter) \ -undefined 1] $mw.f.to set $to } else { Label $mw.f.lto -text [::msgcat::mc "To: "] Combobox $mw.f.to -values $message_dest_list DropSite::register $mw.f.to -droptypes {JID {}} \ -dropcmd [list message::jiddropcmd] $mw.f.to set $to } Label $mw.f.lsubj -text [::msgcat::mc "Subject: "] Entry $mw.f.subj $mw.f.subj insert 0 $subject grid $mw.f.lto -row 1 -column 0 -sticky e grid $mw.f.to -row 1 -column 1 -sticky ew grid $mw.f.lsubj -row 2 -column 0 -sticky e grid $mw.f.subj -row 2 -column 1 -sticky ew pack $mw.f -side top -anchor w -fill x -in $mw.frame Frame $mw.space pack $mw.f -side top -anchor w -fill x -in $mw.frame -pady 1m ScrolledWindow $mw.sw pack $mw.sw -in $mw.frame -side top -fill both -expand yes textUndoable $mw.body -width 60 -height 8 -wrap word bind [Wrapped $mw.body] \ "ButtonBox::invoke [double% $bbox] 0 break" $mw.sw setwidget $mw.body if {$to != ""} { focus $mw.f.subj } else { focus $mw.f.to } hook::run open_message_post_hook $mw $xlib $to BWidget::place $mw 0 0 center wm deiconify $mw } proc message::send0 {mw args} { variable send_dialog_xlib foreach c [connections] { if {[connection_jid $c] == $send_dialog_xlib($mw)} { set xlib $c } } unset send_dialog_xlib($mw) eval [list send $mw $xlib] $args } proc message::send {mw xlib args} { variable message_dest_list set group 0 foreach {opt val} $args { switch -- $opt { -group { set group $val } } } set jid [$mw.f.to cget -text] if {$group} { set jids [roster::get_group_jids $xlib $jid \ -nested $::ifacetk::roster::options(nested) \ -delimiter $::ifacetk::roster::options(nested_delimiter)] } else { set message_dest_list [update_combo_list $message_dest_list $jid 20] set jids [list $jid] } set thread [$mw.thread cget -text] set subj [$mw.f.subj get] set body [$mw.body get 1.0 {end -1 chars}] foreach jid $jids { if {!$group || [::roster::itemconfig $xlib $jid -isuser]} { hook::run send_normal_message_hook $xlib $jid $subj $body $thread send_msg $xlib $jid -type normal \ -subject $subj -body $body -thread $thread } } destroy $mw } proc message::log_outgoing {xlib to subj body thread} { if {$body == ""} return if {![hook::is_flag send_normal_message_hook log]} return ::message_archive::log_message [connection_jid $xlib] $to $subj $body {} return } hook::add send_normal_message_hook \ [namespace current]::message::log_outgoing 50 proc message::send_msg {xlib to args} { set x {} foreach {key val} $args { switch -- $key { -from { set from $val } -type { set type $val } -id { set id $val } -subject { set subject $val } -thread { set thread $val } -body { set body $val } -error { set err $val } -xlist { set x $val } } } hook::run rewrite_outgoing_message_hook \ xlib to id type subject body err thread x if {[hook::is_flag rewrite_outgoing_message_hook send]} { set command [list ::xmpp::sendMessage $xlib $to] if {[info exists from]} { lappend command -from $from } if {[info exists type]} { lappend command -type $type } if {[info exists id]} { lappend command -id $id } if {[info exists subject]} { lappend command -subject $subject } if {[info exists thread]} { lappend command -thread $thread } if {[info exists body]} { lappend command -body $body } if {[info exists err]} { lappend command -error $err } if {[info exists x]} { lappend command -xlist $x } eval $command return [list ok $x] } return [list error $x] } proc message::jiddropcmd {target source x y op type data} { set jid [lindex $data 1] $target delete 0 end $target insert 0 $jid } ############################################################################### proc message::show_subscribe_dialog {xlib from type x args} { variable msgid if {$type != "subscribe"} return set status "" foreach {opt val} $args { switch -- $opt { -status { set status $val } default { debugmsg message \ "SHOW_SUBSCRIBE_MESSAGE: unknown option $opt $val" } } } set mw .subscshow[incr msgid] Toplevel $mw -class Message wm group $mw . wm withdraw $mw set title [::msgcat::mc "Subscription request from %s" $from] wm title $mw $title wm iconname $mw $title set bbox [ButtonBox $mw.buttons -spacing 0 -padx 2m -default 0] $bbox add -text [::msgcat::mc "Approve subscription"] \ -command [list [namespace current]::subscribe $mw $xlib $from] $bbox add -text [::msgcat::mc "Decline subscription"] \ -command [list [namespace current]::unsubscribe $mw $xlib $from] bind $mw "ButtonBox::invoke [double% $bbox] default" bind $mw "ButtonBox::invoke [double% $bbox] 1" pack $bbox -side bottom -anchor e -padx 2m -pady 2m Frame $mw.frame pack $mw.frame -side top -fill both -expand yes -padx 2m -pady 2m Frame $mw.subj pack $mw.subj -side top -anchor w -fill x -expand no -in $mw.frame grid columnconfigure $mw.subj 1 -weight 1 if {[llength [connections]] > 1} { Label $mw.subj.lconnection -text [::msgcat::mc "Received by:"] Label $mw.subj.connection -text " [connection_jid $xlib]" grid $mw.subj.lconnection -row 0 -column 0 -sticky e grid $mw.subj.connection -row 0 -column 1 -sticky w } Label $mw.subj.lab -text [::msgcat::mc "Subscription request from:"] MenuToolbutton $mw.subj.mb -text $from -menu $mw.subj.mb.menu menu $mw.subj.mb.menu -tearoff 0 \ -postcommand [namespace code [list subject_menu $mw.subj.mb.menu \ $xlib $from subscribe]] grid $mw.subj.lab -row 1 -column 0 -sticky e grid $mw.subj.mb -row 1 -column 1 -sticky w foreach tag [bind Menubutton] { if {[string first 1 $tag] >= 0} { regsub -all 1 $tag 3 new bind $mw.subj.mb $new [bind Menubutton $tag] } } Frame $mw.space pack $mw.space -side top -fill x -pady 0.5m -in $mw.frame ScrolledWindow $mw.sw pack $mw.sw -side top -fill both -expand yes -in $mw.frame Text $mw.body -width 60 -height 8 -wrap word $mw.body insert 0.0 $status $mw.body configure -state disabled $mw.sw setwidget $mw.body BWidget::place $mw 0 0 center wm deiconify $mw } hook::add client_presence_hook message::show_subscribe_dialog ############################################################################### proc message::show_unsubscribed_dialog {xlib from type x args} { variable msgid if {$type != "unsubscribed"} return NonmodalMessageDlg .unsubscribed[incr msgid] \ -aspect 50000 \ -icon info \ -title [::msgcat::mc "Unsubscribed from %s" $from] \ -message [::msgcat::mc "You are unsubscribed from %s" $from] } hook::add client_presence_hook message::show_unsubscribed_dialog ############################################################################### proc message::subscribe {mw xlib jid} { ::xmpp::sendPresence $xlib -to $jid -type subscribed switch -- [roster::itemconfig $xlib \ [::xmpp::jid::normalize $jid] -subsc] { {} - none - from { message::send_subscribe_dialog $jid -connection $xlib } } destroy $mw } ############################################################################### proc message::unsubscribe {mw xlib jid} { ::roster::remove_item $xlib [::xmpp::jid::normalize $jid] destroy $mw } ############################################################################### proc message::destroy_subscription_dialogs {xlib jid name groups subsc ask} { switch -- $subsc { both - from {} default { return } } foreach mw [winfo children .] { if {![string match .subscshow* $mw]} continue set curjid [$mw.subj.mb cget -text] if {$curjid == $jid} { destroy $mw } } } hook::add roster_push_hook message::destroy_subscription_dialogs ############################################################################### proc message::disco_popup_menu {m bw tnode data parentdata} { lassign $data type xlib jid node switch -- $type { item - item2 { set identities [disco::browser::get_identities $bw $tnode] foreach id $identities { if {[get_prop $id category] == "client"} { subject_menu $m $xlib $jid message return } } } } } hook::add disco_node_menu_hook message::disco_popup_menu ############################################################################### proc message::subject_menu {m xlib jid type} { if {![winfo exists $m]} { menu $m -tearoff 0 } else { $m delete 0 end foreach mm [winfo children $m] { destroy $mm } } hook::run message_dialog_menu_hook $m $xlib $jid return $m } ############################################################################### proc message::add_separator {m xlib jid} { $m add separator } hook::add message_dialog_menu_hook \ [namespace current]::message::add_separator 40 hook::add message_dialog_menu_hook \ [namespace current]::message::add_separator 50 ############################################################################### proc message::add_subscribe_menu_item {m xlib jid} { set chatid [chat::chatid $xlib [::xmpp::jid::stripResource $jid]] if {[chat::is_groupchat $chatid]} { set real_jid [muc::get_real_jid $xlib $jid] if {$real_jid != ""} { set jid $real_jid set state normal } else { set state disabled } } else { set state normal } set user [::xmpp::jid::stripResource $jid] if {[roster::itemconfig $xlib $user -subsc] != ""} { set state disabled } $m add command -label [::msgcat::mc "Add user to roster..."] \ -state $state \ -command [list message::send_subscribe_dialog $user \ -connection $xlib] } hook::add chat_create_user_menu_hook \ [namespace current]::message::add_subscribe_menu_item 35 hook::add message_dialog_menu_hook \ [namespace current]::message::add_subscribe_menu_item 35 hook::add search_popup_menu_hook \ [namespace current]::message::add_subscribe_menu_item 35 ############################################################################### proc message::send_subscribe_dialog {to args} { variable msgid variable send_subscribe_xlib if {[llength [connections]] == 0} return set cstate normal foreach {opt val} $args { switch -- $opt { -connection { set xlib $val set cstate disabled } } } if {![info exists xlib]} { set xlib [lindex [connections] 0] } set mw .subscsend[incr msgid] Toplevel $mw -class Message wm group $mw . wm withdraw $mw set send_subscribe_xlib($mw) [connection_jid $xlib] bind $mw \ [list unset -nocomplain [namespace current]::send_subscribe_xlib($mw)] if {$to eq ""} { set title [::msgcat::mc "Send subscription request"] } else { set title [::msgcat::mc "Send subscription request to %s" $to] } wm title $mw $title wm iconname $mw $title set bbox [ButtonBox $mw.buttons -spacing 0 -padx 2m -default 0] $bbox add -text [::msgcat::mc "Request subscription"] \ -command [list message::send_subscribe0 $mw] $bbox add -text [::msgcat::mc "Cancel"] -command [list destroy $mw] bind $mw "ButtonBox::invoke [double% $bbox] default" bind $mw "ButtonBox::invoke [double% $bbox] 1" pack $bbox -side bottom -anchor e -padx 2m -pady 2m Frame $mw.frame pack $mw.frame -side top -fill both -expand yes -padx 2m -pady 2m Frame $mw.subj pack $mw.subj -side top -anchor w -fill x -expand no -in $mw.frame grid columnconfigure $mw.subj 1 -weight 1 set connections {} if {[llength [connections]] > 1} { foreach c [connections] { lappend connections [connection_jid $c] } Label $mw.subj.lconnection -text [::msgcat::mc "From: "] Combobox $mw.subj.connection \ -textvariable [namespace current]::send_subscribe_xlib($mw) \ -values $connections \ -state $cstate grid $mw.subj.lconnection -row 0 -column 0 -sticky e grid $mw.subj.connection -row 0 -column 1 -sticky ew } Label $mw.subj.lab -text [::msgcat::mc "Send request to: "] Entry $mw.subj.entry $mw.subj.entry insert 0 $to grid $mw.subj.lab -row 1 -column 0 -sticky e grid $mw.subj.entry -row 1 -column 1 -sticky ew Frame $mw.space pack $mw.space -side top -fill x -in $mw.frame -pady 0.5m ScrolledWindow $mw.sw pack $mw.sw -side top -fill both -expand yes -in $mw.frame textUndoable $mw.body -width 60 -height 8 -wrap word $mw.body insert 0.0 [::msgcat::mc "I would like to add you to my roster."] $mw.sw setwidget $mw.body focus $mw.subj.entry BWidget::place $mw 0 0 center wm deiconify $mw } ############################################################################### proc message::send_subscribe0 {mw} { variable send_subscribe_xlib foreach c [connections] { if {[connection_jid $c] == $send_subscribe_xlib($mw)} { set xlib $c } } if {[info exists xlib]} { send_subscribe $mw $xlib } } ############################################################################### proc message::send_subscribe {mw xlib args} { set jid [$mw.subj.entry get] ::xmpp::sendPresence $xlib -to $jid -type subscribe \ -status [$mw.body get 1.0 end] ::xmpp::roster::send $::roster::roster(token,$xlib) -jid $jid \ -command "itemedit::show_dialog \ [list $xlib [::xmpp::jid::normalize $jid]] ;#" destroy $mw } ############################################################################### proc message::resubscribe_menu_item {m xlib jid} { set rjid [roster::find_jid $xlib $jid] if {$rjid == ""} { set state disabled } else { set state normal } set mm [menu $m.subscription -tearoff 0] $mm add command -label [::msgcat::mc "Request subscription"] \ -command [list ::xmpp::sendPresence $xlib \ -to $rjid \ -type subscribe] $mm add command -label [::msgcat::mc "Grant subscription"] \ -command [list ::xmpp::sendPresence $xlib \ -to $rjid \ -type subscribed] $mm add command -label [::msgcat::mc "Request unsubscription"] \ -command [list ::xmpp::sendPresence $xlib \ -to $rjid \ -type unsubscribe] $mm add command -label [::msgcat::mc "Revoke subscription"] \ -command [list ::xmpp::sendPresence $xlib \ -to $rjid \ -type unsubscribed] $m add cascade -label [::msgcat::mc "Subscription"] \ -menu $mm \ -state $state } hook::add roster_jid_popup_menu_hook message::resubscribe_menu_item 30 hook::add roster_service_popup_menu_hook message::resubscribe_menu_item 30 ############################################################################### # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/msgs000075500000000000000000000000001477701321300127435ustar00nobodynobodytkabber/msgs/ca.msg000064400000000000000000001726241477701321300141310ustar00nobodynobody# ca.msg -- # # Catalan messages for the Tkabber XMPP client. # http://www.softcatala.org/projectes/eines/recull/recull.htm # http://www.softcatala.org/projectes/eines/guiaestil/guiaestil.htm # # Author: Luis Peralta # Revised by: Carles Bellver ::msgcat::mcset ca "\n\tAffiliation: %s" "\n\tAfiliació: %s" ::msgcat::mcset ca "\n\tCan't browse: %s" "\n\tNo es pot explorar: %s" ::msgcat::mcset ca "\n\tClient: %s" "\n\tClient: %s" ::msgcat::mcset ca "\n\tJID: %s" "\n\tJID: %s" ::msgcat::mcset ca "\n\tName: %s" "\n\tNom: %s" ::msgcat::mcset ca "\n\tOS: %s" "\n\tSO: %s" ::msgcat::mcset ca "\n\tPresence is signed:" "\n\tLa presència està firmada:" ::msgcat::mcset ca "\nReason is: %s" "\nLa raó és: %s" ::msgcat::mcset ca "\nRoom is empty at %s" "\nLa sala %s està buida" ::msgcat::mcset ca "\nRoom participants at %s:" "\nParticipants a la sala\ %s:" ::msgcat::mcset ca " by " " per " ::msgcat::mcset ca " by %s" " per %s" ::msgcat::mcset ca "#" "#" ::msgcat::mcset ca "%s has become available" "%s és ara disponible" ::msgcat::mcset ca "%s has left" "%s s'ha marxat" ::msgcat::mcset ca "%s Headlines" "Titulars de %s" ::msgcat::mcset ca "%s info" "Informació de %s" ::msgcat::mcset ca "%s invites you to conference room %s" "%s et convida a la\ sala de conversa %s" ::msgcat::mcset ca "%s is %s" "%s està %s" ::msgcat::mcset ca "%s is composing a reply" "%s està escrivint una resposta" ::msgcat::mcset ca "%s is now known as %s" "%s és ara %s" ::msgcat::mcset ca "%s msgs" "%s missatges" ::msgcat::mcset ca "%s purportedly signed by %s can't be verified.\n\n%s."\ "%s pretesament signat per %s no es pot verificar.\n\n%s." ::msgcat::mcset ca "%s request from %s" "Petició %s de %s" ::msgcat::mcset ca "%s SSL Certificate Info" "Informació de Certificat SSL de\ %s" ::msgcat::mcset ca "%s want to play chess!" "%s vol jugar a escacs!" ::msgcat::mcset ca "%s whiteboard" "%s Pissarra blanca" ::msgcat::mcset ca "%s: %s/%s, Description: %s, Version: %s\nNumber of\ children: %s" "%s: %s/%s, Descripció: %s, Versió: %s\nNombre de\ fills: %s" ::msgcat::mcset ca "- nothing -" "- res -" ::msgcat::mcset ca ". Proceed?\n\n" ". Procedir?\n\n" ::msgcat::mcset ca "/me has changed the subject to: %s" "/me ha canviat el\ tema a: %s" ::msgcat::mcset ca "<- Remove" "<- Eliminar" ::msgcat::mcset ca ">>> Unable to decipher data: %s <<<" ">>> No ha sigut\ possible desxifrar les dades: %s <<<" ::msgcat::mcset ca "About" "Referent a" ::msgcat::mcset ca "About " "Més informació" ::msgcat::mcset ca "About..." "Referent a..." ::msgcat::mcset ca "Account" "Compte" ::msgcat::mcset ca "Action" "Acció" ::msgcat::mcset ca "Action:" "Acció:" ::msgcat::mcset ca "Activate lists at startup" "Activar llistes a l'inici" ::msgcat::mcset ca "Activate visible/invisible/ignore lists before sending\ initial presence." "Activar llistes de visibles/invisibles/ignorats\ abans d'enviar la presència inicial." ::msgcat::mcset ca "Active" "Activa" ::msgcat::mcset ca "Active Chats" "Sales actives" ::msgcat::mcset ca "Add" "Afegir" ::msgcat::mcset ca "Add ->" "Afegir ->" ::msgcat::mcset ca "Add chats group in roster." "Afegir temporalmente grups\ de xerrada actius a la llista de contactes." ::msgcat::mcset ca "Add conference..." "Afegir xerrada en grup..." ::msgcat::mcset ca "Add group" "Afegir grup" ::msgcat::mcset ca "Add group by regexp on JIDs..." "Crear grup per mitjà de\ regexp sobre JIDs..." ::msgcat::mcset ca "Add Group..." "Afegir grup..." ::msgcat::mcset ca "Add item" "Afegir ítem" ::msgcat::mcset ca "Add JID" "Afegir JID" ::msgcat::mcset ca "Add list" "Afegir llista" ::msgcat::mcset ca "Add new user..." "Afegir nou usuari..." ::msgcat::mcset ca "Add roster group by JID regexp" "Afegir grup a la llista\ per mitjà de regexp sobre JID" ::msgcat::mcset ca "Add user..." "Afegir usuari..." ::msgcat::mcset ca "Address" "Adreça" ::msgcat::mcset ca "Address 2:" "Adreça 2:" ::msgcat::mcset ca "Address:" "Adreça:" ::msgcat::mcset ca "Admin tools" "Eines d'administració" ::msgcat::mcset ca "Affiliation" "Afiliació" ::msgcat::mcset ca "Alexey Shchepin" "Alexey Shchepin" ::msgcat::mcset ca "All Files" "Tots els fitxers" ::msgcat::mcset ca "Allow downloading" "Permetre baixar" ::msgcat::mcset ca "Allow illegal moves" "Permetre moviments il·legals" ::msgcat::mcset ca "An error is occurred when searching in %s\n\n%s" "S'ha\ produït un error buscant en %s\n\n%s" ::msgcat::mcset ca "An error occurred when searching in %s\n\n%s" "S'ha\ produit un error al cercar a %s\n\n%s" ::msgcat::mcset ca "Announce" "Anunciar" ::msgcat::mcset ca "Are you sure to remove %s from roster?" "Estàs segur que\ vols eliminar %s de la teua llista?" ::msgcat::mcset ca "Are you sure to remove group '%s' from roster?" "Estas\ segur de que vols eliminar el grup '%s' de la llista de contactes?" ::msgcat::mcset ca "Attached file:" "Fitxer adjunt:" ::msgcat::mcset ca "Attached user:" "Usuari adjunt:" ::msgcat::mcset ca "Authentication failed" "Autenticació fallida" ::msgcat::mcset ca "Authentication failed: %s\nCreate new account?"\ "L'autenticació ha fallat: %s\nCrear compte nou?" ::msgcat::mcset ca "Authentication successful" "Autenticació correcta" ::msgcat::mcset ca "Authors:" "Autors:" ::msgcat::mcset ca "auto-away" "auto-absència" ::msgcat::mcset ca "Automatically open GeoRoster window." "Obrir finestra de\ GeoRoster automàticament." ::msgcat::mcset ca "Available groups" "Grups disponibles" ::msgcat::mcset ca "Avatar" "Avatar" ::msgcat::mcset ca "avatars" "avatars" ::msgcat::mcset ca "Away" "Absent" ::msgcat::mcset ca "Bad Request" "Petició errònia" ::msgcat::mcset ca "balloon help" "ajuda contextual" ::msgcat::mcset ca "Ban" "Bloquejar" ::msgcat::mcset ca "Begin date" "Data d'inici" ::msgcat::mcset ca "Begin date:" "Data d'inici:" ::msgcat::mcset ca "Birthday" "Data de naixement" ::msgcat::mcset ca "Birthday:" "Data de naixement:" ::msgcat::mcset ca "Black" "Negres" ::msgcat::mcset ca "Blocking communication options." "Opcions de bloqueig de\ comunicació." ::msgcat::mcset ca "Browse" "Explorar" ::msgcat::mcset ca "Browse error: %s" "Error al navegar: %s" ::msgcat::mcset ca "Browse..." "Explorar..." ::msgcat::mcset ca "Browser" "Explorar" ::msgcat::mcset ca "browsing" "exploració" ::msgcat::mcset ca "bwidget workarounds" "arranjaments de bwidget" ::msgcat::mcset ca "Cache headlines on exit and restore on start." "Guardar\ les capçaleres al sortir, i carregarles al iniciar." ::msgcat::mcset ca "Can't authenticate: Remote server doesn't support\nplain\ or digest authentication method" "No es pot autenticar: el servidor\ remot no suporta\nmètodes d'autenticació simple o per resum" ::msgcat::mcset ca "Cancel" "Cancel·lar" ::msgcat::mcset ca "Cell:" "Mòbil:" ::msgcat::mcset ca "Change password" "Canviar contrasenya" ::msgcat::mcset ca "Change password..." "Canviar contrassenya..." ::msgcat::mcset ca "Change Presence Priority" "Canviar la prioritat de la\ presència" ::msgcat::mcset ca "Change priority..." "Canviar prioritat..." ::msgcat::mcset ca "Change security preferences for %s" "Canviar les\ preferències de seguretat per a %s" ::msgcat::mcset ca "Chat" "Xerrar" ::msgcat::mcset ca "Chat " "Xat" ::msgcat::mcset ca "Chat options." "Opcions de conversa." ::msgcat::mcset ca "Chat with %s" "Xerrar amb %s" ::msgcat::mcset ca "Chats" "Xats" ::msgcat::mcset ca "Chats:" "Xats:" ::msgcat::mcset ca "Check spell after every entered symbol." "Comprovar\ l'ortografia després d'introduir cada símbol." ::msgcat::mcset ca "Chess" "Escacs" ::msgcat::mcset ca "Chess with %s" "Escacs amb %s" ::msgcat::mcset ca "Cipher" "Xifra" ::msgcat::mcset ca "Cipher:" "Xifra:" ::msgcat::mcset ca "City" "Ciutat" ::msgcat::mcset ca "City:" "Població:" ::msgcat::mcset ca "Clear" "Netejar" ::msgcat::mcset ca "Clear bookmarks" "Borrar marcadors" ::msgcat::mcset ca "Clear chat window" "Buidar finestra de xat" ::msgcat::mcset ca "Client" "Client" ::msgcat::mcset ca "Client Info" "Informació del client" ::msgcat::mcset ca "Client:" "Client:" ::msgcat::mcset ca "Close" "Tancar" ::msgcat::mcset ca "Close all tabs" "Tancar totes les pestanyes" ::msgcat::mcset ca "Close other tabs" "Tancar altres pestanyes" ::msgcat::mcset ca "Close tab" "Tancar pestanya" ::msgcat::mcset ca "Close Tkabber" "Tancar Tkabber" ::msgcat::mcset ca "Color" "Color" ::msgcat::mcset ca "Color message bodies in chat windows." "Color dels\ missatges en les finestres de xat" ::msgcat::mcset ca "Colors for tab alert levels." "Colors per als nivells\ d'alerta de les pestanyes." ::msgcat::mcset ca "Complete nickname" "Completar àlies" ::msgcat::mcset ca "Composing a reply" "Escrivint una resposta" ::msgcat::mcset ca "Computer" "Ordinador" ::msgcat::mcset ca "configuration" "configuració" ::msgcat::mcset ca "Configure" "Configurar" ::msgcat::mcset ca "Configure room..." "Configurar sala..." ::msgcat::mcset ca "Conflict" "Conflicte" ::msgcat::mcset ca "Connect via alternate server" "Connectar a través d'un\ servidor alternatiu" ::msgcat::mcset ca "Connect via HTTP polling" "Connectar per mitjanzant HTTP\ polling" ::msgcat::mcset ca "Connection" "Connexió" ::msgcat::mcset ca "Connection closed" "Connexió tancada" ::msgcat::mcset ca "Connection:" "Connexió:" ::msgcat::mcset ca "connections" "connexions" ::msgcat::mcset ca "Contact Information" "Informació de contacte" ::msgcat::mcset ca "Copy selection to clipboard" "Copiar selecció al\ portapapers" ::msgcat::mcset ca "Copy URL to clipboard" "Copiar URL al portapapers" ::msgcat::mcset ca "Correct word" "Corregir paraula" ::msgcat::mcset ca "Country" "País" ::msgcat::mcset ca "Country:" "País:" ::msgcat::mcset ca "Create" "Crear" ::msgcat::mcset ca "Create Room" "Crear sala" ::msgcat::mcset ca "Create room..." "Crear sala..." ::msgcat::mcset ca "cryptographics" "criptografia" ::msgcat::mcset ca "Current groups" "Grups actuals" ::msgcat::mcset ca "Customization of the One True Jabber Client."\ "Personalització del Client Jabber Vertader." ::msgcat::mcset ca "Customize" "Personalitzar" ::msgcat::mcset ca "Data form" "Formulari de dades" ::msgcat::mcset ca "Data purportedly sent by %s can't be deciphered.\n\n%s."\ "Les dades pretesament enviades per %s no es poden desxifrar.\n\n%s." ::msgcat::mcset ca "Date:" "Data:" ::msgcat::mcset ca "day" "dia" ::msgcat::mcset ca "Day:" "Dia:" ::msgcat::mcset ca "days" "dies" ::msgcat::mcset ca "Default" "Per defecte" ::msgcat::mcset ca "Default country to use when looking at a vCard." "Pais\ per defecte a emprar al veure una vCard." ::msgcat::mcset ca "Default directory for downloaded files." "Directori per\ defecte per fitxers descarregats." ::msgcat::mcset ca "Default message type (if not specified explicitly)."\ "Tipus de missatge per defecte (si no és explicit)." ::msgcat::mcset ca "Default nested roster group delimiter." "Delimitador de\ grups anidats a la llista de contactes." ::msgcat::mcset ca "Delay between getting focus and updating window or tab\ title in milliseconds." "Retard en milisegons entre la recepció del\ focus i la actualització de la finestra o pestanya." ::msgcat::mcset ca "Delete" "Eliminar" ::msgcat::mcset ca "Delete all" "Esborrar tots" ::msgcat::mcset ca "Delete message of the day" "Esborrar missatge del dia" ::msgcat::mcset ca "Delete seen" "Esborrar els llegits" ::msgcat::mcset ca "Description:" "Descripció:" ::msgcat::mcset ca "Destroy" "Destruir" ::msgcat::mcset ca "Destroy room" "Destruir sala" ::msgcat::mcset ca "Details" "Detalls" ::msgcat::mcset ca "Dir" "Dir" ::msgcat::mcset ca "Directory to store logs." "Directori on guardar\ registres." ::msgcat::mcset ca "Disabled\n" "Desactivat\n" ::msgcat::mcset ca "Disconnected" "Desconnectat" ::msgcat::mcset ca "Disconnected\n" "Desconnectat\n" ::msgcat::mcset ca "Discover service" "Descubrir servei" ::msgcat::mcset ca "Discovery" "Descobriment" ::msgcat::mcset ca "Display description of user status in chat windows."\ "Mostrar descripció de l'estat de l'usuari a les finestres de xat." ::msgcat::mcset ca "Display headlines in single/multiple windows." "Mostrar\ capçaleres en una única o en multiples finestres." ::msgcat::mcset ca "Display SSL warnings." "Mostrar alertes relatives a SSL." ::msgcat::mcset ca "Do http poll" "Fer enquesta http" ::msgcat::mcset ca "Do not display headline descriptions as tree nodes." "No\ mostrar descripcions de les capçaleres als nodes de l'arbre." ::msgcat::mcset ca "Do not disturb" "No molesteu" ::msgcat::mcset ca "Do nothing" "No fer res" ::msgcat::mcset ca "Do search" "Buscar" ::msgcat::mcset ca "Down" "Avall" ::msgcat::mcset ca "E-mail" "Correu electrònic" ::msgcat::mcset ca "E-mail:" "Correu electrònic:" ::msgcat::mcset ca "Edit" "Editar" ::msgcat::mcset ca "Edit $name list" "Editar llista $name" ::msgcat::mcset ca "Edit $val list" "Editar llista de $val" ::msgcat::mcset ca "Edit %s color" "Editar color %s" ::msgcat::mcset ca "Edit admin list" "Editar llista d'administradors" ::msgcat::mcset ca "Edit admin list..." "Editar llista d'administradors..." ::msgcat::mcset ca "Edit ban list" "Editar llista de bloquejats" ::msgcat::mcset ca "Edit ban list..." "Editar llista de bloquejats..." ::msgcat::mcset ca "Edit chat user colors" " Editar colors dels usuaris" ::msgcat::mcset ca "Edit groups for %s" "Editar grups de %s" ::msgcat::mcset ca "Edit ignore list..." "Editar llista d'ignorats..." ::msgcat::mcset ca "Edit invisible list..." "Editar llista d'invisibles..." ::msgcat::mcset ca "Edit item..." "Editar ítem..." ::msgcat::mcset ca "Edit list" "Editar llista" ::msgcat::mcset ca "Edit member list" "Editar llista de membres" ::msgcat::mcset ca "Edit member list..." "Editar llista de membres..." ::msgcat::mcset ca "Edit moderator list" "Editar llista de moderadors" ::msgcat::mcset ca "Edit moderator list..." "Editar llista de moderadors..." ::msgcat::mcset ca "Edit my info..." "Editar la meua informació..." ::msgcat::mcset ca "Edit nick color..." "Editar color de l'àlies..." ::msgcat::mcset ca "Edit nick colors..." "Editar colors dels àlies..." ::msgcat::mcset ca "Edit nickname for %s" "Editar àlies de %s" ::msgcat::mcset ca "Edit owner list" "Editar llista de propietaris" ::msgcat::mcset ca "Edit owner list..." "Editar llista de propietaris..." ::msgcat::mcset ca "Edit privacy list" "Editar llista de privacitat" ::msgcat::mcset ca "Edit properties for %s" "Editar propietats de %s" ::msgcat::mcset ca "Edit security..." "Editar seguretat..." ::msgcat::mcset ca "Edit voice list" "Editar llista de veus" ::msgcat::mcset ca "Edit voice list..." "Editar llista de veus..." ::msgcat::mcset ca "Email:" "Correu-e:" ::msgcat::mcset ca "emoticons" "emoticones" ::msgcat::mcset ca "Emphasize" "Enfatitzar" ::msgcat::mcset ca "Enable chat window autoscroll only when last message is\ shown." "Activar el desplaçament intel·ligent automàtic una vegada ja\ s'ha mostrat l'últim missatge." ::msgcat::mcset ca "Enable highlighting plugin." "Activar plugin de\ resaltat." ::msgcat::mcset ca "Enable Jidlink transport %s." "Activar transport Jidlink\ %s." ::msgcat::mcset ca "Enable messages emphasize." "Activar l'énfasi als\ missatges." ::msgcat::mcset ca "Enable nested roster groups." "Activar grups anidats en\ la llista de contactes." ::msgcat::mcset ca "Enable rendering of XHTML messages." "Mostrar missatges\ XHTML" ::msgcat::mcset ca "Enabled\n" "Activat\n" ::msgcat::mcset ca "Encrypt traffic" "Xifrar tràfic" ::msgcat::mcset ca "Error" "Error" ::msgcat::mcset ca "Error %s" "Error %s" ::msgcat::mcset ca "Error %s: %s" "Error %s: %s" ::msgcat::mcset ca "Error displaying %s in browser\n\n%s" "Error mostrant %s\ en el navegador\n\n%s" ::msgcat::mcset ca "Error getting info: %s" "Error buscant informació: %s" ::msgcat::mcset ca "Error getting items: %s" "Error buscant elements: %s" ::msgcat::mcset ca "Error in signature verification software: %s." "Error en\ el programari de verificació de signatura: %s." ::msgcat::mcset ca "Error negotiate: %s" "Error negociant: %s" ::msgcat::mcset ca "Error requesting data: %s" "Error demanant dades: %s" ::msgcat::mcset ca "Error submitting data: %s" "Error enviant dades: %s" ::msgcat::mcset ca "Expiry date" "Data d'expiració" ::msgcat::mcset ca "Expiry date:" "Data d'expiració:" ::msgcat::mcset ca "Export roster..." "Exportar llista..." ::msgcat::mcset ca "Export to XHTML" "Exportar a XHTML" ::msgcat::mcset ca "Extended Away" "Molt absent" ::msgcat::mcset ca "Extended away" "Molt ausent" ::msgcat::mcset ca "extension management" "gestió d'extensions" ::msgcat::mcset ca "External program, which is to be executed to play sound.\ If empty, Snack library is required to play sound." "Programa extern\ que s'executarà per reproduir el so. Si es deixa buit, es requerirà\ la biblioteca Snack per reproducir so." ::msgcat::mcset ca "Extras from" "Extres de" ::msgcat::mcset ca "Extras from %s" "Extres de %s" ::msgcat::mcset ca "Failed to connect: %s" "No s'ha pogut conectar: %s" ::msgcat::mcset ca "Family Name" "Primer Cognom" ::msgcat::mcset ca "Family Name:" "Cognoms:" ::msgcat::mcset ca "Fax:" "Fax:" ::msgcat::mcset ca "File not found or not regular file: %s" "Fitxer no trobat\ o no és un fitxer normal" ::msgcat::mcset ca "File to Send:" "Fitxer per enviar:" ::msgcat::mcset ca "File to send:" "Fitxer a enviar:" ::msgcat::mcset ca "file transfer" "transmissió de fitxers" ::msgcat::mcset ca "File Transfer options." "Opcions de transferència\ d'fitxers." ::msgcat::mcset ca "Filters..." "Filtres..." ::msgcat::mcset ca "First Name:" "Nom:" ::msgcat::mcset ca "Font" "Font" ::msgcat::mcset ca "Font to use in roster, chat windows etc." "Font per usar\ en les llistes de contactes, finestres de xat, etc." ::msgcat::mcset ca "Forbidden" "Prohibit" ::msgcat::mcset ca "Forward headline" "Reenviar titular" ::msgcat::mcset ca "Forward to %s" "Reenviar a %s" ::msgcat::mcset ca "Forward..." "Reenviar... " ::msgcat::mcset ca "Free to chat" "Disponible per xerrar" ::msgcat::mcset ca "FreeHand" "Mà alçada" ::msgcat::mcset ca "From/To" "De/Per a" ::msgcat::mcset ca "From:" "De:" ::msgcat::mcset ca "Full Name" "Nom Complet" ::msgcat::mcset ca "Full Name:" "Nom complet:" ::msgcat::mcset ca "Generate event messages" "Generar missatges\ d'esdeveniments" ::msgcat::mcset ca "Generate event messages in MUC compatible conference\ rooms." "Generar missatges d'events en sales de conversa compatibles\ amb MUC." ::msgcat::mcset ca "Geographical position" "Localització geogràfica" ::msgcat::mcset ca "GeoRoster" "GeoRoster" ::msgcat::mcset ca "GeoRoster options." "Opcions del GeoRoster." ::msgcat::mcset ca "Get conference info failed: %s" "La petició d'informació\ de xerrada en grup ha fallat: %s" ::msgcat::mcset ca "Go" "Anar" ::msgcat::mcset ca "Google selection" "Selecció Google" ::msgcat::mcset ca "Got authentication mechanisms" "Obtinguts els mecanismes\ d'autenticació" ::msgcat::mcset ca "Got roster" "S'ha aconseguit la llista de contactes" ::msgcat::mcset ca "Got stream" "Missatge rebut" ::msgcat::mcset ca "Grant Administrative Privilege" "Concedir privilegis\ d'administrador" ::msgcat::mcset ca "Grant Administrative Privileges" "Concedir privilegis\ d'administrador" ::msgcat::mcset ca "Grant Membership" "Concedir pertinença" ::msgcat::mcset ca "Grant Moderator Privilege" "Concedir privilegis de\ moderador" ::msgcat::mcset ca "Grant Moderator Privileges" "Concedir privilegis de\ moderador" ::msgcat::mcset ca "Grant Ownership Privilege" "Concedir privilegis de\ propietari" ::msgcat::mcset ca "Grant Ownership Privileges" "Concedir privilegis de\ propietari" ::msgcat::mcset ca "Grant Voice" "Concedir veu" ::msgcat::mcset ca "Group:" "Grup:" ::msgcat::mcset ca "Groupchat message highlighting plugin options." "Opcions\ del plugin de resaltat del missatges de sala de xerrada." ::msgcat::mcset ca "Headlines" "Titulars" ::msgcat::mcset ca "Help" "Ajuda" ::msgcat::mcset ca "Hide Main Window" "Amagar finestra principal" ::msgcat::mcset ca "Hide/Show roster" "Amagar/mostrar llista" ::msgcat::mcset ca "Highlight current nickname in messages." "Resaltar el teu\ àlies actual als missatges." ::msgcat::mcset ca "Highlight only whole words in messages." "Reslatar als\ missatges només paraules completes" ::msgcat::mcset ca "History" "Historial" ::msgcat::mcset ca "History for %s" "Historial de %s" ::msgcat::mcset ca "Home:" "Casa:" ::msgcat::mcset ca "hour" "hora" ::msgcat::mcset ca "hours" "hores" ::msgcat::mcset ca "HTTP Poll" "HTTP Poll" ::msgcat::mcset ca "HTTP proxy address." "Adreça del proxy HTTP." ::msgcat::mcset ca "HTTP proxy password." "Contrasenya del proxy HTTP." ::msgcat::mcset ca "HTTP proxy port." "Port del proxy HTTP." ::msgcat::mcset ca "HTTP proxy username." "Usuari del proxy HTTP." ::msgcat::mcset ca "Idle for %s" "Inactiu durant %s" ::msgcat::mcset ca "Idle threshold in milliseconds after that Tkabber marks\ you as away." "Interval d'inactivitat després del qual Tkabber et\ marca automàticament com a absent." ::msgcat::mcset ca "Idle threshold in milliseconds after that Tkabber marks\ you as extended away." "Interval d'inactivitat després del qual\ Tkabber et marca automàticament com a molt absent." ::msgcat::mcset ca "Image" "Imatge" ::msgcat::mcset ca "Import roster..." "Importar llista..." ::msgcat::mcset ca "Indentation for pretty-printed XML subtags." "Indentar\ les etiquetes XML en la versió per imprimir." ::msgcat::mcset ca "Info/Query options." "Opcions Info/Query." ::msgcat::mcset ca "Information" "Informació" ::msgcat::mcset ca "Instructions" "Instruccions" ::msgcat::mcset ca "Internal Server Error" "Error intern del servidor" ::msgcat::mcset ca "Interval after error reply on request of participants\ list" "Interval després que s'haja produït un error en demanar la\ llista de participants" ::msgcat::mcset ca "Interval between requests of participants list" "Interval\ entre les peticions de llistes de participants" ::msgcat::mcset ca "Interval:" "Interval:" ::msgcat::mcset ca "invalid userstatus value " "valor d'estat d'usuari no\ vàlid " ::msgcat::mcset ca "Invisible" "Invisible" ::msgcat::mcset ca "Invite" "Convidar" ::msgcat::mcset ca "Invite %s to conferences" "Convidar a %s a xerrada en\ grup" ::msgcat::mcset ca "Invite to conference..." "Convidar a xerrada en grup..." ::msgcat::mcset ca "Invite users to %s" "Convidar usuaris a %s" ::msgcat::mcset ca "Invite users..." "Convidar usuaris..." ::msgcat::mcset ca "Invited to:" "Convidat a:" ::msgcat::mcset ca "IP address:" "Adreça IP:" ::msgcat::mcset ca "IQ" "IQ" ::msgcat::mcset ca "is now" "és ara" ::msgcat::mcset ca "ISDN:" "RDSI:" ::msgcat::mcset ca "Ispell dictionary encoding. If it is empty, system\ encoding is used." "Codificació del diccionari ispell. Si ho deixes\ buit, s'utilitzarà la codificació per defecte del sistema." ::msgcat::mcset ca "Ispell dictionary. If it is empty, default dictionary is\ used." "Diccionari ispell. Si ho deixes buit, s'utilitzarà el\ diccionari per defecte." ::msgcat::mcset ca "Issuer" "Emissor" ::msgcat::mcset ca "Issuer:" "Issuer:" ::msgcat::mcset ca "Jabber Browser" "Explorador Jabber" ::msgcat::mcset ca "jabber chat" "xat jabber" ::msgcat::mcset ca "Jabber Discovery" "Descobriment Jabber" ::msgcat::mcset ca "jabber groupchats" "xats en grup jabber" ::msgcat::mcset ca "jabber iq" "jabber iq" ::msgcat::mcset ca "jabber presence" "presència jabber" ::msgcat::mcset ca "jabber registration" "registre jabber" ::msgcat::mcset ca "JBrowser" "Explorador Jabber" ::msgcat::mcset ca "JID" "JID" ::msgcat::mcset ca "JID regexp:" "JID regexp:" ::msgcat::mcset ca "JID:" "JID:" ::msgcat::mcset ca "Jidlink" "Jidlink" ::msgcat::mcset ca "jidlink" "jidlink" ::msgcat::mcset ca "Jidlink connection closed" "Connexió Jidlink tancada" ::msgcat::mcset ca "Join" "Entrar" ::msgcat::mcset ca "Join conference" "Unir-se a la conferència" ::msgcat::mcset ca "Join failed: %s" "L'entrada ha fallat: %s" ::msgcat::mcset ca "Join group" "Entrar en grup" ::msgcat::mcset ca "Join Group Chat..." "Entrar a sala de conversa..." ::msgcat::mcset ca "Join group dialog data (groups)." "Dades del diàleg\ d'entrada a sala (grups)" ::msgcat::mcset ca "Join group dialog data (nicks)." "Dades del diàleg\ d'entrada a sala (àlies)" ::msgcat::mcset ca "Join group dialog data (servers)." "Dades del diàleg\ d'entrada a sala (servidors)" ::msgcat::mcset ca "Join group..." "Entrar en grup..." ::msgcat::mcset ca "Join groupchat" "Entrar en sala" ::msgcat::mcset ca "Join..." "Entrar..." ::msgcat::mcset ca "Keep trying" "Seguir intentant-ho" ::msgcat::mcset ca "Key ID" "ID de la clau" ::msgcat::mcset ca "Key:" "Clau:" ::msgcat::mcset ca "Kick" "Expulsar" ::msgcat::mcset ca "last %s%s:" "últim %s%s:" ::msgcat::mcset ca "last %s%s: %s" "últim %s%s: %s" ::msgcat::mcset ca "Last activity" "Darrera activitat" ::msgcat::mcset ca "Last Activity or Uptime" "Darrera activitat o temps en\ marxa" ::msgcat::mcset ca "Last Name:" "Cognom:" ::msgcat::mcset ca "Latitude:" "Latitud:" ::msgcat::mcset ca "Latitude: %.2f Longitude: %.2f" "Latitud: %.2f \ Longitud: %.2f" ::msgcat::mcset ca "Latitude: %.2f  Longitude: %.2f" "Latitud: %.2f\  Longitud: %.2f" ::msgcat::mcset ca "Let's play chess, %s!" "Juguem a escacs, %s!" ::msgcat::mcset ca "List name" "Llistar nom" ::msgcat::mcset ca "List of browsed JIDs." "Llista de JIDs explorats." ::msgcat::mcset ca "List of discovered JID nodes." "Llista de nodes del JID\ descoberts." ::msgcat::mcset ca "List of discovered JIDs." "Llista de JIDs descoberts." ::msgcat::mcset ca "List of JIDs to whom headlines have been sent." "Llista\ de JIDs als que s'ha enviat titulars de la notícia." ::msgcat::mcset ca "List of logout reasons." "Llista de raons de\ desconnexió." ::msgcat::mcset ca "List of message destination JIDs." "Llista dels JIDs\ destinataris." ::msgcat::mcset ca "List of users for userinfo." "Llista de usuaris per a\ userinfo." ::msgcat::mcset ca "Load Image" "Carregar imatge" ::msgcat::mcset ca "Location" "Localització" ::msgcat::mcset ca "Log in" "Iniciar" ::msgcat::mcset ca "Log in..." "Connectar..." ::msgcat::mcset ca "Log out" "Desconnectar" ::msgcat::mcset ca "Log out" "Tancar sessió" ::msgcat::mcset ca "Log out with reason..." "Desconnectar per la raó..." ::msgcat::mcset ca "Logging options." "Opcions d'enregistrament." ::msgcat::mcset ca "Login" "Iniciar sessió" ::msgcat::mcset ca "Login options." "Opciones d'inici de sessió." ::msgcat::mcset ca "Logout" "Tancar sessió" ::msgcat::mcset ca "Logout with reason" "Tancar sessió per una raó" ::msgcat::mcset ca "Longitude:" "Longitud:" ::msgcat::mcset ca "Main window:" "Finestra principal:" ::msgcat::mcset ca "Manually edit rules..." "Editar les regles manualment..." ::msgcat::mcset ca "Mark all seen" "Marcar tots com a llegits" ::msgcat::mcset ca "Mark all unseen" "Marcar tots com a no llegits" ::msgcat::mcset ca "Marshall T. Rose" "Marshall T. Rose" ::msgcat::mcset ca "Match by regexp" "Patró per regexp" ::msgcat::mcset ca "Match case..." "Majúscules/Minúscules..." ::msgcat::mcset ca "Maximum number of characters in the history in MUC\ compatible conference rooms." "Número màxim de caràcters en\ l'historial de les sales de xat compatibles amb MUC" ::msgcat::mcset ca "Maximum number of stanzas in the history in MUC\ compatible conference rooms." "Número màxim de stanzas en l'historial\ de les sales de xat compatibles amb MUC" ::msgcat::mcset ca "Maximum Poll Interval." "Interval màxim de Poll." ::msgcat::mcset ca "Maximum poll interval." "Interval màxim de Poll." ::msgcat::mcset ca "Maximum Poll Time." "Temps màxim d'enquesta." ::msgcat::mcset ca "Message" "Missatge" ::msgcat::mcset ca "Message and Headline options." "Opcions de missatge i de\ capçalera." ::msgcat::mcset ca "Message archive" "Arxiu de missatges" ::msgcat::mcset ca "Message body" "Cos del missatge" ::msgcat::mcset ca "Message delivered" "Missatge entregat" ::msgcat::mcset ca "Message delivered to %s" "Missatge entregat a %s" ::msgcat::mcset ca "Message displayed" "Missatge mostrat" ::msgcat::mcset ca "Message displayed to %s" "Missatge mostrat a %s" ::msgcat::mcset ca "Message filters..." "filtres de missatges..." ::msgcat::mcset ca "Message from" "Missatge de" ::msgcat::mcset ca "Message from %s" "Missatge de %s" ::msgcat::mcset ca "Message Recorder:" "Contestador:" ::msgcat::mcset ca "Message stored on %s's server" "Missatge guardat en el\ servidor de %s" ::msgcat::mcset ca "Message stored on the server" "Missatge guardat en el\ servidor" ::msgcat::mcset ca "message/headline" "missatge/titular" ::msgcat::mcset ca "Messages" "Missatges" ::msgcat::mcset ca "Michail Litvak" "Michail Litvak" ::msgcat::mcset ca "Middle Name" "Segón Nom" ::msgcat::mcset ca "Middle Name:" "Segon nom:" ::msgcat::mcset ca "Minimize" "Minimitzar" ::msgcat::mcset ca "Minimum Poll Interval." "Interval mínim de Poll." ::msgcat::mcset ca "Minimum poll interval." "Interval mínim de Poll" ::msgcat::mcset ca "Minimum Poll Time." "Temps mínim d'enquesta." ::msgcat::mcset ca "minute" "minut" ::msgcat::mcset ca "minutes" "minuts" ::msgcat::mcset ca "Misc:" "Misc:" ::msgcat::mcset ca "Modem:" "Mòdem:" ::msgcat::mcset ca "Moderators" "Moderadors" ::msgcat::mcset ca "Month:" "Mes:" ::msgcat::mcset ca "Move" "Moure" ::msgcat::mcset ca "Move down" "Desplaçar cap avall" ::msgcat::mcset ca "Move up" "Desplaçar cap amunt" ::msgcat::mcset ca "Move: " "Moure: " ::msgcat::mcset ca "Moving to extended away" "Passant a molt absent" ::msgcat::mcset ca "MUC" "MUC" ::msgcat::mcset ca "multi-user chat" "converses multiusuari" ::msgcat::mcset ca "Mute" "Mut" ::msgcat::mcset ca "Mute sound notification." "Enmudir notificació sonora." ::msgcat::mcset ca "Mute sound notifying." "Notificacions de so mudes." ::msgcat::mcset ca "Mute sound when displaying delayed groupchat messages."\ "So mut al mostrar missatges amb retard de sales de conversa." ::msgcat::mcset ca "Mute sound when displaying delayed personal chat\ messages." "So mut al mostrar missatges amb retard de converses\ privades." ::msgcat::mcset ca "Name" "Nom" ::msgcat::mcset ca "Name:" "Nom:" ::msgcat::mcset ca "Name: " "Nom:" ::msgcat::mcset ca "negotiation" "negociació" ::msgcat::mcset ca "New group name:" "Nou nom del grup:" ::msgcat::mcset ca "New password:" "Contrasenya nova:" ::msgcat::mcset ca "New passwords do not match" "Les contrasenyes noves no\ coincideixen" ::msgcat::mcset ca "Next bookmark" "Marcador següent" ::msgcat::mcset ca "Next highlighted" "Següent resaltat" ::msgcat::mcset ca "Nick" "Àlies" ::msgcat::mcset ca "Nick:" "Àlies:" ::msgcat::mcset ca "Nickname" "Àlies" ::msgcat::mcset ca "Nickname:" "Àlies:" ::msgcat::mcset ca "No active" "No activa" ::msgcat::mcset ca "No active list" "No hi ha cap llista activa" ::msgcat::mcset ca "No avatar to store" "No hi ha avatars per guardar" ::msgcat::mcset ca "No conferences in progress..." "No hi ha xerrades en grup\ ara mateix..." ::msgcat::mcset ca "No default list" "No hi ha llista per defecte" ::msgcat::mcset ca "No users in roster..." "No hi ha usuaris a la llista..." ::msgcat::mcset ca "Node:" "Node:" ::msgcat::mcset ca "None" "Cap" ::msgcat::mcset ca "Normal" "Normal" ::msgcat::mcset ca "Not Acceptable" "No acceptable" ::msgcat::mcset ca "Not Allowed" "No permès" ::msgcat::mcset ca "Not Found" "No trobat" ::msgcat::mcset ca "Not Implemented" "No implementat" ::msgcat::mcset ca "Not logged in" "No connectat" ::msgcat::mcset ca "Number of groupchat messages to expire nick completion\ according to the last personally addressed message." "Nombre de\ missatges a la sala de xarra des de que un participant va eixir fins\ que el seu àlies ja no es completa." ::msgcat::mcset ca "Number of HTTP poll client security keys to send before\ creating new key sequence." "Número de claus de seguretat del client\ de HTTP Poll que s'envien abans de crear una nova sequència de clau." ::msgcat::mcset ca "Offline" "Desconnectat" ::msgcat::mcset ca "OK" "OK" ::msgcat::mcset ca "Old password is incorrect" "La contrasenya antiga és\ incorrecta" ::msgcat::mcset ca "Old password:" "Contrasenya antiga:" ::msgcat::mcset ca "One window per bare JID" "Una finestra per JID simple" ::msgcat::mcset ca "One window per full JID" "Una finestra per JID complet" ::msgcat::mcset ca "One window per JID" "Una finestra per JID" ::msgcat::mcset ca "One window per JID/resource" "Una finestra per\ JID/recurs" ::msgcat::mcset ca "Online" "Connectat" ::msgcat::mcset ca "Open" "Obrir" ::msgcat::mcset ca "Open raw XML window" "Obrir finestra d'XML cru" ::msgcat::mcset ca "Open statistics monitor" "Obrir monitor d'estadístiques" ::msgcat::mcset ca "Opening DTCP active connection" "Obrint connexió activa\ DTCP" ::msgcat::mcset ca "Opening DTCP passive connection" "Obrint connexió passiva\ DTCP" ::msgcat::mcset ca "Opening IBB connection" "Obrint connexió IBB" ::msgcat::mcset ca "Opening Jidlink connection" "Obrint connexió Jidlink" ::msgcat::mcset ca "Opening SI connection" "Obrint conexió SI" ::msgcat::mcset ca "Opening SOCKS5 listening socket" "Obrint socket d'escolta\ SOCKS5" ::msgcat::mcset ca "Opponent %s refuse our request: %s" "L'oponent %s rebutja\ la nostra petició: %s" ::msgcat::mcset ca "Options for Conference Info module, that allows you to\ see list of participants in roster popup, regardless of whether you\ are currently joined with the conference." "Opcions del mòdul\ d'informació sobre xerrades en grup, que permet veure la llista de\ participants en la finestra desplegable, independenment que hi\ estigues participant o no." ::msgcat::mcset ca "Options for external play program" "Opcions del programa\ extern de reproducció" ::msgcat::mcset ca "Options for main interface." "Opcions de la interfície\ principal." ::msgcat::mcset ca "Options for module that automatically marks you as away\ after idle threshold." "Opcions del mòdul que et posa automàticament\ com a absent desprès d'un temps inactiu." ::msgcat::mcset ca "Options for Raw XML Input module, which allows you to\ monitor incoming/outgoing traffic from connection to server and send\ custom XML stanzas." "Opcions del módul d'introducció d'XML cru, que\ permet monitoritzar el tràfic d'entrada i sortida amb el servidor i\ enviar XML stanzas" ::msgcat::mcset ca "Organization" "Organització" ::msgcat::mcset ca "OS:" "SO:" ::msgcat::mcset ca "Pager:" "Busca:" ::msgcat::mcset ca "Parent group:" "Grup pare:" ::msgcat::mcset ca "Parent groups:" "Grups pare:" ::msgcat::mcset ca "Participants" "Participants" ::msgcat::mcset ca "Passphrase:" "Contrasenya:" ::msgcat::mcset ca "Password (v2 only):" "Contrasenya (només v2)" ::msgcat::mcset ca "Password change failed: %s" "El canvi de contrasenya ha\ fallat: %s" ::msgcat::mcset ca "Password is changed" "Contrasenya canviada" ::msgcat::mcset ca "Password." "Contrasenya." ::msgcat::mcset ca "Password:" "Contrasenya:" ::msgcat::mcset ca "Path to the ispell executable." "Ruta per a l'executable\ ispell." ::msgcat::mcset ca "Pawn promotion" "Promociò del peò" ::msgcat::mcset ca "Payment Required" "Es requereix pagament" ::msgcat::mcset ca "Periodically browse roster conferences" "Explorar\ periòrdicament la llista per a xerrades en grup" ::msgcat::mcset ca "Personal" "Personal" ::msgcat::mcset ca "Personal " "Personal" ::msgcat::mcset ca "Phone:" "Telèfon:" ::msgcat::mcset ca "Phones" "Telèfons" ::msgcat::mcset ca "Photo" "Foto" ::msgcat::mcset ca "Play" "Jugar" ::msgcat::mcset ca "Please define $BROWSER" "Per favor, defineix $BROWSER" ::msgcat::mcset ca "Please enter passphrase" "Per favor, introdueix la\ contrasenya" ::msgcat::mcset ca "Please join %s" "Per favor, entra en %s" ::msgcat::mcset ca "Please try again" "Per favor, torna a intentar-ho" ::msgcat::mcset ca "plugin management" "gestió de plugins" ::msgcat::mcset ca "PolyLine" "Multilinea" ::msgcat::mcset ca "Port:" "Port:" ::msgcat::mcset ca "Postal Code:" "Codi postal:" ::msgcat::mcset ca "Preferred:" "Preferent:" ::msgcat::mcset ca "Prefix" "Prefix" ::msgcat::mcset ca "Prefix:" "Prefix:" ::msgcat::mcset ca "Presence" "Presència" ::msgcat::mcset ca "presence" "presència" ::msgcat::mcset ca "Presence id signed" "ID de presència signat" ::msgcat::mcset ca "Presence is signed" "La presència està signada" ::msgcat::mcset ca "Presence Spy" "Espiar presència" ::msgcat::mcset ca "Presence-in" "Presència-entra" ::msgcat::mcset ca "Presence-out" "Presència-surt" ::msgcat::mcset ca "Pretty print incoming and outgoing XML stanzas."\ "Formatar les XML stanzas per imprimir." ::msgcat::mcset ca "Pretty print XML" "XML formatat per imprimir" ::msgcat::mcset ca "Prev bookmark" "Marcador anterior" ::msgcat::mcset ca "Prev highlighted" "Resaltat anterior" ::msgcat::mcset ca "Previous/Next history message" "Missatge\ anterior/següent" ::msgcat::mcset ca "Previous/Next tab" "Pestanyar anterior/següent" ::msgcat::mcset ca "Priority." "Prioritat." ::msgcat::mcset ca "Priority:" "Prioritat:" ::msgcat::mcset ca "Privacy list is activated" "La llista de privacitat està\ activada" ::msgcat::mcset ca "Privacy list is not activated" "La llista de privacitat\ no està activada" ::msgcat::mcset ca "Privacy lists" "Llistes de privacitat" ::msgcat::mcset ca "Privacy rules" "Regles de privacitat" ::msgcat::mcset ca "privacy rules" "regles de privacitat" ::msgcat::mcset ca "Privacy rules..." "Regles de privacitat..." ::msgcat::mcset ca "Profile" "Perfil" ::msgcat::mcset ca "Profile on" "Perfil" ::msgcat::mcset ca "Profile report" "Informe de perfil" ::msgcat::mcset ca "Profiles" "Perfils" ::msgcat::mcset ca "Proxy Login:" "Usuari del proxy:" ::msgcat::mcset ca "Proxy Password:" "Contrasenya del proxy:" ::msgcat::mcset ca "Proxy Port:" "Port del proxy:" ::msgcat::mcset ca "Proxy Server:" "Servidor proxy:" ::msgcat::mcset ca "Question" "Pregunta" ::msgcat::mcset ca "Quick Help" "Ajuda ràpida" ::msgcat::mcset ca "Quick help" "Ajuda ràpida" ::msgcat::mcset ca "Quick help..." "Ajuda ràpida..." ::msgcat::mcset ca "Quit" "Sortir" ::msgcat::mcset ca "Quote" "Citar" ::msgcat::mcset ca "Raise new tab." "Crear nova pestanya." ::msgcat::mcset ca "Raw XML" "XML cru" ::msgcat::mcset ca "Raw XML input" "Introducció d'XML cru" ::msgcat::mcset ca "Reason" "Raó" ::msgcat::mcset ca "Reason:" "Raó:" ::msgcat::mcset ca "Receive" "Rebre" ::msgcat::mcset ca "Receive file from %s" "Rebre fitxer de %s" ::msgcat::mcset ca "Received/Sent" "Rebuts/enviats" ::msgcat::mcset ca "Receiving file failed: %s" "Error recivint el fitxer: %s" ::msgcat::mcset ca "Redirect" "Redirecció" ::msgcat::mcset ca "Redo" "Refer" ::msgcat::mcset ca "Register" "Registrar" ::msgcat::mcset ca "Register in %s" "Registrar-se en %s" ::msgcat::mcset ca "Registration failed: %s" "El registre ha fallat: %s" ::msgcat::mcset ca "Registration is successful!" "El registre s'ha completat\ amb éxit!" ::msgcat::mcset ca "Registration is successful!" "Registre satisfactori!" ::msgcat::mcset ca "Registration Required" "Es requereix registre" ::msgcat::mcset ca "Registration: %s" "Registre: %s" ::msgcat::mcset ca "Remote Server Error" "Error del servidor remot" ::msgcat::mcset ca "Remote Server Timeout" "Temps d'espera del servidor remot\ esgotat" ::msgcat::mcset ca "Remove" "Eliminar" ::msgcat::mcset ca "Remove from list" "Eliminar de la llista" ::msgcat::mcset ca "Remove list" "Eliminar llista" ::msgcat::mcset ca "Remove..." "Eliminar..." ::msgcat::mcset ca "Rename roster group" "Reanomenar grup de la llista de\ contactes" ::msgcat::mcset ca "Rename..." "Canviar el nom..." ::msgcat::mcset ca "Repeat new password:" "Repeteix la contrasenya nova:" ::msgcat::mcset ca "Replace opened connections" "Remplaçar connexions\ obertes" ::msgcat::mcset ca "Replace opened connections." "Remplaçar connexions\ obertes." ::msgcat::mcset ca "Reply" "Contestar" ::msgcat::mcset ca "Reply subject:" "Tema de la resposta:" ::msgcat::mcset ca "Reply to current time (jabber:iq:time) requests."\ "Respondre les peticions sobre el temps actual (jabber:iq:time)" ::msgcat::mcset ca "Reply to idle time (jabber:iq:last) requests." "Respondre\ les peticions sobre el temps que portes absent (jabber:iq:last)" ::msgcat::mcset ca "Reply to version (jabber:iq:version) requests."\ "Respondre les peticions sobre la versió del programa\ (jabber:iq:version)" ::msgcat::mcset ca "Report the list of current MUC rooms on disco#items\ query." "Informar de les sales MUC actuals al sol·licitar\ disco#items." ::msgcat::mcset ca "Request" "Sol·licitar" ::msgcat::mcset ca "Request failed: %s" "Petició fallida: %s" ::msgcat::mcset ca "Request only unseen (which aren't displayed in the chat\ window) messages in the history in MUC compatible conference rooms."\ "Demanar només els missatges no visualitzats (que no es mostrin a la\ finestra de xat) en l'historial de les sales de xat" ::msgcat::mcset ca "Request only unseen (which aren't displayed in the chat\ window) messages in the history in MUC compatible conference rooms."\ "Demanar només els missatges no visualitzats (que no es mostrin en la\ finestra de xat) en l'historial de les sales de xat compaitbles MUC" ::msgcat::mcset ca "Request Timeout" "Temps d'espera de la petició esgotat" ::msgcat::mcset ca "Requesting $name list: %s" "Sol·licitant llista $name:\ %s" ::msgcat::mcset ca "Requesting privacy list: %s" "Demanant llista de\ privacitat: %s" ::msgcat::mcset ca "Requesting privacy rules: %s" "Sol·licitant regles de\ privacitat: %s" ::msgcat::mcset ca "Reset to Current" "Restablir a Actual" ::msgcat::mcset ca "Reset to Default" "Restablir a Per Defecte" ::msgcat::mcset ca "Reset to Saved" "Restablir a Guardada" ::msgcat::mcset ca "Resource." "Recurs." ::msgcat::mcset ca "Resource:" "Recurs:" ::msgcat::mcset ca "Resubscribe" "Tornar a subscriure's" ::msgcat::mcset ca "Resubscribe to all users in group..." "Tornar a\ subscriure's a tots els usuaris del grup..." ::msgcat::mcset ca "Retry to connect forever." "Intentar conectar\ infinitament." ::msgcat::mcset ca "Returning from auto-away" "Tornant d'auto-absència" ::msgcat::mcset ca "Revoke Administrative Privilege" "Revocar privilegis\ d'administrador" ::msgcat::mcset ca "Revoke Administrative Privileges" "Revocar privilegis\ d'administrador" ::msgcat::mcset ca "Revoke Membership" "Revocar pertinença" ::msgcat::mcset ca "Revoke Moderator Privilege" "Revocar privilegis de\ moderador" ::msgcat::mcset ca "Revoke Moderator Privileges" "Revocar privilegis de\ moderador" ::msgcat::mcset ca "Revoke Ownership Privilege" "Revocar privilegis de\ propietari" ::msgcat::mcset ca "Revoke Ownership Privileges" "Revocar privilegis de\ propietari" ::msgcat::mcset ca "Revoke Voice" "Revocar veu" ::msgcat::mcset ca "Role" "Rol" ::msgcat::mcset ca "Role:" "Rol:" ::msgcat::mcset ca "Roster" "Llista" ::msgcat::mcset ca "Roster Files" "Arxius de llista de contactes" ::msgcat::mcset ca "Roster of %s" "Llista de contactes de %s" ::msgcat::mcset ca "Roster options." "Opcions de la llista de contactes." ::msgcat::mcset ca "rosters" "llistes" ::msgcat::mcset ca "SASL Certificate:" "Certificat SASL:" ::msgcat::mcset ca "SASL Port:" "Port SASL:" ::msgcat::mcset ca "Save as:" "Guardar com:" ::msgcat::mcset ca "Scroll chat window up/down" "Desplaçar finestra de xat\ amunt/avall" ::msgcat::mcset ca "Search" "Cercar" ::msgcat::mcset ca "Search again" "Tornar a buscar" ::msgcat::mcset ca "Search direction" "Direcció de busca" ::msgcat::mcset ca "Search in" "Buscar en" ::msgcat::mcset ca "Search in %s" "Cercar a %s" ::msgcat::mcset ca "Search in %s: No items found" "Cerca a %s: No s'han\ trobat resultats" ::msgcat::mcset ca "Search in %s: No matching items found" "Cerca en %s: No\ s'han trobat elements que coincideixin" ::msgcat::mcset ca "Search: %s" "Cerca: %s" ::msgcat::mcset ca "searching" "buscant" ::msgcat::mcset ca "second" "segon" ::msgcat::mcset ca "seconds" "segons" ::msgcat::mcset ca "Select" "Sel.leccionar" ::msgcat::mcset ca "Select Key for Signing Traffic" "Seleccionar la clau per\ a signar el tràfic" ::msgcat::mcset ca "Send" "Enviar" ::msgcat::mcset ca "Send broadcast message..." "Enviar missatge de\ difusió..." ::msgcat::mcset ca "Send contacts to" "Enviar contactes a" ::msgcat::mcset ca "Send contacts to %s" "Enviar contactes a %s" ::msgcat::mcset ca "Send custom presence" "Enviar presència personalitzada" ::msgcat::mcset ca "Send file request failed: %s" "Error solicitant\ l'enviament del fitxer: %s" ::msgcat::mcset ca "Send file to %s" "Enviar fitxer a %s" ::msgcat::mcset ca "Send file via HTTP..." "Enviar fitxer via HTTP..." ::msgcat::mcset ca "Send file via Jidlink..." "Enviar fitxer a través de\ Jidlink..." ::msgcat::mcset ca "Send file via SI..." "Enviar fitxer via SI..." ::msgcat::mcset ca "Send file..." "Enviar fitxer..." ::msgcat::mcset ca "Send message" "Enviar missatge" ::msgcat::mcset ca "Send message of the day..." "Enviar missatge del dia..." ::msgcat::mcset ca "Send message to %s" "Enviar missatge a %s" ::msgcat::mcset ca "Send message to all users in group..." "Enviar missatge a\ tots els usuaris del grup..." ::msgcat::mcset ca "Send message to group" "Enviar missatge al grup" ::msgcat::mcset ca "Send message to group %s" "Enviar missatge al grup %s" ::msgcat::mcset ca "Send message..." "Enviar missatge..." ::msgcat::mcset ca "Send subscription" "Enviar subscripció" ::msgcat::mcset ca "Send subscription to " "Enviar subscripció a " ::msgcat::mcset ca "Send subscription to %s" "Enviar subscripció a %s" ::msgcat::mcset ca "Send to server" "Enviar al servidor" ::msgcat::mcset ca "Send users..." "Enviar Usuaris..." ::msgcat::mcset ca "Sending $name list: %s" "Enviant llista $name: %s" ::msgcat::mcset ca "Sergei Golovan" "Sergei Golovan" ::msgcat::mcset ca "Serial number" "Nombre de sèrie" ::msgcat::mcset ca "Serial number:" "Nombre de sèrie:" ::msgcat::mcset ca "Server name or IP-address." "Nom del servidor o adreça\ IP." ::msgcat::mcset ca "Server name." "Servidor." ::msgcat::mcset ca "Server port." "Port." ::msgcat::mcset ca "Server Port:" "Port del servidor:" ::msgcat::mcset ca "Server:" "Servidor:" ::msgcat::mcset ca "Service Discovery" "Descobriment de Servicis" ::msgcat::mcset ca "service discovery" "descobriment de serveis" ::msgcat::mcset ca "Service info" "Informació del servei" ::msgcat::mcset ca "Service statistics" "Estadístiques del servei" ::msgcat::mcset ca "Service Unavailable" "Servei no disponible" ::msgcat::mcset ca "Services" "Serveis" ::msgcat::mcset ca "Set" "Fixar" ::msgcat::mcset ca "Set bookmark" "Guardar marcador" ::msgcat::mcset ca "Set for Current Session" "Definició per a la sessió\ actual" ::msgcat::mcset ca "Set for Future Sessions" "Definició per a sessions\ futures" ::msgcat::mcset ca "Show" "Mostrar" ::msgcat::mcset ca "Show cities" "Mostrar ciutats" ::msgcat::mcset ca "Show Console" "Mostrar consola" ::msgcat::mcset ca "Show console" "Mostrar consola" ::msgcat::mcset ca "Show detailed info on conference room members in roster\ item tooltips." "Mostrar informació detallada sobre el membres de les\ sales de xerrada als 'tooltips' de la llista de contactes." ::msgcat::mcset ca "Show emoticons" "Mostrar emoticones" ::msgcat::mcset ca "Show history" "Mostrar historial" ::msgcat::mcset ca "Show info" "Mostrar informació" ::msgcat::mcset ca "Show IQ requests in the status line." "Mostrar peticions\ IQ en la línia d'estat" ::msgcat::mcset ca "Show Main Window" "Mostrar finestra principal" ::msgcat::mcset ca "Show menu tearoffs when possible." "Mostrar tires en els\ menús quan sigui possible" ::msgcat::mcset ca "Show native icons for contacts, connected to\ transports/services in roster." "Mostrar icones natives dels\ contactes conectats amb un transport a al llista de contactes." ::msgcat::mcset ca "Show native icons for transports/services in roster."\ "Mostrar icones natives dels transports/servics a la llista de\ contactes." ::msgcat::mcset ca "Show number of unread messages in tab titles." "Mostrar\ la quantitat de missatges sense llegir al títol de la pestanya." ::msgcat::mcset ca "Show offline users" "Mostrar contactes desconectats" ::msgcat::mcset ca "Show online users only" "Mostrar només usuaris\ connectats" ::msgcat::mcset ca "Show only online users in roster." "Mostrar a la llista\ de contactes només els conectats." ::msgcat::mcset ca "Show presence bar" "Mostrar barra de presència" ::msgcat::mcset ca "Show presence bar." "Mostrar barra de presència." ::msgcat::mcset ca "Show subscription type in roster item tooltips." "Mostrar\ tipus de subscripció al 'tooltip' a la llista de contactes." ::msgcat::mcset ca "Show toolbar" "Mostrar barra d'eines" ::msgcat::mcset ca "Show Toolbar." "Mostrar barra d'eines." ::msgcat::mcset ca "Show user info" "Mostrar informació d'usuari" ::msgcat::mcset ca "Show user info..." "Mostrar informació d'usuari..." ::msgcat::mcset ca "SI connection closed" "Connexió SI tancada" ::msgcat::mcset ca "Single window" "Finestra única" ::msgcat::mcset ca "Size:" "Mida:" ::msgcat::mcset ca "Smart autoscroll" "Desplaçament automàtic intel·ligent" ::msgcat::mcset ca "Sort" "Ordenar" ::msgcat::mcset ca "Sound" "So" ::msgcat::mcset ca "sound" "so" ::msgcat::mcset ca "Sound options." "Opcions de so." ::msgcat::mcset ca "Spell check options." "Opcions de correcció ortogràfica." ::msgcat::mcset ca "Spy" "Espiar" ::msgcat::mcset ca "Spy presence" "Espiar presència" ::msgcat::mcset ca "SSL CA file (optional)." "Fitxer SSL CA (opcional)." ::msgcat::mcset ca "SSL certificate expired" "Certificat SSL expirat" ::msgcat::mcset ca "SSL certificate file (optional)." "Fitxer de certificat\ SSL (opcional)." ::msgcat::mcset ca "SSL Certificate:" "Certificat SSL:" ::msgcat::mcset ca "SSL disabled" "SSL desactivat" ::msgcat::mcset ca "SSL enabled" "SSL activat" ::msgcat::mcset ca "SSL port." "Port SSL." ::msgcat::mcset ca "SSL Port:" "Port SSL:" ::msgcat::mcset ca "SSL private key file (optional)." "Fitxer de clau privada\ SSL (opcional)." ::msgcat::mcset ca "Start chat" "Començar xat" ::msgcat::mcset ca "Starting auto-away" "Passant a auto-absència" ::msgcat::mcset ca "State" "Estat" ::msgcat::mcset ca "State " "Comunitat" ::msgcat::mcset ca "State:" "Província/comarca:" ::msgcat::mcset ca "Statistics" "Estadístiques" ::msgcat::mcset ca "Statistics monitor" "Monitor d'estadístiques" ::msgcat::mcset ca "Stop autoscroll" "Parar el desplaçament automàtic" ::msgcat::mcset ca "Stop chat window autoscroll." "Desactivar el desplaçament\ automàtic en finestres de conversa." ::msgcat::mcset ca "Store" "Guardar" ::msgcat::mcset ca "Store group chats logs." "Guardar registres de converses\ en grup." ::msgcat::mcset ca "Store private chats logs." "Guardar registres de\ converses privades." ::msgcat::mcset ca "Stored collapsed roster groups." "Emmagatzemar l'estat\ dels grups colapsats en la llista de contactes." ::msgcat::mcset ca "Stored show offline roster groups." "Emmagatzemar si es\ mostra o no els grups desconnectats en la llista de contactes." ::msgcat::mcset ca "Stream method negotiation failed" "Error negociant el\ mètode d'enviament" ::msgcat::mcset ca "Strip leading 'http://jabber.org/protocol/' from IQ\ namespaces in the status line." "Treure 'http://jabber.org/protocol/'\ de l'espai de nombres IQ en la línia d'estat." ::msgcat::mcset ca "Strip leading \\" "Strip leading \\" ::msgcat::mcset ca "Strip leading \\" "Treure \\" ::msgcat::mcset ca "Subject" "Assumpte" ::msgcat::mcset ca "Subject:" "Assumpte:" ::msgcat::mcset ca "Subscribe" "Subscriure's" ::msgcat::mcset ca "Subscribe request from" "Petició de suscripció de" ::msgcat::mcset ca "Subscribe request from %s" "Petició de suscripció de %s" ::msgcat::mcset ca "Subscription:" "Subscripció:" ::msgcat::mcset ca "Substrings to highlight in messages." "Sil·labes a\ resaltar als missatges." ::msgcat::mcset ca "Suffix" "Sufix" ::msgcat::mcset ca "Suffix:" "Sufix:" ::msgcat::mcset ca "Tabs:" "Pestanyes:" ::msgcat::mcset ca "Telephone numbers" "Números de telèfon" ::msgcat::mcset ca "Templates" "Plantilles" ::msgcat::mcset ca "Text" "Text" ::msgcat::mcset ca "Text Color" "Color del text" ::msgcat::mcset ca "Text status, which is set when Tkabber is moving in away\ state." "Text d'estatus que s'assignarà quan Tkabber et marque com a\ absent." ::msgcat::mcset ca "text undo" "desfer text" ::msgcat::mcset ca "Text:" "Text:" ::msgcat::mcset ca "this option has been set and saved." "aquesta opció ha\ sigut definida i guardada." ::msgcat::mcset ca "this option is unchanged from its standard setting." "la\ definició estàndard d'aquesta opció no ha sigut canviada." ::msgcat::mcset ca "Time" "Hora" ::msgcat::mcset ca "time %s%s:" "temps %s%s:" ::msgcat::mcset ca "time %s%s: %s" "temps %s%s: %s" ::msgcat::mcset ca "Time interval before playing next sound (in\ milliseconds)." "Interval de temps entre reproducció de sons (en\ milisegons)." ::msgcat::mcset ca "Time Zone:" "Zona horària:" ::msgcat::mcset ca "Time:" "Hora:" ::msgcat::mcset ca "Timeout for waiting for HTTP poll responses (if set to\ zero, Tkabber will wait forever)." "Temps d'espera per a resposta\ HTTP Poll (si ès cero, Tkabber esperarà per sempre)." ::msgcat::mcset ca "Timer" "Temporitzador" ::msgcat::mcset ca "Title:" "Càrrec:" ::msgcat::mcset ca "Tkabber will set priority to 0 when moving in extended\ away state." "Tkabber posarà la prioritat a 0 en passar a estat molt\ absent." ::msgcat::mcset ca "To:" "Per a:" ::msgcat::mcset ca "Toggle encryption" "Activar/desactivar xifratge" ::msgcat::mcset ca "Toggle encryption (when possible)" "Activar/desactivar el\ xifratge (si és possible)" ::msgcat::mcset ca "Toggle seen" "Activar/desactivar llegit" ::msgcat::mcset ca "Toggle showing offline users" "Activar/desactivar mostrar\ usuaris desconnectats" ::msgcat::mcset ca "Toggle signing" "Activar/desactivar la signatura" ::msgcat::mcset ca "Transfering..." "Transferint..." ::msgcat::mcset ca "Transferring..." "Transferint..." ::msgcat::mcset ca "Try again" "Tornar a intentar-ho" ::msgcat::mcset ca "Type" "Tipus" ::msgcat::mcset ca "Type:" "Tipus:" ::msgcat::mcset ca "UID" "UID" ::msgcat::mcset ca "Unable to encipher data for %s: %s.\n\nEncrypting traffic\ to this user is now disabled.\n\nSend it as PLAINTEXT?" "Impossible\ xifrar dades per a %s: %s.\n\nEl xifratge de dades per a aquest\ usuari es desactiva a partir d'ara.\n\n¿Enviar com a TEXT NET?" ::msgcat::mcset ca "Unable to sign message body: %s.\n\nSigning traffic is\ now disabled.\n\nSend it WITHOUT a signature?" "Impossible signar el\ cos del missatge: %s.\n\nEnviar SENSE signatura?" ::msgcat::mcset ca "Unable to sign presence information: %s.\n\nPresence will\ be sent, but signing traffic is now disabled." "Impossible signar la\ informació de presència: %s.\n\nLa presència s'enviarà, pero s'ha\ desactivat la signatura del tràfic." ::msgcat::mcset ca "Unauthorized" "No autoritzat" ::msgcat::mcset ca "Undefined" "Sense definir" ::msgcat::mcset ca "Undo" "Desfer" ::msgcat::mcset ca "Unit:" "Unitat:" ::msgcat::mcset ca "Unsubscribe" "Cancel·lar subscripció" ::msgcat::mcset ca "Unsubscribed from %s" "Cancel·lada la subscripció a %s" ::msgcat::mcset ca "Up" "Amunt" ::msgcat::mcset ca "Update message of the day..." "Actualitzar missatge del\ dia..." ::msgcat::mcset ca "Uptime" "Temps actiu" ::msgcat::mcset ca "URL" "URL" ::msgcat::mcset ca "URL to connect to." "URL a que connectar." ::msgcat::mcset ca "Url to connect to." "Url a la qual connectar." ::msgcat::mcset ca "URL to poll:" "URL per a poll:" ::msgcat::mcset ca "URL:" "URL:" ::msgcat::mcset ca "Url:" "Url:" ::msgcat::mcset ca "Use aliases" "Utilitzar àlies" ::msgcat::mcset ca "Use aliases to show multiple users in one roster item."\ "Usar àlies per a mostrar múltiples usuaris en un sol ítem de la\ llista de contactes." ::msgcat::mcset ca "Use client security keys" "Usar claus de seguretat del\ client" ::msgcat::mcset ca "Use colored messages" "Usar missatges colorejats" ::msgcat::mcset ca "Use colored nicks" "Usar àlies colorejats" ::msgcat::mcset ca "Use colored nicks in chat windows." "Usar àlies\ colorejats en finestres de xat" ::msgcat::mcset ca "Use colored nicks in groupchat rosters." "Usar àlies\ colorejats en la llista de participants d'una sala de xat" ::msgcat::mcset ca "Use colored roster nicks" "Usar àlies colorejats en la\ llista de contactes" ::msgcat::mcset ca "Use explicitly-specified server address." "Utilitzar\ adreça del servidor especificada explícitament." ::msgcat::mcset ca "Use hashed password" "Utilitzar resum de la contrasenya" ::msgcat::mcset ca "Use hashed password transmission." "Usar transmissió del\ resum de la contrasenya." ::msgcat::mcset ca "Use HTTP poll client security keys (recommended)." "Usar\ claus de seguretat del client HTTP poll (recomanat)." ::msgcat::mcset ca "Use HTTP poll connection method." "Usar mètode de\ connexió HTTP poll." ::msgcat::mcset ca "Use HTTP proxy to connect." "Utilitzar proxy HTTP per\ connectar." ::msgcat::mcset ca "Use Proxy" "Utilitzar proxy" ::msgcat::mcset ca "Use SASL authentification" "Usar autentificació SASL" ::msgcat::mcset ca "Use SASL authentification." "Usar autentificació SASL." ::msgcat::mcset ca "Use sound notification only when being available." "Usar\ la notificació sonora solament quan s'estiga en estat 'disponible'." ::msgcat::mcset ca "Use SSL" "Utilitzar SSL" ::msgcat::mcset ca "Use SSL to connect to server." "Utilitzar SSL per\ connectar amb el servidor" ::msgcat::mcset ca "Use this module" "Utilitzar aquest mòdul" ::msgcat::mcset ca "use v2 protocol" "utilitzar protocol v2" ::msgcat::mcset ca "User ID" "ID d'usuari" ::msgcat::mcset ca "User info" "Informació de l'usuari" ::msgcat::mcset ca "user interface" "interfície d'usuari" ::msgcat::mcset ca "User name." "Usuari." ::msgcat::mcset ca "Username Not Available" "El nom d'usuari no està\ disponible" ::msgcat::mcset ca "Username:" "Usuari:" ::msgcat::mcset ca "Users" "Usuaris" ::msgcat::mcset ca "utilities" "utilitats" ::msgcat::mcset ca "Value" "Valor" ::msgcat::mcset ca "Value:" "Valor:" ::msgcat::mcset ca "vcard %s%s:" "vcard %s%s:" ::msgcat::mcset ca "vcard %s%s: %s" "vcard %s%s: %s" ::msgcat::mcset ca "vCard items to display in chat windows when using /vcard\ command." "elements vCard a mostrar en les finestres de xarla quan\ s'usa /vcard" ::msgcat::mcset ca "Version" "Versió" ::msgcat::mcset ca "version %s%s:" "versió s%s:" ::msgcat::mcset ca "version %s%s: %s" "versió s%s: %s" ::msgcat::mcset ca "Version:" "Versió:" ::msgcat::mcset ca "Video:" "Vídeo:" ::msgcat::mcset ca "Visitors" "Visitants" ::msgcat::mcset ca "Voice:" "Veu:" ::msgcat::mcset ca "Waiting for activating privacy list" "Esperant per\ activar la llista de privacitat" ::msgcat::mcset ca "Waiting for authentication mechanisms" "Esperant\ mecanismes d'autenticació" ::msgcat::mcset ca "Waiting for authentication results" "Esperant els\ resultats de l'autenticació" ::msgcat::mcset ca "Waiting for roster" "Esperant la llista de contactes" ::msgcat::mcset ca "Waiting for stream" "Esperant missatge" ::msgcat::mcset ca "Warning" "Advertència" ::msgcat::mcset ca "Warning display options." "Opcions de mostrar\ advertències." ::msgcat::mcset ca "Warning: Remote server doesn't support\nhashed password\ authentication.\n\nProceed with PLAINTEXT authentication?"\ "Advertència: el servidor remot no suporta\nautenticació per resum de\ clau.\n\n¿Procedir a intentar una identificació per text plà?" ::msgcat::mcset ca "We unsubscribed from %s" "Hem cancel·lat la subscripció a\ %s" ::msgcat::mcset ca "Web Site" "Lloc Web" ::msgcat::mcset ca "Web Site:" "Lloc web:" ::msgcat::mcset ca "What action does the close button." "Acció realitzada pel\ butó de Tancar." ::msgcat::mcset ca "When you have unread messages the taskbar icon will start\ to blink." "Quan tens missatges sense llegir l'icona de la barra de\ tasques parpadejarà." ::msgcat::mcset ca "White" "Blanques" ::msgcat::mcset ca "Whiteboard" "Pissarra blanca" ::msgcat::mcset ca "Whois" "Qui és?" ::msgcat::mcset ca "Work:" "Treball:" ::msgcat::mcset ca "Year:" "Any:" ::msgcat::mcset ca "you have edited the value, but you have not set the\ option." "Has editat el valor, però no has definit l'opció." ::msgcat::mcset ca "you have set this option, but not saved it for future\ sessions." "has activat aquesta opció, però no l'has guardada per a\ sessions futures." ::msgcat::mcset ca "Zebra list: %s" "Llista Zebra: %s" ::msgcat::mcset ca "Zebra lists" "Llistes Zebra" ::msgcat::mcset ca "Zip:" "Codi Postal:" ::msgcat::mcset ca "Automatically away due to idle" ::msgcat::mcset ca "BBS:" ::msgcat::mcset ca "jabber xml" ::msgcat::mcset ca "kde" ::msgcat::mcset ca "PCS:" ::msgcat::mcset ca "Proxy" ::msgcat::mcset ca "SASL" ::msgcat::mcset ca "SSL" ::msgcat::mcset ca "SSL Info" ::msgcat::mcset ca "UID:" ::msgcat::mcset ca "UTC:" ::msgcat::mcset ca "wmaker" # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/msgs/de.msg000064400000000000000000004151701477701321300141320ustar00nobodynobody# de.msg -- # # German messages for the Tkabber XMPP client. # # Author: Roger Sondermann # Last-Modified: 06.03.2011 # .../chats.tcl ::msgcat::mcset de "%s - Chat" "%s - Chat" ::msgcat::mcset de "%s has changed nick to %s." "%s hat seinen Nicknamen\ geändert in %s" ::msgcat::mcset de "/me has set the subject to: %s" "/me hat den Betreff\ gesetzt zu: %s" ::msgcat::mcset de "Chat" "Chat" ::msgcat::mcset de "Chat options." "Optionen für Chats." ::msgcat::mcset de "Display description of user status in chat windows."\ "Beschreibung des Kontakt-Status in Chat-Fenstern anzeigen." ::msgcat::mcset de "Enable chat window autoscroll only when last message is\ shown." "Automatisches Scrollen erst aktivieren, nachdem die letzte\ Nachricht angezeigt worden ist." ::msgcat::mcset de "Generate chat messages when chat peer changes his/her\ status and/or status message" "Chat-Nachrichten erstellen, wenn der\ Chat-Partner seinen Status und/oder die Status-Nachricht ändert." ::msgcat::mcset de "Invite" "Einladen" ::msgcat::mcset de "Invite %s to conferences" "%s zu Konferenzen einladen" ::msgcat::mcset de "Invite to conference..." "Zu Konferenz einladen..." ::msgcat::mcset de "Invite users to %s" "Kontakte einladen nach %s" ::msgcat::mcset de "Invite users..." "Kontakte einladen..." ::msgcat::mcset de "List of users for chat." "Kontakt-Liste für Chat." ::msgcat::mcset de "Moderators" "Moderatoren" ::msgcat::mcset de "No conferences for %s in progress..." "Keine Konferenzen\ für %s im Gang." ::msgcat::mcset de "No users in %s roster..." "Keine Kontakte in %s Roster." ::msgcat::mcset de "Open chat" "Chat öffnen" ::msgcat::mcset de "Open new conversation" "Neue Konversation öffnen" ::msgcat::mcset de "Opens a new chat window for the new nick of the room\ occupant" "Öffnet ein neues Chat-Fenster für den neuen Nicknamen des\ Konferenz-Teilnehmers" ::msgcat::mcset de "Participants" "Teilnehmer" ::msgcat::mcset de "Please join %s" "Bitte %s beitreten" ::msgcat::mcset de "Start chat" "Chat starten" ::msgcat::mcset de "Stop chat window autoscroll." "Automatisches Scrollen von\ Chat-Fenstern abstellen." ::msgcat::mcset de "Subject is set to: %s" "Betreff ist gesetzt zu: %s" ::msgcat::mcset de "Subject:" "Betreff:" ::msgcat::mcset de "Users" "Benutzer" ::msgcat::mcset de "Visitors" "Besucher" # .../configdir.tcl ::msgcat::mcset de "Attention" "Achtung" ::msgcat::mcset de "Please, be patient while Tkabber configuration directory\ is being transferred to the new location" "Bitte haben Sie Geduld,\ während der Tkabber Konfigurations-Ordner an die neue Stelle\ übertragen wird." ::msgcat::mcset de "Tkabber configuration directory transfer failed\ with:\n%s\n Tkabber will use the old directory:\n%s" "Die Übertragung\ des Tkabber Konfigurations-Ordners ist misslungen:\n%s\n Tkabber wird\ den bisherigen Ordner benutzen:\n%s" ::msgcat::mcset de "Your new Tkabber config directory is now:\n%s\nYou can\ delete the old one:\n%s" "Der neue Tkabber Konfigurations-Ordner\ ist:\n%s\nDer bisherige kann gelöscht werden:\n%s" # .../custom.tcl ::msgcat::mcset de "Customization of the One True Jabber Client."\ "Einstellungen für den einzig wahren Jabber-Client." ::msgcat::mcset de "Open" "Öffnen" ::msgcat::mcset de "Parent group" "Übergeordnete Gruppe" ::msgcat::mcset de "Parent groups" "Übergeordnete Gruppen" ::msgcat::mcset de "Reset to current value" "Zurücksetzen auf derzeitigen\ Wert" ::msgcat::mcset de "Reset to default value" "Zurücksetzen auf\ voreingestellten Wert" ::msgcat::mcset de "Reset to saved value" "Zurücksetzen auf gespeicherten\ Wert" ::msgcat::mcset de "Reset to value from config file" "Zurücksetzen auf Wert\ aus Konfigurations-Datei" ::msgcat::mcset de "Set for current and future sessions" "Setzen für\ derzeitige und zukünftige Sitzungen" ::msgcat::mcset de "Set for current session only" "Setzen nur für derzeitige\ Sitzung" ::msgcat::mcset de "the option is set and saved." "die Option ist gesetzt und\ gespeichert." ::msgcat::mcset de "the option is set to its default value." "die Option ist\ auf ihren voreingestellten Wert gesetzt." ::msgcat::mcset de "the option is set, but not saved." "die Option ist\ gesetzt, aber nicht gespeichert." ::msgcat::mcset de "the option is taken from config file." "die Option ist\ aus der Konfigurations-Datei übernommen worden." ::msgcat::mcset de "value is changed, but the option is not set." "Wert wurde\ geändert, aber die Option ist nicht gesetzt." # .../datagathering.tcl ::msgcat::mcset de "Address:" "Adresse:" ::msgcat::mcset de "City:" "Stadt:" ::msgcat::mcset de "Date:" "Datum:" ::msgcat::mcset de "Error requesting data: %s" "Fehler bei Daten-Anforderung:\ %s" ::msgcat::mcset de "State:" "Bundesland:" ::msgcat::mcset de "Text:" "Text:" # .../default.tcl ::msgcat::mcset de "Command to be run when you click a URL in a message. '%s'\ will be replaced with this URL (e.g. \"chromium %s >>& /dev/null\" or\ \"{C:/Program Files (x86)/Mozilla Firefox/firefox.exe} %s\")."\ "Auszuführender Befehl, wenn in einer Nachricht eine URL angeklickt\ wird. '%s' wird ersetzt durch die URL. Beispiel: \"chromium %s >>&\ /dev/null\" oder \"{C:/Program Files (x86)/Mozilla\ Firefox/firefox.exe} %s\"" ::msgcat::mcset de "Error displaying %s in browser\n\n%s" "Fehler bei der\ Anzeige von %s im Browser\n\n%s" ::msgcat::mcset de "Please define environment variable BROWSER" "Bitte die\ Umgebungsvariable BROWSER setzen" # .../disco.tcl ::msgcat::mcset de "%s: %s/%s, Description: %s, Version: %s\nNumber of\ children: %s" "%s: %s/%s, Beschreibung: %s, Version: %s\nAnzahl\ Einträge: %s" ::msgcat::mcset de "Browse" "Durchsuchen" ::msgcat::mcset de "Clear window" "Fenster leeren" ::msgcat::mcset de "Delete current node and subnodes" "Aktuellen Knoten und\ Sub-Knoten löschen" ::msgcat::mcset de "Delete subnodes" "Sub-Knoten löschen" ::msgcat::mcset de "Discovery" "Service-Discovery" ::msgcat::mcset de "Error getting info: %s" "Fehler beim Erhalten der\ Informationen: %s" ::msgcat::mcset de "Error getting items: %s" "Fehler beim Erhalten der\ Einträge: %s" ::msgcat::mcset de "JID:" "JID:" ::msgcat::mcset de "List of discovered JID nodes." "Liste der entdeckten\ JID-Knoten." ::msgcat::mcset de "List of discovered JIDs." "Liste der entdeckten JIDs." ::msgcat::mcset de "Node:" "Knoten:" ::msgcat::mcset de "Service Discovery" "Service-Discovery" ::msgcat::mcset de "Sort items by JID/node" "Nach JID/Knoten sortieren" ::msgcat::mcset de "Sort items by name" "Nach Namen sortieren" ::msgcat::mcset de "Version:" "Version:" # .../filetransfer.tcl ::msgcat::mcset de "Can't open file \"%s\": %s" "Kann Datei nicht öffnen\ \"%s\": %s" ::msgcat::mcset de "Default directory for downloaded files."\ "Voreingestellter Ordner für heruntergeladene Dateien." ::msgcat::mcset de "Default protocol for sending files." "Voreingestelltes\ Protokoll für das Senden von Dateien." ::msgcat::mcset de "File path:" "Datei-Pfad:" ::msgcat::mcset de "File Transfer options." "Optionen für die\ Datei-Übertragung." ::msgcat::mcset de "Protocol:" "Protokoll:" ::msgcat::mcset de "Send file to %s" "Datei an %s senden" ::msgcat::mcset de "Send file..." "Datei senden..." ::msgcat::mcset de "unknown" "unbekannt" # .../filters.tcl ::msgcat::mcset de "Action" "Aktion" ::msgcat::mcset de "Edit" "Ändern" ::msgcat::mcset de "Move down" "Nach unten" ::msgcat::mcset de "Move up" "Nach oben" # .../gpgme.tcl ::msgcat::mcset de "\n\tPresence is signed:" "\n\tPräsenz ist signiert:" ::msgcat::mcset de " by " " durch " ::msgcat::mcset de "%s purportedly signed by %s can't be verified: %s." "%s,\ (möglicherweise) von %s signiert, kann nicht verifiziert werden: %s." ::msgcat::mcset de ">>> Unable to decipher data: %s <<<" ">>> Keine\ Daten-Verschlüsselung möglich: %s <<<" ::msgcat::mcset de "Change security preferences for %s"\ "Sicherheits-Einstellungen für %s ändern" ::msgcat::mcset de "Data purportedly sent by %s can't be deciphered.\n\n%s."\ "Die Daten, die (möglicherweise) von %s gesendet wurden, können nicht\ entschlüsselt werden.\n\n%s." ::msgcat::mcset de "Display warning dialogs when signature verification\ fails." "Warnung anzeigen, wenn Signatur-Verifizierung misslingt." ::msgcat::mcset de "Edit security..." "Sicherheitseinstellungen ändern..." ::msgcat::mcset de "Encrypt traffic" "Datenverkehr verschlüsseln" ::msgcat::mcset de "Encrypt traffic (when possible)" "Datenverkehr\ verschlüsseln (wenn möglich)" ::msgcat::mcset de "Encryption" "GnuPG-Verschlüsselung" ::msgcat::mcset de "Error in signature processing" "Fehler bei der\ Signatur-Verarbeitung" ::msgcat::mcset de "Error in signature verification software: %s." "Fehler in\ der Signatur-Verarbeitungs-Software: %s" ::msgcat::mcset de "Fetch GPG key" "GPG-Schlüssel abrufen" ::msgcat::mcset de "GPG error" "GPG-Fehler" ::msgcat::mcset de "GPG options (signing and encryption)." "GPG-Optionen\ (verschlüsseln und signieren)." ::msgcat::mcset de "GPG-encrypt outgoing messages where possible."\ "Ausgehende Nachrichten GPG-verschlüsseln, wenn möglich." ::msgcat::mcset de "GPG-sign outgoing messages and presence updates."\ "Ausgehende Nachrichten und Präsenz-Aktualisierungen GPG-signieren." ::msgcat::mcset de "Invalid signature" "Ungültige Signatur" ::msgcat::mcset de "Key ID" "Schlüssel-ID" ::msgcat::mcset de "Malformed signature block" "Missgebildeter\ Signatur-Block" ::msgcat::mcset de "Message body" "Nachrichten-Text" ::msgcat::mcset de "Multiple signatures having different authenticity"\ "Mehrere Signaturen haben unterschiedliche Glaubwürdigkeiten" ::msgcat::mcset de "No information available" "Keine Informationen verfügbar" ::msgcat::mcset de "Passphrase:" "Passphrase:" ::msgcat::mcset de "Please enter passphrase" "Bitte die Passphrase eingeben" ::msgcat::mcset de "Please try again" "Bitte nochmals versuchen" ::msgcat::mcset de "Presence information" "Präsenz-Information" ::msgcat::mcset de "Presence is signed" "Präsenz ist signiert" ::msgcat::mcset de "Reason:" "Grund:" ::msgcat::mcset de "Select" "Auswählen" ::msgcat::mcset de "Select Key for Signing %s Traffic" "Schlüssel für die\ Signatur von %s Datenverkehr auswählen" ::msgcat::mcset de "Sign traffic" "Datenverkehr signieren" ::msgcat::mcset de "Signature not processed due to missing key" "Signatur\ nicht verarbeitet wegen fehlendem Schlüssel" ::msgcat::mcset de "The signature is good but has expired" "Die Signatur ist\ gut, aber verfallen" ::msgcat::mcset de "The signature is good but the key has expired" "Die\ Signatur ist gut, aber der Schlüssel ist verfallen" ::msgcat::mcset de "Toggle encryption" "Verschlüsselung umschalten" ::msgcat::mcset de "Toggle encryption (when possible)" "Verschlüsselung (wenn\ möglich) umschalten" ::msgcat::mcset de "Toggle signing" "Signierung umschalten" ::msgcat::mcset de "Unable to encipher data for %s: %s.\n\nEncrypting traffic\ to this user is now disabled.\n\nSend it as PLAINTEXT?" "Es ist nicht\ möglich, Daten für %s zu verschlüsseln: %s.\n\nDie Verschlüsselung\ von Daten für diesem Kontakt wird jetzt deaktiviert.\n\nAls KLARTEXT\ versenden?" ::msgcat::mcset de "Unable to sign message body: %s.\n\nSigning traffic is\ now disabled.\n\nSend it WITHOUT a signature?" "Es ist nicht möglich,\ den Nachrichten-Text zu signieren: %s.\n\nDie Signierung von Daten\ wird jetzt deaktiviert.\n\nOHNE Signature versenden?" ::msgcat::mcset de "Unable to sign presence information: %s.\n\nPresence will\ be sent, but signing traffic is now disabled." "Es ist nicht möglich,\ die Präsenz-Information zu signieren: %s.\n\nDie Präsenz wird\ gesendet, aber die Signierung von Daten wird jetzt deaktiviert." ::msgcat::mcset de "Use specified key ID for signing and decrypting\ messages." "Die angegebene Schlüssel-ID für das Verschlüsseln und\ Signieren von Nachrichten benutzen." ::msgcat::mcset de "Use the same passphrase for signing and decrypting\ messages." "Zum Verschlüsseln und Signieren von Nachrichten dieselbe\ Passphrase benutzen." ::msgcat::mcset de "User ID" "Kontakt-ID" # .../iface.tcl ::msgcat::mcset de "Begin date" "Erstell-Datum\t" ::msgcat::mcset de "Cipher" "Verschlüsselung\t" ::msgcat::mcset de "Disabled\n" "Deaktiviert\n" ::msgcat::mcset de "Enabled\n" "Aktiviert\n" ::msgcat::mcset de "Expiry date" "Verfalls-Datum\t" ::msgcat::mcset de "Invisible" "Unsichtbar" ::msgcat::mcset de "Issuer" "Aussteller" ::msgcat::mcset de "Not logged in" "Nicht angemeldet" ::msgcat::mcset de "Open login log" "Anmelde-Log" ::msgcat::mcset de "Serial number" "Serien-Nummer\t" ::msgcat::mcset de "Session key bits" "'Session Key'-Bits\t" ::msgcat::mcset de "SHA1 hash" "SHA1-Prüfsumme\t" ::msgcat::mcset de "Subject" "Betreff\t\t" # .../iq.tcl ::msgcat::mcset de "%s request from %s" "%s-Anfrage von %s" ::msgcat::mcset de "Info/Query options." "Optionen für\ Informationen/Anfragen." ::msgcat::mcset de "Show IQ requests in the status line." "IQ-Anfragen in der\ Status-Leiste anzeigen." ::msgcat::mcset de "Strip leading \"http://jabber.org/protocol/\" from IQ\ namespaces in the status line." "Führendes\ \"http://jabber.org/protocol/\" von IQ-Namensräumen in der\ Status-Leiste entfernen." # .../itemedit.tcl ::msgcat::mcset de "<- Remove" "<- Entfernen" ::msgcat::mcset de "Add ->" "Hinzufügen ->" ::msgcat::mcset de "Available groups" "Verfügbare Gruppen" ::msgcat::mcset de "Current groups" "Derzeitige Gruppen" ::msgcat::mcset de "Edit groups for %s" "Gruppen ändern für %s" ::msgcat::mcset de "Edit item..." "Eintrag ändern..." ::msgcat::mcset de "Edit nickname for %s" "Nicknamen ändern für %s" ::msgcat::mcset de "Nickname:" "Nickname:" # .../joingrdialog.tcl ::msgcat::mcset de "Cancel" "Abbrechen" ::msgcat::mcset de "Connection:" "Verbindung:" ::msgcat::mcset de "Group:" "Gruppe:" ::msgcat::mcset de "Join" "Beitreten" ::msgcat::mcset de "Join group" "Konferenz beitreten" ::msgcat::mcset de "Join group dialog data (groups)." "Dialog-Daten\ Konferenz-Beitritt (Konferenzen)." ::msgcat::mcset de "Join group dialog data (nicks)." "Dialog-Daten\ Konferenz-Beitritt (Nicknamen)." ::msgcat::mcset de "Join group dialog data (servers)." "Dialog-Daten\ Konferenz-Beitritt (Server)." ::msgcat::mcset de "Nick:" "Nickname:" ::msgcat::mcset de "Server:" "Server:" # .../login.tcl ::msgcat::mcset de ". Proceed?\n\n" ". Fortsetzen?\n\n" ::msgcat::mcset de "Address type not supported by SOCKS proxy" "Vom\ SOCKS-Proxy nicht unterstützter Adressen-Typ" ::msgcat::mcset de "Allow plaintext authentication mechanisms (when password\ is transmitted unencrypted)." "Klartext-Authentifizierung erlauben\ (wenn Kennwort unverschlüsselt übermittelt wird)." ::msgcat::mcset de "Allow X-GOOGLE-TOKEN authentication mechanisms. It\ requires connection to Google via HTTPS." "X-GOOGLE-TOKEN\ Authentifizierungs-Mechanismus erlauben. Dies erfordert eine\ Verbindung zu Google via HTTPS." ::msgcat::mcset de "Authentication failed: %s" "Authentifizierung misslungen:\ %s" ::msgcat::mcset de "Authentication failed: %s\nCreate new account?"\ "Authentifizierung misslungen: %s\nNeues Konto einrichten?" ::msgcat::mcset de "Certificate has expired" "Zertifikat ist verfallen" ::msgcat::mcset de "Change password" "Kennwort ändern" ::msgcat::mcset de "Compression" "Komprimierung" ::msgcat::mcset de "Connecting to %s" "Verbinde mit %s" ::msgcat::mcset de "Connection refused by destination host" "Verbindung wurde\ vom Ziel-Host verweigert" ::msgcat::mcset de "Display SSL warnings." "SSL-Warnungen anzeigen." ::msgcat::mcset de "Encryption (legacy SSL)" "Verschlüsselung (Legacy SSL)" ::msgcat::mcset de "Encryption (STARTTLS)" "Verschlüsselung (STARTTLS)" ::msgcat::mcset de "Failed to connect: %s" "Verbindung misslungen: %s" ::msgcat::mcset de "Forced logout" "Abmeldung erzwungen" ::msgcat::mcset de "Host unreachable" "Host nicht erreichbar" ::msgcat::mcset de "Incorrect SOCKS version" "Inkorrekte SOCKS-Version" ::msgcat::mcset de "Keep trying" "Weiterhin versuchen" ::msgcat::mcset de "List of logout reasons." "Liste von Abmelde-Gründen." ::msgcat::mcset de "Login is successful" "Anmeldung erfolgreich" ::msgcat::mcset de "Login log" "Anmelde-Log" ::msgcat::mcset de "Login options." "Optionen für die Anmeldung." ::msgcat::mcset de "Login retry for %s in %s" "Anmeldungs-Wiederholung für %s\ in %s" ::msgcat::mcset de "Logout with reason" "Abmelden mit Grund" ::msgcat::mcset de "Maximum poll interval." "Abfrage-Intervall (max.)." ::msgcat::mcset de "Minimum poll interval." "Abfrage-Intervall (min.)." ::msgcat::mcset de "Network failure" "Netzwerk-Fehler" ::msgcat::mcset de "Network unreachable" "Netzwerk nicht erreichbar" ::msgcat::mcset de "New password:" "Neues Kennwort:" ::msgcat::mcset de "Number of HTTP poll client security keys to send before\ creating new key sequence." "Anzahl der\ HTTP-Poll-Client-Sicherheitsschlüssel, die gesendet werden, bevor\ eine neue Schlüssel-Sequenz erstellt wird." ::msgcat::mcset de "Old password:" "Altes Kennwort:" ::msgcat::mcset de "Password." "Kennwort." ::msgcat::mcset de "Plaintext" "Klartext" ::msgcat::mcset de "Priority." "Priorität." ::msgcat::mcset de "Priority:" "Priorität:" ::msgcat::mcset de "Proxy authentication required" "Proxy-Authentifizierung\ erforderlich" ::msgcat::mcset de "Repeat new password:" "Neues Kennwort wiederholen:" ::msgcat::mcset de "Replace opened connections." "Offene Verbindungen\ ersetzen." ::msgcat::mcset de "Resource." "Ressource." ::msgcat::mcset de "Retry to connect forever." "Wiederholt versuchen, eine\ Verbindung herzustellen." ::msgcat::mcset de "Self signed certificate" "'Self Signed'-Zertifikat" ::msgcat::mcset de "Server name or IP-address." "Server-Name oder\ IP-Adresse." ::msgcat::mcset de "Server name." "Server-Name." ::msgcat::mcset de "Server port." "Server-Port." ::msgcat::mcset de "SOCKS authentication failed" "SOCKS-Authentifizierung\ misslungen" ::msgcat::mcset de "SOCKS command not supported" "Nicht unterstützter\ SOCKS-Befehl" ::msgcat::mcset de "SOCKS connection not allowed by ruleset"\ "SOCKS-Verbindung vom Regelwerk nicht erlaubt" ::msgcat::mcset de "SOCKS request failed" "SOCKS-Anforderung misslungen" ::msgcat::mcset de "SOCKS server cannot identify username" "SOCKS-Server kann\ Benutzer-Namen nicht identifizieren" ::msgcat::mcset de "SOCKS server username identification failed"\ "SOCKS-Server Benutzer-Namen-Identifizierung misslungen" ::msgcat::mcset de "SSL certificate file (optional)." "SSL-Zertifikat-Datei\ (optional)." ::msgcat::mcset de "SSL certification authority file or directory\ (optional)." "Autorisierungs-Datei oder -Ordner für\ SSL-Zertifizierung (optional)." ::msgcat::mcset de "SSL private key file (optional)." "Private\ SSL-Schlüssel-Datei (optional)." ::msgcat::mcset de "Starting login" "Log gestartet" ::msgcat::mcset de "Timeout" "Wartezeit-Überschreitung" ::msgcat::mcset de "Timeout for waiting for HTTP poll responses (if set to\ zero, Tkabber will wait forever)." "Wartezeit-Beschränkung für\ HTTP-Poll-Antworten (unbegrenzt bei 0)." ::msgcat::mcset de "TTL expired" "TTL verfallen" ::msgcat::mcset de "Unknown address type" "Unbekannter Adressen-Typ" ::msgcat::mcset de "Unknown error" "Unbekannter Fehler" ::msgcat::mcset de "Unsupported SOCKS authentication method" "Nicht\ unterstützte SOCKS-Authentifizierungs-Methode" ::msgcat::mcset de "Unsupported SOCKS method" "Nicht unterstützte\ SOCKS-Methode" ::msgcat::mcset de "URL to connect to." "URL für die Verbindung." ::msgcat::mcset de "Use explicitly-specified server address and port."\ "Explizit angegebene Server-Adresse und -Port benutzen." ::msgcat::mcset de "Use HTTP poll client security keys (recommended)."\ "HTTP-Poll-Client-Sicherheitsschlüssel benutzen (empfohlen)." ::msgcat::mcset de "Use HTTP poll connection method." "HTTP-Polling als\ Verbindungs-Methode benutzen." ::msgcat::mcset de "Use SASL authentication." "SASL-Authentifizierung\ benutzen." ::msgcat::mcset de "User name." "Benutzer-Name." ::msgcat::mcset de "Warning display options." "Optionen für die Anzeige von\ Warnungen." ::msgcat::mcset de "XMPP stream options when connecting to server."\ "XMPP-'Stream'-Option für das Verbinden mit dem Server." # .../messages.tcl ::msgcat::mcset de "Grant subscription" "Autorisierung zugestehen" ::msgcat::mcset de "Request subscription" "Autorisierung anfragen" ::msgcat::mcset de "Request unsubscription" "Zurückziehen der Autorisierung\ anfragen" ::msgcat::mcset de "Revoke subscription" "Autorisierung widerrufen" ::msgcat::mcset de "Approve subscription" "Autorisierung genehmigen" ::msgcat::mcset de "Attached URL:" "Angehängte URL:" ::msgcat::mcset de "Decline subscription" "Autorisierung verweigern" ::msgcat::mcset de "Extras from %s" "Extras von %s" ::msgcat::mcset de "Extras from:" "Extras von:" ::msgcat::mcset de "From: " "Von: " ::msgcat::mcset de "Group: " "Gruppe: " ::msgcat::mcset de "List of message destination JIDs." "Liste der\ Nachrichten-Ziel-JIDs." ::msgcat::mcset de "Message and Headline options." "Optionen für Nachrichten\ und Headlines." ::msgcat::mcset de "Message from:" "Nachricht von:" ::msgcat::mcset de "Quote" "Zitieren" ::msgcat::mcset de "Received by:" "Empfangen von:" ::msgcat::mcset de "Reply" "Antworten" ::msgcat::mcset de "Reply subject:" "Antwort-Betreff:" ::msgcat::mcset de "Send message" "Nachricht senden" ::msgcat::mcset de "Send message to %s" "Nachricht an %s senden" ::msgcat::mcset de "Send message to group" "Nachricht an Gruppe senden" ::msgcat::mcset de "Send message to group %s" "Nachricht an Gruppe %s senden" ::msgcat::mcset de "Send request to: " "Anfrage senden an: " ::msgcat::mcset de "Send subscription request" "Autorisierungs-Anfrage\ senden" ::msgcat::mcset de "Send subscription request to %s" "Autorisierungs-Anfrage\ an %s senden" ::msgcat::mcset de "Subject: " "Betreff: " ::msgcat::mcset de "Subscription request from %s" "Autorisierungs-Anfrage von\ %s" ::msgcat::mcset de "Subscription request from:" "Autorisierungs-Anfrage von:" ::msgcat::mcset de "To: " "An: " # .../muc.tcl ::msgcat::mcset de "\n\tAffiliation: %s" "\n\tZugehörigkeit: %s" ::msgcat::mcset de "\n\tJID: %s" "\n\tJID: %s" ::msgcat::mcset de "\nAlternative venue: %s" "\nAlternativer Treffpunkt: %s" ::msgcat::mcset de "\nReason is: %s" "\nGrund ist: %s" ::msgcat::mcset de "\nReason: %s" "\nGrund: %s" ::msgcat::mcset de " by %s" " durch %s" ::msgcat::mcset de "%s has been assigned a new affiliation: %s" "%s ist eine\ neue Zugehörigkeit zugewiesen worden: %s" ::msgcat::mcset de "%s has been assigned a new role: %s" "%s ist eine neue\ Funktion zugewiesen worden: %s" ::msgcat::mcset de "%s has been assigned a new room position: %s/%s" "%s ist\ eine neue Position innerhalb der Konferenz zugewiesen worden: %s/%s" ::msgcat::mcset de "%s has been banned" "%s ist gebannt worden" ::msgcat::mcset de "%s has been kicked" "%s ist gekickt worden" ::msgcat::mcset de "%s has been kicked because of membership loss" "%s ist\ gekickt worden wegen Verlust der Mitgliedschaft" ::msgcat::mcset de "%s has been kicked because room became members-only" "%s\ ist gekickt worden weil Konferenz 'Nur-für-Mitglieder' wurde" ::msgcat::mcset de "%s has entered" "%s ist eingetreten" ::msgcat::mcset de "%s has left" "%s ist gegangen" ::msgcat::mcset de "%s invites you to conference room %s" "%s lädt ein zu\ Konferenz %s" ::msgcat::mcset de "%s is now known as %s" "%s ist jetzt bekannt als %s" ::msgcat::mcset de "A new room is created" "Ein neuer Konferenz-Raum ist\ erstellt worden" ::msgcat::mcset de "Accept default config" "Voreingestellte Konfiguration\ akzeptieren" ::msgcat::mcset de "Add new item" "Neuen Eintrag hinzufügen" ::msgcat::mcset de "admin" "Administrator" ::msgcat::mcset de "All items:" "Alle Einträge:" ::msgcat::mcset de "and" "und" ::msgcat::mcset de "as %s/%s" "als %s/%s" ::msgcat::mcset de "Ban" "Bannen" ::msgcat::mcset de "Can't change nickname in MUC incompatible rooms"\ "Nickname kann in MUC-inkompatiblen Räumen nicht geändert werden" ::msgcat::mcset de "Cancelling configure form" "Annulliere\ Konfigurations-Formular" ::msgcat::mcset de "Conference room %s will be destroyed\ permanently.\n\nProceed?" "Konferenz-Raum %s wird dauerhaft\ entfernt.\n\nFortsetzen?" ::msgcat::mcset de "Configure form: %s" "Konfigurations-Formular: %s" ::msgcat::mcset de "Configure room" "Konferenz-Raum konfigurieren" ::msgcat::mcset de "Destroy room" "Konferenz-Raum entfernen" ::msgcat::mcset de "Edit admin list" "Administratoren-Liste ändern" ::msgcat::mcset de "Edit ban list" "Bann-Liste ändern" ::msgcat::mcset de "Edit member list" "Mitglieder-Liste ändern" ::msgcat::mcset de "Edit moderator list" "Moderatoren-Liste ändern" ::msgcat::mcset de "Edit outcast list" "Ausgeschlossenen-Liste ändern" ::msgcat::mcset de "Edit owner list" "Besitzer-Liste ändern" ::msgcat::mcset de "Edit participant list" "Teilnehmer-Liste ändern" ::msgcat::mcset de "Edit visitor list" "Besucher-Liste ändern" ::msgcat::mcset de "Edit voice list" "'Voice'-Liste ändern" ::msgcat::mcset de "Generate groupchat messages when occupant changes his/her\ status and/or status message." "Konferenz-Nachrichten erstellen, wenn\ Konferenz-Teilnehmer ihren Status und/oder die Status-Nachricht\ ändern." ::msgcat::mcset de "Generate groupchat messages when occupant's room position\ (affiliation and/or role) changes." "Konferenz-Nachrichten erstellen,\ wenn sich die Position (Zugehörigkeit und/oder Funktion) von\ Teilnehmern innerhalb einer Konferenz ändert." ::msgcat::mcset de "Generate status messages when occupants enter/exit MUC\ compatible conference rooms." "Status-Nachrichten erstellen, wenn\ Teilnehmer MUC-kompatible Konferenz-Räume betreten oder verlassen." ::msgcat::mcset de "Grant Admin Privileges" "Administrator-Privilegien\ zugestehen" ::msgcat::mcset de "Grant Membership" "Mitgliedschaft zugestehen" ::msgcat::mcset de "Grant Moderator Privileges" "Moderatoren-Privilegien\ zugestehen" ::msgcat::mcset de "Grant Owner Privileges" "Besitzer-Privilegien zugestehen" ::msgcat::mcset de "Grant Voice" "'Voice' zugestehen" ::msgcat::mcset de "Invited to:" "Eingeladen zu:" ::msgcat::mcset de "Join conference" "Konferenz beitreten" ::msgcat::mcset de "Join groupchat" "Konferenz beitreten" ::msgcat::mcset de "Kick" "Kicken" ::msgcat::mcset de "Maximum number of characters in the history in MUC\ compatible conference rooms." "Maximale Buchstaben-Anzahl in der\ Historie MUC-kompatibler Konferenz-Räume." ::msgcat::mcset de "Maximum number of stanzas in the history in MUC\ compatible conference rooms." "Maximale 'Stanza'-Anzahl in der\ Historie MUC-kompatibler Konferenz-Räume." ::msgcat::mcset de "member" "Mitglied" ::msgcat::mcset de "moderator" "Moderator" ::msgcat::mcset de "MUC" "MUC" ::msgcat::mcset de "Nick" "Nickname" ::msgcat::mcset de "none" "Keine" ::msgcat::mcset de "outcast" "Ausgeschlossener" ::msgcat::mcset de "owner" "Besitzer" ::msgcat::mcset de "participant" "Teilnehmer" ::msgcat::mcset de "Propose to configure newly created MUC room. If set to\ false then the default room configuration is automatically accepted."\ "Vorschlagen, neu erstellte MUC-Konferenz-Räume zu konfigurieren.\ Wenn nicht, wird die voreingestellte Konfiguration automatisch\ übernommen." ::msgcat::mcset de "Reason" "Grund" ::msgcat::mcset de "Report the list of current MUC rooms on disco#items\ query." "Berichte die Liste derzeitiger MUC-Konferenz-Räume bei\ 'disco#items'-Anfragen." ::msgcat::mcset de "Request only unseen (which aren't displayed in the chat\ window) messages in the history in MUC compatible conference rooms."\ "Nur ungesehene (nicht im Chat-Fenster angezeigte) Nachrichten aus\ der Historie MUC-kompatibler Konferenz-Räume abfragen." ::msgcat::mcset de "Retry to join MUC room with a different nickname (with\ added _ suffix) in case of name conflicts." "Versuche dem MUC-Raum\ bei Namenskonflikten mit einem abweichenden Nicknamen (zus.\ '_'-Suffix) beizutreten." ::msgcat::mcset de "Retrying with nickname '%s_'" "Erneuter Versuch mit\ Nickname '%s_'" ::msgcat::mcset de "Revoke Admin Privileges" "Administrator-Privilegien\ widerrufen" ::msgcat::mcset de "Revoke Membership" "Mitgliedschaft widerrufen" ::msgcat::mcset de "Revoke Moderator Privileges" "Moderatoren-Privilegien\ widerrufen" ::msgcat::mcset de "Revoke Owner Privileges" "Besitzer-Privilegien\ widerrufen" ::msgcat::mcset de "Revoke Voice" "'Voice' widerrufen" ::msgcat::mcset de "Role" "Funktion/Rolle" ::msgcat::mcset de "Room %s is successfully created" "Konferenz-Raum %s wurde\ erfolgreich erstellt" ::msgcat::mcset de "Room is created" "Konferenz-Raum wurde erstellt" ::msgcat::mcset de "Room is destroyed" "Konferenz-Raum wurde beseitigt" ::msgcat::mcset de "Sending %s %s list" "Sende %s %s Liste" ::msgcat::mcset de "Sending configure form" "Sende Konfigurations-Formular" ::msgcat::mcset de "Update item" "Eintrag aktualisieren" ::msgcat::mcset de "User already %s" "Teilnehmer ist bereits %s" ::msgcat::mcset de "User is not banned" "Teilnehmer ist nicht gebannt" ::msgcat::mcset de "User is unbanned" "Teilnehmer ist nicht mehr gebannt" ::msgcat::mcset de "visitor" "Besucher" ::msgcat::mcset de "Whois" "Whois" ::msgcat::mcset de "whois '%s': %s" "Whois '%s': %s" ::msgcat::mcset de "whois '%s': no info" "Whois '%s': keine Informationen" ::msgcat::mcset de "You must join the room to set %s" "Dem Raum muß\ beigetreten werden um %s zu setzen" # .../pep.tcl ::msgcat::mcset de "Personal eventing" "Persönliche Ereignisse" ::msgcat::mcset de "Personal eventing via pubsub plugins options." "Optionen\ für die 'Personal Eventing'-Plugins (XEP-0163)." # .../pixmaps.tcl ::msgcat::mcset de "Tkabber icon theme. To make new theme visible for Tkabber\ put it to some subdirectory of %s." "Tkabber Icon-Thema. Um es für\ Tkabber sichtbar zu machen, muß es in einem Unterordner von %s\ platziert werden." # .../plugins.tcl ::msgcat::mcset de "Loading and unloading external plugins." "Laden und\ Entladen externer Plugins." # .../presence.tcl ::msgcat::mcset de "Change Presence Priority" "Präsenz-Priorität ändern" ::msgcat::mcset de "doesn't want to be disturbed" "wünscht nicht gestört zu\ werden" ::msgcat::mcset de "Invalid userstatus value %s" "Ungültiger Status-Wert %s" ::msgcat::mcset de "is available" "ist anwesend" ::msgcat::mcset de "is away" "ist abwesend" ::msgcat::mcset de "is extended away" "ist länger abwesend" ::msgcat::mcset de "is free to chat" "ist frei zum Chatten" ::msgcat::mcset de "is invisible" "ist unsichtbar" ::msgcat::mcset de "is unavailable" "ist nicht verfügbar" ::msgcat::mcset de "Stored user priority." "Gespeicherte Kontakt-Priorität." ::msgcat::mcset de "Stored user status." "Gespeicherter Kontakt-Status." ::msgcat::mcset de "Stored user text status." "Gespeicherter\ Kontakt-Text-Status." ::msgcat::mcset de "Unsubscribed from %s" "Autorisierung zurückgezogen von\ %s" ::msgcat::mcset de "You are unsubscribed from %s" "Die Autorisierung wurde\ von %s zurückgezogen" # .../privacy.tcl ::msgcat::mcset de "Activate visible/invisible/ignore/conference lists before\ sending initial presence."\ "Sichtbar-/Unsichtbar-/Ignorieren-/Konferenzen-Listen vor dem Senden\ der einleitenden Präsenz aktivieren." ::msgcat::mcset de "Activating privacy list failed: %s\n\nTry to reconnect.\ If problem persists, you may want to disable privacy list activation\ at start" "Aktivierung der Privatsphären-Listen misslungen:\ %s\n\nVersuchen Sie eine erneute Verbindung mit dem Server. Wenn das\ Problem bestehen bleibt, stellen Sie die Aktivierung der\ Privatsphären-Listen beim Start ab." ::msgcat::mcset de "Active" "Aktiv" ::msgcat::mcset de "Add item" "Eintrag hinzufügen" ::msgcat::mcset de "Add JID" "JID hinzufügen" ::msgcat::mcset de "Add list" "Liste hinzufügen" ::msgcat::mcset de "Blocking communication (XMPP privacy lists) options."\ "Optionen für das Blockieren der Kommunikation\ (Privatsphären-Listen)." ::msgcat::mcset de "Changing accept messages from roster only: %s" "Ändere\ 'Nur Nachrichten von Kontakten im Roster akzeptieren': %s" ::msgcat::mcset de "Creating default privacy list" "Erstelle voreingestellte\ Privatsphären-Listen" ::msgcat::mcset de "Creating default privacy list failed: %s\n\nTry to\ reconnect. If problem persists, you may want to disable privacy list\ activation at start" "Erstellung der voreingestellten\ Privatsphären-Listen misslungen: %s\n\nVersuchen Sie eine erneute\ Verbindung mit dem Server. Wenn das Problem bestehen bleibt, stellen\ Sie die Aktivierung der Privatsphären-Listen beim Start ab." ::msgcat::mcset de "Default" "Voreinstellung" ::msgcat::mcset de "Down" "Abwärts" ::msgcat::mcset de "Edit conference list" "Konferenzen-Liste ändern" ::msgcat::mcset de "Edit ignore list" "Ignorieren-Liste ändern" ::msgcat::mcset de "Edit invisible list" "Unsichtbar-Liste ändern" ::msgcat::mcset de "Edit list" "Liste ändern" ::msgcat::mcset de "Edit privacy list" "Privatsphären-Liste ändern" ::msgcat::mcset de "Edit visible list" "Sichtbar-Liste ändern" ::msgcat::mcset de "Ignore list" "Ignorieren-Liste" ::msgcat::mcset de "Invisible list" "Unsichtbar-Liste" ::msgcat::mcset de "List name" "Listen-Name" ::msgcat::mcset de "No active list" "Keine aktive Liste" ::msgcat::mcset de "No default list" "Keine voreingestellte Liste" ::msgcat::mcset de "Presence-in" "Präsenz eingehend" ::msgcat::mcset de "Presence-out" "Präsenz ausgehend" ::msgcat::mcset de "Privacy list is activated" "Privatsphären-Liste ist\ aktiviert" ::msgcat::mcset de "Privacy list is not activated" "Privatsphären-Liste ist\ nicht aktiviert" ::msgcat::mcset de "Privacy list is not created" "Privatsphären-Liste ist\ nicht erstellt worden" ::msgcat::mcset de "Privacy lists" "Privatsphären-Listen" ::msgcat::mcset de "Privacy lists are not implemented" "Privatsphären-Listen\ sind nicht implementiert" ::msgcat::mcset de "Privacy lists are unavailable" "Privatsphären-Listen sind\ nicht verfügbar" ::msgcat::mcset de "Privacy lists error" "Privatsphären-Listen-Fehler" ::msgcat::mcset de "Remove from list" "Von Liste entfernen" ::msgcat::mcset de "Remove list" "Liste entfernen" ::msgcat::mcset de "Requesting conference list: %s" "Fordere\ Konferenzen-Liste an: %s" ::msgcat::mcset de "Requesting ignore list: %s" "Fordere Ignorieren-Liste an:\ %s" ::msgcat::mcset de "Requesting invisible list: %s" "Fordere Unsichtbar-Liste\ an: %s" ::msgcat::mcset de "Requesting privacy list: %s" "Fordere Privatsphären-Liste\ an: %s" ::msgcat::mcset de "Requesting privacy rules: %s" "Fordere\ Privatsphären-Regeln an: %s" ::msgcat::mcset de "Requesting visible list: %s" "Fordere Sichtbar-Liste an:\ %s" ::msgcat::mcset de "Sending conference list: %s" "Sende Konferenzen-Liste:\ %s" ::msgcat::mcset de "Sending ignore list: %s" "Sende Ignorieren-Liste: %s" ::msgcat::mcset de "Sending invisible list: %s" "Sende Unsichtbar-Liste: %s" ::msgcat::mcset de "Sending visible list: %s" "Sende Sichtbar-Liste: %s" ::msgcat::mcset de "Type" "Typ" ::msgcat::mcset de "Up" "Aufwärts" ::msgcat::mcset de "Visible list" "Sichtbar-Liste" ::msgcat::mcset de "Waiting for activating privacy list" "Warte auf\ Aktivierung der Privatsphären-Listen . . ." # .../proxy.tcl ::msgcat::mcset de "Add proxy" "Proxy-Server hinzufügen" ::msgcat::mcset de "Exclude:" "Ausschluss:" ::msgcat::mcset de "Host:" "Host:" ::msgcat::mcset de "HTTP proxies" "HTTP-Proxy-Server" ::msgcat::mcset de "Match:" "Übereinstimmung:" ::msgcat::mcset de "Password:" "Kennwort:" ::msgcat::mcset de "Port:" "Port:" ::msgcat::mcset de "Proxy type:" "Proxy-Typ:" ::msgcat::mcset de "Save" "Speichern" ::msgcat::mcset de "Serialized array of proxy servers to connect via."\ "Auflistung der Proxy-Server, über die verbunden werden soll." ::msgcat::mcset de "Tunnel proxies" "Tunnel-Proxy-Server" ::msgcat::mcset de "Username:" "Benutzer-Name:" ::msgcat::mcset de "HTTP" ::msgcat::mcset de "HTTPS" ::msgcat::mcset de "SOCKS4a" ::msgcat::mcset de "SOCKS5" # .../pubsub.tcl ::msgcat::mcset de "Affiliation" "Zugehörigkeit" ::msgcat::mcset de "Configure node" "Knoten konfigurieren" ::msgcat::mcset de "Edit entities affiliations: %s" "Zugehörigkeit der\ 'Entities' ändern: %s" ::msgcat::mcset de "Jabber ID" "Jabber ID" ::msgcat::mcset de "None" "Keine" ::msgcat::mcset de "Outcast" "Ausgeschlossener" ::msgcat::mcset de "Owner" "Besitzer" ::msgcat::mcset de "Pending" "Unerledigt" ::msgcat::mcset de "Publisher" "Herausgeber" ::msgcat::mcset de "Pubsub request failed: %s" "'Pubsub'-Abfrage misslungen:\ %s" ::msgcat::mcset de "Pubsub request succeeded" "'Pubsub'-Abfrage erfolgreich" ::msgcat::mcset de "Request default configuration" "Voreingestellte\ Konfiguration abfragen" ::msgcat::mcset de "Retrieve subscriptions" "Autorisierungen empfangen" ::msgcat::mcset de "SubID" "SubID" ::msgcat::mcset de "Subscribed" "Autorisiert" ::msgcat::mcset de "Subscription" "Autorisierung" ::msgcat::mcset de "Subscriptions to pubsub nodes at %s" "Autorisierungen für\ 'Pubsub'-Knoten bei %s" ::msgcat::mcset de "Success" "Erfolg" ::msgcat::mcset de "Unconfigured" "Nicht konfiguriert" ::msgcat::mcset de "Unsubscribe" "Abmelden/Zurückziehen" # .../register.tcl ::msgcat::mcset de "Change Password for %s" "Kennwort für %s ändern" ::msgcat::mcset de "Enter the new password for %s" "Neues Kennwort für %s\ eingeben" ::msgcat::mcset de "Register" "Registrieren" ::msgcat::mcset de "Register in %s" "Registrieren in %s" ::msgcat::mcset de "Registration is successful!" "Registrierung erfolgreich!" ::msgcat::mcset de "Registration: %s" "Registrierung: %s" ::msgcat::mcset de "Unregister" "Registrierung rückgängig machen" # .../richtext.tcl ::msgcat::mcset de "Settings of rich text facility which is used to render\ chat messages and logs." "Optionen für die 'Rich\ Text'-Fähigkeiten.\nDie Darstellung von Chat-Nachrichten und Logs." # .../roster.tcl ::msgcat::mcset de "Active Chats" "Aktive Chats" ::msgcat::mcset de "All Files" "Alle Dateien" ::msgcat::mcset de "My Resources" "Meine Ressourcen" ::msgcat::mcset de "Roster Files" "Roster-Dateien" ::msgcat::mcset de "Undefined" "Undefiniert" # .../search.tcl ::msgcat::mcset de "#" "#" ::msgcat::mcset de "An error occurred when searching in %s\n\n%s" "Fehler bei\ der Suche in %s\n\n%s" ::msgcat::mcset de "Search" "Suchen" ::msgcat::mcset de "Search again" "Erneut suchen" ::msgcat::mcset de "Search in %s" "Suchen in %s" ::msgcat::mcset de "Search in %s: No matching items found" "Suchen in %s:\ Keine passenden Einträge gefunden" ::msgcat::mcset de "Search: %s" "Suchen: %s" ::msgcat::mcset de "Try again" "Erneut versuchen" # .../si.tcl ::msgcat::mcset de "Enable SI transport %s." "Aktiviere SI-Transport %s." ::msgcat::mcset de "File transfer aborted" "Datei-Übertragung abgebrochen" ::msgcat::mcset de "Opening SI connection" "Öffne SI-Verbindung" ::msgcat::mcset de "SI connection closed" "SI-Verbindung geschlossen" ::msgcat::mcset de "Stream method negotiation failed" "Verhandlung der\ 'Stream'-Methode misslungen" # .../splash.tcl ::msgcat::mcset de "Save To Log" "In Log-Datei speichern" ::msgcat::mcset de "%s plugin" ::msgcat::mcset de "auto-away" ::msgcat::mcset de "avatars" ::msgcat::mcset de "balloon help" ::msgcat::mcset de "browsing" ::msgcat::mcset de "bwidget workarounds" ::msgcat::mcset de "configuration" ::msgcat::mcset de "connections" ::msgcat::mcset de "cryptographics" ::msgcat::mcset de "customization" ::msgcat::mcset de "emoticons" ::msgcat::mcset de "extension management" ::msgcat::mcset de "file transfer" ::msgcat::mcset de "general plugins" ::msgcat::mcset de "kde" ::msgcat::mcset de "macintosh plugins" ::msgcat::mcset de "negotiation" ::msgcat::mcset de "pixmaps management" ::msgcat::mcset de "plugin management" ::msgcat::mcset de "presence" ::msgcat::mcset de "privacy rules" ::msgcat::mcset de "roster plugins" ::msgcat::mcset de "search plugins" ::msgcat::mcset de "searching" ::msgcat::mcset de "service discovery" ::msgcat::mcset de "sound" ::msgcat::mcset de "unix plugins" ::msgcat::mcset de "user interface" ::msgcat::mcset de "utilities" ::msgcat::mcset de "windows plugins" ::msgcat::mcset de "wmaker" ::msgcat::mcset de "xmpp chat/muc" ::msgcat::mcset de "xmpp iq" ::msgcat::mcset de "xmpp library" ::msgcat::mcset de "xmpp messages" ::msgcat::mcset de "xmpp presence" ::msgcat::mcset de "xmpp registration" ::msgcat::mcset de "xmpp roster" # .../userinfo.tcl ::msgcat::mcset de "%s info" "Informationen über %s" ::msgcat::mcset de "About " "Über" ::msgcat::mcset de "Address" "Adresse" ::msgcat::mcset de "Address 2:" "Adresse 2:" ::msgcat::mcset de "All files" "Alle Dateien" ::msgcat::mcset de "BBS:" "BBS:" ::msgcat::mcset de "Birthday" "Geburtstag" ::msgcat::mcset de "Birthday:" "Geburtstag:" ::msgcat::mcset de "Cell:" "Handy:" ::msgcat::mcset de "Client" "Client" ::msgcat::mcset de "Client:" "Client:" ::msgcat::mcset de "Country:" "Land:" ::msgcat::mcset de "Day:" "Tag:" ::msgcat::mcset de "Details" "Details" ::msgcat::mcset de "E-mail:" "E-Mail:" ::msgcat::mcset de "Family name:" "Familienname:" ::msgcat::mcset de "Fax:" "Fax:" ::msgcat::mcset de "First name:" "Vorname:" ::msgcat::mcset de "Full name:" "Vollst. Name:" ::msgcat::mcset de "Geographical position" "Geographische Position" ::msgcat::mcset de "GIF images" "GIF-Bilder" ::msgcat::mcset de "Home:" "Privat:" ::msgcat::mcset de "Image" "Bild" ::msgcat::mcset de "Information" "Information" ::msgcat::mcset de "Interval:" "Zeit-Intervall:" ::msgcat::mcset de "ISDN:" "ISDN:" ::msgcat::mcset de "JPEG images" "JPEG-Bilder" ::msgcat::mcset de "Last activity" "Letzte Aktivität" ::msgcat::mcset de "Last activity or uptime" "Letzte Aktivität oder\ Betriebszeit" ::msgcat::mcset de "Latitude:" "Breitengrad:" ::msgcat::mcset de "List of users for userinfo." "Liste von Kontakten für\ Kontakt-Informationen." ::msgcat::mcset de "Load image" "Bild laden" ::msgcat::mcset de "Loading photo failed: %s." "Laden des Bildes misslungen:\ %s" ::msgcat::mcset de "Location" "Wohnort" ::msgcat::mcset de "Longitude:" "Längengrad:" ::msgcat::mcset de "Message recorder:" "Anrufbeantworter:" ::msgcat::mcset de "Middle name:" "2. Vorname:" ::msgcat::mcset de "Modem:" "Modem:" ::msgcat::mcset de "Month:" "Monat:" ::msgcat::mcset de "Name" "Name" ::msgcat::mcset de "Organization" "Unternehmen" ::msgcat::mcset de "OS:" "Betriebssystem:" ::msgcat::mcset de "Pager:" "Pager:" ::msgcat::mcset de "PCS:" "PCS:" ::msgcat::mcset de "Personal" "Persönlich" ::msgcat::mcset de "Personal " "Personell" ::msgcat::mcset de "Phones" "Telefon" ::msgcat::mcset de "Photo" "Photo" ::msgcat::mcset de "PNG images" "PNG-Bilder" ::msgcat::mcset de "Postal code:" "Postleitzahl:" ::msgcat::mcset de "Preferred:" "Bevorzugt:" ::msgcat::mcset de "Prefix:" "Präfix:" ::msgcat::mcset de "Role:" "Funktion:" ::msgcat::mcset de "Service info" "Dienst-Information" ::msgcat::mcset de "Show" "Anzeigen" ::msgcat::mcset de "Show info" "Informationen anzeigen" ::msgcat::mcset de "Show user or service info" "Kontakt- oder\ Dienst-Informationen anzeigen" ::msgcat::mcset de "Suffix:" "Suffix:" ::msgcat::mcset de "Telephone numbers" "Telefon-Nummern" ::msgcat::mcset de "Time" "Zeit" ::msgcat::mcset de "Time zone:" "Zeitzone:" ::msgcat::mcset de "Time:" "Zeit:" ::msgcat::mcset de "Title:" "Titel:" ::msgcat::mcset de "UID:" "UID:" ::msgcat::mcset de "Unit:" "Abteilung:" ::msgcat::mcset de "Update" "Aktualisieren" ::msgcat::mcset de "Uptime" "Betriebszeit" ::msgcat::mcset de "URL" "URL" ::msgcat::mcset de "User info" "Kontakt-Informationen" ::msgcat::mcset de "UTC:" "UTC:" ::msgcat::mcset de "Version" "Version" ::msgcat::mcset de "Video:" "Bild:" ::msgcat::mcset de "Voice:" "Sprache:" ::msgcat::mcset de "Web site:" "Web-Seite:" ::msgcat::mcset de "Work:" "Beruflich:" ::msgcat::mcset de "Year:" "Jahr:" # .../utils.tcl ::msgcat::mcset de "Copy" "Kopieren" ::msgcat::mcset de "Cut" "Ausschneiden" ::msgcat::mcset de "day" "Tag" ::msgcat::mcset de "days" "Tage" ::msgcat::mcset de "hour" "Stunde" ::msgcat::mcset de "hours" "Stunden" ::msgcat::mcset de "minute" "Minute" ::msgcat::mcset de "minutes" "Minuten" ::msgcat::mcset de "OK" "OK" ::msgcat::mcset de "Paste" "Einfügen" ::msgcat::mcset de "second" "Sekunde" ::msgcat::mcset de "seconds" "Sekunden" # .../ifacetk/iface.tcl ::msgcat::mcset de "Alexey Shchepin" ::msgcat::mcset de "Konstantin Khomoutov" ::msgcat::mcset de "Marshall T. Rose" ::msgcat::mcset de "Michail Litvak" ::msgcat::mcset de "Sergei Golovan" ::msgcat::mcset de "%s SSL Certificate Info" "%s SSL-Zertifikat-Information" ::msgcat::mcset de "&Help" "&Hilfe" ::msgcat::mcset de "&Services" "&Dienste" ::msgcat::mcset de "About" "Über Tkabber" ::msgcat::mcset de "Accept messages from roster users only" "Nur Nachrichten\ von Kontakten im Roster akzeptieren" ::msgcat::mcset de "Activate lists at startup" "Listen beim Start aktivieren" ::msgcat::mcset de "Activate search panel" "Such-Leiste aktivieren" ::msgcat::mcset de "Add group by regexp on JIDs..." "Gruppe mit RegEx auf\ JIDs hinzufügen..." ::msgcat::mcset de "Add new user..." "Kontakt zu Roster hinzufügen..." ::msgcat::mcset de "Add user to roster..." "Kontakt zu Roster hinzufügen..." ::msgcat::mcset de "Admin tools" "Administrator-Werkzeuge" ::msgcat::mcset de "Authors:" "Autoren:" ::msgcat::mcset de "Available" "Anwesend" ::msgcat::mcset de "Away" "Abwesend" ::msgcat::mcset de "Bottom" "Unten" ::msgcat::mcset de "Change password..." "Kennwort ändern..." ::msgcat::mcset de "Change priority..." "Priorität andern..." ::msgcat::mcset de "Chats" "Chats" ::msgcat::mcset de "Chats:" "Chats:" ::msgcat::mcset de "Clear history" "Historie entfernen" ::msgcat::mcset de "Close all tabs" "Alle Tabs schließen" ::msgcat::mcset de "Close other tabs" "Andere Tabs schließen" ::msgcat::mcset de "Close tab" "Tab schließen" ::msgcat::mcset de "Close Tkabber" "Tkabber beenden" ::msgcat::mcset de "Common:" "Allgemein:" ::msgcat::mcset de "Complete nickname or command" "Nicknamen oder Befehl\ vervollständigen" ::msgcat::mcset de "Correct word" "Wort korrigieren" ::msgcat::mcset de "Customize" "Einstellungen" ::msgcat::mcset de "Debug tools" "Debug-Werkzeuge" ::msgcat::mcset de "Delay between getting focus and updating window or tab\ title in milliseconds." "Verzögerung zwischen Erhalten des Fokus und\ Aktualisierung des Fenster- oder Tab-Titels (in Millisekunden)." ::msgcat::mcset de "Delete message of the day" "Nachricht des Tages löschen" ::msgcat::mcset de "Disconnected" "Nicht verbunden" ::msgcat::mcset de "Do not disturb" "Bitte nicht stören" ::msgcat::mcset de "Do nothing" "Nichts machen" ::msgcat::mcset de "Edit conference list " "Konferenzen-Liste ändern..." ::msgcat::mcset de "Edit ignore list " "Ignorieren-Liste ändern..." ::msgcat::mcset de "Edit invisible list " "Unsichtbar-Liste ändern..." ::msgcat::mcset de "Edit my info..." "Eigene Informationen ändern..." ::msgcat::mcset de "Emphasize" "Hervorheben" ::msgcat::mcset de "Enable metacontacts" "Meta-Kontakte aktivieren" ::msgcat::mcset de "Extended away" "Länger abwesend" ::msgcat::mcset de "Font to use in chat windows." "Schriftart/-größe für\ Chat-Fenster." ::msgcat::mcset de "Font to use in roster windows." "Schriftart/-größe für\ Roster-Fenster." ::msgcat::mcset de "Free to chat" "Frei zum Chatten" ::msgcat::mcset de "Generate enter/exit messages"\ "Betreten-/Verlassen-Nachrichten erstellen" ::msgcat::mcset de "Hide main window" "Hauptfenster verbergen" ::msgcat::mcset de "Hide/Show roster" "Roster verbergen/anzeigen" ::msgcat::mcset de "History of availability status messages" "Historie der\ Verfügbarkeits-Status-Nachrichten." ::msgcat::mcset de "Iconize" "Ikonifizieren" ::msgcat::mcset de "Join group..." "Konferenz beitreten..." ::msgcat::mcset de "Left" "Links" ::msgcat::mcset de "Left mouse button" "Linker Maus-Button" ::msgcat::mcset de "Log in" "Anmelden" ::msgcat::mcset de "Log in..." "Anmelden..." ::msgcat::mcset de "Log out" "Abmelden" ::msgcat::mcset de "Log out with reason..." "Abmelden mit Grund..." ::msgcat::mcset de "Main window:" "Hauptfenster:" ::msgcat::mcset de "Manage proxy servers" "Proxy-Server verwalten" ::msgcat::mcset de "Manually edit rules" "Listen von Hand ändern..." ::msgcat::mcset de "Maximum number of status messages to keep. If the history\ size reaches this threshold, the oldest message will be deleted\ automatically when a new one is recorded." "Maximale Anzahl der\ zwischenzuspeichernden Status-Nachrichten. Wenn die Historie ihren\ Schwellenwert erreicht hat, wird die älteste Nachricht automatisch\ gelöscht, sobald eine neue Nachricht hinzugefügt wird." ::msgcat::mcset de "Maximum width of tab buttons in tabbed mode." "Maximale\ Breite der Tabs bei Verwendung der Tab-Oberfläche." ::msgcat::mcset de "Message archive" "Nachrichten-Archiv" ::msgcat::mcset de "Middle mouse button" "Mittlerer Maus-Button" ::msgcat::mcset de "Minimize" "Minimieren" ::msgcat::mcset de "Minimize to systray (if systray icon is enabled,\ otherwise do nothing)" "In den SysTray minimieren (bei aktiviertem\ SysTray-Icon)" ::msgcat::mcset de "Minimum width of tab buttons in tabbed mode." "Minimale\ Breite der Tabs bei Verwendung der Tab-Oberfläche." ::msgcat::mcset de "Move tab left/right" "Tab nach rechts/links verschieben" ::msgcat::mcset de "Open chat..." "Chat öffnen..." ::msgcat::mcset de "Options for main interface." "Optionen für die\ Haupt-Oberfläche." ::msgcat::mcset de "Plugins" "Plugins" ::msgcat::mcset de "Popup menu" "Popup-Menü" ::msgcat::mcset de "Presence" "Präsenz" ::msgcat::mcset de "Presence bar" "Präsenz-Leiste" ::msgcat::mcset de "Previous/Next history message" "Vorherige/Nächste\ Nachricht aus Historie" ::msgcat::mcset de "Previous/Next tab" "Vorheriger/Nächster Tab" ::msgcat::mcset de "Privacy rules" "Privatsphären-Regeln" ::msgcat::mcset de "Quick Help" "Schnell-Hilfe" ::msgcat::mcset de "Quick help" "Schnell-Hilfe" ::msgcat::mcset de "Quit" "Beenden" ::msgcat::mcset de "Raise new tab." "Neuen Tab in den Vordergrund holen." ::msgcat::mcset de "Redo" "Wiederholen" ::msgcat::mcset de "Right" "Rechts" ::msgcat::mcset de "Right mouse button" "Rechter Maus-Button" ::msgcat::mcset de "Roster" "Roster" ::msgcat::mcset de "Scroll chat window up/down" "Chat-Fenster auf-/abwärts\ scrollen" ::msgcat::mcset de "Send broadcast message..." "Rundruf-Nachricht senden..." ::msgcat::mcset de "Send message of the day..." "Nachricht des Tages\ senden..." ::msgcat::mcset de "Send message..." "Nachricht senden..." ::msgcat::mcset de "Show emoticons" "Emoticons anzeigen" ::msgcat::mcset de "Show main window" "Hauptfenster anzeigen" ::msgcat::mcset de "Show menu tearoffs when possible." "Abreißbare Menüs\ anzeigen (wenn möglich)." ::msgcat::mcset de "Show number of unread messages in tab titles." "Anzahl\ ungelesener Nachrichten in Tab-Titeln anzeigen." ::msgcat::mcset de "Show online users only" "Nur 'Online'-Kontakte anzeigen" ::msgcat::mcset de "Show only the number of personal unread messages in\ window title." "Nur die Anzahl ungelesener persönlicher Nachrichten\ im Fenster-Titel anzeigen." ::msgcat::mcset de "Show own resources" "Eigene Ressourcen anzeigen" ::msgcat::mcset de "Show palette of emoticons" "Palette der Emoticons\ anzeigen" ::msgcat::mcset de "Show presence bar." "Präsenz-Leiste anzeigen." ::msgcat::mcset de "Show status bar." "Status-Leiste anzeigen." ::msgcat::mcset de "Show Toolbar." "Werkzeug-Leiste anzeigen." ::msgcat::mcset de "Show user or service info..." "Kontakt- oder\ Dienst-Informationen anzeigen..." ::msgcat::mcset de "Side where to place tabs in tabbed mode." "Fenster-Seite,\ an der die Tabs angeordnet werden sollen." ::msgcat::mcset de "Smart autoscroll" "Intelligentes automatisches Scrollen" ::msgcat::mcset de "SSL Info" "SSL-Information" ::msgcat::mcset de "Status bar" "Status-Leiste" ::msgcat::mcset de "Stop autoscroll" "Automatisches Scrollen abstellen" ::msgcat::mcset de "Switch to tab number 1-9,10" "Wechsel zu Tab Nummer 1-9,\ 10" ::msgcat::mcset de "Systray:" "SysTray:" ::msgcat::mcset de "Tabs:" "Tabs:" ::msgcat::mcset de "Toggle showing offline users" "'Offline'-Kontakte\ anzeigen" ::msgcat::mcset de "Toolbar" "Werkzeug-Leiste" ::msgcat::mcset de "Top" "Oben" ::msgcat::mcset de "Undo" "Rückgängig" ::msgcat::mcset de "Update message of the day..." "Nachricht des Tages\ aktualisieren..." ::msgcat::mcset de "Use roster filter" "Roster-Filter anzeigen" ::msgcat::mcset de "Use Tabbed Interface (you need to restart)."\ "Tab-Oberfläche benutzen (Neustart erforderlich)." ::msgcat::mcset de "View" "Ansicht" ::msgcat::mcset de "What action does the close button." "Verhalten des\ Schließen-Buttons." # .../ifacetk/ilogin.tcl ::msgcat::mcset de "Account" "Konto" ::msgcat::mcset de "Allow plaintext authentication mechanisms"\ "Klartext-Authentifizierung erlauben" ::msgcat::mcset de "Allow X-GOOGLE-TOKEN SASL mechanism" "X-GOOGLE-TOKEN\ SASL-Mechanismus erlauben" ::msgcat::mcset de "Authentication" "Authentifizierung" ::msgcat::mcset de "Connect via HTTP polling" "Mittels HTTP-Polling\ verbinden" ::msgcat::mcset de "Connection" "Verbindung" ::msgcat::mcset de "Explicitly specify host and port to connect" "Host und\ Port der Verbindung explizit vorgeben" ::msgcat::mcset de "HTTP Poll" "HTTP-Polling" ::msgcat::mcset de "Login" "Anmelden" ::msgcat::mcset de "Logout" "Abmelden" ::msgcat::mcset de "Profile" "Profil" ::msgcat::mcset de "Profiles" "Profile" ::msgcat::mcset de "Proxy" "HTTP-Proxy" ::msgcat::mcset de "Proxy password:" "Proxy-Kennwort:" ::msgcat::mcset de "Proxy port:" "Proxy-Port:" ::msgcat::mcset de "Proxy server:" "Proxy-Server:" ::msgcat::mcset de "Proxy username:" "Proxy-Benutzer-Name:" ::msgcat::mcset de "Replace opened connections" "Offene Verbindungen\ ersetzen" ::msgcat::mcset de "Resource:" "Ressource:" ::msgcat::mcset de "SSL" "SSL" ::msgcat::mcset de "SSL & Compression" "SSL & Komprimierung" ::msgcat::mcset de "SSL certificate:" "SSL-Zertifikat:" ::msgcat::mcset de "URL to poll:" "URL für die Verbindung:" ::msgcat::mcset de "Use client security keys" "Client-Sicherheitsschlüssel\ benutzen" ::msgcat::mcset de "Use SASL authentication" "SASL-Authentifizierung\ benutzen" # .../ifacetk/iroster.tcl ::msgcat::mcset de "Add chats group in roster." "'Chats'-Gruppe zu Roster\ hinzufügen." ::msgcat::mcset de "Add roster group by JID regexp" "Gruppe mit RegEx auf\ JIDs hinzufügen" ::msgcat::mcset de "Always use main JID label for metacontact." "Immer die\ Haupt-JID-Bezeichnung für Meta-Kontakte benutzen." ::msgcat::mcset de "Are you sure to remove %s from roster?" "Soll %s wirklich\ vom Roster entfernt werden?" ::msgcat::mcset de "Are you sure to remove all users in group '%s' from\ roster? \n(Users which are not in this group only, will be removed\ from the roster as well.)" "Sollen wirklich alle Kontakte der Gruppe\ '%s' vom Roster entfernt werden?\n(Gleichnamige Kontakt-Einträge in\ anderen Gruppen werden ebenfalls entfernt.)" ::msgcat::mcset de "Are you sure to remove group '%s' from roster? \n(Users\ which are in this group only, will be in undefined group.)" "Soll die\ Gruppe '%s' wirklich vom Roster entfernt werden?\n(Kontakte, die nur\ in dieser Gruppe sind, werden in die Gruppe 'Undefiniert'\ verschoben.)" ::msgcat::mcset de "Ask:" "Frage:" ::msgcat::mcset de "Default nested roster group delimiter." "Voreingestelltes\ Trennzeichen für verschachtelte Roster-Gruppen." ::msgcat::mcset de "Enable grouping contacts into a single metacontact in\ roster." "Das Zusammenfassen von Kontakten zu einem einzelnen\ Meta-Kontakt im Roster aktivieren." ::msgcat::mcset de "Enable nested roster groups." "Verschachtelte\ Roster-Gruppen aktivieren." ::msgcat::mcset de "If set then open chat window/tab when user doubleclicks\ roster item. Otherwise open normal message window." "Bei Doppel-Klick\ auf Roster-Eintrag Chat-Fenster bzw. -Tab anstelle des normalen\ Nachrichten-Fensters öffnen." ::msgcat::mcset de "JID regexp:" "Regulärer Ausdruck:" ::msgcat::mcset de "Match contact JIDs in addition to nicknames in roster\ filter." "Im Roster-Filter zusätzlich zu den Nicknamen auch eine\ Übereinstimmung mit den Kontakt-JIDs überprüfen." ::msgcat::mcset de "New group name:" "Neuer Gruppen-Name:" ::msgcat::mcset de "Remove all users in group..." "Alle Kontakte der Gruppe\ entfernen..." ::msgcat::mcset de "Remove from roster..." "Vom Roster entfernen..." ::msgcat::mcset de "Remove group..." "Gruppe entfernen..." ::msgcat::mcset de "Rename group..." "Gruppe umbenennen..." ::msgcat::mcset de "Rename roster group" "Roster-Gruppe umbenennen" ::msgcat::mcset de "Resubscribe to all users in group..." "Autorisierung bei\ allen Kontakten der Gruppe wiederholen" ::msgcat::mcset de "Roster filter." "Roster-Filter." ::msgcat::mcset de "Roster item may be dropped not only over group name but\ also over any item in group." "Erlauben, daß Roster-Einträge nicht\ nur über Gruppen-Namen, sondern über jedem Eintrag in einer Gruppe\ fallen gelassen werden können." ::msgcat::mcset de "Roster options." "Optionen für den Roster." ::msgcat::mcset de "Send custom presence" "Spezielle Präsenz senden" ::msgcat::mcset de "Send message to all users in group..." "Nachricht an alle\ Kontakte der Gruppe senden..." ::msgcat::mcset de "Show detailed info on conference room members in roster\ item tooltips." "Detaillierte Informationen über Konferenz-Teilnehmer\ im Eintrags-Tooltip anzeigen." ::msgcat::mcset de "Show my own resources in the roster." "Eigene Ressourcen\ in Roster anzeigen." ::msgcat::mcset de "Show native icons for contacts, connected to\ transports/services in roster." "Systemeigene Icons für Kontakte, die\ mit Transporten/Diensten verbunden sind, in Roster anzeigen." ::msgcat::mcset de "Show native icons for transports/services in roster."\ "Systemeigene Icons für Transporte/Dienste in Roster anzeigen." ::msgcat::mcset de "Show offline users" "'Offline'-Kontakte anzeigen" ::msgcat::mcset de "Show only online users in roster." "Nur 'Online'-Kontakte\ in Roster anzeigen." ::msgcat::mcset de "Show subscription type in roster item tooltips."\ "Autorisierungs-Status in Eintrags-Tooltip anzeigen." ::msgcat::mcset de "Stored collapsed roster groups." "Gespeicherte\ zusammengeklappte Roster-Gruppen." ::msgcat::mcset de "Stored show offline roster groups." "Gespeicherte\ 'Offline anzeigen'-Roster-Gruppen." ::msgcat::mcset de "Subscription:" "Autorisierung:" ::msgcat::mcset de "Unavailable" "Nicht verfügbar" ::msgcat::mcset de "Use roster filter." "Roster-Filter anzeigen." # .../ifacetk/systray.tcl ::msgcat::mcset de "Change icon on server and enter/exit groupchat messages."\ "SysTray-Icon ändern bei Server-Nachrichten und beim\ Betreten/Verlassen von Konferenzen." ::msgcat::mcset de "Display status tooltip when main window is minimized to\ systray." "Status-Tooltip anzeigen, wenn das Hauptfenster in den\ SysTray minimiert ist." ::msgcat::mcset de "Hide main window" "Hauptfenster verbergen" ::msgcat::mcset de "Show main window" "Hauptfenster anzeigen" ::msgcat::mcset de "Systray icon blinks when there are unread messages."\ "SysTray-Icon blinkt bei ungelesenen Nachrichten." ::msgcat::mcset de "Systray icon options." "Optionen für das SysTray-Icon." ::msgcat::mcset de "Tkabber Systray" "Tkabber SysTray" # .../plugins/chat/abbrev.tcl ::msgcat::mcset de "Abbreviations:" "Abkürzungen:" ::msgcat::mcset de "Added abbreviation:\n%s: %s" "Abkürzung hinzugefügt:\n%s:\ %s" ::msgcat::mcset de "Deleted abbreviation: %s" "Abkürzung gelöscht: %s" ::msgcat::mcset de "No such abbreviation: %s" "Abkürzung nicht vorhanden: %s" ::msgcat::mcset de "Purged all abbreviations" "Alle Abkürzungen gelöscht" ::msgcat::mcset de "Usage: /abbrev WHAT FOR" "Benutzung: /abbrev ?Abkürzung?\ ?Für? Beispiel: /abbrev tk Tkabber" ::msgcat::mcset de "Usage: /unabbrev WHAT" "Benutzung: /unabbrev ?Abkürzung?" # .../plugins/chat/bookmark_highlighted.tcl ::msgcat::mcset de "Next highlighted" "Nächste Markierte" ::msgcat::mcset de "Prev highlighted" "Vorherige Markierte" # .../plugins/chat/chatstate.tcl ::msgcat::mcset de "%s has activated chat window" "%s hat das Chat-Fenster\ aktiviert" ::msgcat::mcset de "%s has gone chat window" "%s hat das Chat-Fenster\ geschlossen" ::msgcat::mcset de "%s has inactivated chat window" "%s hat das Chat-Fenster\ deaktiviert" ::msgcat::mcset de "%s is composing a reply" "%s erstellt eine Antwort" ::msgcat::mcset de "%s is paused a reply" "%s pausiert eine Antwort" ::msgcat::mcset de "Chat message window state plugin options." "Optionen für\ das Chat-Nachrichten Status-Plugin." ::msgcat::mcset de "Chat window is active" "Chat-Fenster ist aktiv" ::msgcat::mcset de "Chat window is gone" "Chat-Fenster ist geschlossen" ::msgcat::mcset de "Chat window is inactive" "Chat-Fenster ist nicht aktiv" ::msgcat::mcset de "Composing a reply" "Erstellt eine Antwort" ::msgcat::mcset de "Enable sending chat state notifications." "Das Senden von\ Chat-Status-Benachrichtigungen aktivieren." ::msgcat::mcset de "Paused a reply" "Pausiert eine Antwort" # .../plugins/chat/clear.tcl ::msgcat::mcset de "Clear chat window" "Chat-Fenster leeren" # .../plugins/chat/complete_last_nick.tcl ::msgcat::mcset de "Number of groupchat messages to expire nick completion\ according to the last personally addressed message." "Anzahl der\ Konferenz-Nachrichten, nach denen die Nicknamen-Vervollständigung\ verfällt (unter Berücksichtigung der letzten persönlich adressierten\ Nachricht)." # .../plugins/chat/draw_timestamp.tcl ::msgcat::mcset de "Format of timestamp in chat message. Refer to Tcl\ documentation of 'clock' command for description of\ format.\n\nExamples:\n \[%R\] - \[20:37\]\n \[%T\] - \[20:37:12\]\n \ \[%a %b %d %H:%M:%S %Z %Y\] - \[Thu Jan 01 03:00:00 MSK 1970\]"\ "Format des Zeitstempels in Chat-Nachrichten (für Details bitte die\ Dokumentation des Tcl-'clock'-Kommandos lesen).\n\nBeispiele:\n \ \[%R\]\t\[15:15\]\n \[%T\]\t\[15:15:27\]\n \[%a %d. %b %Y %H:%M:%S\ %Z\] \[Son 11. Jun 2000 15:15:27 W. Europe Standard Time\]" ::msgcat::mcset de "Format of timestamp in delayed chat messages delayed for\ more than 24 hours." "Format des Zeitstempels für Chat-Nachrichten,\ die älter als 24 Stunden sind." # .../plugins/chat/draw_xhtml_message.tcl ::msgcat::mcset de "Enable rendering of XHTML messages." "Darstellung von\ XHTML-Nachrichten aktivieren." # .../plugins/chat/events.tcl ::msgcat::mcset de "Chat message events plugin options." "Optionen für das\ Chat-Nachrichten Ereignis-Plugin." ::msgcat::mcset de "Enable sending chat message events." "Das Senden von\ Chat-Nachrichten-Ereignissen aktivieren." ::msgcat::mcset de "Message delivered" "Nachricht abgeliefert" ::msgcat::mcset de "Message delivered to %s" "Nachricht bei %s abgeliefert" ::msgcat::mcset de "Message displayed" "Nachricht angezeigt" ::msgcat::mcset de "Message displayed to %s" "Nachricht bei %s angezeigt" ::msgcat::mcset de "Message stored on %s's server" "Nachricht für %s auf dem\ Server gespeichert" ::msgcat::mcset de "Message stored on the server" "Nachricht auf dem Server\ gespeichert" # .../plugins/chat/histool.tcl ::msgcat::mcset de "Chats History" "Chat-Historie" ::msgcat::mcset de "Chats history" "Chat-Historie" ::msgcat::mcset de "Client message" "Client-Nachricht" ::msgcat::mcset de "Full-text search" "Volltext-Suche" ::msgcat::mcset de "JID list" "JID-Liste" ::msgcat::mcset de "Logs" "Logs" ::msgcat::mcset de "Server message" "Server-Nachricht" ::msgcat::mcset de "Unsupported log dir format" "Nicht unterstütztes\ Log-Ordner Format" ::msgcat::mcset de "WARNING: %s\n" "WARNUNG: %s\n" # .../plugins/chat/info_commands.tcl ::msgcat::mcset de "Address 2" "Adresse 2" ::msgcat::mcset de "City" "Stadt" ::msgcat::mcset de "Country" "Land" ::msgcat::mcset de "Display %s in chat window when using /vcard command."\ "'%s' in Chat-Fenster anzeigen, wenn /vcard-Befehl benutzt wird." ::msgcat::mcset de "E-mail" "E-Mail" ::msgcat::mcset de "Family name" "Familienname" ::msgcat::mcset de "Full name" "Vollst. Name" ::msgcat::mcset de "last %s%s:" "letzte %s%s:" ::msgcat::mcset de "last %s%s: %s" "letzte %s%s: %s" ::msgcat::mcset de "Latitude" "Breitengrad" ::msgcat::mcset de "Longitude" "Längengrad" ::msgcat::mcset de "Middle name" "2. Vorname" ::msgcat::mcset de "Nickname" "Nickname" ::msgcat::mcset de "Organization name" "Unternehmen Name" ::msgcat::mcset de "Organization unit" "Unternehmen Abteilung" ::msgcat::mcset de "Phone BBS" "Telefon BBS" ::msgcat::mcset de "Phone cell" "Telefon Handy" ::msgcat::mcset de "Phone fax" "Telefon Fax" ::msgcat::mcset de "Phone home" "Telefon Privat" ::msgcat::mcset de "Phone ISDN" "Telefon ISDN" ::msgcat::mcset de "Phone message recorder" "Telefon Anrufbeantworter" ::msgcat::mcset de "Phone modem" "Telefon Modem" ::msgcat::mcset de "Phone pager" "Telefon Pager" ::msgcat::mcset de "Phone PCS" "Telefon PCS" ::msgcat::mcset de "Phone preferred" "Telefon Bevorzugt" ::msgcat::mcset de "Phone video" "Telefon Bild" ::msgcat::mcset de "Phone voice" "Telefon Sprache" ::msgcat::mcset de "Phone work" "Telefon Beruflich" ::msgcat::mcset de "Pong from %s%s: %.2f seconds" "Pong von %s%s: %.2f\ Sekunden" ::msgcat::mcset de "Pong from %s%s: %s" "Pong von %s%s: %s" ::msgcat::mcset de "Postal code" "PLZ" ::msgcat::mcset de "Prefix" "Präfix" ::msgcat::mcset de "State " "Bundesland" ::msgcat::mcset de "Suffix" "Suffix" ::msgcat::mcset de "time %s%s:" "Zeit %s%s:" ::msgcat::mcset de "time %s%s: %s" "Zeit %s%s: %s" ::msgcat::mcset de "Time Zone:" "Zeitzone:" ::msgcat::mcset de "Title" "Title" ::msgcat::mcset de "UID" "UID" ::msgcat::mcset de "vcard %s%s:" "Visitenkarte %s%s:" ::msgcat::mcset de "vcard %s%s: %s" "Visitenkarte %s%s: %s" ::msgcat::mcset de "vCard display options in chat windows." "Optionen für die\ Anzeige von Visitenkarten in Chat-Fenstern." ::msgcat::mcset de "version %s%s:" "Version %s%s:" ::msgcat::mcset de "version %s%s: %s" "Version %s%s: %s" ::msgcat::mcset de "Web site" "Web-Seite" # .../plugins/chat/log_on_open.tcl ::msgcat::mcset de "Maximum interval length in hours for which log messages\ should be shown in newly opened chat window (if set to negative then\ the interval is unlimited)." "Maximale Anzahl von Stunden, für die\ Log-Nachrichten in neu geöffneten Chat-Fenstern angezeigt werden\ sollen (unbegrenzt bei negativem Wert)." ::msgcat::mcset de "Maximum number of log messages to show in newly opened\ chat window (if set to negative then the number is unlimited)."\ "Maximale Anzahl von Log-Nachrichten, die in neu geöffneten\ Chat-Fenstern angezeigt werden sollen (unbegrenzt bei negativem\ Wert)." # .../plugins/chat/logger.tcl ::msgcat::mcset de "All" "Alle" ::msgcat::mcset de "April" "April" ::msgcat::mcset de "August" "August" ::msgcat::mcset de "Chats history is converted.\nBackup of the old history is\ stored in %s" "Die Chat-Historie ist konvertiert worden.\nEine\ Sicherung der alten Historie ist in %s." ::msgcat::mcset de "Close" "Schließen" ::msgcat::mcset de "Conversion is finished" "Konvertierung abgeschlossen" ::msgcat::mcset de "Converting Log Files" "Konvertiere Log-Dateien" ::msgcat::mcset de "December" "Dezember" ::msgcat::mcset de "Directory to store logs." "Ordner zum Speichern der\ Logs." ::msgcat::mcset de "Export to XHTML" "Als XHTML exportieren" ::msgcat::mcset de "February" "Februar" ::msgcat::mcset de "File %s cannot be opened: %s. History for %s (%s) is NOT\ converted\n" "Die Datei %s kann nicht geöffnet werden: %s. Die\ Historie für %s (%s) wurde NICHT konvertiert\n" ::msgcat::mcset de "File %s cannot be opened: %s. History for %s is NOT\ converted\n" "Die Datei %s kann nicht geöffnet werden: %s. Die\ Historie für %s wurde NICHT konvertiert\n" ::msgcat::mcset de "File %s is corrupt. History for %s (%s) is NOT\ converted\n" "Die Datei %s ist beschädigt. Die Historie für %s (%s)\ wurde NICHT konvertiert\n" ::msgcat::mcset de "File %s is corrupt. History for %s is NOT converted\n"\ "Die Datei %s ist beschädigt. Die Historie für %s wurde NICHT\ konvertiert\n" ::msgcat::mcset de "History for %s" "Historie für %s" ::msgcat::mcset de "January" "Januar" ::msgcat::mcset de "July" "Juli" ::msgcat::mcset de "June" "Juni" ::msgcat::mcset de "Logging options." "Optionen für Logs" ::msgcat::mcset de "March" "März" ::msgcat::mcset de "May" "Mai" ::msgcat::mcset de "November" "November" ::msgcat::mcset de "October" "Oktober" ::msgcat::mcset de "Please, be patient while chats history is being converted\ to new format" "Bitte haben Sie Geduld, während die Chat-Historie in\ ein neues Format konvertiert wird." ::msgcat::mcset de "Select month:" "Monat auswählen:" ::msgcat::mcset de "September" "September" ::msgcat::mcset de "Show history" "Historie anzeigen" ::msgcat::mcset de "Store group chats logs." "Konferenz-Logs sichern." ::msgcat::mcset de "Store private chats logs." "Chat-Logs sichern." ::msgcat::mcset de "You're using root directory %s for storing Tkabber\ logs!\n\nI refuse to convert logs database." "Das Wurzelverzeichnis\ %s wird für die Speicherung der Tkabber-Logs benutzt!\n\nEs ist\ deswegen nicht möglich, die Log-Datenbank zu konvertieren." # .../plugins/chat/muc_ignore.tcl ::msgcat::mcset de "Edit MUC ignore rules" "MUC-Ignorieren-Regeln ändern" ::msgcat::mcset de "Error loading MUC ignore rules, purged." "Fehler beim\ Laden der MUC-Ignorieren-Regeln, bereinigt." ::msgcat::mcset de "Ignore" "Ignorieren" ::msgcat::mcset de "Ignore chat messages" "Ignoriere Chat-Nachrichten" ::msgcat::mcset de "Ignore groupchat messages" "Ignoriere\ Konferenz-Nachrichten" ::msgcat::mcset de "Ignoring groupchat and chat messages from selected\ occupants of multi-user conference rooms." "Optionen für das\ Ignorieren von Konferenz- und Chat-Nachrichten ausgewählter\ Teilnehmer." ::msgcat::mcset de "MUC Ignore" "MUC-Ignorieren" ::msgcat::mcset de "MUC Ignore Rules" "MUC-Ignorieren-Regeln" ::msgcat::mcset de "When set, all changes to the ignore rules are applied\ only until Tkabber is closed\; they are not saved and thus will be\ not restored at the next run." "Wenn gesetzt, werden alle Änderungen\ an den Ignorieren-Regeln nur übernommen, bis Tkabber geschlossen\ wird. Sie werden nicht gespeichert und deshalb beim nächsten Start\ auch nicht wieder hergestellt." # .../plugins/chat/nick_colors.tcl ::msgcat::mcset de "Color message bodies in chat windows." "Farbige\ Nachrichten in Chat-Fenstern benutzen." ::msgcat::mcset de "Edit %s color" "%s Farbe ändern" ::msgcat::mcset de "Edit chat user colors" "Chatteilnehmer-Farben ändern" ::msgcat::mcset de "Edit nick color..." "Nicknamen-Farbe ändern..." ::msgcat::mcset de "Edit nick colors..." "Nicknamen-Farben ändern..." ::msgcat::mcset de "Use colored messages" "Farbige Nachrichten benutzen" ::msgcat::mcset de "Use colored nicks" "Farbige Nicknamen benutzen" ::msgcat::mcset de "Use colored nicks in chat windows." "Farbige Nicknamen in\ Chat-Fenstern benutzen." ::msgcat::mcset de "Use colored nicks in groupchat rosters." "Farbige\ Nicknamen in Konferenz-Rostern benutzen." ::msgcat::mcset de "Use colored roster nicks" "Farbige Roster-Nicknamen\ benutzen" # .../plugins/chat/popupmenu.tcl ::msgcat::mcset de "Clear bookmarks" "Lesezeichen entfernen" ::msgcat::mcset de "Copy selection to clipboard" "In Zwischenablage kopieren" ::msgcat::mcset de "Google selection" "Auswahl mit Google suchen" ::msgcat::mcset de "Next bookmark" "Nächstes Lesezeichen" ::msgcat::mcset de "Prev bookmark" "Vorheriges Lesezeichen" ::msgcat::mcset de "Set bookmark" "Lesezeichen setzen" # .../plugins/filetransfer/http.tcl ::msgcat::mcset de "Browse..." "Durchsuchen..." ::msgcat::mcset de "Can't receive file: %s" "Kann Datei nicht empfangen: %s" ::msgcat::mcset de "Description:" "Beschreibung:" ::msgcat::mcset de "Force advertising this hostname (or IP address) for\ outgoing HTTP file transfers." "Erzwinge die Angabe dieses\ Host-Namens (oder IP-Adresse) für ausgehende\ HTTP-Datei-Übertragungen." ::msgcat::mcset de "HTTP options." "Optionen für HTTP." ::msgcat::mcset de "IP address:" "IP-Adresse:" ::msgcat::mcset de "Port for outgoing HTTP file transfers (0 for assigned\ automatically). This is useful when sending files from behind a NAT\ with a forwarded port." "Port für ausgehende HTTP-Datei-Übertragungen\ (0 für automatische Zuweisung). Nützlich beim Datei-Versand von\ hinter einem NAT-Router mit weitergeleitetem Port." ::msgcat::mcset de "Receive" "Empfangen" ::msgcat::mcset de "Receive file from %s" "Empfange Datei von %s" ::msgcat::mcset de "Request failed: %s" "Anfrage misslungen: %s" ::msgcat::mcset de "Save as:" "Speichern als:" ::msgcat::mcset de "URL:" "URL:" # .../plugins/filetransfer/si.tcl ::msgcat::mcset de "Name:" "Name:" ::msgcat::mcset de "Receive error: Stream ID is in use" "Fehler beim Empfang:\ 'Stream'-ID wird bereits benutzt" ::msgcat::mcset de "Size:" "Größe:" ::msgcat::mcset de "Stream initiation options." "Optionen für\ 'Stream'-Initialisierung" ::msgcat::mcset de "Transfer failed: %s" "Übertragung misslungen: %s" ::msgcat::mcset de "Transferring..." "Übertrage . . ." # .../plugins/general/autoaway.tcl ::msgcat::mcset de "Automatically away due to idle" "Automatisch Abwesend\ wegen Leerlauf" ::msgcat::mcset de "Idle for %s" "Leerlauf seit %s" ::msgcat::mcset de "Idle threshold in minutes after that Tkabber marks you as\ away." "Leerlauf-Zeit (in Minuten), nach der Tkabber 'Abwesend'\ anzeigt." ::msgcat::mcset de "Idle threshold in minutes after that Tkabber marks you as\ extended away." "Leerlauf-Zeit (in Minuten), nach der Tkabber 'Länger\ abwesend' anzeigt." ::msgcat::mcset de "Moving to extended away" "Wechseln zu 'Länger abwesend'" ::msgcat::mcset de "Options for module that automatically marks you as away\ after idle threshold." "Optionen für das\ 'Automatisch-Abwesend'-Modul." ::msgcat::mcset de "Returning from auto-away" "Beende 'Automatisch-Abwesend'" ::msgcat::mcset de "Set priority to 0 when moving to extended away state."\ "Setze Priorität auf 0 beim Wechsel zu 'Länger abwesend'." ::msgcat::mcset de "Starting auto-away" "Starte 'Automatisch-Abwesend'" ::msgcat::mcset de "Text status, which is set when Tkabber is moving to away\ state." "Status-Text, der angezeigt wird, wenn Tkabber zu 'Abwesend'\ wechselt." # .../plugins/general/avatars.tcl ::msgcat::mcset de "Allow downloading" "Herunterladen erlauben" ::msgcat::mcset de "Announce" "Bekanntmachen" ::msgcat::mcset de "Avatar" "Avatar" ::msgcat::mcset de "No avatar to store" "Kein Avatar zu speichern" ::msgcat::mcset de "Send to server" "An Server senden" # .../plugins/general/caps.tcl ::msgcat::mcset de "Enable announcing entity capabilities in every outgoing\ presence." "Das Bekanntmachen von 'Entity Capabilities' in jeder\ ausgehenden Präsenz aktivieren." ::msgcat::mcset de "Options for entity capabilities plugin." "Optionen für\ das 'Entity Capabilities'-Plugin (XEP-0115)." ::msgcat::mcset de "Use the specified function to hash supported features\ list." "Das ausgewählte Prüfsummenverfahren für das 'hashen' der\ unterstützten Eigenschaften benutzen." # .../plugins/general/clientinfo.tcl ::msgcat::mcset de "\n\tClient: %s" "\n\tClient: %s" ::msgcat::mcset de "\n\tName: %s" "\n\tName: %s" ::msgcat::mcset de "\n\tOS: %s" "\n\tBetriebssystem: %s" ::msgcat::mcset de "Options for Client Info module, which allows you to\ automatically retrieve client names and versions for contacts in your\ roster." "Optionen für das 'Client Info'-Plugin.\nNamen und Versionen\ der von den Kontakten im Roster benutzen Clients automatisch\ empfangen." # .../plugins/general/copy_jid.tcl ::msgcat::mcset de "Copy JID to clipboard" "JID in Zwischenablage kopieren" ::msgcat::mcset de "Copy real JID to clipboard" "Tatsächliche JID in\ Zwischenablage kopieren" # .../plugins/general/geometry.tcl ::msgcat::mcset de "Stored main window geometry" "Gespeicherte\ Hauptfenster-Geometrie mit Tab-Oberfläche." ::msgcat::mcset de "Stored main window geometry in non-tabbed mode"\ "Gespeicherte Hauptfenster-Geometrie ohne Tab-Oberfläche." ::msgcat::mcset de "Stored main window state (normal or zoomed)"\ "Gespeicherter Hauptfenster-Status (Normal oder Zoomed) mit\ Tab-Oberfläche." ::msgcat::mcset de "Stored main window state (normal or zoomed) in non-tabbed\ mode" "Gespeicherter Hauptfenster-Status (Normal oder Zoomed) ohne\ Tab-Oberfläche." # .../plugins/general/headlines.tcl ::msgcat::mcset de "%s Headlines" "%s Headlines" ::msgcat::mcset de "" "" ::msgcat::mcset de "Cache headlines on exit and restore on start." "Headlines\ beim Beenden zwischenspeichern und beim Start wiederherstellen." ::msgcat::mcset de "Copy headline to clipboard" "Headline in Zwischenablage\ kopieren" ::msgcat::mcset de "Copy URL to clipboard" "URL in Zwischenablage kopieren" ::msgcat::mcset de "Delete" "Löschen" ::msgcat::mcset de "Delete all" "Alle löschen" ::msgcat::mcset de "Delete seen" "Gesehene löschen" ::msgcat::mcset de "Display headlines in single/multiple windows." "Headlines\ in einem/mehreren Fenstern anzeigen." ::msgcat::mcset de "Do not display headline descriptions as tree nodes."\ "Headline-Beschreibungen nicht als Baum anzeigen." ::msgcat::mcset de "Following" "Nachfolgende" ::msgcat::mcset de "Format of timestamp in headline tree view. Set to empty\ string if you don't want to see timestamps." "Format des Zeitstempels\ in der Headline-Baumansicht (frei lassen, wenn keine Zeitstempel\ angezeigt werden sollen)." ::msgcat::mcset de "Forward headline" "Headline weiterleiten" ::msgcat::mcset de "Forward to %s" "Weiterleiten zu %s" ::msgcat::mcset de "Forward..." "Weiterleiten..." ::msgcat::mcset de "From:" "Von:" ::msgcat::mcset de "Headline read timeout value (in seconds)" "Wartezeit,\ nach der eine Headline als gelesen markiert wird (in Sekunden)." ::msgcat::mcset de "Headlines" "Headlines" ::msgcat::mcset de "List of JIDs to whom headlines have been sent." "Liste\ der JIDs, an die Headlines gesendet wurden." ::msgcat::mcset de "Mark all seen" "Alle als gesehen markieren" ::msgcat::mcset de "Mark all unseen" "Alle als ungesehen markieren" ::msgcat::mcset de "Mark headline read by" "Headline als gelesen markieren\ durch ..." ::msgcat::mcset de "One window per bare JID" "Ein Fenster je blanker JID" ::msgcat::mcset de "One window per full JID" "Ein Fenster je voller JID" ::msgcat::mcset de "Read on..." "Weiterlesen..." ::msgcat::mcset de "Selection" "Auswahl" ::msgcat::mcset de "Show balloons with headline messages over tree nodes."\ "Tooltips mit Headline-Nachrichten über Baum-Knoten anzeigen." ::msgcat::mcset de "Single window" "Einzelnes Fenster" ::msgcat::mcset de "Sort" "Sortieren" ::msgcat::mcset de "Sort by date" "Nach Datum sortieren" ::msgcat::mcset de "Toggle seen" "Gesehen-Markierung umkehren" # .../plugins/general/ispell.tcl ::msgcat::mcset de "- nothing -" "- nichts -" ::msgcat::mcset de "Check spell after every entered symbol." "Überprüfe\ Rechtschreibung nach jedem eingegebenen Symbol." ::msgcat::mcset de "Could not start ispell server. Check your ispell path and\ dictionary name. Ispell is disabled now" "Der Ispell-Server konnte\ nicht gestartet werden. Bitte Ispell-Pfad und Wörterbuch-Namen\ überprüfen. Ispell ist jetzt deaktiviert." ::msgcat::mcset de "Enable spellchecker in text input windows."\ "Rechtschreibprüfung in Text-Eingabe-Fenstern aktivieren." ::msgcat::mcset de "Ispell dictionary encoding. If it is empty, system\ encoding is used." "Ispell Wörterbuch-Kodierung. Wenn nicht\ angegeben, wird die System-Kodierung benutzt." ::msgcat::mcset de "Ispell options. See ispell manual for\ details.\n\nExamples:\n -d russian\n -d german -T latin1\n -C -d\ english" "Ispell-Optionen (für Details bitte die Ispell-Dokumentation\ lesen).\n\nBeispiele:\n -d russian\n -d german -T latin1 bzw. -d\ deutsch -T latin1\n -C -d english" ::msgcat::mcset de "Path to the ispell executable." "Pfad zum\ Ispell-Programm." ::msgcat::mcset de "Spell check options." "Optionen für die\ Rechtschreibprüfung." ::msgcat::mcset de "Spelling" "Rechtschreibung" # .../plugins/general/message_archive.tcl ::msgcat::mcset de "Dir" "<->" ::msgcat::mcset de "From/To" "Von/An" ::msgcat::mcset de "Messages" "Nachrichten-Archiv" ::msgcat::mcset de "Received/Sent" "Empfangen/Gesendet" ::msgcat::mcset de "To:" "An:" # .../plugins/general/offline.tcl ::msgcat::mcset de "Fetch all messages" "Alle Nachrichten abrufen" ::msgcat::mcset de "Fetch message" "Nachricht abrufen" ::msgcat::mcset de "Fetch unseen messages" "Ungesehene Nachrichten abrufen" ::msgcat::mcset de "Offline Messages" "Offline-Nachrichten" ::msgcat::mcset de "Purge all messages" "Alle Nachrichten beseitigen" ::msgcat::mcset de "Purge message" "Nachricht beseitigen" ::msgcat::mcset de "Purge seen messages" "Gesehene Nachrichten beseitigen" ::msgcat::mcset de "Retrieve offline messages using POP3-like protocol."\ "Offline-Nachrichten mittels POP3-ähnlichem Protokoll empfangen." ::msgcat::mcset de "Sort by from" "Nach Von sortieren" ::msgcat::mcset de "Sort by node" "Nach Knoten sortieren" ::msgcat::mcset de "Sort by type" "Nach Typ sortieren" # .../plugins/general/rawxml.tcl ::msgcat::mcset de "Available presence" "'Anwesend'-Präsenz" ::msgcat::mcset de "Chat message" "Chat-Nachricht" ::msgcat::mcset de "Clear" "Leeren" ::msgcat::mcset de "Create node" "Knoten erstellen" ::msgcat::mcset de "Generic IQ" "Allgemeine IQ" ::msgcat::mcset de "Get items" "Einträge erhalten" ::msgcat::mcset de "Headline message" "Headline-Nachricht" ::msgcat::mcset de "Indentation for pretty-printed XML subtags." "Einzug für\ optimierte (Pretty Print) XML-'Subtags'." ::msgcat::mcset de "IQ" "IQ" ::msgcat::mcset de "Message" "Nachricht" ::msgcat::mcset de "Normal message" "Normale Nachricht" ::msgcat::mcset de "Not connected" "Nicht verbunden" ::msgcat::mcset de "Open raw XML window" "'Raw XML'-Fenster öffnen" ::msgcat::mcset de "Options for Raw XML Input module, which allows you to\ monitor incoming/outgoing traffic from connection to server and send\ custom XML stanzas." "Optionen für das 'Raw XML Input'-Plugin.\nDie\ Überwachung ein- und ausgehenden Datenverkehrs zum Server und\ gesendeter spezifischer XML-'Stanzas'." ::msgcat::mcset de "Plugins options." "Optionen für Plugins." ::msgcat::mcset de "Pretty print incoming and outgoing XML stanzas." "Ausgabe\ ein- und ausgehender XML-'Stanzas' optimieren (Pretty Print)." ::msgcat::mcset de "Pretty print XML" "XML-Ausgabe optimieren (Pretty Print)" ::msgcat::mcset de "Pub/sub" "Pub/Sub" ::msgcat::mcset de "Publish node" "Knoten veröffentlichen" ::msgcat::mcset de "Raw XML" "Raw XML" ::msgcat::mcset de "Retract node" "Knoten widerrufen" ::msgcat::mcset de "Show all connections" "Alle Verbindungen anzeigen" ::msgcat::mcset de "Show stanzas for all (current and past) connections in\ Raw XML window." "'Stanzas' aller Verbindungen (aktuelle und\ vergangene) im 'Raw XML'-Fenster anzeigen." ::msgcat::mcset de "Subscribe to a node" "Bei einem Knoten anmelden" ::msgcat::mcset de "Templates" "Vorlagen" ::msgcat::mcset de "Unavailable presence" "'Nicht verfügbar'-Präsenz" ::msgcat::mcset de "Unsubscribe from a node" "Bei einem Knoten abmelden" # .../plugins/general/remote.tcl ::msgcat::mcset de "Accept connections from my own JID." "Verbindungen von\ der eigenen JID akzeptieren." ::msgcat::mcset de "Accept connections from the listed JIDs." "Verbindungen\ von den aufgelisteten JIDs akzeptieren." ::msgcat::mcset de "All unread messages were forwarded to %s." "Alle\ ungelesenen Nachrichten wurden weitergeleitet an %s" ::msgcat::mcset de "Enable remote control." "Fernsteuerung aktivieren." ::msgcat::mcset de "Remote control options." "Optionen für die Fernsteuerung\ (Remote Control)." ::msgcat::mcset de "This message was forwarded to %s" "Diese Nachricht wurde\ weitergeleitet an %s" # .../plugins/general/session.tcl ::msgcat::mcset de "Load state on start" "Status beim Start wiederherstellen" ::msgcat::mcset de "Load state on Tkabber start." "Status beim Start von\ Tkabber wiederherstellen." ::msgcat::mcset de "Save state" "Status speichern" ::msgcat::mcset de "Save state on exit" "Status beim Beenden speichern" ::msgcat::mcset de "Save state on Tkabber exit." "Status beim Beenden von\ Tkabber speichern." ::msgcat::mcset de "State" "Status" ::msgcat::mcset de "Tkabber save state options." "Optionen für die\ Status-Speicherung." # .../plugins/general/sound.tcl ::msgcat::mcset de "External program, which is to be executed to play sound.\ If empty, Snack library is used (if available) to play sound."\ "Externes Programm, welches für die Wiedergabe von Klängen ausgeführt\ werden soll. Wenn nicht angegeben, wird die 'Snack'-Bibliothek\ benutzt (wenn vorhanden)." ::msgcat::mcset de "Mute sound" "Klänge unterdrücken" ::msgcat::mcset de "Mute sound if Tkabber window is focused." "Klänge\ unterdrücken, wenn Tkabber das aktive Fenster ist (den Fokus hat)." ::msgcat::mcset de "Mute sound notification." "Klang-Benachrichtigung\ unterdrücken." ::msgcat::mcset de "Mute sound when displaying delayed groupchat messages."\ "Klänge bei der Anzeige verzögerter Konferenz-Nachrichten\ unterdrücken." ::msgcat::mcset de "Mute sound when displaying delayed personal chat\ messages." "Klänge bei der Anzeige verzögerter persönlicher\ Chat-Nachrichten unterdrücken." ::msgcat::mcset de "Notify only when available" "Benachrichtigung nur wenn\ anwesend" ::msgcat::mcset de "Options for external play program" "Optionen für das\ externe Wiedergabe-Programm." ::msgcat::mcset de "Sound" "Klänge" ::msgcat::mcset de "Sound options." "Optionen für Klänge." ::msgcat::mcset de "Sound to play when available presence is received."\ "Wiederzugebender Klang bei Empfang einer 'Anwesend'-Präsenz." ::msgcat::mcset de "Sound to play when connected to Jabber server."\ "Wiederzugebender Klang bei Verbindung mit dem Jabber-Server." ::msgcat::mcset de "Sound to play when disconnected from Jabber server."\ "Wiederzugebender Klang bei Trennung vom Jabber-Server." ::msgcat::mcset de "Sound to play when groupchat message from me is\ received." "Wiederzugebender Klang bei Empfang einer eigenen\ Konferenz-Nachricht." ::msgcat::mcset de "Sound to play when groupchat message is received."\ "Wiederzugebender Klang bei Empfang einer Konferenz-Nachricht." ::msgcat::mcset de "Sound to play when groupchat server message is received."\ "Wiederzugebender Klang bei Empfang einer\ Konferenz-Server-Nachricht." ::msgcat::mcset de "Sound to play when highlighted (usually addressed\ personally) groupchat message is received." "Wiederzugebender Klang\ bei Empfang einer markierten (üblicherweise persönlich adressierten)\ Konferenz-Nachricht." ::msgcat::mcset de "Sound to play when personal chat message is received."\ "Wiederzugebender Klang bei Empfang einer persönlichen\ Chat-Nachricht." ::msgcat::mcset de "Sound to play when sending personal chat message."\ "Wiederzugebender Klang bei Sendung einer persönlichen\ Chat-Nachricht." ::msgcat::mcset de "Sound to play when unavailable presence is received."\ "Wiederzugebender Klang bei Empfang einer 'Nicht verfügbar'-Präsenz." ::msgcat::mcset de "Time interval before playing next sound (in\ milliseconds)." "Zeitraum bevor ein weiterer Klang abgespielt wird\ (in Millisekunden)." ::msgcat::mcset de "Use sound notification only when being available."\ "Klang-Benachrichtigung nur benutzen, wenn anwesend." # .../plugins/general/stats.tcl ::msgcat::mcset de "JID" "JID" ::msgcat::mcset de "Name " "Name" ::msgcat::mcset de "Node" "Knoten" ::msgcat::mcset de "Open statistics monitor" "Dienst-Statistik öffnen" ::msgcat::mcset de "Remove" "Entfernen" ::msgcat::mcset de "Request" "Abfragen" ::msgcat::mcset de "Service statistics" "Dienst-Statistik" ::msgcat::mcset de "Set" "Setzen" ::msgcat::mcset de "Statistics" "Dienst-Statistik" ::msgcat::mcset de "Statistics monitor" "Dienst-Statistik" ::msgcat::mcset de "Timer" "Intervall" ::msgcat::mcset de "Units" "Einheit" ::msgcat::mcset de "Value" "Anzahl" # .../plugins/general/subscribe_gateway.tcl ::msgcat::mcset de "Convert" "Konvertieren" ::msgcat::mcset de "Convert screenname" "Bildschirm-Namen konvertieren" ::msgcat::mcset de "Enter screenname of contact you want to add" "Den\ Bildschirm-Namen des hinzuzufügenden Kontaktes eingeben" ::msgcat::mcset de "Error while converting screenname: %s." "Fehler beim\ Konvertieren des Bildschirm-Namens: %s" ::msgcat::mcset de "I would like to add you to my roster." "Ich würde\ Dich/Sie gerne in meine Kontaktliste aufnehmen.\nI would like to add\ you to my roster." ::msgcat::mcset de "Screenname conversion" "Bildschirm-Namen-Konvertierung" ::msgcat::mcset de "Screenname:" "Bildschirm-Name:" ::msgcat::mcset de "Screenname: %s\n\nConverted JID: %s" "Bildschirm-Name:\ %s\n\nKonvertierte JID: %s" ::msgcat::mcset de "Send subscription at %s" "Anmeldung an %s senden" ::msgcat::mcset de "Send subscription to: " "Anmeldung senden an:" ::msgcat::mcset de "Subscribe" "Anmelden" # .../plugins/general/tkcon.tcl ::msgcat::mcset de "Show TkCon console" "TkCon-Konsole anzeigen" # .../plugins/general/xaddress.tcl ::msgcat::mcset de "Blind carbon copy" "Blind Carbon Copy" ::msgcat::mcset de "Carbon copy" "Carbon Copy" ::msgcat::mcset de "Extended addressing fields:" "Erweiterte Adressfelder:" ::msgcat::mcset de "Forwarded by:" "Weitergeleitet von:" ::msgcat::mcset de "No reply" "Keine Antwort" ::msgcat::mcset de "Original from" "Original von" ::msgcat::mcset de "Original to" "Original an" ::msgcat::mcset de "Reply to" "Antwort an" ::msgcat::mcset de "Reply to room" "Antwort an Konferenz" ::msgcat::mcset de "This message was forwarded by %s\n" "Diese Nachricht\ wurde weitergeleitet von %s\n" ::msgcat::mcset de "This message was sent by %s\n" "Diese Nachricht wurde\ gesendet von %s\n" ::msgcat::mcset de "To" "An" # .../plugins/general/xcommands.tcl ::msgcat::mcset de "Commands" "Kommandos" ::msgcat::mcset de "Error completing command: %s" "Fehler bei der\ Vervollständigung des Kommandos: %s" ::msgcat::mcset de "Error executing command: %s" "Fehler bei der Ausführung\ des Kommandos: %s" ::msgcat::mcset de "Error:" "Fehler:" ::msgcat::mcset de "Execute command" "Befehl ausführen" ::msgcat::mcset de "Finish" "Fertigstellen" ::msgcat::mcset de "Info:" "Information:" ::msgcat::mcset de "Next" "Nächstes" ::msgcat::mcset de "Prev" "Vorheriges" ::msgcat::mcset de "Submit" "Abschicken" ::msgcat::mcset de "Warning:" "Warnung:" # .../plugins/iq/last.tcl ::msgcat::mcset de "Reply to idle time (jabber:iq:last) requests." "Antworte\ auf Leerlauf-Zeit-Anfragen (jabber:iq:last)." # .../plugins/iq/ping.tcl ::msgcat::mcset de "Ping server using XMPP ping requests." "Server mittels\ 'XMPP ping'-Anfragen anpingen." ::msgcat::mcset de "Reconnect to server if it does not reply (with result or\ with error) to XMPP ping request in specified time interval (in\ seconds)." "Erneut mit dem Server verbinden, wenn dieser nicht im\ angegebenem Zeitraum (mit Ergebnis oder Fehler) auf 'XMPP\ ping'-Anfragen antwortet (in Sekunden)." ::msgcat::mcset de "Reply to XMPP ping requests." "Antworte auf Ping-Anfragen\ (XMPP ping)." # .../plugins/iq/time.tcl ::msgcat::mcset de "Reply to current time (jabber:iq:time) requests."\ "Antworte auf Aktuelle-Zeit-Anfragen (jabber:iq:time)." # .../plugins/iq/time2.tcl ::msgcat::mcset de "Reply to entity time (urn:xmpp:time) requests." "Antworte\ auf 'Entity'-Zeit-Anfragen (urn:xmpp:time)." # .../plugins/iq/version.tcl ::msgcat::mcset de "Include operating system info into a reply to version\ (jabber:iq:version) requests." "Betriebssystem-Informationen zu\ Antworten auf Versions-Anfragen (jabber:iq:version) hinzufügen." ::msgcat::mcset de "Reply to version (jabber:iq:version) requests." "Antworte\ auf Versions-Anfragen (jabber:iq:version)." # .../plugins/pep/user_activity.tcl ::msgcat::mcset de "\n\tActivity: %s" "\n\tAktivität: %s" ::msgcat::mcset de "\n\tUser activity subscription: %s"\ "\n\tAktivitäts-Anmeldung: %s" ::msgcat::mcset de "%s's activity changed to %s" "Aktivität für %s geändert\ in %s" ::msgcat::mcset de "%s's activity is unset" "Aktivität für %s ist nicht\ gesetzt" ::msgcat::mcset de "Activity" "Aktivität" ::msgcat::mcset de "Activity:" "Aktivität:" ::msgcat::mcset de "Auto-subscribe to other's user activity" "Aktivitäten\ Anderer automatisch abonnieren" ::msgcat::mcset de "Auto-subscribe to other's user activity notifications."\ "Benachrichtigungen über die Aktivität Anderer automatisch\ abonnieren." ::msgcat::mcset de "Cannot publish empty activity" "Nicht ausgefüllte\ Aktivität kann nicht veröffentlicht werden" ::msgcat::mcset de "Publish user activity..." "Eigene Aktivität\ veröffentlichen..." ::msgcat::mcset de "Subactivity" "Neben-Aktivität" ::msgcat::mcset de "Subactivity:" "Neben-Aktivität:" ::msgcat::mcset de "Unpublish user activity" "Eigene Aktivität zurückziehen" ::msgcat::mcset de "Unpublish user activity..." "Eigene Aktivität\ zurückziehen..." ::msgcat::mcset de "User activity" "Aktivität" ::msgcat::mcset de "User activity publishing failed: %s" "Veröffentlichen der\ Aktivität misslungen: %s" ::msgcat::mcset de "User activity unpublishing failed: %s" "Zurückziehen der\ Aktivität misslungen: %s" ::msgcat::mcset de "at the spa" "In Kur" ::msgcat::mcset de "brushing teeth" "Zähne putzen" ::msgcat::mcset de "buying groceries" "Lebensmittel kaufen" ::msgcat::mcset de "cleaning" "Putzen" ::msgcat::mcset de "coding" "Programmieren" ::msgcat::mcset de "commuting" "Pendeln" ::msgcat::mcset de "cooking" "Kochen" ::msgcat::mcset de "cycling" "Radfahren" ::msgcat::mcset de "day off" "Freier Tag" ::msgcat::mcset de "doing chores" "Haushalt" ::msgcat::mcset de "doing maintenance" "Wartungsarbeiten" ::msgcat::mcset de "doing the dishes" "Geschirr spülen" ::msgcat::mcset de "doing the laundry" "Wäsche waschen" ::msgcat::mcset de "drinking" "Trinken" ::msgcat::mcset de "driving" "Fahren" ::msgcat::mcset de "eating" "Essen" ::msgcat::mcset de "exercising" "Trainieren" ::msgcat::mcset de "gaming" "Spielen" ::msgcat::mcset de "gardening" "Gartenarbeit" ::msgcat::mcset de "getting a haircut" "Haare schneiden" ::msgcat::mcset de "going out" "Ausgehen" ::msgcat::mcset de "grooming" "Pflegen" ::msgcat::mcset de "hanging out" "Abhängen" ::msgcat::mcset de "having a beer" "Bier trinken" ::msgcat::mcset de "having a snack" "Zwischenmahlzeit" ::msgcat::mcset de "having appointment" "Termin" ::msgcat::mcset de "having breakfast" "Frühstück" ::msgcat::mcset de "having coffee" "Kaffee trinken" ::msgcat::mcset de "having dinner" "Abendessen" ::msgcat::mcset de "having lunch" "Mittagessen" ::msgcat::mcset de "having tea" "Tee trinken" ::msgcat::mcset de "hiking" "Wandern" ::msgcat::mcset de "in a car" "Im Auto" ::msgcat::mcset de "in a meeting" "Besprechung" ::msgcat::mcset de "in real life" "Im richtigen Leben" ::msgcat::mcset de "inactive" "Inaktiv" ::msgcat::mcset de "jogging" "Joggen" ::msgcat::mcset de "on a bus" "Im Bus" ::msgcat::mcset de "on a plane" "Im Flugzeug" ::msgcat::mcset de "on a train" "Im Zug" ::msgcat::mcset de "on a trip" "Ausflug" ::msgcat::mcset de "on the phone" "Am Telefon" ::msgcat::mcset de "on vacation" "In Urlaub" ::msgcat::mcset de "on video phone" "Am Bild-Telefon" ::msgcat::mcset de "partying" "Feiern" ::msgcat::mcset de "playing sports" "Sport" ::msgcat::mcset de "reading" "Lesen" ::msgcat::mcset de "rehearsing" "Proben" ::msgcat::mcset de "relaxing" "Ausspannen" ::msgcat::mcset de "running" "Laufen" ::msgcat::mcset de "running an errand" "Besorgungen machen" ::msgcat::mcset de "scheduled holiday" "Geplanter Urlaub" ::msgcat::mcset de "shaving" "Rasieren" ::msgcat::mcset de "shopping" "Einkaufen" ::msgcat::mcset de "skiing" "Skifahren" ::msgcat::mcset de "sleeping" "Schlafen" ::msgcat::mcset de "socializing" "Gesellschaft" ::msgcat::mcset de "studying" "Studieren" ::msgcat::mcset de "sunbathing" "Sonnen" ::msgcat::mcset de "swimming" "Schwimmen" ::msgcat::mcset de "taking a bath" "Baden" ::msgcat::mcset de "taking a shower" "Duschen" ::msgcat::mcset de "talking" "Reden" ::msgcat::mcset de "traveling" "Reisen" ::msgcat::mcset de "walking" "Wandern" ::msgcat::mcset de "walking the dog" "Hund spazierenführen" ::msgcat::mcset de "watching a movie" "Kinofilm gucken" ::msgcat::mcset de "watching tv" "Fernseh gucken" ::msgcat::mcset de "working" "Arbeiten" ::msgcat::mcset de "working out" "Working-Out" ::msgcat::mcset de "writing" "Schreiben" # .../plugins/pep/user_location.tcl ::msgcat::mcset de "\n\tLocation: %s : %s" "\n\tStandort: %s : %s" ::msgcat::mcset de "\n\tUser location subscription: %s"\ "\n\tStandort-Anmeldung: %s" ::msgcat::mcset de "%s's location changed to %s : %s" "%ss Standort geändert\ in %s : %s" ::msgcat::mcset de "%s's location is unset" "%ss Standort ist nicht gesetzt" ::msgcat::mcset de "Auto-subscribe to other's user location" "Standorte\ Anderer automatisch abonnieren" ::msgcat::mcset de "Auto-subscribe to other's user location notifications."\ "Benachrichtigungen über den Standort Anderer automatisch\ abonnieren." ::msgcat::mcset de "Publish user location..." "Eigenen Standort\ veröffentlichen..." ::msgcat::mcset de "Unpublish user location" "Eigenen Standort zurückziehen" ::msgcat::mcset de "Unpublish user location..." "Eigenen Standort\ zurückziehen..." ::msgcat::mcset de "User location" "Standort" ::msgcat::mcset de "User location publishing failed: %s" "Veröffentlichen des\ Standorts misslungen: %s" ::msgcat::mcset de "User location unpublishing failed: %s" "Zurückziehen des\ Standorts misslungen: %s" ::msgcat::mcset de "Altitude:" "Höhenlage:" ::msgcat::mcset de "Area:" "Gegend:" ::msgcat::mcset de "Bearing:" "Peilung:" ::msgcat::mcset de "Building:" "Gebäude:" ::msgcat::mcset de "Floor:" "Ebene:" ::msgcat::mcset de "GPS datum:" "GPS-Datum:" ::msgcat::mcset de "Horizontal GPS error:" "Horizontaler GPS-Fehler:" ::msgcat::mcset de "Locality:" "Örtlichkeit:" ::msgcat::mcset de "Region:" "Region:" ::msgcat::mcset de "Room:" "Raum:" ::msgcat::mcset de "Speed:" "Geschwindigkeit:" ::msgcat::mcset de "Street:" "Straße:" ::msgcat::mcset de "Timestamp:" "Zeitstempel:" # .../plugins/pep/user_mood.tcl ::msgcat::mcset de "\n\tMood: %s" "\n\tStimmung: %s" ::msgcat::mcset de "\n\tUser mood subscription: %s" "\n\tStimmungs-Anmeldung:\ %s" ::msgcat::mcset de "%s's mood changed to %s" "%ss Stimmung geändert in %s" ::msgcat::mcset de "%s's mood is unset" "%ss Stimmung ist nicht gesetzt" ::msgcat::mcset de "Auto-subscribe to other's user mood" "Stimmungen Anderer\ automatisch abonnieren" ::msgcat::mcset de "Auto-subscribe to other's user mood notifications."\ "Benachrichtigungen über die Stimmung Anderer automatisch\ abonnieren." ::msgcat::mcset de "Cannot publish empty mood" "Nicht ausgefüllte Stimmung\ kann nicht veröffentlicht werden" ::msgcat::mcset de "Mood" "Stimmung" ::msgcat::mcset de "Mood:" "Stimmung:" ::msgcat::mcset de "Publish" "Veröffentlichen" ::msgcat::mcset de "Publish user mood..." "Eigene Stimmung\ veröffentlichen..." ::msgcat::mcset de "Publishing is only possible while being online"\ "Veröffentlichung nur möglich wenn 'Online'" ::msgcat::mcset de "Unpublish" "Zurückziehen" ::msgcat::mcset de "Unpublish user mood" "Eigene Stimmung zurückziehen" ::msgcat::mcset de "Unpublish user mood..." "Eigene Stimmung zurückziehen..." ::msgcat::mcset de "Unpublishing is only possible while being online"\ "Zurückziehen nur möglich wenn 'Online'" ::msgcat::mcset de "Use connection:" "Benutze Verbindung:" ::msgcat::mcset de "User mood" "Stimmung" ::msgcat::mcset de "User mood publishing failed: %s" "Veröffentlichen der\ Stimmung misslungen: %s" ::msgcat::mcset de "User mood unpublishing failed: %s" "Zurückziehen der\ Stimmung misslungen: %s" ::msgcat::mcset de "afraid" "Ängstlich" ::msgcat::mcset de "amazed" "Erstaunt" ::msgcat::mcset de "angry" "Zornig" ::msgcat::mcset de "annoyed" "Verärgert" ::msgcat::mcset de "anxious" "Verunsichert" ::msgcat::mcset de "aroused" "Aufgerüttelt" ::msgcat::mcset de "ashamed" "Verschämt" ::msgcat::mcset de "bored" "Gelangweilt" ::msgcat::mcset de "brave" "Mutig" ::msgcat::mcset de "calm" "Ruhig" ::msgcat::mcset de "cold" "Kalt" ::msgcat::mcset de "confused" "Verwirrt" ::msgcat::mcset de "contented" "Zufrieden" ::msgcat::mcset de "cranky" "Schrullig" ::msgcat::mcset de "curious" "Merkwürdig" ::msgcat::mcset de "depressed" "Deprimiert" ::msgcat::mcset de "disappointed" "Enttäuscht" ::msgcat::mcset de "disgusted" "Angewidert" ::msgcat::mcset de "distracted" "Abgelenkt" ::msgcat::mcset de "embarrassed" "Geniert" ::msgcat::mcset de "excited" "Aufgeregt" ::msgcat::mcset de "flirtatious" "Kokett" ::msgcat::mcset de "frustrated" "Frustriert" ::msgcat::mcset de "grumpy" "Knurrig" ::msgcat::mcset de "guilty" "Schuldig" ::msgcat::mcset de "happy" "Glücklich" ::msgcat::mcset de "hot" "Heiß" ::msgcat::mcset de "humbled" "Gedemütigt" ::msgcat::mcset de "humiliated" "Erniedrigt" ::msgcat::mcset de "hungry" "Hungrig" ::msgcat::mcset de "hurt" "Verletzt" ::msgcat::mcset de "impressed" "Beeindruckt" ::msgcat::mcset de "in_awe" "Scheu" ::msgcat::mcset de "in_love" "Verliebt" ::msgcat::mcset de "indignant" "Empört" ::msgcat::mcset de "interested" "Interessiert" ::msgcat::mcset de "intoxicated" "Berauscht" ::msgcat::mcset de "invincible" "Unbesiegbar" ::msgcat::mcset de "jealous" "Eifersüchtig" ::msgcat::mcset de "lonely" "Einsam" ::msgcat::mcset de "mean" "Kleinlich" ::msgcat::mcset de "moody" "Launisch" ::msgcat::mcset de "nervous" "Nervös" ::msgcat::mcset de "neutral" "Neutral" ::msgcat::mcset de "offended" "Beleidigt" ::msgcat::mcset de "playful" "Verspielt" ::msgcat::mcset de "proud" "Stolz" ::msgcat::mcset de "relieved" "Erleichtert" ::msgcat::mcset de "remorseful" "Reumütig" ::msgcat::mcset de "restless" "Rastlos" ::msgcat::mcset de "sad" "Traurig" ::msgcat::mcset de "sarcastic" "Sarkastisch" ::msgcat::mcset de "serious" "Ernsthaft" ::msgcat::mcset de "shocked" "Schockiert" ::msgcat::mcset de "shy" "Schüchtern" ::msgcat::mcset de "sick" "Krank" ::msgcat::mcset de "sleepy" "Schläfrig" ::msgcat::mcset de "stressed" "Gestresst" ::msgcat::mcset de "surprised" "Überrascht" ::msgcat::mcset de "thirsty" "Durstig" ::msgcat::mcset de "worried" "Besorgt" # .../plugins/pep/user_tune.tcl ::msgcat::mcset de "\n\tTune: %s - %s" "\n\tMusik: %s - %s" ::msgcat::mcset de "\n\tUser tune subscription: %s" "\n\tMusik-Anmeldung: %s" ::msgcat::mcset de "%s's tune changed to %s - %s" "%ss Musik geändert in %s -\ %s" ::msgcat::mcset de "%s's tune has stopped playing" "%ss Musik wurde\ angehalten" ::msgcat::mcset de "%s's tune is unset" "%ss Musik ist nicht gesetzt" ::msgcat::mcset de "Artist:" "Interpret:" ::msgcat::mcset de "Auto-subscribe to other's user tune" "Musik Anderer\ automatisch abonnieren" ::msgcat::mcset de "Auto-subscribe to other's user tune notifications."\ "Benachrichtigungen über die Musik Anderer automatisch abonnieren." ::msgcat::mcset de "Length:" "Länge:" ::msgcat::mcset de "Publish \"playback stopped\" instead" "Stattdessen\ \"Wiedergabe angehalten\" veröffentlichen" ::msgcat::mcset de "Publish user tune..." "Eigene Musik veröffentlichen..." ::msgcat::mcset de "Rating:" "Bewertung:" ::msgcat::mcset de "Source:" "Quelle:" ::msgcat::mcset de "Track:" "Index:" ::msgcat::mcset de "Unpublish user tune" "Eigene Musik zurückziehen" ::msgcat::mcset de "Unpublish user tune..." "Eigene Musik zurückziehen..." ::msgcat::mcset de "URI:" "URI:" ::msgcat::mcset de "User tune" "Musik" ::msgcat::mcset de "User tune publishing failed: %s" "Veröffentlichen der\ Musik misslungen: %s" ::msgcat::mcset de "User tune unpublishing failed: %s" "Zurückziehen der\ Musik misslungen: %s" # .../plugins/richtext/emoticons.tcl ::msgcat::mcset de "Handle ROTFL/LOL smileys -- those like :))) -- by\ \"consuming\" all that parens and rendering the whole word with\ appropriate icon." "ROTFL/LOL Smileys, wie z. B. :-))), derart\ behandeln, daß alle Paare entfernt werden und das Ganze mit dem\ zugehörigen Icon dargestellt wird." ::msgcat::mcset de "Handling of \"emoticons\". Emoticons (also known as\ \"smileys\") are small pictures resembling a human face used to\ represent user's emotion. They are typed in as special mnemonics like\ :) or can be inserted using menu." "Optionen für die Behandlung von\ Emoticons.\n'Emoticons' (auch als 'Smileys' bekannt) sind kleine,\ einem menschlichen Gesicht gleichende Bilder, die die Emotionen des\ Kontaktes repräsentieren sollen. Sie werden mit einer speziellen\ Mnemonik wie z. B. :-) oder über ein Menü eingegeben." ::msgcat::mcset de "Show images for emoticons." "Bilder für Emoticons\ anzeigen." ::msgcat::mcset de "Tkabber emoticons theme. To make new theme visible for\ Tkabber put it to some subdirectory of %s." "Tkabber Emoticon-Thema.\ Um es für Tkabber sichtbar zu machen, muß es in einem Unterordner von\ %s platziert werden." ::msgcat::mcset de "Use only whole words for emoticons." "Nur ganze Wörter\ als Emoticons benutzen." # .../plugins/richtext/highlight.tcl ::msgcat::mcset de "Enable highlighting plugin." "Markierungs-Plugin\ aktivieren." ::msgcat::mcset de "Groupchat message highlighting plugin options." "Optionen\ für das Konferenz-Nachrichten Markierungs-Plugin." ::msgcat::mcset de "Highlight current nickname in messages." "Derzeitigen\ Nicknamen in Nachrichten markieren." ::msgcat::mcset de "Highlight only whole words in messages." "Nur ganze\ Wörter in Nachrichten markieren." ::msgcat::mcset de "Substrings to highlight in messages."\ "Teil-Zeichenfolgen, die in Nachrichten markiert werden sollen." # .../plugins/richtext/stylecodes.tcl ::msgcat::mcset de "Emphasize stylecoded messages using different fonts."\ "'Style'-kodierte Nachrichten durch die Benutzung unterschiedlicher\ Schriften hervorheben." ::msgcat::mcset de "Handling of \"stylecodes\". Stylecodes are (groups of)\ special formatting symbols used to emphasize parts of the text by\ setting them with boldface, italics or underlined styles, or as\ combinations of these." "Optionen für die Behandlung von\ Style-Kodierungen.\n'Style'-Kodierungen sind spezielle\ Formatierungs-Symbole, die dazu benutzt werden, Teile eines Textes\ durch Fett-, Schrägschrift, Unterstreichung, oder einer Kombination\ davon, hervorzuheben." ::msgcat::mcset de "Hide characters comprising stylecode markup."\ "Style-Kodierungs-Markups verbergen." # .../plugins/roster/annotations.tcl ::msgcat::mcset de "Created: %s" "Erstellt: %s" ::msgcat::mcset de "Edit item notes..." "Eintrags-Notizen ändern..." ::msgcat::mcset de "Edit roster notes for %s" "Roster-Notizen ändern für %s" ::msgcat::mcset de "Modified: %s" "Geändert: %s" ::msgcat::mcset de "Notes" "Notizen" ::msgcat::mcset de "Roster Notes" "Roster-Notizen" ::msgcat::mcset de "Store" "Sichern" ::msgcat::mcset de "Storing roster notes failed: %s" "Sichern der\ Roster-Notizen misslungen: %s" # .../plugins/roster/backup.tcl ::msgcat::mcset de "Error" "Fehler" ::msgcat::mcset de "Error importing roster contact %s: %s" "Fehler beim\ Import des Roster-Kontaktes %s: %s" ::msgcat::mcset de "Export roster" "Roster exportieren" ::msgcat::mcset de "Export roster for %s..." "Roster für %s exportieren..." ::msgcat::mcset de "Import roster" "Roster importieren" ::msgcat::mcset de "Import roster for %s..." "Roster für %s importieren..." ::msgcat::mcset de "Roster files" "Roster-Dateien" ::msgcat::mcset de "Roster import for %s is completed" "Roster-Import für %s\ abgeschlossen" # .../plugins/roster/bkup_annotations.tcl ::msgcat::mcset de "Error restoring annotations: %s" "Fehler bei der\ Wiederherstellung der Roster-Notizen: %s" # .../plugins/roster/bkup_conferences.tcl ::msgcat::mcset de "Error restoring conference bookmarks: %s" "Fehler bei der\ Wiederherstellung der Konferenz-Lesezeichen: %s" # .../plugins/roster/bkup_metacontacts.tcl ::msgcat::mcset de "Error restoring metacontacts: %s" "Fehler bei der\ Wiederherstellung der Meta-Kontakte: %s" # .../plugins/roster/cache_categories.tcl ::msgcat::mcset de "Cached service categories and types (from disco#info)."\ "Gespeicherte Dienst-Kategorien und -Typen (von disco#info)." # .../plugins/roster/conferenceinfo.tcl ::msgcat::mcset de "\n\tCan't browse: %s" "\n\tDurchsuchen misslungen: %s" ::msgcat::mcset de "\nRoom is empty at %s" "\nKonferenz-Raum ist leer um %s" ::msgcat::mcset de "\nRoom participants at %s:" "\nKonferenz-Teilnehmer um\ %s:" ::msgcat::mcset de "Interval (in minutes) after error reply on request of\ participants list." "Wartezeit nach einer Fehler-Antwort auf Abfragen\ der Teilnehmer-Listen (in Minuten)." ::msgcat::mcset de "Interval (in minutes) between requests of participants\ list." "Zeitraum zwischen den Abfragen der Teilnehmer-Listen (in\ Minuten)." ::msgcat::mcset de "Options for Conference Info module, that allows you to\ see list of participants in roster popup, regardless of whether you\ are currently joined with the conference." "Optionen für das\ 'Conference Info'-Plugin.\nDie Liste der Konferenz-Teilnehmer im\ zugehörigen Eintrags-Tooltip einsehen, unabhängig davon, ob man der\ Konferenz derzeit beiwohnt oder nicht." ::msgcat::mcset de "Periodically browse roster conferences" "Konferenzen\ regelmäßig durchsuchen" ::msgcat::mcset de "Use this module" "Dieses Modul benutzen." # .../plugins/roster/conferences.tcl ::msgcat::mcset de "Add" "Hinzufügen" ::msgcat::mcset de "Add Conference to Roster" "Konferenz zu Roster\ hinzufügen" ::msgcat::mcset de "Add conference to roster..." "Konferenz zu Roster\ hinzufügen..." ::msgcat::mcset de "Automatically join conference upon connect" "Der\ Konferenz bei Verbindung automatisch beitreten" ::msgcat::mcset de "Conference:" "Konferenz:" ::msgcat::mcset de "Conferences" "Konferenzen" ::msgcat::mcset de "Default group for conferences in roster."\ "Voreingestellte Gruppe für Konferenzen im Roster" ::msgcat::mcset de "Edit properties for %s" "Eigenschaften ändern für %s" ::msgcat::mcset de "Ignore autojoin option and do not automatically join\ conference rooms on login." "Konferenz-Räumen beim Login nicht\ automatisch beitreten (andere Optionen zum automatischen Beitritt\ ignorieren)." ::msgcat::mcset de "Join..." "Beitreten..." ::msgcat::mcset de "Name: " "Name:" ::msgcat::mcset de "Roster group:" "Roster-Gruppe:" ::msgcat::mcset de "Storing conferences failed: %s" "Sichern der Konferenzen\ misslungen: %s" # .../plugins/roster/fetch_nicknames.tcl ::msgcat::mcset de "Fetch nickname" "Nicknamen abrufen" ::msgcat::mcset de "Fetch nicknames of all users in group" "Nicknamen von\ allen Kontakten der Gruppe abrufen" ::msgcat::mcset de "Fetch user nicknames" "Kontakt-Nicknamen abrufen" # .../plugins/roster/metacontacts.tcl ::msgcat::mcset de "Are you sure to delete %s's metacontact?" "Soll %ss\ Meta-Kontakt wirklich gelöscht werden?" ::msgcat::mcset de "Are you sure to delete metacontact?" "Soll der\ Meta-Kontakt wirklich gelöscht werden?" ::msgcat::mcset de "Create metacontact" "Meta-Kontakt erstellen" ::msgcat::mcset de "Delete metacontact" "Meta-Kontakt löschen" ::msgcat::mcset de "Edit %s's Metacontact" "%ss Meta-Kontakt ändern" ::msgcat::mcset de "Edit Metacontact" "Meta-Kontakt ändern" ::msgcat::mcset de "Edit metacontact" "Meta-Kontakt ändern" ::msgcat::mcset de "Metacontact" "Meta-Kontakt" ::msgcat::mcset de "Remove from metacontact" "Von Meta-Kontakt entfernen" ::msgcat::mcset de "Storing roster metacontacts failed: %s" "Sichern der\ Roster-Meta-Kontakte misslungen: %s" # .../plugins/roster/rosterx.tcl ::msgcat::mcset de "Attached user:" "Angehängter Kontakt:" ::msgcat::mcset de "Contact Information" "Kontakt-Informationen" ::msgcat::mcset de "No users in roster..." "Keine Kontakte im Roster..." ::msgcat::mcset de "Send" "Senden" ::msgcat::mcset de "Send contacts to %s" "Kontakte an %s senden" ::msgcat::mcset de "Send users..." "Kontakte senden..." # .../plugins/search/rawxml.tcl ::msgcat::mcset de "Search down" "Abwärts suchen" ::msgcat::mcset de "Search up" "Aufwärts suchen" # .../plugins/search/search.tcl ::msgcat::mcset de "Match case while searching in chat, log or disco\ windows." "Groß-/Kleinschreibung bei der Suche in Chat-, Log- oder\ Discovery-Fenstern beachten." ::msgcat::mcset de "Search in Tkabber windows options." "Optionen für die\ Suche in Tkabber-Fenstern." ::msgcat::mcset de "Specifies search mode while searching in chat, log or\ disco windows. \"substring\" searches exact substring, \"glob\" uses\ glob style matching, \"regexp\" allows to match regular expression."\ "Gibt den Modus beim Suchen in Chat-, Log- oder Discovery-Fenstern\ vor. 'substring' sucht eine exakte Teil-Zeichenfolge, 'glob' benutzt\ 'global style pattern matching', 'regexp' erlaubt die Verwendung\ Regulärer Ausdrücke." # .../plugins/si/ibb.tcl ::msgcat::mcset de "Opening IBB connection" "Öffne IBB-Verbindung" # .../plugins/si/iqibb.tcl ::msgcat::mcset de "Opening IQ-IBB connection" "Öffne IQ-IBB Verbindung" # .../plugins/si/socks5.tcl ::msgcat::mcset de "Aborted" "Abgebrochen" ::msgcat::mcset de "Cannot connect to proxy" "Proxy-Verbindung misslungen" ::msgcat::mcset de "Cannot negotiate proxy connection" "Proxy-Verhandlung\ misslungen" ::msgcat::mcset de "Illegal result" "Unzulässiges Ergebnis" ::msgcat::mcset de "List of proxy servers for SOCKS5 bytestreams (all\ available servers will be tried for mediated connection)." "Liste von\ Proxy-Servern für SOCKS5-'bytestreams' (alle verfügbaren Server\ werden für vermittelte Verbindungen überprüft)." ::msgcat::mcset de "Opening SOCKS5 listening socket" "Öffne\ SOCKS5-'Listening-Socket'" ::msgcat::mcset de "Use mediated SOCKS5 connection if proxy is available."\ "Vermittelte SOCKS5-Verbindung benutzen, wenn Proxy verfügbar ist." # .../plugins/unix/dockingtray.tcl ::msgcat::mcset de "Enable KDE tray icon." "KDE Tray-Icon aktivivieren." # .../plugins/unix/systray.tcl ::msgcat::mcset de "Enable freedesktop systray icon." "freedesktop\ SysTray-Icon aktivivieren." # .../plugins/unix/tktray.tcl ::msgcat::mcset de "Enable freedesktop system tray icon." "freedesktop\ SysTray-Icon aktivivieren." # .../plugins/unix/wmdock.tcl ::msgcat::mcset de "%s is %s" "%s ist %s" ::msgcat::mcset de "%s msgs" "%s Nachrichten" ::msgcat::mcset de "Message from %s" "Nachricht von %s" # .../plugins/windows/console.tcl ::msgcat::mcset de "Show console" "Konsole anzeigen" # .../plugins/windows/taskbar.tcl ::msgcat::mcset de "Enable windows tray icon." "Windows SysTray-Icon\ aktivieren." # .../tclxmpp/xmpp/*.tcl ::msgcat::mcset de "Access Error" "Zugriffs-Fehler" ::msgcat::mcset de "Address Error" "Adressierungs-Fehler" ::msgcat::mcset de "Address type not supported" "Nicht unterstützter\ Adressen-Typ" ::msgcat::mcset de "Already joined" "Bereits beigetreten" ::msgcat::mcset de "Already joining" "Bereits beim Beitreten" ::msgcat::mcset de "An existing variable \"%s\" cannot be used as an XMPP\ token" "Eine existierende Variable \"%s\" kann nicht als XMPP-'Token'\ benutzt werden" ::msgcat::mcset de "Application Error" "Anwendungs-Fehler" ::msgcat::mcset de "Authentication error" "Authentifizierungs-Fehler" ::msgcat::mcset de "Authentication failed" "Authentifizierung misslungen" ::msgcat::mcset de "Authentication succeeded" "Authentifizierung erfolgreich" ::msgcat::mcset de "Authorization error" "Autorisierungs-Fehler" ::msgcat::mcset de "Bad format" "Ungültiges Format" ::msgcat::mcset de "Bad namespace prefix" "Ungültiger Namensraum-Präfix" ::msgcat::mcset de "Bad request" "Ungültige Abfrage" ::msgcat::mcset de "Can't switch transport to \"%s\": %s" "Transport kann\ nicht zu \"%s\" gewechselt werden: %s" ::msgcat::mcset de "Cannot connect to %s:%s" "Verbindung zu %s misslungen:\ %s" ::msgcat::mcset de "Cannot connect to proxy %s:%s" "Proxy-Verbindung zu %s\ misslungen: %s" ::msgcat::mcset de "Cannot forbid digest mechanisms" "'Digest'-Mechanismen\ können nicht verboten werden" ::msgcat::mcset de "Client's identd could not confirm the userid" "Des Client\ 'identd' konnte die 'userid' nicht bestätigen" ::msgcat::mcset de "Command not supported" "Nicht unterstützter Befehl" ::msgcat::mcset de "Component handshake aborted" "Komponenten-'Handshake'\ abgebrochen" ::msgcat::mcset de "Component handshake failed" "Komponenten-'Handshake'\ misslungen" ::msgcat::mcset de "Component handshake succeeded" "Komponenten-'Handshake'\ erfolgreich" ::msgcat::mcset de "Component handshake timed out" "Wartezeit-Überschreitung\ bei Komponenten-'Handshake'" ::msgcat::mcset de "Compression aborted" "Komprimierung abgebrochen" ::msgcat::mcset de "Compression negotiation failed"\ "Komprimierungs-Verhandlung misslungen" ::msgcat::mcset de "Compression negotiation successful"\ "Komprimierungs-Verhandlung erfolgreich" ::msgcat::mcset de "Compression setup failed" "Komprimierungs-Einrichtung\ fehlgeschlagen" ::msgcat::mcset de "Compression timed out" "Wartezeit-Überschreitung bei\ Komprimierung" ::msgcat::mcset de "Conflict" "Konflikt" ::msgcat::mcset de "Connection aborted" "Verbindung abgebrochen" ::msgcat::mcset de "Connection not allowed by ruleset" "Verbindung vom\ Regelwerk nicht erlaubt" ::msgcat::mcset de "Connection timed out" "Wartezeit-Überschreitung bei\ Verbindung" ::msgcat::mcset de "Connection timeout" "Wartezeit-Überschreitung bei\ Verbindung" ::msgcat::mcset de "Connection via proxy aborted" "Verbindung über Proxy\ abgebrochen" ::msgcat::mcset de "Connection via proxy timed out" "Wartezeit-Überschreitung\ bei Verbindung über Proxy" ::msgcat::mcset de "Date" "Datum" ::msgcat::mcset de "Disconnected from the room" "Nicht mehr mit Raum\ verbunden" ::msgcat::mcset de "Empty nickname" "Leerer Nickname" ::msgcat::mcset de "Failed to connect to HTTPS proxy" "Verbindung zu\ HTTPS-Proxy misslungen" ::msgcat::mcset de "Failed to read SOCKS4a destination address" "Lesen der\ SOCKS4a-Zieladresse misslungen" ::msgcat::mcset de "Failed to read SOCKS4a response" "Lesen der\ SOCKS4a-Antwort misslungen" ::msgcat::mcset de "Failed to read SOCKS5 authorization methods response"\ "Lesen der SOCKS5-Autorisierungs-Methoden-Antwort misslungen" ::msgcat::mcset de "Failed to read SOCKS5 authorization response" "Lesen der\ SOCKS5-Autorisierungs-Antwort misslungen" ::msgcat::mcset de "Failed to read SOCKS5 connection response" "Lesen der\ SOCKS5-Verbindungs-Antwort misslungen" ::msgcat::mcset de "Failed to read SOCKS5 destination address type" "Lesen\ des SOCKS5-Zieladressen-Typs misslungen" ::msgcat::mcset de "Failed to read SOCKS5 destination domain" "Lesen der\ SOCKS5-Zieldomain misslungen" ::msgcat::mcset de "Failed to read SOCKS5 destination domain length" "Lesen\ der SOCKS5-Zieldomain-Länge misslungen" ::msgcat::mcset de "Failed to read SOCKS5 destination IPv4 address and port"\ "Lesen der SOCKS5-Zieladresse und -port (IPv4) misslungen" ::msgcat::mcset de "Failed to read SOCKS5 destination IPv6 address and port"\ "Lesen der SOCKS5-Zieladresse und -port (IPv6) misslungen" ::msgcat::mcset de "Failed to read SOCKS5 destination port" "Lesen des\ SOCKS5-Zielports misslungen" ::msgcat::mcset de "Failed to send SOCKS4a request" "Senden der\ SOCKS4a-Anfrage misslungen" ::msgcat::mcset de "Failed to send SOCKS5 authorization methods request"\ "Senden der SOCKS5-Autorisierungs-Methoden-Anfrage misslungen" ::msgcat::mcset de "Failed to send SOCKS5 authorization request" "Senden der\ SOCKS5-Autorisierungs-Anfrage misslungen" ::msgcat::mcset de "Failed to send SOCKS5 connection request" "Senden der\ SOCKS5-Verbindungs-Anfrage misslungen" ::msgcat::mcset de "Feature not implemented" "Möglichkeit nicht\ implementiert" ::msgcat::mcset de "First name" "Vorname" ::msgcat::mcset de "Forbidden" "Unzulässig" ::msgcat::mcset de "Format Error" "Format-Fehler" ::msgcat::mcset de "General SOCKS server failure" "Allgemeiner\ SOCKS-Server-Fehler" ::msgcat::mcset de "Gone" "Verlassen" ::msgcat::mcset de "Host gone" "Host verloren" ::msgcat::mcset de "Host unknown" "Host unbekannt" ::msgcat::mcset de "HTTPS proxy negotiation aborted" "HTTPS-Proxy-Verhandlung\ abgebrochen" ::msgcat::mcset de "HTTPS proxy negotiation timed out"\ "Wartezeit-Überschreitung bei HTTPS-Proxy-Verhandlung" ::msgcat::mcset de "Illegal attribute \"xmlns\". Use -xmlns option"\ "Unzulässiges Attribut \"xmlns\". -xmlns Option benutzen" ::msgcat::mcset de "Illegal command \"%s\"" "Unzulässiger Befehl \"%s\"" ::msgcat::mcset de "Illegal IQ type \"%s\"" "Unzulässiger IQ-Typ \"%s\"" ::msgcat::mcset de "Illegal nickname" "Unzulässiger Nickname" ::msgcat::mcset de "Illegal option \"%s\"" "Unzulässige Option \"%s\"" ::msgcat::mcset de "Illegal presence type \"%s\"" "Unzulässiger Präsenz-Typ\ \"%s\"" ::msgcat::mcset de "Illegal value \"%s\" for option \"%s\"" "Unzulässiger\ Wert \"%s\" für Option \"%s\"" ::msgcat::mcset de "Illegal value \"%s\" for option \"%s\", boolean expected"\ "Unzulässiger Wert \"%s\" für Option \"%s\" (Boolean erwartet)" ::msgcat::mcset de "Improper addressing" "Falsche Adressierung" ::msgcat::mcset de "Incorrect encoding" "Inkorrekte Kodierung" ::msgcat::mcset de "Incorrect SOCKS4a server version" "Inkorrekte\ SOCKS4a-Server-Version" ::msgcat::mcset de "Incorrect SOCKS5 server version" "Inkorrekte\ SOCKS5-Server-Version" ::msgcat::mcset de "Internal server error" "Interner Server-Fehler" ::msgcat::mcset de "Invalid authzid" "Ungültiges 'authzid'" ::msgcat::mcset de "Invalid from" "Ungültiges Von" ::msgcat::mcset de "Invalid ID" "Ungültige ID" ::msgcat::mcset de "Invalid mechanism" "Ungültiger Mechanismus" ::msgcat::mcset de "Invalid namespace" "Ungültiger Namensraum" ::msgcat::mcset de "Invalid option \"%s\"" "Ungültige Option \"%s\"" ::msgcat::mcset de "Invalid XML" "Ungültiges XML" ::msgcat::mcset de "IPv6 support is not available" "IPv6-Unterstützung nicht\ verfügbar" ::msgcat::mcset de "IQ %s timed out" "Wartezeit-Überschreitung für IQ %s" ::msgcat::mcset de "IQ id %s doesn't exist in memory" "IQ-ID %s existiert\ nicht im Speicher" ::msgcat::mcset de "Item not found" "Eintrag nicht gefunden" ::msgcat::mcset de "JID malformed" "Missgebildete JID" ::msgcat::mcset de "Key" "Schlüssel" ::msgcat::mcset de "Last name" "Nachname" ::msgcat::mcset de "Leaving room" "Verlasse Raum" ::msgcat::mcset de "Mechanism too weak" "Mechanismus zu weich" ::msgcat::mcset de "Misc" "Verschiedenes" ::msgcat::mcset de "Missing option \"%s\"" "Fehlende Option \"%s\"" ::msgcat::mcset de "Missing option \"-username\" or \"-domain\"" "Fehlende\ Option \"-username\" oder \"-domain\"" ::msgcat::mcset de "MUC room JID \"%s\" is malformed" "Die MUC-Raum JID\ \"%s\" ist missgebildet" ::msgcat::mcset de "MUC room JID must have empty resource part. The specified\ JID was \"%s\"" "Die MUC-Raum JID muß einen leeren Ressourcen-Teil\ haben. Die angegebene JID war \"%s\"" ::msgcat::mcset de "MUC token doesn't exist" "Das MUC-'Token' existiert\ nicht" ::msgcat::mcset de "Must join room first" "Dem Raum muß erst beigetreten\ werden" ::msgcat::mcset de "Nickname didn't change" "Nickname wurde nicht geändert" ::msgcat::mcset de "Nickname is changing already" "Nickname wird bereits\ geändert" ::msgcat::mcset de "No SASL package found" "Kein SASL-Paket gefunden" ::msgcat::mcset de "Non-SASL authentication aborted"\ "Nicht-SASL-Authentifizierung abgebrochen" ::msgcat::mcset de "Non-SASL authentication failed"\ "Nicht-SASL-Authentifizierung misslungen" ::msgcat::mcset de "Non-SASL authentication succeeded"\ "Nicht-SASL-Authentifizierung erfolgreich" ::msgcat::mcset de "Non-SASL authentication timed out"\ "Wartezeit-Überschreitung bei Nicht-SASL-Authentifizierung" ::msgcat::mcset de "Not acceptable" "Nicht akzeptierbar" ::msgcat::mcset de "Not allowed" "Nicht erlaubt" ::msgcat::mcset de "Not authorized" "Nicht autorisiert" ::msgcat::mcset de "Not Found" "Nicht gefunden" ::msgcat::mcset de "Not Implemented" "Nicht implementiert" ::msgcat::mcset de "Nothing to block" "Nichts zu blockieren" ::msgcat::mcset de "Only one option \"-username\" or \"-domain\" is allowed"\ "Nur eine Option ist erlaubt: \"-username\" oder \"-domain\"" ::msgcat::mcset de "Opening stream aborted" "Eröffnungs-'Stream' abgebrochen" ::msgcat::mcset de "Opening stream timed out" "Wartezeit-Überschreitung bei\ Eröffnungs-'Stream'" ::msgcat::mcset de "Option \"-command\" is illegal for IQ type \"%s\""\ "Unzulässige Option \"-command\" für IQ-Typ \"%s\"" ::msgcat::mcset de "Option \"-nick\" or \"-jid\" must be specified" "Die\ Optionen \"-nick\" oder \"-jid\" müssen angegeben werden" ::msgcat::mcset de "Options \"-host\" and \"-port\" are required (or your\ proxy filter hasn't returned them)" "Die Optionen \"-host\" und\ \"-port\" sind erforderlich (oder der Proxy-Filter hat diese nicht\ zurückgegeben)" ::msgcat::mcset de "Parser \"%s\" doesn't exist" "Parser \"%s\" existiert\ nicht" ::msgcat::mcset de "Password" "Kennwort" ::msgcat::mcset de "Payment required" "Zahlung erforderlich" ::msgcat::mcset de "Phone" "Telefon" ::msgcat::mcset de "Policy violation" "Richtlinien-Verletzung" ::msgcat::mcset de "Recipient Error" "Empfänger-Fehler" ::msgcat::mcset de "Recipient unavailable" "Empfänger nicht verfügbar" ::msgcat::mcset de "Redirect" "Umleitung" ::msgcat::mcset de "Registration required" "Registrierung erforderlich" ::msgcat::mcset de "Remote connection failed" "Fernverbindung misslungen" ::msgcat::mcset de "Remote Server Error" "'Remote Server'-Fehler" ::msgcat::mcset de "Remote server not found" "'Remote Server' nicht gefunden" ::msgcat::mcset de "Remote server timeout" "Wartezeit-Überschreitung des\ 'Remote Servers'" ::msgcat::mcset de "Request error" "Abfrage-Fehler" ::msgcat::mcset de "Request rejected or failed" "Anfrage zurückgewiesen oder\ misslungen" ::msgcat::mcset de "Request Timeout" "Wartezeit-Überschreitung bei Abfrage" ::msgcat::mcset de "Resource constraint" "Ressourcen-Beschränkung" ::msgcat::mcset de "Restricted XML" "Eingeschränktes XML" ::msgcat::mcset de "SASL auth error:\n%s"\ "SASL-Authentifizierungs-Fehler:\n%s" ::msgcat::mcset de "SASL authentication aborted" "SASL-Authentifizierung\ abgebrochen" ::msgcat::mcset de "SASL authentication timed out" "Wartezeit-Überschreitung\ bei SASL-Authentifizierung" ::msgcat::mcset de "SASL callback error: client needs to write \"%s\"" "SASL\ Callback-Fehler: Client hat \"%s\" zu schreiben" ::msgcat::mcset de "SASL step error: %s" "SASL Schritt-Fehler: %s" ::msgcat::mcset de "See other host" "Anderen Host ansehen" ::msgcat::mcset de "Server cannot reach client's identd" "Server kann\ 'identd' des Client nicht erreichen" ::msgcat::mcset de "Server doesn't support digest non-SASL authentication"\ "Server unterstützt keine 'Digest'-Nicht-SASL-Authentifizierung." ::msgcat::mcset de "Server doesn't support plaintext non-SASL authentication"\ "Server unterstützt keine 'Plain'-Nicht-SASL-Authentifizierung." ::msgcat::mcset de "Server doesn't support plaintext or digest non-SASL\ authentication" "Server unterstützt keine 'Plain'- oder\ 'Digest'-Nicht-SASL-Authentifizierung." ::msgcat::mcset de "Server Error" "Server-Fehler" ::msgcat::mcset de "Server hasn't provided compress feature" "Server hat\ keine Komprimierungs-Möglichkeit bereitgestellt." ::msgcat::mcset de "Server hasn't provided non-SASL authentication feature"\ "Server hat keine Nicht-SASL-Authentifizierungs-Möglichkeit\ bereitgestellt." ::msgcat::mcset de "Server hasn't provided SASL authentication feature"\ "Server hat keine SASL-Authentifizierungs-Möglichkeit\ bereitgestellt." ::msgcat::mcset de "Server hasn't provided STARTTLS feature" "Server hat\ keine STARTTLS-Möglichkeit bereitgestellt." ::msgcat::mcset de "Server hasn't provided supported compress method" "Server\ hat keine unterstützte Komprimierungs-Methode bereitgestellt." ::msgcat::mcset de "Server provided mechanism %s. It is forbidden" "Server\ hat den Mechanismus %s bereitgestellt. Dieser ist unzulässig." ::msgcat::mcset de "Server provided mechanisms %s. They are forbidden"\ "Server hat die Mechanismen %s bereitgestellt. Diese sind\ unzulässig." ::msgcat::mcset de "Server provided no SASL mechanisms" "Server hat keinen\ SASL-Mechanismus bereitgestellt." ::msgcat::mcset de "Service unavailable" "Dienst nicht verfügbar" ::msgcat::mcset de "SOCKS4a proxy negotiation aborted"\ "SOCKS4a-Proxy-Verhandlung abgebrochen" ::msgcat::mcset de "SOCKS4a proxy negotiation timed out"\ "Wartezeit-Überschreitung bei SOCKS4a-Proxy-Verhandlung" ::msgcat::mcset de "SOCKS5 negotiation timed out" "Wartezeit-Überschreitung\ bei SOCKS5-Proxy-Verhandlung" ::msgcat::mcset de "SOCKS5 proxy negotiation aborted"\ "SOCKS5-Proxy-Verhandlung abgebrochen" ::msgcat::mcset de "SOCKS5 server authorization failed"\ "SOCKS5-Server-Autorisierung misslungen" ::msgcat::mcset de "SOCKS5 server authorization required"\ "SOCKS5-Server-Autorisierung erforderlich" ::msgcat::mcset de "STARTTLS aborted" "STARTTLS abgebrochen" ::msgcat::mcset de "STARTTLS failed" "STARTTLS misslungen" ::msgcat::mcset de "STARTTLS successful" "STARTTLS erfolgreich" ::msgcat::mcset de "STARTTLS timed out" "Wartezeit-Überschreitung bei\ STARTTLS" ::msgcat::mcset de "Stream error" "'Stream'-Fehler" ::msgcat::mcset de "Stream error (%s)" "'Stream'-Fehler (%s)" ::msgcat::mcset de "Stream error (%s): %s" "'Stream'-Fehler (%s): %s" ::msgcat::mcset de "Stream error: %s" "'Stream'-Fehler: %s" ::msgcat::mcset de "Subscription required" "Anmeldung erforderlich" ::msgcat::mcset de "System shutdown" "Systemende" ::msgcat::mcset de "Temporary auth failure" "Temporärer\ Authentifizierungs-Fehler" ::msgcat::mcset de "Temporary error" "Temporärer Fehler" ::msgcat::mcset de "Text" "Text" ::msgcat::mcset de "The room isn't joined yet" "Dem Raum wurde noch nicht\ beigetreten" ::msgcat::mcset de "TLS handshake failed: %s" "TLS-'Handshake' misslungen:\ %s" ::msgcat::mcset de "Transport \"%s\" already registered" "Transport \"%s\"\ bereits registriert" ::msgcat::mcset de "Unauthorized" "Nicht autorisiert" ::msgcat::mcset de "Undefined condition" "Undefinierte Bedingung" ::msgcat::mcset de "Unexpected request" "Unerwartete Abfrage" ::msgcat::mcset de "Unknown IQ type \"%s\"" "Unbekannter IQ-Typ \"%s\"" ::msgcat::mcset de "Unknown message type %s" "Unbekannter Nachrichten-Typ %s" ::msgcat::mcset de "Unknown SOCKS4a server error" "Unbekannter\ SOCKS4a-Server-Fehler" ::msgcat::mcset de "Unknown SOCKS5 destination address type" "Unbekannter\ SOCKS5-Zieladressen-Typ" ::msgcat::mcset de "Unknown transport \"%s\"" "Unbekannter Transport \"%s\"" ::msgcat::mcset de "Unrecoverable error" "Nicht zu behebender Fehler" ::msgcat::mcset de "Unsupported compression method" "Nicht unterstützte\ Komprimierungs-Methode." ::msgcat::mcset de "Unsupported encoding" "Nicht unterstützte Kodierung" ::msgcat::mcset de "Unsupported proxy \"%s\"" "Nicht unterstützter Proxy\ \"%s\"" ::msgcat::mcset de "Unsupported SOCKS5 authorization method" "Nicht\ unterstützte SOCKS5-Autorisierungs-Methode" ::msgcat::mcset de "Unsupported stanza type" "Nicht unterstützter\ 'Stanza'-Typ" ::msgcat::mcset de "Unsupported stream XMLNS \"%s\"" "Nicht unterstützter\ 'Stream' XMLNS \"%s\"" ::msgcat::mcset de "Unsupported version" "Nicht unterstützte Version" ::msgcat::mcset de "Usage: ::xmpp::Set xlib property ?value?" "Benutzung:\ ::xmpp::Set xlib property ?Wert?" ::msgcat::mcset de "Username" "Benutzer-Name" ::msgcat::mcset de "Username Not Available" "Benutzer-Name nicht verfügbar" ::msgcat::mcset de "Waiting for component handshake result" "Warte auf\ Ergebnis des Komponenten-'Handshake'" ::msgcat::mcset de "Waiting for non-SASL authentication fields" "Warte auf\ Felder der Nicht-SASL-Authentifizierung" ::msgcat::mcset de "Waiting for non-SASL authentication results" "Warte auf\ Ergebnisse der Nicht-SASL-Authentifizierung" ::msgcat::mcset de "Warning" "Warnung" ::msgcat::mcset de "XML not well-formed" "XML missgebildet" ::msgcat::mcset de "Zip" "PLZ" ::msgcat::mcset de "Free without disconnect" # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/msgs/eo.msg000064400000000000000000000523631477701321300141460ustar00nobodynobody# eo.msg -- # # Esperanto messages for the Tkabber XMPP client. # # Author: Mike Mintz # Last-Modified: December 30, 2002 # avatars.tcl ::msgcat::mcset eo "No avatar to store" "Neniu avatar por storiÄi" # browser.tcl ::msgcat::mcset eo "%s: %s/%s, Description: %s, Version: %s\nNumber of\ children: %s" "%s: %s/%s, Priskribo: %s, Versio: %s\nNombro da idoj:\ %s" ::msgcat::mcset eo "Browse" "Folumi" ::msgcat::mcset eo "JBrowser" "Jabber Folumilo" ::msgcat::mcset eo "JID:" # chats.tcl ::msgcat::mcset eo ">>> Unable to decipher data: %s <<<" ">>> Malkapabla por\ malĉifri datumojn: %s <<<" ::msgcat::mcset eo "Chat with %s" "Babilu kun %s" ::msgcat::mcset eo "Disconnected" "Malkonektita" ::msgcat::mcset eo "Error %s" "Eraro %s" ::msgcat::mcset eo "Error %s: %s" "Eraro %s: %s" ::msgcat::mcset eo "Invite" "Invitu" ::msgcat::mcset eo "Invite %s to conferences" "Invitu %s al konferencoj" ::msgcat::mcset eo "Invite users to %s" "Invitu uzulojn al %s" ::msgcat::mcset eo "Invite users..." "Invitu uzulojn..." ::msgcat::mcset eo "No conferences in progress..." "Neniu konferencoj\ progresas" ::msgcat::mcset eo "Please join %s" "Bonvolu ĉeesti %s" ::msgcat::mcset eo "Subject:" "Subjekto:" ::msgcat::mcset eo "Toggle encryption" "Kapabligi/Malkapabligi ĉifrado" # datagathering.tcl # emoticons.tcl # filetransfer.tcl ::msgcat::mcset eo "Browse..." "Folumu..." ::msgcat::mcset eo "Connection closed" "Konekto fermiÄis" ::msgcat::mcset eo "Description:" "Priskribo:" ::msgcat::mcset eo "File not found or not regular file: %s" "Dosiero ne estas\ trovita aÅ­ ne estas regula dosiero: %s" ::msgcat::mcset eo "File to Send:" "Dosiero por Sendi:" ::msgcat::mcset eo "IP address:" "IP adreso:" ::msgcat::mcset eo "Receive" "Ricevu" ::msgcat::mcset eo "Receive file from %s" "Recevu dosiero de %s" ::msgcat::mcset eo "Request failed: %s" "Peto malsukcesis: %s" ::msgcat::mcset eo "Save as:" "Surdisku kiel:" ::msgcat::mcset eo "Send file to %s" "Sendu dosieron al %s" ::msgcat::mcset eo "Size:" "Grando:" ::msgcat::mcset eo "Transfering..." "Translokanta..." # filters.tcl ::msgcat::mcset eo "Action" "Agado" ::msgcat::mcset eo "Add" "Aldonu" ::msgcat::mcset eo "Edit" "Redaktu" ::msgcat::mcset eo "Move down" "Transloku supren" ::msgcat::mcset eo "Move up" "Transloku suben" ::msgcat::mcset eo "Remove" "Elprenu" # gpgme.tcl ::msgcat::mcset eo "%s purportedly signed by %s can't be verified.\n\n%s."\ "%s supozeble subskribiÄis de %s ne povas kontroli\n\n%s." ::msgcat::mcset eo "Change security preferences for %s" "ÅœanÄu\ sekureco-elektojn por %s" ::msgcat::mcset eo "Data purportedly sent by %s can't be deciphered.\n\n%s."\ "Datumoj, kiu supozeble sendiÄis de %s, ne povas malĉifriÄi.\n\n%s." ::msgcat::mcset eo "Encrypt traffic" "Ĉifru trafikon" ::msgcat::mcset eo "Error in signature verification software: %s." "Eraro en\ subskribo-kontrolanta softvaro: %s." ::msgcat::mcset eo "Key ID" "Åœlosilo-ID" ::msgcat::mcset eo "Passphrase:" "Pasfrazo:" ::msgcat::mcset eo "Please enter passphrase" "Bonvolu tajpi pasfrazon" ::msgcat::mcset eo "Please try again" "Bonvolu repeni" ::msgcat::mcset eo "Select" "Elektu" ::msgcat::mcset eo "Select Key for Signing Traffic" "Elektu Åœlosilon por\ Trafiko-Subskribado" ::msgcat::mcset eo "Unable to encipher data for %s: %s.\n\nEncrypting traffic\ to this user is now disabled.\n\nSend it as PLAINTEXT?" "Malkapabla\ por ĉifri datumojn por %s: %s.\n\nTrafiko-ĉifrado al tiu ĉi uzulo nun\ estas malkapablita.\n\nSendu Äin kiel KLARA-TEKSTO?" ::msgcat::mcset eo "Unable to sign message body: %s.\n\nSigning traffic is\ now disabled.\n\nSend it WITHOUT a signature?" "Malkapabla por\ subskrib mesaÄo-korpon: %s.\n\nTrafiko-subskribado nun estas\ malkapablita.\n\nCxu sendu SEN subskribo?" ::msgcat::mcset eo "Unable to sign presence information: %s.\n\nPresence will\ be sent, but signing traffic is now disabled." "Malkapabla por\ subskribi ĉeesto-informon: %s.\n\nĈeesto estos sendita, sed\ trafiko-subskribado nun estas malkapablita." ::msgcat::mcset eo "User ID" "Uzulo-ID" ::msgcat::mcset eo "" # iface.tcl ::msgcat::mcset eo "Add conference..." "Aldonu konferencon..." ::msgcat::mcset eo "Add user..." "Aldonu uzulon..." ::msgcat::mcset eo "Admin tools" "Administruliloj" ::msgcat::mcset eo "Allow downloading" "Permesu elÅutadon" ::msgcat::mcset eo "Announce" "Anoncu" ::msgcat::mcset eo "Away" "Fora" ::msgcat::mcset eo "Browser" "Folumilo" ::msgcat::mcset eo "Change password..." "ÅœanÄu pasvorton..." ::msgcat::mcset eo "Chats" "Babilejoj" ::msgcat::mcset eo "Create room..." "Kreu konferencon" ::msgcat::mcset eo "Delete message of the day" "ForviÅu mesaÄon de la tago" ::msgcat::mcset eo "Do not disturb" "Ne Äenu" ::msgcat::mcset eo "Edit my info..." "Redaktu mian informon..." ::msgcat::mcset eo "Extended Away" "Pli Fora" ::msgcat::mcset eo "Filters..." "Filtriloj..." ::msgcat::mcset eo "Free to chat" "Libera por babilado" ::msgcat::mcset eo "Help" "Helpo" ::msgcat::mcset eo "Invisible" "KaÅita" ::msgcat::mcset eo "Join group..." "Ĉeesto grupon..." ::msgcat::mcset eo "Log in..." "Konektu..." ::msgcat::mcset eo "Log out" "Malkonektu" ::msgcat::mcset eo "Log out with reason..." "Malkonektu pro kialo..." ::msgcat::mcset eo "Mute" "Muta" ::msgcat::mcset eo "Online" "Enreta" ::msgcat::mcset eo "Open raw XML window" "Malfermu krudan XML fenestron" ::msgcat::mcset eo "Presence" "Ĉeesto" ::msgcat::mcset eo "Profile on" "Karakterizo-activigu" ::msgcat::mcset eo "Profile report" "Karakterizo-raporto" ::msgcat::mcset eo "Quick help" "Rapida helpo" ::msgcat::mcset eo "Quit" "Eliru" ::msgcat::mcset eo "Roster" "Kontaktulolisto" ::msgcat::mcset eo "Send broadcast message..." "Dissendu mesaÄon..." ::msgcat::mcset eo "Send message of the day..." "Sendu mesaÄon de la tago..." ::msgcat::mcset eo "Send message..." "Sendu mesaÄon..." ::msgcat::mcset eo "Send to server" "Sendu al servilo" ::msgcat::mcset eo "Services" "Servoj" ::msgcat::mcset eo "Show user info..." "Montru informon de uzulo..." ::msgcat::mcset eo "Sound" "Sono" ::msgcat::mcset eo "Stop autoscroll" "Haltu aÅ­tomatan scroll" ::msgcat::mcset eo "Update message of the day..." "Äœisdatigi mesaÄno de la\ tago..." ::msgcat::mcset eo "Avatar" ::msgcat::mcset eo "Jidlink" ::msgcat::mcset eo "Chats:" "Babilejoj:" ::msgcat::mcset eo "Close tab" "Fermu tab" ::msgcat::mcset eo "Complete nickname" "Plena kaÅnomo" ::msgcat::mcset eo "Correct word" "korektu vorton" ::msgcat::mcset eo "Hide/Show roster" "KaÅigu/Montru kontaktulolisto" ::msgcat::mcset eo "Main window:" "Ĉefa fenestro:" ::msgcat::mcset eo "Previous/Next history message" "AntaÅ­a/Venonta mesaÄo de\ historio" ::msgcat::mcset eo "Previous/Next tab" "AntaÅ­a/Venonta tab" ::msgcat::mcset eo "Quick Help" "Rapida Helpo" ::msgcat::mcset eo "Redo" "Refaru" ::msgcat::mcset eo "Scroll chat window up/down" "Transloku babilofenestron\ supren/suben" ::msgcat::mcset eo "Show emoticons" "Montru sentikonojn" ::msgcat::mcset eo "Undo" "Malfaru" ::msgcat::mcset eo "Tabs:" ::msgcat::mcset eo "About" "Pri" ::msgcat::mcset eo "Alexey Shchepin" "Aleksi Åœepin" ::msgcat::mcset eo "Authors:" "AÅ­toroj:" ::msgcat::mcset eo "Marshall T. Rose" "MarÅal T. Roz" ::msgcat::mcset eo "Michail Litvak" "MiÄ¥ejl Litvak" ::msgcat::mcset eo "Sergei Golovan" "Sergej Golovan" ::msgcat::mcset eo "Add new user..." "Aldonu novan uzulon..." ::msgcat::mcset eo "Jabber Browser" "Jabber Foliumilo" #::msgcat::mcset eo "Join group..." "Ĉeestu grupon..." ::msgcat::mcset eo "Cancel" "Nuligu" ::msgcat::mcset eo "Close" "Fermu" ::msgcat::mcset eo "Close all tabs" "Fermu ĉiujn tabs" ::msgcat::mcset eo "Close other tabs" "Fermu aliajn tabs" ::msgcat::mcset eo "Send" "Sendu" ::msgcat::mcset eo "Show online & offline users" "Montru enretajn kaj\ malenretajn uzulojn" ::msgcat::mcset eo "Show online users only" "Montru nur enretajn uzulojn" ::msgcat::mcset eo "Toggle encryption (when possible)"\ "Kapabligi/Malkapabligi ĉifrado (kiam eble)" ::msgcat::mcset eo "Toggle signing" "Kapabligi/Malkapabligi subskribado" # itemedit.tcl ::msgcat::mcset eo "<- Remove" "<- Elprenu" ::msgcat::mcset eo "Add ->" "Aldonu ->" ::msgcat::mcset eo "Available groups" "Disponeblaj grupoj" ::msgcat::mcset eo "Current groups" "Nunaj grupoj" ::msgcat::mcset eo "Edit groups for %s" "Redaktu grupojn por %s" ::msgcat::mcset eo "Edit nickname for %s" "Redaktu kaÅnomo por %s" ::msgcat::mcset eo "Edit properties for %s" "Redaktu kvalitojn por %s" ::msgcat::mcset eo "Group:" "Grupo:" ::msgcat::mcset eo "Nickname:" "KaÅnomo:" # jidlink.tcl ::msgcat::mcset eo "Jidlink connection closed" "Jidlink konekto fermis" ::msgcat::mcset eo "Opening Jidlink connection" "Malfermas Jidlink konekton" # joingrdialog.tcl ::msgcat::mcset eo "Add group" "Aldonu grupon" ::msgcat::mcset eo "Address:" "Adreso:" ::msgcat::mcset eo "Create" "Kreu" ::msgcat::mcset eo "Create Room" "Kreu Konferencon" ::msgcat::mcset eo "Description:" "Priskribu:" ::msgcat::mcset eo "Get conference info failed: %s" "Akirado de informo de\ konferenco malsukcesis %s" ::msgcat::mcset eo "Group:" "Grupo:" ::msgcat::mcset eo "Join" "Ĉeestu" ::msgcat::mcset eo "Join failed: %s" "Ĉeestado malsukcesis %s" ::msgcat::mcset eo "Join group" "Ĉeestu grupon" ::msgcat::mcset eo "Name: " "Nomo:" ::msgcat::mcset eo "Nick:" "KaÅnomo:" ::msgcat::mcset eo "Nickname:" "KaÅnomo:" ::msgcat::mcset eo "Password (v2 only):" "Pasvorto (por nur versio 2a)" ::msgcat::mcset eo "Password:" "Pasvorto:" ::msgcat::mcset eo "Server:" "Servilo:" ::msgcat::mcset eo "use v2 protocol" "Uzu 2an versian retalingvon" # login.tcl ::msgcat::mcset eo "Authentication failed: %s\nCreate new account?"\ "Rajtigado malsukcesis: %s\nKreu novan konton?" ::msgcat::mcset eo "Change password" "ÅœanÄu pasvorton" ::msgcat::mcset eo "Connect via alternate server" "Konektu per alia servilo" ::msgcat::mcset eo "Login" "Konektu" ::msgcat::mcset eo "Logout with reason" "Malkonektu pro kialo" ::msgcat::mcset eo "New password:" "Nova pasvorto:" ::msgcat::mcset eo "New passwords do not match" "Novaj pasvortoj ne estas la\ samo" ::msgcat::mcset eo "Old password is incorrect" "Malnova pasvorto malpravas" ::msgcat::mcset eo "Old password:" "Malnova pasvorto:" ::msgcat::mcset eo "Password change failed: %s" "ÅœanÄo de pasvorto\ malsukcesis: %s" ::msgcat::mcset eo "Password is changed" "Pasvorto estas ÅanÄita" ::msgcat::mcset eo "Password:" "Pasvorto:" ::msgcat::mcset eo "Profile" "Karakterizo" ::msgcat::mcset eo "Profiles" "Karakterizoj" ::msgcat::mcset eo "Proxy Login:" "Proxy KaÅnomo:" ::msgcat::mcset eo "Proxy Password:" "Proxy Pasvorto:" ::msgcat::mcset eo "Proxy Server:" "Proxy Servilo:" ::msgcat::mcset eo "Reason:" "Kialo:" ::msgcat::mcset eo "Registration failed: %s" "Enregistrigado malsukcesis: %s" ::msgcat::mcset eo "Repeat new password:" "Ripetu novan pasvorton:" ::msgcat::mcset eo "Server:" "Servilo:" ::msgcat::mcset eo "Use hashed password" "Uzu hashed pasvorton" ::msgcat::mcset eo "Use Proxy" "Uzu Proxy" ::msgcat::mcset eo "Use SSL" "Uzu SSL" ::msgcat::mcset eo "Username:" "KaÅnomo:" ::msgcat::mcset eo "Port:" ::msgcat::mcset eo "Priority:" ::msgcat::mcset eo "Proxy Port:" ::msgcat::mcset eo "Resource:" ::msgcat::mcset eo "SSL Port:" # messages.tcl ::msgcat::mcset eo "Attached file:" "Afiksita dosiero:" ::msgcat::mcset eo "Attached user:" "Afiksita uzulo:" ::msgcat::mcset eo "Extras from" "Ekstraĵoj de" ::msgcat::mcset eo "Extras from %s" "Ekstraĵoj de %s" ::msgcat::mcset eo "Invited to:" "Invitita al:" ::msgcat::mcset eo "Message body" "Korpo de mesaÄo" ::msgcat::mcset eo "Message from" "MesaÄo de" ::msgcat::mcset eo "Message from %s" "MesaÄo de %s" ::msgcat::mcset eo "Reply" "Respondu" ::msgcat::mcset eo "Send message" "Sendu mesaÄon" ::msgcat::mcset eo "Send message to %s" "Sendu mesaÄon al %s" ::msgcat::mcset eo "Send subscription" "Sendu abono" ::msgcat::mcset eo "Send subscription to " "Sendu abono al " ::msgcat::mcset eo "Send subscription to %s" "Sendu abono al %s" ::msgcat::mcset eo "Sort" "Klasi" ::msgcat::mcset eo "Subscribe" "Abonu" ::msgcat::mcset eo "Subscribe request from" "Abonopeto de" ::msgcat::mcset eo "Subscribe request from %s" "Abonopeto de %s" ::msgcat::mcset eo "Toggle seen" "Kapabligi/Malkapabligi viditado (seen)" ::msgcat::mcset eo "Unsubscribe" "Malabonu" ::msgcat::mcset eo "Headlines" # muc.tcl ::msgcat::mcset eo "Ban" "Malpermesu" ::msgcat::mcset eo "Configure" "decidu opciojn" ::msgcat::mcset eo "Destroy" "Destruu" ::msgcat::mcset eo "Edit admin list" "Redaktu administrulo-listo" ::msgcat::mcset eo "Edit ban list" "Redaktu malpermeso-listo" ::msgcat::mcset eo "Edit member list" "Redaktu ano-listo" ::msgcat::mcset eo "Edit moderator list" "Redaktu moderigulo-listo" ::msgcat::mcset eo "Edit voice list" "Redaktu voĉoliston" ::msgcat::mcset eo "Grant Membership" "Donu anecon" ::msgcat::mcset eo "Grant Moderator Privilege" "Donu privilegion de\ moderigado" ::msgcat::mcset eo "Grant Voice" "Donu voĉon" ::msgcat::mcset eo "Kick" "Piedbatu" ::msgcat::mcset eo "Revoke Membership" "Revoku anecon" ::msgcat::mcset eo "Revoke Moderator Privilege" "Revoku privilegion de\ moderigado" ::msgcat::mcset eo "Revoke Voice" "Revoku voĉon" ::msgcat::mcset eo "Whois" "Kiu-estas" ::msgcat::mcset eo "MUC" # presence.tcl ::msgcat::mcset eo "Not logged in" "Nekonektita" #::msgcat::mcset eo "Online" "Enreta" #::msgcat::mcset eo "Free to chat" "Libera por babilado" #::msgcat::mcset eo "Away" "Fora" #::msgcat::mcset eo "Extended Away" "Pli Fora" #::msgcat::mcset eo "Do not disturb" "Ne Äœenu" #::msgcat::mcset eo "Invisible" "KaÅita" ::msgcat::mcset eo "invalid userstatus value " "malvalida userstatus " ::msgcat::mcset eo "Offline" "Malenreta" # register.tcl ::msgcat::mcset eo "Register in %s" "EnregistriÄu en %s" ::msgcat::mcset eo "Unsubscribed from %s" "Abonita de %s" ::msgcat::mcset eo "We unsubscribed from %s" "Ni abonis %s" # roster.tcl ::msgcat::mcset eo "is now" "estas nun" ::msgcat::mcset eo "Undefined" "Nedifinita" #::msgcat::mcset eo "Show online & offline users" \ # "Montru enretajn kaj malenretajn uzulojn" #::msgcat::mcset eo "Show online users only" "Montru nur enretajn uzulojn" ::msgcat::mcset eo "Are you sure to remove %s from roster?" "Ĉu vi estas\ certa elpreni %s el kontaktulolisto?" ::msgcat::mcset eo "Start chat" "Eku babilon" #::msgcat::mcset eo "Send message..." "Sendu mesaÄon..." ::msgcat::mcset eo "Contact Information" "Informo de Kontaktulo" ::msgcat::mcset eo "Edit item..." "Redaktu eron..." ::msgcat::mcset eo "Edit security..." "Redaktu sekurecon..." ::msgcat::mcset eo "Invite to conference..." "Invitu al konferenco..." ::msgcat::mcset eo "Join..." "Ĉeestu..." ::msgcat::mcset eo "Log in" "Konektu" ::msgcat::mcset eo "Log out" "Malkonektu" ::msgcat::mcset eo "No users in roster..." "Neniu uzuloj en\ kontaktulolistoj..." ::msgcat::mcset eo "Raw XML input" "Kruda XML enigo" ::msgcat::mcset eo "Remove..." "Elprenu..." ::msgcat::mcset eo "Resubscribe" "Reabonu" ::msgcat::mcset eo "Send" "Sendu" ::msgcat::mcset eo "Send contacts to" "Sendu kontaktulojn al" ::msgcat::mcset eo "Send file via Jidlink..." "Sendu dosieron per Jidlink..." ::msgcat::mcset eo "Send file..." "Sendu dosieron..." ::msgcat::mcset eo "Send users..." "Sendu uzulojn..." ::msgcat::mcset eo "Show history" "Montru historion" ::msgcat::mcset eo "Show info" "Montru informon" # search.tcl ::msgcat::mcset eo "OK" "Bone" ::msgcat::mcset eo "Search again" "Reserĉu" ::msgcat::mcset eo "Search in" "Serĉu en" # splash.tcl ::msgcat::mcset eo "auto-away" "aÅ­tomata-forado" ::msgcat::mcset eo "balloon help" "balona helpo" ::msgcat::mcset eo "browsing" "folumado" ::msgcat::mcset eo "configuration" "decidado de opcioj" ::msgcat::mcset eo "connections" "konektoj" ::msgcat::mcset eo "cryptographics" "ĉifreco" ::msgcat::mcset eo "emoticons" "sentikonoj" ::msgcat::mcset eo "extension management" "administrado de etendaĵoj" ::msgcat::mcset eo "file transfer" "dosiero-translokado" ::msgcat::mcset eo "jabber chat" "babilado" ::msgcat::mcset eo "jabber groupchats" "konferencoj" ::msgcat::mcset eo "jabber iq" "iq" ::msgcat::mcset eo "jabber presence" "ĉeesto" ::msgcat::mcset eo "jabber registration" "enregistrigado" ::msgcat::mcset eo "jabber xml" "xml" ::msgcat::mcset eo "message/headline" "mesaÄo/headline" ::msgcat::mcset eo "plugin management" "administrado de kromprogramoj" ::msgcat::mcset eo "presence" "ĉeesto" ::msgcat::mcset eo "rosters" "kontaktulolistoj" ::msgcat::mcset eo "searching" "serĉado" ::msgcat::mcset eo "text undo" "malfarado de teksto" ::msgcat::mcset eo "user interface" "uzula interfaco" ::msgcat::mcset eo "utilities" "utilprogramo" ::msgcat::mcset eo "avatars" ::msgcat::mcset eo "kde" ::msgcat::mcset eo "wmaker" # userinfo.tcl ::msgcat::mcset eo "%s info" "Informo de %s" ::msgcat::mcset eo "Address" "Adreso" ::msgcat::mcset eo "Address 2:" "Adreso 2a:" ::msgcat::mcset eo "Address:" "Adreso:" ::msgcat::mcset eo "Cell:" "PoÅtelefono:" ::msgcat::mcset eo "City:" "Urbo:" ::msgcat::mcset eo "Country:" "Lando:" ::msgcat::mcset eo "Details" "Detaloj" ::msgcat::mcset eo "E-mail:" "RetpoÅto:" ::msgcat::mcset eo "Family Name:" "Familia Nomo:" ::msgcat::mcset eo "Fax:" "Fakso:" ::msgcat::mcset eo "Full Name:" "Plena Nomo:" ::msgcat::mcset eo "Geographical position" "Geografia loko" ::msgcat::mcset eo "Home:" "Hejma:" ::msgcat::mcset eo "Information" "Informo" ::msgcat::mcset eo "Latitude:" "Latitudo:" ::msgcat::mcset eo "Location" "Loko" ::msgcat::mcset eo "Longitude:" "Longitudo:" ::msgcat::mcset eo "Message Recorder:" "Responda MaÅino:" ::msgcat::mcset eo "Middle Name:" "Meza Nomo:" ::msgcat::mcset eo "Modem:" "Modemo:" ::msgcat::mcset eo "Name" "Nomo" ::msgcat::mcset eo "Name:" "Nomo:" ::msgcat::mcset eo "Nickname:" "KaÅnomo:" ::msgcat::mcset eo "Organization" "Asocio" ::msgcat::mcset eo "Personal" "Persona" ::msgcat::mcset eo "Phones" "Telefonoj" ::msgcat::mcset eo "Postal Code:" "PoÅta Kodo:" ::msgcat::mcset eo "Preferred:" "Preferita:" ::msgcat::mcset eo "Prefix:" "Prefikso:" ::msgcat::mcset eo "Show" "Montru" ::msgcat::mcset eo "Show user info" "Montru informon de uzulo" ::msgcat::mcset eo "State:" "SubÅtato:" ::msgcat::mcset eo "Suffix:" "Sufikso:" ::msgcat::mcset eo "Telephone numbers" "Telefonnumeroj" ::msgcat::mcset eo "Video:" "Bildofono:" ::msgcat::mcset eo "Voice:" "Voĉo" ::msgcat::mcset eo "Web Site:" "RetpaÄo:" ::msgcat::mcset eo "Work:" "Labora:" ::msgcat::mcset eo "BBS:" ::msgcat::mcset eo "ISDN:" ::msgcat::mcset eo "JID:" ::msgcat::mcset eo "Pager:" ::msgcat::mcset eo "PCS:" ::msgcat::mcset eo "UID:" # Space at the end of the next word is to distinguish it from another "Name:" ::msgcat::mcset eo "Name: " "Nomo:" ::msgcat::mcset eo "Unit:" "Sekcio:" # Space at the end of the next word is to distinguish it from # another "Personal" ::msgcat::mcset eo "Personal " "Persona" ::msgcat::mcset eo "Role:" "Rolo:" ::msgcat::mcset eo "Title:" "Titolo:" # Space at the end of the next word is to distinguish it from another "About" ::msgcat::mcset eo " by " " de " ::msgcat::mcset eo "About " "Pri" ::msgcat::mcset eo "Birthday" "Naskotago" ::msgcat::mcset eo "Birthday:" "Naskotago:" ::msgcat::mcset eo "Client" "Kliento" ::msgcat::mcset eo "Client Info" "Klienta Informo" ::msgcat::mcset eo "Client:" "Kliento:" ::msgcat::mcset eo "Computer" "Komputilo" ::msgcat::mcset eo "Description:" "Priskribo:" ::msgcat::mcset eo "Image" "Bildo" ::msgcat::mcset eo "Interval:" "Intervalo:" ::msgcat::mcset eo "Last Activity or Uptime" "Lasta agado aÅ­ aktivatempo" ::msgcat::mcset eo "Load Image" "Akiru Bildon" ::msgcat::mcset eo "None" "Nenio" ::msgcat::mcset eo "Photo" "Foto" ::msgcat::mcset eo "Presence" "Ĉeesto" ::msgcat::mcset eo "Presence id signed" "Ĉeesto estas subskribita" ::msgcat::mcset eo "Time Zone:" "Horzono:" ::msgcat::mcset eo "Time:" "Horo:" ::msgcat::mcset eo "Version:" "Versio:" ::msgcat::mcset eo "Avatar" ::msgcat::mcset eo "OS:" ::msgcat::mcset eo "URL" ::msgcat::mcset eo "URL:" ::msgcat::mcset eo "UTC:" # TODO # utils.tcl ::msgcat::mcset eo "day" ::msgcat::mcset eo "days" ::msgcat::mcset eo "hour" ::msgcat::mcset eo "hours" ::msgcat::mcset eo "minute" ::msgcat::mcset eo "minutes" ::msgcat::mcset eo "second" ::msgcat::mcset eo "seconds" # plugins/jidlink/dtcp.tcl ::msgcat::mcset eo "Opening DTCP active connection" "Malfermas DTCP aktivan\ konekton" ::msgcat::mcset eo "Opening DTCP passive connection" "Malfermas DTCP\ malaktivan konekton" # plugins/jidlink/ibb.tcl ::msgcat::mcset eo "Opening IBB connection" "Malfermas IBB konekton" # plugins/clientinfo.tcl ::msgcat::mcset eo "\n\tClient: %s" "\n\tKliento: %s" ::msgcat::mcset eo "\n\tOS: %s" "\n\tOS: %s" # unix/autoaway.tcl # "Automatically away due to idle" goes to textstatus (probably # no needs to translate) ::msgcat::mcset eo "Automatically away due to idle" # rest should be translated ::msgcat::mcset eo "Idle for %s" "Senfara dum %s" ::msgcat::mcset eo "Moving to extended away" "Translokata al pli fora" ::msgcat::mcset eo "Returning from auto-away" "Revenanta de aÅ­tomata fora" ::msgcat::mcset eo "Starting auto-away" "Ekanta aÅ­tomatan foran" # unix/dockingtray.tcl ::msgcat::mcset eo "Hide Main Window" "KaÅigu Ĉefan Fenestron" ::msgcat::mcset eo "Show Main Window" "Montru Ĉefan Fenestron" # unix/ispell.tcl ::msgcat::mcset eo "- nothing -" "- nenio -" # unix/wmdock.tcl ::msgcat::mcset eo "%s is %s" "%s estas %s" ::msgcat::mcset eo "%s msgs" "%s mesaÄas" # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/msgs/es.msg000064400000000000000000004002611477701321300141440ustar00nobodynobody# es.msg -- # # Spanish messages for the Tkabber XMPP client. # # Author: Luis Peralta # Updates: Badlop (JID: badlop AT jabberes.org) ::msgcat::mcset es "\n\tActivity: %s" "\n\tActividad: %s" ::msgcat::mcset es "\n\tAffiliation: %s" "\n\tAfiliación: %s" ::msgcat::mcset es "\n\tCan't browse: %s" "\n\tNo se puede navegar: %s" ::msgcat::mcset es "\n\tClient: %s" "\n\tCliente: %s" ::msgcat::mcset es "\n\tJID: %s" "\n\tJID: %s" ::msgcat::mcset es "\n\tLocation: %s : %s" "\n\tLocalización: %s : %s" ::msgcat::mcset es "\n\tMood: %s" "\n\tEstado de ánimo: %s" ::msgcat::mcset es "\n\tName: %s" "\n\tNombre: %s" ::msgcat::mcset es "\n\tOS: %s" "\n\tSO: %s" ::msgcat::mcset es "\n\tPresence is signed:" "\n\tLa presencia está firmada:" ::msgcat::mcset es "\n\tTune: %s - %s" "\n\tCanción: %s - %s" ::msgcat::mcset es "\n\tUser activity subscription: %s" "\n\tSubscripción a\ la actividad de usuario: %s" ::msgcat::mcset es "\n\tUser location subscription: %s" "\n\tSubscripción a\ la localización del usuario: %s" ::msgcat::mcset es "\n\tUser mood subscription: %s" "\n\tSubscripción al\ estado de ánimo de usuario: %s" ::msgcat::mcset es "\n\tUser tune subscription: %s" "\n\tSubscripción a la\ canción de usuario: %s" ::msgcat::mcset es "\nAlternative venue: %s" "\nLugar alternativo: %s" ::msgcat::mcset es "\nReason is: %s" "\nLa razón es: %s" ::msgcat::mcset es "\nReason: %s" "\nRazón: %s" ::msgcat::mcset es "\nRoom is empty at %s" "\nLa sala %s está vacía" ::msgcat::mcset es "\nRoom participants at %s:" "\nParticipantes a las %s:" ::msgcat::mcset es " by " " por " ::msgcat::mcset es " by %s" " por %s" ::msgcat::mcset es "#" "#" ::msgcat::mcset es "%s has activated chat window" "%s ha activado la ventana\ de charla" ::msgcat::mcset es "%s has been assigned a new affiliation: %s" "%s tiene una\ nueva afiliación: %s" ::msgcat::mcset es "%s has been assigned a new role: %s" "%s tiene un nuevo\ rol: %s" ::msgcat::mcset es "%s has been assigned a new room position: %s/%s" "%s\ tiene una nueva posición en la sala: %s/%s" ::msgcat::mcset es "%s has been banned" "%s ha sido bloqueado" ::msgcat::mcset es "%s has been kicked" "%s ha sido expulsado" ::msgcat::mcset es "%s has been kicked because of membership loss" "%s ha\ sido expulsado porque ya no es miembro" ::msgcat::mcset es "%s has been kicked because room became members-only" "%s\ ha sido expulsado porque la sala es ahora solo para miembros" ::msgcat::mcset es "%s has changed nick to %s." "%s ha cambiado el apodo a\ %s." ::msgcat::mcset es "%s has entered" "%s ha entrado" ::msgcat::mcset es "%s has gone chat window" "%s se ha ido de la ventana de\ charla" ::msgcat::mcset es "%s has inactivated chat window" "%s ha desactivado la\ ventana de charla" ::msgcat::mcset es "%s has left" "%s se ha ido" ::msgcat::mcset es "%s Headlines" "Titulares de %s" ::msgcat::mcset es "%s info" "Información de %s" ::msgcat::mcset es "%s invites you to conference room %s" "%s te invita a la\ sala de charla %s" ::msgcat::mcset es "%s is %s" "%s está %s" ::msgcat::mcset es "%s is composing a reply" "%s está escribiendo una\ respuesta" ::msgcat::mcset es "%s is now known as %s" "%s es ahora %s" ::msgcat::mcset es "%s is paused a reply" "%s ha pausado una respuesta" ::msgcat::mcset es "%s msgs" "%s mensajes" ::msgcat::mcset es "%s plugin" "plugin %s" ::msgcat::mcset es "%s purportedly signed by %s can't be verified: %s." "%s\ supuestamente firmado por %s no se ha podido verificar: %s." ::msgcat::mcset es "%s request from %s" "Petición %s de %s" ::msgcat::mcset es "%s SSL Certificate Info" "Información de Certificado SSL\ de %s" ::msgcat::mcset es "%s's activity changed to %s" "La actividad de %s ha\ cambiado a %s" ::msgcat::mcset es "%s's activity is unset" "La actividad de %s se ha\ desactivado" ::msgcat::mcset es "%s's location changed to %s : %s" "La localización de %s\ ha cambiado a %s : %s" ::msgcat::mcset es "%s's location is unset" "La localización de %s se ha\ desactivado" ::msgcat::mcset es "%s's mood changed to %s" "El estado de ánimo del usuario\ %s ha cambiado a %s" ::msgcat::mcset es "%s's mood is unset" "Se ha desactivado el estado de ánimo\ de %s" ::msgcat::mcset es "%s's tune changed to %s - %s" "La canción de %s ha\ cambiado a %s - %s" ::msgcat::mcset es "%s's tune has stopped playing" "La canción de %s se ha\ detenido" ::msgcat::mcset es "%s's tune is unset" "La canción de %s ha sido\ desactivada" ::msgcat::mcset es "%s: %s/%s, Description: %s, Version: %s\nNumber of\ children: %s" "%s: %s/%s, Descripción: %s, Versión: %s\nNúmero de\ hijos: %s" ::msgcat::mcset es "&Help" "&Ayuda" ::msgcat::mcset es "&Services" "&Servicios" ::msgcat::mcset es "- nothing -" "- nada -" ::msgcat::mcset es ". Proceed?\n\n" ". ¿Proceder?\n\n" ::msgcat::mcset es "/me has set the subject to: %s" "/me ha puesto el asunto\ a: %s" ::msgcat::mcset es "<- Remove" "<- Eliminar" ::msgcat::mcset es "" "" ::msgcat::mcset es ">>> Unable to decipher data: %s <<<" ">>> No ha sido\ posible descifrar los datos: %s <<<" ::msgcat::mcset es "A new room is created" "Se ha creado una sala nueva" ::msgcat::mcset es "Abbreviations:" "Abreviaturas:" ::msgcat::mcset es "Aborted" "Abortado" ::msgcat::mcset es "About" "Acerca de" ::msgcat::mcset es "About " "Acerca de " ::msgcat::mcset es "Accept connections from my own JID." "Aceptar conexiones\ de mi propio JID." ::msgcat::mcset es "Accept connections from the listed JIDs." "Aceptar\ conexiones de los JIDs listados." ::msgcat::mcset es "Accept default config" "Aceptar la configuración por\ defecto" ::msgcat::mcset es "Accept messages from roster users only" "Aceptar mensajes\ solo de contactos de la lista" ::msgcat::mcset es "Access Error" "Error de acceso" ::msgcat::mcset es "Account" "Cuenta" ::msgcat::mcset es "Action" "Acción" ::msgcat::mcset es "Activate lists at startup" "Activar listas en el inicio" ::msgcat::mcset es "Activate search panel" "Activar panel de búsqueda" ::msgcat::mcset es "Activate visible/invisible/ignore/conference lists before\ sending initial presence." "Activar listas de\ visible/invisible/ignorar/conferencia antes de enviar la presencia\ inicial." ::msgcat::mcset es "Activating privacy list failed: %s\n\nTry to reconnect.\ If problem persists, you may want to disable privacy list activation\ at start" "Falló la activación de lista de privacidad: %s\n\nIntenta\ reconectar. Si el problema persiste, quizá tengas que deshabilitar la\ activación de listas de privacidad al inicio" ::msgcat::mcset es "Active" "Activa" ::msgcat::mcset es "Active Chats" "Salas activas" ::msgcat::mcset es "Activity" "Actividad" ::msgcat::mcset es "Activity:" "Actividad:" ::msgcat::mcset es "Add" " Añadir " ::msgcat::mcset es "Add ->" "Añadir ->" ::msgcat::mcset es "Add chats group in roster." "Añadir temporalmente grupos\ de charla activos a la lista de contactos" ::msgcat::mcset es "Add Conference to Roster" "Añadir sala a la lista de\ contactos" ::msgcat::mcset es "Add conference to roster..." "Añadir conferencia..." ::msgcat::mcset es "Add group by regexp on JIDs..." "Crear grupo por regexp\ sobre JID..." ::msgcat::mcset es "Add item" "Añadir elemento" ::msgcat::mcset es "Add JID" "Añadir JID" ::msgcat::mcset es "Add list" "Añadir lista" ::msgcat::mcset es "Add new item" "Añadir nuevo elemento" ::msgcat::mcset es "Add new user..." "Añadir nuevo usuario..." ::msgcat::mcset es "Add proxy" "Añadir proxy" ::msgcat::mcset es "Add roster group by JID regexp" "Añadir grupo a la lista\ por regexp sobre JID" ::msgcat::mcset es "Add user to roster..." "Añadir contacto..." ::msgcat::mcset es "Added abbreviation:\n%s: %s" "Añadir abreviatura:\n%s:\ %s" ::msgcat::mcset es "Address" "Dirección" ::msgcat::mcset es "Address 2" "Dirección 2" ::msgcat::mcset es "Address 2:" "Dirección 2:" ::msgcat::mcset es "Address Error" "Error de dirección" ::msgcat::mcset es "Address type not supported" "Este tipo de dirección no\ está soportado" ::msgcat::mcset es "Address type not supported by SOCKS proxy" "Tipo de\ dirección no soportada por el proxy SOCKS" ::msgcat::mcset es "Address:" "Dirección:" ::msgcat::mcset es "admin" "admin" ::msgcat::mcset es "Admin tools" "Administración" ::msgcat::mcset es "Affiliation" "Afiliación" ::msgcat::mcset es "afraid" "asustado" ::msgcat::mcset es "Alexey Shchepin" "Alexey Shchepin" ::msgcat::mcset es "All" "Todos" ::msgcat::mcset es "All Files" "Todos los ficheros" ::msgcat::mcset es "All files" "Todos los ficheros" ::msgcat::mcset es "All items:" "Todos los elementos:" ::msgcat::mcset es "All unread messages were forwarded to %s." "Todos los\ mensajes no leídos fueron reenviados a %s." ::msgcat::mcset es "Allow downloading" "Permitir descargar" ::msgcat::mcset es "Allow plaintext authentication mechanisms" "Permitir\ mecanismos de autenticación de texto plano" ::msgcat::mcset es "Allow plaintext authentication mechanisms (when password\ is transmitted unencrypted)." "Permitir mecanismos de autenticación\ de texto plano (donde la contraseña se envía sin cifrar)." ::msgcat::mcset es "Allow X-GOOGLE-TOKEN authentication mechanisms. It\ requires connection to Google via HTTPS." "Permitir los mecanismos de\ autenticación X-GOOGLE-TOKEN. Se conecta a Google usando HTTPS." ::msgcat::mcset es "Allow X-GOOGLE-TOKEN SASL mechanism" "Permitir el\ mecanismo SASL: X-GOOGLE-TOKEN" ::msgcat::mcset es "Altitude:" "Altitud:" ::msgcat::mcset es "Always use main JID label for metacontact." "Usar siempre\ la etiqueta principal del JID para el metacontacto." ::msgcat::mcset es "amazed" "sorprendido" ::msgcat::mcset es "An error occurred when searching in %s\n\n%s" "Un error\ ocurrió buscando en %s\n\n%s" ::msgcat::mcset es "An existing variable \"%s\" cannot be used as an XMPP\ token" "No se puede usar una variable existente \"%s\" como un token\ XMPP" ::msgcat::mcset es "and" "y" ::msgcat::mcset es "angry" "enfadado" ::msgcat::mcset es "Announce" "Anunciar" ::msgcat::mcset es "annoyed" "molesto" ::msgcat::mcset es "anxious" "ansioso" ::msgcat::mcset es "Application Error" "Error de aplicación" ::msgcat::mcset es "Approve subscription" "Aprobar subscripción" ::msgcat::mcset es "April" "Abril" ::msgcat::mcset es "Are you sure to delete %s's metacontact?" "¿Estás seguro\ de que quieres borrar el metacontacto de %s?" ::msgcat::mcset es "Are you sure to delete metacontact?" "¿Estás seguro de\ que quieres borrar el metacontacto?" ::msgcat::mcset es "Are you sure to remove %s from roster?" "¿Estás seguro de\ que quieres eliminar %s de tu lista de contactos?" ::msgcat::mcset es "Are you sure to remove all users in group '%s' from\ roster? \n(Users which are not in this groups only, will be removed\ from the roster as well.)" "¿Estás seguro de que quieres eliminar\ todos los usuarios del grupo '%s'? \n(Los usuarios que están también\ en otros grupos no se eliminarán de tu lista de contactos)" ::msgcat::mcset es "Are you sure to remove group '%s' from roster? \n(Users\ which are in this group only, will be in undefined group.)" "¿Estás\ seguro de que quieres eliminar el grupo '%s' de la lista de\ contactos? \n(Los usuarios que están solo en este grupo se moverán al\ grupo 'Indefinido')" ::msgcat::mcset es "Area:" "Ãrea:" ::msgcat::mcset es "aroused" "despertado" ::msgcat::mcset es "Artist:" "Artista:" ::msgcat::mcset es "as %s/%s" "como %s/%s" ::msgcat::mcset es "ashamed" "avergonzado" ::msgcat::mcset es "Ask:" "Preguntar:" ::msgcat::mcset es "at the spa" "en el balneario" ::msgcat::mcset es "Attached URL:" "URL adjunta:" ::msgcat::mcset es "Attached user:" "Usuario adjunto:" ::msgcat::mcset es "Attention" "Atención" ::msgcat::mcset es "August" "Agosto" ::msgcat::mcset es "Authentication" "Autenticación" ::msgcat::mcset es "Authentication Error" "Error en la autenticación" ::msgcat::mcset es "Authentication failed" "Autenticación fallida" ::msgcat::mcset es "Authentication failed: %s" "Ha fallado la autenticación:\ %s" ::msgcat::mcset es "Authentication failed: %s\nCreate new account?"\ "Autenticación fallida: %s\n¿Crear cuenta nueva?" ::msgcat::mcset es "Authentication succeeded" "Autenticación exitosa" ::msgcat::mcset es "Authors:" "Autores:" ::msgcat::mcset es "auto-away" "auto-ausencia" ::msgcat::mcset es "Auto-subscribe to other's user activity" "Auto\ subscribirse a la actividad de otros usuarios" ::msgcat::mcset es "Auto-subscribe to other's user activity notifications."\ "Auto subscribirse a las notificaciones de actividad de otros\ usuarios" ::msgcat::mcset es "Auto-subscribe to other's user location" "Auto\ subscribirse a la localización de otros usuarios" ::msgcat::mcset es "Auto-subscribe to other's user location notifications."\ "Auto subscribirse a las notificaciones de localización de otros\ usuarios" ::msgcat::mcset es "Auto-subscribe to other's user mood" "Auto subscribirse\ al estado de ánimo de otros usuarios" ::msgcat::mcset es "Auto-subscribe to other's user mood notifications." "Auto\ subscribirse a las notificaciones de estado de ánimo de otros\ usuarios" ::msgcat::mcset es "Auto-subscribe to other's user tune" "Auto subscribirse a\ las canciones de otros usuarios" ::msgcat::mcset es "Auto-subscribe to other's user tune notifications." "Auto\ subscribirse a las notificaciones de canción de otros usuarios." ::msgcat::mcset es "Automatically away due to idle" "Automáticamente ausente\ debido a inactividad" ::msgcat::mcset es "Automatically join conference upon connect" "Entrar en la\ sala automáticamente al conectar" ::msgcat::mcset es "Available" "Disponible" ::msgcat::mcset es "Available groups" "Grupos disponibles" ::msgcat::mcset es "Available presence" "Presencia: disponible" ::msgcat::mcset es "Avatar" "Avatar" ::msgcat::mcset es "avatars" "avatares" ::msgcat::mcset es "Away" "Ausente" ::msgcat::mcset es "Bad Format" "Mal Formato" ::msgcat::mcset es "Bad Namespace Prefix" "Mal Prefijo de Espacio de Nombres" ::msgcat::mcset es "Bad Request" "Mala petición" ::msgcat::mcset es "balloon help" "ayuda contextual" ::msgcat::mcset es "Ban" "Bloquear" ::msgcat::mcset es "Bearing:" "Bearing:" ::msgcat::mcset es "Begin date" "Fecha de inicio" ::msgcat::mcset es "Birthday" "Fecha de nacimiento" ::msgcat::mcset es "Birthday:" "Fecha de nacimiento:" ::msgcat::mcset es "Blind carbon copy" "Copia carbón ciega (BCC)" ::msgcat::mcset es "Blocking communication (XMPP privacy lists) options."\ "Opciones para bloquear comunicaciones (listas de privacidad)." ::msgcat::mcset es "Blocking communication options." "Opciones de bloqueo de\ comunicación." ::msgcat::mcset es "bored" "aburrido" ::msgcat::mcset es "Bottom" "Abajo" ::msgcat::mcset es "brave" "valiente" ::msgcat::mcset es "Browse" "Explorar" ::msgcat::mcset es "Browse..." "Explorar..." ::msgcat::mcset es "browsing" "explorando" ::msgcat::mcset es "brushing teeth" "lavándose los dientes" ::msgcat::mcset es "Building:" "Edificio:" ::msgcat::mcset es "buying groceries" "comprando comida" ::msgcat::mcset es "bwidget workarounds" "arreglos de bwidget" ::msgcat::mcset es "Cache headlines on exit and restore on start." "Guardar\ titulares al terminar y recuperar al iniciar." ::msgcat::mcset es "Cached service categories and types (from disco#info)."\ "Categorías de servicio y tipos cacheados (de disco#info)." ::msgcat::mcset es "calm" "calmado" ::msgcat::mcset es "Can't open file \"%s\": %s" "No se puede abrir el fichero\ \"%s\": %s" ::msgcat::mcset es "Can't receive file: %s" "No se puede recibir fichero: %s" ::msgcat::mcset es "Can't switch transport to \"%s\": %s" "No se ha podido\ cambiar el transporte a \"%s\": %s" ::msgcat::mcset es "Cancel" " Cancelar " ::msgcat::mcset es "Cancelling configure form" "Cancelando el formulario de\ configuración" ::msgcat::mcset es "Cannot connect to %s:%s" "No se puede conectar a %s:%s" ::msgcat::mcset es "Cannot connect to proxy" "No se puede conectar al proxy" ::msgcat::mcset es "Cannot connect to proxy %s:%s" "No se puede conectar al\ proxy %s:%s" ::msgcat::mcset es "Cannot forbid digest mechanisms" "No se puede impedir\ mecanismos de resumen de contraseña" ::msgcat::mcset es "Cannot negotiate proxy connection" "No se puede negociar\ la conexión al proxy" ::msgcat::mcset es "Cannot publish empty activity" "No se puede publicar una\ actividad vacía" ::msgcat::mcset es "Cannot publish empty mood" "No se puede publicar un\ estado de ánimo vacío" ::msgcat::mcset es "Carbon copy" "Copia carbón" ::msgcat::mcset es "Cell:" "Móvil:" ::msgcat::mcset es "Certificate has expired" "El certificado ha expirado" ::msgcat::mcset es "Change icon on server and enter/exit groupchat messages."\ "Cambiar el icono de los mensajes de servidor y de entrada/salida de\ sala de charla." ::msgcat::mcset es "Change password" "Cambiar contraseña" ::msgcat::mcset es "Change password for %s" "Cambiar contraseña de %s" ::msgcat::mcset es "Change password..." "Cambiar contraseña..." ::msgcat::mcset es "Change Presence Priority" "Cambiar Prioridad" ::msgcat::mcset es "Change priority..." "Cambiar prioridad..." ::msgcat::mcset es "Change security preferences for %s" "Cambiar las\ preferencias de seguridad para %s" ::msgcat::mcset es "Changing accept messages from roster only: %s" "Cambiando\ mensajes de aceptar solo para la lista de contacto: %s" ::msgcat::mcset es "Chat" "Charlar" ::msgcat::mcset es "Chat message" "Mensaje de charla" ::msgcat::mcset es "Chat message events plugin options." "Opciones del plugin\ de eventos de mensajes de charla." ::msgcat::mcset es "Chat message window state plugin options." "Opciones del\ plugin de estado de las ventanas de mensaje de charla." ::msgcat::mcset es "Chat options." "Opciones de charla." ::msgcat::mcset es "Chat window is active" "La ventana de charla está activa" ::msgcat::mcset es "Chat window is gone" "La ventana de charla se ha ido" ::msgcat::mcset es "Chat window is inactive" "Ventana de charla inactiva" ::msgcat::mcset es "Chat with %s" "Charlar con %s" ::msgcat::mcset es "Chats" "Charlas" ::msgcat::mcset es "Chats History" "Historial de Charlas" ::msgcat::mcset es "Chats history" "Historial de charlas" ::msgcat::mcset es "Chats history is converted.\nBackup of the old history is\ stored in %s" "Los historiales de charla se han convertido.\nUna\ copia de seguridad de los viejos historiales se ha guardado en %s" ::msgcat::mcset es "Chats:" "Charlas:" ::msgcat::mcset es "Check spell after every entered symbol." "Corregir\ ortografía después de cada símbolo." ::msgcat::mcset es "Cipher" "Cifra" ::msgcat::mcset es "City" "Ciudad" ::msgcat::mcset es "City:" "Población:" ::msgcat::mcset es "cleaning" "limpiando" ::msgcat::mcset es "Clear" "Limpiar" ::msgcat::mcset es "Clear bookmarks" "Borrar marcadores" ::msgcat::mcset es "Clear chat window" "Limpiar ventana de charla" ::msgcat::mcset es "Clear history" "Limpiar historial" ::msgcat::mcset es "Clear window" "Limpiar ventana" ::msgcat::mcset es "Client" "Cliente" ::msgcat::mcset es "Client message" "Mensaje del cliente" ::msgcat::mcset es "Client's identd could not confirm the userid" "El identd\ del cliente no pudo confirmar el userid" ::msgcat::mcset es "Client:" "Cliente:" ::msgcat::mcset es "Close" "Cerrar" ::msgcat::mcset es "Close all tabs" "Cerrar todas las pestañas" ::msgcat::mcset es "Close other tabs" "Cerrar las otras pestañas" ::msgcat::mcset es "Close tab" "Cerrar pestaña" ::msgcat::mcset es "Close Tkabber" "Cerrar Tkabber" ::msgcat::mcset es "coding" "programando" ::msgcat::mcset es "cold" "frío" ::msgcat::mcset es "Color message bodies in chat windows." "Color de los\ mensajes en las ventanas de charla" ::msgcat::mcset es "Command not supported" "Comando no soportado" ::msgcat::mcset es "Command to be run when you click a URL in a message. '%s'\ will be replaced with this URL (e.g. \"chromium %s >>& /dev/null\" or\ \"{C:/Program Files (x86)/Mozilla Firefox/firefox.exe} %s\")."\ "Comando a ejecutar cuando se pulsa una URL en un mensaje. Se\ reemplazará '%s' con la URL (e.g. \"chromium %s >>& /dev/null\" o\ \"{C:/Program Files (x86)/Mozilla Firefox/firefox.exe} %s\")." ::msgcat::mcset es "Commands" "Comandos" ::msgcat::mcset es "Common:" "Común:" ::msgcat::mcset es "commuting" "viaje diario" ::msgcat::mcset es "Complete nickname or command" "Completar apodo o comando" ::msgcat::mcset es "Component handshake aborted" "Negociación con componente\ abortada" ::msgcat::mcset es "Component handshake failed" "Negociación con componente\ ha fallado" ::msgcat::mcset es "Component handshake succeeded" "Negociación con\ componente exitosa" ::msgcat::mcset es "Component handshake timed out" "Negociación con\ componente ha caducado" ::msgcat::mcset es "Composing a reply" "Escribiendo una respuesta" ::msgcat::mcset es "Compression" "Compresión" ::msgcat::mcset es "Compression aborted" "Compresión abortada" ::msgcat::mcset es "Compression negotiation failed" "Falló la negociación de\ la compresión" ::msgcat::mcset es "Compression negotiation successful" "Negociación de la\ compresión exitosa" ::msgcat::mcset es "Compression setup failed" "Falló la configuración de\ compresión" ::msgcat::mcset es "Compression timed out" "Compresión ha caducado" ::msgcat::mcset es "Conference room %s will be destroyed\ permanently.\n\nProceed?" "La sala de charla %s será destruida\ permanentemente.\n\n¿Proceder?" ::msgcat::mcset es "Conference:" "Sala de charla" ::msgcat::mcset es "Conferences" "Conferencias" ::msgcat::mcset es "configuration" "configuración" ::msgcat::mcset es "Configure form: %s" "Formulario de configuración: %s" ::msgcat::mcset es "Configure node" "Configurar nodo" ::msgcat::mcset es "Configure room" "Configurar sala" ::msgcat::mcset es "Conflict" "Conflicto" ::msgcat::mcset es "confused" "confundido" ::msgcat::mcset es "Connect via HTTP polling" "Conectar via HTTP Polling" ::msgcat::mcset es "Connecting to %s" "Conectando a %s" ::msgcat::mcset es "Connection" "Conexión" ::msgcat::mcset es "Connection aborted" "Conexión abortada" ::msgcat::mcset es "Connection not allowed by ruleset" "Conexión no permitida\ por las reglas" ::msgcat::mcset es "Connection refused by destination host" "Conexión\ rechazada por la máquina destinataria" ::msgcat::mcset es "Connection timed out" "Conexión caducada" ::msgcat::mcset es "Connection Timeout" "Timeout en la Conexión" ::msgcat::mcset es "Connection via proxy aborted" "Conexión por proxy\ abortada" ::msgcat::mcset es "Connection via proxy timed out" "Conexión por proxy\ caducada" ::msgcat::mcset es "Connection:" "Conexión:" ::msgcat::mcset es "connections" "conexiones" ::msgcat::mcset es "Contact Information" "Información de contacto" ::msgcat::mcset es "contented" "contento" ::msgcat::mcset es "Conversion is finished" "Conversión finalizada" ::msgcat::mcset es "Convert" "Convertir" ::msgcat::mcset es "Convert screenname" "Convertir dirección de contacto" ::msgcat::mcset es "Converting Log Files" "Convirtiendo ficheros de\ historiales de conversación" ::msgcat::mcset es "cooking" "cocinando" ::msgcat::mcset es "Copy headline to clipboard" "Copiar titular al\ portapapeles" ::msgcat::mcset es "Copy JID to clipboard" "Copiar JID al portapapeles" ::msgcat::mcset es "Copy real JID to clipboard" "Copiar JID real al\ portapapeles" ::msgcat::mcset es "Copy selection to clipboard" "Copiar selección al\ portapapeles" ::msgcat::mcset es "Copy URL to clipboard" "Copiar URL al portapapeles" ::msgcat::mcset es "Correct word" "Corregir palabra" ::msgcat::mcset es "Could not start ispell server. Check your ispell path and\ dictionary name. Ispell is disabled now" "No se pudo iniciar el\ servidor Ispell. Comprueba la ruta a Ispell y el nombre del\ diccionario. Ispell está desactivado ahora." ::msgcat::mcset es "Country" "País" ::msgcat::mcset es "Country:" "País:" ::msgcat::mcset es "cranky" "quisquilloso" ::msgcat::mcset es "Create metacontact" "Crear metacontacto" ::msgcat::mcset es "Create node" "Crear nodo" ::msgcat::mcset es "Created: %s" "Creado: %s" ::msgcat::mcset es "Creating default privacy list" "Creando lista de\ privacidad inicial" ::msgcat::mcset es "Creating default privacy list failed: %s\n\nTry to\ reconnect. If problem persists, you may want to disable privacy list\ activation at start" "Ocurrió un fallo al crear una lista de\ privacidad: %s\n\nIntenta reconectar. Si el problema persiste, quizá\ quieras desactivar la activación automática de listas al conectar" ::msgcat::mcset es "cryptographics" "criptografía" ::msgcat::mcset es "curious" "curioso" ::msgcat::mcset es "Current groups" "Grupos actuales" ::msgcat::mcset es "customization" "personalización" ::msgcat::mcset es "Customization of the One True Jabber Client."\ "Personalización del Cliente de Jabber Verdadero." ::msgcat::mcset es "Customize" "Personalizar" ::msgcat::mcset es "cycling" "en bicicleta" ::msgcat::mcset es "Data purportedly sent by %s can't be deciphered.\n\n%s."\ "Datos supuestamente enviados por %s no pueden ser\ descifrados.\n\n%s." ::msgcat::mcset es "Date" "Fecha" ::msgcat::mcset es "Date:" "Fecha:" ::msgcat::mcset es "day" "día" ::msgcat::mcset es "day off" "día libre" ::msgcat::mcset es "Day:" "Día:" ::msgcat::mcset es "days" "días" ::msgcat::mcset es "December" "Diciembre" ::msgcat::mcset es "Decline subscription" "Declinar subscripción" ::msgcat::mcset es "Default" "Por defecto" ::msgcat::mcset es "Default directory for downloaded files." "Directorio por\ defecto para la descarga de ficheros." ::msgcat::mcset es "Default nested roster group delimiter." "Delimitador de\ grupos anidados en la lista de contactos." ::msgcat::mcset es "Default protocol for sending files." "Protocolo de envío\ de ficheros por defecto." ::msgcat::mcset es "Delay between getting focus and updating window or tab\ title in milliseconds." "Retraso en milisegundos entre la recepción\ del foco y la actualización de la ventana o pestaña." ::msgcat::mcset es "Delete" "Eliminar" ::msgcat::mcset es "Delete all" "Borrar todos" ::msgcat::mcset es "Delete current node and subnodes" "Borrar nodos y\ subnodos actuales" ::msgcat::mcset es "Delete message of the day" "Eliminar mensaje del día" ::msgcat::mcset es "Delete metacontact..." "Borrar metacontacto..." ::msgcat::mcset es "Delete seen" "Borrar los leídos" ::msgcat::mcset es "Delete subnodes" "Borrar subnodos" ::msgcat::mcset es "Deleted abbreviation: %s" "Borrar abreviatura: %s" ::msgcat::mcset es "depressed" "deprimido" ::msgcat::mcset es "Description:" "Descripción:" ::msgcat::mcset es "Destroy room" "Destruir sala" ::msgcat::mcset es "Details" "Detalles" ::msgcat::mcset es "Dir" "Dir" ::msgcat::mcset es "Directory to store logs." "Directorio donde guardar\ históricos." ::msgcat::mcset es "Disabled\n" "Desactivado\n" ::msgcat::mcset es "disappointed" "decepcionado" ::msgcat::mcset es "Disconnected" "Desconectado" ::msgcat::mcset es "Discovery" "Descubridor" ::msgcat::mcset es "disgusted" "disgustado" ::msgcat::mcset es "Display %s in chat window when using /vcard command."\ "Mostrar %s en la ventana de charla al usar el comando /vcard." ::msgcat::mcset es "Display description of user status in chat windows."\ "Mostrar descripción del estado del usuario en la ventana de charla." ::msgcat::mcset es "Display headlines in single/multiple windows." "Mostrar\ titulares en un o muchas ventanas." ::msgcat::mcset es "Display SSL warnings." "Mostrar advertencias respecto a\ SSL." ::msgcat::mcset es "Display status tooltip when main window is minimized to\ systray." "Mostrar mensajes de estado cuando la ventana está\ minimizada en la bandeja de sistema." ::msgcat::mcset es "Display warning dialogs when signature verification\ fails." "Mostrar diálogos de aviso cuando falla la verificación de la\ firma." ::msgcat::mcset es "distracted" "distraído" ::msgcat::mcset es "Do not display headline descriptions as tree nodes." "No\ mostrar descripciones de los titulares como nodos del árbol." ::msgcat::mcset es "Do not disturb" "No molestar" ::msgcat::mcset es "Do nothing" "No hacer nada" ::msgcat::mcset es "doesn't want to be disturbed" "no quiere ser molestado" ::msgcat::mcset es "doing chores" "haciendo faenas" ::msgcat::mcset es "doing maintenance" "haciendo mantenimiento" ::msgcat::mcset es "doing the dishes" "lavando los platos" ::msgcat::mcset es "doing the laundry" "haciendo la colada" ::msgcat::mcset es "Down" "Abajo" ::msgcat::mcset es "drinking" "bebiendo" ::msgcat::mcset es "driving" "conduciendo" ::msgcat::mcset es "E-mail" "Correo-e" ::msgcat::mcset es "E-mail:" "Correo-e:" ::msgcat::mcset es "eating" "comiendo" ::msgcat::mcset es "Edit" "Editar" ::msgcat::mcset es "Edit %s color" "Editar color %s" ::msgcat::mcset es "Edit %s's Metacontact" "Editar el metacontact de %s" ::msgcat::mcset es "Edit admin list" "Editar la lista de Administradores" ::msgcat::mcset es "Edit ban list" "Editar la lista de Bloqueados" ::msgcat::mcset es "Edit chat user colors" "Editar colores de los usuarios" ::msgcat::mcset es "Edit conference list" "Editar lista de conferencias" ::msgcat::mcset es "Edit conference list " "Editar lista de conferencia " ::msgcat::mcset es "Edit entities affiliations: %s" "Editar las afiliaciones\ de las entidades: %s" ::msgcat::mcset es "Edit groups for %s" "Editar grupos de %s" ::msgcat::mcset es "Edit ignore list" "Editar la lista de ignorados" ::msgcat::mcset es "Edit ignore list " "Editar la lista de ignorados " ::msgcat::mcset es "Edit invisible list" "Editar la lista de invisibles" ::msgcat::mcset es "Edit invisible list " "Editar lista de invisibles " ::msgcat::mcset es "Edit item notes..." "Editar notas..." ::msgcat::mcset es "Edit item..." "Editar elemento..." ::msgcat::mcset es "Edit list" "Editar lista" ::msgcat::mcset es "Edit member list" "Editar la lista de Miembros" ::msgcat::mcset es "Edit Metacontact" "Editar metacontacto" ::msgcat::mcset es "Edit metacontact" "Editar metacontacto" ::msgcat::mcset es "Edit moderator list" "Editar la lista de Moderadores" ::msgcat::mcset es "Edit MUC ignore rules" "Editar reglas MUC de ignorados" ::msgcat::mcset es "Edit my info..." "Editar mi información..." ::msgcat::mcset es "Edit nick color..." "Editar color del apodo..." ::msgcat::mcset es "Edit nick colors..." "Editar colores de los apodos..." ::msgcat::mcset es "Edit nickname for %s" "Editar apodo de %s" ::msgcat::mcset es "Edit outcast list" "Editar lista de bloqueados" ::msgcat::mcset es "Edit owner list" "Editar la lista de Dueños" ::msgcat::mcset es "Edit participant list" "Editar lista de participantes" ::msgcat::mcset es "Edit privacy list" "Editar lista de privacidad" ::msgcat::mcset es "Edit properties for %s" "Editar propiedades de %s" ::msgcat::mcset es "Edit roster notes for %s" "Editar notas de %s" ::msgcat::mcset es "Edit security..." "Editar seguridad..." ::msgcat::mcset es "Edit visible list" "Editando la lista de visibles" ::msgcat::mcset es "Edit visitor list" "Editar lista de visitantes" ::msgcat::mcset es "Edit voice list" "Editar la lista de Voces" ::msgcat::mcset es "embarrassed" "embarazoso" ::msgcat::mcset es "emoticons" "emoticonos" ::msgcat::mcset es "Emphasize" "Enfatizar" ::msgcat::mcset es "Emphasize stylecoded messages using different fonts."\ "Enfatizar mensajes con códigos de estilo usando diferentes fuentes." ::msgcat::mcset es "Enable announcing entity capabilities in every outgoing\ presence." "Anunciar en todos los mensajes de presencia enviados las\ capacidades de la entidad." ::msgcat::mcset es "Enable chat window autoscroll only when last message is\ shown." "Activar desplazamiento automático sólo cuando se ha mostrado\ el último mensaje." ::msgcat::mcset es "Enable freedesktop system tray icon." "Activar icono en\ bandeja de sistema Freedesktop" ::msgcat::mcset es "Enable freedesktop systray icon." "Activar el icono\ Freedesktop en la bandeja de sistema." ::msgcat::mcset es "Enable grouping contacts into a single metacontact in\ roster." "Permitir agrupar contactos en un metacontacto, en la lista\ de contactos." ::msgcat::mcset es "Enable highlighting plugin." "Activar plugin de\ resaltado." ::msgcat::mcset es "Enable KDE tray icon." "Usar icono en la bandeja de\ sistema de KDE." ::msgcat::mcset es "Enable metacontacts" "Activar metacontactos" ::msgcat::mcset es "Enable nested roster groups." "Activar grupos anidados en\ la lista de contactos." ::msgcat::mcset es "Enable remote control." "Activar control remoto." ::msgcat::mcset es "Enable rendering of XHTML messages." "Mostrar los\ mensajes XHTML cuando sea posible." ::msgcat::mcset es "Enable sending chat message events." "Permitir el envío\ de eventos de mensaje de charla." ::msgcat::mcset es "Enable sending chat state notifications." "Permitir el\ envío de notificaciones de estado de la charla." ::msgcat::mcset es "Enable SI transport %s." "Activar transporte SI %s." ::msgcat::mcset es "Enable spellchecker in text input windows." "Activar\ corrector ortográfico en las ventanas de introducción de texto." ::msgcat::mcset es "Enable windows tray icon." "Activar icono en la bandeja\ de sistema." ::msgcat::mcset es "Enabled\n" "Activado\n" ::msgcat::mcset es "Encrypt traffic" "Cifrar tráfico" ::msgcat::mcset es "Encrypt traffic (when possible)" "Cifrar tráfico (cuando\ sea posible)" ::msgcat::mcset es "Encryption" "Cifrado" ::msgcat::mcset es "Encryption (legacy SSL)" "Cifrado (SSL antiguo)" ::msgcat::mcset es "Encryption (STARTTLS)" "Cifrado (STARTTLS)" ::msgcat::mcset es "Enter screenname of contact you want to add" "Introduce\ no dirección del usuario que quieres añadir" ::msgcat::mcset es "Enter the new password for %s" "Introduce nueva\ contraseña de %s" ::msgcat::mcset es "Error" "Error" ::msgcat::mcset es "Error completing command: %s" "Error completando el\ comando: %s" ::msgcat::mcset es "Error displaying %s in browser\n\n%s" "Error mostrando %s\ en el navegador\n\n%s" ::msgcat::mcset es "Error executing command: %s" "Error ejecutando el\ comando: %s" ::msgcat::mcset es "Error getting info: %s" "Error consiguiendo información:\ %s" ::msgcat::mcset es "Error getting items: %s" "Error obteniendo elementos: %s" ::msgcat::mcset es "Error importing roster contacts: %s" "Error importando la\ lista de contactos: %s" ::msgcat::mcset es "Error in signature processing" "Error en el procesado de\ la firma" ::msgcat::mcset es "Error in signature verification software: %s." "Error en\ el software de verificación de firma: %s." ::msgcat::mcset es "Error loading MUC ignore rules, purged." "Ocurrió un\ error al cargar las reglas MUC de ignorados, purgado." ::msgcat::mcset es "Error requesting data: %s" "Error pidiendo datos: %s" ::msgcat::mcset es "Error restoring annotations: %s" "Error restaurando las\ anotaciones: %s" ::msgcat::mcset es "Error restoring conference bookmarks: %s" "Error\ restaurando marcadores de conferencias: %s" ::msgcat::mcset es "Error restoring metacontacts: %s" "Error restaurando\ metacontactos: %s" ::msgcat::mcset es "Error while converting screenname: %s." "Error al\ convertir la dirección de contacto: %s." ::msgcat::mcset es "Error:" "Error:" ::msgcat::mcset es "excited" "excitado" ::msgcat::mcset es "Exclude:" "Excluir:" ::msgcat::mcset es "Execute command" "Ejecutar comando" ::msgcat::mcset es "exercising" "haciendo ejercicio" ::msgcat::mcset es "Expiry date" "Fecha de expiración" ::msgcat::mcset es "Explicitly specify host and port to connect" "Especificar\ explícitamente máquina y puerto a donde conectar" ::msgcat::mcset es "Export roster" "Exportar lista de contactos" ::msgcat::mcset es "Export Roster for %s..." "Exportar lista de contactos de\ %s..." ::msgcat::mcset es "Export to XHTML" "Exportar a XHTML" ::msgcat::mcset es "Extended addressing fields:" "Campos de direccionamiento\ extendido:" ::msgcat::mcset es "Extended away" "Muy ausente" ::msgcat::mcset es "extension management" "gestión de extensiones" ::msgcat::mcset es "External program, which is to be executed to play sound.\ If empty, Snack library is used (if available) to play sound."\ "Programa externo que se ejecutará para reproducir el sonido. Si se\ deja vacío, se usará la libreria Snack si está disponible." ::msgcat::mcset es "Extras from %s" "Extras de %s" ::msgcat::mcset es "Extras from:" "Extras de:" ::msgcat::mcset es "Failed to connect to HTTPS proxy" "Fallo al conectar al\ proxy HTTPS" ::msgcat::mcset es "Failed to connect: %s" "Falló al conectar: %s" ::msgcat::mcset es "Failed to read SOCKS4a destination address" "Fallo al\ leer la dirección destino de SOCKS4a" ::msgcat::mcset es "Failed to read SOCKS4a response" "Fallo al leer la\ respuesta de SOCKS4a" ::msgcat::mcset es "Failed to read SOCKS5 authorization methods response"\ "Fallo al leer la respuesta de métodos de autorización SOCKS5" ::msgcat::mcset es "Failed to read SOCKS5 authorization response" "Fallo al\ leer la respuesta de autorización SOCKS5" ::msgcat::mcset es "Failed to read SOCKS5 connection response" "Fallo al leer\ la respuesta de conexión SOCKS5" ::msgcat::mcset es "Failed to read SOCKS5 destination address type" "Fallo al\ leer el tipo de dirección destino de SOCKS5" ::msgcat::mcset es "Failed to read SOCKS5 destination domain" "Fallo al leer\ el dominio destino de SOCKS5" ::msgcat::mcset es "Failed to read SOCKS5 destination domain length" "Fallo\ al leer la longitud del dominio destino de SOCKS5" ::msgcat::mcset es "Failed to read SOCKS5 destination IPv4 address and port"\ "Fallo al leer la dirección IPv4 y puerto destino de SOCKS5" ::msgcat::mcset es "Failed to read SOCKS5 destination IPv6 address and port"\ "Fallo al leer la dirección IPv6 y puerto destino de SOCKS5" ::msgcat::mcset es "Failed to read SOCKS5 destination port" "Fallo al leer el\ puerto destino de SOCKS5" ::msgcat::mcset es "Failed to send SOCKS4a request" "Fallo al leer la\ petición de SOCKS4a" ::msgcat::mcset es "Failed to send SOCKS5 authorization methods request"\ "Fallo al leer la petición de métodos de autorización de SOCKS5" ::msgcat::mcset es "Failed to send SOCKS5 authorization request" "Fallo al\ leer la petición de autorización de SOCKS5" ::msgcat::mcset es "Failed to send SOCKS5 connection request" "Fallo al leer\ la petición de conexión de SOCKS5" ::msgcat::mcset es "Family Name" "Apellido" ::msgcat::mcset es "Family Name:" "Apellido:" ::msgcat::mcset es "Fax:" "Fax:" ::msgcat::mcset es "Feature Not Implemented" "Característica no implementada" ::msgcat::mcset es "February" "Febrero" ::msgcat::mcset es "Fetch all messages" "Recuperar todos los mensajes" ::msgcat::mcset es "Fetch GPG key" "Conseguir clave GPG" ::msgcat::mcset es "Fetch message" "Recuperar mensaje" ::msgcat::mcset es "Fetch nickname" "Averiguar apodo" ::msgcat::mcset es "Fetch nicknames of all users in group" "Averiguar apodos\ de todos los usuarios en el grupo" ::msgcat::mcset es "Fetch unseen messages" "Recuperar mensajes no vistos" ::msgcat::mcset es "Fetch user nicknames" "Averiguar apodos de usuario" ::msgcat::mcset es "File %s cannot be opened: %s. History for %s (%s) is NOT\ converted\n" "No se pudo abrir el fichero %s: %s. El historial de %s\ (%s) NO se convirtió\n" ::msgcat::mcset es "File %s cannot be opened: %s. History for %s is NOT\ converted\n" "No se pudo abrir el fichero %s: %s. El historial de %s\ NO se convirtió\n" ::msgcat::mcset es "File %s is corrupt. History for %s (%s) is NOT\ converted\n" "El fichero %s está corrupto. El historial de %s (%s) NO\ se ha convertido\n" ::msgcat::mcset es "File %s is corrupt. History for %s is NOT converted\n"\ "El fichero %s está corrupto. El historial de %s NO se ha\ convertido\n" ::msgcat::mcset es "File path:" "Ruta al fichero:" ::msgcat::mcset es "file transfer" "transferencia de ficheros" ::msgcat::mcset es "File transfer aborted" "Transferencia de ficheros\ abortada" ::msgcat::mcset es "File Transfer options." "Opciones de transferencia de\ ficheros." ::msgcat::mcset es "Finish" "Terminar" ::msgcat::mcset es "First Name" "Nombre de pila" ::msgcat::mcset es "flirtatious" "flirteo" ::msgcat::mcset es "Floor:" "Planta:" ::msgcat::mcset es "Font to use in chat windows." "Fuente a usar en las\ ventanas de charla." ::msgcat::mcset es "Font to use in roster windows." "Fuente a usar en la\ lista de contactos." ::msgcat::mcset es "Forbidden" "Prohibido" ::msgcat::mcset es "Force advertising this hostname (or IP address) for\ outgoing HTTP file transfers." "Forzar indicación del nombre de la\ máquina (o dirección IP) en las transferencias de fichero HTTP\ salientes." ::msgcat::mcset es "Format Error" "Error de formato" ::msgcat::mcset es "Format of timestamp in chat message. Refer to Tcl\ documentation of 'clock' command for description of\ format.\n\nExamples:\n \[%R\] - \[20:37\]\n \[%T\] - \[20:37:12\]\n \ \[%a %b %d %H:%M:%S %Z %Y\] - \[Thu Jan 01 03:00:00 MSK 1970\]"\ "Formatio de la fecha en un mensaje de charla. Consulta la\ documentación de Tcl sobre el comando 'clock' para obtener detalles\ del formato.\n\nEjemplos:\n \[%R\] - \[20:37\]\n \[%T\] -\ \[20:37:12\]\n \[%a %b %d %H:%M:%S %Z %Y\] - \[Thu Jan 01 03:00:00\ MSK 1970\]" ::msgcat::mcset es "Format of timestamp in delayed chat messages delayed for\ more than 24 hours." "Formato de los tiempos en mensajes de charla\ retrasados por más de 24 horas." ::msgcat::mcset es "Format of timestamp in headline tree view. Set to empty\ string if you don't want to see timestamps." "Formato de fecha en la\ vista de árbol de los titulares. Si no quieres ver la fecha déjalo\ vacío." ::msgcat::mcset es "Forward headline" "Reenviar titular" ::msgcat::mcset es "Forward to %s" "Reenviar a %s" ::msgcat::mcset es "Forward..." "Reenviar..." ::msgcat::mcset es "Forwarded by:" "Reenviado por:" ::msgcat::mcset es "Free to chat" "Disponible para charlar" ::msgcat::mcset es "Free without disconnect" "Liberar sin desconectar" ::msgcat::mcset es "From/To" "De/Para" ::msgcat::mcset es "From:" "De:" ::msgcat::mcset es "From: " "De: " ::msgcat::mcset es "frustrated" "frustrado" ::msgcat::mcset es "Full Name" "Nombre completo" ::msgcat::mcset es "Full Name:" "Nombre completo:" ::msgcat::mcset es "Full-text search" "Búsqueda de texto completo" ::msgcat::mcset es "gaming" "jugando" ::msgcat::mcset es "gardening" "haciendo jardinería" ::msgcat::mcset es "general plugins" "plugins generales" ::msgcat::mcset es "General SOCKS server failure" "Fallo general del servidor\ SOCKS" ::msgcat::mcset es "Generate chat messages when chat peer changes his/her\ status and/or status message" "Generar mensajes de charla cuando el\ contacto cambia su estado o su mensaje de estado" ::msgcat::mcset es "Generate enter/exit messages" "Generar mensajes de\ entrada/salida" ::msgcat::mcset es "Generate groupchat messages when occupant changes his/her\ status and/or status message." "Generar mensajes de sala cuando un\ ocupante cambia su estado o su mensaje de estado." ::msgcat::mcset es "Generate groupchat messages when occupant's room position\ (affiliation and/or role) changes." "Generar mensaje de estado cuando\ cambia la posición de un ocupante (afiliación o rol)." ::msgcat::mcset es "Generate status messages when occupants enter/exit MUC\ compatible conference rooms." "Generar mensajes de estado cuando los\ ocupantes entran o salen de las salas de charla MUC." ::msgcat::mcset es "Generic IQ" "IQ genérico" ::msgcat::mcset es "Geographical position" "Posición geográfica" ::msgcat::mcset es "Get items" "Coger elementos" ::msgcat::mcset es "getting a haircut" "en la peluquería" ::msgcat::mcset es "GIF images" "GIF" ::msgcat::mcset es "going out" "saliendo" ::msgcat::mcset es "Gone" "Ido" ::msgcat::mcset es "Google selection" "Selección Google" ::msgcat::mcset es "GPG error" "Error GPG" ::msgcat::mcset es "GPG options (signing and encryption)." "Opciones de GPG\ (firma y cifrado)." ::msgcat::mcset es "GPG-encrypt outgoing messages where possible." "Cifrar\ con GPG los mensajes salientes siempre que sea posible." ::msgcat::mcset es "GPG-sign outgoing messages and presence updates." "Firmar\ con GPG los mensajes y presencias salientes." ::msgcat::mcset es "GPS datum:" "GPS datum:" ::msgcat::mcset es "Grant Admin Privileges" "Conceder privilegios de\ Administrador" ::msgcat::mcset es "Grant Membership" "Conceder Membresía" ::msgcat::mcset es "Grant Moderator Privileges" "Conceder privilegios de\ Moderador" ::msgcat::mcset es "Grant Owner Privileges" "Conceder privilegios de Dueño" ::msgcat::mcset es "Grant subscription" "Conceder subscripción" ::msgcat::mcset es "Grant Voice" "Conceder Voz" ::msgcat::mcset es "grooming" "acicalándose" ::msgcat::mcset es "Group:" "Grupo:" ::msgcat::mcset es "Group: " "Grupo: " ::msgcat::mcset es "Groupchat message highlighting plugin options." "Opciones\ del plugin de resaltado de mensajes en salas de charla." ::msgcat::mcset es "grumpy" "irritable" ::msgcat::mcset es "guilty" "culpable" ::msgcat::mcset es "Handle ROTFL/LOL smileys -- those like :))) -- by\ \"consuming\" all that parens and rendering the whole word with\ appropriate icon." "Manejar sonrisas ROTFL/LOL -- como estas :))) --\ \"consumiendo\" todos los paréntesis y mostrando toda la palabra con\ el icono apropiado." ::msgcat::mcset es "Handling of \"emoticons\". Emoticons (also known as\ \"smileys\") are small pictures resembling a human face used to\ represent user's emotion. They are typed in as special mnemonics like\ :) or can be inserted using menu." "Manejo de\"emoticonos\".\ Emoticonos (también conocidos como \"smileys\") son pequeñas imágenes\ que parecen una cara humana y se usan para representar la emoción del\ usuario. Pueden insertar usando caracteres mnemónicos como :) o\ usando un menu." ::msgcat::mcset es "Handling of \"stylecodes\". Stylecodes are (groups of)\ special formatting symbols used to emphasize parts of the text by\ setting them with boldface, italics or underlined styles, or as\ combinations of these." "Manejo de \"códigos de estilo\". Son (grupos\ de) símbolos de formato especiales usados para enfatizar partes del\ texto, poniéndolo en negrita, itálica o subrayado, o una combinación\ de éstos." ::msgcat::mcset es "hanging out" "demorándose" ::msgcat::mcset es "happy" "feliz" ::msgcat::mcset es "having a beer" "tomando una cerveza" ::msgcat::mcset es "having a snack" "tomando un aperitivo" ::msgcat::mcset es "having appointment" "en una cita" ::msgcat::mcset es "having breakfast" "tomando el almuerzo" ::msgcat::mcset es "having coffee" "tomando un café" ::msgcat::mcset es "having dinner" "cenando" ::msgcat::mcset es "having lunch" "comiendo" ::msgcat::mcset es "having tea" "tomando un té" ::msgcat::mcset es "Headline message" "Mensaje de titular" ::msgcat::mcset es "Headlines" "Titulares" ::msgcat::mcset es "Help" "Ayuda" ::msgcat::mcset es "Hide characters comprising stylecode markup." "Esconder\ caracteres que correspondan a formato de texto." ::msgcat::mcset es "Hide main window" "Esconder ventana principal" ::msgcat::mcset es "Hide/Show roster" "Ocultar/mostrar lista de contactos" ::msgcat::mcset es "Highlight current nickname in messages." "Resaltar en los\ mensajes tu apodo actual." ::msgcat::mcset es "Highlight only whole words in messages." "Resaltar solo\ palabras completas en los mensajes." ::msgcat::mcset es "hiking" "de excursión" ::msgcat::mcset es "History for %s" "Historial de %s" ::msgcat::mcset es "History of availability status messages" "Historial de\ mensajes de estado de disponibilidad" ::msgcat::mcset es "Home:" "Casa:" ::msgcat::mcset es "Horizontal GPS error:" "Error de GPS horizontal:" ::msgcat::mcset es "Host Gone" "Host No Disponible" ::msgcat::mcset es "Host Unknown" "Host Desconocido" ::msgcat::mcset es "Host unreachable" "Máquina inlocalizable" ::msgcat::mcset es "Host:" "Máquina:" ::msgcat::mcset es "hot" "caliente" ::msgcat::mcset es "hour" "hora" ::msgcat::mcset es "hours" "horas" ::msgcat::mcset es "HTTP" "HTTP" ::msgcat::mcset es "HTTP options." "Opciones HTTP." ::msgcat::mcset es "HTTP proxies" "Proxies HTTP" ::msgcat::mcset es "HTTPS" "HTTPS" ::msgcat::mcset es "HTTPS proxy negotiation aborted" "Abortada la negociación\ con el proxy HTTPS" ::msgcat::mcset es "HTTPS proxy negotiation timed out" "Ha caducado la\ negociación con el proxy HTTPS" ::msgcat::mcset es "humbled" "humilde" ::msgcat::mcset es "humiliated" "humillado" ::msgcat::mcset es "hungry" "hambriento" ::msgcat::mcset es "hurt" "dolido" ::msgcat::mcset es "I would like to add you to my roster." "Me gustaría\ añadirte a mi lista de contactos." ::msgcat::mcset es "Iconize" "Iconizar" ::msgcat::mcset es "Idle for %s" "Inactivo durante %s" ::msgcat::mcset es "Idle threshold in minutes after that Tkabber marks you as\ away." "Intervalo de inactividad tras el cual Tkabber te cambia a\ 'ausente'" ::msgcat::mcset es "Idle threshold in minutes after that Tkabber marks you as\ extended away." "Intervalo de inactividad tras el cual Tkabber te\ cambia a 'muy ausente'." ::msgcat::mcset es "If set then open chat window/tab when user doubleclicks\ roster item. Otherwise open normal message window." "Si está\ activado, cuando se pulse dos veces con el ratón sobre un contacto,\ se abrirá una ventana o pestaña de charla. Si no, se abrirá una\ ventana de mensaje normal." ::msgcat::mcset es "Ignore" "Ignorar" ::msgcat::mcset es "Ignore chat messages" "Ignorar mensajes de charla" ::msgcat::mcset es "Ignore groupchat messages" "Ignorar mensajes de charla de\ grupo" ::msgcat::mcset es "Ignore list" "Lista de ignorados" ::msgcat::mcset es "Ignoring groupchat and chat messages from selected\ occupants of multi-user conference rooms." "Ignorando mensajes de\ charla y mensajes de charla en grupo de los ocupantes seleccionados\ en las salas de charla." ::msgcat::mcset es "Illegal attribute \"xmlns\". Use -xmlns option" "Atributo\ ilegal \"xmlns\". Usa la opción -xmlns" ::msgcat::mcset es "Illegal command \"%s\"" "Comando ilegal: \"%s\"" ::msgcat::mcset es "Illegal IQ type \"%s\"" "Tipo de IQ ilegal \"%s\"" ::msgcat::mcset es "Illegal option \"%s\"" "Opción ilegal \"%s\"" ::msgcat::mcset es "Illegal option \"%s\" value \"%s\", boolean expected"\ "Opción ilegal \"%s\" valor \"%s\", se esperaba un booleano" ::msgcat::mcset es "Illegal result" "Resultado ilegal" ::msgcat::mcset es "Illegal value \"%s\" for option \"%s\"" "Valor ilegal\ \"%s\" para la opción \"%s\"" ::msgcat::mcset es "Image" "Imagen" ::msgcat::mcset es "Import roster" "Importar lista de contactos" ::msgcat::mcset es "Import Roster for %s..." "Importar lista de contactos de\ %s..." ::msgcat::mcset es "impressed" "impresionado" ::msgcat::mcset es "Improper Addressing" "Dirección Incorrecta" ::msgcat::mcset es "in a car" "en un coche" ::msgcat::mcset es "in a meeting" "en una reunión" ::msgcat::mcset es "in real life" "en la vida real" ::msgcat::mcset es "in_awe" "admirador" ::msgcat::mcset es "in_love" "enamorado" ::msgcat::mcset es "inactive" "inactivo" ::msgcat::mcset es "Include operating system info into a reply to version\ (jabber:iq:version) requests." "Incluir información sobre tu sistema\ operativo en las respuestas a peticiones jabber:iq:version." ::msgcat::mcset es "Incorrect encoding" "Codificación incorrecta" ::msgcat::mcset es "Incorrect SOCKS version" "Versión incorrecta de SOCKS" ::msgcat::mcset es "Incorrect SOCKS4a server version" "Versión de servidor\ SOCKS4a incorrecta" ::msgcat::mcset es "Incorrect SOCKS5 server version" "Versión incorrecta del\ servidor SOCKS5" ::msgcat::mcset es "Indentation for pretty-printed XML subtags." "Indentar\ las marcas XML en la versión en bonito." ::msgcat::mcset es "indignant" "indigno" ::msgcat::mcset es "Info/Query options." "Opciones Info/Query." ::msgcat::mcset es "Info:" "Info:" ::msgcat::mcset es "Information" "Información" ::msgcat::mcset es "interested" "interesado" ::msgcat::mcset es "Internal Server Error" "Error interno del servidor" ::msgcat::mcset es "Interval (in minutes) after error reply on request of\ participants list." "Intervalo (en minutos) si la respuesta a una\ petición de lista de participantes da error." ::msgcat::mcset es "Interval (in minutes) between requests of participants\ list." "Intervalo (en minutos) entre peticiones de la lista de\ participantes." ::msgcat::mcset es "Interval:" "Intervalo:" ::msgcat::mcset es "intoxicated" "intoxicado" ::msgcat::mcset es "Invalid authzid" "Authzid incorrecta" ::msgcat::mcset es "Invalid From" "Remitente Inválido" ::msgcat::mcset es "Invalid ID" "ID Inválido" ::msgcat::mcset es "Invalid mechanism" "Mecanismo incorrecto" ::msgcat::mcset es "Invalid Namespace" "Espacio de Nombres Inválido" ::msgcat::mcset es "Invalid option \"%s\"" "Opción ilegal \"%s\"" ::msgcat::mcset es "Invalid signature" "Firma inválida" ::msgcat::mcset es "invalid userstatus value " "valor de estado de usuario\ inválido " ::msgcat::mcset es "Invalid userstatus value %s" "Valor de estado no válido\ %s" ::msgcat::mcset es "Invalid XML" "XML Inválido" ::msgcat::mcset es "invincible" "invencible" ::msgcat::mcset es "Invisible" "Invisible" ::msgcat::mcset es "Invisible list" "Lista de invisibles" ::msgcat::mcset es "Invite" " Invitar " ::msgcat::mcset es "Invite %s to conferences" "Invitar a %s a charla en\ grupo" ::msgcat::mcset es "Invite to conference..." "Invitar a charlar en grupo..." ::msgcat::mcset es "Invite users to %s" "Invitar usuarios a la sala %s" ::msgcat::mcset es "Invite users..." "Invitar usuarios..." ::msgcat::mcset es "Invited to:" "Invitado a:" ::msgcat::mcset es "IP address:" "Dirección IP:" ::msgcat::mcset es "IPv6 support is not available" "No está disponible el\ soporte de IPv6" ::msgcat::mcset es "IQ" "IQ" ::msgcat::mcset es "IQ %s timed out" "La IQ %s ha caducado" ::msgcat::mcset es "IQ id %s doesn't exist in memory" "El id %s de IQ no\ existe en la memoria" ::msgcat::mcset es "is available" "está disponible" ::msgcat::mcset es "is away" "esta ausente" ::msgcat::mcset es "is extended away" "está muy ausente" ::msgcat::mcset es "is free to chat" "está disponible para charlar" ::msgcat::mcset es "is invisible" "está invisible" ::msgcat::mcset es "is unavailable" "está desconectado" ::msgcat::mcset es "ISDN:" "RDSI:" ::msgcat::mcset es "Ispell dictionary encoding. If it is empty, system\ encoding is used." "Codificación del diccionario Ispell. Si está\ vacío se utilizará la codificación del sistema." ::msgcat::mcset es "Ispell options. See ispell manual for\ details.\n\nExamples:\n -d russian\n -d german -T latin1\n -C -d\ english" "Opciones de Ispell. Consulta el manual de Ispell para más\ detalles.\n\nEjemplos:\n -d russian\n -d german -T latin1\n -C -d\ english" ::msgcat::mcset es "Issuer" "Emisor" ::msgcat::mcset es "Item Not Found" "Elemento no encontrado" ::msgcat::mcset es "Jabber ID" "Jabber ID" ::msgcat::mcset es "January" "Enero" ::msgcat::mcset es "jealous" "celoso" ::msgcat::mcset es "JID" "JID" ::msgcat::mcset es "JID list" "Lista de JID" ::msgcat::mcset es "JID Malformed" "JID mal formado" ::msgcat::mcset es "JID regexp:" "JID regexp:" ::msgcat::mcset es "JID:" "JID:" ::msgcat::mcset es "jogging" "haciendo jogging" ::msgcat::mcset es "Join" "Entrar" ::msgcat::mcset es "Join conference" "Unirse a la conferencia" ::msgcat::mcset es "Join group" "Entrar en grupo" ::msgcat::mcset es "Join group dialog data (groups)." "Datos del diálogo de\ entrada en sala (grupos)." ::msgcat::mcset es "Join group dialog data (nicks)." "Datos del diálogo de\ entrada en sala (apodos)." ::msgcat::mcset es "Join group dialog data (servers)." "Datos del diálogo de\ entrada en sala (servidores)." ::msgcat::mcset es "Join group..." "Entrar en grupo..." ::msgcat::mcset es "Join groupchat" "Unirse a la sala de charla" ::msgcat::mcset es "Join..." "Entrar..." ::msgcat::mcset es "JPEG images" "JPEG" ::msgcat::mcset es "July" "Julio" ::msgcat::mcset es "June" "Junio" ::msgcat::mcset es "Keep trying" "Seguir intentándolo" ::msgcat::mcset es "Key" "Llave" ::msgcat::mcset es "Key ID" "ID de la llave" ::msgcat::mcset es "Kick" "Expulsar" ::msgcat::mcset es "Konstantin Khomoutov" "Konstantin Khomoutov" ::msgcat::mcset es "last %s%s:" "último %s%s:" ::msgcat::mcset es "last %s%s: %s" "último %s%s: %s" ::msgcat::mcset es "Last activity" "Última actividad" ::msgcat::mcset es "Last Activity or Uptime" "Última actividad o tiempo en\ marcha" ::msgcat::mcset es "Last Name" "Apellidos" ::msgcat::mcset es "Latitude" "Latitud" ::msgcat::mcset es "Latitude:" "Latitud:" ::msgcat::mcset es "Left" "Izquierda" ::msgcat::mcset es "Left mouse button" "Botón izquierdo del ratón" ::msgcat::mcset es "Length:" "Duración:" ::msgcat::mcset es "List name" "Listar nombre" ::msgcat::mcset es "List of discovered JID nodes." "Lista de nodos JID\ descubiertos." ::msgcat::mcset es "List of discovered JIDs." "Lista de JIDs descubiertos." ::msgcat::mcset es "List of JIDs to whom headlines have been sent." "Lista de\ JID a los que se ha enviado titulares de noticia." ::msgcat::mcset es "List of logout reasons." "Lista de razones de cierre de\ sesión." ::msgcat::mcset es "List of message destination JIDs." "Lista de los JID\ destinatarios." ::msgcat::mcset es "List of proxy servers for SOCKS5 bytestreams (all\ available servers will be tried for mediated connection)." "Lista de\ servidores proxy para SOCKS5 bytestreams (todos los servidores\ disponibles serán probados para una conexión mediada)." ::msgcat::mcset es "List of users for chat." "Lista de usuarios para la\ charla." ::msgcat::mcset es "List of users for userinfo." "Lista de usuarios para\ userinfo." ::msgcat::mcset es "Load Image" "Cargar imagen" ::msgcat::mcset es "Load state on start" "Cargar estado al inicio" ::msgcat::mcset es "Load state on Tkabber start." "Cargar estado en el inicio\ de Tkabber." ::msgcat::mcset es "Loading and unloading external plugins." "Cargar y\ descargar plugins externos." ::msgcat::mcset es "Loading photo failed: %s." "No se pudo cargar la imagen:\ %s." ::msgcat::mcset es "Locality:" "Localidad:" ::msgcat::mcset es "Location" "Lugar" ::msgcat::mcset es "Log in" " Iniciar " ::msgcat::mcset es "Log in..." "Iniciar sesión..." ::msgcat::mcset es "Log out" "Cerrar sesión" ::msgcat::mcset es "Log out with reason..." "Cerrar sesión con razón..." ::msgcat::mcset es "Logging options." "Opciones de registro de mensajes." ::msgcat::mcset es "Login" " Iniciar " ::msgcat::mcset es "Login options." "Opciones de inicio de sesión." ::msgcat::mcset es "Login retry for %s in %s" "Reintento de identificarse\ para %s en %s" ::msgcat::mcset es "Logout" "Cerrar sesión" ::msgcat::mcset es "Logout with reason" "Cerrar sesión con razón" ::msgcat::mcset es "Logs" "Historiales" ::msgcat::mcset es "lonely" "solitario" ::msgcat::mcset es "Longitude" "Longitud" ::msgcat::mcset es "Longitude:" "Longitud:" ::msgcat::mcset es "macintosh plugins" "plugins de macintosh" ::msgcat::mcset es "Main window:" "Ventana principal:" ::msgcat::mcset es "Malformed signature block" "Bloque de firma mal formado" ::msgcat::mcset es "Manage proxy servers" "Administrar servidores proxy" ::msgcat::mcset es "Manually edit rules" "Editar reglas manualmente" ::msgcat::mcset es "March" "Marzo" ::msgcat::mcset es "Mark all seen" "Marcar todos como leídos" ::msgcat::mcset es "Mark all unseen" "Marcar todos como no leídos" ::msgcat::mcset es "Marshall T. Rose" "Marshall T. Rose" ::msgcat::mcset es "Match case while searching in chat, log or disco\ windows." "Hacer coincidencia mayúsculas/minúsculas al buscar." ::msgcat::mcset es "Match contact JIDs in addition to nicknames in roster\ filter." "Concordar en el filtro de contactos no solo apodos, sino\ también direcciones Jabber (JID)." ::msgcat::mcset es "Match:" "Coincidir:" ::msgcat::mcset es "Maximum interval length in hours for which log messages\ should be shown in newly opened chat window (if set to negative then\ the interval is unlimited)." "Máxima longitud de intervalo en horas\ para el cual los mensajes del historial deberían mostrarse cuando se\ abre una nueva ventana de charla (si es negativo el intervalo será\ ilimitado)." ::msgcat::mcset es "Maximum number of characters in the history in MUC\ compatible conference rooms." "Máximo número de caracteres en el\ historial de las salas de charla MUC." ::msgcat::mcset es "Maximum number of log messages to show in newly opened\ chat window (if set to negative then the number is unlimited)."\ "Máximo número de mensajes de historial a mostrar en una ventana de\ charla nueva (si es negativo el intervalo será ilimitado)." ::msgcat::mcset es "Maximum number of stanzas in the history in MUC\ compatible conference rooms." "Máximo número de mensajes en el\ historial de las salas de charla MUC." ::msgcat::mcset es "Maximum number of status messages to keep. If the history\ size reaches this threshold, the oldest message will be deleted\ automatically when a new one is recorded." "Número máximo de mensajes\ de estado a mantener. Si el tamaño del historial excede este umbral,\ los mensajes antiguos se irán borrandp automáticamente según se vayan\ guardando mensajes nuevos." ::msgcat::mcset es "Maximum poll interval." "Intervalo máximo de Poll." ::msgcat::mcset es "Maximum width of tab buttons in tabbed mode." "Ancho\ máximo de los botones de pestaña en el modo de pestañas." ::msgcat::mcset es "May" "Mayo" ::msgcat::mcset es "mean" "ruin" ::msgcat::mcset es "Mechanism too weak" "Mecanismo demasiado débil" ::msgcat::mcset es "member" "miembro" ::msgcat::mcset es "Message" "Mensaje" ::msgcat::mcset es "Message and Headline options." "Opciones de Mensaje y\ Titulares." ::msgcat::mcset es "Message archive" "Archivo de mensajes" ::msgcat::mcset es "Message body" "Cuerpo del mensaje" ::msgcat::mcset es "Message delivered" "Mensaje entregado" ::msgcat::mcset es "Message delivered to %s" "Mensaje entregado a %s" ::msgcat::mcset es "Message displayed" "Mensaje mostrado" ::msgcat::mcset es "Message displayed to %s" "Mensaje mostrado a %s" ::msgcat::mcset es "Message from %s" "Mensaje de %s" ::msgcat::mcset es "Message from:" "Mensaje de:" ::msgcat::mcset es "Message Recorder:" "Contestador:" ::msgcat::mcset es "Message stored on %s's server" "Mensaje guardado en el\ servidor de %s" ::msgcat::mcset es "Message stored on the server" "Mensaje guardado en el\ servidor" ::msgcat::mcset es "Messages" "Mensajes" ::msgcat::mcset es "Metacontact" "Metacontacto" ::msgcat::mcset es "Michail Litvak" "Michail Litvak" ::msgcat::mcset es "Middle mouse button" "Botón central del ratón" ::msgcat::mcset es "Middle Name" "Segundo nombre" ::msgcat::mcset es "Middle Name:" "Segundo nombre:" ::msgcat::mcset es "Minimize" "Minimizar" ::msgcat::mcset es "Minimize to systray (if systray icon is enabled,\ otherwise do nothing)" "Minimizar a la bandeja del sistema (si esto\ es posible, en otro caso no hacer nada)" ::msgcat::mcset es "Minimum poll interval." "Intervalo mínimo de Poll." ::msgcat::mcset es "Minimum width of tab buttons in tabbed mode." "Ancho\ mínimo de los botones de pestaña en el modo de pestañas." ::msgcat::mcset es "minute" "minuto" ::msgcat::mcset es "minutes" "minutos" ::msgcat::mcset es "Misc" "Misc" ::msgcat::mcset es "Missing option \"%s\"" "Opción no encontrada \"%s\"" ::msgcat::mcset es "Missing option \"-username\" or \"-domain\"" "No\ encontrada la opción \"-username\" o \"-domain\"" ::msgcat::mcset es "Modem:" "Modem:" ::msgcat::mcset es "moderator" "moderador" ::msgcat::mcset es "Moderators" "Moderadores" ::msgcat::mcset es "Modified: %s" "Modificado: %s" ::msgcat::mcset es "Month:" "Mes:" ::msgcat::mcset es "Mood" "Estado de ánimo" ::msgcat::mcset es "Mood:" "Estado de ánimo:" ::msgcat::mcset es "moody" "malhumorado" ::msgcat::mcset es "Move down" "Desplazar abajo" ::msgcat::mcset es "Move tab left/right" "Mover pestaña a izquierda/derecha" ::msgcat::mcset es "Move up" "Desplazar arriba" ::msgcat::mcset es "Moving to extended away" "Pasando a muy ausente" ::msgcat::mcset es "MUC" "MUC" ::msgcat::mcset es "MUC Ignore" "Ignorar en MUC" ::msgcat::mcset es "MUC Ignore Rules" "Reglas de ignorar en MUC" ::msgcat::mcset es "Multiple signatures having different authenticity"\ "Múltiples firmas con diferentes autenticidades" ::msgcat::mcset es "Mute sound" "Desactivar sonidos" ::msgcat::mcset es "Mute sound if Tkabber window is focused." "Enmudecer el\ sonido si la ventana de Tkabber tiene el foco." ::msgcat::mcset es "Mute sound notification." "Enmudecer la notificación\ sonora." ::msgcat::mcset es "Mute sound when displaying delayed groupchat messages."\ "Enmudecer el sonido de mensajes de charla en grupo con retraso." ::msgcat::mcset es "Mute sound when displaying delayed personal chat\ messages." "Enmudecer el sonido de mensajes de charla privada con\ retraso." ::msgcat::mcset es "My Resources" "Mis Recursos" ::msgcat::mcset es "Name" "Nombre" ::msgcat::mcset es "Name " "Nombre " ::msgcat::mcset es "Name:" "Nombre:" ::msgcat::mcset es "Name: " "Nombre: " ::msgcat::mcset es "negotiation" "negociación" ::msgcat::mcset es "nervous" "nervioso" ::msgcat::mcset es "Network failure" "Fallo en la red" ::msgcat::mcset es "Network unreachable" "Red inlocalizable" ::msgcat::mcset es "neutral" "neutral" ::msgcat::mcset es "New group name:" "Nuevo nombre del grupo:" ::msgcat::mcset es "New password:" "Nueva contraseña:" ::msgcat::mcset es "Next" "Sigu" ::msgcat::mcset es "Next bookmark" "Marcador siguiente" ::msgcat::mcset es "Next highlighted" "Siguiente resaltado" ::msgcat::mcset es "Nick" "Apodo" ::msgcat::mcset es "Nick:" "Apodo:" ::msgcat::mcset es "Nickname" "Apodo" ::msgcat::mcset es "Nickname:" "Apodo:" ::msgcat::mcset es "No active list" "No hay lista activa" ::msgcat::mcset es "No avatar to store" "No hay avatar para guardar" ::msgcat::mcset es "No conferences for %s in progress..." "No hay\ conferencias para %s actualmente..." ::msgcat::mcset es "No default list" "No hay lista por defecto" ::msgcat::mcset es "No information available" "No hay información disponible" ::msgcat::mcset es "No reply" "No responder" ::msgcat::mcset es "No SASL package found" "No se ha encontrado paquete SASL" ::msgcat::mcset es "No such abbreviation: %s" "No existe esa abreviatura: %s" ::msgcat::mcset es "No users in %s roster..." "No hay usuarios en la lista de\ contactos de %s..." ::msgcat::mcset es "No users in roster..." "No hay usuarios en la lista..." ::msgcat::mcset es "Node" "Nodo" ::msgcat::mcset es "Node:" "Nodo:" ::msgcat::mcset es "Non-SASL authentication aborted" "Autenticación no-SASL\ abortada" ::msgcat::mcset es "Non-SASL authentication failed" "Autenticación no-SASL ha\ fallado" ::msgcat::mcset es "Non-SASL authentication succeeded" "Autenticación no-SASL\ exitosa" ::msgcat::mcset es "Non-SASL authentication timed out" "Autenticación no-SASL\ ha caducado" ::msgcat::mcset es "None" "Ninguna" ::msgcat::mcset es "none" "nada" ::msgcat::mcset es "Normal message" "Mensaje normal" ::msgcat::mcset es "Not Acceptable" "No aceptable" ::msgcat::mcset es "Not Allowed" "No permitido" ::msgcat::mcset es "Not Authorized" "No autorizado" ::msgcat::mcset es "Not connected" "No conectado" ::msgcat::mcset es "Not Found" "No encontrado" ::msgcat::mcset es "Not Implemented" "No implementado" ::msgcat::mcset es "Not logged in" "No conectado" ::msgcat::mcset es "Notes" "Notas" ::msgcat::mcset es "Nothing to block" "Nada que bloquear" ::msgcat::mcset es "Notify only when available" "Notificar solo cuando estoy\ disponible" ::msgcat::mcset es "November" "Noviembre" ::msgcat::mcset es "Number of groupchat messages to expire nick completion\ according to the last personally addressed message." "Número de\ mensajes en la sala de charla desde que un participante salió a\ partir del cual ya no se completa su apodo." ::msgcat::mcset es "Number of HTTP poll client security keys to send before\ creating new key sequence." "Número de claves de seguridad del\ cliente de HTTP Poll que se envían antes de crear una nueva secuencia\ de clave." ::msgcat::mcset es "October" "Octubre" ::msgcat::mcset es "offended" "ofendido" ::msgcat::mcset es "Offline Messages" "Mensajes diferidos" ::msgcat::mcset es "OK" " Aceptar " ::msgcat::mcset es "Old password:" "Contraseña antigua:" ::msgcat::mcset es "on a bus" "en un autobús" ::msgcat::mcset es "on a plane" "en un avión" ::msgcat::mcset es "on a train" "en un tren" ::msgcat::mcset es "on a trip" "en un viaje" ::msgcat::mcset es "on the phone" "al teléfono" ::msgcat::mcset es "on vacation" "de vacaciones" ::msgcat::mcset es "on video phone" "en el videoteléfono" ::msgcat::mcset es "One window per bare JID" "Una ventana por JID simple" ::msgcat::mcset es "One window per full JID" "Una ventana por JID completo" ::msgcat::mcset es "Only one option \"-username\" or \"-domain\" is allowed"\ "Solo una opción se permite: \"-username\" o \"-domain\"" ::msgcat::mcset es "Open" "Abrir" ::msgcat::mcset es "Open chat" "Abrir charla" ::msgcat::mcset es "Open chat..." "Abrir charla..." ::msgcat::mcset es "Open new conversation" "Abrir nueva conversación" ::msgcat::mcset es "Open raw XML window" "Abrir ventana de XML crudo" ::msgcat::mcset es "Open statistics monitor" "Abrir monitor de estadísticas" ::msgcat::mcset es "Opening IBB connection" "Abriendo conexión IBB" ::msgcat::mcset es "Opening IQ-IBB connection" "Abrir conexión IQ-IBB" ::msgcat::mcset es "Opening SI connection" "Abriendo conexión SI" ::msgcat::mcset es "Opening SOCKS5 listening socket" "Abriendo socket de\ escucha SOCKS5" ::msgcat::mcset es "Opening stream aborted" "Apertura de conexión abortada" ::msgcat::mcset es "Opening stream timed out" "Apertura de conexión ha\ caducado" ::msgcat::mcset es "Opens a new chat window for the new nick of the room\ occupant" "Abre una nueva ventana de charla para el nuevo apodo del\ ocupante de la sala" ::msgcat::mcset es "Option \"-command\" is illegal for IQ type \"%s\"" "La\ opción \"-command\" es ilegal en un IQ de tipo \"%s\"" ::msgcat::mcset es "Options \"-host\" and \"-port\" are required (or your\ proxy filter hasn't returned them)" "Se requieren las opciones\ \"-host\" y \"-port\" (o tu filtro de proxy no las ha devuelto)" ::msgcat::mcset es "Options for Conference Info module, that allows you to\ see list of participants in roster popup, regardless of whether you\ are currently joined with the conference." "Opciones para el módulo\ 'Información de Conferencias', que te permite ver la lista de\ participantes en las salas de conferencia de tu lista de contactos\ con un popup, sin necesidad de que participes ellas." ::msgcat::mcset es "Options for entity capabilities plugin." "Opciones del\ plugin de capacidades de entidad." ::msgcat::mcset es "Options for external play program" "Opciones para el\ programa de reproducción externo" ::msgcat::mcset es "Options for main interface." "Opciones del interfaz\ principal." ::msgcat::mcset es "Options for module that automatically marks you as away\ after idle threshold." "Opciones del módulo 'Autoausencia', que te\ cambia a 'ausente' automáticamente después de un tiempo de\ inactividad." ::msgcat::mcset es "Options for Raw XML Input module, which allows you to\ monitor incoming/outgoing traffic from connection to server and send\ custom XML stanzas." "Opciones para el módulo 'XML Crudo', que te\ permite monitorizar tráfico de entrada/salida en la conexión con el\ servidor y enviar tus propios mensajes XML." ::msgcat::mcset es "Organization" "Organización" ::msgcat::mcset es "Organization Name" "Nombre de la organización" ::msgcat::mcset es "Organization Unit" "Unidad de la organización" ::msgcat::mcset es "Original from" "Original de" ::msgcat::mcset es "Original to" "Original para" ::msgcat::mcset es "OS:" "SO:" ::msgcat::mcset es "Outcast" "Bloquear" ::msgcat::mcset es "outcast" "bloqueado" ::msgcat::mcset es "Owner" "Propietario" ::msgcat::mcset es "owner" "dueño" ::msgcat::mcset es "Pager:" "Busca:" ::msgcat::mcset es "Parent group" "Grupo padre" ::msgcat::mcset es "Parent groups" "Grupos padres" ::msgcat::mcset es "Parser \"%s\" doesn't exist" "No existe el analizador\ \"%s\"" ::msgcat::mcset es "participant" "participante" ::msgcat::mcset es "Participants" "Participantes" ::msgcat::mcset es "partying" "en una fiesta" ::msgcat::mcset es "Passphrase:" "Frase de clave:" ::msgcat::mcset es "Password" "Contraseña" ::msgcat::mcset es "Password." "Contraseña." ::msgcat::mcset es "Password:" "Contraseña:" ::msgcat::mcset es "Path to the ispell executable." "Ruta para el ejecutable\ de Ispell." ::msgcat::mcset es "Paused a reply" "Se pausó una respuesta" ::msgcat::mcset es "Payment Required" "Se requiere pago" ::msgcat::mcset es "Pending" "Pendiente" ::msgcat::mcset es "Periodically browse roster conferences" "Inspeccionar\ periódicamente salas de charla de la lista" ::msgcat::mcset es "Personal" "Personal" ::msgcat::mcset es "Personal " "Personal " ::msgcat::mcset es "Personal eventing" "Eventos personales" ::msgcat::mcset es "Personal eventing via pubsub plugins options." "Opciones\ de Eventos Personales via PubSub (PEP)." ::msgcat::mcset es "Phone" "Teléfono" ::msgcat::mcset es "Phone BBS" "Teléfono BBS" ::msgcat::mcset es "Phone Cell" "Teléfono móvil" ::msgcat::mcset es "Phone Fax" "Número de Fax" ::msgcat::mcset es "Phone Home" "Teléfono de casa" ::msgcat::mcset es "Phone ISDN" "Teléfono ISDN" ::msgcat::mcset es "Phone Message Recorder" "Teléfono del grabador de\ mensajes" ::msgcat::mcset es "Phone Modem" "Teléfono del módem" ::msgcat::mcset es "Phone Pager" "Teléfono Pager" ::msgcat::mcset es "Phone PCS" "Teléfono PCS" ::msgcat::mcset es "Phone Preferred" "Teléfono preferido" ::msgcat::mcset es "Phone Video" "Teléfono video" ::msgcat::mcset es "Phone Voice" "Teléfono de voz" ::msgcat::mcset es "Phone Work" "Teléfono del trabajo" ::msgcat::mcset es "Phones" "Teléfonos" ::msgcat::mcset es "Photo" "Foto" ::msgcat::mcset es "Ping server using XMPP ping requests." "Enviar Ping al\ servidor usando peticiones XMPP Ping." ::msgcat::mcset es "pixmaps management" "manejo de pixmaps" ::msgcat::mcset es "Plaintext" "Texto plano" ::msgcat::mcset es "playful" "juguetón" ::msgcat::mcset es "playing sports" "practicando un deporte" ::msgcat::mcset es "Please define environment variable BROWSER" "Por favor\ define la variable de entorno BROWSER" ::msgcat::mcset es "Please enter passphrase" "Por favor, introduce la frase\ clave" ::msgcat::mcset es "Please join %s" "Por favor, entra en %s" ::msgcat::mcset es "Please try again" "Por favor, vuélvelo a intentar" ::msgcat::mcset es "Please, be patient while chats history is being converted\ to new format" "Por favor, se paciente mientras los historiales de\ conversaciones son convertidos al nuevo formato" ::msgcat::mcset es "Please, be patient while Tkabber configuration directory\ is being transferred to the new location" "Por favor, se paciente\ mientras el directorio de configuración de Tkabber se transfiere a la\ nueva localización" ::msgcat::mcset es "plugin management" "gestión de plugins" ::msgcat::mcset es "Plugins" "Plugins" ::msgcat::mcset es "Plugins options." "Opciones de plugins." ::msgcat::mcset es "PNG images" "PNG" ::msgcat::mcset es "Policy Violation" "Violación de la Política" ::msgcat::mcset es "Popup menu" "Menú emergente" ::msgcat::mcset es "Port for outgoing HTTP file transfers (0 for assigned\ automatically). This is useful when sending files from behind a NAT\ with a forwarded port." "Puerto para las transferencias de fichero\ HTTP salientes (0 para asignarlo automáticamente). Esto es útil\ cuando se envían ficheros desde de detrás de una NAT con una\ redirección de puerto." ::msgcat::mcset es "Port:" "Puerto:" ::msgcat::mcset es "Postal Code" "Código Postal" ::msgcat::mcset es "Postal Code:" "Código Postal:" ::msgcat::mcset es "Postal code:" "Código Postal:" ::msgcat::mcset es "Preferred:" "Preferido:" ::msgcat::mcset es "Prefix" "Prefijo" ::msgcat::mcset es "Prefix:" "Prefijo:" ::msgcat::mcset es "Presence" "Presencia" ::msgcat::mcset es "presence" "presencia" ::msgcat::mcset es "Presence bar" "Barra de presencia" ::msgcat::mcset es "Presence information" "Información de presencia" ::msgcat::mcset es "Presence is signed" "La presencia está firmada" ::msgcat::mcset es "Presence-in" "Presencia-entra" ::msgcat::mcset es "Presence-out" "Presencia-sale" ::msgcat::mcset es "Pretty print incoming and outgoing XML stanzas." "Mostrar\ el XML bonito para las stanzas XML." ::msgcat::mcset es "Pretty print XML" "Mostrar XML bonito" ::msgcat::mcset es "Prev" "Prev" ::msgcat::mcset es "Prev bookmark" "Marcador anterior" ::msgcat::mcset es "Prev highlighted" "Resaltado anterior" ::msgcat::mcset es "Previous/Next history message" "Mensaje de historial\ anterior/siguiente" ::msgcat::mcset es "Previous/Next tab" "Pestaña anterior/siguiente" ::msgcat::mcset es "Priority." "Prioridad." ::msgcat::mcset es "Priority:" "Prioridad:" ::msgcat::mcset es "Privacy list is activated" "La lista de privacidad está\ activada" ::msgcat::mcset es "Privacy list is not activated" "La lista de privacidad no\ está activada" ::msgcat::mcset es "Privacy list is not created" "La lista de privacidad no\ está creada" ::msgcat::mcset es "Privacy lists" "Listas de privacidad" ::msgcat::mcset es "Privacy lists are not implemented" "Las listas de\ privacidad no están implementadas en el servidor" ::msgcat::mcset es "Privacy lists are unavailable" "Las listas de privacidad\ no están disponibles" ::msgcat::mcset es "Privacy lists error" "Error en las listas de privacidad" ::msgcat::mcset es "Privacy rules" "Reglas de privacidad" ::msgcat::mcset es "privacy rules" "reglas de privacidad" ::msgcat::mcset es "Profile" "Perfil" ::msgcat::mcset es "Profiles" "Perfiles" ::msgcat::mcset es "Propose to configure newly created MUC room. If set to\ false then the default room configuration is automatically accepted."\ "Proponer configurar la sala de charla MUC recién creada. Si se\ desactiva esta opción la configuración por defecto de la sala se\ aceptará automáticamente." ::msgcat::mcset es "Protocol:" "Protocolo:" ::msgcat::mcset es "proud" "orgulloso" ::msgcat::mcset es "Proxy" "Proxy" ::msgcat::mcset es "Proxy authentication required" "Se requiere autenticación\ en el proxy" ::msgcat::mcset es "Proxy password:" "Contraseña del proxy:" ::msgcat::mcset es "Proxy port:" "Puerto del proxy:" ::msgcat::mcset es "Proxy server:" "Servidor proxy:" ::msgcat::mcset es "Proxy type:" "Tipo de proxy:" ::msgcat::mcset es "Proxy username:" "Nombre de usuario de proxy:" ::msgcat::mcset es "Pub/sub" "Pub/sub" ::msgcat::mcset es "Publish" "Publicado" ::msgcat::mcset es "Publish \"playback stopped\" instead" "Publicar \"se ha\ detenido la canción\" en su lugar" ::msgcat::mcset es "Publish node" "Publicar nodo" ::msgcat::mcset es "Publish user activity..." "Publicar la actividad..." ::msgcat::mcset es "Publish user location..." "Publicar localización de\ usuario..." ::msgcat::mcset es "Publish user mood..." "Publicar estado de ánimo..." ::msgcat::mcset es "Publish user tune..." "Publicar canción de usuario..." ::msgcat::mcset es "Publisher" "Publicador" ::msgcat::mcset es "Publishing is only possible while being online" "Solo\ puedes publicar cuando estás conectado" ::msgcat::mcset es "Pubsub request failed: %s" "Fallo en la petición Pubsub:\ %s" ::msgcat::mcset es "Pubsub request succeeded" "Éxito en la petición Pubsub" ::msgcat::mcset es "Purge all messages" "Purgar todos los mensajes" ::msgcat::mcset es "Purge message" "Purgar mensaje" ::msgcat::mcset es "Purge seen messages" "Purgar mensajes vistos" ::msgcat::mcset es "Purged all abbreviations" "Purgadas todas las\ abreviaturas" ::msgcat::mcset es "Quick Help" "Ayuda rápida" ::msgcat::mcset es "Quick help" "Ayuda rápida" ::msgcat::mcset es "Quit" "Salir" ::msgcat::mcset es "Quote" "Cita" ::msgcat::mcset es "Raise new tab." "Levantar nueva pestaña." ::msgcat::mcset es "Rating:" "Valoración:" ::msgcat::mcset es "Raw XML" "XML crudo" ::msgcat::mcset es "Read on..." "Leer..." ::msgcat::mcset es "reading" "leyendo" ::msgcat::mcset es "Reason" "Razón" ::msgcat::mcset es "Reason:" "Razón:" ::msgcat::mcset es "Receive" "Recibir" ::msgcat::mcset es "Receive error: Stream ID is in use" "Error en la\ recepción: Stream ID está en uso" ::msgcat::mcset es "Receive file from %s" "Recibir fichero de %s" ::msgcat::mcset es "Received by:" "Recibido por:" ::msgcat::mcset es "Received/Sent" "Recibido/Enviado" ::msgcat::mcset es "Recipient Error" "Error de recipiente" ::msgcat::mcset es "Recipient Unavailable" "Recipiente no disponible" ::msgcat::mcset es "Reconnect to server if it does not reply (with result or\ with error) to XMPP ping request in specified time interval (in\ seconds)." "Reconectar al servidor si no responde (ni con respuesta\ ni con error) a una petición XMPP Ping en el intervalo de tiempo\ especificado (en segundos)." ::msgcat::mcset es "Redirect" "Redirección" ::msgcat::mcset es "Redo" "Rehacer" ::msgcat::mcset es "Region:" "Región:" ::msgcat::mcset es "Register" "Registrar" ::msgcat::mcset es "Register in %s" "Registrarse en %s" ::msgcat::mcset es "Registration failed: %s" "El registro ha fallado: %s" ::msgcat::mcset es "Registration is successful!" "¡Registro exitoso!" ::msgcat::mcset es "Registration is successful!" "¡Registro satisfactorio!" ::msgcat::mcset es "Registration Required" "Registro requerido" ::msgcat::mcset es "Registration: %s" "Registro: %s" ::msgcat::mcset es "rehearsing" "ensayando" ::msgcat::mcset es "relaxing" "relajándose" ::msgcat::mcset es "relieved" "aliviado" ::msgcat::mcset es "remorseful" "arrepentido" ::msgcat::mcset es "Remote Connection Failed" "Fallo en la Conexión Remota" ::msgcat::mcset es "Remote control options." "Opciones de control remoto." ::msgcat::mcset es "Remote Server Error" "Error de servidor remoto" ::msgcat::mcset es "Remote Server Not Found" "Servidor remoto no encontrado" ::msgcat::mcset es "Remote Server Timeout" "Intervalo de espera sobrepasado\ esperando al Servidor remoto" ::msgcat::mcset es "Remove" "Eliminar" ::msgcat::mcset es "Remove all users in group..." "Eliminar todos los\ usuarios del grupo..." ::msgcat::mcset es "Remove from list" "Eliminar de la lista" ::msgcat::mcset es "Remove from metacontact" "Borrar del metacontacto" ::msgcat::mcset es "Remove from roster..." "Borrar contacto..." ::msgcat::mcset es "Remove group..." "Eliminar grupo..." ::msgcat::mcset es "Remove list" "Eliminar lista" ::msgcat::mcset es "Rename group..." "Renombrar grupo..." ::msgcat::mcset es "Rename roster group" "Renombrar grupo de la lista de\ contactos" ::msgcat::mcset es "Repeat new password:" "Repite la contraseña nueva:" ::msgcat::mcset es "Replace opened connections" "Reemplazar conexiones\ abiertas" ::msgcat::mcset es "Replace opened connections." "Reemplazar conexiones\ abiertas." ::msgcat::mcset es "Reply" "Responder" ::msgcat::mcset es "Reply subject:" "Tema de la respuesta:" ::msgcat::mcset es "Reply to" "Responder a" ::msgcat::mcset es "Reply to current time (jabber:iq:time) requests."\ "Responder las peticiones sobre el tiempo actual (jabber:iq:time)." ::msgcat::mcset es "Reply to entity time (urn:xmpp:time) requests."\ "Responder a peticiones de 'fecha de la entidad' (urn:xmpp:time)." ::msgcat::mcset es "Reply to idle time (jabber:iq:last) requests." "Responder\ a peticiones sobre el tiempo que llevas ausente (jabber:iq:last)." ::msgcat::mcset es "Reply to room" "Responder a la sala" ::msgcat::mcset es "Reply to version (jabber:iq:version) requests."\ "Responder a las peticiones sobre la versión del programa\ (jabber:iq:version)." ::msgcat::mcset es "Reply to XMPP ping requests." "Responder a peticiones\ XMPP Ping." ::msgcat::mcset es "Report the list of current MUC rooms on disco#items\ query." "Mostrar la lista de salas de charla MUC actuales en\ peticiones disco#items." ::msgcat::mcset es "Request" "Petición" ::msgcat::mcset es "Request default configuration" "Solicitar configuración\ por defecto" ::msgcat::mcset es "Request Error" "Error en la petición" ::msgcat::mcset es "Request failed: %s" "Petición fallida: %s" ::msgcat::mcset es "Request only unseen (which aren't displayed in the chat\ window) messages in the history in MUC compatible conference rooms."\ "Solicitar solo mensajes del historial de las salas de charla MUC que\ no se hayan visto (que no se muestran en la ventana de la charla." ::msgcat::mcset es "Request rejected or failed" "La petición ha sido\ rechazada o ha fallado" ::msgcat::mcset es "Request subscription" "Solicitar subscripción" ::msgcat::mcset es "Request Timeout" "Timeout de la petición" ::msgcat::mcset es "Request unsubscription" "Solicitar desuscripción" ::msgcat::mcset es "Requesting conference list: %s" "Solicitando la lista de\ conferencias: %s" ::msgcat::mcset es "Requesting ignore list: %s" "Solicitando la lista de\ ignorados: %s" ::msgcat::mcset es "Requesting invisible list: %s" "Solicitando la lista de\ invisibles: %s" ::msgcat::mcset es "Requesting privacy list: %s" "Solicitando lista de\ privacidad: %s" ::msgcat::mcset es "Requesting privacy rules: %s" "Solicitando reglas de\ privacidad: %s" ::msgcat::mcset es "Requesting visible list: %s" "Solicitando la lista de\ visibles: %s" ::msgcat::mcset es "Reset to current value" "Devolver al valor actual" ::msgcat::mcset es "Reset to default value" "Devolver al valor por defecto" ::msgcat::mcset es "Reset to saved value" "Devolver al valor guardado" ::msgcat::mcset es "Reset to value from config file" "Devolver al valor del\ fichero de configuración" ::msgcat::mcset es "Resource Constraint" "Coacción en el recurso" ::msgcat::mcset es "Resource." "Recurso." ::msgcat::mcset es "Resource:" "Recurso:" ::msgcat::mcset es "restless" "inquieto" ::msgcat::mcset es "Restricted XML" "XML Restringido" ::msgcat::mcset es "Resubscribe to all users in group..." "Resubscribir a\ todos los usuarios en el grupo..." ::msgcat::mcset es "Retract node" "Retirar nodo" ::msgcat::mcset es "Retrieve offline messages using POP3-like protocol."\ "Recuperar mensajes diferidos usando un protocolo similar a POP3." ::msgcat::mcset es "Retrieve subscriptions" "Conseguir subscripciones" ::msgcat::mcset es "Retry to connect forever." "Intentar reconectar\ infinitamente." ::msgcat::mcset es "Returning from auto-away" "Volviendo de auto ausencia" ::msgcat::mcset es "Revoke Admin Privileges" "Revocar privilegios de\ Administrador" ::msgcat::mcset es "Revoke Membership" "Revocar Membresía" ::msgcat::mcset es "Revoke Moderator Privileges" "Revocar privilegios de\ Moderador" ::msgcat::mcset es "Revoke Owner Privileges" "Revocar privilegios de Dueño" ::msgcat::mcset es "Revoke subscription" "Revocar subscripción" ::msgcat::mcset es "Revoke Voice" "Revocar Voz" ::msgcat::mcset es "Right" "Derecha" ::msgcat::mcset es "Right mouse button" "Botón derecho del ratón" ::msgcat::mcset es "Role" "Rol" ::msgcat::mcset es "Role:" "Rol:" ::msgcat::mcset es "Room %s is successfully created" "Se ha creado\ correctamente la sala %s" ::msgcat::mcset es "Room is created" "Se ha creado la sala" ::msgcat::mcset es "Room is destroyed" "Se ha destruido la sala" ::msgcat::mcset es "Room:" "Habitación:" ::msgcat::mcset es "Roster" "Lista de contactos" ::msgcat::mcset es "Roster Files" "Archivos de lista de contactos" ::msgcat::mcset es "Roster filter." "Filtro de contactos." ::msgcat::mcset es "Roster group:" "Grupo de contactos:" ::msgcat::mcset es "Roster import for %s is completed" "Completada la\ importación de lista de contactos de %s" ::msgcat::mcset es "Roster item may be dropped not only over group name but\ also over any item in group." "Al coger y arrastra elementos de la\ lista de contactos, se les puede soltar en cualquier parte de un\ grupo, no solo sobre el nombre del grupo." ::msgcat::mcset es "Roster Notes" "Notas" ::msgcat::mcset es "Roster options." "Opciones de la lista de contactos." ::msgcat::mcset es "roster plugins" "plugins de lista de contactos" ::msgcat::mcset es "running" "corriendo" ::msgcat::mcset es "running an errand" "haciendo un recado" ::msgcat::mcset es "sad" "triste" ::msgcat::mcset es "sarcastic" "sarcástico" ::msgcat::mcset es "SASL auth error:\n%s" "Error en la autenticación\ SASL:\n%s" ::msgcat::mcset es "SASL authentication aborted" "Autenticación SASL\ abortada" ::msgcat::mcset es "SASL authentication timed out" "Autenticación SASL ha\ caducado" ::msgcat::mcset es "SASL callback error: client needs to write \"%s\"" "Error\ en el SASL Callback: el cliente debe escribir \"%s\"" ::msgcat::mcset es "SASL step error: %s" "Error en el paso SASL: %s" ::msgcat::mcset es "Save" "Guardar" ::msgcat::mcset es "Save as:" "Guardar como:" ::msgcat::mcset es "Save state" "Guardar estado" ::msgcat::mcset es "Save state on exit" "Guardar estado al salir" ::msgcat::mcset es "Save state on Tkabber exit." "Guardar estado al cerra\ Tkabber." ::msgcat::mcset es "Save To Log" "Guardar en log" ::msgcat::mcset es "scheduled holiday" "vacaciones planificadas" ::msgcat::mcset es "Screenname conversion" "Conversión de dirección" ::msgcat::mcset es "Screenname:" "Dirección del contacto:" ::msgcat::mcset es "Screenname: %s\n\nConverted JID: %s" "Dirección del\ contacto: %s\n\nJID convertido: %s" ::msgcat::mcset es "Scroll chat window up/down" "Desplazar ventana de charla\ arriba/abajo" ::msgcat::mcset es "Search" "Buscar" ::msgcat::mcset es "Search again" "Otra búsqueda" ::msgcat::mcset es "Search down" "Buscar abajo" ::msgcat::mcset es "Search in %s" "Buscar en %s" ::msgcat::mcset es "Search in %s: No matching items found" "Búsqueda en %s:\ No se han encontrado elementos que coincidan" ::msgcat::mcset es "Search in Tkabber windows options." "Buscar en las\ opciones de ventana de Tkabber" ::msgcat::mcset es "search plugins" "plugins de búsqueda" ::msgcat::mcset es "Search up" "Buscar arriba" ::msgcat::mcset es "Search: %s" "Buscar: %s" ::msgcat::mcset es "searching" "buscando" ::msgcat::mcset es "second" "segundo" ::msgcat::mcset es "seconds" "segundos" ::msgcat::mcset es "See Other Host" "Ver Otros Hosts" ::msgcat::mcset es "Select" "Seleccionar" ::msgcat::mcset es "Select Key for Signing %s Traffic" "Seleccionar clave\ para firmar el tráfico de %s" ::msgcat::mcset es "Select month:" "Seleccionar mes:" ::msgcat::mcset es "Self signed certificate" "Certificado auto firmado" ::msgcat::mcset es "Send" " Enviar " ::msgcat::mcset es "Send broadcast message..." "Enviar mensaje de\ difusión..." ::msgcat::mcset es "Send contacts to %s" "Enviar contactos a %s" ::msgcat::mcset es "Send custom presence" "Enviar presencia personalizada" ::msgcat::mcset es "Send file to %s" "Enviar fichero a %s" ::msgcat::mcset es "Send file..." "Enviar fichero..." ::msgcat::mcset es "Send message" "Enviar mensaje" ::msgcat::mcset es "Send message of the day..." "Enviar mensaje del día..." ::msgcat::mcset es "Send message to %s" "Enviar mensaje a %s" ::msgcat::mcset es "Send message to all users in group..." "Enviar mensaje a\ todos los usuarios del grupo..." ::msgcat::mcset es "Send message to group" "Enviar mensaje al grupo" ::msgcat::mcset es "Send message to group %s" "Enviar mensaje al grupo %s" ::msgcat::mcset es "Send message..." "Enviar mensaje..." ::msgcat::mcset es "Send request to: " "Enviar petición a: " ::msgcat::mcset es "Send subscription at %s" "Enviar subscripción a %s" ::msgcat::mcset es "Send subscription request" "Enviar petición de\ subscripción" ::msgcat::mcset es "Send subscription request to %s" "Enviar petición de\ subscripción a %s" ::msgcat::mcset es "Send subscription to: " "Enviar subscripción a: " ::msgcat::mcset es "Send to server" "Enviar al servidor" ::msgcat::mcset es "Send users..." "Enviar usuarios..." ::msgcat::mcset es "Sending %s %s list" "Enviando %s la lista %s" ::msgcat::mcset es "Sending conference list: %s" "Enviando la lista de\ conferencias: %s" ::msgcat::mcset es "Sending configure form" "Enviando formulario de\ configuración" ::msgcat::mcset es "Sending ignore list: %s" "Enviando la lista de ignorados:\ %s" ::msgcat::mcset es "Sending invisible list: %s" "Enviando la lista de\ invisibles: %s" ::msgcat::mcset es "Sending visible list: %s" "Enviando la lista de visibles:\ %s" ::msgcat::mcset es "September" "Septiembre" ::msgcat::mcset es "Sergei Golovan" "Sergei Golovan" ::msgcat::mcset es "Serial number" "Número de serie" ::msgcat::mcset es "Serialized array of proxy servers to connect via." "Lista\ serializada de servidores proxy por los que conectar." ::msgcat::mcset es "serious" "serio" ::msgcat::mcset es "Server cannot reach client's identd" "El servidor no\ puede contactar con el identd del cliente" ::msgcat::mcset es "Server doesn't support digest non-SASL authentication"\ "El servidor no soporta autenticación no-SASL con resumen de\ contraseña" ::msgcat::mcset es "Server doesn't support plaintext non-SASL authentication"\ "El servidor no soporta autenticación no-SASL con contraseña en texto\ plano" ::msgcat::mcset es "Server doesn't support plaintext or digest non-SASL\ authentication" "El servidor no soporta autenticación no-SASL con\ contraseña en texto plano o en resumen" ::msgcat::mcset es "Server Error" "Error de servidor" ::msgcat::mcset es "Server hasn't provided compress feature" "El servidor no\ ha indicado que sea capaz de comprimir" ::msgcat::mcset es "Server hasn't provided non-SASL authentication feature"\ "El servidor no ha anunciado soporte para autenticación no-SASL" ::msgcat::mcset es "Server hasn't provided SASL authentication feature" "El\ servidor no ha indicado que permita autenticación con SASL" ::msgcat::mcset es "Server hasn't provided supported compress method" "El\ servidor no ha indicado un método de compresión que puedas usar" ::msgcat::mcset es "Server haven't provided STARTTLS feature" "El servidor no\ ha anunciado soporte de STARTTLS" ::msgcat::mcset es "Server message" "Mensaje del servidor" ::msgcat::mcset es "Server name or IP-address." "Nombre del servidor o\ dirección IP." ::msgcat::mcset es "Server name." "Nombre del servidor." ::msgcat::mcset es "Server port." "Puerto del servidor." ::msgcat::mcset es "Server provided mechanism %s. It is forbidden" "El\ servidor proporcionó el mecanismo %s. Está prohibido" ::msgcat::mcset es "Server provided mechanisms %s. They are forbidden" "El\ servidor proporcionó los mecanismos %s. Están prohibidos" ::msgcat::mcset es "Server provided no SASL mechanisms" "El servidor no\ proporcionó ningún mecanismo SASL" ::msgcat::mcset es "Server:" "Servidor:" ::msgcat::mcset es "Service Discovery" "Descubridor de servicios" ::msgcat::mcset es "service discovery" "descubrimiento de servicios" ::msgcat::mcset es "Service info" "Información del servicio" ::msgcat::mcset es "Service statistics" "Estadísticas del servicio" ::msgcat::mcset es "Service Unavailable" "Servicio no disponible" ::msgcat::mcset es "Session key bits" "Bits the la llave de sesión" ::msgcat::mcset es "Set" "Fijar" ::msgcat::mcset es "Set bookmark" "Guardar marcador" ::msgcat::mcset es "Set for current and future sessions" "Modificar y\ guardar" ::msgcat::mcset es "Set for current session only" "Modificar solo para esta\ sesión (no guardar)" ::msgcat::mcset es "Set priority to 0 when moving to extended away state."\ "Ponerte prioridad 0 cuando te cambia a 'muy ausente'" ::msgcat::mcset es "Settings of rich text facility which is used to render\ chat messages and logs." "Opciones de texto enriquecido cuando se\ muestran mensajes en ventanas de charla e historiales." ::msgcat::mcset es "SHA1 hash" "Hash SHA1" ::msgcat::mcset es "shaving" "afeitándose" ::msgcat::mcset es "shocked" "consternado" ::msgcat::mcset es "shopping" "de compras" ::msgcat::mcset es "Show" " Mostrar " ::msgcat::mcset es "Show balloons with headline messages over tree nodes."\ "Mostrar los mensajes de los titulares en globos sobre los nodos del\ árbol." ::msgcat::mcset es "Show console" "Mostrar consola" ::msgcat::mcset es "Show detailed info on conference room members in roster\ item tooltips." "Mostrar información detallada sobre los miembros de\ una sala de charla en los 'tooltips' de la lista de contactos." ::msgcat::mcset es "Show emoticons" "Mostrar emoticonos" ::msgcat::mcset es "Show history" "Mostrar historial" ::msgcat::mcset es "Show images for emoticons." "Mostrar imágenes de\ emoticonos." ::msgcat::mcset es "Show info" "Mostrar información" ::msgcat::mcset es "Show IQ requests in the status line." "Mostrar peticiones\ IQ en la línea de estado." ::msgcat::mcset es "Show main window" "Mostrar ventana principal" ::msgcat::mcset es "Show menu tearoffs when possible." "Mostrar tiras en los\ menus cuando sea posible." ::msgcat::mcset es "Show my own resources in the roster." "Mostrar mis\ propios recursos en la lista de contactos." ::msgcat::mcset es "Show native icons for contacts, connected to\ transports/services in roster." "Mostrar iconos nativos para los\ contactos conectados a través de transportes en la lista de\ contactos." ::msgcat::mcset es "Show native icons for transports/services in roster."\ "Mostrar iconos nativos para transportes/servicios en la lista de\ contactos." ::msgcat::mcset es "Show number of unread messages in tab titles." "Mostrar\ cantidad de mensajes sin leer en el título de la pestaña." ::msgcat::mcset es "Show offline users" "Mostrar contactos desconectados" ::msgcat::mcset es "Show online users only" "Mostrar solo usuarios\ conectados" ::msgcat::mcset es "Show only online users in roster." "Mostrar solo\ contactos conectados." ::msgcat::mcset es "Show only the number of personal unread messages in\ window title." "Mostrar en el título de la ventana solamente el\ número de mensajes personales nuevos." ::msgcat::mcset es "Show own resources" "Mostrar los propios recursos" ::msgcat::mcset es "Show palette of emoticons" "Mostrar paleta de emoticonos" ::msgcat::mcset es "Show presence bar." "Mostrar barra de presencia." ::msgcat::mcset es "Show status bar." "Mostrar barra de estado." ::msgcat::mcset es "Show subscription type in roster item tooltips." "Mostrar\ tipo de subscripción en el globo informativo de la lista de\ contactos." ::msgcat::mcset es "Show TkCon console" "Mostrar consola TkCon" ::msgcat::mcset es "Show Toolbar." "Mostrar Barra de Herramientas." ::msgcat::mcset es "Show user or service info" "Mostrar información de\ usuario o servicio" ::msgcat::mcset es "Show user or service info..." "Mostrar información de\ usuario o servicio..." ::msgcat::mcset es "shy" "tímido" ::msgcat::mcset es "SI connection closed" "Conexión SI cerrada" ::msgcat::mcset es "sick" "enfermo" ::msgcat::mcset es "Side where to place tabs in tabbed mode." "Lugar donde\ poner las pestañas en el modo de pestañas." ::msgcat::mcset es "Sign traffic" "Firmar tráfico" ::msgcat::mcset es "Signature not processed due to missing key" "Firma no\ procesada porque falta la llave" ::msgcat::mcset es "Single window" "Ventana individual" ::msgcat::mcset es "Size:" "Tamaño:" ::msgcat::mcset es "skiing" "esquiando" ::msgcat::mcset es "sleeping" "durmiendo" ::msgcat::mcset es "sleepy" "adormilado" ::msgcat::mcset es "Smart autoscroll" "Desplazamiento automático inteligente" ::msgcat::mcset es "socializing" "socializando" ::msgcat::mcset es "SOCKS authentication failed" "Falló la autenticación\ SOCKS" ::msgcat::mcset es "SOCKS command not supported" "Comando SOCKS no soportado" ::msgcat::mcset es "SOCKS connection not allowed by ruleset" "Conexión SOCKS\ no permitida por las reglas" ::msgcat::mcset es "SOCKS request failed" "Falló la petición SOCKS" ::msgcat::mcset es "SOCKS server cannot identify username" "El servidor SOCKS\ no puede identificar el nombre de usuario" ::msgcat::mcset es "SOCKS server username identification failed" "Falló la\ identificación del nombre de usuario en el servidor SOCKS" ::msgcat::mcset es "SOCKS4a" "SOCKS4a" ::msgcat::mcset es "SOCKS4a proxy negotiation aborted" "Negociación de proxy\ SOCKS4a abortada" ::msgcat::mcset es "SOCKS4a proxy negotiation timed out" "Negociación de\ proxy SOCKS4a caducada" ::msgcat::mcset es "SOCKS5" "SOCKS5" ::msgcat::mcset es "SOCKS5 negotiation timed out" "La negociación SOCKS5 ha\ caducado" ::msgcat::mcset es "SOCKS5 proxy negotiation aborted" "La negociación de\ proxy SOCKS5 ha sido abortada" ::msgcat::mcset es "SOCKS5 server authorization failed" "La autorización en\ servidor SOCKS5 ha fallado" ::msgcat::mcset es "SOCKS5 server authorization required" "Se requiere\ autorización en servidor SOCKS5" ::msgcat::mcset es "Sort" "Ordenar" ::msgcat::mcset es "Sort by date" "Ordenar por fecha" ::msgcat::mcset es "Sort by from" "Ordenar por emisor" ::msgcat::mcset es "Sort by node" "Ordenar por nodo" ::msgcat::mcset es "Sort by type" "Ordenar por tipo" ::msgcat::mcset es "Sort items by JID/node" "Ordenar elementos por JID/nodo" ::msgcat::mcset es "Sort items by name" "Ordenar elementos por nombre" ::msgcat::mcset es "Sound" "Sonido" ::msgcat::mcset es "sound" "sonido" ::msgcat::mcset es "Sound options." "Opciones de sonido." ::msgcat::mcset es "Sound to play when available presence is received."\ "Sonido a reproducir cuando se recibe una presencia 'conectado'." ::msgcat::mcset es "Sound to play when connected to Jabber server." "Sonido a\ reproducir cuando se conecta al servidor Jabber." ::msgcat::mcset es "Sound to play when disconnected from Jabber server."\ "Sonido a reproducir cuando se desconecte el servidor Jabber." ::msgcat::mcset es "Sound to play when groupchat message from me is\ received." "Sonido a reproducir cuando se recibe un mensaje de sala\ mio." ::msgcat::mcset es "Sound to play when groupchat message is received."\ "Sonido a reproducir cuando se recibe un mensaje de sala" ::msgcat::mcset es "Sound to play when groupchat server message is received."\ "Sonido a reproducir cuando se recibe un mensaje de sala del\ servidor." ::msgcat::mcset es "Sound to play when highlighted (usually addressed\ personally) groupchat message is received." "Sonido a reproducir\ cuando se recibe un mensaje de sala resaltado (normalmente dirigido a\ ti)." ::msgcat::mcset es "Sound to play when personal chat message is received."\ "Sonido a reproducir cuando se recibe un mensaje personal." ::msgcat::mcset es "Sound to play when sending personal chat message."\ "Sonido a reproducir cuando se envía un mensaje personal." ::msgcat::mcset es "Sound to play when unavailable presence is received."\ "Sonido a reproducir cuando se recibe una presencia 'desconectado'." ::msgcat::mcset es "Source:" "Fuente:" ::msgcat::mcset es "Specifies search mode while searching in chat, log or\ disco windows. \"substring\" searches exact substring, \"glob\" uses\ glob style matching, \"regexp\" allows to match regular expression."\ "Especifica el modo de búsqueda. \"substring\" busca la subcadena\ exacta, \"glob\" usa concordancia de estilo glob, \"regexp\" permite\ usar expresiones regulares." ::msgcat::mcset es "Speed:" "Velocidad:" ::msgcat::mcset es "Spell check options." "Opciones de correción\ ortográfica." ::msgcat::mcset es "SSL & Compression" "Cifrado y Compresión" ::msgcat::mcset es "SSL certificate file (optional)." "Fichero de certificado\ SSL (opcional)." ::msgcat::mcset es "SSL certificate:" "Certificado SSL:" ::msgcat::mcset es "SSL certification authority file or directory\ (optional)." "Autoridad certificadora o directorio de SSL\ (opcional)." ::msgcat::mcset es "SSL private key file (optional)." "Fichero de clave SSL\ privada (opcional)." ::msgcat::mcset es "Start chat" "Charlar en privado" ::msgcat::mcset es "Starting auto-away" "Pasando a auto ausencia" ::msgcat::mcset es "STARTTLS aborted" "STARTTLS ha sido abortado" ::msgcat::mcset es "STARTTLS failed" "STARTTLS falló" ::msgcat::mcset es "STARTTLS successful" "STARTTLS exitoso" ::msgcat::mcset es "STARTTLS timed out" "STARTTLS ha caducado" ::msgcat::mcset es "State" "Estado" ::msgcat::mcset es "State " "Comunidad " ::msgcat::mcset es "State:" "Estado/Provincia:" ::msgcat::mcset es "Statistics" "Estadísticas" ::msgcat::mcset es "Statistics monitor" "Monitor de estadísticas" ::msgcat::mcset es "Status bar" "Barra de estado" ::msgcat::mcset es "Stop autoscroll" "No desplazar automáticamente en\ vertical" ::msgcat::mcset es "Stop chat window autoscroll." "Desactivar el\ desplazamiento automático de la ventana de charla." ::msgcat::mcset es "Store" "Guardar" ::msgcat::mcset es "Store group chats logs." "Guardar registro de charlas en\ grupo." ::msgcat::mcset es "Store private chats logs." "Guardar registro de charlas\ privadas." ::msgcat::mcset es "Stored collapsed roster groups." "Almacenar el estado de\ los grupos colapsados en la lista de contactos." ::msgcat::mcset es "Stored main window geometry" "Guardar geometría de la\ ventana principal" ::msgcat::mcset es "Stored main window geometry in non-tabbed mode" "Guardar\ geometría de la ventana principal del modo sin pestañas" ::msgcat::mcset es "Stored main window state (normal or zoomed)" "Guardar\ estado de la ventana principal (normal o maximizado)" ::msgcat::mcset es "Stored main window state (normal or zoomed) in non-tabbed\ mode" "Guardar estado (normal o aumentado) de la ventana principal\ del modo sin pestañas" ::msgcat::mcset es "Stored show offline roster groups." "Almacenar si se\ muestra o no los grupos desconectados en la lista de contactos." ::msgcat::mcset es "Stored user priority." "Prioridad del usuario\ almacenada." ::msgcat::mcset es "Stored user status." "Estado del usuario almacenado." ::msgcat::mcset es "Stored user text status." "Texto de estado del usuario\ almacenado." ::msgcat::mcset es "Storing conferences failed: %s" "Fallo almacenando las\ salas de charla: %s" ::msgcat::mcset es "Storing roster metacontacts failed: %s" "Fallo al guardar\ metacontactos: %s" ::msgcat::mcset es "Storing roster notes failed: %s" "Falló el almacenamiento\ de notas: %s" ::msgcat::mcset es "Stream Error" "Error en el Stream" ::msgcat::mcset es "Stream Error (%s)" "Error en el Stream (%s)" ::msgcat::mcset es "Stream Error (%s): %s" "Error en el Stream (%s): %s" ::msgcat::mcset es "Stream Error: %s" "Error en el Stream : %s" ::msgcat::mcset es "Stream initiation options." "Opciones de iniciación de\ Envío" ::msgcat::mcset es "Stream method negotiation failed" "Falló la negociación\ del método de Stream" ::msgcat::mcset es "Street:" "Calle:" ::msgcat::mcset es "stressed" "estresado" ::msgcat::mcset es "Strip leading \"http://jabber.org/protocol/\" from IQ\ namespaces in the status line." "Quitar el\ \"http://jabber.org/protocol/\" del principio en los nombres de\ espacio de IQ en la línea de comandos." ::msgcat::mcset es "studying" "estudiando" ::msgcat::mcset es "Subactivity" "Subactividad" ::msgcat::mcset es "Subactivity:" "Subactividad:" ::msgcat::mcset es "SubID" "SubID" ::msgcat::mcset es "Subject" "Asunto" ::msgcat::mcset es "Subject is set to: %s" "El asunto se ha puesto a: %s" ::msgcat::mcset es "Subject:" "Asunto:" ::msgcat::mcset es "Subject: " "Asunto: " ::msgcat::mcset es "Submit" "Enviar" ::msgcat::mcset es "Subscribe" "Subscribir" ::msgcat::mcset es "Subscribe to a node" "Subscribir a nodo" ::msgcat::mcset es "Subscribed" "Subscrito" ::msgcat::mcset es "Subscription" "Subscripción" ::msgcat::mcset es "Subscription request from %s" "Petición de subscripción\ de %s" ::msgcat::mcset es "Subscription request from:" "Petición de subscripción\ de:" ::msgcat::mcset es "Subscription Required" "Se requiere subscripción" ::msgcat::mcset es "Subscription:" "Subscripción:" ::msgcat::mcset es "Subscriptions to pubsub nodes at %s" "Subscripciones a\ nodos pubsub en %s" ::msgcat::mcset es "Substrings to highlight in messages." "Sílabas a resaltar\ en los mensajes." ::msgcat::mcset es "Success" "Éxito" ::msgcat::mcset es "Suffix" "Sufijo" ::msgcat::mcset es "Suffix:" "Sufijo:" ::msgcat::mcset es "sunbathing" "bronceándose" ::msgcat::mcset es "surprised" "sorprendido" ::msgcat::mcset es "swimming" "nadando" ::msgcat::mcset es "Switch to tab number 1-9,10" "Cambiar a la pestaña número\ 1-9,10" ::msgcat::mcset es "System Shutdown" "Apagando Sistema" ::msgcat::mcset es "Systray icon blinks when there are unread messages." "El\ icono de la bandeja de sistema parpadea cuando hay mensajes sin\ leer." ::msgcat::mcset es "Systray icon options." "Opciones de la bandeja de\ sistema." ::msgcat::mcset es "Systray:" "Icono de la bandeja de sistema:" ::msgcat::mcset es "Tabs:" "Pestañas:" ::msgcat::mcset es "taking a bath" "bañándose" ::msgcat::mcset es "taking a shower" "duchándose" ::msgcat::mcset es "talking" "hablando" ::msgcat::mcset es "Telephone numbers" "Números de teléfono" ::msgcat::mcset es "Templates" "Plantillas" ::msgcat::mcset es "Temporary auth failure" "Fallo en la autenticación\ temporal" ::msgcat::mcset es "Temporary Error" "Error temporal" ::msgcat::mcset es "Text" "Texto" ::msgcat::mcset es "Text status, which is set when Tkabber is moving to away\ state." "Mensaje de estado que Tkabber te pone cuando te cambia a\ 'ausente' automáticamente." ::msgcat::mcset es "Text:" "Texto:" ::msgcat::mcset es "the option is set and saved." "opción modificada y\ guardada." ::msgcat::mcset es "the option is set to its default value." "opción en su\ valor por defecto." ::msgcat::mcset es "the option is set, but not saved." "opción modificada\ pero no guardada." ::msgcat::mcset es "the option is taken from config file." "opción leída del\ fichero de configuración." ::msgcat::mcset es "The signature is good but has expired" "La firma es buena\ pero ha expirado" ::msgcat::mcset es "The signature is good but the key has expired" "La firma\ es buena pero la llave ha expirado" ::msgcat::mcset es "thirsty" "sediento" ::msgcat::mcset es "This message was forwarded by %s\n" "Este mensaje fue\ reenviado por %s\n" ::msgcat::mcset es "This message was forwarded to %s" "Este mensaje se\ reenvió a %s" ::msgcat::mcset es "This message was sent by %s\n" "Este mensaje fue enviado\ por %s\n" ::msgcat::mcset es "Time" "Hora" ::msgcat::mcset es "time %s%s:" "tiempo %s%s:" ::msgcat::mcset es "time %s%s: %s" "tiempo %s%s: %s" ::msgcat::mcset es "Time interval before playing next sound (in\ milliseconds)." "Intervalo de tiempo entre reproducción de sonidos\ (en milisegundos)." ::msgcat::mcset es "Time Zone:" "Zona horaria:" ::msgcat::mcset es "Time:" "Hora:" ::msgcat::mcset es "Timeout" "Timeout" ::msgcat::mcset es "Timeout for waiting for HTTP poll responses (if set to\ zero, Tkabber will wait forever)." "Timeout a esperar para las\ respuestas de HTTP Poll (si se indica cero, Tkabber esperará para\ siempre)." ::msgcat::mcset es "Timer" "Temporizador" ::msgcat::mcset es "Timestamp:" "Fecha:" ::msgcat::mcset es "Title" "Cargo" ::msgcat::mcset es "Title:" "Cargo:" ::msgcat::mcset es "Tkabber configuration directory transfer failed\ with:\n%s\n Tkabber will use the old directory:\n%s" "Falló la\ transferencia del directorio de configuración de Tkabber:\n%s\n\ Tkabber usará el directorio viejo:\n%s" ::msgcat::mcset es "Tkabber emoticons theme. To make new theme visible for\ Tkabber put it to some subdirectory of %s." "Tema de emoticonos de\ Tkabber. Para instalar un nuevo tema de emoticonos cópialo en un\ subdirectorio de %s." ::msgcat::mcset es "Tkabber icon theme. To make new theme visible for Tkabber\ put it to some subdirectory of %s." "Tema de iconos de Tkabber. Para\ instalar un tema nuevo, cópialo a un subdirectorio de %s." ::msgcat::mcset es "Tkabber save state options." "Opciones de guardado del\ estado de Tkabber." ::msgcat::mcset es "Tkabber Systray" "Icono en la Bandeja de Sistema" ::msgcat::mcset es "TLS handshake failed: %s" "Fallo en la negociación de\ TLS: %s" ::msgcat::mcset es "To" "Para" ::msgcat::mcset es "To:" "Para:" ::msgcat::mcset es "To: " "Para: " ::msgcat::mcset es "Toggle encryption" "Activar/Desactivar cifrado" ::msgcat::mcset es "Toggle encryption (when possible)" "Activar/Desactivar el\ cifrado (cuando sea posible)" ::msgcat::mcset es "Toggle seen" "Activar/Desactivar Leído" ::msgcat::mcset es "Toggle showing offline users" "Activar/Desactivar la\ vista de usuarios desconectados" ::msgcat::mcset es "Toggle signing" "Activar/Desactivar el firmado" ::msgcat::mcset es "Toolbar" "Barra de herramientas" ::msgcat::mcset es "Top" "Arriba" ::msgcat::mcset es "Track:" "Pista:" ::msgcat::mcset es "Transfer failed: %s" "La transferencia falló: %s" ::msgcat::mcset es "Transferring..." "Transfiriendo..." ::msgcat::mcset es "Transport \"%s\" already registered" "El transporte\ \"%s\" ya está registrado" ::msgcat::mcset es "traveling" "viajando" ::msgcat::mcset es "Try again" "Volver a intentarlo" ::msgcat::mcset es "TTL expired" "Expiró el TTL" ::msgcat::mcset es "Tunnel proxies" "Proxies túneles" ::msgcat::mcset es "Type" "Tipo" ::msgcat::mcset es "Unable to encipher data for %s: %s.\n\nEncrypting traffic\ to this user is now disabled.\n\nSend it as PLAINTEXT?" "No se ha\ podido cifrar los datos para %s: %s.\n\nSe ha desactivado el cifrado\ del tráfico con este usuario.\n\n¿Enviar sin cifrar?" ::msgcat::mcset es "Unable to sign message body: %s.\n\nSigning traffic is\ now disabled.\n\nSend it WITHOUT a signature?" "Imposible firmar el\ cuerpo del mensaje: %s.\n\n¿Enviar SIN firma?" ::msgcat::mcset es "Unable to sign presence information: %s.\n\nPresence will\ be sent, but signing traffic is now disabled." "Imposible firmar\ información de presencia: %s.\n\nLa presencia se enviará, pero el\ firmado de tráfico está ahora desactivado." ::msgcat::mcset es "Unauthorized" "No autorizado" ::msgcat::mcset es "Unavailable" "No disponible" ::msgcat::mcset es "Unavailable presence" "Presencia: desconectado" ::msgcat::mcset es "Unconfigured" "No configurado" ::msgcat::mcset es "Undefined" "Indefinido" ::msgcat::mcset es "Undefined Condition" "Condición no definida" ::msgcat::mcset es "Undo" "Deshacer" ::msgcat::mcset es "Unexpected Request" "Petición inesperada" ::msgcat::mcset es "Unit:" "Unidad:" ::msgcat::mcset es "Units" "Unidades" ::msgcat::mcset es "unix plugins" "plugins de unix" ::msgcat::mcset es "unknown" "desconocido" ::msgcat::mcset es "Unknown address type" "Tipo de dirección desconocida" ::msgcat::mcset es "Unknown error" "Error desconocido" ::msgcat::mcset es "Unknown IQ type \"%s\"" "Tipo de IQ desconocido: \"%s\"" ::msgcat::mcset es "Unknown message type %s" "Tipo de mensaje desconocido:\ %s" ::msgcat::mcset es "Unknown SOCKS4a server error" "Error desconocido de\ servidor SOCKS4a" ::msgcat::mcset es "Unknown SOCKS5 destination address type" "El tipo de la\ dirección destino SOCKS5 es desconocido" ::msgcat::mcset es "Unknown transport \"%s\"" "Transporte desconocido:\ \"%s\"" ::msgcat::mcset es "Unpublish" "Despublicar" ::msgcat::mcset es "Unpublish user activity" "Despublicar la actividad de\ usuario" ::msgcat::mcset es "Unpublish user activity..." "Despublicar la actividad..." ::msgcat::mcset es "Unpublish user location" "Despublicar la localización de\ usuario" ::msgcat::mcset es "Unpublish user location..." "Despublicar la localización\ de usuario..." ::msgcat::mcset es "Unpublish user mood" "Despublicar el estado de ánimo del\ usuario" ::msgcat::mcset es "Unpublish user mood..." "Despublicar el estado de\ ánimo..." ::msgcat::mcset es "Unpublish user tune" "Despublicar la canción de usuario" ::msgcat::mcset es "Unpublish user tune..." "Despublicar la canción de\ usuario..." ::msgcat::mcset es "Unpublishing is only possible while being online" "Solo\ puedes despublicar cuando estás conectado" ::msgcat::mcset es "Unrecoverable Error" "Error irrecuperable" ::msgcat::mcset es "Unregister" "Desregistrar" ::msgcat::mcset es "Unsubscribe" "Desubscribir" ::msgcat::mcset es "Unsubscribe from a node" "Desubscribirse de un nodo" ::msgcat::mcset es "Unsubscribed from %s" "Desubscrito de %s" ::msgcat::mcset es "Unsupported compression method" "Método de compresión no\ soportado" ::msgcat::mcset es "Unsupported Encoding" "Codificación No Soportada" ::msgcat::mcset es "Unsupported log dir format" "Formato del directorio de\ históricos no soportado" ::msgcat::mcset es "Unsupported proxy \"%s\"" "Proxy no soportado \"%s\"" ::msgcat::mcset es "Unsupported SOCKS authentication method" "Método de\ autenticación SOCKS no soportado" ::msgcat::mcset es "Unsupported SOCKS method" "Método SOCKS no soportado" ::msgcat::mcset es "Unsupported SOCKS5 authorization method" "Método de\ autorización SOCKS5 no soportado" ::msgcat::mcset es "Unsupported Stanza Type" "Tipo de Stanza No Soportado" ::msgcat::mcset es "Unsupported stream XMLNS \"%s\"" "No está soportado ese\ XMLNS de stream: \"%s\"" ::msgcat::mcset es "Unsupported Version" "Versión No Soportada" ::msgcat::mcset es "Up" "Arriba" ::msgcat::mcset es "Update" "Actualizar" ::msgcat::mcset es "Update item" "Actualizar elemento" ::msgcat::mcset es "Update message of the day..." "Actualizar mensaje del\ día..." ::msgcat::mcset es "Uptime" "Tiempo activo" ::msgcat::mcset es "URI:" "URI:" ::msgcat::mcset es "URL" "URL" ::msgcat::mcset es "URL to connect to." "URL a la que conectar." ::msgcat::mcset es "URL to poll:" "URL para Poll:" ::msgcat::mcset es "URL:" "URL:" ::msgcat::mcset es "Usage: /abbrev WHAT FOR" "Usar: /abbrev ABREVIADO TEXTO" ::msgcat::mcset es "Usage: /unabbrev WHAT" "Usar: /unabbrev ABREVIADO" ::msgcat::mcset es "Usage: ::xmpp::Set xlib property ?value?" "Modo de uso:\ ::xmpp::Set xlib propiedad ?valor?" ::msgcat::mcset es "Use client security keys" "Usar claves de seguridad del\ cliente" ::msgcat::mcset es "Use colored messages" "Usar mensajes coloreados" ::msgcat::mcset es "Use colored nicks" "Usar apodos coloreados" ::msgcat::mcset es "Use colored nicks in chat windows." "Usar apodos\ coloreados en ventanas de charla." ::msgcat::mcset es "Use colored nicks in groupchat rosters." "Usar apodos\ coloreados en la lista de participantes de una sala de charla." ::msgcat::mcset es "Use colored roster nicks" "Usar apodos coloreados en la\ lista de contactos" ::msgcat::mcset es "Use connection:" "Usar conexión:" ::msgcat::mcset es "Use explicitly-specified server address and port." "Usar\ dirección y puerto del servidor definidas explícitamente." ::msgcat::mcset es "Use HTTP poll client security keys (recommended)." "Usar\ claves de seguridad del cliente HTTP Poll (recomendado)." ::msgcat::mcset es "Use HTTP poll connection method." "Usar método de\ conexión HTTP Poll." ::msgcat::mcset es "Use mediated SOCKS5 connection if proxy is available."\ "Usar conexión SOCKS5 mediada si el proxy está disponible." ::msgcat::mcset es "Use only whole words for emoticons." "Usar solo palabras\ completas para los emoticonos." ::msgcat::mcset es "Use roster filter" "Usar filtro de contactos" ::msgcat::mcset es "Use roster filter." "Usar filtro de contactos." ::msgcat::mcset es "Use SASL authentication" "Usar autenticación SASL" ::msgcat::mcset es "Use SASL authentication." "Usar autenticación SASL." ::msgcat::mcset es "Use sound notification only when being available." "Usar\ la notificación sonora sólo cuanto se está en estado 'disponible'." ::msgcat::mcset es "Use specified key ID for signing and decrypting\ messages." "Usar el ID de llave especificado para firmar y descifrar\ mensajes." ::msgcat::mcset es "Use Tabbed Interface (you need to restart)." "Usar\ Tkabber en modo pestañas (necesitas reiniciar Tkabber)." ::msgcat::mcset es "Use the same passphrase for signing and decrypting\ messages." "Usar la misma contraseña para firmar y descifrar\ mensajes." ::msgcat::mcset es "Use the specified function to hash supported features\ list." "Usar la función especificada para hashear la lista de\ características disponibles." ::msgcat::mcset es "Use this module" "Usar este módulo" ::msgcat::mcset es "User activity" "Actividad de usuario" ::msgcat::mcset es "User activity publishing failed: %s" "Falló la\ publicación de la actividad de usuario: %s" ::msgcat::mcset es "User activity unpublishing failed: %s" "Falló la\ despublicación de la actividad de usuario: %s" ::msgcat::mcset es "User already %s" "El usuario ya está %s" ::msgcat::mcset es "User ID" "ID de usuario" ::msgcat::mcset es "User info" "Información del usuario" ::msgcat::mcset es "user interface" "interfaz de usuario" ::msgcat::mcset es "User location" "Localización de usuario" ::msgcat::mcset es "User location publishing failed: %s" "Fallo al publicar\ la localización del usuario: %s" ::msgcat::mcset es "User location unpublishing failed: %s" "Fallo al\ despublicar la localización del usuario: %s" ::msgcat::mcset es "User mood" "Estado de ánimo del usuario" ::msgcat::mcset es "User mood publishing failed: %s" "Falló la publicación\ del estado de ánimo de usuario: %s" ::msgcat::mcset es "User mood unpublishing failed: %s" "Falló la\ despublicación del estado de ánimo de usuario: %s" ::msgcat::mcset es "User name." "Nombre de usuario." ::msgcat::mcset es "User tune" "Canción de usuario" ::msgcat::mcset es "User tune publishing failed: %s" "Falló la publicación de\ la canción de usuario: %s" ::msgcat::mcset es "User tune unpublishing failed: %s" "Falló la\ despublicación de la canción de usuario: %s" ::msgcat::mcset es "Username" "Nombre de usuario" ::msgcat::mcset es "Username Not Available" "Nombre de usuario no disponible" ::msgcat::mcset es "Username:" "Nombre de usuario:" ::msgcat::mcset es "Users" "Usuarios" ::msgcat::mcset es "utilities" "herramientas" ::msgcat::mcset es "Value" "Valor" ::msgcat::mcset es "value is changed, but the option is not set." "valor\ modificado, pero opción no modificada." ::msgcat::mcset es "vcard %s%s:" "vCard %s%s:" ::msgcat::mcset es "vcard %s%s: %s" "vCard %s%s: %s" ::msgcat::mcset es "vCard display options in chat windows." "Opciones de\ visualización de vCard en la ventana de charla." ::msgcat::mcset es "Version" "Versión" ::msgcat::mcset es "version %s%s:" "versión %s%s:" ::msgcat::mcset es "version %s%s: %s" "versión %s%s: %s" ::msgcat::mcset es "Version:" "Versión:" ::msgcat::mcset es "Video:" "Video:" ::msgcat::mcset es "View" "Ver" ::msgcat::mcset es "Visible list" "Lista de visibles" ::msgcat::mcset es "visitor" "visitante" ::msgcat::mcset es "Visitors" "Visitantes" ::msgcat::mcset es "Voice:" "Voz:" ::msgcat::mcset es "Waiting for activating privacy list" "Esperando para\ activar la lista de privacidad" ::msgcat::mcset es "Waiting for component handshake result" "Esperando\ resultado de la negociación con componente" ::msgcat::mcset es "Waiting for non-SASL authentication fields" "Esperando\ los campos de la autenticación no-SASL" ::msgcat::mcset es "Waiting for non-SASL authentication results" "Esperando\ el resultado de la autenticación no-SASL" ::msgcat::mcset es "walking" "andando" ::msgcat::mcset es "walking the dog" "paseando al perro" ::msgcat::mcset es "Warning" "Advertencia" ::msgcat::mcset es "Warning display options." "Opciones de mostrar\ advertencias." ::msgcat::mcset es "Warning:" "Aviso:" ::msgcat::mcset es "WARNING: %s\n" "AVISO: %s\n" ::msgcat::mcset es "watching a movie" "viendo una película" ::msgcat::mcset es "watching tv" "viendo la TV" ::msgcat::mcset es "Web Site" "Sitio web" ::msgcat::mcset es "Web Site:" "Sitio web:" ::msgcat::mcset es "What action does the close button." "Acción realizada por\ el botón de Cerrar." ::msgcat::mcset es "When set, all changes to the ignore rules are applied\ only until Tkabber is closed\; they are not saved and thus will be\ not restored at the next run." "Cuando se activa, todos los cambios\ en las reglas de ignorados se aplican solo hasta que se cierre\ Tkabber\; no se guardan y por tanto no se restaurarán cuando inicies\ Tkabber de nuevo." ::msgcat::mcset es "Whois" "¿Quién es?" ::msgcat::mcset es "whois '%s': %s" "whois '%s': %s" ::msgcat::mcset es "whois '%s': no info" "whois '%s': no hay información" ::msgcat::mcset es "windows plugins" "plugins de ventanas" ::msgcat::mcset es "Work:" "Trabajo:" ::msgcat::mcset es "working" "trabajando" ::msgcat::mcset es "working out" "trabajando duro" ::msgcat::mcset es "worried" "preocupado" ::msgcat::mcset es "writing" "escribiendo" ::msgcat::mcset es "XML Not Well-Formed" "XML No está Bien Formado" ::msgcat::mcset es "xmpp chat/muc" "xmpp charla/muc" ::msgcat::mcset es "xmpp iq" "xmpp iq" ::msgcat::mcset es "xmpp library" "xmpp librería" ::msgcat::mcset es "xmpp messages" "xmpp mensajes" ::msgcat::mcset es "xmpp presence" "xmpp presencia" ::msgcat::mcset es "xmpp registration" "xmpp registro" ::msgcat::mcset es "xmpp roster" "xmpp lista de contactos" ::msgcat::mcset es "XMPP stream options when connecting to server." "Opciones\ de la conexión XMPP cuando se conecta al servidor." ::msgcat::mcset es "Year:" "Año:" ::msgcat::mcset es "You are unsubscribed from %s" "Te has desubscrito de %s" ::msgcat::mcset es "You're using root directory %s for storing Tkabber\ logs!\n\nI refuse to convert logs database." "Estas usando el\ directorio raíz %s para guardas los ficheros históricos de\ Tkabber!\n\nNo se van a convertir esos ficheros." ::msgcat::mcset es "Your new Tkabber config directory is now:\n%s\nYou can\ delete the old one:\n%s" "Tu nuevo directorio de configuración de\ Tkabber es:\n%s\nPuedes borrar el directorio viejo:\n%s" ::msgcat::mcset es "Zip" "Zip" ::msgcat::mcset es "BBS:" ::msgcat::mcset es "HTTP Poll" ::msgcat::mcset es "kde" ::msgcat::mcset es "PCS:" ::msgcat::mcset es "SSL" ::msgcat::mcset es "SSL Info" ::msgcat::mcset es "UID" ::msgcat::mcset es "UID:" ::msgcat::mcset es "UTC:" ::msgcat::mcset es "wmaker" # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/msgs/eu.msg000064400000000000000000000771571477701321300141640ustar00nobodynobody# eu.msg -- # # Basque messages for Tkabber XMPP client. # # Author: Euskalerria.org # http://www.euskalerria.org/jalgitalki # JID: jalgitalki@jalgitalki.euskalerria.org # avatars.tcl ::msgcat::mcset eu "No avatar to store" "ez dago gertaerarik gordetzeko dena" # browser.tcl ::msgcat::mcset eu "%s: %s/%s, Description: %s, Version: %s\nNumber of\ children: %s" "%s: %s/%s, Deskripzioa: %s, aldaera: %s\n2. mailako\ taldeak: %s" ::msgcat::mcset eu "Browse" "Esploratu" ::msgcat::mcset eu "JBrowser" "Jabber Esploratzailea" ::msgcat::mcset eu "JID:" "JID:" # chats.tcl ::msgcat::mcset eu ">>> Unable to decipher data: %s <<<" ">>> Ezin izan da\ daturik ulertu: %s <<<" ::msgcat::mcset eu "Chat with %s" "Norekin mintzatu %s" ::msgcat::mcset eu "Disconnected" "Ezezaguna" ::msgcat::mcset eu "Error %s" "Akatsa %s" ::msgcat::mcset eu "Error %s: %s" "Akatsa %s: %s" ::msgcat::mcset eu "Invite" "Gonbidatu" ::msgcat::mcset eu "Invite %s to conferences" "%s Gonbidatu taldean\ mintzatzeko" ::msgcat::mcset eu "Invite users to %s" "Erabiltzaileak gonbidatu %s (e)ra" ::msgcat::mcset eu "Invite users..." "Erabiltzaileak gonbidatu..." ::msgcat::mcset eu "No conferences in progress..." "Orain ez dago\ talde-mintzalderik..." ::msgcat::mcset eu "Please join %s" "Mesedez, hemen sartu: %s" ::msgcat::mcset eu "Send custom presence" "Bertan zaudela adierazi\ (pertsonalizatuta)" ::msgcat::mcset eu "Subject:" "Gaia:" ::msgcat::mcset eu "To:" "Norentzat:" ::msgcat::mcset eu "Toggle encryption" "Enkriptaketa hasi/amaitu" # custom.tcl ::msgcat::mcset eu "Customization of the One True Jabber Client." "Jabberren\ egiazko bezeroaren konfigurazioa." ::msgcat::mcset eu "Open" "Ireki" ::msgcat::mcset eu "Parent group:" "Talde nagusia:" ::msgcat::mcset eu "Parent groups:" "Talde nagusiak:" ::msgcat::mcset eu "Reset to Current" "Oraingo baliora erabili" ::msgcat::mcset eu "Reset to Default" "Programaren balioa erabili" ::msgcat::mcset eu "Reset to Saved" "Gordetako balioa erabili" ::msgcat::mcset eu "Set for Current Session" "Jardun honetarako zehaztu" ::msgcat::mcset eu "Set for Future Sessions" "Zehaztu hurrengo jardunetarako" ::msgcat::mcset eu "State" "Egoera" ::msgcat::mcset eu "this option has been set and saved." "aukera hau definitu\ eta gorde egin da." ::msgcat::mcset eu "this option is unchanged from its standard setting."\ "aukera honi ez zaio bere definizio estandarra aldatu." ::msgcat::mcset eu "you have edited the value, but you have not set the\ option." "Balioa editatu egin duzu baina ez duzu aukerarik egin." ::msgcat::mcset eu "you have set this option, but not saved it for future\ sessions." "aukera aktibatu duzu, baina ez duzu gorde\ hurrengoetarako." # datagathering.tcl # disco.tcl ::msgcat::mcset eu "Error getting info: %s" "Akatsa informazioa biltzean: %s" ::msgcat::mcset eu "Error getting items: %s" "Akatsa datuak eskuratzen: %s" ::msgcat::mcset eu "Error negotiate: %s" "Akatsa negoziatzen: %s" ::msgcat::mcset eu "Jabber Discovery" "Jabber Aurkikuntza" ::msgcat::mcset eu "Node:" "Nodoa:" # emoticons.tcl # filetransfer.tcl ::msgcat::mcset eu "Browse..." "Esploratu..." ::msgcat::mcset eu "Connection closed" "Konexioa etenda" ::msgcat::mcset eu "Description:" "Azalpena:" ::msgcat::mcset eu "File not found or not regular file: %s" "Aurkitu gabego\ edo ohikoa ez den atxiboa" ::msgcat::mcset eu "File to Send:" "Bidaltzeko artxiboa:" ::msgcat::mcset eu "IP address:" "IP helbidea:" ::msgcat::mcset eu "Receive" "Jaso" ::msgcat::mcset eu "Receive file from %s" "Artxiboa norengandik jaso: %s" ::msgcat::mcset eu "Request failed: %s" "Eskaera okerra: %s" ::msgcat::mcset eu "Save as:" "Nola gorde:" ::msgcat::mcset eu "Send file to %s" "Artxiboa nori bidali: %s" ::msgcat::mcset eu "Size:" "Neurria:" ::msgcat::mcset eu "Transfering..." "Eskualdatzen..." # filters.tcl ::msgcat::mcset eu "Action" "Ekintza" ::msgcat::mcset eu "Add" "Gehitu" ::msgcat::mcset eu "Edit" "Editatu" ::msgcat::mcset eu "Move down" "Behera eraman" ::msgcat::mcset eu "Move up" "gora eraman" ::msgcat::mcset eu "Remove" "Ezabatu" # gpgme.tcl ::msgcat::mcset eu "%s purportedly signed by %s can't be verified.\n\n%s."\ "%s izenpetuta baina ezin da egiaztatu.\n\n%s." ::msgcat::mcset eu "Change security preferences for %s" "Seguritate\ baldintzak aldatu honentzat %s" ::msgcat::mcset eu "Data purportedly sent by %s can't be deciphered.\n\n%s."\ "%s (e)k bidalitako datuak ezin dira ulertu.\n\n%s." ::msgcat::mcset eu "Encrypt traffic" "Datuak enkriptatu" ::msgcat::mcset eu "Error in signature verification software: %s." "Akatsa\ izenpearen egiaztatzeko programan: %s." ::msgcat::mcset eu "Key ID" "Giltzaren IDa" ::msgcat::mcset eu "Passphrase:" "Esaldi-giltza:" ::msgcat::mcset eu "Please enter passphrase" "Sar, mesedez, esaldi-giltza" ::msgcat::mcset eu "Please try again" "Saiatu berriz, mesedez" ::msgcat::mcset eu "Select" "Aukeratu" ::msgcat::mcset eu "Select Key for Signing Traffic" "Datu-trukaketa\ izenpetzeko, giltza aukeratu" ::msgcat::mcset eu "Unable to encipher data for %s: %s.\n\nEncrypting traffic\ to this user is now disabled.\n\nSend it as PLAINTEXT?" "Ezin da\ daturik enkritatu %s(r)entzat: %s.\n\nErabiltzaile honentzat, datuen\ enkriptazioa desaktibatuta dago hemendik aurrera.\n\nDATU GARBIAK\ bidali?" ::msgcat::mcset eu "Unable to sign message body: %s.\n\nSigning traffic is\ now disabled.\n\nSend it WITHOUT a signature?" "Ezin da mezuaren\ muina izenpetu: %s.\n\nIzenpetu gabe bidali?" ::msgcat::mcset eu "Unable to sign presence information: %s.\n\nPresence will\ be sent, but signing traffic is now disabled." "Ezin da\ egote-informazioa izenpetu: %s.\n\nAgerpena adieraziko da, baina\ datu-trukaketaren izenpea desaktibatuta dago." ::msgcat::mcset eu "User ID" "Erabiltzailearen IDa" ::msgcat::mcset eu "" # iface.tcl ::msgcat::mcset eu "Add conference..." "Mintza-taldea gehitu..." ::msgcat::mcset eu "Add group by regexp on JIDs..." "Taldea sortu regexp\ bidez JID gainean..." ::msgcat::mcset eu "Add user..." "Erabiltzailea gehitu..." ::msgcat::mcset eu "Admin tools" "Administrazio-tresnak" ::msgcat::mcset eu "Allow downloading" "Utzi deskargatzen" ::msgcat::mcset eu "Announce" "Iragarri" ::msgcat::mcset eu "Avatar" "Gertaera" ::msgcat::mcset eu "Away" "Ez nago" ::msgcat::mcset eu "Browser" "Esploratzailea" ::msgcat::mcset eu "Change password..." "Pasahitza aldatu..." ::msgcat::mcset eu "Chats" "Mintzaldiak" ::msgcat::mcset eu "Colors for tab alert levels." "Hegalen alerta-mailentzako\ koloreak." ::msgcat::mcset eu "Create room..." "Mintza-gela sortu" ::msgcat::mcset eu "Customize" "Konfiguratu" ::msgcat::mcset eu "Delete message of the day" "Egun honetako mezua ezabatu" ::msgcat::mcset eu "Discovery" "Aurkikuntza" ::msgcat::mcset eu "Do not disturb" "Ez deitu" ::msgcat::mcset eu "Edit my info..." "Aldatu nitaz dagoen informazioa..." ::msgcat::mcset eu "Export roster..." "Zerrenda eraman..." ::msgcat::mcset eu "Extended Away" "Zeharo at" ::msgcat::mcset eu "Filters..." "Iragazkiak..." ::msgcat::mcset eu "Free to chat" "Mintzatzeko gertu" ::msgcat::mcset eu "Generate event messages" "Gertaera-mezuak sortu" ::msgcat::mcset eu "Help" "Laguntza" ::msgcat::mcset eu "Import roster..." "Zerrenda ekarri..." ::msgcat::mcset eu "Invisible" "Ikustezin" ::msgcat::mcset eu "Join group..." "Mintza-taldean sartu..." ::msgcat::mcset eu "Log in..." "Hasi jarduna..." ::msgcat::mcset eu "Log out" "Jarduna itxi" ::msgcat::mcset eu "Log out with reason..." "Jarduna itxi honegatik..." ::msgcat::mcset eu "Message archive" "Mezuen biltegia" ::msgcat::mcset eu "Mute" "Ixilik" ::msgcat::mcset eu "Online" "Konektatuta" ::msgcat::mcset eu "Open raw XML window" "XML gordinaren leihoa ireki" ::msgcat::mcset eu "Options for main interface." "Interfaze nagusiaren\ aukerak." ::msgcat::mcset eu "Periodically browse roster conferences" "Zerrendan diren\ mintza-taldeak aldian behin ikuskatu" ::msgcat::mcset eu "Presence" "bertan naiz" ::msgcat::mcset eu "Privacy rules..." "Pribatutasun arauak..." ::msgcat::mcset eu "Profile on" "Profila" ::msgcat::mcset eu "Profile report" "Profilaren datuak" ::msgcat::mcset eu "Quick help" "Laguntza bizkorra" ::msgcat::mcset eu "Quit" "Irten" ::msgcat::mcset eu "Raise new tab." "Hegal berria sortu." ::msgcat::mcset eu "Roster" "Roster" ::msgcat::mcset eu "Send broadcast message..." "Difusio-mezua bidali..." ::msgcat::mcset eu "Send message of the day..." "Egun honetako mezua\ bidali..." ::msgcat::mcset eu "Send message..." "Mezua bidali..." ::msgcat::mcset eu "Send to server" "Zerbitzariari bidali" ::msgcat::mcset eu "Services" "Zerbitzuak" ::msgcat::mcset eu "Show online users only" "Konektatutako erabiltzaileak\ erakuts, ez beste" ::msgcat::mcset eu "Show user info..." "Erabiltzaile informazioa erakutsi..." ::msgcat::mcset eu "Sound" "Hotsa" ::msgcat::mcset eu "Stop autoscroll" "Ez mugitu goitik behera automatikoki" ::msgcat::mcset eu "Update message of the day..." "Egun honetako mezua\ eguneratu..." ::msgcat::mcset eu "Use aliases" "Gaitzizenak erabili" ::msgcat::mcset eu "Jidlink" ::msgcat::mcset eu "Chats:" "Mintzaldiak:" ::msgcat::mcset eu "Close tab" "Hegala itxi" ::msgcat::mcset eu "Complete nickname" "Gaitzizena osatu" ::msgcat::mcset eu "Correct word" "Hitza zuzendu" ::msgcat::mcset eu "Hide/Show roster" "Zerrenda erakutsi/ezkutatu" ::msgcat::mcset eu "Main window:" "Leiho nagusia:" ::msgcat::mcset eu "Previous/Next history message" "Aurreko/hurrengo mezua" ::msgcat::mcset eu "Previous/Next tab" "Aurreko/hurrengo hegala" ::msgcat::mcset eu "Quick Help" "Laguntza bizkorra" ::msgcat::mcset eu "Redo" "Berregin" ::msgcat::mcset eu "Scroll chat window up/down" "Mintza-leihoa gora/behera\ mugitu" ::msgcat::mcset eu "Show emoticons" "Marrazkiak erakutsi" ::msgcat::mcset eu "Tabs:" "Hegalak:" ::msgcat::mcset eu "Undo" "Desegin" ::msgcat::mcset eu "About" "Programaz" ::msgcat::mcset eu "Alexey Shchepin" "Alexey Shchepin" ::msgcat::mcset eu "Authors:" "Egileak:" ::msgcat::mcset eu "Marshall T. Rose" "Marshall T. Rose" ::msgcat::mcset eu "Michail Litvak" "Michail Litvak" ::msgcat::mcset eu "Sergei Golovan" "Sergei Golovan" ::msgcat::mcset eu "Add new user..." "Erabiltzaile berria gehitu..." ::msgcat::mcset eu "Jabber Browser" "Jabber esploratzailea" #::msgcat::mcset eu "Join group..." "Mintza-taldean sartu..." ::msgcat::mcset eu "Cancel" "Deuseztatu" ::msgcat::mcset eu "Close" "Itxi" ::msgcat::mcset eu "Close all tabs" "Itxi hegal guztiak" ::msgcat::mcset eu "Close other tabs" "Itxi beste hegalak" ::msgcat::mcset eu "Send" "Bidali" ::msgcat::mcset eu "Toggle encryption (when possible)" "Enkriptazioa\ aktibatu/desaktibatu (ahal denetan)" ::msgcat::mcset eu "Toggle showing offline users" "Konektatu gabeko\ erabiltzaileen zerrenda aktibatu/desaktibatu" ::msgcat::mcset eu "Toggle signing" "Izenpea aktibatu/desaktibatu" # itemedit.tcl ::msgcat::mcset eu "<- Remove" "<- Ezabatu" ::msgcat::mcset eu "Add ->" "Gehitu ->" ::msgcat::mcset eu "Available groups" "Aukeran dauden taldeak" ::msgcat::mcset eu "Current groups" "Oraingo taldeak" ::msgcat::mcset eu "Edit groups for %s" "Taldeak editatu %s" ::msgcat::mcset eu "Edit nickname for %s" "Honen gaitzizena aldatu %s" ::msgcat::mcset eu "Edit properties for %s" "Ezaugarriak editatu %s" ::msgcat::mcset eu "Group:" "Taldea:" ::msgcat::mcset eu "Nickname:" "Gaitzizena:" # jidlink.tcl ::msgcat::mcset eu "Jidlink connection closed" "Jidlink konexioa itxita" ::msgcat::mcset eu "Opening Jidlink connection" "Jidlink konexioa irekitzen" # joingrdialog.tcl ::msgcat::mcset eu "Add group" "Mintza-taldea gehitu" ::msgcat::mcset eu "Address:" "Helbidea:" ::msgcat::mcset eu "Create" "Sortu" ::msgcat::mcset eu "Create Room" "Gela sortu" ::msgcat::mcset eu "Description:" "Azalpena:" ::msgcat::mcset eu "Get conference info failed: %s" "Mintza-taldeaz\ informazio-eskaerak huts egin du: %s" ::msgcat::mcset eu "Group:" "Taldea:" ::msgcat::mcset eu "Join" "Sartu" ::msgcat::mcset eu "Join failed: %s" "Huts egindako sarrera: %s" ::msgcat::mcset eu "Join group" "Mintza-taldean sartu" ::msgcat::mcset eu "Name: " "Izena:" ::msgcat::mcset eu "Nick:" "Gaitzizena:" ::msgcat::mcset eu "Nickname:" "Gaitzizena:" ::msgcat::mcset eu "Password (v2 only):" "Pasahitza (v2 bakarrik)" ::msgcat::mcset eu "Password:" "Pasahitza:" ::msgcat::mcset eu "Server:" "Zerbitzaria:" ::msgcat::mcset eu "use v2 protocol" "v2 protokoloa erabili" # login.tcl ::msgcat::mcset eu "Authentication failed: %s\nCreate new account?"\ "Egiaztapenak huts egin du: %s\nKontu berria sortu?" ::msgcat::mcset eu "Change password" "Pasahitza aldatu" ::msgcat::mcset eu "Connect via alternate server" "Ordezko zerbitzariaren\ bidez konektatu" ::msgcat::mcset eu "HTTP proxy address." "HTTP proxyaren helbidea." ::msgcat::mcset eu "HTTP proxy password." "HTTP proxyaren pasahitza." ::msgcat::mcset eu "HTTP proxy port." "HTTP proxyaren portua." ::msgcat::mcset eu "HTTP proxy username." "HTTP proxyaren erabiltzailea." ::msgcat::mcset eu "Login" "jarduna hasi" ::msgcat::mcset eu "Login options." "Jardun-hasieraren aukerak." ::msgcat::mcset eu "Logout with reason" "Jarduna itxi zio honekin" ::msgcat::mcset eu "New password:" "Pasahitz berria:" ::msgcat::mcset eu "New passwords do not match" "Pasahitz berriak ez dira\ berdinak" ::msgcat::mcset eu "Old password is incorrect" "Pasahitz zaharra okerra da" ::msgcat::mcset eu "Old password:" "Pasahitz zaharra:" ::msgcat::mcset eu "Password change failed: %s" "Pasahitz aldaketak huts egin\ du: %s" ::msgcat::mcset eu "Password is changed" "Pasahitza aldatu egin da" ::msgcat::mcset eu "Password." "Pasahitza." ::msgcat::mcset eu "Password:" "Pasahitza:" ::msgcat::mcset eu "Port:" "Portua:" ::msgcat::mcset eu "Priority." "Lehentasuna." ::msgcat::mcset eu "Priority:" "Lehentasuna:" ::msgcat::mcset eu "Profile" "Soslaia" ::msgcat::mcset eu "Profiles" "Soslaiak" ::msgcat::mcset eu "Proxy Login:" "Proxyaren erabiltzailea:" ::msgcat::mcset eu "Proxy Password:" "Proxyaren pasahitza:" ::msgcat::mcset eu "Proxy Port:" "Proxyaren portua:" ::msgcat::mcset eu "Proxy Server:" "Proxy zerbitzaria:" ::msgcat::mcset eu "Reason:" "Zergatia:" ::msgcat::mcset eu "Registration failed: %s" "Errejistroak huts egin du: %s" ::msgcat::mcset eu "Repeat new password:" "Idatzi berriz pasahitz berria:" ::msgcat::mcset eu "Resource." "Baliabidea." ::msgcat::mcset eu "Resource:" "Baliabidea:" ::msgcat::mcset eu "Server name or IP-address." "Zerbitzariaren izena ala IP\ helbidea." ::msgcat::mcset eu "Server name." "Zerbitzaria." ::msgcat::mcset eu "Server port." "Portua." ::msgcat::mcset eu "Server:" "Zerbitzaria:" ::msgcat::mcset eu "SSL port." "SSL portua." ::msgcat::mcset eu "SSL Port:" "SSL portua:" ::msgcat::mcset eu "Use explicitly-specified server address." "Zehazki\ adierazitako zerbitzariaren helbidea erabili." ::msgcat::mcset eu "Use hashed password" "Pasahitzaren laburpena erabili" ::msgcat::mcset eu "Use HTTP proxy to connect." "Konexioan HTTP proxya\ erabili." ::msgcat::mcset eu "Use Proxy" "Proxya erabili" ::msgcat::mcset eu "Use SSL" "SSL erabili" ::msgcat::mcset eu "Use SSL to connect to server." "Konexioan SSL erabili" ::msgcat::mcset eu "User name." "Erabiltzailea." ::msgcat::mcset eu "Username:" "Erabiltzailea:" # messages.tcl ::msgcat::mcset eu "Attached file:" "Atxikitako artxiboa:" ::msgcat::mcset eu "Attached user:" "Atxikitako erabiltzailea:" ::msgcat::mcset eu "Extras from" "Noren gehigarriak" ::msgcat::mcset eu "Extras from %s" "Honen gehigarriak %s" ::msgcat::mcset eu "Headlines" "Izenburuak" ::msgcat::mcset eu "Invited to:" "Nori gonbidatu:" ::msgcat::mcset eu "Message body" "Mezuaren muina" ::msgcat::mcset eu "Message from" "Noren mezua" ::msgcat::mcset eu "Message from %s" "Honen mezua %s" ::msgcat::mcset eu "Reply" "Erantzun" ::msgcat::mcset eu "Send message" "Mezua bidali" ::msgcat::mcset eu "Send message to %s" "Nori bidali mezua %s" ::msgcat::mcset eu "Send subscription" "Harpidetza bidali" ::msgcat::mcset eu "Send subscription to " "Nori bidali harpidetza " ::msgcat::mcset eu "Send subscription to %s" "Nori bidali harpidetza %s" ::msgcat::mcset eu "Sort" "Sailkatu" ::msgcat::mcset eu "Subscribe" "Harpidetu" ::msgcat::mcset eu "Subscribe request from" "Honen harpidetza eskaera" ::msgcat::mcset eu "Subscribe request from %s" "Honen harpidetza eskaera %s" ::msgcat::mcset eu "Toggle seen" "-ikusita- aktibatu/deskaktibatu" ::msgcat::mcset eu "Unsubscribe" "Harpidetza eten" # muc.tcl #::msgcat::mcset eu "Whois" "" #::msgcat::mcset eu "Kick" "" #::msgcat::mcset eu "Ban" "" #::msgcat::mcset eu "Grant Voice" "" #::msgcat::mcset eu "Revoke Voice" "" #::msgcat::mcset eu "Grant Membership" "" #::msgcat::mcset eu "Revoke Membership" "" #::msgcat::mcset eu "Grant Moderator Privilege" "" #::msgcat::mcset eu "Revoke Moderator Privilege" "" #::msgcat::mcset eu "MUC" "" #::msgcat::mcset eu "Configure" "" #::msgcat::mcset eu "Edit admin list" "" #::msgcat::mcset eu "Edit moderator list" "" #::msgcat::mcset eu "Edit ban list" "" #::msgcat::mcset eu "Edit member list" "" #::msgcat::mcset eu "Edit voice list" "" #::msgcat::mcset eu "Destroy" "" # presence.tcl ::msgcat::mcset eu "Not logged in" "Konektatu gabe" #::msgcat::mcset eu "Online" "Konektatuta" #::msgcat::mcset eu "Free to chat" "Mintzatzeko gertu" #::msgcat::mcset eu "Away" "Ez nago" #::msgcat::mcset eu "Extended Away" "Zeharo at" #::msgcat::mcset eu "Do not disturb" "Ez deitu" #::msgcat::mcset eu "Invisible" "Ikustezin" ::msgcat::mcset eu "invalid userstatus value " "erabiltzailearen egoera\ balioa okerra " ::msgcat::mcset eu "Offline" "Konektatu gabe" # privacy.tcl ::msgcat::mcset eu "Active" "Abian" ::msgcat::mcset eu "Add item" "Datua gehitu" ::msgcat::mcset eu "Add list" "Zerrenda gehitu" ::msgcat::mcset eu "No active" "Geldirik" ::msgcat::mcset eu "Remove list" "Zerrenda ezabatu" ::msgcat::mcset eu "Requesting privacy rules: %s" "Pribatutasun arauak\ eskatzen: %s" ::msgcat::mcset eu "Subscription:" "Harpidetza:" ::msgcat::mcset eu "Type:" "Mota:" ::msgcat::mcset eu "Zebra list: %s" "Zebra zerrenda: %s" ::msgcat::mcset eu "Zebra lists" "Zebra zerrendak" # register.tcl ::msgcat::mcset eu "Register in %s" "%s(ea)n izena eman" ::msgcat::mcset eu "Unsubscribed from %s" "%s(e)tik baja emanda " ::msgcat::mcset eu "We unsubscribed from %s" "%s(ea)n baja eman dugu" # roster.tcl ::msgcat::mcset eu "is now" "Oraintxe dago" ::msgcat::mcset eu "Undefined" "Zehaztu gabe" #::msgcat::mcset eu "Show online & offline users" \ # "konektatu & konektatu gabeko erabiltzaileak erakutsi" #::msgcat::mcset eu "Show online users only" \ # "Konektatuakoak erakutsi, ez beste" ::msgcat::mcset eu "Add roster group by JID regexp" "Zerrendan taldea gehitu\ regexp bidez JID gainean" ::msgcat::mcset eu "Are you sure to remove %s from roster?" "¿%s zure\ zerrendatik ezabatzeko ziur zaude??" ::msgcat::mcset eu "JID regexp:" "JID regexp:" ::msgcat::mcset eu "New group name:" "Talde berriaren izena:" ::msgcat::mcset eu "Start chat" "Mintzaldia hasi" #::msgcat::mcset eu "Send message..." "Mezua bidali..." ::msgcat::mcset eu "Contact Information" "Harremanetarako informazioa" ::msgcat::mcset eu "Edit item..." "Datua editatu..." ::msgcat::mcset eu "Edit security..." "Seguritatea editatu..." ::msgcat::mcset eu "Invite to conference..." "Mintza-taldera gonbidatu..." ::msgcat::mcset eu "Join..." "Mintza-taldean sartu..." ::msgcat::mcset eu "Log in" "Jarduna hasi" ::msgcat::mcset eu "Log out" "Jarduna amaitu" ::msgcat::mcset eu "No users in roster..." "Zerrendan ez dago\ erabiltzailerik..." ::msgcat::mcset eu "Raw XML input" "XML gordinaren sarrera" ::msgcat::mcset eu "Remove..." "Ezabatu..." ::msgcat::mcset eu "Rename..." "Berrizendatu..." ::msgcat::mcset eu "Resubscribe" "Harpidetu berriz" ::msgcat::mcset eu "Resubscribe to all users in group..." "Harpidetu berriz\ erabiltzaile guztiak taldean..." ::msgcat::mcset eu "Send" "Bidali" ::msgcat::mcset eu "Send contacts to" "Nori bidali kontaktuak" ::msgcat::mcset eu "Send file via Jidlink..." "Artxiboa bidali Jidlink\ bidez..." ::msgcat::mcset eu "Send file..." "Artxiboa bidali..." ::msgcat::mcset eu "Send users..." "Erabiltzaileak bidali..." ::msgcat::mcset eu "Show history" "Historiala erakutsi" ::msgcat::mcset eu "Show info" "Informazioa erakutsi" # search.tcl ::msgcat::mcset eu "#" "#" ::msgcat::mcset eu "An error is occurred when searching in %s\n\n%s" "Akats\ bat gertatu da hemen bilatzean: %s\n\n%s" ::msgcat::mcset eu "OK" "Ondo" ::msgcat::mcset eu "Search again" "Bilatu berriz" ::msgcat::mcset eu "Search in" "Non bilatu" ::msgcat::mcset eu "Try again" "Saiatu berriz" # splash.tcl ::msgcat::mcset eu "auto-away" "auto-ezegotea" ::msgcat::mcset eu "avatars" "gertaerak" ::msgcat::mcset eu "balloon help" "testuingu laguntza" ::msgcat::mcset eu "browsing" "nabigazioa" ::msgcat::mcset eu "configuration" "konfigurazioa" ::msgcat::mcset eu "connections" "konexioak" ::msgcat::mcset eu "cryptographics" "kriptografia" ::msgcat::mcset eu "emoticons" "marrazkiak" ::msgcat::mcset eu "extension management" "luzapenen kudeaketa" ::msgcat::mcset eu "file transfer" "artxiboen igorpena" ::msgcat::mcset eu "jabber chat" "Jabber solasgunea" ::msgcat::mcset eu "jabber groupchats" "Jabber mintza-taldeak" ::msgcat::mcset eu "jabber iq" "jabber iq" ::msgcat::mcset eu "jabber presence" "Jabber presentzia" ::msgcat::mcset eu "jabber registration" "Jabber errejistroa" ::msgcat::mcset eu "message/headline" "mezua/mezuburua" ::msgcat::mcset eu "plugin management" "plugin-en kudeaketa" ::msgcat::mcset eu "presence" "egotea" ::msgcat::mcset eu "rosters" "zerrendak" ::msgcat::mcset eu "searching" "bilatzen" ::msgcat::mcset eu "text undo" "Testua ezabatu" ::msgcat::mcset eu "user interface" "erabiltzaile interfazea" ::msgcat::mcset eu "utilities" "tresnak" ::msgcat::mcset eu "jabber xml" ::msgcat::mcset eu "kde" ::msgcat::mcset eu "wmaker" # sound.tcl ::msgcat::mcset eu "External program, which is to be executed to play sound.\ If empty, Snack library is required to play sound." "Hotsa entzuteko\ abiatuko den kanpoko programa. Hutsik uzten bada, Snack liburutegia\ behar izango da entzuteko." ::msgcat::mcset eu "Mute sound notifying." "Hots jakinarazpenak ixilik." ::msgcat::mcset eu "Sound options." "Hots aukerak." ::msgcat::mcset eu "Time interval before playing next sound (in\ milliseconds)." "Hotsen arteko denbora tartea (milisegundutan)." # userinfo.tcl ::msgcat::mcset eu "%s info" "%s(r)en informazioa" ::msgcat::mcset eu "Address" "Helbidea" ::msgcat::mcset eu "Address 2:" "2. helbidea:" ::msgcat::mcset eu "Address:" "Helbidea:" ::msgcat::mcset eu "Cell:" "Sakelekoa:" ::msgcat::mcset eu "City:" "Herria:" ::msgcat::mcset eu "Country:" "Estatua:" ::msgcat::mcset eu "Details" "Ñabardurak" ::msgcat::mcset eu "E-mail:" "E-posta" ::msgcat::mcset eu "Family Name:" "Deitura:" ::msgcat::mcset eu "Fax:" "Faxa:" ::msgcat::mcset eu "Full Name:" "Izen osoa:" ::msgcat::mcset eu "Geographical position" "Kokapen geografikoa" ::msgcat::mcset eu "Home:" "Etxekoa:" ::msgcat::mcset eu "Information" "Informazioa" ::msgcat::mcset eu "ISDN:" "RDSI:" ::msgcat::mcset eu "Latitude:" "Latitudea:" ::msgcat::mcset eu "Location" "Tokia" ::msgcat::mcset eu "Longitude:" "Longitudea:" ::msgcat::mcset eu "Message Recorder:" "Erantzungailua:" ::msgcat::mcset eu "Middle Name:" "2. izena:" ::msgcat::mcset eu "Modem:" "Modema:" ::msgcat::mcset eu "Name" "Izena" ::msgcat::mcset eu "Name:" "Izena:" ::msgcat::mcset eu "Nickname:" "Gaitzizena:" ::msgcat::mcset eu "Organization" "Erakundea" ::msgcat::mcset eu "Pager:" "Bilatu:" ::msgcat::mcset eu "Personal" "Pertsonala" ::msgcat::mcset eu "Phones" "Telefonoak" ::msgcat::mcset eu "Postal Code:" "Posta kodea:" ::msgcat::mcset eu "Preferred:" "Lehenetsia:" ::msgcat::mcset eu "Prefix:" "Aurrizkia:" ::msgcat::mcset eu "Show" "Erakutsi" ::msgcat::mcset eu "Show user info" "Erabiltzaile-informazioa erakutsi" ::msgcat::mcset eu "State:" "Lurraldea:" ::msgcat::mcset eu "Suffix:" "Atzizkia:" ::msgcat::mcset eu "Telephone numbers" "Telefono zenbakiak" ::msgcat::mcset eu "Video:" "Bideoa:" ::msgcat::mcset eu "Voice:" "Ahotsa:" ::msgcat::mcset eu "Web Site:" "Web gunea:" ::msgcat::mcset eu "Work:" "Lanekoa:" ::msgcat::mcset eu "BBS:" ::msgcat::mcset eu "JID:" ::msgcat::mcset eu "PCS:" ::msgcat::mcset eu "UID:" # Space at the end of the next word is to distinguish it from another "Name:" ::msgcat::mcset eu "Name: " "izena:" ::msgcat::mcset eu "Unit:" "Unitatea:" # Space at the end of the next word is to distinguish it from # another "Personal" ::msgcat::mcset eu "Personal " "Pertsonala" ::msgcat::mcset eu "Role:" "Zeregina:" ::msgcat::mcset eu "Title:" "Ardura:" # Space at the end of the next word is to distinguish it from another "About" ::msgcat::mcset eu " by " " nork " ::msgcat::mcset eu "About " "Programaz" ::msgcat::mcset eu "Avatar" "gartaera" ::msgcat::mcset eu "Birthday" "Jaiotze eguna" ::msgcat::mcset eu "Birthday:" "Jaiotze eguna:" ::msgcat::mcset eu "Client" "Bezeroa" ::msgcat::mcset eu "Client Info" "Bezero-informazioa" ::msgcat::mcset eu "Client:" "Bezeroa:" ::msgcat::mcset eu "Computer" "Konputagailua" ::msgcat::mcset eu "Day:" "Eguna:" ::msgcat::mcset eu "Description:" "Azalpena:" ::msgcat::mcset eu "Image" "Irudia" ::msgcat::mcset eu "Interval:" "Tartea:" ::msgcat::mcset eu "Last Activity or Uptime" "Azken jarduna edo\ ibiltze-denbora" ::msgcat::mcset eu "Load Image" "Irudia kargatu" ::msgcat::mcset eu "Month:" "Hila:" ::msgcat::mcset eu "None" "Batere ez" ::msgcat::mcset eu "OS:" "SO:" ::msgcat::mcset eu "Photo" "Argazkia" ::msgcat::mcset eu "Presence" "Presentzia" ::msgcat::mcset eu "Presence id signed" "Presentzia IDa izenpetuta" ::msgcat::mcset eu "Time Zone:" "Ordu-gunea:" ::msgcat::mcset eu "Time:" "Ordua:" ::msgcat::mcset eu "URL" "URLa" ::msgcat::mcset eu "URL:" "URLa:" ::msgcat::mcset eu "Version:" "Bertsioa:" ::msgcat::mcset eu "Year:" "Urtea:" ::msgcat::mcset eu "UTC:" # utils.tcl ::msgcat::mcset eu "day" "eguna" ::msgcat::mcset eu "days" "egunak" ::msgcat::mcset eu "hour" "ordua" ::msgcat::mcset eu "hours" "ordu" ::msgcat::mcset eu "minute" "minutu" ::msgcat::mcset eu "minutes" "minutu" ::msgcat::mcset eu "second" "segundo" ::msgcat::mcset eu "seconds" "segundo" # plugins/chat/clear.tcl ::msgcat::mcset eu "Clear chat window" "Solasgunearen leihoa garbitu" # plugins/jidlink/dtcp.tcl ::msgcat::mcset eu "Opening DTCP active connection" "DTCP konexio aktiboa\ irekitzen" ::msgcat::mcset eu "Opening DTCP passive connection" "DTCP konexio pasiboa\ irekitzen" # plugins/jidlink/ibb.tcl ::msgcat::mcset eu "Opening IBB connection" "IBB konexioa irekitzen" # plugins/clientinfo.tcl ::msgcat::mcset eu "\n\tClient: %s" "\n\tBezeroa: %s" ::msgcat::mcset eu "\n\tOS: %s" "\n\tSO: %s" # plugins/general/autoaway.tcl # "Automatically away due to idle" goes to textstatus (probably # no needs to translate) ::msgcat::mcset eu "Automatically away due to idle" # rest should be translated ::msgcat::mcset eu "Idle for %s" "Jarduerarik gabe %s " ::msgcat::mcset eu "Idle threshold in milliseconds after that Tkabber marks\ you as away." "'ez nago' egoeran automatikoki ipin zaitzan Tkabber\ behar duen denbora tartea." ::msgcat::mcset eu "Idle threshold in milliseconds after that Tkabber marks\ you as extended away." "'Zeharo at' egoeran automatikoki ipin zaitzan\ Tkabber behar duen denbora tartea." ::msgcat::mcset eu "Moving to extended away" "Zeharo at egoerara igarotzen" ::msgcat::mcset eu "Options for module that automatically marks you as away\ after idle threshold." "Denbora jakin bat geldirik egon eta gero, 'ez\ nago' egoeran jartzen zaituen moduloaren aukerak." ::msgcat::mcset eu "Returning from auto-away" "Auto-esegotetik itzultzen" ::msgcat::mcset eu "Starting auto-away" "Auto-ezegote egoerara igarotzen" ::msgcat::mcset eu "Text status, which is set when Tkabber is moving in away\ state." "Tkabber-rek 'ez nago' egoeran ipintzen zaituenean, ezarriko\ den testu-egoera." ::msgcat::mcset eu "Tkabber will set priority to 0 when moving in extended\ away state." "Tkabber-rek 0 lehentasunean ipiniko du 'zeharo at'\ egoerara igarotakoan." # plugins/general/conferenceinfo.tcl ::msgcat::mcset eu "\n\tCan't browse: %s" "\n\tEzin da nabigatu: %s" ::msgcat::mcset eu "\nRoom is empty at %s" "\n %s gela hutsik dago" ::msgcat::mcset eu "\nRoom participants at %s:" "\nPartaideak %setan:" ::msgcat::mcset eu "Interval after error reply on request of participants\ list" "Partaide zerrenda eskatu eta gero, akatsik dela jakin eta\ geroko denbora tartea" ::msgcat::mcset eu "Interval between requests of participants list" "Partaide\ zerrenden eskaeren arteko denbora tartea" ::msgcat::mcset eu "Options for Conference Info module, that allows you to\ see list of participants in roster popup, regardless of whether you\ are currently joined with the conference." "Mintza-taldeez informazio\ moduloaren aukerak. Honek partaidek erakusten ditu zerrendaren\ leihoan, bertan parte hartzen zauden ala ez." ::msgcat::mcset eu "Use this module" "Modulo hau erabili" # plugins/general/message_archive.tcl ::msgcat::mcset eu "Dir" "Dir" ::msgcat::mcset eu "From/To" "Norengandik/Norentzat" ::msgcat::mcset eu "From:" "Norenagandik:" ::msgcat::mcset eu "Messages" "Mezuak" ::msgcat::mcset eu "Received/Sent" "Bidalitakoak/Jasotakoak" ::msgcat::mcset eu "Subject" "Gaia" ::msgcat::mcset eu "To:" "Norentzat:" # plugins/general/rawxml.tcl ::msgcat::mcset eu "Indentation for pretty-printed XML subtags." "XML markak\ eskumara eraman bertsio txukunean." ::msgcat::mcset eu "Options for Raw XML Input module, which allows you to\ monitor incoming/outgoing traffic from connection to server and send\ custom XML stanzas." "XML gordinarn sarrerako moduloaren aukerak.\ Honek, konexio honetan zerbitzaritik sartu eta irteten diren datuak\ monitorizatzea eta XML bidaltzea ahalbidetzen du" ::msgcat::mcset eu "Pretty print incoming and outgoing XML stanzas." "XML\ parrafoentzat XML txukuna erakutsi." ::msgcat::mcset eu "Pretty print XML" "XML txukuna erakutsi" ::msgcat::mcset eu "Raw XML" "XML gordina" # plugins/unix/dockingtray.tcl ::msgcat::mcset eu "Hide Main Window" "Ezkutatu leiho nagusia" ::msgcat::mcset eu "Show Main Window" "Erakutsi leiho nagusia" # plugins/unix/ispell.tcl ::msgcat::mcset eu "- nothing -" "- ezer ez -" ::msgcat::mcset eu "Check spell after every entered symbol." "Ikur\ bakoitzaren ondoren, ortografia zuzendu." ::msgcat::mcset eu "Path to the ispell executable." "ispell\ exekutagarriarntzako bidea." ::msgcat::mcset eu "Spell check options." "Zuzenketa ortografikoaren\ aukerak." # unix/wmdock.tcl ::msgcat::mcset eu "%s is %s" "%s %s dago" ::msgcat::mcset eu "%s msgs" "%s mezu" # error messages ::msgcat::mcset eu "Bad Request" "Eskaera okerra" ::msgcat::mcset eu "Conflict" "Gatazka" ::msgcat::mcset eu "Forbidden" "Debekatuta" ::msgcat::mcset eu "Internal Server Error" "Zerbitzariaren barneko akatsa" ::msgcat::mcset eu "Not Acceptable" "Ez da onargarria" ::msgcat::mcset eu "Not Allowed" "Baimenik gabe" ::msgcat::mcset eu "Not Found" "Ez da aurkitu" ::msgcat::mcset eu "Not Implemented" "Ez garatuta" ::msgcat::mcset eu "Payment Required" "Ordaina behar da" ::msgcat::mcset eu "Redirect" "berbideraketa" ::msgcat::mcset eu "Registration Required" "Errejistratzea beharrezkoa da" ::msgcat::mcset eu "Remote Server Error" "Urrutiko zerbitzariaren akatsa" ::msgcat::mcset eu "Remote Server Timeout" "Urrutiko zerbitzariaren itxaron\ tartea agortuta" ::msgcat::mcset eu "Request Timeout" "Eskaeraren itxaron tartea agortuta" ::msgcat::mcset eu "Service Unavailable" "Zerbitzu hau ez dago eskura" ::msgcat::mcset eu "Unauthorized" "Baimenik gabe" ::msgcat::mcset eu "Username Not Available" "Erabiltzaile izen hori beste\ batek hartu du" # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/msgs/fr.msg000064400000000000000000000756331477701321300141570ustar00nobodynobody# fr.msg -- # # French messages for the Tkabber XMPP client. # # Author: Vincent Ricard # TODO: find a good translation to 'headline', for now : 'message informatif' # avatars.tcl ::msgcat::mcset fr "No avatar to store" "Aucun avatar à stocker" # browser.tcl ::msgcat::mcset fr "%s: %s/%s, Description: %s, Version: %s\nNumber of\ children: %s" "%s: %s/%s, Description : %s, Version : %s\nNombres\ d'enfants : %s" ::msgcat::mcset fr "Browse" "Naviguer" ::msgcat::mcset fr "Browse error: %s" "Erreur de navigation : %s" ::msgcat::mcset fr "JBrowser" "JNavigateur" ::msgcat::mcset fr "JID:" "JID :" ::msgcat::mcset fr "List of browsed JIDs." "Liste des JIDs passés en revue." # chats.tcl ::msgcat::mcset fr "/me has changed the subject to: %s" "/me a changé le\ sujet pour : %s" ::msgcat::mcset fr ">>> Unable to decipher data: %s <<<" ">>> Incapable de\ décoder les données : %s <<<" ::msgcat::mcset fr "Chat with %s" "Discussion avec %s" ::msgcat::mcset fr "Disconnected" "Déconnecté" ::msgcat::mcset fr "Error %s" "Erreur %s" ::msgcat::mcset fr "Error %s: %s" "Erreur %s : %s" ::msgcat::mcset fr "Invite" "Inviter" ::msgcat::mcset fr "Invite %s to conferences" "Inviter %s à des conférences" ::msgcat::mcset fr "Invite users to %s" "Inviter des utilisateurs à %s" ::msgcat::mcset fr "Invite users..." "Inviter des utilisateurs..." ::msgcat::mcset fr "Moderators" "Modérateurs" ::msgcat::mcset fr "No conferences in progress..." "Pas de conférences en\ cours..." ::msgcat::mcset fr "Participants" "Participants" ::msgcat::mcset fr "Please join %s" "Veuillez joindre %s" ::msgcat::mcset fr "Subject:" "Sujet :" ::msgcat::mcset fr "Users" "Utilisateurs" ::msgcat::mcset fr "Visitors" "Visiteurs" # custom.tcl ::msgcat::mcset fr "Customization of the One True Jabber Client."\ "Personnalisation d'un vrai client Jabber." ::msgcat::mcset fr "Customize" "Personnaliser" ::msgcat::mcset fr "Open" "Ouvrir" ::msgcat::mcset fr "Parent group:" "Groupe parent :" ::msgcat::mcset fr "Parent groups:" "Groupes parent :" ::msgcat::mcset fr "Reset to Current" "Réinitialiser à la valeur courante" ::msgcat::mcset fr "Reset to Default" "Réinitialiser à la valeur par défaut" ::msgcat::mcset fr "Reset to Saved" "Réinitialiser à la valeur sauvegardée" ::msgcat::mcset fr "Set for Current Session" "configurer pour la session\ courante" ::msgcat::mcset fr "Set for Future Sessions" "configurer pour les sessions\ futures" ::msgcat::mcset fr "State" "Etat" ::msgcat::mcset fr "this option has been set and saved." "cette option a été\ configuré et sauvegardée" ::msgcat::mcset fr "this option is unchanged from its standard setting." ::msgcat::mcset fr "you have edited the value, but you have not set the\ option." ::msgcat::mcset fr "you have set this option, but not saved it for future\ sessions." # datagathering.tcl ::msgcat::mcset fr "Data form" "Formulaire" ::msgcat::mcset fr "Date:" "Date :" ::msgcat::mcset fr "Email:" "E-mail :" ::msgcat::mcset fr "Error requesting data: %s" "Erreur lors de la demande de\ données : %s" ::msgcat::mcset fr "Error submitting data: %s" "Erreur lors de l'envoi de\ données : %s" ::msgcat::mcset fr "First Name:" "Prénom :" ::msgcat::mcset fr "Instructions" "Instructions :" ::msgcat::mcset fr "Key:" "Clef :" ::msgcat::mcset fr "Last Name:" "Nom :" ::msgcat::mcset fr "Misc:" "Divers :" ::msgcat::mcset fr "Phone:" "Téléphone :" ::msgcat::mcset fr "Text:" "Texte :" ::msgcat::mcset fr "Zip:" "Code postal :" # disco.tcl ::msgcat::mcset fr "Discover service" "Service découverte" ::msgcat::mcset fr "Error getting info: %s" "Erreur lors de la récupération\ de l'info : %s" ::msgcat::mcset fr "Error getting items: %s" "Erreur lors de la récupération\ des objets : %s" ::msgcat::mcset fr "Error negotiate: %s" "Erreur lors de la négociation : %s" ::msgcat::mcset fr "Jabber Discovery" "Découverte Jabber" ::msgcat::mcset fr "List of discovered JID nodes." "Liste des noeuds JID\ découverts" ::msgcat::mcset fr "List of discovered JIDs." "Liste des JIDs découverts" ::msgcat::mcset fr "Node:" "NÅ“ud :" # emoticons.tcl # filetransfer.tcl ::msgcat::mcset fr "Browse..." "Naviguer..." ::msgcat::mcset fr "Connection closed" "Connexion fermée" ::msgcat::mcset fr "Default directory for downloaded files." "Répertoire par\ défaut pour les fichiers téléchargés." ::msgcat::mcset fr "Description:" "Description :" ::msgcat::mcset fr "File not found or not regular file: %s" "Fichier non\ trouvé ou fichier irrégulier: %s" ::msgcat::mcset fr "File to Send:" "Fichier à envoyer :" ::msgcat::mcset fr "File Transfer options." "Options de transfert de\ fichiers." ::msgcat::mcset fr "IP address:" "Adresse IP :" ::msgcat::mcset fr "Receive" "Recevoir" ::msgcat::mcset fr "Receive file from %s" "Fichier reçu de %s" ::msgcat::mcset fr "Request failed: %s" "Echec de la requête : %s" ::msgcat::mcset fr "Save as:" "Sauvegarder sous :" ::msgcat::mcset fr "Send file to %s" "Envoyer un fichier à %s" ::msgcat::mcset fr "Size:" "Taille :" ::msgcat::mcset fr "Transferring..." "Transfert en cours..." # filters.tcl ::msgcat::mcset fr "Action" "Action" ::msgcat::mcset fr "Add" "Ajouter" ::msgcat::mcset fr "Edit" "Editer" ::msgcat::mcset fr "Move down" "Déplacer ver le bas" ::msgcat::mcset fr "Move up" "Déplacer vers le haut" ::msgcat::mcset fr "Remove" "Supprimer" # gpgme.tcl ::msgcat::mcset fr "%s purportedly signed by %s can't be verified.\n\n%s."\ "%s soi-disant signé par %s, ne peut pas être vérifier.\n\n%s." ::msgcat::mcset fr "Change security preferences for %s" "Changer les\ préférences de sécurité pour %s" ::msgcat::mcset fr "Data purportedly sent by %s can't be deciphered.\n\n%s."\ "Les données soi-disant envoyées par %s ne peuvent pas être\ décodées.\n\n%s." ::msgcat::mcset fr "Encrypt traffic" "Crypter le trafic" ::msgcat::mcset fr "Error in signature verification software: %s." "Erreur\ avec le logiciel de vérification de signature : %s." ::msgcat::mcset fr "Key ID" "ID de clef" ::msgcat::mcset fr "Passphrase:" "Phrase de passe :" ::msgcat::mcset fr "Please enter passphrase" "Veuillez entrer une phrase de\ passe" ::msgcat::mcset fr "Please try again" "Veuillez réessayer" ::msgcat::mcset fr "Select" "Sélectionner" ::msgcat::mcset fr "Select Key for Signing Traffic" "Sélectionner une clef\ pour signer le trafic" ::msgcat::mcset fr "Unable to encipher data for %s: %s.\n\nEncrypting traffic\ to this user is now disabled.\n\nSend it as PLAINTEXT?" "Incapable de\ coder les données pour %s : %s.\n\nLe codage du trafic avec cet\ utilisateur est maintenant désactivé.\n\nEnvoyer le texte EN CLAIR ?" ::msgcat::mcset fr "Unable to sign message body: %s.\n\nSigning traffic is\ now disabled.\n\nSend it WITHOUT a signature?" "Incapable de signer\ le corps du message : %s.\n\nLa signature du trafic est maintenant\ désactivée.\n\nEnvoyer SANS signature ?" ::msgcat::mcset fr "Unable to sign presence information: %s.\n\nPresence will\ be sent, but signing traffic is now disabled." "Incapable de signer\ l'information de présence : %s.\n\nLa présence sera envoyée, mais la\ signature du trafic est maintenant désactivée." ::msgcat::mcset fr "User ID" "ID utilisateur" # iface.tcl ::msgcat::mcset fr "Add conference..." "Ajouter une conférence..." ::msgcat::mcset fr "Add user..." "Ajouter un utilisateur..." ::msgcat::mcset fr "Admin tools" "Outils d'administration" ::msgcat::mcset fr "Allow downloading" "Autoriser le téléchargement" ::msgcat::mcset fr "Announce" "Annoncer" ::msgcat::mcset fr "Avatar" "Avatar" ::msgcat::mcset fr "Away" "Absent" ::msgcat::mcset fr "Browser" "Navigateur" ::msgcat::mcset fr "Change password..." "Changer le mot de passe..." ::msgcat::mcset fr "Chats" "Discussions" ::msgcat::mcset fr "Create room..." "Créer un salon..." ::msgcat::mcset fr "Delete message of the day" "Effacer le message du jour" ::msgcat::mcset fr "Discovery" "Découverte" ::msgcat::mcset fr "Do not disturb" "Ne pas déranger" ::msgcat::mcset fr "Edit my info..." "Editer mes informations..." ::msgcat::mcset fr "Extended Away" "Absence prolongée" ::msgcat::mcset fr "Filters..." "Filtres..." ::msgcat::mcset fr "Free to chat" "Libre pour discuter" ::msgcat::mcset fr "Help" "Aide" ::msgcat::mcset fr "Invisible" "Invisible" ::msgcat::mcset fr "Join group..." "Joindre un groupe..." ::msgcat::mcset fr "Log in..." "Connexion..." ::msgcat::mcset fr "Log out" "Déconnexion" ::msgcat::mcset fr "Log out with reason..." "Déconnexion avec une raison..." ::msgcat::mcset fr "Mute" "Muet" ::msgcat::mcset fr "Online" "En ligne" ::msgcat::mcset fr "Presence" "Présence" ::msgcat::mcset fr "Quick help" "Aide rapide" ::msgcat::mcset fr "Quit" "Quitter" ::msgcat::mcset fr "Roster" "Liste de contacts" ::msgcat::mcset fr "Send broadcast message..." "Envoyer un message de\ diffusion..." ::msgcat::mcset fr "Send message of the day..." "Envoyer le message du\ jour..." ::msgcat::mcset fr "Send message..." "Envoyer un message..." ::msgcat::mcset fr "Send raw XML..." "Envoyer du XML brut..." ::msgcat::mcset fr "Send to server" "Envoyer au serveur" ::msgcat::mcset fr "Services" "Services" ::msgcat::mcset fr "Show user info..." "Montrer les informations de\ l'utilisateur..." ::msgcat::mcset fr "Sound" "Son" ::msgcat::mcset fr "Stop autoscroll" "Arrêter le défilement automatique" ::msgcat::mcset fr "Update message of the day..." "Effacer le message du\ jour..." ::msgcat::mcset fr "Jidlink" ::msgcat::mcset fr "Chats:" "Discussions :" ::msgcat::mcset fr "Close tab" "Fermer l'onglet" ::msgcat::mcset fr "Complete nickname" "Completer le surnom" ::msgcat::mcset fr "Correct word" "Corriger le mot" ::msgcat::mcset fr "Hide/Show roster" "Cacher/Montrer la liste de contacts" ::msgcat::mcset fr "Main window:" "Fenêtre principale :" ::msgcat::mcset fr "Previous/Next history message" "Message précédent/suivant\ de l'historique" ::msgcat::mcset fr "Previous/Next tab" "Onglet précédent/suivant" ::msgcat::mcset fr "Quick Help" "Aide rapide" ::msgcat::mcset fr "Redo" "Refaire" ::msgcat::mcset fr "Scroll chat window up/down" "Faire défiler la fenêtre de\ discussion vers le haut/bas" ::msgcat::mcset fr "Show emoticons" "Montrer les émoticons" ::msgcat::mcset fr "Tabs:" "Onglets :" ::msgcat::mcset fr "Undo" "Défaire" ::msgcat::mcset fr "About" "A propos" ::msgcat::mcset fr "Alexey Shchepin" "Alexey Shchepin" ::msgcat::mcset fr "Authors:" "Auteurs :" ::msgcat::mcset fr "Marshall T. Rose" "Marshall T. Rose" ::msgcat::mcset fr "Michail Litvak" "Michail Litvak" ::msgcat::mcset fr "Sergei Golovan" "Sergei Golovan" ::msgcat::mcset fr "Add new user..." "Ajouter un nouvel utilisateur..." ::msgcat::mcset fr "Jabber Browser" "Navigateur Jabber" #::msgcat::mcset ru "Join group..." "ПриÑоединитьÑÑ Ðº группе..." ::msgcat::mcset fr "Cancel" "Annuler" ::msgcat::mcset fr "Close" "Fermer" ::msgcat::mcset fr "Close all tabs" "Fermer tous les onglets" ::msgcat::mcset fr "Close other tabs" "Fermer les autres onglets" ::msgcat::mcset fr "Privacy rules..." "Règles de confidentialité..." ::msgcat::mcset fr "Send" "Envoyer" ::msgcat::mcset fr "Show online & offline users" "Montrer les utilisateurs\ connectés et déconnectés" ::msgcat::mcset fr "Show online users only" "Montrer uniquement les\ utilisateurs connectés" ::msgcat::mcset ru "Toggle encryption (when possible)" "Вкл./выкл. шифрование\ (еÑли возможно)" ::msgcat::mcset ru "Toggle signing" "Вкл./выкл. подпиÑÑŒ" # ifaceck/widgets.tcl ::msgcat::mcset fr "Error" "Erreur" ::msgcat::mcset fr "Question" "Question" ::msgcat::mcset fr "Warning" "Avertissement" # itemedit.tcl ::msgcat::mcset fr "<- Remove" "<- Supprimer" ::msgcat::mcset fr "Add ->" "Ajouter ->" ::msgcat::mcset fr "Available groups" "Groupes disponibles" ::msgcat::mcset fr "Current groups" "Groupes courants" ::msgcat::mcset fr "Edit groups for %s" "Editer les groupes de %s" ::msgcat::mcset fr "Edit nickname for %s" "Editer le surnom de %s" ::msgcat::mcset fr "Edit properties for %s" "Editer les propriétés de %s" ::msgcat::mcset fr "Group:" "Groupe :" ::msgcat::mcset fr "Nickname:" "Surnom :" # jabberlib-tclxml/jabberlib.tcl ::msgcat::mcset fr "Authentication failed" "Echec de l'authentification" ::msgcat::mcset fr "Authentication successful" "Authentification réussie" ::msgcat::mcset fr "Got authentication mechanisms" "Récupération des\ mécanismes d'authentification" ::msgcat::mcset fr "Got roster" "Récupération de la liste des contacts" ::msgcat::mcset fr "Got stream" "Récupération du flux" ::msgcat::mcset fr "Waiting for authentication mechanisms" "Attente des\ mécanismes d'authentification" ::msgcat::mcset fr "Waiting for authentication results" "Attente des\ résultats d'authentification" ::msgcat::mcset fr "Waiting for roster" "Attente de la liste des contacts" ::msgcat::mcset fr "Waiting for stream" "Attente de flux" # jidlink.tcl ::msgcat::mcset fr "Jidlink connection closed" "Connexion Jidlink fermée" ::msgcat::mcset fr "Opening Jidlink connection" "Ouverture d'une connexion\ Jidlink" # joingrdialog.tcl ::msgcat::mcset fr "Add group" "Ajouter un groupe" ::msgcat::mcset fr "Address:" "Addresse :" ::msgcat::mcset fr "Connection:" "Connexion :" ::msgcat::mcset fr "Create" "Créer" ::msgcat::mcset fr "Create Room" "Créer un salon" ::msgcat::mcset fr "Description:" "Description :" ::msgcat::mcset fr "Get conference info failed: %s" "Echec lors de la\ récupération des informations de la conférence : %s" ::msgcat::mcset fr "Group:" "Groupe :" ::msgcat::mcset fr "Join" "Joindre" ::msgcat::mcset fr "Join failed: %s" "Impossible de rejoindre la conférence :\ %s" ::msgcat::mcset fr "Join group" "Joindre un groupe" ::msgcat::mcset fr "Name: " "Nom :" ::msgcat::mcset fr "Nick:" "Surnom :" ::msgcat::mcset fr "Nickname:" "Surnom :" ::msgcat::mcset fr "Password:" "Mot de passe :" ::msgcat::mcset fr "Server:" "Serveur :" ::msgcat::mcset fr "use v2 protocol" "utiliser la version 2 du protocole" # login.tcl ::msgcat::mcset fr "Authentication failed: %s\nCreate new account?"\ "L'authentification a échoué : %s\nCréer un nouveau compte ?" ::msgcat::mcset fr "Change password" "Changer le mot de passe" ::msgcat::mcset fr "Connect via alternate server" "Se connecter via un\ serveur de remplacement" ::msgcat::mcset fr "HTTP proxy address." "Adresse du proxy HTTP." ::msgcat::mcset fr "HTTP proxy password." "Mot de passe pour le proxy HTTP." ::msgcat::mcset fr "HTTP proxy port." "Port du proxy HTTP." ::msgcat::mcset fr "HTTP proxy username." "Nom d'utilisateur pour le proxy\ HTTP." ::msgcat::mcset fr "List of logout reasons." "Liste des raisons de\ déconnexion." ::msgcat::mcset fr "Login" "Connexion" ::msgcat::mcset fr "Login options." "Options de connexion." ::msgcat::mcset fr "Logout" "Se déconecter" ::msgcat::mcset fr "Logout with reason" "Se déconecter avec une raison" ::msgcat::mcset fr "New password:" "Nouveau mot de passe :" ::msgcat::mcset fr "New passwords do not match" "Les nouveaux mots de passe\ ne correspondent pas" ::msgcat::mcset fr "Old password is incorrect" "L'ancien mot de passe est\ incorrect" ::msgcat::mcset fr "Old password:" "Ancien mot de passe :" ::msgcat::mcset fr "Password change failed: %s" "Le changement de mot de\ passe a échoué : %s" ::msgcat::mcset fr "Password is changed" "Le mot de passe est changé" ::msgcat::mcset fr "Password." "Mot de passe." ::msgcat::mcset fr "Password:" "Mot de passe :" ::msgcat::mcset fr "Priority." "Priorité." ::msgcat::mcset fr "Priority:" "Priorité :" ::msgcat::mcset fr "Profiles" "Profiles" ::msgcat::mcset fr "Proxy Login:" "Identifiant proxy :" ::msgcat::mcset fr "Proxy Password:" "Mot de passe proxy :" ::msgcat::mcset fr "Proxy Port:" "Port proxy :" ::msgcat::mcset fr "Proxy Server:" "Serveur proxy :" ::msgcat::mcset fr "Reason:" "Raison :" ::msgcat::mcset fr "Registration failed: %s" "L'enregistrement a échoué : %s" ::msgcat::mcset fr "Repeat new password:" "Répétez le nouveau mot de passe :" ::msgcat::mcset fr "Replace opened connections" "Remplacer les connexions\ ouvertes" ::msgcat::mcset fr "Replace opened connections." "Remplacer les connexions\ ouvertes." ::msgcat::mcset fr "Resource." "Ressource." ::msgcat::mcset fr "Resource:" "Ressource :" ::msgcat::mcset fr "Server name or IP-address." "Nom du serveur ou adresse\ IP." ::msgcat::mcset fr "Server name." "Nom du serveur." ::msgcat::mcset fr "Server port." "Port du serveur." ::msgcat::mcset fr "Server:" "Serveur :" ::msgcat::mcset fr "SSL port." "Port SSL." ::msgcat::mcset fr "SSL Port:" "Port SSL :" ::msgcat::mcset fr "Use explicitly-specified server address." "Utiliser une\ adresse d'un serveur explicitement spécifié." ::msgcat::mcset fr "Use hashed password" "Utiliser un mot de passe hache" ::msgcat::mcset fr "Use HTTP proxy to connect." "Utiliser un proxy HTTP pour\ se connecter." ::msgcat::mcset fr "Use Proxy" "Utiliser un proxy" ::msgcat::mcset fr "Use SSL" "Utiliser SSL" ::msgcat::mcset fr "Use SSL to connect to server." "Utiliser SSL pour se\ connecter au serveur." ::msgcat::mcset fr "User name." "Nom d'utilisateur." ::msgcat::mcset fr "Username:" "Nom d'utilisateur :" # messages.tcl ::msgcat::mcset fr "Attached file:" "Fichier attaché :" ::msgcat::mcset fr "Attached user:" "Utilisateur attaché :" ::msgcat::mcset fr "Extras from" "Extras de" ::msgcat::mcset fr "Extras from %s" "Extras de %s" ::msgcat::mcset fr "Headlines" "Messages informatifs" ::msgcat::mcset fr "Invited to:" "Inviter :" ::msgcat::mcset fr "Message body" "Corps du message" ::msgcat::mcset fr "Message from" "Message de" ::msgcat::mcset fr "Message from %s" "Message de %s" ::msgcat::mcset fr "Reply" "Répondre" ::msgcat::mcset fr "Send message" "Envoyer un message" ::msgcat::mcset fr "Send message to %s" "Envoyer un message à %s" ::msgcat::mcset fr "Send subscription" "Envoyer un abonnement" ::msgcat::mcset fr "Send subscription to " "Envoyer un abonnement à " ::msgcat::mcset fr "Send subscription to %s" "Envoyer un abonnement à %s" ::msgcat::mcset fr "Sort" "Tri" ::msgcat::mcset fr "Subscribe" "S'abonner" ::msgcat::mcset fr "Subscribe request from" "Requête d'enregistrement de" ::msgcat::mcset fr "Subscribe request from %s" "Requête d'enregistrement de\ %s" ::msgcat::mcset fr "Unsubscribe" "Se désabonner" ::msgcat::mcset ru "Toggle seen" "Вкл./выкл. отображение проÑмотренных" # muc.tcl ::msgcat::mcset fr "Ban" "Exclure" ::msgcat::mcset fr "Kick" "Ejecter" ::msgcat::mcset fr "Whois" "Qui est-ce" #::msgcat::mcset ru "Grant Voice" "" #::msgcat::mcset ru "Revoke Voice" "" #::msgcat::mcset ru "Grant Membership" "" #::msgcat::mcset ru "Revoke Membership" "" #::msgcat::mcset ru "Grant Moderator Privilege" "" #::msgcat::mcset ru "Revoke Moderator Privilege" "" #::msgcat::mcset ru "MUC" "" ::msgcat::mcset fr "Configure" "Configurer" ::msgcat::mcset fr "Destroy" "Détruire" ::msgcat::mcset fr "Edit ban list..." "Editer la liste des exclus..." ::msgcat::mcset fr "Edit member list..." "Editer la liste des membres..." ::msgcat::mcset fr "Edit moderator list..." "Editer la liste des\ modérateurs..." ::msgcat::mcset ru "Edit voice list..." # plugins/chat/draw_xhtml_message.tcl ::msgcat::mcset fr "Enable rendering of XHTML messages." "Activer le rendu\ des messages XHTML" # presence.tcl #::msgcat::mcset fr "Away" "Absent" ::msgcat::mcset fr "Change Presence Priority" "Changer la priorité de\ présence" #::msgcat::mcset fr "Do not disturb" "Ne pas dérangé" ::msgcat::mcset fr "Extended Away" "Absence prolongée" #::msgcat::mcset fr "Free to chat" "Libre pour discuter" ::msgcat::mcset fr "invalid userstatus value " "Valeur pour le statut\ utilisateur invalide " #::msgcat::mcset fr "Invisible" "Invisible" ::msgcat::mcset fr "Not logged in" "Non connecté" ::msgcat::mcset fr "Offline" "Déconnecté" #::msgcat::mcset fr "Online" "En ligne" # register.tcl ::msgcat::mcset fr "Register in %s" "S'enregistrer à %s" ::msgcat::mcset fr "Unsubscribed from %s" "Se désabonner de %s" ::msgcat::mcset fr "We unsubscribed from %s" "Nous sommes désabonnés de %s" # roster.tcl ::msgcat::mcset fr "Active Chats" "Discussions actives" ::msgcat::mcset fr "Are you sure to remove %s from roster?" "Etes-vous sûr de\ supprimer %s de la liste de contacts ?" ::msgcat::mcset fr "available" "disponible" ::msgcat::mcset fr "away" "absent(e)" ::msgcat::mcset fr "Contact Information" "Information du contact" ::msgcat::mcset fr "Edit item..." "Editer l'objet..." ::msgcat::mcset fr "Edit security..." "Editer la sécurité..." ::msgcat::mcset fr "Invite to conference..." "Inviter à une conférence..." ::msgcat::mcset fr "is now" "est maintenant" ::msgcat::mcset fr "Join..." "Joindre..." ::msgcat::mcset fr "Log in" "Se connecter" ::msgcat::mcset fr "Log out" "Se déconnecter" ::msgcat::mcset fr "No users in roster..." "Pas de contacts dans la liste..." ::msgcat::mcset fr "Raw XML" "XML brut" ::msgcat::mcset fr "Remove..." "Supprimer..." ::msgcat::mcset fr "Resubscribe" "Se réabonner" ::msgcat::mcset fr "Send" "Envoyer" ::msgcat::mcset fr "Send contacts to %s" "Envoyer des contacts à %s" ::msgcat::mcset fr "Send file via Jidlink..." "Envoyer un fichier via\ Jidlink..." ::msgcat::mcset fr "Send file..." "Envoyer un fichier..." ::msgcat::mcset fr "Send users..." "Envoyer des utilisateurs..." ::msgcat::mcset fr "Show history" "Montrer l'historique" ::msgcat::mcset fr "Show info" "Montrer les informations" ::msgcat::mcset fr "Start chat" "Démarrer la discussion" ::msgcat::mcset fr "unavailable" "indisponible" ::msgcat::mcset fr "Undefined" "Indéfini" ::msgcat::mcset fr "xa" "en absence prolongée" # search.tcl ::msgcat::mcset fr "An error is occurred when searching in %s\n\n%s" "Une\ erreur est survenue lors de la recherche de %s\n\n%s" ::msgcat::mcset fr "An error occurred when searching in %s\n\n%s" "Une erreur\ est survenue lors de la recherche de %s\n\n%s" ::msgcat::mcset fr "OK" "OK" ::msgcat::mcset fr "Search" "Rechercher" ::msgcat::mcset fr "Search again" "Rechercher encore" ::msgcat::mcset fr "Search in" "Rechercher dans" ::msgcat::mcset fr "Search in %s" "Rechercher dans %s" ::msgcat::mcset fr "Search in %s: No matching items found" "Rechercher dans\ %s : aucune correspondance trouvée" ::msgcat::mcset fr "Search: %s" "Rechercher : %s" ::msgcat::mcset fr "Try again" "Essayer encore" # splash.tcl ::msgcat::mcset fr "auto-away" "absence automatique" ::msgcat::mcset fr "avatars" "avatars" ::msgcat::mcset fr "balloon help" "bulle d'aide" ::msgcat::mcset fr "browsing" "navigation" ::msgcat::mcset fr "configuration" "configuration" ::msgcat::mcset fr "connections" "connexions" ::msgcat::mcset fr "cryptographics" "cryptographie" ::msgcat::mcset fr "emoticons" "émoticons" ::msgcat::mcset fr "extension management" "gestion des extensions" ::msgcat::mcset fr "file transfer" "transfert de fichiers" ::msgcat::mcset fr "jabber chat" "discussion jabber" ::msgcat::mcset fr "jabber groupchats" "groupes de discussion jabber" ::msgcat::mcset fr "jabber iq" "jabber iq" ::msgcat::mcset fr "jabber presence" "présence jabber" ::msgcat::mcset fr "jabber registration" "enregistrement jabber" ::msgcat::mcset fr "message/headline" "message informatif" ::msgcat::mcset fr "plugin management" "Gestion des plugins" ::msgcat::mcset fr "presence" "présence" ::msgcat::mcset fr "rosters" "liste de contacts" ::msgcat::mcset fr "searching" "recherche" ::msgcat::mcset fr "text undo" "défaire le texte" ::msgcat::mcset fr "user interface" "interface utilisateur" ::msgcat::mcset fr "utilities" "utilités" ::msgcat::mcset fr "jabber xml" ::msgcat::mcset fr "kde" ::msgcat::mcset fr "wmaker" # userinfo.tcl ::msgcat::mcset fr "%s info" "Informations de %s" ::msgcat::mcset fr "Address" "Adresse" ::msgcat::mcset fr "Address 2:" "Adresse 2 :" ::msgcat::mcset fr "Address:" "Adresse :" ::msgcat::mcset fr "BBS:" "BBS :" ::msgcat::mcset fr "Cell:" "Cellulaire :" ::msgcat::mcset fr "City:" "Ville :" ::msgcat::mcset fr "Country:" "Pays :" ::msgcat::mcset fr "Details" "Détails" ::msgcat::mcset fr "E-mail:" "E-Mail :" ::msgcat::mcset fr "Family Name:" "Nom de famille :" ::msgcat::mcset fr "Fax:" "Fax :" ::msgcat::mcset fr "Full Name:" "Nom complet :" ::msgcat::mcset fr "Geographical position" "Position géographique" ::msgcat::mcset fr "Home:" "Maison :" ::msgcat::mcset fr "Information" "Informations" ::msgcat::mcset fr "ISDN:" "RNIS :" ::msgcat::mcset fr "JID:" "JID :" ::msgcat::mcset fr "Latitude:" "Latitude :" ::msgcat::mcset fr "Location" "Localisation" ::msgcat::mcset fr "Longitude:" "Longitude :" ::msgcat::mcset fr "Message Recorder:" "Répondeur :" ::msgcat::mcset fr "Middle Name:" "Autre nom :" ::msgcat::mcset fr "Modem:" "Modem :" ::msgcat::mcset fr "Name" "Nom" ::msgcat::mcset fr "Name:" "Nom :" ::msgcat::mcset fr "Nickname:" "Surnom :" ::msgcat::mcset fr "Organization" "Organisation" ::msgcat::mcset fr "Pager:" "Alphapage :" ::msgcat::mcset fr "PCS:" "PCS :" ::msgcat::mcset fr "Personal" "Informations personnelles" ::msgcat::mcset fr "Phones" "Téléphones" ::msgcat::mcset fr "Postal Code:" "Code postal :" ::msgcat::mcset fr "Preferred:" "Préféré :" ::msgcat::mcset fr "Prefix:" "Préfixe :" ::msgcat::mcset fr "Show" "Montrer" ::msgcat::mcset fr "Show user info" "Montrer les informations de\ l'utilisateur" ::msgcat::mcset fr "State:" "Etat :" ::msgcat::mcset fr "Suffix:" "Suffixe :" ::msgcat::mcset fr "Telephone numbers" "Numéros de téléphone" ::msgcat::mcset fr "UID:" "UID :" ::msgcat::mcset fr "Video:" "Vidéo :" ::msgcat::mcset fr "Voice:" "Voix :" ::msgcat::mcset fr "Web Site:" "Site web :" ::msgcat::mcset fr "Work:" "Travail :" # Space at the end of the next word is to distinguish it from another "Name:" ::msgcat::mcset fr "Name: " "Nom :" ::msgcat::mcset fr "Unit:" "Unité :" # Space at the end of the next word is to distinguish it from # another "Personal" ::msgcat::mcset fr "Personal " "Personnel" ::msgcat::mcset fr "Role:" "Rôle :" ::msgcat::mcset fr "Title:" "Titre :" # Space at the end of the next word is to distinguish it from another "About" ::msgcat::mcset fr " by " " par " ::msgcat::mcset fr "About " "A propos" ::msgcat::mcset fr "Avatar" "Avatar" ::msgcat::mcset fr "Birthday" "Date de naissance" ::msgcat::mcset fr "Birthday:" "Date de naissance :" ::msgcat::mcset fr "Client" "Client" ::msgcat::mcset fr "Client Info" "Info client" ::msgcat::mcset fr "Client:" "Client :" ::msgcat::mcset fr "Computer" "Ordinateur" ::msgcat::mcset fr "Day:" "Jour :" ::msgcat::mcset fr "Description:" "Description :" ::msgcat::mcset fr "Image" "Image" ::msgcat::mcset fr "Interval:" "Intervalle :" ::msgcat::mcset fr "Last activity" "Dernière date d'activité" ::msgcat::mcset fr "Last Activity or Uptime" "Dernière date d'activité" ::msgcat::mcset fr "List of users for userinfo." "Liste des utilisateurs pour\ userinfo" ::msgcat::mcset fr "Load Image" "Charger une image" ::msgcat::mcset fr "Month:" "Mois :" ::msgcat::mcset fr "None" "Aucune" ::msgcat::mcset fr "OS:" "SE :" ::msgcat::mcset fr "Photo" "Photo" ::msgcat::mcset fr "Presence" "Présence" ::msgcat::mcset fr "Presence id signed" "Id de présence signé" ::msgcat::mcset fr "Presence is signed" "Présence signée" ::msgcat::mcset fr "Service info" "Informations du service" ::msgcat::mcset fr "Time" "Heure" ::msgcat::mcset fr "Time Zone:" "Fuseau horaire :" ::msgcat::mcset fr "Time:" "Heure :" ::msgcat::mcset fr "Uptime" "Durée de la connexion" ::msgcat::mcset fr "URL" "URL" ::msgcat::mcset fr "URL:" "URL :" ::msgcat::mcset fr "User info" "Informations de l'utilisateur" ::msgcat::mcset fr "UTC:" "UTC :" ::msgcat::mcset fr "Version" "Version" ::msgcat::mcset fr "Version:" "Version :" ::msgcat::mcset fr "Year:" "Année :" # utils.tcl ::msgcat::mcset fr "day" "jour" ::msgcat::mcset fr "days" "jours" ::msgcat::mcset fr "hour" "heure" ::msgcat::mcset fr "hours" "heures" ::msgcat::mcset fr "minute" "minute" ::msgcat::mcset fr "minutes" "minutes" ::msgcat::mcset fr "second" "seconde" ::msgcat::mcset fr "seconds" "secondes" # plugins/chat/clear.tcl ::msgcat::mcset fr "Clear chat window" "Effacer la fenêtre de discusssion" # plugins/chat/draw_xhtml_message.tcl ::msgcat::mcset fr "Enable rendering of XHTML messages" "Activer le rendu des\ messages XHTML" # plugins/chat/events.tcl ::msgcat::mcset fr "%s is composing a reply" "%s rédige une réponse" ::msgcat::mcset fr "Composing a reply" "Rédaction d'une réponse" ::msgcat::mcset fr "Message delivered" "Message délivré" ::msgcat::mcset fr "Message delivered to %s" "Message délivré à %s" ::msgcat::mcset fr "Message displayed" "Message affiché" ::msgcat::mcset fr "Message displayed to %s" "Message affiché chez %s" ::msgcat::mcset fr "Message stored on %s's server" "Message stocké sur le\ serveur de %s" ::msgcat::mcset fr "Message stored on the server" "Message stocké sur le\ serveur" # plugins/chat/logger.tcl ::msgcat::mcset fr "Directory to store logs." "Répertoire pour stocker les\ journaux." ::msgcat::mcset fr "Export to XHTML" "Exporter en XHTML" ::msgcat::mcset fr "History for %s" "Historique pour %s" ::msgcat::mcset fr "Logging options." "Options de journalisation." ::msgcat::mcset fr "Search direction" "Sens de la recherche" ::msgcat::mcset fr "Store group chats logs." "Stocker les journaux des\ discussions de groupe." ::msgcat::mcset fr "Store private chats logs." "Stocker les journaux des\ discussions privées." # plugins/clientinfo.tcl ::msgcat::mcset fr "\n\tClient: %s" "\n\tClient : %s" ::msgcat::mcset fr "\n\tName: %s" "\n\tNom : %s" ::msgcat::mcset fr "\n\tOS: %s" "\n\tSE : %s" # plugins/general/message_archive.tcl ::msgcat::mcset fr "Messages" "Messages" # plugins/general/tkcon.tcl ::msgcat::mcset fr "Show Console" "Montrer la console" # plugins/jidlink/dtcp.tcl ::msgcat::mcset fr "Opening DTCP active connection" "Ouverture d'une\ connexion DTCP active" ::msgcat::mcset fr "Opening DTCP passive connection" "Ouverture d'une\ connexion DTCP passive" # plugins/jidlink/ibb.tcl ::msgcat::mcset fr "Opening IBB connection" "Ouverture d'une connexion IBB" # unix/autoaway.tcl # "Automatically away due to idle" goes to textstatus (probably # no needs to translate) ::msgcat::mcset fr "Automatically away due to idle" "Absence automatique\ suite à une inactivité" # rest should be translated ::msgcat::mcset fr "Idle for %s" "Inactivité de %s" ::msgcat::mcset fr "Moving to extended away" "Passage en absence prolongée" ::msgcat::mcset fr "Returning from auto-away" "Retour d'une absence\ automatique" ::msgcat::mcset fr "Starting auto-away" "Début de l'absence automatique" # unix/dockingtray.tcl ::msgcat::mcset fr "Hide Main Window" "Cacher la fenêtre principale" ::msgcat::mcset fr "Show Main Window" "Montrer la fenêtre principale" # unix/ispell.tcl ::msgcat::mcset fr "- nothing -" "- rien -" # unix/wmdock.tcl ::msgcat::mcset fr "%s is %s" "%s est %s" ::msgcat::mcset fr "%s msgs" "%s msgs" # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/msgs/it.msg000064400000000000000000002400551477701321300141540ustar00nobodynobody# it.msg -- # # Italian messages for the Tkabber XMPP client # # Author: Antonino Iacono # Updated: Mikhail Zakharenko # jabberlib-tclxml/jlibcomponent.tcl ::msgcat::mcset it "Handshake failed" "Stretta di mano non riuscita" ::msgcat::mcset it "Handshake successful" "Stretta di mano riuscita" ::msgcat::mcset it "Waiting for handshake results" "Attesa dei resultati\ della stretta di mano" # plugins/chat/chatstate.tcl ::msgcat::mcset it "%s has activated chat window" "%s ha attivato la finestra\ della conversazione" ::msgcat::mcset it "%s has gone chat window" "%s ha chiuso la finestra della\ conversazione" ::msgcat::mcset it "%s has inactivated chat window" "%s ha disattivato la\ finestra della conversazione" ::msgcat::mcset it "%s is composing a reply" "%s sta scrivendo la risposta" ::msgcat::mcset it "%s is paused a reply" "% si è fermato scrivendo la\ risposta" ::msgcat::mcset it "Chat message window state plugin options." "Opzioni delle\ notifiche dello stato di conversazione" ::msgcat::mcset it "Chat window is active" "Finestra di conversazione è\ attiva" ::msgcat::mcset it "Chat window is gone" "La finestra di conversazione è\ stata chiusa" ::msgcat::mcset it "Chat window is inactive" "La finestra di conversazione\ non è attiva" ::msgcat::mcset it "Composing a reply" "Sta scrivendo la risposta" ::msgcat::mcset it "Enable sending chat state notifications." "Attivare invio\ delle notifiche dello stato di chat" ::msgcat::mcset it "Paused a reply" "Si e fermato scrivendo la risposta" # jabberlib-tclxml/jabberlib.tcl ::msgcat::mcset it "Got roster" "Contatti ricevuti" ::msgcat::mcset it "Timeout" "Timeout" ::msgcat::mcset it "Waiting for roster" "Attesa dei contatti" # plugins/richtext/stylecodes.tcl ::msgcat::mcset it "Emphasize stylecoded messages using different fonts."\ "Evidenziare messagi stilizzati usando altro tipo di caratteri" ::msgcat::mcset it "Handling of \"stylecodes\". Stylecodes are (groups of)\ special formatting symbols used to emphasize parts of the text by\ setting them with boldface, italics or underlined styles, or as\ combinations of these." "Elaborazione di \"stylecodes\". Stylecodes\ sono caratteri speciali che servono per evidenziare il testo con\ grasetto, corsivo o sottolineato e le loro combinazioni." # chats.tcl ::msgcat::mcset it "%s has changed nick to %s." "%s ora è conosciuto come %s" ::msgcat::mcset it "/me has set the subject to: %s" "/me ha cambiato\ l'argomento а: %s" ::msgcat::mcset it "Chat" "Conversare" ::msgcat::mcset it "Chat " "Conversazione" ::msgcat::mcset it "Chat options." "Opzioni di conversazione." ::msgcat::mcset it "Connection:" "Conessioni:" ::msgcat::mcset it "Default message type (if not specified explicitly)."\ "Tipo di messagio predefinito (se non è specificato)" ::msgcat::mcset it "Display description of user status in chat windows."\ "Visualizzare descrizione dello status del utente nella finestra di\ conversazione" ::msgcat::mcset it "Enable chat window autoscroll only when last message is\ shown." "Abilitare auto-scorrimento nella finestra di conversazione\ solo quando ultimo messagio e visualizzato" ::msgcat::mcset it "Generate chat messages when chat peer changes his/her\ status and/or status message" "Generare messagio di conversazione\ quando partecipante cambia suo status o messagio di status" ::msgcat::mcset it "List of users for chat." "Lista degli utenti per\ conversazione" ::msgcat::mcset it "Moderators" "Moderatori" ::msgcat::mcset it "No conferences for %s in progress..." "Nessuna conferenza\ per %s in progresso..." ::msgcat::mcset it "No users in %s roster..." "Nessun utente nei contatti di\ %s" ::msgcat::mcset it "Normal" "Normale" ::msgcat::mcset it "Open chat" "Aprire la finestra di conversazione" ::msgcat::mcset it "Open new conversation" "Aprire una nuova finestra di\ conversazione" ::msgcat::mcset it "Opens a new chat window for the new nick of the room\ occupant" "Aprire una nuova finestra di conversazione per ogni nick\ dell abitante della conferenza" ::msgcat::mcset it "Participants" "Partecipanti" ::msgcat::mcset it "Stop chat window autoscroll." "Fermare auto-scorrimento" ::msgcat::mcset it "Subject is set to: %s" "Argomento è: %s" ::msgcat::mcset it "Users" "Utenti" ::msgcat::mcset it "Visitors" "Ospiti" # custom.tcl ::msgcat::mcset it "Customization of the One True Jabber Client."\ "Personalizzare One True Jabber Client" ::msgcat::mcset it "Customize" "Personalizzare" ::msgcat::mcset it "Open" "Aprire" ::msgcat::mcset it "Parent group" "Categoria di livello superiore" ::msgcat::mcset it "Parent groups" "Categorie di livello superiore" ::msgcat::mcset it "Reset to current value" "Resettare a valore corrente" ::msgcat::mcset it "Reset to default value" "Resettare a valore predefenito" ::msgcat::mcset it "Reset to saved value" "Resettare a valore salvato" ::msgcat::mcset it "Reset to value from config file" "Resettare a valore da\ file di configurazione" ::msgcat::mcset it "Set for current and future sessions" "Stabilire per\ sessione corrente e quelle future" ::msgcat::mcset it "Set for current session only" "Stabilire solo per\ sessione corrente" ::msgcat::mcset it "State" "Stato" ::msgcat::mcset it "the option is set and saved." "la opzione è stabilita e\ salvata." ::msgcat::mcset it "the option is set to its default value." "la opzione e\ stabilita con il valore predefenito." ::msgcat::mcset it "the option is set, but not saved." "la opzione e\ stabilita, ma non salvata." ::msgcat::mcset it "the option is taken from config file." "la opzione\ ripresa dal file di configurazione." ::msgcat::mcset it "value is changed, but the option is not set." "valore è\ cambiato, ma la opzione non è stabilita." # plugins/windows/taskbar.tcl ::msgcat::mcset it "Enable windows tray icon." "Attivare tray icon" # plugins/general/message_archive.tcl ::msgcat::mcset it "#" "#" ::msgcat::mcset it "Dir" "Direzione" ::msgcat::mcset it "From/To" "Da/A" ::msgcat::mcset it "From:" "Da:" ::msgcat::mcset it "Messages" "Messagi" ::msgcat::mcset it "Received/Sent" "Ricevuto/Spedito" ::msgcat::mcset it "Subject" "Argomento" ::msgcat::mcset it "To:" "A:" # plugins/si/socks5.tcl ::msgcat::mcset it "Cannot connect to proxy" "Conessione a proxy non\ riuscita" ::msgcat::mcset it "Cannot negotiate proxy connection" "Impossibile negoziare\ con conessione proxy" ::msgcat::mcset it "Illegal result" "Risultato illecito" ::msgcat::mcset it "List of proxy servers for SOCKS5 bytestreams (all\ available servers will be tried for mediated connection)." "Lista di\ proxy servers per SOCKS5 flusso (tutti server disponibili saranno\ provati per conessione mediata)" ::msgcat::mcset it "Opening SOCKS5 listening socket" "Apertura SOCKS5 socket\ ricevente" ::msgcat::mcset it "Use mediated SOCKS5 connection if proxy is available."\ "Usare conessione SOCKS5 mediata se proxy non è disponibile." # ifacetk/systray.tcl ::msgcat::mcset it "Available" "Disponibile" ::msgcat::mcset it "Display status tooltip when main window is minimized to\ systray." "Visualizza finestra di status quando finestra principale e\ minimizzata a systray." ::msgcat::mcset it "Systray icon blinks when there are unread messages."\ "Systray icon lampeggia quando ci sono messagi non letti." ::msgcat::mcset it "Systray icon options." "Opzioni di icon systray" ::msgcat::mcset it "Tkabber Systray" "Tkabber Systray" # ifaceck/iroster.tcl ::msgcat::mcset it "Add group by regexp on JIDs..." "Aggiungere categoria\ usando regexp su JIDs..." ::msgcat::mcset it "Add roster group by JID regexp" "Aggiungere categoria di\ contatti usando JID regexp" ::msgcat::mcset it "Are you sure to remove group '%s' from roster?" "Sei\ sicuro di eliminare categoria '%s' dalla lista dei contatti?" ::msgcat::mcset it "Extended away" "Away estenso" ::msgcat::mcset it "JID regexp:" "JID regexp:" ::msgcat::mcset it "New group name:" "Nuovo nome della categoria:" ::msgcat::mcset it "Remove group..." "Elimina categoria..." ::msgcat::mcset it "Remove item..." "Elimina oggetto..." ::msgcat::mcset it "Rename group..." "Rinomina categoria..." ::msgcat::mcset it "Rename roster group" "Rinomina categoria di contatti" ::msgcat::mcset it "Resubscribe to all users in group..." "Reabonarsi a tutti\ gli utenti nella categoria..." ::msgcat::mcset it "Roster options." "Opzioni della lista dei contatti." ::msgcat::mcset it "Send custom presence" "Inviare presenza personalizzata" ::msgcat::mcset it "Unavailable" "Non disponibile" # plugins/chat/events.tcl ::msgcat::mcset it "Message delivered" "Messaggio consegnato con sucesso" ::msgcat::mcset it "Message delivered to %s" "Messaggio consegnato a %s" ::msgcat::mcset it "Message displayed" "Messaggio visualizzato" ::msgcat::mcset it "Message displayed to %s" "Message visualizzato da %s" ::msgcat::mcset it "Message stored on %s's server" "Messaggio salvato salvato\ sul %s's server" ::msgcat::mcset it "Message stored on the server" "Messaggio salvato sul\ server" ::msgcat::mcset it "Chat message events plugin options." ::msgcat::mcset it "Enable sending chat message events." # plugins/filetransfer/http.tcl ::msgcat::mcset it "Can't receive file: %s" "Impossibile ricevere file: %s" ::msgcat::mcset it "Force advertising this hostname (or IP address) for\ outgoing HTTP file transfers." "Avvertimento forzato di questo\ hostname (o indirizzo IP) di HTTP trasferimenti in uscita" ::msgcat::mcset it "HTTP options." "Opzioni HTTP" ::msgcat::mcset it "Port for outgoing HTTP file transfers (0 for assigned\ automatically). This is useful when sending files from behind a NAT\ with a forwarded port." "Port di uscita per HTTP trasfermenti (0 per\ assegnato automaticamente). Questo è molto utile quando file sono\ inviati dietro il NAT con forwarded port." # privacy.tcl ::msgcat::mcset it "Activate lists at startup" "Attivare la lista all avvio" ::msgcat::mcset it "Activate visible/invisible/ignore/conference lists before\ sending initial presence." "Attivare le liste\ visibile/invisibile/ignore/conference prima di inviare presenza\ iniziale." ::msgcat::mcset it "Activating privacy list failed: %s\n\nTry to reconnect.\ If problem persists, you may want to disable privacy list activation\ at start" "Inizializzazione della privacy lista non riuscita:\ %s\n\nProva a reconetterti. Se problema non si risolve prova a\ disabilitare attivazione della lista privacy all invio" ::msgcat::mcset it "Active" "Attivo" ::msgcat::mcset it "Add item" "Aggiungere sogetto" ::msgcat::mcset it "Add JID" "Aggiungere JID " ::msgcat::mcset it "Add list" "Aggiungere lista" ::msgcat::mcset it "Blocking communication (XMPP privacy lists) options."\ "Opzioni del blocco delle communicazioni (la privacy lista di XMPP)." ::msgcat::mcset it "Changing accept messages from roster only: %s" "Cambiare\ acettazione dei messaggi solo dagli utenti in lista: %s" ::msgcat::mcset it "Creating default privacy list" "Creazione della lista\ privacy predefenita" ::msgcat::mcset it "Creating default privacy list failed: %s\n\nTry to\ reconnect. If problem persists, you may want to disable privacy list\ activation at start" "Creazione della privacy lista non riuscita:\ %s\n\nProva a reconetterti. Se problema non si risolve prova a\ disabilitare attivazione della lista privacy all invio" ::msgcat::mcset it "Default" "Predefinito " ::msgcat::mcset it "Down" "Giu" ::msgcat::mcset it "Edit conference list" "Modificare la lista delle\ conferenze" ::msgcat::mcset it "Edit ignore list" "Modificare la lista degli ignorati" ::msgcat::mcset it "Edit invisible list" "Modificare la lista degli\ invisibili" ::msgcat::mcset it "Edit list" "Modificare la lista" ::msgcat::mcset it "Edit privacy list" "Modificare la lista privacy" ::msgcat::mcset it "Edit visible list" "Modificare la lista dei visibili" ::msgcat::mcset it "Ignore list" "La lista degli ignorati" ::msgcat::mcset it "Invisible list" "La lista degli invisibili" ::msgcat::mcset it "IQ" "IQ" ::msgcat::mcset it "List name" "Nome della lista" ::msgcat::mcset it "Message" "Messaggio" ::msgcat::mcset it "No active list" "Nessuna lista attiva" ::msgcat::mcset it "No default list" "Nessuna lista predefinita" ::msgcat::mcset it "Presence-in" "Presenza-in" ::msgcat::mcset it "Presence-out" "Presenza-out" ::msgcat::mcset it "Privacy list is activated" "La lista privacy è attivata" ::msgcat::mcset it "Privacy list is not activated" "La lista privacy non è\ attivata" ::msgcat::mcset it "Privacy list is not created" "La lista privacy non\ creata" ::msgcat::mcset it "Privacy lists" "Liste privacy" ::msgcat::mcset it "Privacy lists are not implemented" "Liste privacy non\ implementati" ::msgcat::mcset it "Privacy lists are unavailable" "Liste privacy non\ disponibili" ::msgcat::mcset it "Privacy lists error" "Errore delle liste privacy" ::msgcat::mcset it "Privacy rules" "Privacy regole" ::msgcat::mcset it "Remove from list" "Rimuovi dalla lista" ::msgcat::mcset it "Remove list" "Rimuovi la lista" ::msgcat::mcset it "Requesting conference list: %s" "Richiesta della lista di\ conferenze : %s" ::msgcat::mcset it "Requesting ignore list: %s" "Richiesta della lista degli\ ignorati: %s" ::msgcat::mcset it "Requesting invisible list: %s" "Richiesta della degli\ invisibili: %s" ::msgcat::mcset it "Requesting privacy list: %s" "Richiesta della lista\ privacy: %s" ::msgcat::mcset it "Requesting privacy rules: %s" "Richiesta delle privacy\ regole: %s" ::msgcat::mcset it "Requesting visible list: %s" "Richiesta della lista dei\ visibili: %s" ::msgcat::mcset it "Sending conference list: %s" "Invio della lista delle\ conferenze: %s" ::msgcat::mcset it "Sending ignore list: %s" "Invio della lista degli\ ignorati: %s" ::msgcat::mcset it "Sending invisible list: %s" "Invio della lista degli\ invisibile: %s" ::msgcat::mcset it "Sending visible list: %s" "Invio della lista degli\ visibili: %s" ::msgcat::mcset it "Type" "Tipo" ::msgcat::mcset it "Up" "Su" ::msgcat::mcset it "Value" "Valore" ::msgcat::mcset it "Visible list" "Lista dei visibili" ::msgcat::mcset it "Waiting for activating privacy list" "Attesa\ dell'attivazione della lista privacy" # plugins/general/copy_jid.tcl ::msgcat::mcset it "Copy JID to clipboard" "Copiare JID" # gpgme.tcl ::msgcat::mcset it "\n\tPresence is signed:" "\n\tPresenza segnata" ::msgcat::mcset it "Display warning dialogs when signature verification\ fails." "Visualizzare un avvertimento quando controllo della\ signatura e fallito." ::msgcat::mcset it "Encrypt traffic (when possible)" "Criptare traffic\ (quando possibile)" ::msgcat::mcset it "Encryption" "Criptamento" ::msgcat::mcset it "Error in signature processing" "Errore nell elaborazione\ di signatura" ::msgcat::mcset it "Fetch GPG key" "Prelieva GPG key" ::msgcat::mcset it "GPG options (signing and encryption)." "Opzioni di GPG\ (signatura e criptamento)" ::msgcat::mcset it "GPG-encrypt outgoing messages where possible." "Cripta\ con GPG messaggi in uscita quando possibile." ::msgcat::mcset it "GPG-sign outgoing messages and presence updates." "Segna\ con GPG messagi in uscita e aggiornamenti della presenza." ::msgcat::mcset it "Invalid signature" "Signatura non valida" ::msgcat::mcset it "Malformed signature block" "Signatura malformata" ::msgcat::mcset it "Multiple signatures having different authenticity"\ "Signature differenti hanno una autenticita diversa" ::msgcat::mcset it "No information available" "Nessun informazione\ disponibile" ::msgcat::mcset it "Presence information" "Informazione della presenza" ::msgcat::mcset it "Presence is signed" "Presenza segnata" ::msgcat::mcset it "Select Key for Signing %s Traffic" "Seleziona la chiave\ per segnare %s Traffic" ::msgcat::mcset it "Sign traffic" "Segna traffic" ::msgcat::mcset it "Signature not processed due to missing key" "Signatura\ non verificata perche la chiave non c'e" ::msgcat::mcset it "The signature is good but has expired" "Signatura è buona\ ma è scaduta" ::msgcat::mcset it "The signature is good but the key has expired" "Signatura\ è buona ma la chiave è scaduta" ::msgcat::mcset it "Use specified key ID for signing and decrypting\ messages." "Usare ID della chiave specifico per segnare e decriptare\ messaggi." ::msgcat::mcset it "Use the same passphrase for signing and decrypting\ messages." "Usare la stessa frase identificativa per segnare e\ decriptare i messaggi." ::msgcat::mcset it "View" "Visualizza" # pubsub.tcl ::msgcat::mcset it "Affiliation" "Affiliazione" ::msgcat::mcset it "Edit entities affiliations: %s" "Modifica le entita di\ affiliazione: %s" ::msgcat::mcset it "Jabber ID" "Jabber ID" ::msgcat::mcset it "Outcast" "Esiliato" ::msgcat::mcset it "Owner" "Fondatore" ::msgcat::mcset it "Pending" "Incompiuto" ::msgcat::mcset it "Publisher" "Editore" ::msgcat::mcset it "SubID" "SubID" ::msgcat::mcset it "Subscribed" "Abonato" ::msgcat::mcset it "Subscription" "Abonamento" ::msgcat::mcset it "Unconfigured" "Non configurato" # joingrdialog.tcl ::msgcat::mcset it "Join group dialog data (groups)." "I dati del dialogo per\ conettersi al gruppo (gruppi)." ::msgcat::mcset it "Join group dialog data (nicks)." "I dati del dialogo per\ conettersi al gruppo (nomi)." ::msgcat::mcset it "Join group dialog data (servers)." "I dati del dialogo\ per conettersi al gruppo (i server)." # jabberlib-tclxml/jlibsasl.tcl ::msgcat::mcset it "Aborted" "Abortito" ::msgcat::mcset it "Authentication Error" "Errore di autenticazione" ::msgcat::mcset it "Authentication failed" "Autenticazione fallita" ::msgcat::mcset it "Authentication successful" "Autenticazione riuscita" ::msgcat::mcset it "Incorrect encoding" "Codifica non coretta" ::msgcat::mcset it "Invalid authzid" "Authzid invalido" ::msgcat::mcset it "Invalid mechanism" "Mechanismo invalido" ::msgcat::mcset it "Mechanism too weak" "Mechanismo troppo debole" ::msgcat::mcset it "no mechanism available" "nessun mechanismo disponibile" ::msgcat::mcset it "Not Authorized" "Non autorizzato" ::msgcat::mcset it "SASL auth error: %s" "Errore di autenticazione di SASL:\ %s" ::msgcat::mcset it "Server haven't provided SASL authentication feature"\ "Server non ha fornito autenticazione via SASL" ::msgcat::mcset it "Temporary auth failure" "Errore di autenticazione\ temporaneo" # jabberlib-tclxml/jlibcompress.tcl ::msgcat::mcset it "Compression negotiation failed" "Negoziazione di\ compressione fallita" ::msgcat::mcset it "Compression negotiation successful" "Negoziazione di\ compressione riuscita" ::msgcat::mcset it "Compression setup failed" "Compressione non riuscita" ::msgcat::mcset it "Server haven't provided compress feature" "Server non ha\ fornito la funzione di compressione" ::msgcat::mcset it "Server haven't provided supported compress method"\ "Server non ha fornito il metodo di compressione supportato" ::msgcat::mcset it "Unsupported compression method" "Metodo di compressione\ non supportato" # jidlink.tcl ::msgcat::mcset it "Enable Jidlink transport %s." "Attivare Jidlink trasporto\ %s." # plugins/general/stats.tcl ::msgcat::mcset it "JID" "JID" ::msgcat::mcset it "Name " "Nome " ::msgcat::mcset it "Node" "Nodo " ::msgcat::mcset it "Open statistics monitor" "Aprire monitor delle\ statistiche" ::msgcat::mcset it "Request" "Richiesta" ::msgcat::mcset it "Service statistics" "Statistiche del servizio" ::msgcat::mcset it "Set" "Porre" ::msgcat::mcset it "Statistics" "Statistiche" ::msgcat::mcset it "Statistics monitor" "Monitor delle statistiche" ::msgcat::mcset it "Timer" "Cronometro" ::msgcat::mcset it "Units" "Le unita" # ifaceck/iface.tcl ::msgcat::mcset it "Move tab left/right" "Muovere tab sinistra/destra" ::msgcat::mcset it "Raise new tab." "Tirare su la nuova tab" ::msgcat::mcset it "Right mouse button" "Pulsante destro di mouse" ::msgcat::mcset it "Switch to tab number 1-9,10" "Cambiare a numero di tab\ 1-9,10" # search.tcl ::msgcat::mcset it "An error occurred when searching in %s\n\n%s" "Un errore\ accaduto durante la ricerca in %s\n\n%s" ::msgcat::mcset it "Search" "Cerca" ::msgcat::mcset it "Search in %s" "Cerca in %s" ::msgcat::mcset it "Search in %s: No matching items found" "Ricerca in %s:\ Nessuna voce trovata" ::msgcat::mcset it "Search: %s" "Cerca: %s" ::msgcat::mcset it "Try again" "Ritenta" # roster.tcl ::msgcat::mcset it "Active Chats" "Conversazioni attive" ::msgcat::mcset it "My Resources" "Le mie risorse" # plugins/general/ispell.tcl ::msgcat::mcset it "Check spell after every entered symbol." "Controlla spell\ dopo ogni simbolo inserito." ::msgcat::mcset it "Could not start ispell server. Check your ispell path and\ dictionary name. Ispell is disabled now" "Non è possibile avviare\ ispell server. Controlla via per ispell e il nome dell dizionario.\ Ispell è disabilitato ora adesso" ::msgcat::mcset it "Enable spellchecker in text input windows." "Attivare\ spellchecker nella finestra di inserimento del testo." ::msgcat::mcset it "Ispell dictionary encoding. If it is empty, system\ encoding is used." "La codifica del dizionario ispell. Se vuota, la\ codifica di sistema verra usata." ::msgcat::mcset it "Path to the ispell executable." "Via al eseguibile di\ ispell" ::msgcat::mcset it "Plugins options." "Opzioni di plugin" ::msgcat::mcset it "Spell check options." "Opzioni dell controllo di spell" # iface.tcl ::msgcat::mcset it "Begin date" "Data dell inizio" ::msgcat::mcset it "Cipher" "Metodo di codifica" ::msgcat::mcset it "Disabled\n" "Disabilitato\n" ::msgcat::mcset it "Enabled\n" "Abilitato\n" ::msgcat::mcset it "Expiry date" "Data di scadenza" ::msgcat::mcset it "Issuer" "Emmitente" ::msgcat::mcset it "Serial number" "Numero seriale" # ifacetk/ilogin.tcl ::msgcat::mcset it "Account" "Account" ::msgcat::mcset it "Allow plaintext authentication mechanisms" "Permettere\ mechanismi di autenticazione plaintext" ::msgcat::mcset it "Authentication" "Autenticazione" ::msgcat::mcset it "Compression" "Compressione" ::msgcat::mcset it "Connect via HTTP polling" "Connetersi usando HTTP" ::msgcat::mcset it "Connection" "Conessione" ::msgcat::mcset it "Encryption (legacy SSL)" "Crittazione (vechio SSL)" ::msgcat::mcset it "Encryption (STARTTLS)" "Crittazione (STARTTLS)" ::msgcat::mcset it "Explicitly specify host and port to connect" "Specificare\ host e port per conessione" ::msgcat::mcset it "Host:" "Host:" ::msgcat::mcset it "HTTP Poll" "HTTP conessione" ::msgcat::mcset it "Logout" "Uscire" ::msgcat::mcset it "Plaintext" "Plaintext" ::msgcat::mcset it "Proxy" "Proxy" ::msgcat::mcset it "Replace opened connections" "Rimpiazzare le conessione\ gia aperte" ::msgcat::mcset it "SSL" "SSL" ::msgcat::mcset it "SSL & Compression" "SSL & Compressione" ::msgcat::mcset it "SSL Certificate:" "SSL Certificato:" ::msgcat::mcset it "URL to poll:" "URL per conessione:" ::msgcat::mcset it "Use client security keys" "Usa le chiavi di sicurezza del\ cliente" ::msgcat::mcset it "Use SASL authentication" "Usa autenticazione SASL" # plugins/general/xcommands.tcl ::msgcat::mcset it "Commands" "Commandi" ::msgcat::mcset it "Error completing command: %s" "Errore nel completare la\ commanda: %s" ::msgcat::mcset it "Error executing command: %s" "Errore nel esecuzione del\ commanda: %s" ::msgcat::mcset it "Error:" "Errore:" ::msgcat::mcset it "Execute command" "Eseguire il commando" ::msgcat::mcset it "Finish" "Fine" ::msgcat::mcset it "Info:" "Info:" ::msgcat::mcset it "Next" "Avanti" ::msgcat::mcset it "Prev" "Indietro" ::msgcat::mcset it "Submit" "Invia" ::msgcat::mcset it "Warning:" "Avviso:" # plugins/chat/logger.tcl ::msgcat::mcset it "All" "Tutto" ::msgcat::mcset it "April" "Aprile" ::msgcat::mcset it "August" "Agosto" ::msgcat::mcset it "Chats history is converted.\nBackup of the old history is\ stored in %s" "La storia delle conversazione e convertita.\nBackup\ della vechia storia e salvato in %s" ::msgcat::mcset it "Conversion is finished" "Conversione è finita" ::msgcat::mcset it "Converting Log Files" "File di log di conversione" ::msgcat::mcset it "December" "Dicembre" ::msgcat::mcset it "Directory to store logs." "La cartella per salvare i\ log." ::msgcat::mcset it "Export to XHTML" "Esporta a XHTML" ::msgcat::mcset it "February" "Febbraio" ::msgcat::mcset it "File %s cannot be opened: %s. History for %s (%s) is NOT\ converted\n" "Impossibile aprire file %s : %s. Storia per %s (%s) non\ convertita\n" ::msgcat::mcset it "File %s cannot be opened: %s. History for %s is NOT\ converted\n" "Impossibile aprire file %s : %s. Storia per %s non\ convertita\n" ::msgcat::mcset it "File %s is corrupt. History for %s (%s) is NOT\ converted\n" "File %s è corrotto. Storia per %s (%s) non\ convertita\n" ::msgcat::mcset it "File %s is corrupt. History for %s is NOT converted\n"\ "File %s è corrotto. Storia per %s non convertita\n" ::msgcat::mcset it "History for %s" "Storia per %s" ::msgcat::mcset it "January" "Gennaio" ::msgcat::mcset it "July" "Luglio" ::msgcat::mcset it "June" "Giugno" ::msgcat::mcset it "Logging options." "Opzioni del registrazione dei\ conversazioni" ::msgcat::mcset it "March" "Marzo" ::msgcat::mcset it "May" "Maggio" ::msgcat::mcset it "November" "Novembre" ::msgcat::mcset it "October" "Ottobre" ::msgcat::mcset it "Please, be patient while chats history is being converted\ to new format" "Per favore, aspettate un attimo finche la storia dei\ conversazioni non è convertita al formato nuovo" ::msgcat::mcset it "Select month:" "Seleziona mese:" ::msgcat::mcset it "September" "Settembre" ::msgcat::mcset it "Store group chats logs." "Salva la storia di\ conversazione del gruppo" ::msgcat::mcset it "Store private chats logs." "Salva la storia di\ conversazione private" ::msgcat::mcset it "You're using root directory %s for storing Tkabber\ logs!\n\nI refuse to convert logs database." "Sta usando la cartella\ di root %s per salvare la storia dei messagi!\n\nIo mi rifiuto di\ convertire la database delle conversazioni." # plugins/general/clientinfo.tcl ::msgcat::mcset it "\n\tName: %s" "\n\tNome: %s" # plugins/general/subscribe_gateway.tcl ::msgcat::mcset it "Add user to roster..." "Aggiungi utente alla lista dei\ contatti" ::msgcat::mcset it "Convert" "Convertire" ::msgcat::mcset it "Convert screenname" "Convertire il nome" ::msgcat::mcset it "Enter screenname of contact you want to add" "Inserire il\ nome del contatto che vuoi aggiungere" ::msgcat::mcset it "Error while converting screenname: %s." "Errore nel\ convertire nome: %s" ::msgcat::mcset it "I would like to add you to my roster." "Mi piacerebbe di\ aggiungere te alla mia lista dei contatti" ::msgcat::mcset it "Screenname conversion" "Conversione dei nomi" ::msgcat::mcset it "Screenname:" "Nome:" ::msgcat::mcset it "Screenname: %s\n\nConverted JID: %s" "Nome: %s\n\nJID\ Convertito: %s" ::msgcat::mcset it "Send subscription at %s" "Invia la sottoscirizione a %s" ::msgcat::mcset it "Send subscription to: " "Invia la sottoscrizione a: %s" # pixmaps.tcl ::msgcat::mcset it "Tkabber icon theme. To make new theme visible for Tkabber\ put it to some subdirectory of %s." "La tema delle icone di Tkabber.\ Per fare visibile la nuova tema per Tkabber metterla nella cartella\ qualuncue dentro %s" # iq.tcl ::msgcat::mcset it "%s request from %s" "%s richiesta da %s" ::msgcat::mcset it "Info/Query options." "Opzioni di Info/Domande." ::msgcat::mcset it "Show IQ requests in the status line." "Mostra rechieste\ di IQ nella linea di status." ::msgcat::mcset it "Strip leading \"http://jabber.org/protocol/\" from IQ\ namespaces in the status line." "Strappa\ \"http://jabber.org.protocol/\" dagli namespace nella linea di\ status." # plugins/chat/histool.tcl ::msgcat::mcset it "Chats History" "La storia di conversazioni" ::msgcat::mcset it "Chats history" "La storia di conversazioni" ::msgcat::mcset it "Client message" "Messagio di cliente" ::msgcat::mcset it "Full-text search" "Ricerca a testo completo" ::msgcat::mcset it "JID list" "Lista JID" ::msgcat::mcset it "Logs" "Logs" ::msgcat::mcset it "Server message" "Messagi di server" ::msgcat::mcset it "Service Discovery" "Ricerca dei Servizi" ::msgcat::mcset it "Unsupported log dir format" "Formato del log dir non\ supportato" ::msgcat::mcset it "WARNING: %s\n" "ATTENZIONE: %s\n" # plugins/unix/systray.tcl ::msgcat::mcset it "Enable freedesktop systray icon." "Abilitare icona di\ systray libera dal desktop." # ifaceck/widgets.tcl ::msgcat::mcset it "Error" "Errore" ::msgcat::mcset it "Question" "Domanda" ::msgcat::mcset it "Warning" "Attenzione" # plugins/richtext/emoticons.tcl ::msgcat::mcset it "Handle ROTFL/LOL smileys -- those like :))) -- by\ \"consuming\" all that parens and rendering the whole word with\ appropriate icon." "Interpretare ROTFL/LOL sorrisi -- come questo\ :))) -- \"togliendo\" tutte le parentesi e sostituendoli con icona\ appropriata." ::msgcat::mcset it "Handling of \"emoticons\". Emoticons (also known as\ \"smileys\") are small pictures resembling a human face used to\ represent user's emotion. They are typed in as special mnemonics like\ :) or can be inserted using menu." "Interpretazione degli\ \"emoticons\". Emoticons (conosciuti anche come \"smiles\") sono\ piccoli icone che rappresentano una emozione sulla faccia umana.\ Possono essere inseriti digitando :) (o qualcosa del genere) o\ inseriti tramite menu." ::msgcat::mcset it "Show images for emoticons." "Mostra immagini per\ emoticons." ::msgcat::mcset it "Tkabber emoticons theme. To make new theme visible for\ Tkabber put it to some subdirectory of %s." "La tema dei emoticons\ per Tkabber. Per far visibile la tema bisogna metterla nella qualche\ cartella di %s." ::msgcat::mcset it "Use only whole words for emoticons." "Usare soltanto\ parole complete per emoticons." # plugins/roster/annotations.tcl ::msgcat::mcset it "Created: %s" "Creato %s" ::msgcat::mcset it "Edit item notes..." "Modificare le note dei articoli..." ::msgcat::mcset it "Edit roster notes for %s" "Modificare le note dell roster\ per %s" ::msgcat::mcset it "Modified: %s" "Modificato: %s" ::msgcat::mcset it "Notes" "Note" ::msgcat::mcset it "Roster Notes" "Note del roster" ::msgcat::mcset it "Store" "Deposito" ::msgcat::mcset it "Storing roster notes failed: %s" "Immagazinamento delle\ note di roster non riuscito: %s" # plugins/chat/bookmark_highlighted.tcl ::msgcat::mcset it "Next highlighted" "Prossimo sottolineato" ::msgcat::mcset it "Prev highlighted" "Precedente sottolineato" # plugins/chat/complete_last_nick.tcl ::msgcat::mcset it "Number of groupchat messages to expire nick completion\ according to the last personally addressed message." # login.tcl ::msgcat::mcset it ". Proceed?\n\n" ". Proseguire?\n\n" ::msgcat::mcset it "Allow plaintext authentication mechanisms (when password\ is transmitted unencrypted)." "Consentire i mechanismi di\ autenticazione di testo semplice (quando password trasmesso non è\ criptato)" ::msgcat::mcset it "Authentication failed: %s" "Autenticazione non riuscita:\ %s" ::msgcat::mcset it "Display SSL warnings." "Visualizza avvisi di SSL" ::msgcat::mcset it "Failed to connect: %s" "Conessione non riuscita: %s" ::msgcat::mcset it "HTTP proxy address." "Indirizzo HTTP proxy." ::msgcat::mcset it "HTTP proxy password." "HTTP proxy password." ::msgcat::mcset it "HTTP proxy port." "Porta di HTTP proxy." ::msgcat::mcset it "HTTP proxy username." "Nome utente di HTTP proxy." ::msgcat::mcset it "Keep trying" "Continua a tentare" ::msgcat::mcset it "List of logout reasons." "Lista dei messagi di uscita." ::msgcat::mcset it "Login options." "Opzioni di login." ::msgcat::mcset it "Maximum poll interval." "Intervallo massimo tra le\ richieste HTTP." ::msgcat::mcset it "Minimum poll interval." "Intervallo minimo tra le\ richieste HTTP." ::msgcat::mcset it "Number of HTTP poll client security keys to send before\ creating new key sequence." "Quantita delle chiavi della sicurezza,\ dopo trasmissione dei quali si genera la nuova sequenza." ::msgcat::mcset it "Password." "Password." ::msgcat::mcset it "Priority." "Priorita." ::msgcat::mcset it "Replace opened connections." "Rimpiazza le conessione\ aperte." ::msgcat::mcset it "Resource." "Risorsa." ::msgcat::mcset it "Retry to connect forever." "Continua a reconettersi di\ continuo." ::msgcat::mcset it "Server name or IP-address." "Nome del server o indirizzo\ IP." ::msgcat::mcset it "Server name." "Nome del server." ::msgcat::mcset it "Server port." "La porta del server." ::msgcat::mcset it "SSL certificate file (optional)." "File con certificato\ SSL (opzionale)." ::msgcat::mcset it "SSL certification authority file or directory\ (optional)." "File o cartella della certificazione SSL (opzionale)." ::msgcat::mcset it "SSL private key file (optional)." "File con la chiave\ privata SSL (opzionale)." ::msgcat::mcset it "Timeout for waiting for HTTP poll responses (if set to\ zero, Tkabber will wait forever)." "Tempo di scadenza delle risposte\ HTTP (se a zero, Tkabber aspettera per sempre)." ::msgcat::mcset it "URL to connect to." "URL da reconettersi." ::msgcat::mcset it "Use explicitly-specified server address and port." "Usare\ nome del server e port specificato." ::msgcat::mcset it "Use HTTP poll client security keys (recommended)." "Usare\ le chiavi di sicurezza (raccomandato)." ::msgcat::mcset it "Use HTTP poll connection method." "Usare metodo di\ conessione HTTP." ::msgcat::mcset it "Use HTTP proxy to connect." "Usare HTTP proxy per\ conettersi." ::msgcat::mcset it "Use SASL authentication." "Usare autenticazione SASL." ::msgcat::mcset it "User name." "Nome utente." ::msgcat::mcset it "User-Agent string." "Stringa User-Agent." ::msgcat::mcset it "Warning display options." "Opzioni dei avvisi." ::msgcat::mcset it "XMPP stream options when connecting to server." "Opzioni\ del flusso XMPP durante la conessione al server." # plugins/chat/draw_timestamp.tcl ::msgcat::mcset it "Format of timestamp in delayed chat messages delayed for\ more than 24 hours." "Formato del tempo nella finestra dei messagi\ che sono stati mandati piu di 24 ore fa." # plugins/general/session.tcl ::msgcat::mcset it "Load state on start" "Caricare stato all avvio" ::msgcat::mcset it "Load state on Tkabber start." "Caricare stato quando\ Tkabber parte." ::msgcat::mcset it "Save state" "Salva stato" ::msgcat::mcset it "Save state on exit" "Salva stato all'uscita" ::msgcat::mcset it "Save state on Tkabber exit." "Salva stato alla uscita di\ Tkabber." ::msgcat::mcset it "Tkabber save state options." "Opzioni dello stato di\ Tkabber." # plugins/filetransfer/jidlink.tcl ::msgcat::mcset it "Jidlink connection failed" "Jidlink conessione non\ riuscita" ::msgcat::mcset it "Jidlink options." "Opzioni Jidlink." ::msgcat::mcset it "Jidlink transfer failed" "Trasferimento Jidlink non\ riuscito" ::msgcat::mcset it "Receiving file failed: %s" "Ricevimento del file non\ riuscito: %s" ::msgcat::mcset it "Transferring..." "Trasferimento..." # splash.tcl ::msgcat::mcset it "%s plugin" "%s plugin" ::msgcat::mcset it "customization" "personalizzazione" ::msgcat::mcset it "general plugins" "Plugin communi" ::msgcat::mcset it "jabber chat/muc" "Jabber chat/muc" ::msgcat::mcset it "jabber messages" "messagi jabber" ::msgcat::mcset it "jabber roster" "jabber roster" ::msgcat::mcset it "macintosh plugins" "plugin per macintosh" ::msgcat::mcset it "negotiation" "negoziazione" ::msgcat::mcset it "pixmaps management" "gestione di pixmaps" ::msgcat::mcset it "privacy rules" "regole della privacy" ::msgcat::mcset it "roster plugins" "i plugin del roster" ::msgcat::mcset it "Save To Log" "Salvare log" ::msgcat::mcset it "search plugins" "plugin per ricerca" ::msgcat::mcset it "service discovery" "ricerca dei servizi" ::msgcat::mcset it "sound" "suono" ::msgcat::mcset it "bwidget workarounds" ::msgcat::mcset it "unix plugins" ::msgcat::mcset it "windows plugins" # datagathering.tcl ::msgcat::mcset it "Data form" "Forma da riempire" ::msgcat::mcset it "Date:" "Data:" ::msgcat::mcset it "Email:" "Email:" ::msgcat::mcset it "Error requesting data: %s" "Errore nel richiedere data:\ %s" ::msgcat::mcset it "First Name:" "Nome:" ::msgcat::mcset it "Instructions" "Istruzioni:" ::msgcat::mcset it "Key:" "Chiave:" ::msgcat::mcset it "Last Name:" "Cognome:" ::msgcat::mcset it "Misc:" "Misc:" ::msgcat::mcset it "Phone:" "Telefono:" ::msgcat::mcset it "Text:" "Testo:" ::msgcat::mcset it "Zip:" "Cap:" # plugins/richtext/highlight.tcl ::msgcat::mcset it "Enable highlighting plugin." "Attivare plugin di\ evidenziazione." ::msgcat::mcset it "Groupchat message highlighting plugin options." "Opzioni\ di evidenziazione nel chat di gruppo." ::msgcat::mcset it "Highlight current nickname in messages." "Evidenziare\ nickname attuale nei messaggi." ::msgcat::mcset it "Highlight only whole words in messages." "Evidenziare\ solo parole complete nei messaggi." ::msgcat::mcset it "Substrings to highlight in messages." "Sottostringhe da\ evidenziare nei messaggi." # plugins/unix/dockingtray.tcl ::msgcat::mcset it "Enable KDE tray icon." "Attivare icona di tray KDE." # plugins/search/search.tcl ::msgcat::mcset it "Match case while searching in chat, log or disco\ windows." "Usare ricerca sensibile al registro dei caratteri nel\ chat, log o scoperta dei servizi." ::msgcat::mcset it "Search in Tkabber windows options." "Cercare nelle\ opzioni di finestre del Tkabber" ::msgcat::mcset it "Specifies search mode while searching in chat, log or\ disco windows. \"substring\" searches exact substring, \"glob\" uses\ glob style matching, \"regexp\" allows to match regular expression."\ "Specificare la modalita di ricerca per chat, log o scoperta dei\ servizi. \"substring\" cerca esattamente sottostringa, \"glob\" usa\ ricerca globale, \"regexp\" permette di fare ricerca usando\ espressioni regolari. " # register.tcl ::msgcat::mcset it "Register" "Registra" ::msgcat::mcset it "Registration is successful!" "Registrazione riuscita!" ::msgcat::mcset it "Registration: %s" "Registrazione: %s" ::msgcat::mcset it "Unregister" "Cancella registrazione" # plugins/chat/info_commands.tcl ::msgcat::mcset it "Address 2" "Indirizzo 2" ::msgcat::mcset it "City" "Citta" ::msgcat::mcset it "Country" "Paese" ::msgcat::mcset it "Display %s in chat window when using /vcard command."\ "Visualizzare %s nella finestra di chat quando si usa commando\ /vcard." ::msgcat::mcset it "E-mail" "E-mail" ::msgcat::mcset it "Family Name" "Cognome" ::msgcat::mcset it "Full Name" "Nome" ::msgcat::mcset it "last %s%s:" "ultimo %s%s:" ::msgcat::mcset it "last %s%s: %s" "ultimo %s%s: %s" ::msgcat::mcset it "Latitude" "Latitudine" ::msgcat::mcset it "Longitude" "Longitudine" ::msgcat::mcset it "Middle Name" "Secondo nome" ::msgcat::mcset it "Nickname" "Sopranome" ::msgcat::mcset it "Organization Name" "Nome del organizzazione" ::msgcat::mcset it "Organization Unit" "Unita del organizzazione" ::msgcat::mcset it "Phone BBS" "Numero BBS" ::msgcat::mcset it "Phone Cell" "Numero di cellulare" ::msgcat::mcset it "Phone Fax" "Numero di Fax" ::msgcat::mcset it "Phone Home" "Numero di telefono di casa" ::msgcat::mcset it "Phone ISDN" "Numero di ISDN" ::msgcat::mcset it "Phone Message Recorder" "Numero di segreteria telefonica" ::msgcat::mcset it "Phone Modem" "Telefono Modem" ::msgcat::mcset it "Phone Pager" "Numero di pager" ::msgcat::mcset it "Phone PCS" "Telefono PCS" ::msgcat::mcset it "Phone Preferred" "Telefono preferito" ::msgcat::mcset it "Phone Video" "Telefono video " ::msgcat::mcset it "Phone Voice" "Telefono voce" ::msgcat::mcset it "Phone Work" "Telefono di lavoro" ::msgcat::mcset it "Postal Code" "Codice postale" ::msgcat::mcset it "Prefix" "Prefisso" ::msgcat::mcset it "Role" "Impiego" ::msgcat::mcset it "State " "Stato " ::msgcat::mcset it "Suffix" "Suffisso" ::msgcat::mcset it "time %s%s:" "tempo %s%s" ::msgcat::mcset it "time %s%s: %s" "tempo %s%s: %s" ::msgcat::mcset it "Title" "Titolo" ::msgcat::mcset it "UID" "UID" ::msgcat::mcset it "vcard %s%s:" "vcard %s%s:" ::msgcat::mcset it "vcard %s%s: %s" "vcard %s%s: %s" ::msgcat::mcset it "vCard display options in chat windows." "opzioni di\ visualizzazione di vCard nella finestra del chat." ::msgcat::mcset it "version %s%s:" "versione %s%s:" ::msgcat::mcset it "version %s%s: %s" "versione %s%s: %s" ::msgcat::mcset it "Web Site" "Sito Web" # plugins/general/sound.tcl ::msgcat::mcset it "Mute sound" "Muto" ::msgcat::mcset it "Mute sound if Tkabber window is focused." "Disattivare\ suono quando finestra di Tkabber e in fuoco" ::msgcat::mcset it "Mute sound notification." "Disattivare il suono delle\ notifiche." ::msgcat::mcset it "Mute sound when displaying delayed groupchat messages."\ "Disattivare il suono quando messagi di groupchat differiti vengono\ visualizzate." ::msgcat::mcset it "Mute sound when displaying delayed personal chat\ messages." "Disattivare il suono quando messagi personali differiti\ vengono visualizzate." ::msgcat::mcset it "Notify only when available" "Notificare solo quando\ disponibile" ::msgcat::mcset it "Options for external play program" "Opzioni per i\ programmi esterni di suono" ::msgcat::mcset it "Sound options." "Opzioni di suono" ::msgcat::mcset it "Sound to play when available presence is received."\ "Suono da riprodurre quando stato disponibile e ricevuto." ::msgcat::mcset it "Sound to play when connected to Jabber server." "Suono da\ riprodurre quando conessione a Jabber server e riuscita." ::msgcat::mcset it "Sound to play when groupchat message from me is\ received." "Suono da riprodurre quando messaggio nel groupchat da me\ è ricevuto." ::msgcat::mcset it "Sound to play when groupchat message is received." "Suono\ da riprodurre quando messaggio di groupchat è ricevuto." ::msgcat::mcset it "Sound to play when groupchat server message is received."\ "Suono da riprodurre quando messaggio di server è ricevuto." ::msgcat::mcset it "Sound to play when highlighted (usually addressed\ personally) groupchat message is received." "Suono da riprodurre\ quando messaggio di groupchat evidenziato è ricevuto." ::msgcat::mcset it "Sound to play when personal chat message is received."\ "Suono da riprodurre quando messaggio personale è ricevuto." ::msgcat::mcset it "Sound to play when sending personal chat message." "Suono\ da riprodurre quando messaggio personale è spedito." ::msgcat::mcset it "Sound to play when unavailable presence is received."\ "Suono da riprodurre quando lo stato non disponibile è ricevuto." ::msgcat::mcset it "Time interval before playing next sound (in\ milliseconds)." "Intervallo di tempo tra riproduzione dei suoni\ (millisecondi)." ::msgcat::mcset it "Use sound notification only when being available." "Usare\ notifica del suono quando lo stato è disponibile." ::msgcat::mcset it "External program, which is to be executed to play sound.\ If empty, Snack library is used (if available) to play sound." # ifaceck/ilogin.tcl ::msgcat::mcset it "SASL" "SASL" ::msgcat::mcset it "SASL Certificate:" "SASL Certificato: " ::msgcat::mcset it "SASL Port:" "SASL Porta:" ::msgcat::mcset it "Server Port:" "Server porta:" # plugins/chat/log_on_open.tcl ::msgcat::mcset it "Maximum interval length in hours for which log messages\ should be shown in newly opened chat window (if set to negative then\ the interval is unlimited)." "Intervallo massimo di tempo per quanto\ i messaggi di log devono essere visualizzati nelle nuove finestre (se\ il valore è negativo, allora intervallo è illimitato)." ::msgcat::mcset it "Maximum number of log messages to show in newly opened\ chat window (if set to negative then the number is unlimited)."\ "Numero massimo dei messaggi salvati da visualizzare nella nuova\ finestra del chat (se il valore è negativo allora il numero è\ illimitato)." # plugins/chat/clear.tcl ::msgcat::mcset it "Clear chat window" "Pulire la finestra del chat" # plugins/roster/cache_categories.tcl ::msgcat::mcset it "Cached service categories and types (from disco#info)."\ "Categorie e tipi dei servizi memorizzati (da disco#info)." # jabberlib-tclxml/stanzaerror.tcl ::msgcat::mcset it "Bad Request" "Richiesta non valida" ::msgcat::mcset it "Conflict" "Conflitto" ::msgcat::mcset it "Feature Not Implemented" "Funzione non realizzata" ::msgcat::mcset it "Forbidden" "Proibito" ::msgcat::mcset it "Gone" "Andato" ::msgcat::mcset it "Internal Server Error" "Errore all interno del server" ::msgcat::mcset it "Item Not Found" "Ogetto non trovato" ::msgcat::mcset it "JID Malformed" "JID Malformato" ::msgcat::mcset it "Not Acceptable" "Non Acettabile" ::msgcat::mcset it "Not Allowed" "Non permesso" ::msgcat::mcset it "Payment Required" "Pagamento richiesto" ::msgcat::mcset it "Recipient Unavailable" "Recipiente non disponibile" ::msgcat::mcset it "Redirect" "Reindirizzamento" ::msgcat::mcset it "Registration Required" "Registrazione richiesta" ::msgcat::mcset it "Remote Server Not Found" "Server non trovato" ::msgcat::mcset it "Remote Server Timeout" "Tempo scaduto" ::msgcat::mcset it "Request Error" "Errore di richiesta" ::msgcat::mcset it "Resource Constraint" "Risorsa costretta" ::msgcat::mcset it "Service Unavailable" "Servizio non disponibile" ::msgcat::mcset it "Subscription Required" "Sottoscirizione richiesta" ::msgcat::mcset it "Temporary Error" "Errore temporaneo" ::msgcat::mcset it "Undefined Condition" "Condizione indefinita" ::msgcat::mcset it "Unexpected Request" "Richiesta inaspettata" ::msgcat::mcset it "Unrecoverable Error" "Errore non risarcibile" # plugins/chat/abbrev.tcl ::msgcat::mcset it "Abbreviations:" "Abbreviature:" ::msgcat::mcset it "Added abbreviation:\n%s: %s" "Abbreviature aggiunte:\n%s:\ %s" ::msgcat::mcset it "Deleted abbreviation: %s" "Abbreviature cancellate: %s" ::msgcat::mcset it "No such abbreviation: %s" "Nessuna abbreviazione: %s" ::msgcat::mcset it "Purged all abbreviations" "Tutte le abbreviature sono\ cancellate" ::msgcat::mcset it "Usage: /abbrev WHAT FOR" "Uso: /abbrev COSA PER" ::msgcat::mcset it "Usage: /unabbrev WHAT" "Uso: /unnabrev COSA" # richtext.tcl ::msgcat::mcset it "Settings of rich text facility which is used to render\ chat messages and logs." "Impostazioni della sistema che si usa per\ visualizzare i messaggi del chat e log." # plugins/roster/conferenceinfo.tcl ::msgcat::mcset it "\n\tCan't browse: %s" "\n\tNon è possibile visualizzare:\ %s" ::msgcat::mcset it "\nRoom is empty at %s" "\nStanza è vuota a %s" ::msgcat::mcset it "\nRoom participants at %s:" "\nParticipanti della stanza\ a %s:" ::msgcat::mcset it "Interval (in minutes) after error reply on request of\ participants list." "Intervallo (in minuti) dopo risposta con errore\ a richiesta della lista dei participanti." ::msgcat::mcset it "Interval (in minutes) between requests of participants\ list." "Inervallo (in minuti) tra le richieste della lista dei\ participanti." ::msgcat::mcset it "Options for Conference Info module, that allows you to\ see list of participants in roster popup, regardless of whether you\ are currently joined with the conference." "Opzioni per modulo\ Conference Info, che permette di vedere la lista dei participanti\ nella pop up di rosyer, indipendentemente dalla sua presenza nella\ conferenza." ::msgcat::mcset it "Use this module" "Usa questo modulo" # plugins/general/headlines.tcl ::msgcat::mcset it "%s Headlines" "%s Intestazioni" ::msgcat::mcset it "" "" ::msgcat::mcset it "Cache headlines on exit and restore on start."\ "Memorizzare intestazioni prima di uscire e ripristinare all'avvio." ::msgcat::mcset it "Copy headline to clipboard" "Copiare intestazione" ::msgcat::mcset it "Copy URL to clipboard" "Copiare URL" ::msgcat::mcset it "Delete" "Cancella" ::msgcat::mcset it "Delete all" "Cancella tutto" ::msgcat::mcset it "Delete seen" "Cancella gia visti" ::msgcat::mcset it "Display headlines in single/multiple windows."\ "Visualizza intestazioni nelle finestre singole/multiple." ::msgcat::mcset it "Do not display headline descriptions as tree nodes." "Non\ visualizzare descrizioni degli intestazioni come nodi dell albero." ::msgcat::mcset it "Format of timestamp in headline tree view. Set to empty\ string if you don't want to see timestamps." "Formato delle marcature\ orarie nell albero con intestazioni. Mettere un valore nullo per non\ visualizzare narcature orarie." ::msgcat::mcset it "Forward headline" "Inoltrare intestazione" ::msgcat::mcset it "Forward to %s" "Inoltra a %s" ::msgcat::mcset it "Forward..." "Inoltra..." ::msgcat::mcset it "List of JIDs to whom headlines have been sent." "Lista\ degli JID a chi sono stati mandati intestazioni." ::msgcat::mcset it "Mark all seen" "Segnare tutto come visto" ::msgcat::mcset it "Mark all unseen" "Segnare tutto come non visto" ::msgcat::mcset it "One window per bare JID" "Una finestra per JID corto\ (senza risorsa)" ::msgcat::mcset it "One window per full JID" "Una finestra per JID intero" ::msgcat::mcset it "Read on..." "Leggere ancora..." ::msgcat::mcset it "Show balloons with headline messages over tree nodes."\ "Mostrare le mongolfiere con messagi dei intestazioni al di sopra di\ nodi del albero." ::msgcat::mcset it "Single window" "Finestra singola" ::msgcat::mcset it "Sort by date" "Ordinare a secondo di data" # si.tcl ::msgcat::mcset it "Enable SI transport %s." "Attivare SI trasporto %s." ::msgcat::mcset it "Opening SI connection" "Aprire conessione SI" ::msgcat::mcset it "SI connection closed" "Conessione SI chiusa" ::msgcat::mcset it "Stream method negotiation failed" "Impossibile negoziare\ con metodo di flusso" # plugins/chat/draw_xhtml_message.tcl ::msgcat::mcset it "Enable rendering of XHTML messages." "Abilitare la\ visualizzazione dei messagi con XHTML" # plugins/general/rawxml.tcl ::msgcat::mcset it "Available presence" "Presenza disponibile" ::msgcat::mcset it "Chat message" "Messagio di chat" ::msgcat::mcset it "Clear" "Pulire" ::msgcat::mcset it "Create node" "Creare nodo" ::msgcat::mcset it "Generic IQ" "IQ Generico" ::msgcat::mcset it "Get items" "Prendere elementi" ::msgcat::mcset it "Headline message" "Messaggio con intestazione" ::msgcat::mcset it "Indentation for pretty-printed XML subtags." "La misura\ dell'alinea per bell-stampati XML sottotags" ::msgcat::mcset it "Normal message" "Messaggio normale" ::msgcat::mcset it "Open raw XML window" "Aprire finestra per XML puro" ::msgcat::mcset it "Options for Raw XML Input module, which allows you to\ monitor incoming/outgoing traffic from connection to server and send\ custom XML stanzas." "Opzioni per modulo di Input di XML puro, che\ permette du monitorare traffic in entrata/uscita da conessione al\ server, e spedire XML stanze personalizzate" ::msgcat::mcset it "Pretty print incoming and outgoing XML stanzas."\ "Formattazione delle XML stanze in entrata/uscita" ::msgcat::mcset it "Pretty print XML" "Formattazione del XML" ::msgcat::mcset it "Pub/sub" "Pub/sotto" ::msgcat::mcset it "Publish node" "Publicare nodo" ::msgcat::mcset it "Raw XML" "Puro XML" ::msgcat::mcset it "Retract node" "Ritrarre nodo" ::msgcat::mcset it "Subscribe to a node" "Sottoscriversi al nodo" ::msgcat::mcset it "Templates" "Modello" ::msgcat::mcset it "Unavailable presence" "Presenza non disponibile" ::msgcat::mcset it "Unsubscribe from a node" "Disdire dal nodo" # plugins/filetransfer/si.tcl ::msgcat::mcset it "Receive error: Stream ID is in use" "Errore di\ ricevimento: ID del flusso e gia in uso" ::msgcat::mcset it "Stream initiation options." "Opzioni dell iniziazione di\ flusso" ::msgcat::mcset it "Transfer failed: %s" "Trasferimento non riuscito: %s" # plugins/iq/time.tcl ::msgcat::mcset it "Reply to current time (jabber:iq:time) requests."\ "Rispondere alle richieste del tempo corrente (jabber:iq:time)." # plugins/roster/conferences.tcl ::msgcat::mcset it "Add Conference to Roster" "Aggiungere Conferenza al\ Roster" ::msgcat::mcset it "Add conference to roster..." "Aggiungere conferenze al\ roster..." ::msgcat::mcset it "Automatically join conference upon connect"\ "Automaticamente unirsi alla conferenza dopo la conessione" ::msgcat::mcset it "Conference:" "Conferenza:" ::msgcat::mcset it "Conferences" "Conferenze" ::msgcat::mcset it "Roster group:" "Gruppa di roster:" ::msgcat::mcset it "Storing conferences failed: %s" "Impossibile salvare le\ conferenze: %s" # plugins/unix/tktray.tcl ::msgcat::mcset it "Enable freedesktop system tray icon." "Abilitare\ freedesktop system tray icon." # filetransfer.tcl ::msgcat::mcset it "Can't open file \"%s\": %s" "Impossibile aprire file\ \"%s\": %s" ::msgcat::mcset it "Default directory for downloaded files." "Cartella\ predefinita per file scaricati." ::msgcat::mcset it "Default protocol for sending files." "Protocollo\ predefinito per spedire file." ::msgcat::mcset it "File path:" "Percorso per file:" ::msgcat::mcset it "File Transfer options." "Opzioni del trasferimento dei\ file." ::msgcat::mcset it "Protocol:" "Protocollo:" ::msgcat::mcset it "unknown" "sconosciuto" # plugins/roster/rosterx.tcl ::msgcat::mcset it "Send contacts to %s" "Spedire contatti a %s" # plugins/chat/nick_colors.tcl ::msgcat::mcset it "Color message bodies in chat windows." "Messaggi colorati\ nelle finestre di chat." ::msgcat::mcset it "Edit %s color" "Modificare %s colore" ::msgcat::mcset it "Edit chat user colors" "Modificare colore degli utenti" ::msgcat::mcset it "Edit nick color..." "Modificare colore del nick..." ::msgcat::mcset it "Edit nick colors..." "Modificare i colori del nick..." ::msgcat::mcset it "Use colored messages" "Usa messaggi colorati" ::msgcat::mcset it "Use colored nicks" "Usa nick colorati" ::msgcat::mcset it "Use colored nicks in chat windows." "Usa nick colorati\ nelle finestre di chat" ::msgcat::mcset it "Use colored nicks in groupchat rosters." "Usa nick\ colorati nelle roster di groupchat." ::msgcat::mcset it "Use colored roster nicks" "Usa nick colorati nel roster" # plugins/chat/muc_ignore.tcl ::msgcat::mcset it "Edit MUC ignore rules" "Modificare le MUC regole di\ ignoro" ::msgcat::mcset it "Error loading MUC ignore rules, purged." "Errore nel\ caricamento delle MUC regole di ignoro, purgato." ::msgcat::mcset it "Ignore" "Ignorare" ::msgcat::mcset it "Ignore chat messages" "Ignorare messaggi del chat" ::msgcat::mcset it "Ignore groupchat messages" "Ignorare messagi del\ groupchat" ::msgcat::mcset it "Ignoring groupchat and chat messages from selected\ occupants of multi-user conference rooms." "Ignorare dei messagi del\ chat e groupchat dai occupanti selezionati dalle stanze con piu\ utenti." ::msgcat::mcset it "MUC Ignore" "MUC Ignoro" ::msgcat::mcset it "MUC Ignore Rules" "Regole del ignoro MUC" ::msgcat::mcset it "When set, all changes to the ignore rules are applied\ only until Tkabber is closed\; they are not saved and thus will be\ not restored at the next run." "Quando impostato, tutte le modifiche\ alle regole del ignoro saranno applicate solo quando Tkabber e\ chiuso\; non sono salvati e non saranno ripristinati all prossimo\ avvio." # plugins/iq/ping.tcl ::msgcat::mcset it "Ping server using urn:xmpp:ping requests." "Ping server\ usando urn:xmpp:ping richieste." ::msgcat::mcset it "Reconnect to server if it does not reply (with result or\ with error) to ping (urn:xmpp:ping) request in specified time\ interval (in seconds)." "Reconettersi al server se non risponde (con\ risultato o con errore) alla richiesta del ping (urn:xmpp:ping) nel\ intervallo specifico del tempo (in secondi)." ::msgcat::mcset it "Reply to ping (urn:xmpp:ping) requests." "Rispondi alle\ richieste ping (urn:xmpp:ping)." # plugins/general/autoaway.tcl ::msgcat::mcset it "Idle threshold in minutes after that Tkabber marks you as\ away." "Tempo di idle dopo il quale Tkabber cambia status da attuale\ ad assente." ::msgcat::mcset it "Idle threshold in minutes after that Tkabber marks you as\ extended away." "Tempo di idle dopo il quale Tkabber cambia status da\ attuale ad assente esteso." ::msgcat::mcset it "Options for module that automatically marks you as away\ after idle threshold." "Opzioni per il modulo che automaticamente\ cambia status dopo tempo determinato di idle." ::msgcat::mcset it "Set priority to 0 when moving to extended away state."\ "Mettere priorita a 0 quando si attiva status assente esteso." ::msgcat::mcset it "Text status, which is set when Tkabber is moving to away\ state." "Testo di status, che si imposta quando Tkabber attiva status\ assente." # plugins/general/offline.tcl ::msgcat::mcset it "Fetch all messages" "Prelevare tutti i messaggi" ::msgcat::mcset it "Fetch message" "Prelevare il messaggio" ::msgcat::mcset it "Fetch unseen messages" "Prelevare messaggi non letti" ::msgcat::mcset it "Offline Messages" "Messaggi offline" ::msgcat::mcset it "Purge all messages" "Pulire tutti i messaggi" ::msgcat::mcset it "Purge message" "Pulire messaggio" ::msgcat::mcset it "Purge seen messages" "Pulire messaggi letti" ::msgcat::mcset it "Retrieve offline messages using POP3-like protocol."\ "Prelevare messaggi offline usando POP3-like protocollo." ::msgcat::mcset it "Sort by from" "Ordinare per mittente" ::msgcat::mcset it "Sort by node" "Ordinare per nodo" ::msgcat::mcset it "Sort by type" "Ordinare per tipo" # plugins/chat/popupmenu.tcl ::msgcat::mcset it "Clear bookmarks" "Pulire preferiti" ::msgcat::mcset it "Copy selection to clipboard" "Copiare selezionato a\ clipboard" ::msgcat::mcset it "Google selection" "Selezione Google" ::msgcat::mcset it "Next bookmark" "Prossimo preferito" ::msgcat::mcset it "Prev bookmark" "Precedente preferito" ::msgcat::mcset it "Set bookmark" "Imposta preferito" # disco.tcl ::msgcat::mcset it "Clear window" "Pulire finestra" ::msgcat::mcset it "Delete current node and subnodes" "Eliminare nodo attuale\ e tutti sottonodi" ::msgcat::mcset it "Delete subnodes" "Eliminare sottonodi" ::msgcat::mcset it "Discover service" "Esplora servizio" ::msgcat::mcset it "Discovery" "Esplorazione" ::msgcat::mcset it "Error getting info: %s" "Errore nel prelievo dell info:\ %s" ::msgcat::mcset it "Error getting items: %s" "Errore nel prelievo degli\ elementi: %s" ::msgcat::mcset it "Error negotiate: %s" "Errore del negoziazione: %s" ::msgcat::mcset it "List of discovered JID nodes." "Lista degli nodi JID\ scoperti." ::msgcat::mcset it "List of discovered JIDs." "Lista degli JID scoperti." ::msgcat::mcset it "Node:" "Nodo:" ::msgcat::mcset it "Sort items by JID/node" "Ordina elementi per JID/nodo" ::msgcat::mcset it "Sort items by name" "Ordina elementi per nome" # plugins/general/remote.tcl ::msgcat::mcset it "Accept connections from my own JID." "Acetta conessioni\ dal mio JID." ::msgcat::mcset it "Accept connections from the listed JIDs." "Acetta\ conessioni da JID nella lista." ::msgcat::mcset it "All unread messages were forwarded to %s." "Tutti\ messaggi non letti sono inoltrati a %s." ::msgcat::mcset it "Enable remote control." "Attivare controllo remoto." ::msgcat::mcset it "Remote control options." "Opzioni del controllo remoto." ::msgcat::mcset it "Show my own resources in the roster." "Mostra le mie\ risorse nel roster." ::msgcat::mcset it "This message was forwarded to %s" "Questo messaggio è\ stato inoltrato a %s" # userinfo.tcl ::msgcat::mcset it "All files" "Tutti file" ::msgcat::mcset it "Day:" "Giorno:" ::msgcat::mcset it "GIF images" "Immagini GIF" ::msgcat::mcset it "JPEG images" "Immagini JPEG" ::msgcat::mcset it "Last activity" "Ultima attivita" ::msgcat::mcset it "List of users for userinfo." "Lista degli utenti per\ userinfo" ::msgcat::mcset it "Loading photo failed: %s." "Caricamento del foto non\ riuscito: %s" ::msgcat::mcset it "Month:" "Mese:" ::msgcat::mcset it "PNG images" "Immagini PNG" ::msgcat::mcset it "Service info" "Info del servizio" ::msgcat::mcset it "Show user or service info" "Mostra info del utente o del\ servizio" ::msgcat::mcset it "Time" "Tempo" ::msgcat::mcset it "Uptime" "Tempo on-line " ::msgcat::mcset it "User info" "Info del utente" ::msgcat::mcset it "Version" "Versione" ::msgcat::mcset it "Year:" "Anno:" # plugins/si/iqibb.tcl ::msgcat::mcset it "Opening IQ-IBB connection" "Apertura del conessione\ IQ-IBB" # jabberlib-tclxml/streamerror.tcl ::msgcat::mcset it "Bad Format" "Formato non valido" ::msgcat::mcset it "Bad Namespace Prefix" "Prefisso del namespace non valido" ::msgcat::mcset it "Connection Timeout" "Tempo di conessione scaduto" ::msgcat::mcset it "Host Gone" "Host è andato" ::msgcat::mcset it "Host Unknown" "Host sconosciuto" ::msgcat::mcset it "Improper Addressing" "Indirizzamento inadatto" ::msgcat::mcset it "Invalid From" "Mettente non valido" ::msgcat::mcset it "Invalid ID" "ID non valido" ::msgcat::mcset it "Invalid Namespace" "Namespace non valido" ::msgcat::mcset it "Invalid XML" "XML non valido" ::msgcat::mcset it "Policy Violation" "Violazione della policy" ::msgcat::mcset it "Remote Connection Failed" "Conessione remota non\ riuscita" ::msgcat::mcset it "Restricted XML" "XML ristretto" ::msgcat::mcset it "See Other Host" "Vedere altro host" ::msgcat::mcset it "Stream Error%s%s" "Errore del flusso%s%s" ::msgcat::mcset it "System Shutdown" "Chiusura del sistema" ::msgcat::mcset it "Unsupported Encoding" "Codifica non supportata" ::msgcat::mcset it "Unsupported Stanza Type" "Tipo di stanza non supportato" ::msgcat::mcset it "Unsupported Version" "Versione non supportata" ::msgcat::mcset it "XML Not Well-Formed" "XML Malformato" # browser.tcl ::msgcat::mcset it "Browse error: %s" "Errore nel navigare: %s" ::msgcat::mcset it "List of browsed JIDs." "Lista degli JID sfogliati." ::msgcat::mcset it "Number of children:" "Numero dei bambini:" ::msgcat::mcset it "Sort items by JID" "Ordinare elementi per JID" # plugins/general/xaddress.tcl ::msgcat::mcset it "Blind carbon copy" "Copia invisibile" ::msgcat::mcset it "Carbon copy" "Copia" ::msgcat::mcset it "Extended addressing fields:" "Campi estesi di indirizzi" ::msgcat::mcset it "Forwarded by:" "Inoltrato da:" ::msgcat::mcset it "No reply" "Nessuna risposta" ::msgcat::mcset it "Original from" "Originale da" ::msgcat::mcset it "Original to" "Originale a" ::msgcat::mcset it "Reply to" "Rispondere" ::msgcat::mcset it "Reply to room" "Rispondere alla stanza" ::msgcat::mcset it "This message was forwarded by %s\n" "Questo messaggio è\ stato inoltrato da %s\n" ::msgcat::mcset it "This message was sent by %s\n" "Questo messaggio è stato\ spedito da %s\n" ::msgcat::mcset it "To" "A" # default.tcl ::msgcat::mcset it "Command to be run when you click a URL in a message. '%s'\ will be replaced with this URL (e.g. \"chromium %s >>& /dev/null\" or\ \"{C:/Program Files (x86)/Mozilla Firefox/firefox.exe} %s\")."\ "Commando da eseguire quando URL nel messaggio è stato cliccato. '%s'\ sara rimpiazzato con questo URL ( \"chromium %s >>& /dev/null\" o\ \"{C:/Program Files (x86)/Mozilla Firefox/firefox.exe} %s\")." ::msgcat::mcset it "Error displaying %s in browser\n\n%s" "Errore nel\ visualizzare %s nel browser\n\n%s" ::msgcat::mcset it "Please define environment variable BROWSER" "Per favore,\ definire variabile BROWSER" # ifacetk/iface.tcl ::msgcat::mcset it "%s SSL Certificate Info" "%s Info del SSL certificato" ::msgcat::mcset it "&Help" "&Aiuto" ::msgcat::mcset it "&Services" "&Servizi" ::msgcat::mcset it "Accept messages from roster users only" "Accetta i\ messaggi solo dai contatti nel roster" ::msgcat::mcset it "Activate search panel" "Attivare panello di ricerca" ::msgcat::mcset it "Bottom" "Basso" ::msgcat::mcset it "Change priority..." "Cambia priorita..." ::msgcat::mcset it "Close Tkabber" "Chiudi Tkabber" ::msgcat::mcset it "Common:" "Comune:" ::msgcat::mcset it "Complete nickname or command" "Nome o commando completo" ::msgcat::mcset it "Delay between getting focus and updating window or tab\ title in milliseconds." "Intervallo tra focus e aggiornamento dell\ titolo di una finestra o di una tab in millisecondi." ::msgcat::mcset it "Do nothing" "Non fare niente" ::msgcat::mcset it "Edit conference list " "Modificare la lista delle\ conferenze " ::msgcat::mcset it "Edit ignore list " "Modificare la lista di ignore" ::msgcat::mcset it "Edit invisible list " "Modificare la lista degli\ invisibili " ::msgcat::mcset it "Emphasize" "Evidenziare" ::msgcat::mcset it "Font to use in roster, chat windows etc." "Caratteri da\ usare nel roster, finestra del chat etc." ::msgcat::mcset it "Generate enter/exit messages" "Generare messaggi di\ entrata/uscita" ::msgcat::mcset it "Iconize" "Iconizzare" ::msgcat::mcset it "Left" "Sinistra" ::msgcat::mcset it "Manually edit rules" "Regole modificate manualmente" ::msgcat::mcset it "Maximum width of tab buttons in tabbed mode." "Larghezza\ massima dei tasti di tab nel tabbed mode" ::msgcat::mcset it "Message archive" "Archivio dei messaggi" ::msgcat::mcset it "Middle mouse button" "Tasto medio del mouse" ::msgcat::mcset it "Minimize" "Minimizzare" ::msgcat::mcset it "Minimize to systray (if systray icon is enabled,\ otherwise do nothing)" "Minimizzare a systray (se icona di systray è\ disabilitata, altrimenti non fare nulla)" ::msgcat::mcset it "Minimum width of tab buttons in tabbed mode." "Larghezza\ minima dei tasti di tab nel tabbed mode." ::msgcat::mcset it "Open chat..." "Aprire chat..." ::msgcat::mcset it "Options for main interface." "Opzioni per interfaccia\ principale." ::msgcat::mcset it "Plugins" "Plugins" ::msgcat::mcset it "Presence bar" "Sbarra di presenza" ::msgcat::mcset it "Right" "Destra" ::msgcat::mcset it "Show menu tearoffs when possible." "Mostra menu lacerato\ quando è possibile." ::msgcat::mcset it "Show number of unread messages in tab titles." "Mostra\ numero dei messaggi non letti nei titoli di tab." ::msgcat::mcset it "Show own resources" "Mostra proprie risorse" ::msgcat::mcset it "Show palette of emoticons" "Mostra insieme di colori\ degli emoticons" ::msgcat::mcset it "Show presence bar." "Mostra sbarra di presenza." ::msgcat::mcset it "Show status bar." "Mostra sbarra di status." ::msgcat::mcset it "Show Toolbar." "Mostra Toolbar." ::msgcat::mcset it "Show user or service info..." "Mostra utente o info del\ servizio..." ::msgcat::mcset it "Side where to place tabs in tabbed mode." "Da quale parte\ mettere i tab nel tabbed mode." ::msgcat::mcset it "Smart autoscroll" "Autoscroll intelligente" ::msgcat::mcset it "SSL Info" "SSL Info" ::msgcat::mcset it "Status bar" "Sbarra di status" ::msgcat::mcset it "Stored main window state (normal or zoomed)" "Stato\ salvato della finestra principale (normale o zummato)" ::msgcat::mcset it "Toggle showing offline users" "Non visualizzare utenti\ non conessi" ::msgcat::mcset it "Toolbar" "Toolbar" ::msgcat::mcset it "Top" "Cima" ::msgcat::mcset it "Use Tabbed Interface (you need to restart)." "Usare\ interfaccia con i tab (riavvio di Tkabber necessario)." ::msgcat::mcset it "What action does the close button." "Che cosa fa tasto di\ chiusura." # plugins/windows/console.tcl ::msgcat::mcset it "Show console" "Mostra console" # messages.tcl ::msgcat::mcset it "Approve subscription" "Approva sottoscrizione" ::msgcat::mcset it "Attached URL:" "URL allegato:" ::msgcat::mcset it "Decline subscription" "Rifiutare sottoscrizione" ::msgcat::mcset it "Extras from:" "Extras da:" ::msgcat::mcset it "From: " "Da: " ::msgcat::mcset it "Grant subscription" "Concedere sottoscrizione" ::msgcat::mcset it "Group: " "Gruppo: " ::msgcat::mcset it "List of message destination JIDs." "Lista degli JID ai\ quali è destinato il messaggio." ::msgcat::mcset it "Message and Headline options." "Opzioni di messaggi e di\ headline" ::msgcat::mcset it "Message from:" "Messaggio da:" ::msgcat::mcset it "Quote" "Citazione" ::msgcat::mcset it "Received by:" "Ricevuto da:" ::msgcat::mcset it "Reply subject:" "Sogetto di risposta: " ::msgcat::mcset it "Request subscription" "Richiesta di sottoscrizione" ::msgcat::mcset it "Send message to group" "Invia messaggio al gruppo " ::msgcat::mcset it "Send message to group %s" "Invia messaggio al gruppo %s" ::msgcat::mcset it "Send request to: " "Invia richiesta a: " ::msgcat::mcset it "Send subscription request" "Invia richiesta di\ sottoscrizione" ::msgcat::mcset it "Send subscription request to %s" "Invia richiesta di\ sosttoscrizione a %s" ::msgcat::mcset it "Subject: " "Sogetto: " ::msgcat::mcset it "Subscription request from %s" "Richiesta di\ sottoscrizione da %s" ::msgcat::mcset it "Subscription request from:" "Richiesta di sottoscrizione\ da:" ::msgcat::mcset it "To: " "A:" ::msgcat::mcset it "You are unsubscribed from %s" "La sottoscrizione da %s\ non esiste piu" # plugins/roster/fetch_nicknames.tcl ::msgcat::mcset it "Fetch nickname" "Prelevare i nomi" ::msgcat::mcset it "Fetch user nicknames" "Prelevare i nomi degli utenti" # jabberlib-tclxml/jlibtls.tcl ::msgcat::mcset it "Server haven't provided STARTTLS feature" "Server non ha\ fornito funzione di STARTTLS" ::msgcat::mcset it "STARTTLS failed" "STARTTL fallito" ::msgcat::mcset it "STARTTLS successful" "STARTTLS riuscito" # plugins/search/spanel.tcl ::msgcat::mcset it "Search down" "Cerca in su" ::msgcat::mcset it "Search up" "Cerca in giu" # muc.tcl ::msgcat::mcset it "\n\tAffiliation: %s" "\n\tAffiliazione: %s" ::msgcat::mcset it "\n\tJID: %s" "\n\tJID: %s" ::msgcat::mcset it "\nAlternative venue: %s" "\nLuogo alternativo: %s" ::msgcat::mcset it "\nReason is: %s" "\nRaggione è: %s" ::msgcat::mcset it "\nReason: %s" "\nRaggione: %s" ::msgcat::mcset it " by %s" " da %s" ::msgcat::mcset it "%s has been banned" "a %s adesso è vietato di entrare" ::msgcat::mcset it "%s has been kicked" "%s è stato espulso dalla conferenza" ::msgcat::mcset it "%s has been kicked because of membership loss" "%s è\ stato espulso a causa di perdita di membership" ::msgcat::mcset it "%s has been kicked because room became members-only" "%s\ è stato espulso perche conferenza è diventata members-only" ::msgcat::mcset it "%s has entered" "%s è entrato" ::msgcat::mcset it "%s has left" "%s è uscito" ::msgcat::mcset it "%s invites you to conference room %s" "%s ti invita a\ conferenza %s" ::msgcat::mcset it "%s is now known as %s" "%s ora è conosciuto come %s" ::msgcat::mcset it "Accept default config" "Accettare config predefinito" ::msgcat::mcset it "and" "e" ::msgcat::mcset it "Cancelling configure form" "Cancellare modulo di\ configurazione" ::msgcat::mcset it "Conference room %s will be destroyed\ permanently.\n\nProceed?" "Conferenza è stata definitivamente\ cancellata.\n\nProseguire?" ::msgcat::mcset it "Configure form: %s" "Modulo di configurazione: %s" ::msgcat::mcset it "Configure room" "Configura conferenza" ::msgcat::mcset it "Destroy room" "Elimina conferenza" ::msgcat::mcset it "Edit owner list" "Modifica la lista dei proprietari" ::msgcat::mcset it "Generate groupchat messages when occupant changes his/her\ status and/or status message" "Genera messaggi di groupchat quando\ occupante cambia suo messaggio di status" ::msgcat::mcset it "Generate status messages when occupants enter/exit MUC\ compatible conference rooms." "Genera messaggio di status quando\ occupante entra/esce nelle conferenze compatibile con MUC." ::msgcat::mcset it "Grant Admin Privileges" "Concedere privilegi di Admin" ::msgcat::mcset it "Grant Moderator Privileges" "Concedere privilegi di\ Moderator" ::msgcat::mcset it "Grant Owner Privileges" "Concedere privilegi del\ Proprietario" ::msgcat::mcset it "Join conference" "Unirsi alla conferenza" ::msgcat::mcset it "Join groupchat" "Unirsi a groupchat" ::msgcat::mcset it "Maximum number of characters in the history in MUC\ compatible conference rooms." "Numero massimo dei caratteri nella\ storia delle conferenze compatibili con MUC." ::msgcat::mcset it "Maximum number of stanzas in the history in MUC\ compatible conference rooms." "Numero massi delle stanze nella storia\ delle conferenze compatibili con MUC." ::msgcat::mcset it "Nick" "Sopranome" ::msgcat::mcset it "Propose to configure newly created MUC room. If set to\ false then the default room configuration is automatically accepted."\ "Proporre di configurare stanze MUC appena creati. Se impostato a\ falso allora configurazione predefinita sara accettata." ::msgcat::mcset it "Reason" "Raggione" ::msgcat::mcset it "Report the list of current MUC rooms on disco#items\ query." "Riportare la lista delle stanze correnti sul disco#items\ domanda." ::msgcat::mcset it "Request only unseen (which aren't displayed in the chat\ window) messages in the history in MUC compatible conference rooms."\ "Richiesta solo messaggi non letti (quelli che non sono stati\ visualizzati nella finestra del chat) nella storia dell conferenze\ compatibili con MUC." ::msgcat::mcset it "Revoke Admin Privileges" "Anullare privilegi di Admin" ::msgcat::mcset it "Revoke Moderator Privileges" "Anullare privilegi di\ Moderator" ::msgcat::mcset it "Revoke Owner Privileges" "Anullare privilegi di\ Proprietario" ::msgcat::mcset it "Room %s is successfully created" "Conferenza %s creata\ con sucesso" ::msgcat::mcset it "Room is created" "Stanza creata" ::msgcat::mcset it "Room is destroyed" "Stanza eliminata" ::msgcat::mcset it "Sending %s %s list" "Invio %s %s della lista" ::msgcat::mcset it "Sending configure form" "Invio dell modulo di\ configurazione" ::msgcat::mcset it "User already %s" "Utente gia %s" ::msgcat::mcset it "whois %s: %s" "whois %s: %s" ::msgcat::mcset it "whois %s: no info" "whois %s: no info" # configdir.tcl ::msgcat::mcset it "Attention" "Attenzione" ::msgcat::mcset it "Please, be patient while Tkabber configuration directory\ is being transferred to the new location" "Per favore siate pazienti\ mentre cartella di configurazione non sara trasferita a una nuova\ locazione" ::msgcat::mcset it "Tkabber configuration directory transfer failed\ with:\n%s\n Tkabber will use the old directory:\n%s" "Trasferimento\ della cartella di configurazione fallita con\n%s\n Tkabber usera\ cartella vecchia:\n%s" ::msgcat::mcset it "Your new Tkabber config directory is now:\n%s\nYou can\ delete the old one:\n%s" "La sua nuova cartella di configurazione\ adesso è:\n%s\nPuo eliminare la vecchia:\n%s" # presence.tcl ::msgcat::mcset it "Change Presence Priority" "Cambia priorita della\ presenza" ::msgcat::mcset it "doesn't want to be disturbed" "non vuole essere\ disturbato" ::msgcat::mcset it "is available" "disponibile" ::msgcat::mcset it "is away" "è away" ::msgcat::mcset it "is extended " "è away distante" ::msgcat::mcset it "is free to chat" "è libero di parlare" ::msgcat::mcset it "is invisible" "è invisibile" ::msgcat::mcset it "is unavailable" "non è disponibile" ::msgcat::mcset it "Stored user priority." "Priorita dell utente salvata" ::msgcat::mcset it "Stored user status." "Status dell utente salvato" ::msgcat::mcset it "Stored user text status." "Text status dell utente\ salvato" # plugins/general/tkcon.tcl ::msgcat::mcset it "Show TkCon console" "Mostra TkCon console" # ifacetk/iroster.tcl ::msgcat::mcset it "Add chats group in roster." "Aggiungere gruppi del chat\ nel roster." ::msgcat::mcset it "Are you sure to remove all users in group '%s' from\ roster? \n(Users which are in another groups too, will not be removed\ from the roster.)" "Sei sicuro di eliminare tutti utenti nell gruppo\ '%s' dal roster? \n(Utenti, che sono anche in altri gruppi, non\ saranno eliminati dal roster.)" ::msgcat::mcset it "Are you sure to remove group '%s' from roster? \n(Users\ which are in this group only, will be in undefined group.)" "Sicuro\ di voler eliminare il gruppo '%s' dal roster? \n(Utenti, che sono\ solo in questo gruppo, saranno in un gruppo non definito.)" ::msgcat::mcset it "Ask:" "Domandare:" ::msgcat::mcset it "Default nested roster group delimiter." "Divisore\ predefinito di gruppi messi un dentro l'altro." ::msgcat::mcset it "Enable nested roster groups." "Attivare gruppi messi un\ dentro l'altro nel roster." ::msgcat::mcset it "Remove all users in group..." "Elimina tutti utenti nel\ gruppo..." ::msgcat::mcset it "Remove from roster..." "Elimina dal roster..." ::msgcat::mcset it "Roster item may be dropped not only over group name but\ also over any item in group." "Ogetto di roster puo essere rilasciato\ non solo sopra nome del gruppo ma anche sopra ogni elemento in\ gruppo." ::msgcat::mcset it "Roster of %s" "Roster di %s" ::msgcat::mcset it "Send message to all users in group..." "Inviare messaggio\ a tutti utenti nel gruppo..." ::msgcat::mcset it "Show detailed info on conference room members in roster\ item tooltips." "Mostra info di utenti in una conferenza dettagliata\ nel roster tooltip." ::msgcat::mcset it "Show native icons for contacts, connected to\ transports/services in roster." "Mostra icone native per contatti,\ conessi a transporti/servizi nel roster." ::msgcat::mcset it "Show native icons for transports/services in roster."\ "Mostra icone native per transporti/servizi in roster." ::msgcat::mcset it "Show offline users" "Visualizza utenti offline" ::msgcat::mcset it "Show only online users in roster." "Visualizza solo\ utenti online" ::msgcat::mcset it "Show subscription type in roster item tooltips."\ "Visualizza tipo di sottoscrizione dentro un roster tooltip." ::msgcat::mcset it "Stored collapsed roster groups." "Memorizzati gruppi del\ roster crollati." ::msgcat::mcset it "Stored show offline roster groups." "Info memorizzata di\ visualizzazione dei gruppi offline nel roster." ::msgcat::mcset it "Subscription:" "Sottoscrizione:" ::msgcat::mcset it "Use aliases to show multiple users in one roster item."\ "Usare aliases per visualizzare piu utenti in un ogetto di roster." # plugins/iq/last.tcl ::msgcat::mcset it "Reply to idle time (jabber:iq:last) requests."\ "Rispondere alle richieste del tempo di idle (jabber:iq:last)." # jabberlib-tclxml/jlibauth.tcl ::msgcat::mcset it "Server doesn't support hashed password authentication"\ "Server non supporta autenticazione con hashed password" ::msgcat::mcset it "Server doesn't support plain or digest authentication"\ "Server non supporta autenticazione plain o digest" ::msgcat::mcset it "Server haven't provided non-SASL authentication feature"\ "Server non fornisce funzione di non-SASL autenticazione" ::msgcat::mcset it "Waiting for authentication results" "Aspettiamo resultati\ di autenticazione" # plugins/iq/version.tcl ::msgcat::mcset it "Reply to version (jabber:iq:version) requests."\ "Rispondere alle richieste di versione (jabber:iq:version)." # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/msgs/nl.msg000064400000000000000000002212501477701321300141450ustar00nobodynobody# nl.msg -- # # Dutch messages for the Tkabber XMPP client. # # Author: Sander Devrieze # avatars.tcl ::msgcat::mcset nl "No avatar to store" "Geen avatar om op te slaan" # browser.tcl ::msgcat::mcset nl "Browse" "Browse" ::msgcat::mcset nl "Browse error: %s" "Fout tijdens browsen: %s" ::msgcat::mcset nl "Browser" "Browser" ::msgcat::mcset nl "Description:" "Beschrijving:" ::msgcat::mcset nl "JID:" "Jabber ID:" ::msgcat::mcset nl "List of browsed JIDs." "Lijst van onderzochte Jabber\ ID's" ::msgcat::mcset nl "Number of children:" "Aantal kinderen:" ::msgcat::mcset nl "Sort items by JID" "Items sorteren op Jabber ID" ::msgcat::mcset nl "Version:" "Versie:" # chats.tcl ::msgcat::mcset nl "/me has changed the subject to: %s" "/me veranderde het\ onderwerp in: %s" ::msgcat::mcset nl ">>> Unable to decipher data: %s <<<" ">>> Kon gegevens\ niet ontcijferen: %s <<<" ::msgcat::mcset nl "Chat " "Chat" ::msgcat::mcset nl "Chat options." "Chatinstellingen" ::msgcat::mcset nl "Chat with %s" "Chat met %s" ::msgcat::mcset nl "Default message type (if not specified explicitly)."\ "Standaard berichttype." ::msgcat::mcset nl "Disconnected" "Verbinding verbroken" ::msgcat::mcset nl "Display description of user status in chat windows."\ "Aanwezigheid van contactpersoon in chatvenster weergeven." ::msgcat::mcset nl "Enable chat window autoscroll only when last message is\ shown." "Zet automatisch schuiven in chatvenster aan wanneer laatste\ bericht getoond is." ::msgcat::mcset nl "Enable messages emphasize." "Benadrukken van berichten\ aanzetten." ::msgcat::mcset nl "Error %s" "Fout %s" ::msgcat::mcset nl "Invite" "Uitnodigen" ::msgcat::mcset nl "Invite %s to conferences" "%s uitnodigen op chatruimte" ::msgcat::mcset nl "Invite users to %s" "Contactpersonen uitnodigen op %s" ::msgcat::mcset nl "Invite users..." "Contactpersonen uitnodigen..." ::msgcat::mcset nl "Moderators" "Moderators" ::msgcat::mcset nl "No conferences for %s in progress..." "Geen\ groepsgesprekken voor %s aan de gang..." ::msgcat::mcset nl "No users in %s roster..." "Geen contactpersonen in %s\ roster..." ::msgcat::mcset nl "Normal" "Normaal" ::msgcat::mcset nl "Participants" "Deelnemers" ::msgcat::mcset nl "Please join %s" "Betreed %s" ::msgcat::mcset nl "Send custom presence" "Aangepaste aanwezigheid verzenden" ::msgcat::mcset nl "Stop chat window autoscroll." "Automatisch schuiven in\ chatvenster stoppen." ::msgcat::mcset nl "Subject:" "Onderwerp:" ::msgcat::mcset nl "To:" "Aan:" ::msgcat::mcset nl "Toggle encryption" "Versleuteling aan/afzetten" ::msgcat::mcset nl "Users" "Gebruikers" ::msgcat::mcset nl "Visitors" "Bezoekers" # custom.tcl ::msgcat::mcset nl "Customization of the One True Jabber Client."\ "Instellingen van de Enige Ware Jabber Client." ::msgcat::mcset nl "Open" "Open" ::msgcat::mcset nl "Parent group" "Bovenliggende groep" ::msgcat::mcset nl "Parent groups" "Bovenliggende groepen" ::msgcat::mcset nl "Reset to Current" "Huidige waarde herstellen" ::msgcat::mcset nl "Reset to Default" "Standaardwaarde herstellen" ::msgcat::mcset nl "Reset to Saved" "Bewaarde waarde herstellen" ::msgcat::mcset nl "Set for Current Session" "Voor huidige sessie instellen" ::msgcat::mcset nl "Set for Future Sessions" "Voor volgende sessies\ instellen" ::msgcat::mcset nl "State" "Status" ::msgcat::mcset nl "this option has been set and saved." "Deze optie werd\ ingesteld en bewaard." ::msgcat::mcset nl "this option is unchanged from its standard setting."\ "Deze optie is gelijk aan de standaardwaarde." ::msgcat::mcset nl "you have edited the value, but you have not set the\ option." "U bewerkte de waarde maar stelde geen optie in." ::msgcat::mcset nl "you have set this option, but not saved it for future\ sessions." "U stelde deze optie in maar bewaarde ze niet voor\ volgende sessies." # datagathering.tcl ::msgcat::mcset nl "Data form" "Gegevensformulier" ::msgcat::mcset nl "Date:" "Datum:" ::msgcat::mcset nl "Email:" "E-mail:" ::msgcat::mcset nl "Error requesting data: %s" "Fout tijdens aanvragen van\ gegevens: %s" ::msgcat::mcset nl "Error submitting data: %s" "Fout tijdens voorleggen van\ gegevens: %s" ::msgcat::mcset nl "First Name:" "Voornaam:" ::msgcat::mcset nl "Instructions" "Instructies" ::msgcat::mcset nl "Key:" "Sleutel:" ::msgcat::mcset nl "Last Name:" "Achternaam:" ::msgcat::mcset nl "Misc:" "Diverse:" ::msgcat::mcset nl "Phone:" "Telefoon:" ::msgcat::mcset nl "Text:" "Tekst:" ::msgcat::mcset nl "Zip:" "Postcode:" # default.tcl ::msgcat::mcset nl "Command to be run when you click a URL in a message. '%s'\ will be replaced with this URL (e.g. \"chromium %s >>& /dev/null\" or\ \"{C:/Program Files (x86)/Mozilla Firefox/firefox.exe} %s\")." "Uit\ te voeren commando wanneer u klikt op een URL in een bericht. '%s'\ zal worden vervangen door deze URL (bv. \"chromium %s >>& /dev/null\"\ of \"{C:/Program Files (x86)/Mozilla Firefox/firefox.exe} %s\")." ::msgcat::mcset nl "Error displaying %s in browser\n\n%s" "Fout bij thet\ laten zien van %s in webbrowser\n\n%s" ::msgcat::mcset nl "Please define environment variable BROWSER" "Geen de\ omgevingsvariabele BROWSER op." # disco.tcl ::msgcat::mcset nl "%s: %s/%s, Description: %s, Version: %s\nNumber of\ children: %s" "%s: %s/%s, Beschrijving: %s, Versie: %s\nAantal\ kinderen: %s" ::msgcat::mcset nl "Discover service" "Services verkennen" ::msgcat::mcset nl "Error getting info: %s" "Fout tijdens afhalen van\ informatie: %s" ::msgcat::mcset nl "Error getting items: %s" "Fout tijdens afhalen van items:\ %s" ::msgcat::mcset nl "Error negotiate: %s" "Fout tijdens tot stand brengen: %s" ::msgcat::mcset nl "List of discovered JID nodes." "Lijst van gevonden Jabber\ ID-nodes." ::msgcat::mcset nl "List of discovered JIDs." "Lijst van gevonden Jabber\ ID's." ::msgcat::mcset nl "Node:" "Node:" ::msgcat::mcset nl "Sort items by JID/node" "Item sorteren op Jabber ID/node" ::msgcat::mcset nl "Sort items by name" "Items sorteren op naam" # emoticons.tcl # filetransfer.tcl ::msgcat::mcset nl "Browse..." "Bladeren..." ::msgcat::mcset nl "Connection closed" "Verbinding verbroken" ::msgcat::mcset nl "Default directory for downloaded files." "Standaardmap\ voor afgehaalde bestanden" ::msgcat::mcset nl "Description:" "Beschrijving:" ::msgcat::mcset nl "File not found or not regular file: %s" "Bestand niet\ gevonden of geen regulier bestand: %s" ::msgcat::mcset nl "File to send:" "Bestand om te verzenden:" ::msgcat::mcset nl "File Transfer options." "Opties voor bestandsoverdracht" ::msgcat::mcset nl "IP address:" "IP-adres:" ::msgcat::mcset nl "Receive" "Ontvangen" ::msgcat::mcset nl "Receive file from %s" "Bestand ontvangen van %s" ::msgcat::mcset nl "Request failed: %s" "Aanvraag mislukte: %s" ::msgcat::mcset nl "Save as:" "Opslaan als:" ::msgcat::mcset nl "Send file" "Bestand verzenden" ::msgcat::mcset nl "Send file to %s" "Bestand verzenden naar %s" ::msgcat::mcset nl "Size:" "Grootte:" ::msgcat::mcset nl "Transferring..." "Bezig met overdracht..." # filters.tcl ::msgcat::mcset nl "Action" "Actie" ::msgcat::mcset nl "Add" "Toevoegen" ::msgcat::mcset nl "Edit" "Bewerken" ::msgcat::mcset nl "Move down" "Omlaag" ::msgcat::mcset nl "Move up" "Omhoog" ::msgcat::mcset nl "Remove" "Verwijderen" # gpgme.tcl ::msgcat::mcset nl "%s purportedly signed by %s can't be verified.\n\n%s."\ "%s wat beweerd word gehandtekend te zijn door %s, kan niet nagekeken\ worden.\n\n%s." ::msgcat::mcset nl "Change security preferences for %s"\ "Veiligheidsvoorkeuren van %s wijzigen" ::msgcat::mcset nl "Data purportedly sent by %s can't be deciphered.\n\n%s."\ "De gegevens die worden beweerd verzonden te zijn door %s kunnen niet\ ontcijferd worden.\n\n%s." ::msgcat::mcset nl "Encrypt traffic" "Verkeer versleutelen" ::msgcat::mcset nl "Error in signature verification software: %s." "Fout in\ de software die de handtekening moet nakijken:" ::msgcat::mcset nl "Fetch GPG key" "GPG-sleutel ophalen" ::msgcat::mcset nl "GPG options (signing and encryption)." "Opties van GPG\ (ondertekenen en versleutelen)" ::msgcat::mcset nl "GPG-encrypt outgoing messages where possible." "Uitgaande\ berichten versleutelen met GPG wanneer mogelijk." ::msgcat::mcset nl "GPG-sign outgoing messages and presence updates."\ "Uitgaande berichten en aanwezigheidswijzigingen met GPG\ ondertekenen." ::msgcat::mcset nl "Key ID" "Sleutel-id" ::msgcat::mcset nl "Passphrase:" "Passphrase:" ::msgcat::mcset nl "Please enter passphrase" "Voer passphrase in" ::msgcat::mcset nl "Please try again" "Probeer opnieuw" ::msgcat::mcset nl "Select" "Selecteren" ::msgcat::mcset nl "Select Key for Signing %s Traffic" "Sleutel selecteren om\ %s-verkeer te onderteken" ::msgcat::mcset nl "Unable to encipher data for %s: %s.\n\nEncrypting traffic\ to this user is now disabled.\n\nSend it as PLAINTEXT?" "De gegevens\ voor %s kunnen niet ontcijferd worden: %s.\n\nDe versleuteling van\ verkeer naar deze contactpersoon staat nu af.\n\nWilt u het verzenden\ als PLATTE TEKST?" ::msgcat::mcset nl "Unable to sign message body: %s.\n\nSigning traffic is\ now disabled.\n\nSend it WITHOUT a signature?" "Kon berichtinhoud\ niet ondertekenen: %s.\n\nOndertekenen van verkeer staat nu\ af.\n\nWilt u het ZONDER handtekening verzenden?" ::msgcat::mcset nl "Unable to sign presence information: %s.\n\nPresence will\ be sent, but signing traffic is now disabled." "Kon\ aanwezigheidsinformatie niet ondertekenen: %s..\n\nDe aanwezigheid\ zal verzonden worden maar het ondertekenen van verkeer staat nu af." ::msgcat::mcset nl "Use specified key ID for signing and decrypting\ messages." "Specifieke sleutel-ID gebruiken om berichten te\ ondertekenen en versleutelen." ::msgcat::mcset nl "Use the same passphrase for signing and decrypting\ messages." "Dezelfde passphrase gebruiken voor ondertekenen en\ ontcijferen van berichten." ::msgcat::mcset nl "User ID" "Gebruikers-id" # iface.tcl ::msgcat::mcset nl "Activate lists at startup" "Lijsten tijdens opstarten\ activeren" ::msgcat::mcset nl "Add conference to roster..." "Chatruimte aan roster\ toevoegen..." ::msgcat::mcset nl "Add conference..." "Chatruimte toevoegen..." ::msgcat::mcset nl "Add group by regexp on JIDs..." "Groep toevoegen via\ reguliere expressie op Jabber ID's..." ::msgcat::mcset nl "Add user to roster..." "Contactpersoon aan roster\ toevoegen..." ::msgcat::mcset nl "Add user..." "Contactpersoon toevoegen..." ::msgcat::mcset nl "Admin tools" "Hulpmiddelen voor beheerder" ::msgcat::mcset nl "Allow downloading" "Downloaden toestaan" ::msgcat::mcset nl "Announce" "Publiceren" ::msgcat::mcset nl "Avatar" "Avatar" ::msgcat::mcset nl "Away" "Afwezig" ::msgcat::mcset nl "Browser" "Browser" ::msgcat::mcset nl "Change password..." "Wachtwoord wijzigen..." ::msgcat::mcset nl "Change priority..." "Prioriteit wijzigen..." ::msgcat::mcset nl "Chats" "Chats" ::msgcat::mcset nl "Close Tkabber" "Tkabber afsluiten" ::msgcat::mcset nl "Customize" "Instellingen" ::msgcat::mcset nl "Delay between getting focus and updating window or tab\ title in milliseconds." "Vertragen tussen verkrijgen van focus en\ bijwerken van venster- of tabbladopschrift (milliseconden)." ::msgcat::mcset nl "Delete message of the day" "Bericht van de dag\ verwijderen (motd)" ::msgcat::mcset nl "Discovery" "Discovery" ::msgcat::mcset nl "Do not disturb" "Niet storen" ::msgcat::mcset nl "Do nothing" "Niets doen" ::msgcat::mcset nl "Edit ignore list..." "Lijst 'negeren' bewerken..." ::msgcat::mcset nl "Edit invisible list..." "Lijst 'onzichtbaar' bewerken..." ::msgcat::mcset nl "Edit my info..." "Mijn gegevens bewerken..." ::msgcat::mcset nl "Export roster..." "Roster exporteren..." ::msgcat::mcset nl "Extended away" "Langdurig afwezig" ::msgcat::mcset nl "Font to use in roster, chat windows etc." "Lettertype\ voor roster, chatvensters,..." ::msgcat::mcset nl "Free to chat" "Beschikbaar voor gesprek" ::msgcat::mcset nl "Generate event messages" "Gebeurtenisberichten genereren" ::msgcat::mcset nl "Help" "Help" ::msgcat::mcset nl "Iconize" "Minimaliseren naar systeemvak" ::msgcat::mcset nl "Import roster..." "Roster importeren..." ::msgcat::mcset nl "Invisible" "Onzichtbaar" ::msgcat::mcset nl "Join group..." "Groep betreden..." ::msgcat::mcset nl "Log in..." "Aanmelden..." ::msgcat::mcset nl "Log out" "Afmelden" ::msgcat::mcset nl "Log out with reason..." "Afmelden met reden..." ::msgcat::mcset nl "Manually edit rules..." "Instellingen manueel\ bewerken..." ::msgcat::mcset nl "Message archive" "Berichtenarchief" ::msgcat::mcset nl "Minimize" "Minimaliseren" ::msgcat::mcset nl "Open raw XML window" "XML-console" ::msgcat::mcset nl "Options for main interface." "Opties voor het\ hoofdvenster." ::msgcat::mcset nl "Periodically browse roster conferences" "Blader\ periodisch door chatruimtes in het roster" ::msgcat::mcset nl "Plugins" "Plugins" ::msgcat::mcset nl "Presence" "Aanwezigheid" ::msgcat::mcset nl "Presence bar" "Aanwezigheidsbalk" ::msgcat::mcset nl "Privacy rules" "Instellingen voor privacy" ::msgcat::mcset nl "Profile on" "Profiel op" ::msgcat::mcset nl "Profile report" "Profielrapport" ::msgcat::mcset nl "Quick help" "Snelle hulp" ::msgcat::mcset nl "Quit" "Afsluiten" ::msgcat::mcset nl "Raise new tab." "Nieuw tabblad naar voorgrond brengen." ::msgcat::mcset nl "Right mouse button" "Rechtermuisknop" ::msgcat::mcset nl "Roster" "Roster" ::msgcat::mcset nl "Search in chat window" "Chatvenster doorzoeken" ::msgcat::mcset nl "Send broadcast message..." "Broadcastbericht\ verzenden..." ::msgcat::mcset nl "Send message of the day..." "Bericht van de dag verzenden\ (motd)..." ::msgcat::mcset nl "Send message..." "Bericht verzenden..." ::msgcat::mcset nl "Send to server" "Naar server verzenden" ::msgcat::mcset nl "Show menu tearoffs when possible." "Scheuren in menu\ laten zien wanneer mogelijk" ::msgcat::mcset nl "Show online users only" "Alleen contactpersonen die\ online zijn laten zien" ::msgcat::mcset nl "Show presence bar." "Aanwezigheidsbalk laten zien" ::msgcat::mcset nl "Show status bar." "Statusbalk laten zien" ::msgcat::mcset nl "Show tabs below the main window." "Tabbladen onder het\ hoofdvenster laten zien" ::msgcat::mcset nl "Show user info..." "Informatie over contactpersoon laten\ zien..." ::msgcat::mcset nl "Smart autoscroll" "Slim automatisch schuiven" ::msgcat::mcset nl "Sound" "Geluid" ::msgcat::mcset nl "Status bar" "Statusbalk" ::msgcat::mcset nl "Stop autoscroll" "Automatisch schuiven stoppen" ::msgcat::mcset nl "Stored main window state (normal or zoomed)"\ "Hoofdvenstergegevens opslaan (normaal of ingezoomd)" ::msgcat::mcset nl "Toolbar" "Werkbalk" ::msgcat::mcset nl "Update message of the day..." "Bericht van de dag\ bijwerken (motd)..." ::msgcat::mcset nl "Use aliases" "Bijnamen aanzetten" ::msgcat::mcset nl "View" "Bekijken" ::msgcat::mcset nl "What action does the close button." "Actie voor de\ afsluitknop" ::msgcat::mcset nl "Chats:" "Chats:" ::msgcat::mcset nl "Close tab" "Tabblad sluiten" ::msgcat::mcset nl "Complete nickname" "Bijnaam aanvullen" ::msgcat::mcset nl "Correct word" "Woord verbeteren" ::msgcat::mcset nl "Hide/Show roster" "Roster verbergen/laten zien" ::msgcat::mcset nl "Main window:" "Hoofdvenster:" ::msgcat::mcset nl "Move tab left/right" "Tabblad naar links/rechts\ verplaatsen" ::msgcat::mcset nl "Previous/Next history message" "Vorig/volgend bericht in\ geschiedenis" ::msgcat::mcset nl "Previous/Next tab" "Vorig/volgend tabblad" ::msgcat::mcset nl "Quick Help" "Snelle hulp" ::msgcat::mcset nl "Redo" "Opnieuw" ::msgcat::mcset nl "Scroll chat window up/down" "Chatvenster omhoog/omlaag\ schuiven" ::msgcat::mcset nl "Show emoticons" "Emoticons laten zien" ::msgcat::mcset nl "Switch to tab number 1-9,10" "Naar tabblad nummer 1-9,10\ gaan" ::msgcat::mcset nl "Tabs:" "Tabbladen:" ::msgcat::mcset nl "Undo" "Ongedaan maken" ::msgcat::mcset nl "About" "Over" ::msgcat::mcset nl "Alexey Shchepin" "Alexey Shchepin" ::msgcat::mcset nl "Authors:" "Auteurs:" ::msgcat::mcset nl "Marshall T. Rose" "Marshall T. Rose" ::msgcat::mcset nl "Michail Litvak" "Michail Litvak" ::msgcat::mcset nl "Sergei Golovan" "Sergei Golovan" ::msgcat::mcset nl "%s SSL Certificate Info" "Informatie over SSL certificaat\ van %s" ::msgcat::mcset nl "Add new user..." "Nieuwe contactpersoon toevoegen..." ::msgcat::mcset nl "Begin date" "Aanmaakdatum" ::msgcat::mcset nl "Cancel" "Annuleren" ::msgcat::mcset nl "Cipher" "Cijfer" ::msgcat::mcset nl "Close" "Sluiten" ::msgcat::mcset nl "Close all tabs" "Alle tabbladen sluiten" ::msgcat::mcset nl "Close other tabs" "Andere tabbladen sluiten" ::msgcat::mcset nl "Disabled\n" "Uigezet\n" ::msgcat::mcset nl "Emphasize" "Benadrukken" ::msgcat::mcset nl "Enabled\n" "Aangezet\n" ::msgcat::mcset nl "Expiry date" "Verloopdatum" ::msgcat::mcset nl "Issuer" "Uitgever" ::msgcat::mcset nl "Jabber Browser" "Jabber Browser" ::msgcat::mcset nl "Send" "Verzenden" ::msgcat::mcset nl "Serial number" "Seriële nummer" ::msgcat::mcset nl "Service Discovery" "Service Discovery" ::msgcat::mcset nl "Show number of unread messages in tab titles." "Aantal\ ongelezen berichten laten zien in tabbladen." ::msgcat::mcset nl "SSL Info" "Informatie over SSL" ::msgcat::mcset nl "Toggle encryption (when possible)" "Versleuteling\ aan/afzetten (wanneer mogelijk)" ::msgcat::mcset nl "Toggle showing offline users" "Laten zien van\ contactpersonen die offline zijn aan/afzetten" ::msgcat::mcset nl "Toggle signing" "Ondertekenen aan/afzetten" # ilogin.tcl ::msgcat::mcset nl "Allow plaintext SASL authentication mechanisms."\ "SASL-mechanismes voor authenticatie met platte tekst toestaan." ::msgcat::mcset nl "Allow plaintext SASL mechanisms" "SASL-mechanismes met\ platte tekst toestaan" ::msgcat::mcset nl "Authentication failed: %s" "Authenticatie mislukte: %s" ::msgcat::mcset nl "Don't use SSL" "SSL uitschakelen" ::msgcat::mcset nl "SASL Certificate:" "Certificaat voor SASL:" ::msgcat::mcset nl "SASL Port:" "Poort voor SASL:" ::msgcat::mcset nl "SSL CA file (optional)." "SSL CA-bestand (optioneel)." ::msgcat::mcset nl "SSL options when connecting to server." "Opties voor SSL\ bij verbinden met server." ::msgcat::mcset nl "SSL private key file (optional)." "Bestand met\ SSL-privésleutel (optioneel)." ::msgcat::mcset nl "Use legacy SSL" "Legacy SSL gebruiken" ::msgcat::mcset nl "Use SASL authentication" "Authenticatie met SASL doen" ::msgcat::mcset nl "Use SASL authentication." "Authenticatie met SASL doen." ::msgcat::mcset nl "Use STARTTLS" "STARTTLS gebruiken" ::msgcat::mcset nl "User-Agent string." "Clientidentificatie." # iq.tcl ::msgcat::mcset nl "%s request from %s" "%s vroeg aan van %s" ::msgcat::mcset nl "Info/Query options." "Opties voor info/query." ::msgcat::mcset nl "Show IQ requests in the status line." "IQ-aanvragen in de\ statusbalk weergeven." ::msgcat::mcset nl "Strip leading \"http://jabber.org/protocol/\" from IQ\ namespaces in the status line." "\"http://jabber.org/protocol/\" aan\ het begin van IQ-namespaces in de statusbalk afstropen." # itemedit.tcl ::msgcat::mcset nl "<- Remove" "<- Verwijderen" ::msgcat::mcset nl "Add ->" "Toevoegen ->" ::msgcat::mcset nl "Automatically join conference upon connect" "Chatruimte\ automatisch betreden tijdens verbinden" ::msgcat::mcset nl "Available groups" "Beschikbare groepen" ::msgcat::mcset nl "Current groups" "Huidige groepen" ::msgcat::mcset nl "Edit groups for %s" "Groepen van %s bewerken" ::msgcat::mcset nl "Edit nickname for %s" "Bijnaam van %s aanpassen" ::msgcat::mcset nl "Edit properties for %s" "Eigenschappen van %s bewerken" ::msgcat::mcset nl "Group:" "Groep:" ::msgcat::mcset nl "Nickname:" "Bijnaam:" # jidlink.tcl ::msgcat::mcset nl "Enable Jidlink transport %s." "Jidlink-transport %s\ aanzetten." ::msgcat::mcset nl "Enable Jidlink transport for outgoing file transfers (it\ is obsolete)." "Jidlink-transport aanzetten voor uitgaande\ bestandsoverdrachten (verouderd)." ::msgcat::mcset nl "Jidlink connection closed" "Jidlink-verbinding verbroken" ::msgcat::mcset nl "Jidlink options." "Opties voor Jidlink." ::msgcat::mcset nl "Opening Jidlink connection" "Bezig met openen van\ Jidlink-verbinding" ::msgcat::mcset nl "Receiving file failed: %s" "Bestand downloaden mislukte:\ %s" ::msgcat::mcset nl "Send file request failed: %s" "Bestandsaanvraag verzenden\ mislukte: %s" ::msgcat::mcset nl "via Jidlink..." "via Jidlink..." # joingrdialog.tcl ::msgcat::mcset nl "Address:" "Adres:" ::msgcat::mcset nl "Connection:" "Verbinding:" ::msgcat::mcset nl "Description:" "Beschrijving:" ::msgcat::mcset nl "Group:" "Chatruimte:" ::msgcat::mcset nl "Join" "Betreden" ::msgcat::mcset nl "Join group" "Chatruimte betreden" ::msgcat::mcset nl "Join group dialog data (groups)." "Gegevens van venster\ om chatruimtes te betreden (chatruimtes)." ::msgcat::mcset nl "Join group dialog data (nicks)." "Gegevens van venster om\ chatruimte te betreden (bijnamen)." ::msgcat::mcset nl "Join group dialog data (servers)." "Gegevens van venster\ om chatruimtes te betreden (servers)." ::msgcat::mcset nl "Name: " "Naam:" ::msgcat::mcset nl "Nick:" "Bijnaam:" ::msgcat::mcset nl "Nickname:" "Bijnaam:" ::msgcat::mcset nl "Password:" "Wachtwoord:" ::msgcat::mcset nl "Server:" "Server:" # ifaceck/widgets.tcl ::msgcat::mcset nl "Error" "Fout" ::msgcat::mcset nl "Question" "Vraag" # plugins/si/socks5.tcl ::msgcat::mcset nl "Opening SOCKS5 listening socket" "Bezig met openen van\ socket voor SOCKS5" # login.tcl ::msgcat::mcset nl ". Proceed?\n\n" "Wilt u verder gaan?\n\n" ::msgcat::mcset nl "Account" "Account" ::msgcat::mcset nl "Authentication failed: %s\nCreate new account?"\ "Authenticatie mislukte: %s\nWilt u een nieuwe account aanmaken?" ::msgcat::mcset nl "Can't authenticate: Remote server doesn't support\nplain\ or digest authentication method" "Kan niet verifiëren: server\ ondersteunt de authenticatiemethodes\nplain of digest niet." ::msgcat::mcset nl "Change password" "Wachtwoord wijzigen" ::msgcat::mcset nl "Connect via alternate server" "Via alternatieve server\ verbinden" ::msgcat::mcset nl "Connect via HTTP polling" "Via HTTP-polling verbinden" ::msgcat::mcset nl "Connection" "Verbinding" ::msgcat::mcset nl "Display SSL warnings." "SSL-waarschuwingen weergeven." ::msgcat::mcset nl "Failed to connect: %s" "Verbinden mislukte: %s" ::msgcat::mcset nl "HTTP Poll" "HTTP-poll" ::msgcat::mcset nl "HTTP proxy address." "Adres van HTTP-proxy." ::msgcat::mcset nl "HTTP proxy password." "Wachtwoord van HTTP-proxy." ::msgcat::mcset nl "HTTP proxy port." "Poort van HTTP-proxy." ::msgcat::mcset nl "HTTP proxy username." "Gebruikersnaam voor HTTP-proxy." ::msgcat::mcset nl "Keep trying" "Blijf proberen" ::msgcat::mcset nl "List of logout reasons." "Lijst met redenen voor\ afmelden." ::msgcat::mcset nl "Login" "Aanmelden" ::msgcat::mcset nl "Login options." "Opties voor aanmelden." ::msgcat::mcset nl "Logout" "Afmelden" ::msgcat::mcset nl "Logout with reason" "Afmelden met reden" ::msgcat::mcset nl "Maximum poll interval." "Maximum poll-interval." ::msgcat::mcset nl "Minimum poll interval." "Minimum poll-interval." ::msgcat::mcset nl "New password:" "Nieuw wachtwoord:" ::msgcat::mcset nl "New passwords do not match" "Het nieuwe wachtwoord komt\ niet overeen" ::msgcat::mcset nl "Number of HTTP poll client security keys to send before\ creating new key sequence." "Aantal HTTP-poll veiligheidsleutels om\ te verzenden voor de aanmaak van een nieuwe reeks sleutels." ::msgcat::mcset nl "Old password is incorrect" "Het oude wachtwoord is\ foutief" ::msgcat::mcset nl "Old password:" "Oud wachtwoord:" ::msgcat::mcset nl "Password change failed: %s" "Wijzigen van wachtwoord\ mislukte: %s" ::msgcat::mcset nl "Password is changed" "Het wachtwoord is gewijzigd" ::msgcat::mcset nl "Password." "Wachtwoord." ::msgcat::mcset nl "Password:" "Wachtwoord:" ::msgcat::mcset nl "Priority." "Prioriteit." ::msgcat::mcset nl "Priority:" "Prioriteit:" ::msgcat::mcset nl "Profile" "Profiel" ::msgcat::mcset nl "Profiles" "Profielen" ::msgcat::mcset nl "Proxy" "Proxy" ::msgcat::mcset nl "Proxy Login:" "Gebruikersnaam voor proxy:" ::msgcat::mcset nl "Proxy Password:" "Wachtwoord voor proxy:" ::msgcat::mcset nl "Proxy Port:" "Poort van proxy:" ::msgcat::mcset nl "Proxy Server:" "Proxyserver:" ::msgcat::mcset nl "Reason:" "Reden:" ::msgcat::mcset nl "Registration failed: %s" "Registratie mislukte: %s" ::msgcat::mcset nl "Repeat new password:" "Herhaal nieuw wachtwoord:" ::msgcat::mcset nl "Replace opened connections" "Geopende verbindingen\ herplaatsen" ::msgcat::mcset nl "Replace opened connections." "Geopende verbindingen\ herplaatsen." ::msgcat::mcset nl "Resource." "Bron." ::msgcat::mcset nl "Resource:" "Bron:" ::msgcat::mcset nl "Retry to connect forever." "Probeer steeds opnieuw te\ verbinden." ::msgcat::mcset nl "SASL" "SASL" ::msgcat::mcset nl "Server name or IP-address." "Servernaam of IP-adres." ::msgcat::mcset nl "Server name." "Naam van server." ::msgcat::mcset nl "Server port." "Poort van server." ::msgcat::mcset nl "Server Port:" "Poort van server:" ::msgcat::mcset nl "Server:" "Server:" ::msgcat::mcset nl "SSL" "SSL" ::msgcat::mcset nl "SSL certificate file (optional)." "Bestand van\ SSL-certificaat (optioneel)." ::msgcat::mcset nl "SSL Certificate:" "SSL-certificaat:" ::msgcat::mcset nl "SSL port." "Poort voor SSL." ::msgcat::mcset nl "SSL Port:" "Poort van SSL:" ::msgcat::mcset nl "Timeout for waiting for HTTP poll responses (if set to\ zero, Tkabber will wait forever)." "Timeout voor wachten op\ antwoorden van HTTP-poll (de waarde '0' betekent 'oneindig')." ::msgcat::mcset nl "URL to connect to." "URL om op te verbinden." ::msgcat::mcset nl "URL to poll:" "URL om te pollen:" ::msgcat::mcset nl "Use client security keys" "Veiligheidssleutels van client\ gebruiken" ::msgcat::mcset nl "Use explicitly-specified server address." "Serveradres\ handmatig invoeren." ::msgcat::mcset nl "Use hashed password" "Door elkaar gehaald wachtwoord\ gebruiken" ::msgcat::mcset nl "Use hashed password transmission." "Door elkaar gehaalde\ wachtwoordtransmissie aanzetten." ::msgcat::mcset nl "Use HTTP poll client security keys (recommended)."\ "HTTP-poll veiligheidsleutels gebruiken (aangeraden)." ::msgcat::mcset nl "Use HTTP poll connection method." "Via HTTP-poll\ verbinden." ::msgcat::mcset nl "Use HTTP proxy to connect." "Gebruik een HTTP-proxy om te\ verbinden." ::msgcat::mcset nl "Use Proxy" "Proxy gebruiken" ::msgcat::mcset nl "Use SSL" "SSL gebruiken" ::msgcat::mcset nl "User name." "Gebruikersnaam." ::msgcat::mcset nl "Username:" "Gebruikersnaam:" ::msgcat::mcset nl "Warning display options." "Weergaveopties voor\ waarschuwingen." ::msgcat::mcset nl "Warning: Remote server doesn't support\nhashed password\ authentication.\n\nProceed with PLAINTEXT authentication?"\ "Waarschuwing: server ondersteunt\n door elkaar gehaalde\ wachtwoordauthenticatie niet.\n\nWilt u verder gaan met PLATTE TEKST\ authenticatie?" # messages.tcl ::msgcat::mcset nl "\nReason is: %s" "\nReden is: %s" ::msgcat::mcset nl "%s Headlines" "%s koppen" ::msgcat::mcset nl "%s invites you to conference room %s" "%s nodigt u uit om\ chatruimte %s te betreden" ::msgcat::mcset nl "Attached file:" "Bijlage:" ::msgcat::mcset nl "Attached user:" "Bijgevoegde contactpersoon:" ::msgcat::mcset nl "Cache headlines on exit and restore on start." "Koppen\ bufferen bij beëindigen en herstellen bij opstarten." ::msgcat::mcset nl "Chat" "Chat" ::msgcat::mcset nl "Copy headline to clipboard" "Kop naar klembord kopiëren" ::msgcat::mcset nl "Copy URL to clipboard" "URL naar klembord kopiëren" ::msgcat::mcset nl "Delete" "Verwijderen" ::msgcat::mcset nl "Delete all" "Allen verwijderen" ::msgcat::mcset nl "Display headlines in single/multiple windows." "Koppen\ weergeven in enkel/meervoudige vensters." ::msgcat::mcset nl "Do not display headline descriptions as tree nodes."\ "Kopbeschrijvingen niet weergeven als boomnodes." ::msgcat::mcset nl "Extras from" "Extra's van" ::msgcat::mcset nl "Extras from %s" "Extra's van %s" ::msgcat::mcset nl "Forward headline" "Kop doorsturen" ::msgcat::mcset nl "Forward to %s" "Doorsturen naar %s" ::msgcat::mcset nl "Forward..." "Doorsturen..." ::msgcat::mcset nl "Headlines" "Koppen" ::msgcat::mcset nl "Invited to:" "Uitnodigen op:" ::msgcat::mcset nl "List of JIDs to whom headlines have been sent." "Lijst\ van Jabber ID's waarheen koppen werden verzonden" ::msgcat::mcset nl "List of message destination JIDs." "Lijst van Jabber ID's\ waarheen berichten werden verzonden" ::msgcat::mcset nl "Mark all seen" "Als gezien markeren" ::msgcat::mcset nl "Mark all unseen" "Als ongezien markeren" ::msgcat::mcset nl "Message and Headline options." "Bericht- en kopopties" ::msgcat::mcset nl "Message body" "Berichtinhoud" ::msgcat::mcset nl "Message from" "Bericht van" ::msgcat::mcset nl "Message from %s" "Bericht van %s" ::msgcat::mcset nl "One window per bare JID" "Eén venster per kale Jabber ID" ::msgcat::mcset nl "One window per full JID" "Eén venster per volledige\ Jabber ID" ::msgcat::mcset nl "Quote" "Citeren" ::msgcat::mcset nl "Reply" "Antwoorden" ::msgcat::mcset nl "Reply subject:" "Onderwerp van antwoord:" ::msgcat::mcset nl "Send message" "Bericht verzenden" ::msgcat::mcset nl "Send message to %s" "Bericht verzenden naar %s" ::msgcat::mcset nl "Send message to group" "Bericht naar groep verzenden" ::msgcat::mcset nl "Send message to group %s" "Bericht naar groep %s\ verzenden" ::msgcat::mcset nl "Send subscription" "Autorisatie verzenden" ::msgcat::mcset nl "Send subscription to " "Autorisatie verzenden naar" ::msgcat::mcset nl "Send subscription to %s" "Autorisatie verzenden naar %s" ::msgcat::mcset nl "Single window" "Enkelvoudig venster" ::msgcat::mcset nl "Sort" "Sorteren" ::msgcat::mcset nl "Subscribe" "Autoriseren" ::msgcat::mcset nl "Subscribe request from" "Autorisatieaanvraag van" ::msgcat::mcset nl "Subscribe request from %s" "Autorisatieaanvraag van %s" ::msgcat::mcset nl "Unsubscribe" "Autorisatie ongedaan maken" # muc.tcl ::msgcat::mcset nl "\n\tAffiliation: %s" "\n\tAfdeling: %s" ::msgcat::mcset nl "\n\tJID: %s" "\n\tJabber ID: %s" ::msgcat::mcset nl " by %s" " door %s" ::msgcat::mcset nl "%s has become available" "%s betrad de chatruimte" ::msgcat::mcset nl "%s has been banned" "%s werd verbannen" ::msgcat::mcset nl "%s has been kicked" "%s werd gekicked" ::msgcat::mcset nl "%s has left" "%s verliet de chatruimte" ::msgcat::mcset nl "%s is now known as %s" "%s is nu gekend als %s" ::msgcat::mcset nl "Affiliation" "Band" ::msgcat::mcset nl "Ban" "Verbannen" ::msgcat::mcset nl "Conference room %s will be destroyed\ permanently.\n\nProceed?" "De chatruimte %s zal verwijderd\ worden.\n\nWilt u verder gaan?" ::msgcat::mcset nl "Configure room..." "Chatruimte configureren..." ::msgcat::mcset nl "Destroy room" "Chatruimte vernietigen" ::msgcat::mcset nl "Edit admin list..." "Beheerderslijst bewerken..." ::msgcat::mcset nl "Edit ban list..." "Lijst met verbannen personen\ bewerken..." ::msgcat::mcset nl "Edit member list..." "Ledenlijst bewerken..." ::msgcat::mcset nl "Edit moderator list..." "Moderatorslijst bewerken..." ::msgcat::mcset nl "Edit owner list..." "Eigenaarslijst bewerken..." ::msgcat::mcset nl "Edit voice list..." "Medezeggenschapslijst bewerken..." ::msgcat::mcset nl "Generate event messages in MUC compatible conference\ rooms." "Gebeurtenisberichten in chatruimtes genereren die compatibel\ zijn met MUC." ::msgcat::mcset nl "Grant Administrative Privileges" "Beheerdersrechten\ verlenen" ::msgcat::mcset nl "Grant Membership" "Lidmaatschap verlenen" ::msgcat::mcset nl "Grant Moderator Privileges" "Moderatorrechten verlenen" ::msgcat::mcset nl "Grant Ownership Privileges" "Eigenaarschapsrechten\ verlenen" ::msgcat::mcset nl "Grant Voice" "Medezeggenschap verlenen" ::msgcat::mcset nl "Join conference" "Chatruimte betreden" ::msgcat::mcset nl "Join groupchat" "Chatruimte betreden" ::msgcat::mcset nl "Kick" "Kick" ::msgcat::mcset nl "Maximum number of characters in the history in MUC\ compatible conference rooms." "Maximum aantal tekens in de\ geschiedenis van chatruimtes (MUC)." ::msgcat::mcset nl "Maximum number of stanzas in the history in MUC\ compatible conference rooms." "Maximum aantal stanza's in de\ geschiedenis van chatruimtes (MUC)." ::msgcat::mcset nl "MUC" "MUC" ::msgcat::mcset nl "Nick" "Bijnaam" ::msgcat::mcset nl "Reason" "Reden" ::msgcat::mcset nl "Report the list of current MUC rooms on disco#items\ query." "De lijst met huidige chatruimtes rapporteren na een\ disco#items-aanvraag." ::msgcat::mcset nl "Request only unseen (which aren't displayed in the chat\ window) messages in the history in MUC compatible conference rooms."\ "Enkel ongelezen berichten aanvragen van chatruimtes (MUC)." ::msgcat::mcset nl "Revoke Administrative Privileges" "Beheerdersrechten\ intrekken" ::msgcat::mcset nl "Revoke Membership" "Lidmaatschap intrekken" ::msgcat::mcset nl "Revoke Moderator Privileges" "Moderatorrechten intrekken" ::msgcat::mcset nl "Revoke Ownership Privileges" "Eigenaarschapsrechten\ intrekken" ::msgcat::mcset nl "Revoke Voice" "Medezeggenschap intrekken" ::msgcat::mcset nl "Role" "Rol" ::msgcat::mcset nl "Whois" "Whois" # presence.tcl ::msgcat::mcset nl "Available" "Beschikbaar" ::msgcat::mcset nl "Change Presence Priority" "Prioriteit van aanwezigheid\ wijzigen" ::msgcat::mcset nl "invalid userstatus value " "ongeldige waarde voor\ aanwezigheid van contactpersoon" ::msgcat::mcset nl "Not logged in" "Niet aangemeld" ::msgcat::mcset nl "Unavailable" "Onbeschikbaar" # privacy.tcl ::msgcat::mcset nl "Activate visible/invisible/ignore lists before sending\ initial presence." "Zichtbaar/onzichtbaar/negeer-lijsten activeren\ voor verzenden van aanwezigheid." ::msgcat::mcset nl "Active" "Actief" ::msgcat::mcset nl "Add item" "Item toevoegen" ::msgcat::mcset nl "Add JID" "Jabber ID toevoegen" ::msgcat::mcset nl "Add list" "Lijst toevoegen" ::msgcat::mcset nl "Blocking communication options." "Communicatieopties\ blokkeren." ::msgcat::mcset nl "Default" "Standaard:" ::msgcat::mcset nl "Down" "Omlaag" ::msgcat::mcset nl "Edit ignore list" "Negeerlijst bewerken" ::msgcat::mcset nl "Edit invisible list" "Lijst 'onzichtbaar' bewerken" ::msgcat::mcset nl "Edit list" "Lijst bewerken" ::msgcat::mcset nl "Edit privacy list" "Privacylijst bewerken" ::msgcat::mcset nl "Edit visible list" "Lijst 'zichtbaar' bewerken" ::msgcat::mcset nl "List name" "Lijstnaam" ::msgcat::mcset nl "No active list" "Geen actieve lijst" ::msgcat::mcset nl "No default list" "Geen standaardlijst:" ::msgcat::mcset nl "Presence-in" "Inkomende aanwezigheid" ::msgcat::mcset nl "Presence-out" "Uitgaande aanwezigheid" ::msgcat::mcset nl "Privacy list is activated" "Privacylijst staat aan" ::msgcat::mcset nl "Privacy list is not activated" "Privacylist staat af" ::msgcat::mcset nl "Privacy lists" "Privacylijsten" ::msgcat::mcset nl "Remove from list" "Van lijst verwijderen" ::msgcat::mcset nl "Remove list" "Lijst verwijderen" ::msgcat::mcset nl "Requesting ignore list: %s" "Bezig met aanvragen van\ negeerlijst: %s" ::msgcat::mcset nl "Requesting invisible list: %s" "Bezig met aanvragen van\ de lijst 'onzichtbaar': %s" ::msgcat::mcset nl "Requesting privacy list: %s" "Bezig met aanvragen van\ privacygegevens: %s" ::msgcat::mcset nl "Requesting privacy rules: %s" "Bezig met aanvragen van\ instellingen voor privacy: %s" ::msgcat::mcset nl "Requesting visible list: %s" "Bezig met aanvragen van de\ lijst 'zichtbaar': %s" ::msgcat::mcset nl "Sending ignore list: %s" "Bezig met verzenden van\ negeerlijst: %s" ::msgcat::mcset nl "Sending invisible list: %s" "Bezig met verzenden van de\ lijst 'onzichtbaar': %s" ::msgcat::mcset nl "Sending visible list: %s" "Bezig met verzenden van de\ lijst 'zichtbaar': %s" ::msgcat::mcset nl "Type" "Soort" ::msgcat::mcset nl "Up" "Omhoog" ::msgcat::mcset nl "Waiting for activating privacy list" "Bezig met wachten\ om privacylijst te activeren" # register.tcl ::msgcat::mcset nl "Register" "Registreren" ::msgcat::mcset nl "Register in %s" "Registreren in %s" ::msgcat::mcset nl "Registration is successful!" "Registratie is geslaagd!" ::msgcat::mcset nl "Registration: %s" "Registratie: %s" ::msgcat::mcset nl "Unsubscribed from %s" "Autorisatie van %s werd\ verwijderd" ::msgcat::mcset nl "We unsubscribed from %s" "Autorisatie van %s werd\ verwijderd" # roster.tcl ::msgcat::mcset nl "%s doesn't want to be disturbed" "%s wilt niet gestoord\ worden" ::msgcat::mcset nl "%s is available" "%s is beschikbaar" ::msgcat::mcset nl "%s is away" "%s is afwezig" ::msgcat::mcset nl "%s is extended away" "%s is langdurig afwezig" ::msgcat::mcset nl "%s is free to chat" "%s is beschikbaar om te chatten" ::msgcat::mcset nl "%s is invisible" "%s is onzichtbaar" ::msgcat::mcset nl "%s is unavailable" "%s is niet beschikbaar" ::msgcat::mcset nl "Active Chats" "Actieve chats" ::msgcat::mcset nl "Add chats group in roster." "Chatruimtes aan roster\ toevoegen." ::msgcat::mcset nl "Add roster group by JID regexp" "Rostergroep toevoegen\ via reguliere expressie op Jabber ID " ::msgcat::mcset nl "All Files" "Alle bestanden" ::msgcat::mcset nl "Are you sure to remove %s from roster?" "Bent u zeker dat\ u %s wilt verwijderen uit uw roster?" ::msgcat::mcset nl "Are you sure to remove group '%s' from roster?" "Bent u\ zeker dat u groep '%s' uit uw roster wilt verwijderen" ::msgcat::mcset nl "Contact Information" "Informatie over contactpersoon" ::msgcat::mcset nl "Edit item..." "Item bewerken..." ::msgcat::mcset nl "Edit security..." "Beveiliging aanpassen..." ::msgcat::mcset nl "Invite to conference..." "Uitnodigen op chatruimte..." ::msgcat::mcset nl "is now" "is nu" ::msgcat::mcset nl "JID regexp:" "reguliere expressie op Jabber ID:" ::msgcat::mcset nl "Join..." "Betreden..." ::msgcat::mcset nl "Log in" "Aanmelden" ::msgcat::mcset nl "Log out" "Afmelden" ::msgcat::mcset nl "New group name:" "Nieuwe groepnaam:" ::msgcat::mcset nl "No users in roster..." "Geen contactpersonen in het\ roster..." ::msgcat::mcset nl "Rename roster group" "Rostergroep hernoemen" ::msgcat::mcset nl "Resubscribe" "Opnieuw autoriseren" ::msgcat::mcset nl "Resubscribe to all users in group..." "Opnieuw op alle\ contactpersonen in deze groep autoriseren..." ::msgcat::mcset nl "Roster Files" "Bestanden in roster" ::msgcat::mcset nl "Roster of %s" "Roster van %s" ::msgcat::mcset nl "Roster options." "Rosteropties." ::msgcat::mcset nl "Send" "Verzenden" ::msgcat::mcset nl "Send contacts to" "Contactpersonen verzenden naar" ::msgcat::mcset nl "Send file via HTTP..." "Bestand via HTTP verzenden..." ::msgcat::mcset nl "Send file via Jidlink..." "Bestand via Jidlink\ verzenden..." ::msgcat::mcset nl "Send users..." "Contactpersonen verzenden..." ::msgcat::mcset nl "Show detailed info on conference room members in roster\ item tooltips." "Gedetaileerde informatie over leden van de\ chatruimte laten zien via rosteritem-tekstballonnen." ::msgcat::mcset nl "Show history" "Geschiedenis laten zien" ::msgcat::mcset nl "Show info" "Informatie over contactpersoon laten zien" ::msgcat::mcset nl "Show native icons for contacts, connected to\ transports/services in roster." "Oorspronkelijke pictogrammen laten\ zien voor contactpersonen verbonden met transporten/diensten in het\ roster." ::msgcat::mcset nl "Show native icons for transports/services in roster."\ "Oorspronkelijke pictogrammen laten zien voor transporten/diensten in\ het roster." ::msgcat::mcset nl "Show offline users" "Contactpersonen die offline zijn\ laten zien" ::msgcat::mcset nl "Show only online users in roster." "Enkel contactpersonen\ die online zijn laten zien in roster." ::msgcat::mcset nl "Start chat" "Chat starten" ::msgcat::mcset nl "Undefined" "Ongedefinieerd" # roster_nested.tcl ::msgcat::mcset nl "Default nested roster group delimiter." "Standaard\ genestelde rostergroep afbakenen." ::msgcat::mcset nl "Enable nested roster groups." "Genestelde rostergroepen\ aanzetten." # search.tcl ::msgcat::mcset nl "#" "#" ::msgcat::mcset nl "An error occurred when searching in %s\n\n%s" "Er deed\ zich een fout voor tijdens het zoeken in %s\n\n%s" ::msgcat::mcset nl "OK" "OK" ::msgcat::mcset nl "Search" "Zoeken" ::msgcat::mcset nl "Search again" "Opnieuw zoeken" ::msgcat::mcset nl "Search in %s" "Zoeken in %s" ::msgcat::mcset nl "Search in %s: No matching items found" "Zoeken in %s:\ geen overeenkomende items gevonden" ::msgcat::mcset nl "Search: %s" "Zoek: %s" ::msgcat::mcset nl "Try again" "Opnieuw proberen" # si.tcl ::msgcat::mcset nl "Enable SI transport %s." "SI-transport %s aanzetten" ::msgcat::mcset nl "Opening SI connection" "Bezig met openen van\ SI-verbinding" ::msgcat::mcset nl "SI connection closed" "SI-verbinding verbroken" ::msgcat::mcset nl "Stream method negotiation failed" "Totstandbrenging van\ streammethode mislukte" # splash.tcl ::msgcat::mcset nl "auto-away" "automatisch afwezig" ::msgcat::mcset nl "avatars" "avatars" ::msgcat::mcset nl "balloon help" "tekstballon" ::msgcat::mcset nl "browsing" "browsing" ::msgcat::mcset nl "bwidget workarounds" "workaround voor bwidget" ::msgcat::mcset nl "configuration" "configuratie" ::msgcat::mcset nl "connections" "verbindingen" ::msgcat::mcset nl "cryptographics" "GPG" ::msgcat::mcset nl "emoticons" "emoticons" ::msgcat::mcset nl "extension management" "beheer van uitbreidingen" ::msgcat::mcset nl "file transfer" "bestandsoverdracht" ::msgcat::mcset nl "jabber chat" "chat" ::msgcat::mcset nl "jabber groupchats" "chatruimtes" ::msgcat::mcset nl "jabber iq" "Jabber iq" ::msgcat::mcset nl "jabber presence" "aanwezigheid" ::msgcat::mcset nl "jabber registration" "registratie" ::msgcat::mcset nl "jabber xml" "xml" ::msgcat::mcset nl "jidlink" "jidlink" ::msgcat::mcset nl "kde" "kde" ::msgcat::mcset nl "message filters" "berichtenfilters" ::msgcat::mcset nl "message/headline" "bericht/kop" ::msgcat::mcset nl "multi-user chat" "chatruimtes" ::msgcat::mcset nl "negotiation" "totstandbrenging" ::msgcat::mcset nl "plugin management" "pluginbeheer" ::msgcat::mcset nl "presence" "aanwezigheid" ::msgcat::mcset nl "privacy rules" "instellingen voor privacy" ::msgcat::mcset nl "rosters" "rosters" ::msgcat::mcset nl "searching" "zoeken" ::msgcat::mcset nl "service discovery" "service discovery" ::msgcat::mcset nl "sound" "geluid" ::msgcat::mcset nl "text undo" "tekst ongedaan maken" ::msgcat::mcset nl "user interface" "gebruikersinterface" ::msgcat::mcset nl "utilities" "gereedschappen" ::msgcat::mcset nl "wmaker" "wmaker" # plugins/general/sound.tcl ::msgcat::mcset nl "External program, which is to be executed to play sound.\ If empty, Snack library is used (if available) to play sound."\ "Externe toepassing die moet uitgevoerd worden om geluid af te\ spelen. Indien niets is ingevuld, dan zal de bibliotheek Snack\ gebruikt worden (indien aanwezig) om geluid af te spelen." ::msgcat::mcset nl "Mute sound" "Geluid uitschakelen" ::msgcat::mcset nl "Mute sound if Tkabber window is focused." "Geluid\ uitschakelen als het venster van Tkabber geselecteerd is." ::msgcat::mcset nl "Mute sound notification." "Geluid uitschakelen." ::msgcat::mcset nl "Mute sound when displaying delayed groupchat messages."\ "Geluid uitschakelen tijdens het weergeven van vertraagde berichten\ in chatruimte." ::msgcat::mcset nl "Mute sound when displaying delayed personal chat\ messages." "Geluid uitschakelen tijdens het weergeven van vertraagde\ persoonlijke berichten." ::msgcat::mcset nl "Notify only when available" "Enkel notificeren wanneer\ beschikbaar" ::msgcat::mcset nl "Options for external play program" "Opties voor externe\ afspeeltoepassing" ::msgcat::mcset nl "Sound options." "Geluid." ::msgcat::mcset nl "Sound to play when available presence is received."\ "Geluid om af te spelen bij het ontvangen van de aanwezigheid\ 'beschikbaar'." ::msgcat::mcset nl "Sound to play when connected to Jabber server." "Geluid\ om af te spelen bij het tot stand komen van de verbinding met de\ Jabber-server." ::msgcat::mcset nl "Sound to play when groupchat message from me is\ received." "Geluid om af te spelen bij het ontvangen van eigen\ bericht in een chatruimte." ::msgcat::mcset nl "Sound to play when groupchat message is received."\ "Geluid om af te spelen bij het ontvangen van een bericht in een\ chatruimte." ::msgcat::mcset nl "Sound to play when groupchat server message is received."\ "Geluid om af te spelen bij het ontvangen van een bericht van een\ chatruimte." ::msgcat::mcset nl "Sound to play when highlighted (usually addressed\ personally) groupchat message is received." "Geluid om af te spelen\ bij het ontvangen van een geaccentueerd bericht in een chatruimte." ::msgcat::mcset nl "Sound to play when personal chat message is received."\ "Geluid om af te spelen bij het ontvangen van een bericht." ::msgcat::mcset nl "Sound to play when sending personal chat message."\ "Geluid om af te spelen bij het verzenden van een bericht." ::msgcat::mcset nl "Sound to play when unavailable presence is received."\ "Geluid om af te spelen bij het ontvangen van de aanwezigheid\ 'onbeschikbaar'." ::msgcat::mcset nl "Time interval before playing next sound (in\ milliseconds)." "Tijdsinterval tussen het afspelen van 2 geluiden (in\ milliseconden)." ::msgcat::mcset nl "Use sound notification only when being available."\ "Geluiden enkel afspelen tijdens het beschikbaar zijn." # subscribe_gateway.tcl ::msgcat::mcset nl "Convert" "Omzetten" ::msgcat::mcset nl "Convert screenname" "Schermnaam omzetten" ::msgcat::mcset nl "Enter screenname of contact you want to add" "Voer de\ schermnaam in van de contactpersoon die u wilt toevoegen" ::msgcat::mcset nl "Error while converting screenname: %s." "Fout bij\ omzetten van de schermnaam: %s" ::msgcat::mcset nl "Screenname conversion" "Omzetting van schermnaam" ::msgcat::mcset nl "Screenname:" "Schermnaam:" ::msgcat::mcset nl "Screenname: %s\n\nConverted JID: %s" "Schermnaam:\ %s\n\nOmgezette Jabber ID: %s" ::msgcat::mcset nl "Send subscription at %s" "Autorisatie verzenden naar %s" # userinfo.tcl ::msgcat::mcset nl "%s info" "Informatie over %s" ::msgcat::mcset nl "Address" "Adres" ::msgcat::mcset nl "Address 2:" "Adres 2:" ::msgcat::mcset nl "Address:" "Adres:" ::msgcat::mcset nl "BBS:" "BBS:" ::msgcat::mcset nl "Cell:" "GSM:" ::msgcat::mcset nl "City:" "Stad:" ::msgcat::mcset nl "Country:" "Land:" ::msgcat::mcset nl "Details" "Details" ::msgcat::mcset nl "E-mail:" "E-mail:" ::msgcat::mcset nl "Family Name:" "Achternaam:" ::msgcat::mcset nl "Fax:" "Fax:" ::msgcat::mcset nl "Full Name:" "Volledige naam:" ::msgcat::mcset nl "Geographical position" "Geografische positie" ::msgcat::mcset nl "Home:" "Thuis:" ::msgcat::mcset nl "Information" "Informatie" ::msgcat::mcset nl "ISDN:" "ISDN:" ::msgcat::mcset nl "JID:" "Jabber ID:" ::msgcat::mcset nl "Latitude:" "Breedtegraad:" ::msgcat::mcset nl "Location" "Locatie" ::msgcat::mcset nl "Longitude:" "Lengtegraad:" ::msgcat::mcset nl "Message Recorder:" "Antwoordapparaat:" ::msgcat::mcset nl "Middle Name:" "Tussennaam:" ::msgcat::mcset nl "Modem:" "Modem:" ::msgcat::mcset nl "Name" "Naam" ::msgcat::mcset nl "Name:" "Voornaam:" ::msgcat::mcset nl "Nickname:" "Bijnaam:" ::msgcat::mcset nl "Organization" "Organisatie" ::msgcat::mcset nl "Pager:" "Pieper:" ::msgcat::mcset nl "PCS:" "PCS:" ::msgcat::mcset nl "Personal" "Persoonlijk" ::msgcat::mcset nl "Phones" "Telefoons" ::msgcat::mcset nl "Postal Code:" "Postcode:" ::msgcat::mcset nl "Preferred:" "Voorkeur:" ::msgcat::mcset nl "Prefix:" "Voorvoegsel:" ::msgcat::mcset nl "Show" "Laten zien" ::msgcat::mcset nl "Show user info" "Informatie over contactpersoon laten\ zien" ::msgcat::mcset nl "State:" "Provincie:" ::msgcat::mcset nl "Suffix:" "Achtervoegsel:" ::msgcat::mcset nl "Telephone numbers" "Telefoonnummers" ::msgcat::mcset nl "UID:" "UID:" ::msgcat::mcset nl "Video:" "Video:" ::msgcat::mcset nl "Voice:" "Voicemail:" ::msgcat::mcset nl "Web Site:" "Website:" ::msgcat::mcset nl "Work:" "Werk:" # Space at the end of the next word is to distinguish it from another "Name:" ::msgcat::mcset nl "Name: " "Naam: " ::msgcat::mcset nl "Unit:" "Afdeling:" # Space at the end of the next word is to distinguish it from # another "Personal" ::msgcat::mcset nl "Personal " "Persoonlijk " ::msgcat::mcset nl "Role:" "Functie:" ::msgcat::mcset nl "Title:" "Titel:" ::msgcat::mcset nl " by " " door " # Space at the end of the next word is to distinguish it from another "About" ::msgcat::mcset nl "About " "Over " ::msgcat::mcset nl "Birthday" "Verjaardag" ::msgcat::mcset nl "Birthday:" "Verjaardag:" ::msgcat::mcset nl "Client" "Client" ::msgcat::mcset nl "Client:" "Client:" ::msgcat::mcset nl "Computer" "Computer" ::msgcat::mcset nl "Day:" "Dag:" ::msgcat::mcset nl "Description:" "Beschrijving:" ::msgcat::mcset nl "Image" "Afbeelding" ::msgcat::mcset nl "Interval:" "Interval:" ::msgcat::mcset nl "Last activity" "Laatste activiteit" ::msgcat::mcset nl "Last Activity or Uptime" "Laatste activiteit of uptime:" ::msgcat::mcset nl "List of users for userinfo." "Lijst van contactpersonen\ voor userinfo." ::msgcat::mcset nl "Load Image" "Afbeelding laden" ::msgcat::mcset nl "Month:" "Maand:" ::msgcat::mcset nl "None" "Geen" ::msgcat::mcset nl "OS:" "Besturingssysteem:" ::msgcat::mcset nl "Photo" "Foto" ::msgcat::mcset nl "Presence" "Aanwezigheid" ::msgcat::mcset nl "Presence is signed" "Aanwezigheid is ondertekend" ::msgcat::mcset nl "Service info" "Informatie over dienst" ::msgcat::mcset nl "Time" "Tijd" ::msgcat::mcset nl "Time Zone:" "Tijdszone:" ::msgcat::mcset nl "Time:" "Tijd:" ::msgcat::mcset nl "Uptime" "Uptime" ::msgcat::mcset nl "URL" "URL" ::msgcat::mcset nl "URL:" "URL:" ::msgcat::mcset nl "User info" "Informatie over contactpersoon" ::msgcat::mcset nl "UTC:" "UTC:" ::msgcat::mcset nl "Version" "Versie" ::msgcat::mcset nl "Year:" "Jaar:" # ifacetk/iface.tcl ::msgcat::mcset nl "Show Toolbar." "Werkbalk laten zien." ::msgcat::mcset nl "Use Tabbed Interface (you need to restart)." "Interface\ met tabbladen aanzetten (u moet Tkabber hiervoor herstarten)." # ifacetk/iroster.tcl ::msgcat::mcset nl "Are you sure to remove all users in group '%s' from\ roster? \n(Users which are in another groups too, will not be removed\ from the roster.)" "Bent u zeker dat u alle contactpersonen in groep\ '%s' wilt verwijderen uit uw roster? \n(Contactpersonen die ook in\ andere groepen zitten, zullen niet verwijderd worden uit uw roster.)" ::msgcat::mcset nl "Are you sure to remove group '%s' from roster? \n(Users\ which are in this group only, will be in undefined group.)" "Bent u\ zeker dat u groep '%s' wilt verwijderen uit uw roster?\ \n(Contactpersonen die enkel in deze groep zitten, zullen in de groep\ 'Ongedefinieerd' komen.)" ::msgcat::mcset nl "Remove all users in group..." "Alle contactpersonen in de\ groep verwijderen..." ::msgcat::mcset nl "Remove group..." "Groep verwijderen..." ::msgcat::mcset nl "Remove item..." "Item verwijderen..." ::msgcat::mcset nl "Rename group..." "Groep hernoemen..." ::msgcat::mcset nl "Send contacts to %s" "Contactpersonen verzenden naar %s" ::msgcat::mcset nl "Send file..." "Bestand verzenden..." ::msgcat::mcset nl "Send message to all users in group..." "Bericht verzenden\ naar alle contactpersonen in groep..." ::msgcat::mcset nl "Show subscription type in roster item tooltips."\ "Autorisatie laten zien in rosteritem-tekstballonnen." ::msgcat::mcset nl "Stored collapsed roster groups." "Ingeklapte bewaarde\ rostergroepen." ::msgcat::mcset nl "Use aliases to show multiple users in one roster item."\ "Bijnamen gebruiken om meerdere contactpersonen in één rosteritem te\ laten zien." ::msgcat::mcset nl "via HTTP..." "via HTTP..." # jabberlib-tclxml/jabberlib.tcl ::msgcat::mcset nl "Authentication failed" "Authenticatie mislukte" ::msgcat::mcset nl "Authentication successful" "Authenticatie is gelukt" ::msgcat::mcset nl "Got authentication mechanisms" "Authenticatiemechanismes\ gekregen" ::msgcat::mcset nl "Got roster" "Roster gekregen" ::msgcat::mcset nl "Got stream" "Stream gekregen" ::msgcat::mcset nl "Got stream features" "Mogelijkheden van de stream\ gekregen" ::msgcat::mcset nl "Resource Constraint" "Bronbeperking" ::msgcat::mcset nl "Server haven't provided non-SASL authentication feature"\ "De server ondersteunt geen authenticatie via 'non-SASL'" ::msgcat::mcset nl "Server haven't provided SASL authentication feature" "De\ server ondersteunt geen authenticatie via SASL" ::msgcat::mcset nl "Server haven't provided STARTTLS feature" "De server\ ondersteunt geen STARTTLS" ::msgcat::mcset nl "Waiting for authentication mechanisms" "Bezig met wachten\ op authenticatiemechanismes" ::msgcat::mcset nl "Waiting for authentication results" "Bezig met wachten op\ authenticatieresultaten" ::msgcat::mcset nl "Waiting for roster" "Wachten voor roster" ::msgcat::mcset nl "Waiting for stream" "Bezig met wachten op stream" ::msgcat::mcset nl "Waiting for stream features" "Bezig met wachten op\ mogelijkheden van de stream" # jabberlib-tclxml/jlibsasl.tcl ::msgcat::mcset nl "Aborted" "Afgebroken" ::msgcat::mcset nl "Incorrect encoding" "Foutieve codering" ::msgcat::mcset nl "Invalid authzid" "Ongeldige authzid" ::msgcat::mcset nl "Invalid mechanism" "Ongeldig mechanisme" ::msgcat::mcset nl "Mechanism too weak" "Mechanisme is te zwak" ::msgcat::mcset nl "Temporary auth failure" "Tijdelijk autorisatieprobleem" # jabberlib-tclxml/streamerror.tcl ::msgcat::mcset nl "Bad Format" "Slecht formaat" ::msgcat::mcset nl "Bad Namespace Prefix" "Slecht namespace-voorvoegsel" ::msgcat::mcset nl "Connection Timeout" "Tijdslimiet voor verbinden\ overschreden" ::msgcat::mcset nl "Host Unknown" "Host onbekend" ::msgcat::mcset nl "Improper Addressing" "Foutieve adressering" ::msgcat::mcset nl "Invalid From" "Ongeldige afzender" ::msgcat::mcset nl "Invalid ID" "Ongeldige ID" ::msgcat::mcset nl "Invalid Namespace" "Ongeldige namespace" ::msgcat::mcset nl "Invalid XML" "Ongeldige XML" ::msgcat::mcset nl "Policy Violation" "Schending van beleid" ::msgcat::mcset nl "Restricted XML" "Beperk XML" ::msgcat::mcset nl "See Other Host" "Bekijk andere host" ::msgcat::mcset nl "Stream Error%s%s" "Streamfout%s%s" ::msgcat::mcset nl "Unsupported Encoding" "Niet ondersteunde codering" ::msgcat::mcset nl "Unsupported Stanza Type" "Niet ondersteunde stanza" ::msgcat::mcset nl "Unsupported Version" "Niet ondersteunde versie" ::msgcat::mcset nl "XML Not Well-Formed" "Slecht gevormde XML" # plugins/chat/bookmark_highlighted.tcl ::msgcat::mcset nl "Next highlighted" "Volgende geaccentueerde" ::msgcat::mcset nl "Prev highlighted" "Vorige geaccentueerde" # plugins/chat/clear.tcl ::msgcat::mcset nl "Clear chat window" "Chatvenster leegmaken" # plugins/chat/draw_timestamp.tcl ::msgcat::mcset nl "Format of timestamp in delayed chat messages delayed for\ more than 24 hours." "Formaat van tijd in berichten die meer dan 24\ uur vertraagd werden." # plugins/chat/events.tcl ::msgcat::mcset nl "%s is composing a reply" "%s stelt momenteel een\ aantwoord op" ::msgcat::mcset nl "Composing a reply" "Bezig met opstellen van antwoord" ::msgcat::mcset nl "Message delivered" "Bericht is afgeleverd" ::msgcat::mcset nl "Message delivered to %s" "Bericht is afgeleverd bij %s" ::msgcat::mcset nl "Message displayed" "Bericht is weergegeven" ::msgcat::mcset nl "Message displayed to %s" "Bericht is weergegeven bij %s" ::msgcat::mcset nl "Message stored on %s's server" "Bericht is opgeslagen op\ de server van %s" ::msgcat::mcset nl "Message stored on the server" "Bericht is opgeslagen op\ de server" # plugins/chat/highlight.tcl ::msgcat::mcset nl "Enable highlighting plugin." "Accentueringsplugin\ aanzetten." ::msgcat::mcset nl "Groupchat message highlighting plugin options." "Opties\ voor accentuering van berichten in een chatruimte." ::msgcat::mcset nl "Highlight current nickname in messages." "Huidige bijnaam\ in berichten accentueren." ::msgcat::mcset nl "Highlight only whole words in messages." "Alleen hele\ woorden in berichten accentueren." ::msgcat::mcset nl "Substrings to highlight in messages." "Deelreeksen om te\ accentueren in berichten." # plugins/chat/info_commands.tcl ::msgcat::mcset nl "Address 2" "Adres 2" ::msgcat::mcset nl "City" "Stad" ::msgcat::mcset nl "Country" "Land" ::msgcat::mcset nl "Display %s in chat window when using /vcard command." "%s\ in chatvenster laten zien bij gebruik van het commando /vcard." ::msgcat::mcset nl "E-mail" "E-mail" ::msgcat::mcset nl "Family Name" "Achternaam" ::msgcat::mcset nl "Full Name" "Volledige naam" ::msgcat::mcset nl "JID" "Jabber ID" ::msgcat::mcset nl "last %s%s:" "laatst %s%s:" ::msgcat::mcset nl "last %s%s: %s" "laatst %s%s:" ::msgcat::mcset nl "Latitude" "Breedtegraad" ::msgcat::mcset nl "Longitude" "Lengtegraad" ::msgcat::mcset nl "Middle Name" "Tussennaam" ::msgcat::mcset nl "Nickname" "Bijnaam" ::msgcat::mcset nl "Organization Name" "Organisatie" ::msgcat::mcset nl "Organization Unit" "Afdeling" ::msgcat::mcset nl "Phone BBS" "Nummer BBS" ::msgcat::mcset nl "Phone Cell" "GSM-nummer" ::msgcat::mcset nl "Phone Fax" "Faxnummer" ::msgcat::mcset nl "Phone Home" "Telefoon thuis" ::msgcat::mcset nl "Phone ISDN" "Nummer ISDN" ::msgcat::mcset nl "Phone Message Recorder" "Nummer antwoordapparaat" ::msgcat::mcset nl "Phone Modem" "Nummer modem" ::msgcat::mcset nl "Phone Pager" "Nummer pieper" ::msgcat::mcset nl "Phone PCS" "Nummer PCS" ::msgcat::mcset nl "Phone Preferred" "Voorkeur" ::msgcat::mcset nl "Phone Video" "Nummer video" ::msgcat::mcset nl "Phone Voice" "Nummer voicemail" ::msgcat::mcset nl "Phone Work" "Telefoon werk" ::msgcat::mcset nl "Postal Code" "Postcode" ::msgcat::mcset nl "Prefix" "Voorvoegsel" ::msgcat::mcset nl "State " "Provincie" ::msgcat::mcset nl "Suffix" "Achtervoegsel" ::msgcat::mcset nl "time %s%s:" "tijd? %s%s:" ::msgcat::mcset nl "time %s%s: %s" "tijd? %s%s: %s" ::msgcat::mcset nl "Title" "Titel" ::msgcat::mcset nl "UID" "UID" ::msgcat::mcset nl "vcard %s%s:" "vcard %s%s:" ::msgcat::mcset nl "vcard %s%s: %s" "vcard %s%s: %s" ::msgcat::mcset nl "version %s%s:" "versie %s%s:" ::msgcat::mcset nl "version %s%s: %s" "versie %s%s: %s" ::msgcat::mcset nl "Web Site" "Website" ::msgcat::mcset nl "vCard display options in chat windows." # plugins/chat/logger.tcl ::msgcat::mcset nl "All" "Alle" ::msgcat::mcset nl "Current" "Huidig" ::msgcat::mcset nl "Directory to store logs." "Map om logs in op te slaan." ::msgcat::mcset nl "Export to XHTML" "Naar XHTML exporteren" ::msgcat::mcset nl "History for %s" "Geschiedenis voor %s" ::msgcat::mcset nl "Logging options." "Logopties." ::msgcat::mcset nl "Match case while searching in log window."\ "Hoofdlettergevoelig zoeken in logvenster." ::msgcat::mcset nl "Search down" "Zoeken" ::msgcat::mcset nl "Search up" "Achterwaarts zoeken" ::msgcat::mcset nl "Search:" "Zoeken:" ::msgcat::mcset nl "Select month:" "Maand selecteren:" ::msgcat::mcset nl "Store group chats logs." "Logs van chatruimtes opslaan." ::msgcat::mcset nl "Store private chats logs." "Logs van privéchats opslaan." ::msgcat::mcset nl "Use regexp match while searching in log window (otherwise\ substring is searched)." "Gebruik reguliere expressie om te zoeken in\ het logvenster" # plugins/chat/draw_xhtml_message.tcl ::msgcat::mcset nl "Enable rendering of XHTML messages." "Weergave van\ XHTML-berichten aanzetten." # plugins/chat/complete_last_nick.tcl ::msgcat::mcset nl "Number of groupchat messages to expire nick completion\ according to the last personally addressed message." "Aantal\ berichten in chatruimte om te laten verlopen bijnaam-aanvulling\ volgens het laatste persoonlijke bericht." # plugins/chat/nick_colors.tcl ::msgcat::mcset nl "Color message bodies in chat windows." "Gekleurde\ berichtinhoud aanzetten in chatvensters." ::msgcat::mcset nl "Edit %s color" "%s-kleur bewerken" ::msgcat::mcset nl "Edit chat user colors" "Kleuren voor contactpersoon\ bewerken" ::msgcat::mcset nl "Edit nick color..." "Kleur voor bijnaam bewerken..." ::msgcat::mcset nl "Edit nick colors..." "Kleuren voor bijnaam bewerken..." ::msgcat::mcset nl "Use colored messages" "Gekleurde berichten aanzetten" ::msgcat::mcset nl "Use colored nicks" "Gekleurde bijnamen aanzetten" ::msgcat::mcset nl "Use colored nicks in chat windows." "Gekleurde bijnamen\ aanzetten in chatvensters." ::msgcat::mcset nl "Use colored nicks in groupchat rosters." "Gekleurde\ bijnamen aanzetten in chatruimtes." ::msgcat::mcset nl "Use colored roster nicks" "Gekleurde bijnamen in roster\ aanzetten" # plugins/chat/popupmenu.tcl ::msgcat::mcset nl "Clear bookmarks" "Bladwijzers verwijderen" ::msgcat::mcset nl "Copy selection to clipboard" "Selectie kopiëren naar\ klembord" ::msgcat::mcset nl "Google selection" "Selectie opzoeken in Google" ::msgcat::mcset nl "Next bookmark" "Volgende bladwijzer" ::msgcat::mcset nl "Prev bookmark" "Vorige bladwijzer" ::msgcat::mcset nl "Set bookmark" "Bladwijzer instellen" # plugins/general/tkcon.tcl ::msgcat::mcset nl "Show console" "Commandoregel laten zien" # plugins/jidlink/dtcp.tcl ::msgcat::mcset nl "Opening DTCP active connection" "DTCP actieve verbinding\ openen" ::msgcat::mcset nl "Opening DTCP passive connection" "DTCP passieve\ verbinding openen" # plugins/jidlink/ibb.tcl ::msgcat::mcset nl "Opening IBB connection" "IBB verbinding openen" # plugins/clientinfo.tcl ::msgcat::mcset nl "\n\tClient: %s" "\n\tClient: %s" ::msgcat::mcset nl "\n\tName: %s" "\n\tNaam: %s" ::msgcat::mcset nl "\n\tOS: %s" "\n\tBesturingssysteem: %s" # plugins/filetransfer/si.tcl ::msgcat::mcset nl "Enable SI transport for outgoing file transfers."\ "SI-transport aanzetten voor uitgaande bestandsoverdrachten." ::msgcat::mcset nl "Send file via SI..." "Bestand via SI verzenden..." ::msgcat::mcset nl "Stream initiation options." "Opties voor\ streaminitiatie." ::msgcat::mcset nl "via SI..." "via SI..." # plugins/filetransfer/http.tcl ::msgcat::mcset nl "Can't receive file: %s" "Kan bestand niet downloaden: %s" ::msgcat::mcset nl "Enable HTTP transport for outgoing file transfers."\ "HTTP-transport aanzetten voor uitgaande bestandsoverdrachten." ::msgcat::mcset nl "Error while sending file. Peer reported: %s" "Fout bij\ verzenden van bestand. Foutmelding: %s" ::msgcat::mcset nl "HTTP options." "HTTP-opties." # plugins/general/annotations.tcl ::msgcat::mcset nl "Created: %s" "Aangemaakt: %s" ::msgcat::mcset nl "Edit item notes..." "Itemaantekeningen bewerken..." ::msgcat::mcset nl "Edit roster notes for %s" "Rosteraantekeningen bewerken\ voor %s" ::msgcat::mcset nl "Modified: %s" "Gewijzigd: %s" ::msgcat::mcset nl "Notes" "Aantekeningen" ::msgcat::mcset nl "Roster Notes" "Rosteraantekeningen" ::msgcat::mcset nl "Store" "Bewaren" ::msgcat::mcset nl "Storing roster notes failed: %s" "Rosteraantekeningen\ opslaan mislukte: %s" # plugins/general/autoaway.tcl # "Automatically away due to idle" goes to textstatus (probably # no needs to translate) ::msgcat::mcset nl "Automatically away due to idle" # rest should be translated ::msgcat::mcset nl "Idle for %s" "Stil voor %s" ::msgcat::mcset nl "Idle threshold in minutes after that Tkabber marks you as\ away." "Stilheidsdrempelwaarde nadat Tkabber u markeert als afwezig\ (in minuten)." ::msgcat::mcset nl "Idle threshold in minutes after that Tkabber marks you as\ extended away." "Stilheidsdrempelwaarde nadat Tkabber u markeert als\ langdurig afwezig (in minuten)." ::msgcat::mcset nl "Moving to extended away" "Naar 'langdurig afwezig' gaan" ::msgcat::mcset nl "Options for module that automatically marks you as away\ after idle threshold." "Opties voor module die u automatisch als\ afwezig markeert na een stilheidsdrempelwaarde." ::msgcat::mcset nl "Returning from auto-away" "Terug van 'automatisch\ afwezig'" ::msgcat::mcset nl "Set priority to 0 when moving to extended away state."\ "Prioriteit wijzigen naar 0 bij overgaan naar de aanwezigheid\ 'langdurig afwezig'." ::msgcat::mcset nl "Starting auto-away" "Naar 'automatisch afwezig' gaan" ::msgcat::mcset nl "Text status, which is set when Tkabber is moving to away\ state." "Tekstboodschap die ingesteld moet worden bij het overgaan\ naar de aanwezigheid 'afwezig'." # plugins/general/conferences.tcl ::msgcat::mcset nl "Add conference" "Chatruimte toevoegen" ::msgcat::mcset nl "Storing conferences failed: %s" "Opslaan van chatruimtes\ mislukte: %s" # plugins/general/conferenceinfo.tcl ::msgcat::mcset nl "\n\tCan't browse: %s" "\n\tKan niet browsen: %s" ::msgcat::mcset nl "\nRoom is empty at %s" "\nChatruimte is leeg op %s" ::msgcat::mcset nl "\nRoom participants at %s:" "\nDeelnemers van chatruimte\ op %s" ::msgcat::mcset nl "Interval (in minutes) after error reply on request of\ participants list." "Interval (minuten) na fout bij aanvraag\ deelnemerslijst." ::msgcat::mcset nl "Interval (in minutes) between requests of participants\ list." "Interval (minuten) tussen aanvragen van deelnemerslijst." ::msgcat::mcset nl "Options for Conference Info module, that allows you to\ see list of participants in roster popup, regardless of whether you\ are currently joined with the conference." "Opties voor de\ chatruimte-informatiemodule die u in staat stelt om de\ deelnemerslijst in een rosterpopup te zien, onachtzaam of u momenteel\ al dan niet de chatruimte betreden hebt." ::msgcat::mcset nl "Use this module" "Deze module aanzetten" # plugins/general/message_archive.tcl ::msgcat::mcset nl "Dir" "Map" ::msgcat::mcset nl "From/To" "Van/naar" ::msgcat::mcset nl "From:" "Van:" ::msgcat::mcset nl "Messages" "Berichten" ::msgcat::mcset nl "Received/Sent" "Ontvangen/verzonden" ::msgcat::mcset nl "Subject" "Onderwerp" ::msgcat::mcset nl "To:" "Naar:" # plugins/general/offline.tcl ::msgcat::mcset nl "Fetch all messages" "Alle berichten ophalen" ::msgcat::mcset nl "Fetch message" "Bericht ophalen" ::msgcat::mcset nl "Fetch unseen messages" "Ongelezen berichten ophalen" ::msgcat::mcset nl "Offline Messages" "Offline berichten" ::msgcat::mcset nl "Purge all messages" "Alle berichten verwijderen" ::msgcat::mcset nl "Purge message" "Bericht verwijderen" ::msgcat::mcset nl "Purge seen messages" "Gelezen berichten verwijderen" ::msgcat::mcset nl "Retrieve offline messages using POP3-like protocol."\ "Offline berichten ophalen zoals POP3" ::msgcat::mcset nl "Sort by from" "Volgens afzender sorteren" ::msgcat::mcset nl "Sort by node" "Volgens node sorteren" ::msgcat::mcset nl "Sort by type" "Volgens soort sorteren" # plugins/general/presenceinfo.tcl ::msgcat::mcset nl "\n\tPresence is signed:" "\n\tAanwezigheid is\ ondertekend:" # plugins/general/rawxml.tcl ::msgcat::mcset nl "Available presence" "Aanwezigheid 'beschikbaar'" ::msgcat::mcset nl "Chat message" "Chatbericht" ::msgcat::mcset nl "Clear" "Wissen" ::msgcat::mcset nl "Create node" "Node aanmaken" ::msgcat::mcset nl "Generic IQ" "Algemene IQ" ::msgcat::mcset nl "Get items" "Items downloaden" ::msgcat::mcset nl "Headline message" "Kop" ::msgcat::mcset nl "IQ" "IQ" ::msgcat::mcset nl "Message" "Bericht" ::msgcat::mcset nl "Normal message" "Normaal bericht" ::msgcat::mcset nl "Options for Raw XML Input module, which allows you to\ monitor incoming/outgoing traffic from connection to server and send\ custom XML stanzas." "Opties voor de module om ruwe XML in te voeren,\ die u toelaat om mee te luisteren met inkomend/uitgaand verkeer van\ de verbinding met de server en om aangepaste XML-stanza's te\ versturen." ::msgcat::mcset nl "Pub/sub" "Publish-Subscribe" ::msgcat::mcset nl "Publish node" "Node publiceren" ::msgcat::mcset nl "Raw XML" "Ruwe XML" ::msgcat::mcset nl "Retract node" "Node intrekken" ::msgcat::mcset nl "Subscribe to a node" "Op een node inschrijven" ::msgcat::mcset nl "Templates" "Sjablonen" ::msgcat::mcset nl "Unavailable presence" "Aanwezigheid 'onbeschikbaar'" ::msgcat::mcset nl "Unsubscribe from a node" "Van een node uitschrijven" # plugins/general/stats.tcl ::msgcat::mcset nl "Name " "Naam" ::msgcat::mcset nl "Node" "Node" ::msgcat::mcset nl "Open statistics monitor" "Statistiekenmonitor openen" ::msgcat::mcset nl "Request" "Aanvragen" ::msgcat::mcset nl "Set" "Instellen" ::msgcat::mcset nl "Statistics" "Statistieken" ::msgcat::mcset nl "Statistics monitor" "Statistiekenmonitor" ::msgcat::mcset nl "Timer" "Tijdopnemer" ::msgcat::mcset nl "Units" "Onderdeel" ::msgcat::mcset nl "Value" "Waarde" # plugins/unix/dockingtray.tcl ::msgcat::mcset nl "Hide Main Window" "Hoofdvenster verbergen" ::msgcat::mcset nl "Show Main Window" "Hoofdvenster laten zien" ::msgcat::mcset nl "When you have unread messages the systray icon will start\ to blink." "Wanneer u ongelezen berichten hebt, zal het pictogram in\ het systeemvak beginnen te knipperen." # plugins/unix/systray.tcl ::msgcat::mcset nl "Log in/out..." "Aan/afmelden" ::msgcat::mcset nl "Minimize to systray" "Minimaliseren naar systeemvak" # plugins/unix/ispell.tcl ::msgcat::mcset nl "- nothing -" "- niets -" ::msgcat::mcset nl "Check spell after every entered symbol." "Spelling\ controleren na elk ingevoerd teken." ::msgcat::mcset nl "Ispell dictionary encoding. If it is empty, system\ encoding is used." "ISpell woordenboek encodering. Als dit leeg is\ dan zal de systeemencodering gebruikt worden." ::msgcat::mcset nl "Ispell dictionary. If it is empty, default dictionary is\ used." "ISpell woordenboek. Als dit leeg is dan zal het\ standaardwoordenboek gebruikt worden." ::msgcat::mcset nl "Path to the ispell executable." "Pad naar het uitvoerbaar\ bestand van ISpell." ::msgcat::mcset nl "Plugins options." "Pluginopties." ::msgcat::mcset nl "Spell check options." "Opties van spellingscontrole." # plugins/unix/wmdock.tcl ::msgcat::mcset nl "%s is %s" "%s is %s" ::msgcat::mcset nl "%s msgs" "%s berichten" # plugins/windows/taskbar.tcl ::msgcat::mcset nl "When you have unread messages the taskbar icon will start\ to blink." "Het pictogram van de taakbalk zal gaan knipperen wanneer\ u ongelezen berichten hebt." # plugins/iq/time.tcl ::msgcat::mcset nl "Reply to current time (jabber:iq:time) requests." "Op\ aanvragen voor de huidige tijd (jabber:iq:time) antwoorden." # plugins/general/stats.tcl ::msgcat::mcset nl "Service statistics" "Statistieken van diensten" # plugins/iq/version.tcl ::msgcat::mcset nl "Reply to version (jabber:iq:version) requests." "Op\ versieaanvraagen (jabber:iq:version) antwoorden." # error types ::msgcat::mcset nl "Authentication Error" "Authenticatiefout" ::msgcat::mcset nl "Request Error" "Fout in aanvraag" ::msgcat::mcset nl "Temporary Error" "Tijdelijke fout" ::msgcat::mcset nl "Unrecoverable Error" "Onherstelbare fout" ::msgcat::mcset nl "Warning" "Waarschuwing" # error messages ::msgcat::mcset nl "Bad Request" "Foutieve aanvraag" ::msgcat::mcset nl "Conflict" "Conflict" ::msgcat::mcset nl "Feature Not Implemented" "Functie niet geïmplementeerd" ::msgcat::mcset nl "Forbidden" "Verboden" ::msgcat::mcset nl "Gone" "Gegaan" ::msgcat::mcset nl "Internal Server Error" "Interne serverfout" ::msgcat::mcset nl "Item Not Found" "Item niet gevonden" ::msgcat::mcset nl "JID Malformed" "Slecht gevormde Jabber ID" ::msgcat::mcset nl "Not Acceptable" "Niet accepteerbaar" ::msgcat::mcset nl "Not Allowed" "Niet toegestaan" ::msgcat::mcset nl "Not Authorized" "Niet geautoriseerd" ::msgcat::mcset nl "Payment Required" "Betaling vereist" ::msgcat::mcset nl "Recipient Unavailable" "Ontvanger onbeschikbaar" ::msgcat::mcset nl "Registration Required" "Registratie vereist" ::msgcat::mcset nl "Remote Server Not Found" "Server niet gevonden" ::msgcat::mcset nl "Remote Server Timeout" "Servertimeout" ::msgcat::mcset nl "Service Unavailable" "Dienst niet beschikbaar" ::msgcat::mcset nl "Subscription Required" "Autorisatie vereist" ::msgcat::mcset nl "Undefined Condition" "Ongedefinieerde conditie" ::msgcat::mcset nl "Unexpected Request" "Onverwachte aanvraag" ::msgcat::mcset nl "Redirect" "Omleiden" # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/msgs/pl.msg000064400000000000000000004256371477701321300141660ustar00nobodynobody# pl.msg -- # # Polish messages for the Tkabber XMPP client. # # Author: Irek Chmielowiec # Contact: xmpp:irek(at)chmielowiec.org # browser.tcl ::msgcat::mcset pl "%s: %s/%s, Description: %s, Version: %s\nNumber of\ children: %s" "%s: %s/%s\nOpis: %s\nWersja: %s\nLiczba elementów: %s" ::msgcat::mcset pl "Browse" "PrzeglÄ…daj" ::msgcat::mcset pl "JID:" "JID:" ::msgcat::mcset pl "Number of children:" "Ilość elementów:" ::msgcat::mcset pl "Sort" "Sortuj" # plugins/general/message_archive.tcl ::msgcat::mcset pl "#" "#" ::msgcat::mcset pl "Dir" "<->" ::msgcat::mcset pl "From/To" "Od/Do" ::msgcat::mcset pl "From:" "Od:" ::msgcat::mcset pl "Messages" "WiadomoÅ›ci" ::msgcat::mcset pl "Received/Sent" "Odebrane/WysÅ‚ane" ::msgcat::mcset pl "Subject" "Temat" ::msgcat::mcset pl "Subject:" "Temat:" ::msgcat::mcset pl "To:" "Do:" # register.tcl ::msgcat::mcset pl "Cancel" "Anuluj" ::msgcat::mcset pl "Change Password for %s" "Zmiana hasÅ‚a dla %s" ::msgcat::mcset pl "Close" "Zamknij" ::msgcat::mcset pl "Enter the new password for %s" "Wprowadź nowe hasÅ‚o dla\ %s" ::msgcat::mcset pl "OK" "OK" ::msgcat::mcset pl "Register" "Zarejestruj" ::msgcat::mcset pl "Register in %s" "Rejestracja w %s" ::msgcat::mcset pl "Registration is successful!" "Rejestracja powiodÅ‚a siÄ™!" ::msgcat::mcset pl "Registration: %s" "Rejestracja: %s" ::msgcat::mcset pl "Unregister" "Wyrejestruj" # presence.tcl ::msgcat::mcset pl "Available" "DostÄ™pny" ::msgcat::mcset pl "Away" "Zaraz wracam" ::msgcat::mcset pl "Change Presence Priority" "ZmieÅ„ priorytet statusu" ::msgcat::mcset pl "Do not disturb" "Nie przeszkadzać" ::msgcat::mcset pl "Extended away" "Nieobecny" ::msgcat::mcset pl "Free to chat" "ChÄ™tny do rozmowy" ::msgcat::mcset pl "Illegal presence type \"%s\"" "NieprawidÅ‚owy typ statusu\ \"%s\"" ::msgcat::mcset pl "invalid userstatus value " "nieprawidÅ‚owy status " ::msgcat::mcset pl "Invalid userstatus value %s" "NieprawidÅ‚owa wartość\ statusu użytkownika %s" ::msgcat::mcset pl "Invisible" "Niewidoczny" ::msgcat::mcset pl "Not logged in" "Rozłączony" ::msgcat::mcset pl "Stored user priority." "ZapamiÄ™tany priorytet\ użytkownika." ::msgcat::mcset pl "Stored user status." "ZapamiÄ™tany status użytkownika." ::msgcat::mcset pl "Stored user text status." "ZapamiÄ™tany opis statusu\ użytkownika." ::msgcat::mcset pl "Unavailable" "Rozłączony" ::msgcat::mcset pl "Unsubscribed from %s" "Subskrypcja od %s anulowana" ::msgcat::mcset pl "You are unsubscribed from %s" "Twoja subskrypcja od %s\ zostaÅ‚a anulowana" # filetransfer.tcl ::msgcat::mcset pl "Browse..." "PrzeglÄ…daj..." ::msgcat::mcset pl "Can't open file \"%s\": %s" "Nie można otworzyć pliku\ \"%s\": %s" ::msgcat::mcset pl "Default directory for downloaded files." "DomyÅ›lny\ katalog dla Å›ciÄ…ganych plików." ::msgcat::mcset pl "Default protocol for sending files." "DomyÅ›lny protokół\ wysyÅ‚ania plików." ::msgcat::mcset pl "Description:" "Opis:" ::msgcat::mcset pl "File Transfer options." "Ustawienia przesyÅ‚ania plików." ::msgcat::mcset pl "IP address:" "Nazwa lub adres IP:" ::msgcat::mcset pl "Name:" "Nazwa:" ::msgcat::mcset pl "Protocol:" "Protokół:" ::msgcat::mcset pl "Receive" "Odbierz" ::msgcat::mcset pl "Receive file from %s" "Odbierz plik od %s" ::msgcat::mcset pl "Request failed: %s" "WywoÅ‚anie nie powiodÅ‚o siÄ™: %s" ::msgcat::mcset pl "Save as:" "Zapisz jako:" ::msgcat::mcset pl "Send" "WyÅ›lij" ::msgcat::mcset pl "Send file to %s" "WyÅ›lij plik do %s" ::msgcat::mcset pl "Size:" "Rozmiar:" ::msgcat::mcset pl "Transferring..." "PrzesyÅ‚anie..." ::msgcat::mcset pl "unknown" "nieznany" ::msgcat::mcset pl "URL:" "URL:" # default.tcl ::msgcat::mcset pl "Error displaying %s in browser\n\n%s" "WystÄ…piÅ‚ błąd\ podczas otwierania %s w przeglÄ…darce\n\n%s" ::msgcat::mcset pl "Please define environment variable BROWSER" "Należy\ ustawić zmiennÄ… systemowÄ… BROWSER" # plugins/general/ispell.tcl ::msgcat::mcset pl "- nothing -" "- nic -" ::msgcat::mcset pl "Check spell after every entered symbol." "Sprawdzaj\ pisowniÄ™ po każdym wprowadzonym znaku." ::msgcat::mcset pl "Could not start ispell server. Check your ispell path and\ dictionary name. Ispell is disabled now" "Nie udaÅ‚o siÄ™ wystartować\ programu ispell. Sprawdź Å›cieżkÄ™ do programu i nazwÄ™ sÅ‚ownika. Ispell\ jest w tej chwili wyłączony" ::msgcat::mcset pl "Enable spellchecker in text input windows." "Włącz\ sprawdzanie pisowni w oknach gdzie wpisuje siÄ™ tekst." ::msgcat::mcset pl "Ispell dictionary encoding. If it is empty, system\ encoding is used." "Kodowanie sÅ‚ownika ispell. Jeżeli niewypeÅ‚nione,\ użyte zostanÄ… ustawienia systemu." ::msgcat::mcset pl "Ispell options. See ispell manual for\ details.\n\nExamples:\n -d russian\n -d german -T latin1\n -C -d\ english" "Parametry programu ispell. DokÅ‚adny opis znajduje siÄ™ w\ dokumentacji programu. \n\nPrzykÅ‚ady:\n -d russian\n -d german -T\ latin1\n -C -d english" ::msgcat::mcset pl "Path to the ispell executable." "Åšcieżka do programu\ ispell." ::msgcat::mcset pl "Plugins options." "Ustawienia wtyczek." ::msgcat::mcset pl "Spell check options." "Ustawienia sprawdzania pisowni." # plugins/chat/events.tcl ::msgcat::mcset pl "%s is composing a reply" "%s pisze odpowiedź" ::msgcat::mcset pl "Chat message events plugin options." "Ustawienia wtyczki\ zdarzeÅ„ wiadomoÅ›ci." ::msgcat::mcset pl "Composing a reply" "Pisze odpowiedź" ::msgcat::mcset pl "Enable sending chat message events." "Włącz wysyÅ‚anie\ zdarzeÅ„ wiadomoÅ›ci w rozmowach." ::msgcat::mcset pl "Message delivered" "Wiadomość dostarczona" ::msgcat::mcset pl "Message delivered to %s" "Wiadomość dostarczona do %s" ::msgcat::mcset pl "Message displayed" "Wiadomość przeczytana" ::msgcat::mcset pl "Message displayed to %s" "%s przeczytaÅ‚(a) wiadomość" ::msgcat::mcset pl "Message stored on %s's server" "Wiadomość zapamiÄ™tana na\ serwerze %s" ::msgcat::mcset pl "Message stored on the server" "Wiadomość zapamiÄ™tana na\ serwerze" # plugins/chat/chatstate.tcl ::msgcat::mcset pl "%s has activated chat window" "%s aktywowaÅ‚ okno rozmowy" ::msgcat::mcset pl "%s has gone chat window" "%s wyłączyÅ‚ okno rozmowy" ::msgcat::mcset pl "%s has inactivated chat window" "%s deaktywowaÅ‚ okno\ rozmowy" ::msgcat::mcset pl "%s is paused a reply" "%s wstrzymaÅ‚ odpowiedź" ::msgcat::mcset pl "Chat message window state plugin options." "Ustawienia\ wtyczki stanu okna rozmowy." ::msgcat::mcset pl "Chat window is active" "Okno rozmowy jest aktywne" ::msgcat::mcset pl "Chat window is gone" "Okno rozmowy jest wyłączone" ::msgcat::mcset pl "Chat window is inactive" "Okno rozmowy jest nieaktywne" ::msgcat::mcset pl "Enable sending chat state notifications." "Włącz\ wysyÅ‚anie powiadomieÅ„ o stanie okna rozmowy." ::msgcat::mcset pl "Paused a reply" "Wstrzymanie odpowiedzi" # search.tcl ::msgcat::mcset pl "An error occurred when searching in %s\n\n%s" "WystÄ…piÅ‚\ błąd podczas wyszukiwania w %s\n\n%s" ::msgcat::mcset pl "Invite to conference..." "ZaproÅ› do konferencji..." ::msgcat::mcset pl "Search" "Szukaj" ::msgcat::mcset pl "Search again" "Szukaj ponownie" ::msgcat::mcset pl "Search in %s" "Wyszukiwanie w %s" ::msgcat::mcset pl "Search in %s: No matching items found" "Wyszukiwanie w\ %s: Nie znaleziono pasujÄ…cych elementów" ::msgcat::mcset pl "Search: %s" "Wyszukiwanie: %s" ::msgcat::mcset pl "Send file..." "WyÅ›lij plik..." ::msgcat::mcset pl "Send message..." "WyÅ›lij wiadomość..." ::msgcat::mcset pl "Send users..." "WyÅ›lij kontakty..." ::msgcat::mcset pl "Show history" "Historia wiadomoÅ›ci" ::msgcat::mcset pl "Show info" "Pokaż wizytówkÄ™" ::msgcat::mcset pl "Start chat" "Rozmowa" ::msgcat::mcset pl "Try again" "Ponów" # privacy.tcl ::msgcat::mcset pl "Activate visible/invisible/ignore/conference lists before\ sending initial presence." "Aktywuj listy\ widocznoÅ›ci/niewidocznoÅ›ci/ignorowania/konferecji przed wysÅ‚aniem\ poczÄ…tkowego statusu." ::msgcat::mcset pl "Activating privacy list failed: %s\n\nTry to reconnect.\ If problem persists, you may want to disable privacy list activation\ at start" "Aktywacja listy zasad prywatnoÅ›ci nie powiodÅ‚a siÄ™:\ %s\n\nSpróbuj połączyć siÄ™ ponownie. Jeżeli problem bÄ™dzie nadal\ wystÄ™powaÅ‚, być może konieczne bÄ™dzie wyłączenie aktywacji list przy\ starcie programu" ::msgcat::mcset pl "Active" "Aktywna" ::msgcat::mcset pl "Add item" "Dodaj regułę" ::msgcat::mcset pl "Add JID" "Dodaj JID" ::msgcat::mcset pl "Add list" "Dodaj listÄ™" ::msgcat::mcset pl "Blocking communication (XMPP privacy lists) options."\ "Ustawienia blokady komunikacji (listy zasad prywatnoÅ›ci XMPP)." ::msgcat::mcset pl "Blocking communication options." "Ustawienia ochrony\ prywatnoÅ›ci." ::msgcat::mcset pl "Changing accept messages from roster only: %s" "Zmiana\ akceptowania wiadomoÅ›ci tylko od osób z listy kontaktów: %s" ::msgcat::mcset pl "Creating default privacy list" "Tworzenie domyÅ›lnej listy\ zasad prywatnoÅ›ci" ::msgcat::mcset pl "Creating default privacy list failed: %s\n\nTry to\ reconnect. If problem persists, you may want to disable privacy list\ activation at start" "Tworzenie domyÅ›lnej listy zasad prywatnoÅ›ci nie\ powiodÅ‚o siÄ™: %s\n\nSpróbuj połączyć siÄ™ ponownie. Jeżeli problem\ bÄ™dzie nadal wystÄ™powaÅ‚, być może konieczne bÄ™dzie wyłączenie\ aktywacji list przy starcie programu" ::msgcat::mcset pl "Default" "DomyÅ›lna" ::msgcat::mcset pl "Down" "Niżej" ::msgcat::mcset pl "Edit conference list" "Edytuj listÄ™ konferencji" ::msgcat::mcset pl "Edit ignore list" "Edycja listy ignorowanych" ::msgcat::mcset pl "Edit invisible list" "Edycja listy niewidocznoÅ›ci" ::msgcat::mcset pl "Edit list" "Edytuj listÄ™" ::msgcat::mcset pl "Edit privacy list" "Edycja list z zasadami ochrony\ prywatnoÅ›ci" ::msgcat::mcset pl "Ignore list" "Lista ignorowanych" ::msgcat::mcset pl "Invisible list" "Lista niewidocznoÅ›ci" ::msgcat::mcset pl "IQ" "IQ" ::msgcat::mcset pl "List name" "Nazwa listy" ::msgcat::mcset pl "Name: " "Nazwa: " ::msgcat::mcset pl "No active list" "Brak aktywnej listy" ::msgcat::mcset pl "No default list" "Brak domyÅ›lnej listy" ::msgcat::mcset pl "Presence-in" "Status-przych." ::msgcat::mcset pl "Presence-out" "Status-wych." ::msgcat::mcset pl "Privacy list is activated" "Lista zasad ochrony\ prywatnoÅ›ci aktywna" ::msgcat::mcset pl "Privacy list is not activated" "Lista zasad ochrony\ prywatnoÅ›ci nieaktywna" ::msgcat::mcset pl "Privacy list is not created" "Lista zasad prywatnoÅ›ci nie\ zostaÅ‚a utworzona" ::msgcat::mcset pl "Privacy lists" "Listy zasad ochrony prywatnoÅ›ci" ::msgcat::mcset pl "Privacy lists are not implemented" "Listy zasad\ prywatnoÅ›ci nie sÄ… zaimplementowane" ::msgcat::mcset pl "Privacy lists are unavailable" "Listy zasad prywatnoÅ›ci\ sÄ… niedostÄ™pne" ::msgcat::mcset pl "Privacy lists error" "Błąd list zasad prywatnoÅ›ci" ::msgcat::mcset pl "Remove" "UsuÅ„" ::msgcat::mcset pl "Remove from list" "UsuÅ„ z listy" ::msgcat::mcset pl "Remove list" "UsuÅ„ listÄ™" ::msgcat::mcset pl "Requesting conference list: %s" "Pobieranie listy\ konferecji: %s" ::msgcat::mcset pl "Requesting ignore list: %s" "Pobieranie listy\ ignorowanych: %s" ::msgcat::mcset pl "Requesting invisible list: %s" "Pobieranie listy\ niewidocznoÅ›ci: %s" ::msgcat::mcset pl "Requesting privacy list: %s" "Pobieranie listy zasad: %s" ::msgcat::mcset pl "Requesting privacy rules: %s" "Pobieranie listy zasad z\ serwera: %s" ::msgcat::mcset pl "Requesting visible list: %s" "Pobieranie listy\ widocznoÅ›ci: %s" ::msgcat::mcset pl "Sending conference list: %s" "WysyÅ‚anie listy\ konferencji: %s" ::msgcat::mcset pl "Sending ignore list: %s" "WysyÅ‚anie listy ignorowanych:\ %s" ::msgcat::mcset pl "Sending invisible list: %s" "WysyÅ‚anie listy\ niewidocznoÅ›ci: %s" ::msgcat::mcset pl "Sending visible list: %s" "WysyÅ‚anie listy widocznoÅ›ci:\ %s" ::msgcat::mcset pl "Type" "Typ" ::msgcat::mcset pl "Up" "Wyżej" ::msgcat::mcset pl "Visible list" "Lista widocznoÅ›ci" ::msgcat::mcset pl "Waiting for activating privacy list" "Oczekiwanie na\ aktywacjÄ™ listy z zasadami ochrony prywatnoÅ›ci" # plugins/chat/draw_xhtml_message.tcl ::msgcat::mcset pl "Enable rendering of XHTML messages." "Włącz obsÅ‚ugÄ™ XHTML\ w wiadomoÅ›ciach." # plugins/chat/draw_timestamp.tcl ::msgcat::mcset pl "Format of timestamp in chat message. Refer to Tcl\ documentation of 'clock' command for description of\ format.\n\nExamples:\n \[%R\] - \[20:37\]\n \[%T\] - \[20:37:12\]\n \ \[%a %b %d %H:%M:%S %Z %Y\] - \[Thu Jan 01 03:00:00 MSK 1970\]"\ "Format czasu i daty w wiadomoÅ›ciach. DokÅ‚adny opis formatu w\ dokumentacji Tcl dla polecenia 'clock'.\n\nPrzykÅ‚ady:\n \[%R\] –\ \[20:37\]\n \[%T\] – \[20:37:12\]\n \[%a %b %d %H:%M:%S %Z %Y\] –\ \[Wto Sty 01 03:00:00 CET 1970\]" ::msgcat::mcset pl "Format of timestamp in delayed chat messages delayed for\ more than 24 hours." "Format czasu i daty w wiadomoÅ›ciach\ dostarczonych z opóźnieniem wiÄ™kszym niż 24 godziny." # roster.tcl ::msgcat::mcset pl "Active Chats" "Aktywne rozmowy" ::msgcat::mcset pl "Add chats group in roster." "Pokaż grupÄ™ 'Aktywne\ rozmowy' z listÄ… aktualnie prowadzonych rozmów i konferencji." ::msgcat::mcset pl "Add conference..." "Dodaj konferencjÄ™..." ::msgcat::mcset pl "Add group by regexp on JIDs..." "Dodaj grupÄ™ wg\ wyrażenia" ::msgcat::mcset pl "Add roster group by JID regexp" "Grupa wg wyrażenia\ regularnego dla JID-ów" ::msgcat::mcset pl "All Files" "Wszystkie pliki" ::msgcat::mcset pl "Are you sure to remove %s from roster?" "Czy na pewno\ chcesz usunąć %s ze swojej listy?" ::msgcat::mcset pl "Contact Information" "Wizytówka użytkownika" ::msgcat::mcset pl "doesn't want to be disturbed" "ma status Nie\ przeszkadzać" ::msgcat::mcset pl "Edit item..." "Edytuj kontakt..." ::msgcat::mcset pl "Edit security..." "Ustawienia zabezpieczeÅ„..." ::msgcat::mcset pl "Export roster..." "Eksportuj listÄ™..." ::msgcat::mcset pl "Import roster..." "Importuj listÄ™..." ::msgcat::mcset pl "is available" "ma status DostÄ™pny" ::msgcat::mcset pl "is away" "ma status Zaraz wracam" ::msgcat::mcset pl "is extended away" "ma status Nieobecny" ::msgcat::mcset pl "is free to chat" "ma status ChÄ™tny do rozmowy" ::msgcat::mcset pl "is invisible" "ma status Niewidoczny" ::msgcat::mcset pl "is unavailable" "ma status Rozłączony" ::msgcat::mcset pl "JID regexp:" "Wyrażenie regularne:" ::msgcat::mcset pl "Join..." "Dołącz do..." ::msgcat::mcset pl "Log in" "Zaloguj..." ::msgcat::mcset pl "Log out" "Wyloguj..." ::msgcat::mcset pl "New group name:" "Nazwa nowej grupy:" ::msgcat::mcset pl "No users in roster..." "Brak użytkowników na liÅ›cie..." ::msgcat::mcset pl "Rename roster group" "ZmieÅ„ nazwÄ™ grupy" ::msgcat::mcset pl "Resubscribe to all users in group..." "PoproÅ› ponownie o\ subskrypcjÄ™ od wszystkich w grupie..." ::msgcat::mcset pl "Roster" "Lista kontaktów" ::msgcat::mcset pl "Roster Files" "Pliki listy kontaktów" ::msgcat::mcset pl "Roster item may be dropped not only over group name but\ also over any item in group." "Elementy listy przenoszone metodÄ…\ drag&drop mogÄ… być upuszczone nie tylko na pozycjÄ™ z nazwÄ… grupy, ale\ także na każdy inny element tej grupy." ::msgcat::mcset pl "Roster of %s" "Lista kontaktów dla %s" ::msgcat::mcset pl "Roster options." "Ustawienia listy kontaktów." ::msgcat::mcset pl "Send contacts to" "WyÅ›lij kontakty do" ::msgcat::mcset pl "Send contacts to %s" "WyÅ›lij kontakty do %s" ::msgcat::mcset pl "Send custom presence" "WyÅ›lij status" ::msgcat::mcset pl "Show detailed info on conference room members in roster\ item tooltips." "Pokaż szczegółowe informacje w dymku podpowiedzi dla\ aktywnej konferencji, o użytkownikach biorÄ…cych w niej udziaÅ‚." ::msgcat::mcset pl "Show native icons for contacts, connected to\ transports/services in roster." "Pokaż wÅ‚asne ikony kontaktów,\ połączonych przez transporty/agenty." ::msgcat::mcset pl "Show native icons for transports/services in roster."\ "Pokaż wÅ‚asne ikony transportów/agentów." ::msgcat::mcset pl "Show offline users" "Pokaż użytkowników rozłączonych" ::msgcat::mcset pl "Show online users only" "Pokaż tylko użytkowników\ dostÄ™pnych" ::msgcat::mcset pl "Show only online users in roster." "Pokaż tylko\ użytkowników dostÄ™pnych." ::msgcat::mcset pl "Show subscription type in roster item tooltips." "Pokaż\ typ subskrybcji w dymku podpowiedzi dla kontaktu." ::msgcat::mcset pl "Undefined" "Niezdefiniowane" ::msgcat::mcset pl "Use aliases to show multiple users in one roster item."\ "Używaj aliasów do łączenia wielu kontaktów w jednÄ… pozycjÄ™ na liÅ›cie\ (metakontakty)." # plugins/chat/clear.tcl ::msgcat::mcset pl "Clear chat window" "Wyczyść okno rozmów" # gpgme.tcl ::msgcat::mcset pl "%s purportedly signed by %s can't be verified.\n\n%s."\ "%s podpisany przez %s nie może być zweryfikowany.\n\n%s." ::msgcat::mcset pl "%s purportedly signed by %s can't be verified: %s." "%s\ rzekomo podpisana przez %s nie może zostać zweryfikowana: %s." ::msgcat::mcset pl "Change security preferences for %s" "ZmieÅ„ ustawienia\ zabezpieczeÅ„ dla %s" ::msgcat::mcset pl "Data purportedly sent by %s can't be deciphered.\n\n%s."\ "Dane wysÅ‚ane przez %s nie mogÄ… być odszyfrowane.\n\n%s." ::msgcat::mcset pl "Display warning dialogs when signature verification\ fails." "Pokazuj okno z ostrzeżeniem gdy nie powiedzie siÄ™\ weryfikacja podpisu." ::msgcat::mcset pl "Encrypt traffic" "Szyfruj wiadomoÅ›ci" ::msgcat::mcset pl "Encrypt traffic (when possible)" "Szyfruj wiadomoÅ›ci\ (kiedy możliwe)" ::msgcat::mcset pl "Encryption" "Szyfrowanie" ::msgcat::mcset pl "Error in signature processing" "Błąd podczas weryfikacji\ podpisu" ::msgcat::mcset pl "Error in signature verification software: %s." "Błąd\ programu weryfikujÄ…cego podpis: %s." ::msgcat::mcset pl "Fetch GPG key" "Pobierz klucz GPG z serwera kluczy" ::msgcat::mcset pl "GPG error" "Błąd GPG" ::msgcat::mcset pl "GPG options (signing and encryption)." "Ustwienia GPG\ (podpisywanie i szyfrowanie wiadomoÅ›ci)." ::msgcat::mcset pl "GPG-encrypt outgoing messages where possible." "Szyfruj\ za pomocÄ… GPG wychodzÄ…ce wiadomoÅ›ci jeżeli to możliwe." ::msgcat::mcset pl "GPG-sign outgoing messages and presence updates."\ "Podpisz za pomocÄ… GPG wychodzÄ…ce wiadomoÅ›ci i zmiany statusu." ::msgcat::mcset pl "Invalid signature" "Niepoprawny podpis" ::msgcat::mcset pl "Key ID" "ID klucza" ::msgcat::mcset pl "Malformed signature block" "Wadliwy blok podpisu" ::msgcat::mcset pl "Multiple signatures having different authenticity" "Wiele\ podpisów majÄ…cych różnÄ… wiarygodność" ::msgcat::mcset pl "No information available" "Brak informacji" ::msgcat::mcset pl "Passphrase:" "HasÅ‚o:" ::msgcat::mcset pl "Please enter passphrase" "Wprowadź hasÅ‚o do klucza" ::msgcat::mcset pl "Please try again" "Spróbuj jeszcze raz" ::msgcat::mcset pl "Presence information" "Informacje o statusie" ::msgcat::mcset pl "Select" "Wybierz" ::msgcat::mcset pl "Select Key for Signing %s Traffic" "Wybierz klucz do\ podpisywania wiadomoÅ›ci od %s" ::msgcat::mcset pl "Sign traffic" "Podpisuj wiadomoÅ›ci" ::msgcat::mcset pl "Signature not processed due to missing key" "Podpis nie\ zostaÅ‚ zweryfikowany z powodu braku klucza" ::msgcat::mcset pl "The signature is good but has expired" "Podpis jest\ prawidÅ‚owy ale ulegÅ‚ przedawnieniu" ::msgcat::mcset pl "The signature is good but the key has expired" "Podpis\ jest prawidÅ‚owy ale klucz podpisujÄ…cy ulegÅ‚ przedawnieniu" ::msgcat::mcset pl "Unable to encipher data for %s: %s.\n\nEncrypting traffic\ to this user is now disabled.\n\nSend it as PLAINTEXT?" "Nie można\ zaszyfrować danych dla %s: %s.\n\nSzyfrowanie wiadomoÅ›ci do tego\ użytkownika jest wyłączone.\n\nCzy chcesz wysÅ‚ać wiadomość jako\ ZWYKÅY TEKST?" ::msgcat::mcset pl "Unable to sign message body: %s.\n\nSigning traffic is\ now disabled.\n\nSend it WITHOUT a signature?" "Nie można podpisać\ treÅ›ci: %s.\n\nPodpisywanie wiadmoÅ›ci jest wyłączone.\n\nCzy chcesz\ wysÅ‚ać BEZ podpisu?" ::msgcat::mcset pl "Unable to sign presence information: %s.\n\nPresence will\ be sent, but signing traffic is now disabled." "Nie można podpisać\ statusu widocznoÅ›ci: %s.\n\nStatus zostanie wysÅ‚any, ale podpisywanie\ wiadmoÅ›ci jest wyłączone." ::msgcat::mcset pl "Use specified key ID for signing and decrypting\ messages." "Podaj ID klucza do podpisywania i odszyfrowania\ wiadomoÅ›ci." ::msgcat::mcset pl "Use the same passphrase for signing and decrypting\ messages." "Używaj tego samego hasÅ‚a do podpisywania i odszyfrowania\ wiadomoÅ›ci." ::msgcat::mcset pl "User ID" "ID użytkownika" # roster_nested.tcl ::msgcat::mcset pl "Default nested roster group delimiter." "DomyÅ›lny\ separator dla wielopoziomowych grup." ::msgcat::mcset pl "Enable nested roster groups." "Włącz wielopoziomowe grupy\ na liÅ›cie kontaktów." # login.tcl ::msgcat::mcset pl ". Proceed?\n\n" ". Kontynuować?\n\n" ::msgcat::mcset pl "Account" "Konto" ::msgcat::mcset pl "Allow plaintext authentication mechanisms (when password\ is transmitted unencrypted)." "Włącz mechanizmy uwierzytelniania\ zwykÅ‚ym tekstem (hasÅ‚o jest wysyÅ‚ane niezaszyfrowane)." ::msgcat::mcset pl "Authentication failed: %s" "Uwierzytelnianie nie powiodÅ‚o\ siÄ™: %s" ::msgcat::mcset pl "Authentication failed: %s\nCreate new account?"\ "Uwierzytelnianie nie powiodÅ‚o siÄ™: %s\nCzy chcesz zarejestrować nowe\ konto?" ::msgcat::mcset pl "Certificate has expired" "Certyfikat straciÅ‚ ważność" ::msgcat::mcset pl "Change password" "Zmiana hasÅ‚a" ::msgcat::mcset pl "Connect via HTTP polling" "Połącz przez sewrer HTTP" ::msgcat::mcset pl "Connecting to %s" "ÅÄ…czenie z %s" ::msgcat::mcset pl "Connection" "Połączenie" ::msgcat::mcset pl "Display SSL warnings." "WyÅ›wietlaj ostrzeżenia SSL/TLS." ::msgcat::mcset pl "Failed to connect: %s" "Połączenie nie udaÅ‚o siÄ™: %s" ::msgcat::mcset pl "Forced logout" "Wymuszone wylogowanie" ::msgcat::mcset pl "HTTP Poll" "HTTP poll" ::msgcat::mcset pl "HTTP proxy address." "Adres proxy HTTP." ::msgcat::mcset pl "HTTP proxy password." "HasÅ‚o użytkownika proxy HTTP." ::msgcat::mcset pl "HTTP proxy port." "Port proxy HTTP." ::msgcat::mcset pl "HTTP proxy username." "Nazwa użytkownika proxy HTTP." ::msgcat::mcset pl "HTTPS" "HTTPS" ::msgcat::mcset pl "Keep trying" "Ponów próbÄ™" ::msgcat::mcset pl "List of logout reasons." "Lista opisów wylogowania." ::msgcat::mcset pl "Login" "Zaloguj" ::msgcat::mcset pl "Login is successful" "Zalogowanie powiodÅ‚o siÄ™" ::msgcat::mcset pl "Login log" "Dziennik połączeÅ„" ::msgcat::mcset pl "Login options." "Ustawienia logowania." ::msgcat::mcset pl "Logout" "Wyloguj" ::msgcat::mcset pl "Logout with reason" "Wyloguj z opisem" ::msgcat::mcset pl "Maximum poll interval." "Maksymalny odstÄ™p czasu dla\ odwoÅ‚aÅ„ HTTP poll." ::msgcat::mcset pl "Minimum poll interval." "Minimalny odstÄ™p czasu dla\ odwoÅ‚aÅ„ HTTP poll." ::msgcat::mcset pl "New password:" "Nowe hasÅ‚o:" ::msgcat::mcset pl "New passwords do not match" "Nowe hasÅ‚a nie pasujÄ…" ::msgcat::mcset pl "Number of HTTP poll client security keys to send before\ creating new key sequence." "Ilość kluczy klienta wysyÅ‚anych przed\ utworzeniem nowej serii kluczy." ::msgcat::mcset pl "Old password is incorrect" "Stare hasÅ‚o nie zgadza siÄ™" ::msgcat::mcset pl "Old password:" "Stare hasÅ‚o:" ::msgcat::mcset pl "Password change failed: %s" "Zmiana hasÅ‚a nie udaÅ‚a siÄ™:\ %s" ::msgcat::mcset pl "Password is changed" "HasÅ‚o zostaÅ‚o zmienione" ::msgcat::mcset pl "Password." "HasÅ‚o." ::msgcat::mcset pl "Password:" "HasÅ‚o:" ::msgcat::mcset pl "Port:" "Port:" ::msgcat::mcset pl "Priority." "Priorytet." ::msgcat::mcset pl "Priority:" "Priorytet:" ::msgcat::mcset pl "Profile" "Profil" ::msgcat::mcset pl "Profiles" "Profile" ::msgcat::mcset pl "Proxy" "Proxy" ::msgcat::mcset pl "Proxy Login:" "Użytkownik proxy:" ::msgcat::mcset pl "Proxy Password:" "HasÅ‚o proxy:" ::msgcat::mcset pl "Proxy Port:" "Port proxy:" ::msgcat::mcset pl "Proxy Server:" "Adres serwera proxy:" ::msgcat::mcset pl "Proxy type to connect." "Typ serwera proxy." ::msgcat::mcset pl "Reason:" "Opis:" ::msgcat::mcset pl "Registration failed: %s" "Rejestracja nie udaÅ‚a siÄ™: %s" ::msgcat::mcset pl "Repeat new password:" "Powtórz nowe hasÅ‚o:" ::msgcat::mcset pl "Replace opened connections" "ZastÄ…p otwarte połączenia" ::msgcat::mcset pl "Replace opened connections." "ZastÄ…p otwarte połączenia." ::msgcat::mcset pl "Resource." "Zasób." ::msgcat::mcset pl "Resource:" "Zasób:" ::msgcat::mcset pl "Retry to connect forever." "Ponawiaj próby połączena w\ nieskoÅ„czoność." ::msgcat::mcset pl "Self signed certificate" "Certyfikat typu self-signed" ::msgcat::mcset pl "Server name or IP-address." "Nazwa alternatywnego serwera\ lub jego adres IP" ::msgcat::mcset pl "Server name." "Serwer." ::msgcat::mcset pl "Server port." "Port serwera." ::msgcat::mcset pl "Server:" "Serwer:" ::msgcat::mcset pl "SOCKS4a" "SOCKS4a" ::msgcat::mcset pl "SOCKS5" "SOCKS5" ::msgcat::mcset pl "SSL" "SSL" ::msgcat::mcset pl "SSL certificate file (optional)." "Plik certyfikatu SSL\ (opcjonalnie)." ::msgcat::mcset pl "SSL Certificate:" "Certyfikat SSL:" ::msgcat::mcset pl "SSL certification authority file or directory\ (optional)." "Katalog lub plik urzÄ™du certyfikujÄ…cego SSL\ (opcjonalnie)." ::msgcat::mcset pl "SSL private key file (optional)." "Plik z kluczem\ prywatnym SSL (opcjonalnie)." ::msgcat::mcset pl "Starting login" "RozpoczÄ™to logowanie" ::msgcat::mcset pl "Timeout" "Przekroczono czas oczekiwania" ::msgcat::mcset pl "Timeout for waiting for HTTP poll responses (if set to\ zero, Tkabber will wait forever)." "Czas oczekiwania na odpowiedzi\ HTTP poll (0 oznacza czekanie w nieskoÅ„czoność)." ::msgcat::mcset pl "URL to connect to." "URL połączenia." ::msgcat::mcset pl "URL to poll:" "URL połączenia:" ::msgcat::mcset pl "Use client security keys" "Używaj kluczy klienta" ::msgcat::mcset pl "Use explicitly-specified server address and port."\ "RÄ™czne ustawienie portu i nazwy serwera do połączenia." ::msgcat::mcset pl "Use HTTP poll client security keys (recommended)."\ "Używaj kluczy klienta przy połączeniu typu HTTP poll (zalecane)." ::msgcat::mcset pl "Use HTTP poll connection method." "Użyj pasywnego\ połączenia przez serwer HTTP (polling)." ::msgcat::mcset pl "Use Proxy" "Użyj serwera proxy" ::msgcat::mcset pl "Use SASL authentication." "Włącz uwierzytelnianie SASL." ::msgcat::mcset pl "User name." "Użytkownik." ::msgcat::mcset pl "User-Agent string." "Identyfikator przeglÄ…darki\ (User-Agent)." ::msgcat::mcset pl "Username:" "Użytkownik:" ::msgcat::mcset pl "Warning display options." "Ustawienia wyÅ›wietlania\ ostrzeżeÅ„." ::msgcat::mcset pl "XMPP stream options when connecting to server." "Opcje\ strumienia XMPP przy połączeniu z serwerem." # plugins/unix/wmdock.tcl ::msgcat::mcset pl "%s is %s" "%s - %s" ::msgcat::mcset pl "%s msgs" "%s wiad" ::msgcat::mcset pl "Message from %s" "Wiadomość od %s" # plugins/unix/systray.tcl ::msgcat::mcset pl "Enable freedesktop systray icon." "Włącz obsÅ‚ugÄ™ ikony\ zasobnika freedesktop." # plugins/unix/tktray.tcl ::msgcat::mcset pl "Enable freedesktop system tray icon." "Włącz obsÅ‚ugÄ™\ ikony zasobnika freedesktop." # plugins/general/autoaway.tcl ::msgcat::mcset pl "Automatically away due to idle" "Automatyczny status\ 'Zaraz wracam' z powodu bezczynnoÅ›ci" ::msgcat::mcset pl "Idle for %s" "Bezczynny przez %s" ::msgcat::mcset pl "Idle threshold in minutes after that Tkabber marks you as\ away." "OdstÄ™p czasu w minutach, po którym Tkabber ustawi status\ 'Zaraz wracam'." ::msgcat::mcset pl "Idle threshold in minutes after that Tkabber marks you as\ extended away." "OdstÄ™p czasu w minutach, po którym Tkabber ustawi\ status 'Nieobecny'." ::msgcat::mcset pl "Moving to extended away" "Zmiana autostatusu na\ 'Nieobecny'" ::msgcat::mcset pl "Options for module that automatically marks you as away\ after idle threshold." "Ustawienia moduÅ‚u, który automatycznie\ ustawia status nieobecnoÅ›ci po okreÅ›lonym czasie bezczynnoÅ›ci." ::msgcat::mcset pl "Returning from auto-away" "Wyłączanie autostatusu 'Zaraz\ wracam'" ::msgcat::mcset pl "Set priority to 0 when moving to extended away state."\ "Ustaw priorytet na 0 przy przejÅ›ciu do statusu 'Nieobecny'." ::msgcat::mcset pl "Starting auto-away" "Włączanie autostausu 'Zaraz wracam'" ::msgcat::mcset pl "Text status, which is set when Tkabber is moving to away\ state." "Opis statusu, który bÄ™dzie ustawiony po przejÅ›ciu w stan\ 'Zaraz wracam'." # plugins/general/clientinfo.tcl ::msgcat::mcset pl "\n\tClient: %s" "\n\tKlient: %s" ::msgcat::mcset pl "\n\tName: %s" "\n\tNazwa: %s" ::msgcat::mcset pl "\n\tOS: %s" "\n\tSystem: %s" ::msgcat::mcset pl "Options for Client Info module, which allows you to\ automatically retrieve client names and versions for contacts in your\ roster." "Ustawienia moduÅ‚u Informacji o Kliencie, który pozwala na\ automatyczne pobieranie nazw i wersji klientów używanych przez\ użytkowników z listy kontaktów." # userinfo.tcl ::msgcat::mcset pl " by " " przez " ::msgcat::mcset pl "%s info" "Wizytówka dla %s" ::msgcat::mcset pl "About " "Dodatkowe " ::msgcat::mcset pl "Address" "Adres" ::msgcat::mcset pl "Address 2:" "Adres 2:" ::msgcat::mcset pl "Address:" "Adres:" ::msgcat::mcset pl "All files" "Wszystkie pliki" ::msgcat::mcset pl "Avatar" "Awatar" ::msgcat::mcset pl "BBS:" "BBS:" ::msgcat::mcset pl "Birthday" "Urodziny" ::msgcat::mcset pl "Birthday:" "Data urodzin:" ::msgcat::mcset pl "Cell:" "Komórkowy:" ::msgcat::mcset pl "City:" "Miasto:" ::msgcat::mcset pl "Client" "Program" ::msgcat::mcset pl "Client:" "Nazwa:" ::msgcat::mcset pl "Country:" "PaÅ„stwo:" ::msgcat::mcset pl "Day:" "DzieÅ„:" ::msgcat::mcset pl "Description:" "Opis:" ::msgcat::mcset pl "Details" "Szczegóły" ::msgcat::mcset pl "E-mail:" "E-mail:" ::msgcat::mcset pl "Family name:" "Nazwisko:" ::msgcat::mcset pl "Fax:" "Fax:" ::msgcat::mcset pl "Full name:" "PeÅ‚na nazwa:" ::msgcat::mcset pl "Geographical position" "PoÅ‚ożenie geograficzne" ::msgcat::mcset pl "GIF images" "Obrazy GIF" ::msgcat::mcset pl "Home:" "Domowy:" ::msgcat::mcset pl "Image" "Obraz" ::msgcat::mcset pl "Information" "Informacje" ::msgcat::mcset pl "Interval:" "OdstÄ™p czasu:" ::msgcat::mcset pl "ISDN:" "ISDN:" ::msgcat::mcset pl "JPEG images" "Obrazy JPEG" ::msgcat::mcset pl "Last activity" "Ostatnia aktywność" ::msgcat::mcset pl "Last activity or uptime" "Ostatnia aktywność lub czas od\ uruchomienia" ::msgcat::mcset pl "Latitude:" "Szerokość:" ::msgcat::mcset pl "List of users for userinfo." "Lista użytkowników." ::msgcat::mcset pl "Load image" "Åaduj obraz" ::msgcat::mcset pl "Loading photo failed: %s." "Nie udaÅ‚o siÄ™ wczytać\ zdjÄ™cia: %s." ::msgcat::mcset pl "Location" "Miejsce zamieszkania" ::msgcat::mcset pl "Longitude:" "DÅ‚ugość:" ::msgcat::mcset pl "Message recorder:" "Aut. sekretarka:" ::msgcat::mcset pl "Middle name:" "Drugie imiÄ™:" ::msgcat::mcset pl "Modem:" "Modem:" ::msgcat::mcset pl "Month:" "MiesiÄ…c:" ::msgcat::mcset pl "Name" "Dane osobowe" ::msgcat::mcset pl "Name:" "ImiÄ™:" ::msgcat::mcset pl "Name: " "Nazwa:" ::msgcat::mcset pl "Nickname:" "Pseudonim:" ::msgcat::mcset pl "None" "Wyłącz" ::msgcat::mcset pl "Organization" "Organizacja" ::msgcat::mcset pl "OS:" "System:" ::msgcat::mcset pl "Pager:" "Pager:" ::msgcat::mcset pl "PCS:" "PCS:" ::msgcat::mcset pl "Personal" "Osobiste" ::msgcat::mcset pl "Personal " "Osobiste " ::msgcat::mcset pl "Phones" "Telefony" ::msgcat::mcset pl "Photo" "ZdjÄ™cie" ::msgcat::mcset pl "PNG images" "Obrazy PNG" ::msgcat::mcset pl "Postal Code:" "Kod pocztowy:" ::msgcat::mcset pl "Preferred:" "Preferowany:" ::msgcat::mcset pl "Prefix:" "Prefiks:" ::msgcat::mcset pl "Presence is signed" "Status podpisany" ::msgcat::mcset pl "Role:" "Stanowisko:" ::msgcat::mcset pl "Service info" "Wizytówka" ::msgcat::mcset pl "Show" "Pokaż" ::msgcat::mcset pl "Show user or service info" "Pokaż wizytówkÄ™ użytkownika,\ usÅ‚ugi" ::msgcat::mcset pl "State:" "Województwo:" ::msgcat::mcset pl "Suffix:" "Sufiks:" ::msgcat::mcset pl "Telephone numbers" "Numery telefonów" ::msgcat::mcset pl "Time" "Czas" ::msgcat::mcset pl "Time zone:" "Strefa cz.:" ::msgcat::mcset pl "Time:" "Czas:" ::msgcat::mcset pl "Title:" "TytuÅ‚:" ::msgcat::mcset pl "UID:" "UID:" ::msgcat::mcset pl "Unit:" "Jednostka:" ::msgcat::mcset pl "Update" "Aktualizuj" ::msgcat::mcset pl "Uptime" "Ostatnia aktywność/czas dziaÅ‚ania" ::msgcat::mcset pl "URL" "URL" ::msgcat::mcset pl "User info" "Informacje o użytkowniku" ::msgcat::mcset pl "UTC:" "UTC:" ::msgcat::mcset pl "Version" "Wersja" ::msgcat::mcset pl "Version:" "Wersja:" ::msgcat::mcset pl "Video:" "Video:" ::msgcat::mcset pl "Voice:" "Voice:" ::msgcat::mcset pl "Web site:" "Strona domowa:" ::msgcat::mcset pl "Work:" "Praca:" ::msgcat::mcset pl "Year:" "Rok:" # datagathering.tcl ::msgcat::mcset pl "Data form" "Konfiguracja/dane" ::msgcat::mcset pl "Date:" "Data:" ::msgcat::mcset pl "Email:" "Email:" ::msgcat::mcset pl "Error requesting data: %s" "Błąd przy pobieraniu danych:\ %s" ::msgcat::mcset pl "First name:" "ImiÄ™:" ::msgcat::mcset pl "Instructions" "Instrukcje" ::msgcat::mcset pl "Key:" "Klucz:" ::msgcat::mcset pl "Last Name:" "Nazwisko:" ::msgcat::mcset pl "Misc:" "Różne:" ::msgcat::mcset pl "Phone:" "Telefon:" ::msgcat::mcset pl "Text:" "Tekst:" ::msgcat::mcset pl "Zip:" "Kod pocztowy:" # custom.tcl ::msgcat::mcset pl "Customization of the One True Jabber Client." "Ustawienia\ dla Jednynego Prawdziwego Klienta Jabbera." ::msgcat::mcset pl "Customize" "Ustawienia" ::msgcat::mcset pl "Group:" "Grupa:" ::msgcat::mcset pl "Open" "Otwórz" ::msgcat::mcset pl "Parent group" "NadrzÄ™dna grupa" ::msgcat::mcset pl "Parent groups" "NadrzÄ™dne grupy" ::msgcat::mcset pl "Reset to current value" "Przywróć aktualnÄ… wartość" ::msgcat::mcset pl "Reset to default value" "Przywróć domyÅ›lnÄ… wartość" ::msgcat::mcset pl "Reset to saved value" "Przywróć zapisanÄ… wartość" ::msgcat::mcset pl "Reset to value from config file" "Przywróć wartość z\ pliku ustawieÅ„" ::msgcat::mcset pl "Set for current and future sessions" "ZapamiÄ™taj dla\ obecnej i przyszÅ‚ych sesji" ::msgcat::mcset pl "Set for current session only" "ZapamiÄ™taj dla obecnej\ sesji" ::msgcat::mcset pl "State" "Stan" ::msgcat::mcset pl "the option is set and saved." "opcja zostaÅ‚a zmieniona i\ zapamiÄ™tana." ::msgcat::mcset pl "the option is set to its default value." "opcja ma\ wartość domyÅ›lnÄ…." ::msgcat::mcset pl "the option is set, but not saved." "opcja zostaÅ‚a\ zmieniona, ale nie zapamiÄ™tana." ::msgcat::mcset pl "the option is taken from config file." "opcja ma warość z\ pliku ustawieÅ„." ::msgcat::mcset pl "value is changed, but the option is not set." "wartość\ edytowana, ale nie zapamiÄ™tano stanu opcji." # muc.tcl ::msgcat::mcset pl "\n\tAffiliation: %s" "\n\tPrzynależność: %s" ::msgcat::mcset pl "\n\tJID: %s" "\n\tJID: %s" ::msgcat::mcset pl "\nAlternative venue: %s" "\nAlternatywne miejsce: %s" ::msgcat::mcset pl "\nReason: %s" "\nPrzyczyna: %s" ::msgcat::mcset pl " by %s" " przez %s" ::msgcat::mcset pl "%s has been assigned a new affiliation: %s" "%s otrzymaÅ‚\ nowÄ… przynależność: %s" ::msgcat::mcset pl "%s has been assigned a new role: %s" "%s otrzymaÅ‚ nowÄ…\ rolÄ™: %s" ::msgcat::mcset pl "%s has been assigned a new room position: %s/%s" "%s\ otrzymaÅ‚ nowe stanowisko w konferencji: %s/%s" ::msgcat::mcset pl "%s has been banned" "Zablokowano wstÄ™p dla %s" ::msgcat::mcset pl "%s has been kicked" "%s zostaÅ‚ wyrzucony" ::msgcat::mcset pl "%s has been kicked because of membership loss" "%s zostaÅ‚\ wyrzucony z powodu utraty praw czÅ‚onka" ::msgcat::mcset pl "%s has been kicked because room became members-only" "%s\ zostaÅ‚ wyrzucony, ponieważ pokój konferencyjny jest tylko dla\ użytkowników z prawami czÅ‚onka" ::msgcat::mcset pl "%s has entered" "%s dołączyÅ‚ do konferencji" ::msgcat::mcset pl "%s has left" "%s wyszedÅ‚" ::msgcat::mcset pl "%s is now known as %s" "%s nazywa siÄ™ teraz %s" ::msgcat::mcset pl "A new room is created" "Utworzono nowy pokój\ konferencyjny" ::msgcat::mcset pl "Accept default config" "Akceptuj domyÅ›lnÄ… konfiguracjÄ™" ::msgcat::mcset pl "Add" "Dodaj" ::msgcat::mcset pl "Add new item" "Dodaj nowe elementy" ::msgcat::mcset pl "admin" "administrator" ::msgcat::mcset pl "Affiliation" "Przynależność" ::msgcat::mcset pl "All items:" "Wszystkie elementy:" ::msgcat::mcset pl "and" "i" ::msgcat::mcset pl "as %s/%s" "jako %s/%s" ::msgcat::mcset pl "Ban" "ZabroÅ„ wstÄ™pu" ::msgcat::mcset pl "Can't change nickname in MUC incompatible rooms" "Zmiana\ pseudonimu dziaÅ‚a tylko w pokojach kompatybilnych z MUC" ::msgcat::mcset pl "Cancelling configure form" "Anulowanie konfiguracji od" ::msgcat::mcset pl "Conference room %s will be destroyed\ permanently.\n\nProceed?" "Pokój konferencyjny \"%s\" zostanie\ usuniÄ™ty na staÅ‚e.\n\nKontynuować?" ::msgcat::mcset pl "Configure form: %s" "Próba konfiguracji od: %s" ::msgcat::mcset pl "Configure room" "Konfiguracja pokoju" ::msgcat::mcset pl "Destroy room" "Zamknij pokój" ::msgcat::mcset pl "Edit admin list" "Lista administratorów" ::msgcat::mcset pl "Edit ban list" "Lista bez prawa wstÄ™pu" ::msgcat::mcset pl "Edit member list" "Lista czÅ‚onków" ::msgcat::mcset pl "Edit moderator list" "Lista moderatorów" ::msgcat::mcset pl "Edit outcast list" "Edytuj listÄ™ wyrzuconych" ::msgcat::mcset pl "Edit owner list" "Lista wÅ‚aÅ›cicieli" ::msgcat::mcset pl "Edit participant list" "Edytuj listÄ™ uczestników" ::msgcat::mcset pl "Edit visitor list" "Edytuj listÄ™ goÅ›ci" ::msgcat::mcset pl "Edit voice list" "Lista z prawem gÅ‚osu" ::msgcat::mcset pl "Generate groupchat messages when occupant changes his/her\ status and/or status message" "Generuj wiadomoÅ›ci kiedy uczestnik\ konferencji zmienia swój status lub opis statusu" ::msgcat::mcset pl "Generate groupchat messages when occupant changes his/her\ status and/or status message." "Generuj wiadomoÅ›ci w pokoju\ konferencyjnym, kiedy uczestnik zmienia swój status lub opis\ statusu." ::msgcat::mcset pl "Generate groupchat messages when occupant's room position\ (affiliation and/or role) changes." "Generuj wiadomoÅ›ci w pokoju\ konferencyjnym, kiedy uczestnik zmienia swoje stanowisko\ (przynależność lub rolÄ™)." ::msgcat::mcset pl "Generate status messages when occupants enter/exit MUC\ compatible conference rooms." "Generuj wiadomoÅ›ci o statusie\ użytkowników wchodzÄ…cych/wychodzÄ…cych w pokojach konferencyjnych\ zgodnych z MUC." ::msgcat::mcset pl "Grant Admin Privileges" "Przyznaj prawa administratora" ::msgcat::mcset pl "Grant Membership" "Przyznaj prawa czÅ‚onka" ::msgcat::mcset pl "Grant Moderator Privileges" "Przyznaj prawa moderatora" ::msgcat::mcset pl "Grant Owner Privileges" "Przyznaj prawa wÅ‚aÅ›ciciela" ::msgcat::mcset pl "Grant Voice" "Przyznaj prawo gÅ‚osu" ::msgcat::mcset pl "Join conference" "Dołącz do konferencji" ::msgcat::mcset pl "Join groupchat" "Dołącz do konferencji" ::msgcat::mcset pl "Kick" "Wyrzuć" ::msgcat::mcset pl "Maximum number of characters in the history in MUC\ compatible conference rooms." "Maksymalna liczba znaków historii\ pokoi konferencyjnych MUC." ::msgcat::mcset pl "Maximum number of stanzas in the history in MUC\ compatible conference rooms." "Maksymalna liczba zwrotek historii\ pokoi konferencyjnych MUC." ::msgcat::mcset pl "member" "czÅ‚onek" ::msgcat::mcset pl "moderator" "moderator" ::msgcat::mcset pl "MUC" "Polecenia MUC" ::msgcat::mcset pl "Nick" "Pseudonim" ::msgcat::mcset pl "none" "brak" ::msgcat::mcset pl "outcast" "wyrzucony" ::msgcat::mcset pl "owner" "wÅ‚aÅ›ciciel" ::msgcat::mcset pl "participant" "uczestnik" ::msgcat::mcset pl "Propose to configure newly created MUC room. If set to\ false then the default room configuration is automatically accepted."\ "Proponuj konfigurowanie nowo tworzonych pokoi konferencyjnych MUC.\ Jeżeli opcja bÄ™dzie wyłączona, to domyÅ›lna konfiguracja zostanie\ zaakceptowana automatycznie." ::msgcat::mcset pl "Reason" "Powód" ::msgcat::mcset pl "Report the list of current MUC rooms on disco#items\ query." "WysyÅ‚aj listÄ™ aktywnych pokoi MUC przy zapytaniu\ disco#items." ::msgcat::mcset pl "Request only unseen (which aren't displayed in the chat\ window) messages in the history in MUC compatible conference rooms."\ "Pobierz tylko nieprzeczytane (niewidoczne w oknie rozmowy)\ wiadomoÅ›ci historii pokoi konferencyjnych MUC." ::msgcat::mcset pl "Retry to join MUC room with a different nickname (with\ added _ suffix) in case of name conflicts." "Ponów próbÄ™ przyłączenia\ siÄ™ do pokoju MUC z innym pseudonimem (z dodanym przyrostkiem _) w\ przypadku konfliktu nazw." ::msgcat::mcset pl "Retrying with nickname '%s_'" "Próba połączenia z\ pseudonimem '%s_'" ::msgcat::mcset pl "Revoke Admin Privileges" "Odbierz prawa administratora" ::msgcat::mcset pl "Revoke Membership" "Odbierz prawa czÅ‚onka" ::msgcat::mcset pl "Revoke Moderator Privileges" "Odbierz prawa moderatora" ::msgcat::mcset pl "Revoke Owner Privileges" "Odbierz prawa wÅ‚aÅ›ciciela" ::msgcat::mcset pl "Revoke Voice" "Odbierz prawo gÅ‚osu" ::msgcat::mcset pl "Role" "Rola" ::msgcat::mcset pl "Room %s is successfully created" "Pokój %s zostaÅ‚\ pomyÅ›lnie utworzony" ::msgcat::mcset pl "Room is created" "Pokój zostaÅ‚ utworzony" ::msgcat::mcset pl "Room is destroyed" "Pokój zostaÅ‚ zamkniÄ™ty" ::msgcat::mcset pl "Sending %s %s list" "WysyÅ‚anie listy %s %s" ::msgcat::mcset pl "Sending configure form" "WysyÅ‚anie formularza\ konfiguracji" ::msgcat::mcset pl "Update item" "Aktualizuj element" ::msgcat::mcset pl "User already %s" "Użytkownik już %s" ::msgcat::mcset pl "User is unbanned" "Użytkownik jest odblokowany" ::msgcat::mcset pl "visitor" "gość" ::msgcat::mcset pl "Whois" "Kim jest" ::msgcat::mcset pl "whois '%s': %s" "whois '%s': %s" ::msgcat::mcset pl "whois '%s': no info" "whois '%s': brak informacji" ::msgcat::mcset pl "You must join the room to set %s" "Należy dołączyć do\ pokoju aby ustawic %s" # itemedit.tcl ::msgcat::mcset pl "<- Remove" "<- UsuÅ„" ::msgcat::mcset pl "Add ->" "Dodaj ->" ::msgcat::mcset pl "Available groups" "DostÄ™pne grupy" ::msgcat::mcset pl "Current groups" "Aktualnie przypisane" ::msgcat::mcset pl "Edit groups for %s" "ZmieÅ„ grupy dla %s" ::msgcat::mcset pl "Edit nickname for %s" "ZmieÅ„ nazwÄ™ dla %s" ::msgcat::mcset pl "Edit properties for %s" "Edycja wÅ‚aÅ›ciwoÅ›ci dla %s" # plugins/general/stats.tcl ::msgcat::mcset pl "Name " "Nazwa " ::msgcat::mcset pl "Node" "WÄ™zeÅ‚" ::msgcat::mcset pl "Open statistics monitor" "Otwórz monitor statystyki" ::msgcat::mcset pl "Request" "Pobierz" ::msgcat::mcset pl "Service statistics" "Statystyka usÅ‚ugi" ::msgcat::mcset pl "Set" "Ustaw" ::msgcat::mcset pl "Statistics" "Statystyka" ::msgcat::mcset pl "Statistics monitor" "Monitor statystyki" ::msgcat::mcset pl "Timer" "Timer" ::msgcat::mcset pl "Units" "Jednostka" ::msgcat::mcset pl "Value" "Wartość" # messages.tcl ::msgcat::mcset pl "\nReason is: %s" "\nPrzyczyna: %s" ::msgcat::mcset pl "%s Headlines" "%s Nagłówki" ::msgcat::mcset pl "%s invites you to conference room %s" "%s zaprasza CiÄ™ do\ konferencji w pokoju %s" ::msgcat::mcset pl "Approve subscription" "Zaakceptuj proÅ›bÄ™ o subskrypcjÄ™" ::msgcat::mcset pl "Attached URL:" "Załączone odnoÅ›niki:" ::msgcat::mcset pl "Attached user:" "Załączony kontakt:" ::msgcat::mcset pl "Cache headlines on exit and restore on start." "Zapisuj\ nagłówki przy zamykaniu programu i przywracaj przy starcie." ::msgcat::mcset pl "Chat" "Rozmowa" ::msgcat::mcset pl "Copy headline to clipboard" "Kopiuj nagłówek do schowka" ::msgcat::mcset pl "Copy URL to clipboard" "Kopiuj URL do schowka" ::msgcat::mcset pl "Decline subscription" "Odrzuć proÅ›bÄ™ o subskrypcjÄ™" ::msgcat::mcset pl "Delete" "UsuÅ„" ::msgcat::mcset pl "Delete all" "UsuÅ„ wszystkie" ::msgcat::mcset pl "Delete seen" "UsuÅ„ przeczytane" ::msgcat::mcset pl "Display headlines in single/multiple windows." "Pokazuj\ nagłówki w jednym/wielu oknach." ::msgcat::mcset pl "Do not display headline descriptions as tree nodes." "Nie\ pokazuj opisów nagłówków jako elementów drzewka (pokazuj tylko\ tytuÅ‚)." ::msgcat::mcset pl "Extras from %s" "%s" ::msgcat::mcset pl "Extras from:" "Wiadomość od:" ::msgcat::mcset pl "Forward headline" "Przekaż nagłówek" ::msgcat::mcset pl "Forward to %s" "Przekaż do %s" ::msgcat::mcset pl "Forward..." "Przekaż..." ::msgcat::mcset pl "From: " "Od: " ::msgcat::mcset pl "Grant subscription" "WyÅ›lij subskrypcjÄ™" ::msgcat::mcset pl "Group: " "Grupa: " ::msgcat::mcset pl "Headlines" "Nagłówki" ::msgcat::mcset pl "I would like to add you to my roster." "Witam! ChcÄ™ dodać\ CiÄ™ do mojej listy kontaktów." ::msgcat::mcset pl "Invited to:" "Zaproszony do:" ::msgcat::mcset pl "List of JIDs to whom headlines have been sent." "Lista\ odbiorców do których przesÅ‚ano nagłówki." ::msgcat::mcset pl "List of message destination JIDs." "Lista odbiorców\ wiadomoÅ›ci" ::msgcat::mcset pl "Mark all seen" "Oznacz wszystkie jako przeczytane" ::msgcat::mcset pl "Mark all unseen" "Oznacz wszystkie jako nieprzeczytane" ::msgcat::mcset pl "Message and Headline options." "Ustawienia wiadomoÅ›ci i\ nagłówków." ::msgcat::mcset pl "Message body" "Treść wiadomoÅ›ci" ::msgcat::mcset pl "Message from:" "Wiadomość od:" ::msgcat::mcset pl "One window per bare JID" "Jedno okno na JID" ::msgcat::mcset pl "One window per full JID" "Jedno okno na JID/zasób" ::msgcat::mcset pl "Quote" "Cytuj" ::msgcat::mcset pl "Received by:" "Otrzymana przez:" ::msgcat::mcset pl "Reply" "Odpowiedz" ::msgcat::mcset pl "Reply subject:" "Temat odpowiedzi:" ::msgcat::mcset pl "Request subscription" "PoproÅ› o subskrypcjÄ™" ::msgcat::mcset pl "Request unsubscription" "PoproÅ› o usuniÄ™cie subskrypcji" ::msgcat::mcset pl "Revoke subscription" "Wycofaj subskrypcjÄ™" ::msgcat::mcset pl "Send message" "WyÅ›lij wiadomość" ::msgcat::mcset pl "Send message to %s" "%s" ::msgcat::mcset pl "Send message to group" "WyÅ›lij wiadomość do grupy" ::msgcat::mcset pl "Send message to group %s" "WyÅ›lij wiadomość do grupy %s" ::msgcat::mcset pl "Send request to: " "WyÅ›lij proÅ›bÄ™ do: " ::msgcat::mcset pl "Send subscription request" "WyÅ›lij proÅ›bÄ™ o subskrypcjÄ™" ::msgcat::mcset pl "Send subscription request to %s" "WyÅ›lij proÅ›bÄ™ o\ subskrypcjÄ™ do %s" ::msgcat::mcset pl "Send subscription to: " "ProÅ›ba o subskrypcjÄ™ do: " ::msgcat::mcset pl "Single window" "Jedno okno" ::msgcat::mcset pl "Subject: " "Temat: " ::msgcat::mcset pl "Subscribe" "Subskrybuj" ::msgcat::mcset pl "Subscription request from %s" "ProÅ›ba o subskrypcjÄ™ od\ %s" ::msgcat::mcset pl "Subscription request from:" "ProÅ›ba o subskrypcjÄ™ od:" ::msgcat::mcset pl "To: " "Do: " ::msgcat::mcset pl "Toggle encryption" "GPG - włącz szyfrowanie wiadomoÅ›ci" ::msgcat::mcset pl "Toggle seen" "Zazanacz/Odznacz jako przeczytany" ::msgcat::mcset pl "Toggle signing" "GPG - włącz podpisywanie wiadomoÅ›ci" # iface.tcl ::msgcat::mcset pl "%s SSL Certificate Info" "Informacje o certyfikacie SSL z\ %s" ::msgcat::mcset pl "About" "O programie" ::msgcat::mcset pl "Add new user..." "Dodaj nowy kontakt..." ::msgcat::mcset pl "Admin tools" "NarzÄ™dzia administracyjne" ::msgcat::mcset pl "Allow downloading" "Pozwól na Å›ciÄ…ganie" ::msgcat::mcset pl "Announce" "Włącz" ::msgcat::mcset pl "Authors:" "Autorzy:" ::msgcat::mcset pl "Begin date" "Data wydania" ::msgcat::mcset pl "Browser" "PrzeglÄ…darka usÅ‚ug" ::msgcat::mcset pl "Change password..." "ZmieÅ„ hasÅ‚o..." ::msgcat::mcset pl "Change priority..." "ZmieÅ„ priorytet..." ::msgcat::mcset pl "Chats" "Rozmowy i konferencje" ::msgcat::mcset pl "Chats:" "Rozmowy i konferecje:" ::msgcat::mcset pl "Cipher" "Algorytm szyfru" ::msgcat::mcset pl "Close all tabs" "Zamknij wszystkie karty" ::msgcat::mcset pl "Close other tabs" "Zamknij pozostaÅ‚e karty" ::msgcat::mcset pl "Delay between getting focus and updating window or tab\ title in milliseconds." "Opóźnienie w milisekundach pomiÄ™dzy\ otrzymaniem fokusu a odÅ›wieżeniem tytuÅ‚u okna lub karty." ::msgcat::mcset pl "Delete message of the day" "UsuÅ„ MOTD" ::msgcat::mcset pl "Disabled\n" "Wyłączony\n" ::msgcat::mcset pl "Disconnected" "Rozłączony" ::msgcat::mcset pl "Discovery" "Informacje Discovery" ::msgcat::mcset pl "Edit my info..." "Edytuj wÅ‚asnÄ… wizytówkÄ™..." ::msgcat::mcset pl "Emphasize" "WyÅ›wietl formatowanie dla słów pomiÄ™dzy * / i\ _" ::msgcat::mcset pl "Enabled\n" "Włączony\n" ::msgcat::mcset pl "Expiry date" "Data ważnoÅ›ci" ::msgcat::mcset pl "Extended away" "Nieobecny" ::msgcat::mcset pl "Generate enter/exit messages" "Generuj wiadomoÅ›ci przy\ wejÅ›ciu/wyjÅ›ciu" ::msgcat::mcset pl "Help" "Pomoc" ::msgcat::mcset pl "Issuer" "Wydawca" ::msgcat::mcset pl "Join group..." "Dołącz do konferencji..." ::msgcat::mcset pl "Log in..." "Zaloguj..." ::msgcat::mcset pl "Log out with reason..." "Wyloguj z opisem..." ::msgcat::mcset pl "Message archive" "Archiwum wiadomoÅ›ci" ::msgcat::mcset pl "Options for main interface." "Ustawienia wyglÄ…du i\ zachowania aplikacji." ::msgcat::mcset pl "Presence" "Status" ::msgcat::mcset pl "Quick Help" "Szybka Pomoc" ::msgcat::mcset pl "Quick help" "Szybka Pomoc" ::msgcat::mcset pl "Quit" "ZakoÅ„cz" ::msgcat::mcset pl "Raise new tab." "Otwieraj nowe karty na wierzchu." ::msgcat::mcset pl "Send broadcast message..." "WyÅ›lij wiadomość do\ wszystkich..." ::msgcat::mcset pl "Send message of the day..." "Ustaw Wiadomość Dnia\ (MOTD)..." ::msgcat::mcset pl "Send to server" "WyÅ›lij na serwer" ::msgcat::mcset pl "Serial number" "Numer seryjny" ::msgcat::mcset pl "Service Discovery" "PrzeglÄ…darka usÅ‚ug (protokół\ Discovery)" ::msgcat::mcset pl "Session key bits" "Liczba bitów klucza sesji" ::msgcat::mcset pl "SHA1 hash" "Skrót SHA1" ::msgcat::mcset pl "Show number of unread messages in tab titles." "Pokaż\ ilość nieprzeczytanych wiadomoÅ›ci w tytuÅ‚ach kart." ::msgcat::mcset pl "Show Toolbar." "Pokaż pasek przycisków." ::msgcat::mcset pl "Show user or service info..." "Pokaż wizytówkÄ™\ użytkownika, usÅ‚ugi..." ::msgcat::mcset pl "Smart autoscroll" "Inteligentne autoprzewijanie" ::msgcat::mcset pl "Sound" "DźwiÄ™ki" ::msgcat::mcset pl "SSL Info" "Informacje o SSL" ::msgcat::mcset pl "Stop autoscroll" "Zatrzymaj autoprzewijanie" ::msgcat::mcset pl "Tabs:" "Karty:" ::msgcat::mcset pl "Toggle encryption (when possible)" "GPG - Włącz\ szyfrowanie rozmów (kiedy możliwe)" ::msgcat::mcset pl "Toggle showing offline users" "Pokaż/Ukryj rozłączonych" ::msgcat::mcset pl "Update message of the day..." "Aktualizuj MOTD..." ::msgcat::mcset pl "Use Tabbed Interface (you need to restart)." "Włącz\ interfejs z kartami w jednym oknie (wymagany restart)." # plugins/chat/info_commands.tcl ::msgcat::mcset pl "Address 2" "Adres 2" ::msgcat::mcset pl "City" "Miasto" ::msgcat::mcset pl "Country" "PaÅ„stwo" ::msgcat::mcset pl "Display %s in chat window when using /vcard command."\ "Pokaż pole \"%s\" w oknie rozmowy po wykonaniu polecenia /vcard." ::msgcat::mcset pl "E-mail" "E-mail" ::msgcat::mcset pl "Family name" "Nazwisko" ::msgcat::mcset pl "Full name" "PeÅ‚na nazwa" ::msgcat::mcset pl "JID" "JID" ::msgcat::mcset pl "last %s%s:" "ostatnio aktywny %s%s:" ::msgcat::mcset pl "last %s%s: %s" "ostatnio aktywny %s%s: %s" ::msgcat::mcset pl "Latitude" "Szerokość geograficzna" ::msgcat::mcset pl "Longitude" "DÅ‚ugość geograficzna" ::msgcat::mcset pl "Middle name" "Drugie imiÄ™" ::msgcat::mcset pl "Nickname" "Pseudonim" ::msgcat::mcset pl "Organization name" "Ogranizacja" ::msgcat::mcset pl "Organization unit" "Jednostka" ::msgcat::mcset pl "Phone BBS" "Telefon BBS" ::msgcat::mcset pl "Phone cell" "Telefon komórkowy" ::msgcat::mcset pl "Phone fax" "Fax" ::msgcat::mcset pl "Phone home" "Telefon domowy" ::msgcat::mcset pl "Phone ISDN" "ISDN" ::msgcat::mcset pl "Phone message recorder" "Automatyczna sekretarka" ::msgcat::mcset pl "Phone modem" "Modem" ::msgcat::mcset pl "Phone pager" "Pager" ::msgcat::mcset pl "Phone PCS" "Telefon PCS" ::msgcat::mcset pl "Phone preferred" "Telefon preferowany" ::msgcat::mcset pl "Phone video" "Videotelefon" ::msgcat::mcset pl "Phone voice" "Poczta gÅ‚osowa" ::msgcat::mcset pl "Phone work" "Telefon w pracy" ::msgcat::mcset pl "Postal code" "Kod pocztowy" ::msgcat::mcset pl "Prefix" "Prefiks" ::msgcat::mcset pl "State " "Województwo " ::msgcat::mcset pl "Suffix" "Sufiks" ::msgcat::mcset pl "time %s%s:" "czas dla %s%s:" ::msgcat::mcset pl "time %s%s: %s" "czas dla %s%s: %s" ::msgcat::mcset pl "Time Zone:" "Strefa cz.:" ::msgcat::mcset pl "Title" "TytuÅ‚" ::msgcat::mcset pl "UID" "UID" ::msgcat::mcset pl "vcard %s%s:" "wizytówka dla %s%s:" ::msgcat::mcset pl "vcard %s%s: %s" "wizytówka dla %s%s: %s" ::msgcat::mcset pl "vCard display options in chat windows." "Ustawienia\ wyÅ›wietlania elementów wizytówki w oknach rozmów." ::msgcat::mcset pl "version %s%s:" "wersja klienta %s%s:" ::msgcat::mcset pl "version %s%s: %s" "wersja klienta %s%s: %s" ::msgcat::mcset pl "Web site" "Strona domowa" # plugins/chat/logger.tcl ::msgcat::mcset pl "All" "Wszystkie" ::msgcat::mcset pl "April" "KwiecieÅ„" ::msgcat::mcset pl "August" "SierpieÅ„" ::msgcat::mcset pl "Chats history is converted.\nBackup of the old history is\ stored in %s" "Historia rozmów zostaÅ‚a przekonwertowana.\nKopia\ zapasowa starej historii zostaÅ‚a zapisana w %s" ::msgcat::mcset pl "Conversion is finished" "Konwersja zakoÅ„czona" ::msgcat::mcset pl "Converting Log Files" "Konwersja plików historii" ::msgcat::mcset pl "December" "GrudzieÅ„" ::msgcat::mcset pl "Directory to store logs." "Katalog przechowywania plików\ historii." ::msgcat::mcset pl "Export to XHTML" "Zapisz jako XHTML" ::msgcat::mcset pl "February" "Luty" ::msgcat::mcset pl "File %s cannot be opened: %s. History for %s (%s) is NOT\ converted\n" "Nie można otworzyć pliku %s: %s. Historia dla %s (%s)\ NIE jest przekonwertowana\n" ::msgcat::mcset pl "File %s cannot be opened: %s. History for %s is NOT\ converted\n" "Nie można otworzyć pliku %s: %s. Historia dla %s NIE\ jest przekonwertowana\n" ::msgcat::mcset pl "File %s is corrupt. History for %s (%s) is NOT\ converted\n" "Plik %s jest uszkodzony. Historia dla %s (%s) NIE\ zostaÅ‚a przekonwertowana\n" ::msgcat::mcset pl "File %s is corrupt. History for %s is NOT converted\n"\ "Plik %s jest uszkodzony. Historia dla %s NIE zostaÅ‚a\ przekonwertowana\n" ::msgcat::mcset pl "History for %s" "Historia dla %s" ::msgcat::mcset pl "January" "StyczeÅ„" ::msgcat::mcset pl "July" "Lipiec" ::msgcat::mcset pl "June" "Czerwiec" ::msgcat::mcset pl "Logging options." "Ustawienia historii rozmów." ::msgcat::mcset pl "March" "Marzec" ::msgcat::mcset pl "May" "Maj" ::msgcat::mcset pl "November" "Listopad" ::msgcat::mcset pl "October" "Październik" ::msgcat::mcset pl "Please, be patient while chats history is being converted\ to new format" "ProszÄ™ czekać, historia rozmów jest konwertowana do\ nowego formatu" ::msgcat::mcset pl "Search down" "Szukaj w dół" ::msgcat::mcset pl "Search up" "Szukaj w górÄ™" ::msgcat::mcset pl "Select month:" "Wybierz miesiÄ…c: " ::msgcat::mcset pl "September" "WrzesieÅ„" ::msgcat::mcset pl "Store group chats logs." "Zapisuj historiÄ™ rozmów w\ pokojach konferencyjnych." ::msgcat::mcset pl "Store private chats logs." "Zapisuj historiÄ™ prywatnych\ rozmów." ::msgcat::mcset pl "You're using root directory %s for storing Tkabber\ logs!\n\nI refuse to convert logs database." "Używasz katalogu\ głównego %s do przechowywania plików historii Tkabbera!\n\nW tym\ przypadku nie zostanie przeprowadzona konwersja historii." # plugins/chat/nick_colors.tcl ::msgcat::mcset pl "Color message bodies in chat windows." "Koloruj treść\ wiadomoÅ›ci w oknach rozmów." ::msgcat::mcset pl "Edit %s color" "Edycja koloru dla %s" ::msgcat::mcset pl "Edit chat user colors" "Przypisywanie kolorów" ::msgcat::mcset pl "Edit nick color..." "Edycja koloru..." ::msgcat::mcset pl "Edit nick colors..." "Przypisz kolory użytkownikom..." ::msgcat::mcset pl "Use colored messages" "Koloruj treść wiadomoÅ›ci w oknie\ rozmowy" ::msgcat::mcset pl "Use colored nicks" "Koloruj pseudonimy w oknie rozmowy" ::msgcat::mcset pl "Use colored nicks in chat windows." "Koloruj pseudonimy w\ oknach rozmów." ::msgcat::mcset pl "Use colored nicks in groupchat rosters." "Koloruj\ pseudonimy listy uczestników konferencji." ::msgcat::mcset pl "Use colored roster nicks" "Koloruj pseudonimy listy\ kontaktów" # plugins/chat/complete_last_nick.tcl ::msgcat::mcset pl "Number of groupchat messages to expire nick completion\ according to the last personally addressed message." "Ilość\ wiadomoÅ›ci, po których wygasa uzupeÅ‚nianie pseudonimu zgodnie z\ ostatniÄ… nadanÄ… do tej osoby wiadomoÅ›ciÄ…." # plugins/chat/highlight.tcl ::msgcat::mcset pl "Enable highlighting plugin." "Włącz kolorowanie." ::msgcat::mcset pl "Groupchat message highlighting plugin options."\ "Ustawienia wyÅ›wietlania wiadomoÅ›ci w pokojach konferencyjnych." ::msgcat::mcset pl "Highlight current nickname in messages." "Koloruj\ aktualny pseudonim w wiadomoÅ›ciach." ::msgcat::mcset pl "Highlight only whole words in messages." "Koloruj tylko\ caÅ‚e wyrazy w wiadomoÅ›ciach." ::msgcat::mcset pl "Substrings to highlight in messages." "Koloruj wybrane\ fragmenty wiadomoÅ›ci." # plugins/chat/bookmark_highlighted.tcl ::msgcat::mcset pl "Next highlighted" "NastÄ™pne zaznaczenie" ::msgcat::mcset pl "Prev highlighted" "Poprzednie zaznaczenie" # plugins/chat/popupmenu.tcl ::msgcat::mcset pl "Clear bookmarks" "UsuÅ„ zakÅ‚adki" ::msgcat::mcset pl "Copy selection to clipboard" "Kopiuj do schowka" ::msgcat::mcset pl "Google selection" "Znajdź w Google" ::msgcat::mcset pl "Next bookmark" "NastÄ™pna zakÅ‚adka" ::msgcat::mcset pl "Prev bookmark" "Poprzednia zakÅ‚adka" ::msgcat::mcset pl "Set bookmark" "Dodaj do zakÅ‚adek" # sound.tcl ::msgcat::mcset pl "External program, which is to be executed to play sound.\ If empty, Snack library is used (if available) to play sound."\ "ZewnÄ™trzny program do odtwarzania dźwiÄ™ków. Jeżeli puste, do\ odtwarzania używana jest biblioteka Snack (instalowana oddzielnie)." ::msgcat::mcset pl "Mute sound if Tkabber window is focused." "Wyłącz dźwiÄ™k\ jeżeli okno Tkabbera jest aktywne." ::msgcat::mcset pl "Mute sound notification." "Nie odtwarzaj dźwiÄ™ków." ::msgcat::mcset pl "Mute sound when displaying delayed groupchat messages."\ "Wyłącz dźwiÄ™ki dla wiadomoÅ›ci wyÅ›wietlanych z opóźnieniem w pokojach\ konferencyjnych." ::msgcat::mcset pl "Mute sound when displaying delayed personal chat\ messages." "Wyłącz dźwiÄ™ki dla prywatnych wiadomoÅ›ci wyÅ›wietlanych z\ opóźnieniem." ::msgcat::mcset pl "Notify only when available" "Powiadamiaj tylko gdy mam\ status DostÄ™pny" ::msgcat::mcset pl "Options for external play program" "Parametry dla\ zewnÄ™trznego programu odtwarzajÄ…cego dźwiÄ™k" ::msgcat::mcset pl "Sound options." "Ustawienia dźwiÄ™ków aplikacji." ::msgcat::mcset pl "Sound to play when available presence is received."\ "DźwiÄ™k odtwarzany kiedy kontakt staje siÄ™ dostÄ™pny." ::msgcat::mcset pl "Sound to play when connected to Jabber server." "DźwiÄ™k\ odtwarzany po nawiÄ…zaniu połączenia z serwerem." ::msgcat::mcset pl "Sound to play when disconnected from Jabber server."\ "DźwiÄ™k odtwarzany po rozłączeniu siÄ™ z serwerem." ::msgcat::mcset pl "Sound to play when groupchat message from me is\ received." "DźwiÄ™k odtwarzany po otrzymaniu wiadomoÅ›ci ode mnie w\ pokoju konferencyjnym." ::msgcat::mcset pl "Sound to play when groupchat message is received."\ "DźwiÄ™k odtwarzany po otrzymaniu wiadomoÅ›ci w pokoju konferencyjnym." ::msgcat::mcset pl "Sound to play when groupchat server message is received."\ "DźwiÄ™k odtwarzany po otrzymaniu wiadomoÅ›ci systemowej." ::msgcat::mcset pl "Sound to play when highlighted (usually addressed\ personally) groupchat message is received." "DźwiÄ™k odtwarzany po\ otrzymaniu wiadomoÅ›ci z wyróżnionym fragmentem (ustawiane oddzielnie)\ w pokoju konferencyjnym." ::msgcat::mcset pl "Sound to play when personal chat message is received."\ "DźwiÄ™k odtwarzany po otrzymaniu wiadomoÅ›ci." ::msgcat::mcset pl "Sound to play when sending personal chat message."\ "DźwiÄ™k odtwarzany przy wysyÅ‚aniu wiadomoÅ›ci." ::msgcat::mcset pl "Sound to play when unavailable presence is received."\ "DźwiÄ™k odtwarzany kiedy kontakt rozłącza siÄ™." ::msgcat::mcset pl "Time interval before playing next sound (in\ milliseconds)." "OdstÄ™p czasu przed odtworzeniem nastÄ™pnego dźwiÄ™ku\ (w milisekundach)." ::msgcat::mcset pl "Use sound notification only when being available." "Włącz\ powiadomienia dźwiÄ™kowe tylko przy statusie DostÄ™pny." # joingrdialog.tcl ::msgcat::mcset pl "Connection:" "Połączenie:" ::msgcat::mcset pl "Join" "Dołącz" ::msgcat::mcset pl "Join group" "Dołącz do konferencji" ::msgcat::mcset pl "Join group dialog data (groups)." "Dołącz do konferencji\ (pokoje)." ::msgcat::mcset pl "Join group dialog data (nicks)." "Dołącz do konferencji\ (pseudonimy)." ::msgcat::mcset pl "Join group dialog data (servers)." "Dołącz do konferencji\ (serwery)." ::msgcat::mcset pl "Nick:" "Pseudonim:" # filters.tcl ::msgcat::mcset pl "Action" "Akcja" ::msgcat::mcset pl "Edit" "Edytuj" ::msgcat::mcset pl "Move down" "Na dół" ::msgcat::mcset pl "Move up" "Do góry" # plugins/general/rawxml.tcl ::msgcat::mcset pl "Available presence" "Status DostÄ™pny" ::msgcat::mcset pl "Chat message" "Rozmowa" ::msgcat::mcset pl "Clear" "Wyczyść" ::msgcat::mcset pl "Create node" "Utwórz wÄ™zęł" ::msgcat::mcset pl "Generic IQ" "Ogólne zapytania IQ" ::msgcat::mcset pl "Get items" "Pobierz elementy" ::msgcat::mcset pl "Headline message" "Nagłówek" ::msgcat::mcset pl "Indentation for pretty-printed XML subtags." "Rozmiar\ wcięć dla formatowanych znaczników XML." ::msgcat::mcset pl "Normal message" "ZwykÅ‚a wiadomość" ::msgcat::mcset pl "Not connected" "Rozłączony" ::msgcat::mcset pl "Open raw XML window" "Otwórz konsolÄ™ XML" ::msgcat::mcset pl "Options for Raw XML Input module, which allows you to\ monitor incoming/outgoing traffic from connection to server and send\ custom XML stanzas." "Ustawienia moduÅ‚u Konsoli XML, który umożliwia\ monitorowanie wchodzÄ…cego/wychodzÄ…cego ruchu pomiÄ™dzy klientem a\ serwerm, oraz wysyÅ‚anie wÅ‚asnych komunikatów." ::msgcat::mcset pl "Pretty print incoming and outgoing XML stanzas."\ "Formatuj i koloruj znaczniki przychodzÄ…cego/wychodzÄ…cego strumienia\ XML." ::msgcat::mcset pl "Pretty print XML" "Formatuj/koloruj znaczniki XML" ::msgcat::mcset pl "Pub/sub" "Pub/sub" ::msgcat::mcset pl "Publish node" "Publikuj wÄ™zęł" ::msgcat::mcset pl "Raw XML" "Konsola XML" ::msgcat::mcset pl "Retract node" "Wycofaj wÄ™zęł" ::msgcat::mcset pl "Show all connections" "Pokaż dla wszystkich połączeÅ„" ::msgcat::mcset pl "Show stanzas for all (current and past) connections in\ Raw XML window." "Pokaż zwrotki XML dla wszystkich (obecnych i\ przeszÅ‚ych) połączeÅ„ w oknie konsoli XML." ::msgcat::mcset pl "Subscribe to a node" "Subskrybuj wÄ™zęł" ::msgcat::mcset pl "Templates" "Wzorce" ::msgcat::mcset pl "Unavailable presence" "Status NiedostÄ™pny" ::msgcat::mcset pl "Unsubscribe from a node" "Anuluj subskrypcjÄ™ wÄ™zÅ‚a" # disco.tcl ::msgcat::mcset pl "Clear window" "Wyczyść okno" ::msgcat::mcset pl "Delete current node and subnodes" "UsuÅ„ zanaczony wÄ™zeÅ‚ i\ podwÄ™zÅ‚y" ::msgcat::mcset pl "Delete subnodes" "UsuÅ„ podwÄ™zÅ‚y" ::msgcat::mcset pl "Error getting info: %s" "Błąd przy pobieraniu informacji:\ %s" ::msgcat::mcset pl "Error getting items: %s" "Błąd przy pobieraniu elementów:\ %s" ::msgcat::mcset pl "Error negotiate: %s" "Błąd negocjacji: %s" ::msgcat::mcset pl "Illegal value \"%s\" for option \"%s\", boolean expected"\ "NieprawidÅ‚owa wartość \"%s\" dla opcji \"%s\", oczekiwano wartoÅ›ci\ typu boolean" ::msgcat::mcset pl "List of discovered JID nodes." "Lista elementów." ::msgcat::mcset pl "List of discovered JIDs." "Lista JID-ów." ::msgcat::mcset pl "Node:" "WÄ™zeÅ‚:" ::msgcat::mcset pl "Sort items by JID/node" "Sortuj wedÅ‚ug JID/wÄ™zÅ‚a" ::msgcat::mcset pl "Sort items by name" "Sortuj wedÅ‚ug nazwy" # avatars.tcl ::msgcat::mcset pl "No avatar to store" "Brak awatara do wysÅ‚ania" # plugins/jidlink/ibb.tcl ::msgcat::mcset pl "Opening IBB connection" "Otwieranie połącznia IBB" # plugins/general/conferenceinfo.tcl ::msgcat::mcset pl "\n\tCan't browse: %s" "\n\tNie można przeglÄ…dać: %s" ::msgcat::mcset pl "\nRoom is empty at %s" "\nPokój jest pusty o godz. %s" ::msgcat::mcset pl "\nRoom participants at %s:" "\nUczestnicy konferencji o\ godz. %s:" ::msgcat::mcset pl "Interval (in minutes) after error reply on request of\ participants list." "OdstÄ™p czasu (w minutach) po otrzymaniu\ komunikatu błędu przy sprawdzaniu listy uczestników." ::msgcat::mcset pl "Interval (in minutes) between requests of participants\ list." "OdstÄ™p czasu (w minutach) przy sprawdzaniu listy\ uczestników." ::msgcat::mcset pl "Options for Conference Info module, that allows you to\ see list of participants in roster popup, regardless of whether you\ are currently joined with the conference." "Ustawienia moduÅ‚u, który\ pozwala oglÄ…dać listÄ™ uczestników konferencji umieszczonych na liÅ›cie\ kontaktów, niezależnie od tego czy aktualnie bierzemy w niej udziaÅ‚." ::msgcat::mcset pl "Periodically browse roster conferences" "Okresowo\ przeglÄ…daj konferencje z listy kontaktów" ::msgcat::mcset pl "Use this module" "Włącz ten moduÅ‚" # plugins/roster/conferences.tcl ::msgcat::mcset pl "Add Conference to Roster" "Dodaj konferencjÄ™ do listy\ kontaktów" ::msgcat::mcset pl "Automatically join conference upon connect"\ "Automatycznie dołącz do konferencji po połączeniu" ::msgcat::mcset pl "Conference:" "Konferencja:" ::msgcat::mcset pl "Conferences" "Konferencje" ::msgcat::mcset pl "Default group for conferences in roster." "DomyÅ›lna grupa\ dla konferencji na liÅ›cie kontaktów." ::msgcat::mcset pl "Ignore autojoin option and do not automatically join\ conference rooms on login." "Ignoruj opcjÄ™ autodołączania oraz nie\ dołączaj automatycznie do konferencji po zalogowaniu." ::msgcat::mcset pl "Roster group:" "Grupa na liÅ›cie:" ::msgcat::mcset pl "Storing conferences failed: %s" "Zapisanie konferencji\ nie powiodÅ‚o siÄ™: %s" # plugins/general/presenceinfo.tcl ::msgcat::mcset pl "\n\tPresence is signed:" "\n\tStatus podpisano:" # plugins/general/subscribe_gateway.tcl ::msgcat::mcset pl "Convert" "Konwertuj" ::msgcat::mcset pl "Convert screenname" "Konwertuj identyfikator" ::msgcat::mcset pl "Enter screenname of contact you want to add" "Wprowadź\ identyfikator kontaktu, który chcesz dodać" ::msgcat::mcset pl "Error while converting screenname: %s." "Błąd podczas\ konwersji identyfikatora: %s." ::msgcat::mcset pl "Screenname conversion" "Konwersja identyfikatora" ::msgcat::mcset pl "Screenname:" "Identyfikator:" ::msgcat::mcset pl "Screenname: %s\n\nConverted JID: %s" "Identyfikator:\ %s\n\nJID po konwersji: %s" ::msgcat::mcset pl "Send subscription at %s" "WyÅ›lij subskrypcjÄ™ do %s" # iq.tcl ::msgcat::mcset pl "%s request from %s" "Zapytanie %s od %s" ::msgcat::mcset pl "Info/Query options." "Ustawienia Informacji/ZapytaÅ„." ::msgcat::mcset pl "Show IQ requests in the status line." "Pokazuj zapytania\ IQ na pasku statusu." ::msgcat::mcset pl "Strip leading \"http://jabber.org/protocol/\" from IQ\ namespaces in the status line." "Usuwaj fragment\ \"http://jabber.org/protocol/\" z przestrzeni nazw IQ pokazywanych na\ pasku statusu." # plugins/iq/last.tcl ::msgcat::mcset pl "Reply to idle time (jabber:iq:last) requests."\ "Odpowiadaj na zapytania o ostatniÄ… aktywność/czas dziaÅ‚ania\ (jabber:iq:last)." # plugins/iq/version.tcl ::msgcat::mcset pl "Include operating system info into a reply to version\ (jabber:iq:version) requests." "Dodaj informacjÄ™ o systemie\ operacyjnym do zapytaÅ„ o wersjÄ™ klienta (jabber:iq:version)." ::msgcat::mcset pl "Reply to version (jabber:iq:version) requests."\ "Odpowiadaj na zapytania o wersjÄ™ klienta (jabber:iq:version)." # plugins/iq/time.tcl ::msgcat::mcset pl "Reply to current time (jabber:iq:time) requests."\ "Odpowiadaj na zapytania o aktualny czas (jabber:iq:time)." # splash.tcl ::msgcat::mcset pl "%s plugin" "wtyczka %s" ::msgcat::mcset pl "auto-away" "autostatus" ::msgcat::mcset pl "avatars" "awatary" ::msgcat::mcset pl "balloon help" "dymki pomocy" ::msgcat::mcset pl "browsing" "przeglÄ…danie" ::msgcat::mcset pl "bwidget workarounds" "dodatki do bwidget" ::msgcat::mcset pl "configuration" "konfiguracja" ::msgcat::mcset pl "connections" "połączenia" ::msgcat::mcset pl "cryptographics" "kryptografia" ::msgcat::mcset pl "customization" "dostosowanie" ::msgcat::mcset pl "emoticons" "emotikonki" ::msgcat::mcset pl "extension management" "zarzÄ…dzanie dodatkami" ::msgcat::mcset pl "file transfer" "transfer plików" ::msgcat::mcset pl "general plugins" "podstawowe wtyczki" ::msgcat::mcset pl "kde" "kde" ::msgcat::mcset pl "macintosh plugins" "wtyczki dla systemu Mac" ::msgcat::mcset pl "negotiation" "uzgadnianie" ::msgcat::mcset pl "pixmaps management" "zarzÄ…dzanie obrazkami" ::msgcat::mcset pl "plugin management" "zarzÄ…dzanie wtyczkami" ::msgcat::mcset pl "presence" "status" ::msgcat::mcset pl "privacy rules" "zasady ochrony prywatnoÅ›ci" ::msgcat::mcset pl "roster plugins" "wtyczki listy kontaktów" ::msgcat::mcset pl "Save To Log" "Zapisz do pliku dziennika" ::msgcat::mcset pl "search plugins" "wtyczki wyszukiwania" ::msgcat::mcset pl "searching" "wyszukiwanie" ::msgcat::mcset pl "service discovery" "informacje discovery" ::msgcat::mcset pl "sound" "dźwiÄ™k" ::msgcat::mcset pl "unix plugins" "wtyczki dla systemu Unix" ::msgcat::mcset pl "user interface" "intrerfejs użytkownika" ::msgcat::mcset pl "utilities" "użytki" ::msgcat::mcset pl "windows plugins" "wtyczki dla systemu Windows" ::msgcat::mcset pl "wmaker" "wmaker" ::msgcat::mcset pl "xmpp chat/muc" "obsÅ‚uga rozmów/konferencji" ::msgcat::mcset pl "xmpp iq" "xmpp iq" ::msgcat::mcset pl "xmpp library" "biblioteka xmpp" ::msgcat::mcset pl "xmpp messages" "obsÅ‚uga wiadomoÅ›ci" ::msgcat::mcset pl "xmpp presence" "xmpp obecność" ::msgcat::mcset pl "xmpp registration" "xmpp rejestracja" ::msgcat::mcset pl "xmpp roster" "lista kontaktów" # chats.tcl ::msgcat::mcset pl "%s - Chat" "%s - Rozmowa" ::msgcat::mcset pl "%s has changed nick to %s." "%s zmieniÅ‚ pseudonim na %s." ::msgcat::mcset pl "/me has set the subject to: %s" "/me zmieniÅ‚ temat na:\ %s" ::msgcat::mcset pl ">>> Unable to decipher data: %s <<<" ">>> Nie można\ odszyfrować danych: %s <<<" ::msgcat::mcset pl "Chat " "Rozmowa" ::msgcat::mcset pl "Chat options." "Ustawienia rozmów i konferencji." ::msgcat::mcset pl "Chat with %s" "%s" ::msgcat::mcset pl "Default message type (if not specified explicitly)."\ "DomyÅ›lny typ wiadomoÅ›ci (jeżeli nie okreÅ›lono)." ::msgcat::mcset pl "Display description of user status in chat windows."\ "Pokaż status użytkownika na górnym pasku okna rozmowy (opis statusu\ w dymku podpowiedzi)" ::msgcat::mcset pl "Enable chat window autoscroll only when last message is\ shown." "Włącz autoprzewijanie okna tylko kiedy widać ostatniÄ…\ wiadomość." ::msgcat::mcset pl "Error %s" "Błąd %s" ::msgcat::mcset pl "Generate chat messages when chat peer changes his/her\ status and/or status message" "Generuj wiadomoÅ›ci kiedy uczestnik\ rozmowy zmienia swój status lub opis statusu" ::msgcat::mcset pl "Invite" "ZaproÅ›" ::msgcat::mcset pl "Invite %s to conferences" "ZaproÅ› '%s' do konferencji" ::msgcat::mcset pl "Invite users to %s" "ZaproÅ› użytkowników do %s" ::msgcat::mcset pl "Invite users..." "ZaproÅ›..." ::msgcat::mcset pl "List of users for chat." "Lista uczestników rozmowy." ::msgcat::mcset pl "Moderators" "Moderatorzy" ::msgcat::mcset pl "No conferences for %s in progress..." "Brak aktywnych\ konferencji dla %s..." ::msgcat::mcset pl "No users in %s roster..." "Brak kontaktów na liÅ›cie\ %s..." ::msgcat::mcset pl "Normal" "ZwykÅ‚a" ::msgcat::mcset pl "Open chat" "Rozpocznij rozmowÄ™" ::msgcat::mcset pl "Open new conversation" "Otwórz nowÄ… rozmowÄ™" ::msgcat::mcset pl "Opens a new chat window for the new nick of the room\ occupant" "Otwiera nowe okno rozmowy z nowym pseudonimem uczestnika\ konferencji" ::msgcat::mcset pl "Participants" "Uczestnicy" ::msgcat::mcset pl "Please join %s" "Zaproszenie do konferencji %s" ::msgcat::mcset pl "Remove from roster..." "UsuÅ„ z listy kontaktów..." ::msgcat::mcset pl "Stop chat window autoscroll." "Zatrzymaj autoprzewijanie\ okna rozmów." ::msgcat::mcset pl "Subject is set to: %s" "Temat konferencji to: %s" ::msgcat::mcset pl "Users" "Użytkownicy" ::msgcat::mcset pl "Visitors" "GoÅ›cie" # plugins/windows/taskbar.tcl ::msgcat::mcset pl "Enable windows tray icon." "Włącz obsÅ‚ugÄ™ ikony zasobnika\ systemowego Windows." ::msgcat::mcset pl "Hide Main Window" "Ukryj główne okno" ::msgcat::mcset pl "Show Main Window" "Pokaż główne okno" # plugins/unix/dockingtray.tcl ::msgcat::mcset pl "Enable KDE tray icon." "Włącz obsÅ‚ugÄ™ ikony zasobnika\ systemowego KDE." # ifacetk/systray.tcl ::msgcat::mcset pl "Change icon on server and enter/exit groupchat messages."\ "ZmieÅ„ ikonÄ™ na wiadomoÅ›ciach serwera i wiadomoÅ›ciach wejÅ›cia/wyjÅ›cia\ w konferencji." ::msgcat::mcset pl "Display status tooltip when main window is minimized to\ systray." "Pokazuj dymek podpowiedzi ze statusem nad ikonÄ… w\ zasobniku systemowym." ::msgcat::mcset pl "Systray icon blinks when there are unread messages."\ "MigajÄ…ca ikonka w zasobniku systemowym dla nieprzeczytanych\ wiadomoÅ›ci." ::msgcat::mcset pl "Systray icon options." "Ustawienia ikony zasobnika\ systemowego." ::msgcat::mcset pl "Tkabber Systray" "Ikona Tkabber" # plugins/windows/console.tcl ::msgcat::mcset pl "Show console" "Pokaż konsolÄ™" # ifaceck/widgets.tcl ::msgcat::mcset pl "Message" "Wiadomość" ::msgcat::mcset pl "Warning" "Ostrzeżenie" # ifacetk/iroster.tcl ::msgcat::mcset pl "Always use main JID label for metacontact." "Zawsze\ używaj etykiety głównego JID dla metakontaktu." ::msgcat::mcset pl "Are you sure to remove all users in group '%s' from\ roster? \n(Users which are not in this group only, will be removed\ from the roster as well.)" "Czy na pewno usunąć z listy wszystkie\ kontakty z grupy '%s'? \n(Kontakty przypisane równoczeÅ›nie do innych\ grup także zostanÄ… usuniÄ™te.)" ::msgcat::mcset pl "Are you sure to remove group '%s' from roster? \n(Users\ which are in this group only, will be in undefined group.)" "Czy na\ pewno usunąć grupÄ™ '%s' z listy kontaktów? \n(Kontakty, które sÄ…\ tylko w tej grupie, znajdÄ… siÄ™ w grupie 'Niezdefiniowane'.)" ::msgcat::mcset pl "Ask:" "ProÅ›ba:" ::msgcat::mcset pl "Enable grouping contacts into a single metacontact in\ roster." "Włącz łączenie kontaktów w pojedyÅ„czy metakontakt." ::msgcat::mcset pl "Match contact JIDs in addition to nicknames in roster\ filter." "Filtruj wg JID użytkowników (dodmuatkowo obok filtrowania\ wg nazwy kontaktu)." ::msgcat::mcset pl "My Resources" "Moje zasoby" ::msgcat::mcset pl "Remove all users in group..." "UsuÅ„ wszystkie kontakty z\ grupy..." ::msgcat::mcset pl "Remove group..." "UsuÅ„ grupÄ™..." ::msgcat::mcset pl "Rename group..." "ZmieÅ„ nazwÄ™ grupy..." ::msgcat::mcset pl "Roster filter." "Filtr listy kontaktów." ::msgcat::mcset pl "Send message to all users in group..." "WyÅ›lij wiadomość\ do wszystkich w grupie..." ::msgcat::mcset pl "Stored collapsed roster groups." "Lista pamiÄ™tanych\ zwiniÄ™tych grup listy kontaktów." ::msgcat::mcset pl "Stored show offline roster groups." "Lista pamiÄ™tanych\ grup z widokiem kontaków rozłączonych." ::msgcat::mcset pl "Subscription:" "Subskrypcja:" ::msgcat::mcset pl "Use roster filter." "Włącz filtr listy kontaktów." # ifacetk/iface.tcl ::msgcat::mcset pl "&Help" "&Pomoc" ::msgcat::mcset pl "&Services" "&UsÅ‚ugi" ::msgcat::mcset pl "Accept messages from roster users only" "Akceptuj\ wiadomoÅ›ci tylko od osób z listy kontaktów" ::msgcat::mcset pl "Activate lists at startup" "Aktywuj listy podczas\ uruchomienia" ::msgcat::mcset pl "Activate search panel" "Włącz panel wyszukiwania" ::msgcat::mcset pl "Add conference to roster..." "Dodaj konferencjÄ™ do\ listy..." ::msgcat::mcset pl "Add user to roster..." "Dodaj kontakt do listy..." ::msgcat::mcset pl "Bottom" "Dół" ::msgcat::mcset pl "Clear history" "Wyczyść historiÄ™" ::msgcat::mcset pl "Close Tkabber" "Zamknij Tkabbera" ::msgcat::mcset pl "Command to be run when you click a URL in a message. '%s'\ will be replaced with this URL (e.g. \"chromium %s >>& /dev/null\" or\ \"{C:/Program Files (x86)/Mozilla Firefox/firefox.exe} %s\")."\ "Polecenie uruchamiane po klikniÄ™ciu adresu URL w wiadomoÅ›ciach. '%s'\ zostanie zastÄ…pione adresem URL (n.p. \"chromium %s >>& /dev/null\"\ lub \"{C:/Program Files (x86)/Mozilla Firefox/firefox.exe} %s\")." ::msgcat::mcset pl "Common:" "Wspólne:" ::msgcat::mcset pl "Complete nickname or command" "UzupeÅ‚nij pseudonim lub\ polecenie" ::msgcat::mcset pl "Debug tools" "Zaawansowane" ::msgcat::mcset pl "Do nothing" "Nic nie rób" ::msgcat::mcset pl "Edit conference list " "Edytuj listÄ™ konferencji " ::msgcat::mcset pl "Edit ignore list " "Edycja listy ignorowanych" ::msgcat::mcset pl "Edit invisible list " "Edycja listy niewidocznoÅ›ci" ::msgcat::mcset pl "Edit visible list" "Edycja listy widocznoÅ›ci" ::msgcat::mcset pl "Enable metacontacts" "Włącz metakontakty" ::msgcat::mcset pl "Font to use in chat windows." "Czcionka używana w oknach\ rozmów." ::msgcat::mcset pl "Font to use in roster windows." "Czcionka używana w oknie\ listy kontaktów." ::msgcat::mcset pl "Hide main window" "Ukryj główne okno" ::msgcat::mcset pl "History of availability status messages" "Historia\ używanych opisów statusu" ::msgcat::mcset pl "Iconize" "Minimalizuj do ikony w zasobniku" ::msgcat::mcset pl "If set then open chat window/tab when user doubleclicks\ roster item. Otherwise open normal message window." "Opcja włączona\ oznacza że podwójne klikniÄ™cie na element listy kontaktów otwiera\ okno/kartÄ™ rozmowy. W przeciwnym przypadku otwierane jest okno\ wiadomoÅ›ci." ::msgcat::mcset pl "Left" "Lewa" ::msgcat::mcset pl "Left mouse button" "Lewy przycisk myszy" ::msgcat::mcset pl "Manually edit rules" "RÄ™czna edycja reguÅ‚" ::msgcat::mcset pl "Maximum number of status messages to keep. If the history\ size reaches this threshold, the oldest message will be deleted\ automatically when a new one is recorded." "Maksymalna liczba\ pamiÄ™tanych w historii opisów. Jeżeli rozmiar historii przekracza ten\ próg, automatycznie usuwane sÄ… najstarsze opisy podczas dodawania\ nowego." ::msgcat::mcset pl "Maximum width of tab buttons in tabbed mode." "Maksymalna\ szerokość przycisku karty w trybie interfejsu z kartami." ::msgcat::mcset pl "Middle mouse button" "Åšrodkowy przycisk myszy" ::msgcat::mcset pl "Minimize" "Minimalizuj do paska zadaÅ„" ::msgcat::mcset pl "Minimize to systray (if systray icon is enabled,\ otherwise do nothing)" "Minimalizuj do ikony w zasobniku (jeżeli\ ikona jest wyłączona to nic nie rób)" ::msgcat::mcset pl "Minimum width of tab buttons in tabbed mode." "Minimalna\ szerokość przycisku karty w trybie interfejsu z kartami." ::msgcat::mcset pl "Mute sound" "Wyłącz dźwiÄ™ki powiadomieÅ„" ::msgcat::mcset pl "Open chat..." "Rozpocznij rozmowÄ™..." ::msgcat::mcset pl "Open login log" "Otwórz dziennik połączeÅ„" ::msgcat::mcset pl "Plugins" "Wtyczki" ::msgcat::mcset pl "Popup menu" "Pokaż menu" ::msgcat::mcset pl "Presence bar" "Pasek wyboru statusu" ::msgcat::mcset pl "Privacy rules" "Ochrona prywatnoÅ›ci" ::msgcat::mcset pl "Right" "Prawa" ::msgcat::mcset pl "Show main window" "Pokaż główne okno" ::msgcat::mcset pl "Show menu tearoffs when possible." "Włącz odrywane menu." ::msgcat::mcset pl "Show only the number of personal unread messages in\ window title." "Pokaż tylko ilość wiadomoÅ›ci osobistych na pasku\ tytuÅ‚owym okna." ::msgcat::mcset pl "Show own resources" "Pokaż wÅ‚asne zasoby" ::msgcat::mcset pl "Show palette of emoticons" "Pokaż zestaw emotikonek" ::msgcat::mcset pl "Show presence bar." "Pokaż pasek wyboru statusu." ::msgcat::mcset pl "Show status bar." "Pokaż pasek stanu aplikacji." ::msgcat::mcset pl "Side where to place tabs in tabbed mode." "Miejsce\ umieszczenia kart w głównym oknie programu w trybie interfejsu z\ kartami." ::msgcat::mcset pl "Status bar" "Pasek stanu" ::msgcat::mcset pl "Stored main window state (normal or zoomed)"\ "Przechowywany widok głównego okna (normalny lub powiÄ™kszony)" ::msgcat::mcset pl "Systray:" "Zasobnik systemowy:" ::msgcat::mcset pl "Toolbar" "Pasek narzÄ™dzi" ::msgcat::mcset pl "Top" "Góra" ::msgcat::mcset pl "Use roster filter" "Włącz filtr listy kontaktów" ::msgcat::mcset pl "View" "Widok" ::msgcat::mcset pl "What action does the close button." "Akcja dla przycisku\ zamykania okna." # ifacetk/iroster.tcl ::msgcat::mcset pl "Alexey Shchepin" "Aleksej Szczepin" ::msgcat::mcset pl "Close tab" "Zamknij kartÄ™" ::msgcat::mcset pl "Correct word" "Korekta sÅ‚owa (ispell)" ::msgcat::mcset pl "Hide/Show roster" "Ukryj/pokaż listÄ™ kontaktów" ::msgcat::mcset pl "Konstantin Khomoutov" "Konstantin Khomoutow" ::msgcat::mcset pl "Main window:" "Okno Główne:" ::msgcat::mcset pl "Marshall T. Rose" "Marshall T. Rose" ::msgcat::mcset pl "Michail Litvak" "MichaiÅ‚ Litwak" ::msgcat::mcset pl "Move tab left/right" "PrzesuÅ„ kartÄ™ w lewo/prawo" ::msgcat::mcset pl "Previous/Next history message" "NastÄ™pna/poprzednia\ wiadomość w historii" ::msgcat::mcset pl "Previous/Next tab" "Poprzedna/nastÄ™pna karta" ::msgcat::mcset pl "Redo" "Ponów" ::msgcat::mcset pl "Right mouse button" "Prawy przycisk myszy" ::msgcat::mcset pl "Scroll chat window up/down" "PrzewiÅ„ okno rozmów w górÄ™/w\ dół" ::msgcat::mcset pl "Sergei Golovan" "Siergiej Golowan" ::msgcat::mcset pl "Show emoticons" "Pokaż zestaw emotikonek" ::msgcat::mcset pl "Switch to tab number 1-9,10" "Przełącz na kartÄ™ nr\ 1-9,10" ::msgcat::mcset pl "Undo" "Cofnij" # ifacetk/ilogin.tcl ::msgcat::mcset pl "Address type not supported by SOCKS proxy"\ "NieobsÅ‚ugiwany przez SOCKS proxy typ adresu" ::msgcat::mcset pl "Allow plaintext authentication mechanisms" "Włącz\ mechanizmy uwierzytelniania zwykÅ‚ym tekstem" ::msgcat::mcset pl "Allow X-GOOGLE-TOKEN authentication mechanisms. It\ requires connection to Google via HTTPS." "Włącz mechanizm\ uwierzytelniania X-GOOGLE-TOKEN. Wymaga to połączenia do serwerów\ Google przez HTTPS." ::msgcat::mcset pl "Allow X-GOOGLE-TOKEN SASL mechanism" "WlÄ…cz mechanizm\ X-GOOGLE-TOKEN w SASL" ::msgcat::mcset pl "Authentication" "Uwierzytelnianie" ::msgcat::mcset pl "Compression" "Kompresja" ::msgcat::mcset pl "Connection refused by destination host" "Połączenie\ odrzucone przez serwer docelowy" ::msgcat::mcset pl "Encryption (legacy SSL)" "Szyfrowanie SSL" ::msgcat::mcset pl "Encryption (STARTTLS)" "Szyfrowanie STARTTLS" ::msgcat::mcset pl "Explicitly specify host and port to connect" "RÄ™czne\ ustawienie portu i nazwy serwera do połączenia" ::msgcat::mcset pl "Host unreachable" "Serwer niedostÄ™pny" ::msgcat::mcset pl "Host:" "Serwer:" ::msgcat::mcset pl "Incorrect SOCKS version" "NieprawidÅ‚owa wersja SOCKS" ::msgcat::mcset pl "Login retry for %s in %s" "Ponowna próba połączenia dla\ %s za %s" ::msgcat::mcset pl "Network failure" "Awaria sieci" ::msgcat::mcset pl "Network unreachable" "Sieć nieosiÄ…galna" ::msgcat::mcset pl "Plaintext" "ZwykÅ‚y tekst" ::msgcat::mcset pl "Proxy authentication required" "Wymagane uwierzytelnianie\ proxy" ::msgcat::mcset pl "Proxy password:" "HasÅ‚o proxy:" ::msgcat::mcset pl "Proxy port:" "Port proxy:" ::msgcat::mcset pl "Proxy server:" "Nazwa serwera proxy:" ::msgcat::mcset pl "Proxy type:" "Typ proxy:" ::msgcat::mcset pl "Proxy username:" "Użytkownik proxy:" ::msgcat::mcset pl "SOCKS authentication failed" "Uwierzytelnianie SOCKS nie\ powiodÅ‚o siÄ™" ::msgcat::mcset pl "SOCKS command not supported" "NieobsÅ‚ugiwane polecenie\ SOCKS" ::msgcat::mcset pl "SOCKS connection not allowed by ruleset" "Połączenie\ SOCKS zablokowane przez reguÅ‚y dostÄ™pu" ::msgcat::mcset pl "SOCKS request failed" "OdwoÅ‚anie SOCKS nie powiodÅ‚o siÄ™" ::msgcat::mcset pl "SOCKS server cannot identify username" "Serwer SOCKS nie\ może zidentyfikować nazwy użytkownika" ::msgcat::mcset pl "SOCKS server username identification failed"\ "Identyfikacja nazwy użytkownika serwera SOCKS nie powiodÅ‚a siÄ™" ::msgcat::mcset pl "SSL & Compression" "Kompresja i SSL" ::msgcat::mcset pl "SSL certificate:" "Certyfikat SSL:" ::msgcat::mcset pl "TTL expired" "TTL wygasÅ‚o" ::msgcat::mcset pl "Unknown address type" "Nieznany typ adresu" ::msgcat::mcset pl "Unknown error" "Nieznany błąd" ::msgcat::mcset pl "Unsupported SOCKS authentication method" "NieobsÅ‚ugiwana\ metoda uwierzytelniania SOCKS" ::msgcat::mcset pl "Unsupported SOCKS method" "NieobsÅ‚ugiwana metoda SOCKS" ::msgcat::mcset pl "Use SASL authentication" "Włącz uwierzytelnianie SASL" # pixmaps.tcl ::msgcat::mcset pl "Tkabber icon theme. To make new theme visible for Tkabber\ put it to some subdirectory of %s." "Motyw ikon Tkabbera. Aby nowy\ motyw byÅ‚ widoczny w Tkabberze, należy umieÅ›cić go jako podkatalog\ katalogu %s." # si.tcl ::msgcat::mcset pl "Enable SI transport %s." "Włącz transport SI %s." ::msgcat::mcset pl "File transfer aborted" "PrzesyÅ‚anie pliku zostaÅ‚o\ przerwane" ::msgcat::mcset pl "Opening SI connection" "Otwieranie połączenia SI" ::msgcat::mcset pl "SI connection closed" "Połączenie SI zakoÅ„czone" ::msgcat::mcset pl "Stream method negotiation failed" "Nie powiodÅ‚o siÄ™\ uzgadnianie metody przesyÅ‚u strumienia" # plugins/si/socks5.tcl ::msgcat::mcset pl "Aborted" "Przerwano" ::msgcat::mcset pl "Cannot connect to proxy" "Nie można połączyć siÄ™ z\ serwerem proxy" ::msgcat::mcset pl "Cannot negotiate proxy connection" "Nie udaÅ‚o siÄ™\ wynegocjować połączenia proxy" ::msgcat::mcset pl "Illegal result" "NieprawidÅ‚owy wynik" ::msgcat::mcset pl "List of proxy servers for SOCKS5 bytestreams (all\ available servers will be tried for mediated connection)."\ "Rozdzielona spacjami lista serwerów proxy do połączeÅ„ SOCKS5\ (wszystkie wymienione serwery zostanÄ… sprawdzone przy połączeniu\ negocjowanym)." ::msgcat::mcset pl "Opening SOCKS5 listening socket" "Otwieranie gniazda\ SOCKS5" ::msgcat::mcset pl "Use mediated SOCKS5 connection if proxy is available."\ "Włącz negocjacjÄ™ połączenia SOCKS5 jeżeli dostÄ™pny jest serwer\ proxy." # plugins/si/iqibb.tcl ::msgcat::mcset pl "Opening IQ-IBB connection" "Otwieranie połączenia IQ-IBB" # plugins/filetransfer/si.tcl ::msgcat::mcset pl "Receive error: Stream ID is in use" "Błąd odbioru: ID\ strumienia jest w użuciu" ::msgcat::mcset pl "Stream initiation options." "Ustawienia protokoÅ‚u\ inicjacji strumienia (SI)." ::msgcat::mcset pl "Transfer failed: %s" "Nie udaÅ‚o siÄ™ przesÅ‚ać pliku: %s" # plugins/filetransfer/http.tcl ::msgcat::mcset pl "Can't receive file: %s" "Nie udaÅ‚o siÄ™ odebrać pliku: %s" ::msgcat::mcset pl "File path:" "Plik:" ::msgcat::mcset pl "Force advertising this hostname (or IP address) for\ outgoing HTTP file transfers." "WymuÅ› rozgÅ‚aszanie nazwy tego hosta\ (lub adresu IP) przy wysyÅ‚aniu plików przez HTTP." ::msgcat::mcset pl "HTTP options." "Ustawienia protokoÅ‚u HTTP." ::msgcat::mcset pl "Port for outgoing HTTP file transfers (0 for assigned\ automatically). This is useful when sending files from behind a NAT\ with a forwarded port." "Numer portu przy wysyÅ‚aniu plików przez HTTP\ (jeżeli 0 to port zostanie przypisany automatycznie). Jest to\ przydatne przy wysyÅ‚aniu plików z sieci ukrytej za NAT z\ przekierowanym portem (forwarding)." # plugins/general/offline.tcl ::msgcat::mcset pl "Fetch all messages" "Pobierz wszystkie wiadomoÅ›ci" ::msgcat::mcset pl "Fetch message" "Pobierz wiadomość" ::msgcat::mcset pl "Fetch unseen messages" "Pobierz nieoglÄ…dane wiadomoÅ›ci" ::msgcat::mcset pl "Offline Messages" "WiadomoÅ›ci nieprzeczytane" ::msgcat::mcset pl "Purge all messages" "UsuÅ„ wszystkie wiadomoÅ›ci" ::msgcat::mcset pl "Purge message" "UsuÅ„ wiadomość" ::msgcat::mcset pl "Purge seen messages" "UsuÅ„ oglÄ…dane wiadomoÅ›ci" ::msgcat::mcset pl "Retrieve offline messages using POP3-like protocol."\ "Pobierz nieprzeczytane wiadomoÅ›ci z serwera używajÄ…c protokoÅ‚u\ podobnego do POP3." ::msgcat::mcset pl "Sort by from" "Sortuj wg nadawcy" ::msgcat::mcset pl "Sort by node" "Sortuj wg powiÄ…zaÅ„" ::msgcat::mcset pl "Sort by type" "Sortuj wg typu" # plugins/general/annotations.tcl ::msgcat::mcset pl "Created: %s" "Utworzono: %s" ::msgcat::mcset pl "Edit item notes..." "Edytuj notatkÄ™..." ::msgcat::mcset pl "Edit roster notes for %s" "Edycja notatki dla %s" ::msgcat::mcset pl "Modified: %s" "Zmodyfikowano: %s" ::msgcat::mcset pl "Notes" "Notatki" ::msgcat::mcset pl "Roster Notes" "Notatki dla pozycji w liÅ›cie kontaktów" ::msgcat::mcset pl "Store" "Zapisz" ::msgcat::mcset pl "Storing roster notes failed: %s" "Zapis notatki dla\ pozycji listy kontaktów nie powiódÅ‚ siÄ™: %s" # plugins/general/headlines.tcl ::msgcat::mcset pl "" "" ::msgcat::mcset pl "Format of timestamp in headline tree view. Set to empty\ string if you don't want to see timestamps." "Format znacznika czasu\ w oknie nagłówków wiadomoÅ›ci. Zostawienie tego pola pustego spowoduje\ wyłączenie znaczników czasu." ::msgcat::mcset pl "Read on..." "Czytaj dalej..." ::msgcat::mcset pl "Show balloons with headline messages over tree nodes."\ "Pokazuj dymki podpowiedzi z treÅ›ciÄ… nagłówka nad elemetami drzewka\ nagłówków." ::msgcat::mcset pl "Sort by date" "Sortuj wg daty" # plugins/search/search.tcl ::msgcat::mcset pl "Match case while searching in chat, log or disco\ windows." "Rozróżniaj wielkość liter podczas wyszukiwania w oknach\ rozmowy, historii i przeglÄ…darki usÅ‚ug." ::msgcat::mcset pl "Search in Tkabber windows options." "Ustawienia\ wyszukiwania w oknach Tkabbera." ::msgcat::mcset pl "Specifies search mode while searching in chat, log or\ disco windows. \"substring\" searches exact substring, \"glob\" uses\ glob style matching, \"regexp\" allows to match regular expression."\ "OkreÅ›la tryb wyszukiwania w rozmowach, historii i przeglÄ…darce\ usÅ‚ug. \"substring\" wyszukuje dokÅ‚adny podciÄ…g znaków, \"glob\"\ używa stylu dopasowaÅ„ glob, \"regexp\" pozwala na używanie wyrażeÅ„\ regularnych." # plugins/roster/cache_categories.tcl ::msgcat::mcset pl "Cached service categories and types (from disco#info)."\ "Typy i kategorie usÅ‚ug przechowywane w pamiÄ™ci podrÄ™cznej (z\ disco#info)." # plugins/general/xaddress.tcl ::msgcat::mcset pl "Blind carbon copy" "Ukryta kopia" ::msgcat::mcset pl "Carbon copy" "Kopia" ::msgcat::mcset pl "Extended addressing fields:" "Rozszerzone pola adresowe:" ::msgcat::mcset pl "Forwarded by:" "Przekazane przez:" ::msgcat::mcset pl "No reply" "Bez odpowiedzi" ::msgcat::mcset pl "Original from" "Oryginalny nadawca" ::msgcat::mcset pl "Original to" "Oryginalny adresat" ::msgcat::mcset pl "Reply to" "Odpowiedź do" ::msgcat::mcset pl "Reply to room" "Odpowiedź do pokoju" ::msgcat::mcset pl "This message was forwarded by %s\n" "Ta wiadomość zostaÅ‚a\ przekazana przez %s\n" ::msgcat::mcset pl "This message was sent by %s\n" "Ta wiadomość zostaÅ‚a\ wysÅ‚ana przez %s\n" ::msgcat::mcset pl "To" "Do" # plugins/general/xcommands.tcl ::msgcat::mcset pl "Commands" "Polecenia" ::msgcat::mcset pl "Error completing command: %s" "Błąd przy uzupeÅ‚nianiu\ polecenia: %s" ::msgcat::mcset pl "Error executing command: %s" "Błąd przy uruchamianiu\ polecenia: %s" ::msgcat::mcset pl "Error:" "Błąd:" ::msgcat::mcset pl "Execute command" "Uruchom polecenie" ::msgcat::mcset pl "Finish" "ZakoÅ„cz" ::msgcat::mcset pl "Info:" "Informacja:" ::msgcat::mcset pl "Next" "Poprzednie" ::msgcat::mcset pl "Prev" "NastÄ™pne" ::msgcat::mcset pl "Submit" "WyÅ›lij" ::msgcat::mcset pl "Warning:" "Ostrzeżenie:" # plugins/general/remote.tcl ::msgcat::mcset pl "Accept connections from my own JID." "Akceptuj połączenia\ z wÅ‚asnego JID." ::msgcat::mcset pl "Accept connections from the listed JIDs." "Akceptuj\ połączenia od nastÄ™pujÄ…cych JID (pozycje listy oddziel spacjami)." ::msgcat::mcset pl "All unread messages were forwarded to %s." "Wszystkie\ nieprzeczytane wiadomoÅ›ci zostaÅ‚y przekazane do %s." ::msgcat::mcset pl "Enable remote control." "Włącz obsÅ‚ugÄ™ zdalnego\ sterownia." ::msgcat::mcset pl "Remote control options." "Ustawienia zdalnego sterowania\ Tkabberem." ::msgcat::mcset pl "Show my own resources in the roster." "Pokaż wÅ‚asne\ zasoby na liÅ›cie kontaktów." ::msgcat::mcset pl "This message was forwarded to %s" "Ta wiadomość zostaÅ‚a\ przekazana do %s" # plugins/chat/log_on_open.tcl ::msgcat::mcset pl "Maximum interval length in hours for which log messages\ should be shown in newly opened chat window (if set to negative then\ the interval is unlimited)." "Maksymalny odstÄ™p czasu od ostatniej\ rozmowy (w godzinach), dla którego wiadomoÅ›ci historii pokazywane\ bÄ™dÄ… w nowo otwartych oknach (liczba ujemna oznacza brak limitu)" ::msgcat::mcset pl "Maximum number of log messages to show in newly opened\ chat window (if set to negative then the number is unlimited)."\ "Maksymalna liczba wiadomoÅ›ci historii, pokazywana w nowo otwieranych\ oknach rozmów (liczba ujemna oznacza brak limitu)." # plugins/richtext/stylecodes.tcl ::msgcat::mcset pl "Emphasize stylecoded messages using different fonts."\ "Formatuj wyróżnione części tekstu używajÄ…c różnych czcionek." ::msgcat::mcset pl "Handling of \"stylecodes\". Stylecodes are (groups of)\ special formatting symbols used to emphasize parts of the text by\ setting them with boldface, italics or underlined styles, or as\ combinations of these." "ObsÅ‚uga znaków formatujÄ…cych. Znaki\ formatujÄ…ce sÄ… (grupujÄ…cymi tekst) znakami specjalnymi, używanymi do\ wyróżnienia części tekstu przez *wytÅ‚uszczenie*, \kursywÄ™\,\ _podkreÅ›lenie_ lub kombinacjÄ™ tych trzech opcji." ::msgcat::mcset pl "Hide characters comprising stylecode markup." "Ukryj\ znaki formatujÄ…ce tekst." # richtext.tcl ::msgcat::mcset pl "Settings of rich text facility which is used to render\ chat messages and logs." "Ustawienia mechanizmu formatowania tekstu,\ który jest używany do wyÅ›wietlania wiadomoÅ›ci w rozmowach i\ historii." # plugins/richtext/emoticons.tcl ::msgcat::mcset pl "Handle ROTFL/LOL smileys -- those like :))) -- by\ \"consuming\" all that parens and rendering the whole word with\ appropriate icon." "ObsÅ‚uga emotikonek ROTFL/LOL -- typu :))) --\ przez obciÄ™cie nadmiarowych znaków i wyÅ›wietlenie caÅ‚ego wyrazu za\ pomocÄ… odpowiedniej ikony." ::msgcat::mcset pl "Handling of \"emoticons\". Emoticons (also known as\ \"smileys\") are small pictures resembling a human face used to\ represent user's emotion. They are typed in as special mnemonics like\ :) or can be inserted using menu." "ObsÅ‚uga \"emotikon\". Emotikony\ (nazywane także \"buźkami\") to maÅ‚e obrazki przypominajÄ…ce ludzkÄ…\ twarz, używane do wyrażania uczuć osoby piszÄ…cej. Wstawiane sÄ…\ poprzez wpisanie specjalnych skrótów np. :) lub przez wybranie z\ menu." ::msgcat::mcset pl "Show images for emoticons." "Pokaż obrazki emotikon." ::msgcat::mcset pl "Tkabber emoticons theme. To make new theme visible for\ Tkabber put it to some subdirectory of %s." "Motyw emotikon Tkabbera.\ Aby nowy motyw byÅ‚ widoczny w Tkabberze, należy umieÅ›cić go jako\ podkatalog katalogu %s." ::msgcat::mcset pl "Use only whole words for emoticons." "Zamieniaj tylko\ caÅ‚e wyrazy na emotikony." # utils.tcl ::msgcat::mcset pl "day" "dzieÅ„" ::msgcat::mcset pl "days" "dni" ::msgcat::mcset pl "hour" "godzina" ::msgcat::mcset pl "hours" "godzin" ::msgcat::mcset pl "minute" "minuta" ::msgcat::mcset pl "minutes" "minut" ::msgcat::mcset pl "second" "sekunda" ::msgcat::mcset pl "seconds" "sekund" # pubsub.tcl ::msgcat::mcset pl "Configure node" "Konfiguracja wÄ™zÅ‚a" ::msgcat::mcset pl "Edit entities affiliations: %s" "Edytuj przynależnoÅ›ci\ obiektów: %s" ::msgcat::mcset pl "Jabber ID" "Jabber ID" ::msgcat::mcset pl "Outcast" "Wyrzutek" ::msgcat::mcset pl "Owner" "WÅ‚aÅ›ciciel" ::msgcat::mcset pl "Pending" "OczekujÄ…cy" ::msgcat::mcset pl "Publisher" "Wydawca" ::msgcat::mcset pl "Pubsub request failed: %s" "WywoÅ‚anie pubsub nie powiodÅ‚o\ siÄ™: %s" ::msgcat::mcset pl "Pubsub request succeeded" "WywoÅ‚anie pubsub powiodÅ‚o siÄ™" ::msgcat::mcset pl "Request default configuration" "Pobierz domyÅ›lnÄ…\ konfiguracjÄ™" ::msgcat::mcset pl "Retrieve subscriptions" "Pobierz subskrypcje" ::msgcat::mcset pl "SubID" "SubID" ::msgcat::mcset pl "Subscribed" "Zasubskrybowany" ::msgcat::mcset pl "Subscription" "Subskrypcja" ::msgcat::mcset pl "Subscriptions to pubsub nodes at %s" "Subskrypcje do\ wÄ™złów pubsub na %s" ::msgcat::mcset pl "Success" "Sukces" ::msgcat::mcset pl "Unconfigured" "Nieskonfigurowany" ::msgcat::mcset pl "Unubscribe" "Anuluj subskrypcjÄ™" # plugins/roster/fetch_nicknames.tcl ::msgcat::mcset pl "Fetch nickname" "Pobierz pseudonim" ::msgcat::mcset pl "Fetch nicknames of all users in group" "Pobierz\ pseudonimy dla wszystkich w grupie" ::msgcat::mcset pl "Fetch user nicknames" "Pobierz pseudonimy kontaktów" # plugins/general/session.tcl ::msgcat::mcset pl "Load state on start" "Wczytaj zapisanÄ… sesjÄ™ przy\ starcie" ::msgcat::mcset pl "Load state on Tkabber start." "Wczytaj zapisanÄ… sesjÄ™\ przy starcie Tkabbera." ::msgcat::mcset pl "Save state" "Zapisz sesjÄ™ teraz" ::msgcat::mcset pl "Save state on exit" "Zapisz sesjÄ™ przy zamkniÄ™ciu" ::msgcat::mcset pl "Save state on Tkabber exit." "Zapisz sesjÄ™ przy\ zamkniÄ™ciu Tkabbera." ::msgcat::mcset pl "Tkabber save state options." "Ustawienia zapisu sesji\ Tkabbera." # config.tcl ::msgcat::mcset pl "Attention" "Uwaga" ::msgcat::mcset pl "Please stand by..." "ProszÄ™ czekać..." ::msgcat::mcset pl "Please, be patient while Tkabber configuration directory\ is being transferred to the new location" "ProszÄ™ czekać, katalog\ konfiguracyjny Tkabbera jest przenoszony do nowej lokalizacji" ::msgcat::mcset pl "Tkabber configuration directory transfer failed\ with:\n%s\n Tkabber will use the old directory:\n%s" "Nie udaÅ‚o siÄ™\ przenieść katalogu konfiguracyjnego Tkabbera:\n%s\n Zostanie użyty\ stary katalog:\n%s" ::msgcat::mcset pl "Your new Tkabber config directory is now:\n%s\nYou can\ delete the old one:\n%s" "Nowy katalog konfiguracyjny Tkabber to\ teraz:\n%s\nMoża już usunąć stary katalog:\n%s" # plugins/general/tkcon.tcl ::msgcat::mcset pl "Show TkCon console" "Otwórz konsolÄ™ TkCon" # plugins/general/copy_jid.tcl ::msgcat::mcset pl "Copy JID to clipboard" "Kopiuj JID do schowka" ::msgcat::mcset pl "Copy real JID to clipboard" "Kopiuj prawdziwy JID do\ schowka" # plugins/iq/ping.tcl ::msgcat::mcset pl "Ping server using XMPP ping requests." "Sprawdzaj serwer\ za pomocÄ… zapytaÅ„ XMPP ping." ::msgcat::mcset pl "Reconnect to server if it does not reply (with result or\ with error) to XMPP ping request in specified time interval (in\ seconds)." "Połącz siÄ™ ponownie z serwerem, jeżeli nie odpowiada on\ (wynikiem lub błędem) na zapytania XMPP ping po okreÅ›lonym (w\ sekundach) odstÄ™pnie czasu." ::msgcat::mcset pl "Reply to XMPP ping requests." "Odpowiadaj na zapytania\ XMPP ping." # plugins/chat/muc_ignore.tcl ::msgcat::mcset pl "Edit MUC ignore rules" "Edycja reguÅ‚ ignorowania w MUC" ::msgcat::mcset pl "Error loading MUC ignore rules, purged." "Błąd podczas\ wczytywania reguÅ‚ ignorowania w MUC, reguÅ‚y sÄ… puste." ::msgcat::mcset pl "Ignore" "Ignoruj" ::msgcat::mcset pl "Ignore chat messages" "Ignoruj wiadomoÅ›ci w rozmowach" ::msgcat::mcset pl "Ignore groupchat messages" "Ignoruj wiadomoÅ›ci w\ konferencjach" ::msgcat::mcset pl "Ignoring groupchat and chat messages from selected\ occupants of multi-user conference rooms." "Ignorowanie wiadomoÅ›ci w\ rozmowach i konferencjach od wybranych uczestników pokoi\ konferencyjnych." ::msgcat::mcset pl "MUC Ignore" "Ignorowanie w MUC" ::msgcat::mcset pl "MUC Ignore Rules" "ReguÅ‚y ignorowania w MUC" ::msgcat::mcset pl "When set, all changes to the ignore rules are applied\ only until Tkabber is closed\; they are not saved and thus will be\ not restored at the next run." "Jeżeli ustawiono, to wszystkie zmiany\ reguÅ‚ ignorowania sÄ… widoczne tylko do czasu nastÄ™pnego uruchomienia\ Tkabbera\; reguÅ‚y nie sÄ… zapisywane i nie bÄ™dÄ… odtworzone przy\ nastÄ™pnym uruchomieniu." # plugins/chat/histool.tcl ::msgcat::mcset pl "Chats History" "Archiwum rozmów" ::msgcat::mcset pl "Chats history" "Archiwum rozmów" ::msgcat::mcset pl "Client message" "Wiadomość klienta" ::msgcat::mcset pl "Full-text search" "Wyszukiwanie" ::msgcat::mcset pl "JID list" "Lista JID" ::msgcat::mcset pl "Logs" "Dzienniki" ::msgcat::mcset pl "Server message" "Wiadomość serwera" ::msgcat::mcset pl "Unsupported log dir format" "NieobsÅ‚ugiwany format\ katalogu historii" ::msgcat::mcset pl "WARNING: %s\n" "UWAGA: %s\n" # plugins/chat/abbrev.tcl ::msgcat::mcset pl "Abbreviations:" "Skróty:" ::msgcat::mcset pl "Added abbreviation:\n%s: %s" "Dodano skrót:\n%s: %s" ::msgcat::mcset pl "Deleted abbreviation: %s" "UsuniÄ™to skrót: %s" ::msgcat::mcset pl "No such abbreviation: %s" "Nie ma takiego skrótu: %s" ::msgcat::mcset pl "Purged all abbreviations" "UsuniÄ™to wszystkie skróty" ::msgcat::mcset pl "Usage: /abbrev WHAT FOR" "Użycie: /abbrev SKRÓT DO_CZEGO" ::msgcat::mcset pl "Usage: /unabbrev WHAT" "Użycie: /unabbrev SKRÓT" # pep.tcl ::msgcat::mcset pl "Personal Eventing" "Zdarzenia osobiste" ::msgcat::mcset pl "Personal eventing" "Zdarzenia osobiste" ::msgcat::mcset pl "Personal eventing via pubsub plugins options."\ "Ustawienia zdarzeÅ„ osobistych obsÅ‚ugiwanych przez wtyczki pubsub." # plugins/pep/user_mood.tcl ::msgcat::mcset pl "\n\tMood: %s" "\n\tNastrój: %s" ::msgcat::mcset pl "\n\tUser mood subscription: %s" "\n\tSubskrypcja nastroju\ użytkownika: %s" ::msgcat::mcset pl "%s's mood changed to %s" "%s zmieniÅ‚ nastrój na %s" ::msgcat::mcset pl "%s's mood is unset" "Użytkownik %s nie ustawiÅ‚ nastroju" ::msgcat::mcset pl "afraid" "przestraszony" ::msgcat::mcset pl "amazed" "zdumiony" ::msgcat::mcset pl "angry" "zÅ‚y" ::msgcat::mcset pl "annoyed" "zirytowany" ::msgcat::mcset pl "anxious" "zaniepokojony" ::msgcat::mcset pl "aroused" "pobudzony" ::msgcat::mcset pl "ashamed" "zawstydzony" ::msgcat::mcset pl "Auto-subscribe to other's user mood" "Automatycznie\ subskrybuj nastrój innego użytkownika" ::msgcat::mcset pl "Auto-subscribe to other's user mood notifications."\ "Automatycznie subskrybuj powiadomienia o nastroju innego\ użytkownika." ::msgcat::mcset pl "bored" "znudzony" ::msgcat::mcset pl "brave" "dzielny" ::msgcat::mcset pl "calm" "spokojny" ::msgcat::mcset pl "Cannot publish empty mood" "Nie można opublikować pustego\ nastroju" ::msgcat::mcset pl "cold" "lodowaty" ::msgcat::mcset pl "confused" "rozkojarzony" ::msgcat::mcset pl "contented" "zadowolony" ::msgcat::mcset pl "cranky" "drażliwy" ::msgcat::mcset pl "curious" "zaciekawiony" ::msgcat::mcset pl "depressed" "przybity" ::msgcat::mcset pl "disappointed" "rozczarowany" ::msgcat::mcset pl "disgusted" "zdegustowany" ::msgcat::mcset pl "distracted" "strapiony" ::msgcat::mcset pl "embarrassed" "zakÅ‚opotany" ::msgcat::mcset pl "Error" "Błąd" ::msgcat::mcset pl "excited" "podniecony" ::msgcat::mcset pl "flirtatious" "kokieteryjny" ::msgcat::mcset pl "frustrated" "sfrustrowany" ::msgcat::mcset pl "grumpy" "zrzÄ™dliwy" ::msgcat::mcset pl "guilty" "winny" ::msgcat::mcset pl "happy" "szczęśliwy" ::msgcat::mcset pl "hot" "napalony" ::msgcat::mcset pl "humbled" "skromny" ::msgcat::mcset pl "humiliated" "upokorzony" ::msgcat::mcset pl "hungry" "gÅ‚odny" ::msgcat::mcset pl "hurt" "zraniony" ::msgcat::mcset pl "impressed" "pod_wrażeniem" ::msgcat::mcset pl "in_awe" "zatrwożony" ::msgcat::mcset pl "in_love" "zakochany" ::msgcat::mcset pl "indignant" "oburzony" ::msgcat::mcset pl "interested" "zainteresowany" ::msgcat::mcset pl "intoxicated" "odurzony" ::msgcat::mcset pl "invincible" "niezwyciężony" ::msgcat::mcset pl "jealous" "zazdrosny" ::msgcat::mcset pl "lonely" "samotny" ::msgcat::mcset pl "mean" "wredny" ::msgcat::mcset pl "Mood" "Nastrój" ::msgcat::mcset pl "Mood:" "Nastrój:" ::msgcat::mcset pl "moody" "kapryÅ›ny" ::msgcat::mcset pl "nervous" "nerwowy" ::msgcat::mcset pl "neutral" "neutralny" ::msgcat::mcset pl "offended" "obrażony" ::msgcat::mcset pl "playful" "figlarny" ::msgcat::mcset pl "proud" "dumny" ::msgcat::mcset pl "Publish user mood..." "Publikuj nastrój użytkownika..." ::msgcat::mcset pl "Publishing is only possible while being online"\ "Publikowanie jest możliwe dopiero po nawiÄ…zaniu połączenia" ::msgcat::mcset pl "relieved" "beznadziejny" ::msgcat::mcset pl "remorseful" "skruszony" ::msgcat::mcset pl "restless" "niespokojny" ::msgcat::mcset pl "sad" "smutny" ::msgcat::mcset pl "sarcastic" "sarkastyczny" ::msgcat::mcset pl "serious" "poważny" ::msgcat::mcset pl "shocked" "zaszokowany" ::msgcat::mcset pl "shy" "nieÅ›miaÅ‚y" ::msgcat::mcset pl "sick" "chory" ::msgcat::mcset pl "sleepy" "Å›piÄ…cy" ::msgcat::mcset pl "stressed" "zestresowany" ::msgcat::mcset pl "surprised" "zaskoczony" ::msgcat::mcset pl "thirsty" "spragniony" ::msgcat::mcset pl "Unpublish user mood" "Anuluj publikacjÄ™ nastroju" ::msgcat::mcset pl "Unpublish user mood..." "Anuluj publikacjÄ™ nastroju..." ::msgcat::mcset pl "Unsubscribe" "Anuluj subskrypcjÄ™" ::msgcat::mcset pl "Use connection:" "Użyj połączenia:" ::msgcat::mcset pl "User mood" "Nastrój użytkownika" ::msgcat::mcset pl "User mood publishing failed: %s" "Publikacja nastroju\ użytkownika nie udaÅ‚a siÄ™: %s" ::msgcat::mcset pl "User mood unpublishing failed: %s" "Anulowanie publikacji\ nastroju nie udaÅ‚o siÄ™: %s" ::msgcat::mcset pl "worried" "zmartwiony" # plugins/pep/user_tune.tcl ::msgcat::mcset pl "\n\tTune: %s - %s" "\n\tMelodia: %s - %s" ::msgcat::mcset pl "\n\tUser tune subscription: %s" "\n\tSubskrypcja melodii\ użytkownika: %s" ::msgcat::mcset pl "%s's tune changed to %s - %s" "%s zmieniÅ‚ melodiÄ™ na %s -\ %s" ::msgcat::mcset pl "%s's tune has stopped playing" "Odtwarzanie melodii %s\ zostaÅ‚o zatrzymane" ::msgcat::mcset pl "%s's tune is unset" "Użytkownik %s nie ustawiÅ‚ melodii" ::msgcat::mcset pl "Artist:" "Artysta:" ::msgcat::mcset pl "Auto-subscribe to other's user tune" "Automatycznie\ subskrybuj melodiÄ™ innego użytkownika" ::msgcat::mcset pl "Auto-subscribe to other's user tune notifications."\ "Automatycznie subskrybuj powiadomienia o melodii innego\ użytkownika." ::msgcat::mcset pl "Length:" "DÅ‚ugość:" ::msgcat::mcset pl "Publish" "Publikuj" ::msgcat::mcset pl "Publish \"playback stopped\" instead" "Publikuj\ \"odtwarzanie zatrzymane\" zamiast tego" ::msgcat::mcset pl "Publish user tune..." "Publikuj melodiÄ™ użytkownika..." ::msgcat::mcset pl "Rating:" "Ocena:" ::msgcat::mcset pl "Source:" "Å»ródÅ‚o:" ::msgcat::mcset pl "Track:" "Åšcieżka:" ::msgcat::mcset pl "Unpublish" "Anuluj publikacjÄ™" ::msgcat::mcset pl "Unpublish user tune" "Anuluj publikacjÄ™ melodii" ::msgcat::mcset pl "Unpublish user tune..." "Anuluj publikacjÄ™ melodii..." ::msgcat::mcset pl "Unpublishing is only possible while being online"\ "Anulowanie publikacji jest możliwe dopiero po nawiÄ…zaniu połączenia" ::msgcat::mcset pl "URI:" "URI:" ::msgcat::mcset pl "User tune" "Melodia użytkownika" ::msgcat::mcset pl "User tune publishing failed: %s" "Publikacja melodii nie\ udaÅ‚a siÄ™: %s" ::msgcat::mcset pl "User tune unpublishing failed: %s" "Anulowanie publikacji\ melodii nie udaÅ‚o siÄ™: %s" # plugins/pep/user_activity.tcl ::msgcat::mcset pl "\n\tActivity: %s" "\n\tCzynność: %s" ::msgcat::mcset pl "\n\tUser activity subscription: %s" "\n\tSubskrypcja\ czynnoÅ›ci użytkownika: %s" ::msgcat::mcset pl "%s's activity changed to %s" "%s zmieniÅ‚ czynność na %s" ::msgcat::mcset pl "%s's activity is unset" "Użytkownik %s nie ustawiÅ‚\ czynnoÅ›ci" ::msgcat::mcset pl "Activity" "Czynność" ::msgcat::mcset pl "Activity:" "Czynność:" ::msgcat::mcset pl "at the spa" "jestem w uzdrowisku" ::msgcat::mcset pl "Auto-subscribe to other's user activity" "Automatycznie\ subskrybuj czynność innego użytkownika" ::msgcat::mcset pl "Auto-subscribe to other's user activity notifications."\ "Automatycznie subskrybuj powiadomienia o czynnoÅ›ci innego\ użytkownika." ::msgcat::mcset pl "brushing teeth" "myjÄ™ zÄ™by" ::msgcat::mcset pl "buying groceries" "kupujÄ™ jedzenie" ::msgcat::mcset pl "Cannot publish empty activity" "Nie można opublikować\ pustej czynnoÅ›ci" ::msgcat::mcset pl "cleaning" "sprzÄ…tam" ::msgcat::mcset pl "coding" "kodujÄ™" ::msgcat::mcset pl "commuting" "w drodze do pracy" ::msgcat::mcset pl "cooking" "gotujÄ™" ::msgcat::mcset pl "cycling" "jeżdżę na rowerze" ::msgcat::mcset pl "day off" "dzieÅ„ wolny" ::msgcat::mcset pl "doing chores" "prace domowe" ::msgcat::mcset pl "doing maintenance" "pielÄ™gnujÄ™ siÄ™" ::msgcat::mcset pl "doing the dishes" "myjÄ™ naczynia" ::msgcat::mcset pl "doing the laundry" "robiÄ™ pranie" ::msgcat::mcset pl "drinking" "pijÄ™" ::msgcat::mcset pl "driving" "jadÄ™ samochodem" ::msgcat::mcset pl "eating" "jem" ::msgcat::mcset pl "exercising" "gimnastykujÄ™ siÄ™" ::msgcat::mcset pl "gaming" "gram" ::msgcat::mcset pl "gardening" "uprawiam ogród" ::msgcat::mcset pl "getting a haircut" "obcinam wÅ‚osy" ::msgcat::mcset pl "going out" "na wychodnym" ::msgcat::mcset pl "grooming" "higiena osobista" ::msgcat::mcset pl "hanging out" "na pogaduszkach" ::msgcat::mcset pl "having a beer" "pijÄ™ piwo" ::msgcat::mcset pl "having a snack" "jem zakÄ…skÄ™" ::msgcat::mcset pl "having appointment" "mam wizytÄ™" ::msgcat::mcset pl "having breakfast" "jem Å›niadanie" ::msgcat::mcset pl "having coffee" "pijÄ™ kawÄ™" ::msgcat::mcset pl "having dinner" "jem kolacjÄ™" ::msgcat::mcset pl "having lunch" "jem obiad" ::msgcat::mcset pl "having tea" "pijÄ™ herbatÄ™" ::msgcat::mcset pl "hiking" "wÄ™drujÄ™" ::msgcat::mcset pl "in a car" "w samochodzie" ::msgcat::mcset pl "in a meeting" "na spotkaniu" ::msgcat::mcset pl "in real life" "żyjÄ™ w rzeczywistoÅ›ci" ::msgcat::mcset pl "inactive" "brak aktywnoÅ›ci" ::msgcat::mcset pl "jogging" "jogging" ::msgcat::mcset pl "on a bus" "jadÄ™ autobusem" ::msgcat::mcset pl "on a plane" "lecÄ™ samolotem" ::msgcat::mcset pl "on a train" "jadÄ™ pociÄ…giem" ::msgcat::mcset pl "on a trip" "w podróży" ::msgcat::mcset pl "on the phone" "przy telefonie" ::msgcat::mcset pl "on vacation" "na wakacjach" ::msgcat::mcset pl "on video phone" "rozmowa wideo" ::msgcat::mcset pl "partying" "imprezujÄ™" ::msgcat::mcset pl "playing sports" "uprawiam sport" ::msgcat::mcset pl "Publish user activity..." "Publikuj czynność\ użytkownika..." ::msgcat::mcset pl "reading" "czytam" ::msgcat::mcset pl "rehearsing" "robiÄ™ próbÄ™" ::msgcat::mcset pl "relaxing" "odpoczywam" ::msgcat::mcset pl "running" "biegam" ::msgcat::mcset pl "running an errand" "biegam z przesyÅ‚kami" ::msgcat::mcset pl "scheduled holiday" "zaplanowane wakacje" ::msgcat::mcset pl "shaving" "golÄ™ siÄ™" ::msgcat::mcset pl "shopping" "robiÄ™ zakupy" ::msgcat::mcset pl "skiing" "jeżdżę na nartach" ::msgcat::mcset pl "sleeping" "Å›piÄ™" ::msgcat::mcset pl "socializing" "udzielam siÄ™ towarzysko" ::msgcat::mcset pl "studying" "studiujÄ™" ::msgcat::mcset pl "Subactivity" "Czynność podrzÄ™dna" ::msgcat::mcset pl "Subactivity:" "Czynność podrzÄ™dna:" ::msgcat::mcset pl "sunbathing" "opalam siÄ™" ::msgcat::mcset pl "swimming" "pÅ‚ywam" ::msgcat::mcset pl "taking a bath" "biorÄ™ kÄ…piel" ::msgcat::mcset pl "taking a shower" "biorÄ™ prysznic" ::msgcat::mcset pl "talking" "rozmawiam" ::msgcat::mcset pl "traveling" "podróżujÄ™" ::msgcat::mcset pl "Unpublish user activity" "Anuluj publikacjÄ™ czynnoÅ›ci" ::msgcat::mcset pl "Unpublish user activity..." "Anuluj publikacjÄ™\ czynnoÅ›ci..." ::msgcat::mcset pl "User activity" "Czynność użytkownika" ::msgcat::mcset pl "User activity publishing failed: %s" "Publikacja\ czynnoÅ›ci nie udaÅ‚a siÄ™: %s" ::msgcat::mcset pl "User activity unpublishing failed: %s" "Anulowanie\ publikacji czynnoÅ›ci nie udaÅ‚o siÄ™: %s" ::msgcat::mcset pl "walking" "spacerujÄ™" ::msgcat::mcset pl "walking the dog" "wyprowadzam psa" ::msgcat::mcset pl "watching a movie" "oglÄ…dam film" ::msgcat::mcset pl "watching tv" "oglÄ…dam tv" ::msgcat::mcset pl "working" "pracujÄ™" ::msgcat::mcset pl "working out" "trenujÄ™" ::msgcat::mcset pl "writing" "piszÄ™" # plugins/general/caps.tcl ::msgcat::mcset pl "Enable announcing entity capabilities in every outgoing\ presence." "Włącz rozgÅ‚aszanie wÅ‚asnych możliwoÅ›ci w każdej\ wychodzÄ…cej informacji o statusie." ::msgcat::mcset pl "Options for entity capabilities plugin." "Ustawenia\ wtyczki rozgÅ‚aszania wÅ‚asnych możliwoÅ›ci." ::msgcat::mcset pl "Use the specified function to hash supported features\ list." "Użyj wybranej funkcji do utworzenia skrótu listy\ obsÅ‚ugiwanych cech." # plugins/iq/time2.tcl ::msgcat::mcset pl "Reply to entity time (urn:xmpp:time) requests." "WysyÅ‚aj\ odpowiedzi na zapytanie o wÅ‚asny czas (urn:xmpp:time)." # plugins/pep/user_location.tcl ::msgcat::mcset pl "\n\tLocation: %s : %s" "\n\tLokalizacja: %s : %s" ::msgcat::mcset pl "\n\tUser location subscription: %s" "\n\tSubskrypcja\ lokalizacji użytkownika: %s" ::msgcat::mcset pl "%s's location changed to %s : %s" "Lokalizacja\ użytkownika %s zmieniÅ‚a siÄ™ na %s : %s" ::msgcat::mcset pl "%s's location is unset" "Użytkownik %s nie ustawiÅ‚\ lokalizacji" ::msgcat::mcset pl "Altitude:" "Wysokość:" ::msgcat::mcset pl "Area:" "Strefa:" ::msgcat::mcset pl "Auto-subscribe to other's user location" "Automatycznie\ subskrybuj lokalizacjÄ™ innego użytkownika" ::msgcat::mcset pl "Auto-subscribe to other's user location notifications."\ "Automatycznie subskrybuj powiadomienia o lokalizacji innego\ użytkownika." ::msgcat::mcset pl "Bearing:" "Namiar:" ::msgcat::mcset pl "Building:" "Budynek:" ::msgcat::mcset pl "Floor:" "PiÄ™tro:" ::msgcat::mcset pl "GPS datum:" "UkÅ‚ad odniesienia GPS:" ::msgcat::mcset pl "Horizontal GPS error:" "Błąd horyzontalny GPS:" ::msgcat::mcset pl "Locality:" "Miejscowość:" ::msgcat::mcset pl "Postal code:" "Kod pocztowy:" ::msgcat::mcset pl "Publish user location..." "Publikuj swojÄ… lokalizacjÄ™..." ::msgcat::mcset pl "Region:" "Region:" ::msgcat::mcset pl "Room:" "Pokój:" ::msgcat::mcset pl "Speed:" "PrÄ™dkość:" ::msgcat::mcset pl "Street:" "Ulica:" ::msgcat::mcset pl "Timestamp:" "Zmacznik czasu:" ::msgcat::mcset pl "Unpublish user location" "Anuluj publikacjÄ™ swojej\ lokalizacji" ::msgcat::mcset pl "Unpublish user location..." "Anuluj publikacjÄ™ swojej\ lokalizacji..." ::msgcat::mcset pl "User location" "Lokalizacja użytkownika" ::msgcat::mcset pl "User location publishing failed: %s" "Publikacja\ lokalizacji nie udaÅ‚a siÄ™: %s" ::msgcat::mcset pl "User location unpublishing failed: %s" "Anulowanie\ publikacji lokalizacji nie udaÅ‚o siÄ™: %s" # plugins/roster/bkup_annotations.tcl ::msgcat::mcset pl "Error restoring annotations: %s" "Błąd podczas\ przywracania notatek: %s" # plugins/roster/bkup_conferences.tcl ::msgcat::mcset pl "Error restoring conference bookmarks: %s" "Błąd podczas\ przywracania zakÅ‚adek z konferencjami: %s" # plugins/roster/bkup_metacontacts.tcl ::msgcat::mcset pl "Error restoring metacontacts: %s" "Błąd podczas\ przywracania metakontaktów: %s" # plugins/roster/backup.tcl ::msgcat::mcset pl "Error importing roster contacts: %s" "Błąd podczas\ importu listy kontaktów: %s" ::msgcat::mcset pl "Export roster" "Eksport listy kontaktów" ::msgcat::mcset pl "Export roster for %s..." "Eksport listy kontaktów dla\ %s..." ::msgcat::mcset pl "Import roster" "Import listy kontaktów" ::msgcat::mcset pl "Import roster for %s..." "Import listy kontaktów dla\ %s..." ::msgcat::mcset pl "Roster files" "Pliki listy kontaktów" ::msgcat::mcset pl "Roster import for %s is completed" "Import listy\ kontaktów dla %s zakoÅ„czony" # plugins.tcl ::msgcat::mcset pl "External plugins options." "Ustawienia zewnÄ™trznych\ wtyczek." ::msgcat::mcset pl "Loading and unloading external plugins." "Åadowanie i\ usuwanie zewnÄ™trznych wtyczek." # plugins/general/geometry.tcl ::msgcat::mcset pl "Stored main window geometry" "Zapisano geometriÄ™ głównego\ okna" ::msgcat::mcset pl "Stored main window geometry in non-tabbed mode" "Zapisano\ geometriÄ™ głównego okna w trybie bez kart" ::msgcat::mcset pl "Stored main window state (normal or zoomed) in non-tabbed\ mode" "Zapisano stan (normalne lub zmaksymalizowane) głównego okna w\ trybie bez kart" # plugins/roster/metacontacts.tcl ::msgcat::mcset pl "Are you sure to delete %s's metacontact?" "Czy na pewno\ usunąć metakontakt %s?" ::msgcat::mcset pl "Are you sure to delete metacontact?" "Czy na pewno usunąć\ metakontakt?" ::msgcat::mcset pl "Create metacontact" "Utwórz metakontakt" ::msgcat::mcset pl "Delete metacontact" "UsuÅ„ metakontakt" ::msgcat::mcset pl "Delete metacontact..." "UsuÅ„ metakontakt..." ::msgcat::mcset pl "Edit %s's Metacontact" "Edytuj metakontakt %s" ::msgcat::mcset pl "Edit Metacontact" "Edytuj metakontakt" ::msgcat::mcset pl "Edit metacontact" "Edytuj metakontakt" ::msgcat::mcset pl "Metacontact" "Metakontakt" ::msgcat::mcset pl "Remove from metacontact" "UsuÅ„ z metakontaktu" ::msgcat::mcset pl "Storing roster metacontacts failed: %s" "Zapisanie\ metakontaktów nie powiodÅ‚o siÄ™: %s" # proxy.tcl ::msgcat::mcset pl "Add proxy" "Dodaj proxy" ::msgcat::mcset pl "Exclude:" "WyjÄ…tki:" ::msgcat::mcset pl "HTTP" "HTTP" ::msgcat::mcset pl "HTTP proxies" "Serwery proxy HTTP" ::msgcat::mcset pl "Manage proxy servers" "ZarzÄ…dzaj serwerami proxy" ::msgcat::mcset pl "Match:" "Ustaw proxy dla:" ::msgcat::mcset pl "Save" "Zapisz" ::msgcat::mcset pl "Serialized array of proxy servers to connect via."\ "Serializowana tablica serwerów proxy przez które można siÄ™ łączyć." ::msgcat::mcset pl "Tunnel proxies" "Proxy tunelowane" # plugins/chat/irc_commands.tcl ::msgcat::mcset pl "Already joined" "Już dołączono" # --------------------------- tclxmpp package -------------------------------- # tclxmpp/xmpp/roster.tcl ::msgcat::mcset pl "Illegal option \"%s\"" "NieprawidÅ‚owa opcja \"%s\"" # tclxmpp/xmpp/starttls.tcl ::msgcat::mcset pl "Server hasn't provided STARTTLS feature" "Serwer nie\ oferuje mechanizmu STARTTLS" ::msgcat::mcset pl "STARTTLS aborted" "STARTTLS zostaÅ‚o przerwane" ::msgcat::mcset pl "STARTTLS failed" "STARTTLS nie powiodÅ‚o siÄ™" ::msgcat::mcset pl "STARTTLS successful" "STARTTLS powiodÅ‚o siÄ™" ::msgcat::mcset pl "STARTTLS timed out" "Przekroczono czas oczekiwania na\ STARTTLS" # tclxmpp/xmpp/component.tcl ::msgcat::mcset pl "Component handshake aborted" "Wymiana potwierdzeÅ„ dla\ komponentu zostaÅ‚a przerwana" ::msgcat::mcset pl "Component handshake failed" "Wymiana potwierdzeÅ„ dla\ komponentu nie powiodÅ‚a siÄ™" ::msgcat::mcset pl "Component handshake succeeded" "Wymiana potwierdzeÅ„ dla\ komponentu powiodÅ‚a siÄ™" ::msgcat::mcset pl "Component handshake timed out" "Przekroczono czas\ oczekiwania na wymianÄ™ potwierdzeÅ„ dla komponentu" ::msgcat::mcset pl "Missing option \"%s\"" "BrakujÄ…ca opcja \"%s\"" ::msgcat::mcset pl "Waiting for component handshake result" "Oczekiwanie na\ wynik wymiany potwierdzeÅ„ dla komponentu" # tclxmpp/xmpp/pconnect.tcl ::msgcat::mcset pl "Cannot connect to %s:%s" "Nie można połączyć siÄ™ z %s:%s" ::msgcat::mcset pl "Cannot connect to proxy %s:%s" "Nie można połączyć siÄ™ z\ proxy %s:%s" ::msgcat::mcset pl "Connection aborted" "Połączenie zostaÅ‚o przerwane" ::msgcat::mcset pl "Connection to proxy aborted" "Połączenie z proxy zostaÅ‚o\ przerwane" ::msgcat::mcset pl "IPv6 support is not available" "Nie jest dostÄ™pna obsÅ‚uga\ protokoÅ‚u IPv6" ::msgcat::mcset pl "Options \"-host\" and \"-port\" are required" "Opcje\ \"-host\" i \"-port\" sÄ… wymagane" ::msgcat::mcset pl "Unsupported proxy \"%s\"" "NieobsÅ‚ugiwany serwer proxy\ \"%s\"" # tclxmpp/xmpp/compress.tcl ::msgcat::mcset pl "Compression aborted" "Kompresja strumienia zostaÅ‚a\ przerwana" ::msgcat::mcset pl "Compression negotiation failed" "Uzgadnianie metody\ kompresji nie powiodÅ‚o siÄ™" ::msgcat::mcset pl "Compression negotiation successful" "Uzgadnianie metody\ kompresji powiodÅ‚o siÄ™" ::msgcat::mcset pl "Compression setup failed" "Ustawienie kompresji nie\ powiodÅ‚o siÄ™" ::msgcat::mcset pl "Compression timed out" "Kompresja strumienia straciÅ‚a\ ważność" ::msgcat::mcset pl "Server hasn't provided compress feature" "Serwer nie\ obsÅ‚uguje kompresji strumienia" ::msgcat::mcset pl "Server hasn't provided supported compress method" "Serwer\ nie oferuje obsÅ‚ugiwanej metody kompresji strumienia" ::msgcat::mcset pl "Unsupported compression method" "NieobsÅ‚ugiwana metoda\ kompresji" # tclxmpp/xmpp/streamerror.tcl ::msgcat::mcset pl "Bad format" "ZÅ‚y format" ::msgcat::mcset pl "Bad namespace prefix" "ZÅ‚y prefiks przestrzeni nazw" ::msgcat::mcset pl "Connection timeout" "Przekroczono czas oczekiwania na\ połączenie" ::msgcat::mcset pl "Host gone" "Serwer nie istnieje" ::msgcat::mcset pl "Host unknown" "Nieznany serwer" ::msgcat::mcset pl "Improper addressing" "Nieodpowiednia adresacja" ::msgcat::mcset pl "Invalid from" "NieprawidÅ‚owy nadawca" ::msgcat::mcset pl "Invalid ID" "NieprawidÅ‚owy ID" ::msgcat::mcset pl "Invalid namespace" "NieprawidÅ‚owa przestrzeÅ„ nazw" ::msgcat::mcset pl "Invalid XML" "NieprawidÅ‚owy XML" ::msgcat::mcset pl "Policy violation" "Naruszenie polityki bezpieczeÅ„stwa" ::msgcat::mcset pl "Remote connection failed" "Zdalne połączenie nie powiodÅ‚o\ siÄ™" ::msgcat::mcset pl "Resource constraint" "Ograniczenie zasobów" ::msgcat::mcset pl "Restricted XML" "Ograniczony XML" ::msgcat::mcset pl "See other host" "Sprawdź inny serwer" ::msgcat::mcset pl "Stream error" "Błąd strumienia" ::msgcat::mcset pl "Stream error (%s)" "Błąd strumienia (%s)" ::msgcat::mcset pl "Stream error (%s): %s" "Błąd strumienia (%s): %s" ::msgcat::mcset pl "Stream error: %s" "Błąd strumienia: %s" ::msgcat::mcset pl "System shutdown" "Wyłączenie systemu" ::msgcat::mcset pl "Unsupported encoding" "NieobsÅ‚ugiwane kodowanie" ::msgcat::mcset pl "Unsupported stanza type" "NieobsÅ‚ugiwany typ zwrotki" ::msgcat::mcset pl "Unsupported version" "NieobsÅ‚ugiwana wersja" ::msgcat::mcset pl "XML not well-formed" "Źle sformatowany XML" # tclxmpp/xmpp/iq.tcl ::msgcat::mcset pl "Illegal IQ type \"%s\"" "NieprawidÅ‚owy typ IQ \"%s\"" # tclxmpp/xmpp/xmpp.tcl ::msgcat::mcset pl "An existing variable \"%s\" cannot be used as an XMPP\ token" "IstniejÄ…ca zmienna \"%s\" nie może zostać użyta jako token\ XMPP" ::msgcat::mcset pl "Free without disconnect" "Zwolnij bez rozłączenia" ::msgcat::mcset pl "IQ %s timed out" "Przekroczono czas oczekiwania na IQ %s" ::msgcat::mcset pl "IQ id %s doesn't exist in memory" "IQ o id %s nie\ istnieje w pamiÄ™ci" ::msgcat::mcset pl "IQ id doesn't exists in memory" "IQ id nie istnieje w\ pamiÄ™ci" ::msgcat::mcset pl "Opening stream aborted" "Przerwano otwieranie strumienia" ::msgcat::mcset pl "Opening stream timed out" "Przkeroczono czas oczekiwania\ na otwarcie strumienia" ::msgcat::mcset pl "Option \"-command\" is illegal for IQ type \"%s\"" "Opcja\ \"-command\" jest nieprawidÅ‚owa dla typu IQ \"%s\"" ::msgcat::mcset pl "Unknown IQ type \"%s\"" "Nieznany typ IQ \"%s\"" ::msgcat::mcset pl "Unknown message type %s" "Nieznany typ wiadomoÅ›ci %s" ::msgcat::mcset pl "Unsupported stream XMLNS \"%s\"" "NieobsÅ‚ugiwana wartość\ XMLNS \"%s\" dla strumienia" ::msgcat::mcset pl "Usage: ::xmpp::Set xlib property ?value?" "Użycie:\ ::xmpp::Set xlib property ?value?" # tclxmpp/xmpp/transport.tcl ::msgcat::mcset pl "Can't switch transport to \"%s\": %s" "Nie można\ przełączyć transportu na \"%s\": %s" ::msgcat::mcset pl "Illegal command \"%s\"" "NieprawidÅ‚owe polecenie \"%s\"" ::msgcat::mcset pl "Transport \"%s\" already registered" "Transport \"%s\"\ jest już zarejestrowany" ::msgcat::mcset pl "Unknown transport \"%s\"" "Nieznany transport \"%s\"" # tclxmpp/xmpp/auth.tcl ::msgcat::mcset pl "Illegal value \"%s\" for option \"%s\"" "NieprawidÅ‚owa\ wartość \"%s\" dla opcji \"%s\"" ::msgcat::mcset pl "Non-SASL authentication aborted" "Uwierzytelnianie\ Non-SASL zostaÅ‚o przerwane" ::msgcat::mcset pl "Non-SASL authentication failed" "Uwierzytelnianie\ Non-SASL nie powiodÅ‚o siÄ™" ::msgcat::mcset pl "Non-SASL authentication succeeded" "Uwierzytelnianie\ Non-SASL powiodÅ‚o siÄ™" ::msgcat::mcset pl "Non-SASL authentication timed out" "Przekroczono czas\ oczekiwania na uwierzytelnianie Non-SASL" ::msgcat::mcset pl "Server doesn't support digest non-SASL authentication"\ "Serwer nie obsÅ‚uguje uwierzytelniania Non-SASL typu digest" ::msgcat::mcset pl "Server doesn't support plaintext non-SASL authentication"\ "Serwer nie obsÅ‚uguje uwierzytelniania Non-SASL zwykÅ‚ym tekstem" ::msgcat::mcset pl "Server doesn't support plaintext or digest non-SASL\ authentication" "Serwer nie obsÅ‚uguje uwierzytelniania Non-SASL typu\ digest i zwykÅ‚ym tekstem" ::msgcat::mcset pl "Server hasn't provided non-SASL authentication feature"\ "Serwer nie udostÄ™pnia uwierzytelniania Non-SASL" ::msgcat::mcset pl "Waiting for non-SASL authentication fields" "Oczekiwanie\ na atrybuty uwierzytelniania non-SASL" ::msgcat::mcset pl "Waiting for non-SASL authentication results" "Oczekiwanie\ na wyniki uwierzytelniania non-SASL" # tclxmpp/xmpp/tls.tcl ::msgcat::mcset pl "TLS handshake failed: %s" "Wymiana potwierdzeÅ„ TLS nie\ powiodÅ‚a siÄ™: %s" # tclxmpp/xmpp/xml.tcl ::msgcat::mcset pl "Illegal attribute \"xmlns\". Use -xmlns option"\ "NieprawidÅ‚owy atrybut \"xmlns\". Użyj opcji -xmlns" ::msgcat::mcset pl "Invalid option \"%s\"" "NieprawidÅ‚owa opcja \"%s\"" ::msgcat::mcset pl "Parser \"%s\" doesn't exist" "Parser \"%s\" nie istnieje" # tclxmpp/xmpp/sasl.tcl ::msgcat::mcset pl "Authentication error" "Błąd uwierzytelniania" ::msgcat::mcset pl "Authentication failed" "Uwierzytelnianie nie powiodÅ‚o\ siÄ™" ::msgcat::mcset pl "Authentication succeeded" "Uwierzytelnianie powiodÅ‚o siÄ™" ::msgcat::mcset pl "Cannot forbid digest mechanisms" "Nie można zabronić\ mechanizmów digest" ::msgcat::mcset pl "Incorrect encoding" "Niepoprawne kodowanie" ::msgcat::mcset pl "Invalid authzid" "Niepoprawne authzid" ::msgcat::mcset pl "Invalid mechanism" "NieprawidÅ‚owy mechanizm" ::msgcat::mcset pl "Mechanism too weak" "Mechanizm zbyt sÅ‚aby" ::msgcat::mcset pl "Missing option \"-username\" or \"-domain\"" "BrakujÄ…ca\ opcja \"-username\" lub \"-domain\"" ::msgcat::mcset pl "No SASL package found" "Nie znaleziono pakietu SASL" ::msgcat::mcset pl "Only one option \"-username\" or \"-domain\" is allowed"\ "Tylko jedna z opcji \"-username\" lub \"-domain\" jest dozwolona" ::msgcat::mcset pl "SASL auth error:\n%s" "Błąd uwierzytelniania SASL:\n%s" ::msgcat::mcset pl "SASL authentication aborted" "Uwierzytelnianie SASL\ zostaÅ‚o przerwane" ::msgcat::mcset pl "SASL authentication timed out" "Przekroczono czas\ oczekiwania na uwierzytelnianie SASL" ::msgcat::mcset pl "SASL callback error: client needs to write \"%s\"" "Błąd\ zwrotny SASL: klient musi zapisać \"%s\"" ::msgcat::mcset pl "SASL step error: %s" "BÅ‚ad kroku SASL: %s" ::msgcat::mcset pl "Server hasn't provided SASL authentication feature"\ "Serwer nie udostÄ™pnia uwierzytelniania SASL" ::msgcat::mcset pl "Server provided mechanism %s. It is forbidden" "Serwer\ udostÄ™pnia mechanizm %s. Nie jest on dozwolony" ::msgcat::mcset pl "Server provided mechanisms %s. They are forbidden"\ "Server udostÄ™pnia mechanizmy %s. Nie sÄ… one dozwolone" ::msgcat::mcset pl "Server provided no SASL mechanisms" "Serwer nie\ udostÄ™pnia mechanizmów SASL" ::msgcat::mcset pl "Temporary auth failure" "Tymczasowy błąd\ uwierzytelniania" # tclxmpp/xmpp/https.tcl ::msgcat::mcset pl "HTTPS proxy negotiation aborted" "Uzgadanianie proxy\ HTTPS zostaÅ‚o przerwane" ::msgcat::mcset pl "HTTPS proxy negotiation timeout" "Przekroczono czas\ oczekiwania na uzgadnianie proxy HTTPS" # tclxmpp/xmpp/stanzaerror.tcl ::msgcat::mcset pl "Access Error" "Błąd dostÄ™pu" ::msgcat::mcset pl "Address Error" "Błąd adresu" ::msgcat::mcset pl "Application Error" "Błąd aplikacji" ::msgcat::mcset pl "Bad request" "Błędne żądanie" ::msgcat::mcset pl "Conflict" "Konflikt" ::msgcat::mcset pl "Feature not implemented" "WÅ‚aÅ›ciwość niezaimplementowana" ::msgcat::mcset pl "Forbidden" "DostÄ™p zabroniony" ::msgcat::mcset pl "Format Error" "Błąd formatu" ::msgcat::mcset pl "Gone" "Obiekt zmieniÅ‚ adres" ::msgcat::mcset pl "Internal server error" "WewnÄ™trzny błąd serwera" ::msgcat::mcset pl "Item not found" "Element nie znaleziony" ::msgcat::mcset pl "JID malformed" "NieprawidÅ‚owy JID" ::msgcat::mcset pl "Not acceptable" "Nie zaakceptowane" ::msgcat::mcset pl "Not allowed" "Brak dostÄ™pu" ::msgcat::mcset pl "Not Found" "Nie znaleziono" ::msgcat::mcset pl "Not Implemented" "Nie zaimplementowano" ::msgcat::mcset pl "Payment required" "Wymagana opÅ‚ata" ::msgcat::mcset pl "Recipient Error" "Błąd odbiorcy" ::msgcat::mcset pl "Recipient unavailable" "Odbiorca niedostÄ™pny" ::msgcat::mcset pl "Redirect" "Przekierowanie" ::msgcat::mcset pl "Registration required" "Wymagana rejestracja" ::msgcat::mcset pl "Remote Server Error" "Błąd zdalnego serwera" ::msgcat::mcset pl "Remote server not found" "Nie znaleziono serwera" ::msgcat::mcset pl "Remote server timeout" "Przekroczono czas oczekiwania na\ odpowiedź serwera" ::msgcat::mcset pl "Request error" "Błąd żądania" ::msgcat::mcset pl "Request Timeout" "UpÅ‚ynaÅ‚ czas oczekiwania na odpowiedź" ::msgcat::mcset pl "Server Error" "Błąd serwera" ::msgcat::mcset pl "Service unavailable" "UsÅ‚uga niedostÄ™pna" ::msgcat::mcset pl "Subscription required" "Wymagana subskrypcja" ::msgcat::mcset pl "Temporary error" "Błąd tymczasowy" ::msgcat::mcset pl "Unauthorized" "Nie upoważniono" ::msgcat::mcset pl "Undefined condition" "Niezdefinowany warunek" ::msgcat::mcset pl "Unexpected request" "Nieoczekiwane żądanie" ::msgcat::mcset pl "Unrecoverable error" "Błąd nienaprawialny" ::msgcat::mcset pl "Username Not Available" "Nie znaleziono użytkownika" ::msgcat::mcset ru "Not authorized" "Brak autoryzacji" # tclxmpp/xmpp/register.tcl ::msgcat::mcset pl "Date" "Data" ::msgcat::mcset pl "First name" "ImiÄ™" ::msgcat::mcset pl "Key" "Klucz" ::msgcat::mcset pl "Last name" "Nazwisko" ::msgcat::mcset pl "Misc" "Różne" ::msgcat::mcset pl "Password" "HasÅ‚o" ::msgcat::mcset pl "Phone" "Telefon" ::msgcat::mcset pl "Text" "Text" ::msgcat::mcset pl "Username" "Nazwa użytkownika" ::msgcat::mcset pl "Zip" "Kod pocztowy" # tclxmpp/xmpp/socks5.tcl ::msgcat::mcset pl "Address type not supported" "NieobsÅ‚ugiwany typ adresu" ::msgcat::mcset pl "Command not supported" "NieobsÅ‚ugiwane polecenie" ::msgcat::mcset pl "Connection not allowed by ruleset" "Połączenie\ zablokowane przez zestaw reguÅ‚" ::msgcat::mcset pl "Failed to read SOCKS5 authorization methods response"\ "Nie udaÅ‚o siÄ™ odczytać odpowiedzi o metodach uwierzytelniania\ SOCKS5" ::msgcat::mcset pl "Failed to read SOCKS5 authorization response" "Nie udaÅ‚o\ siÄ™ odczytać odpowiedzi o uwierzytelnieniu SOCKS5" ::msgcat::mcset pl "Failed to read SOCKS5 connection response" "Nie udaÅ‚o siÄ™\ odczytać odpowiedzi o połączeniu SOCKS5" ::msgcat::mcset pl "Failed to read SOCKS5 destination address type" "Nie\ udaÅ‚o siÄ™ odczytać typu adresu docelowego SOCKS5" ::msgcat::mcset pl "Failed to read SOCKS5 destination domain" "Nie udaÅ‚o siÄ™\ odczytać domeny docelowej SOCKS5" ::msgcat::mcset pl "Failed to read SOCKS5 destination domain length" "Nie\ udaÅ‚o siÄ™ odczytać dÅ‚ugoÅ›ci domeny docelowej SOCKS5" ::msgcat::mcset pl "Failed to read SOCKS5 destination IPv4 address and port"\ "Nie udaÅ‚o siÄ™ odczytać adresu IPv4 i portu docelowego SOCKS5" ::msgcat::mcset pl "Failed to read SOCKS5 destination IPv6 address and port"\ "Nie udaÅ‚o siÄ™ odczytać adresu IPv6 i portu docelowego SOCKS5" ::msgcat::mcset pl "Failed to read SOCKS5 destination port" "Nie udaÅ‚o siÄ™\ odczytać portu docelowego SOCKS5" ::msgcat::mcset pl "Failed to send SOCKS5 authorization methods request" "Nie\ udaÅ‚o siÄ™ wysÅ‚ać żądania metod uwierzytelniania SOCKS5" ::msgcat::mcset pl "Failed to send SOCKS5 authorization request" "Nie udaÅ‚o\ siÄ™ wysÅ‚ać żądania uwierzytelnienia SOCKS5" ::msgcat::mcset pl "Failed to send SOCKS5 connection request" "Nie udaÅ‚o siÄ™\ wysÅ‚ać żądania połączenia SOCKS5" ::msgcat::mcset pl "General SOCKS server failure" "Błąd ogólny serwera SOCKS" ::msgcat::mcset pl "Incorrect SOCKS5 server version" "NieprawidÅ‚owa wersja\ serwera SOCKS5" ::msgcat::mcset pl "SOCKS5 negotiation timed out" "UpÅ‚ynaÅ‚ czas negocjacji\ połączenia SOCKS5" ::msgcat::mcset pl "SOCKS5 proxy negotiation aborted" "Negocjowanie proxy\ SOCKS5 zostaÅ‚o anulowane" ::msgcat::mcset pl "SOCKS5 server authorization failed" "Uwierzytelnianie na\ serwerze SOCKS5 nie powiodÅ‚o siÄ™" ::msgcat::mcset pl "SOCKS5 server authorization required" "Wymagane\ uwierzytelnianie na serwerze SOCKS5" ::msgcat::mcset pl "Unknown SOCKS5 destination address type" "Nieznany typ\ adresu przeznaczenia SOCKS5" ::msgcat::mcset pl "Unsupported SOCKS5 authorization method" "NieobsÅ‚ugiwana\ metoda uwierzytelniania SOCKS5" # tclxmpp/xmpp/pconnect.tcl ::msgcat::mcset pl "Connection timed out" "UpÅ‚ynÄ…Å‚ czas ważnoÅ›ci połączenia" ::msgcat::mcset pl "Connection via proxy aborted" "Połączenie przez proxy\ zostaÅ‚o przerwane" ::msgcat::mcset pl "Connection via proxy timed out" "UpÅ‚ynÄ…Å‚ czas ważnoÅ›ci\ połączenia przez proxy" ::msgcat::mcset pl "Options \"-host\" and \"-port\" are required (or your\ proxy filter hasn't returned them)" "Opcje \"-host\" i \"-port\" sÄ…\ wymagane (lub filtr proxy nie zwraca ich)" # tclxmpp/xmpp/https.tcl ::msgcat::mcset pl "Failed to connect to HTTPS proxy" "Nie udaÅ‚o siÄ™\ połączenie z proxy HTTPS" ::msgcat::mcset pl "HTTPS proxy negotiation timed out" "UpÅ‚ynaÅ‚ czas\ negocjacji połączenia proxy HTTPS" # tclxmpp/xmpp/socks4.tcl ::msgcat::mcset pl "Client's identd could not confirm the userid" "UsÅ‚uga\ identd po stronie klienta nie może potwierdzić id użytkownika" ::msgcat::mcset pl "Failed to read SOCKS4a destination address" "Nie udaÅ‚o\ siÄ™ odczytać adresu docelowego SOCKS4a" ::msgcat::mcset pl "Failed to read SOCKS4a response" "Nie udaÅ‚o siÄ™ odczytać\ odpowiedzi SOCKS4a" ::msgcat::mcset pl "Failed to send SOCKS4a request" "Nie udaÅ‚o siÄ™ wysÅ‚ać\ żądania SOCKS4a" ::msgcat::mcset pl "Incorrect SOCKS4a server version" "NieprawidÅ‚owa wersja\ serwera SOCKS4a" ::msgcat::mcset pl "Request rejected or failed" "Żądanie nie powiodÅ‚o siÄ™ lub\ zostaÅ‚o odrzucone" ::msgcat::mcset pl "Server cannot reach client's identd" "Serwer nie może siÄ™\ połączyć z usÅ‚ugÄ… identd u klienta" ::msgcat::mcset pl "SOCKS4a proxy negotiation aborted" "Negocjowanie proxy\ SOCKS4a zostaÅ‚o anulowane" ::msgcat::mcset pl "SOCKS4a proxy negotiation timed out" "UpÅ‚ynaÅ‚ czas\ negocjacji połączenia SOCKS4a" ::msgcat::mcset pl "Unknown SOCKS4a server error" "Nieznany błąd serwera\ SOCKS4a" # tclxmpp/xmpp/blocking.tcl ::msgcat::mcset pl "Nothing to block" "Brak elementów do zablokowania" # tclxmpp/xmpp/muc.tcl ::msgcat::mcset pl "Already joining" ::msgcat::mcset pl "Disconnected from the room" ::msgcat::mcset pl "Empty nickname" ::msgcat::mcset pl "Illegal nickname" ::msgcat::mcset pl "Leaving room" ::msgcat::mcset pl "MUC room JID \"%s\" is malformed" ::msgcat::mcset pl "MUC room JID must have empty resource part. The specified\ JID was \"%s\"" ::msgcat::mcset pl "MUC token doesn't exist" ::msgcat::mcset pl "Must join room first" ::msgcat::mcset pl "Nickname didn't change" ::msgcat::mcset pl "Nickname is changing already" ::msgcat::mcset pl "The room isn't joined yet" ::msgcat::mcset pl "User is not banned" # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/msgs/pl.rc000064400000000000000000000025701477701321300137670ustar00nobodynobody! pl.rc -- ! ! Definition of Polish resources for BWidget ! ! Author: Irek Chmielowiec ! --- symbolic names of buttons ----------------------------------------------- *abortName: Przerwij *retryName: Ponów *ignoreName: Ignoruj *okName: OK *cancelName: Anuluj *yesName: Tak *noName: Nie ! --- symbolic names of label of SelectFont dialog ---------------------------- *boldName: Pogrubienie *italicName: Kursywa *underlineName: PodkreÅ›lenie *overstrikeName: PrzekreÅ›lenie *fontName: &Nazwa *sizeName: &Rozmiar *styleName: &Styl ! --- symbolic names of label of PasswdDlg dialog ----------------------------- *loginName: &Użytkownik *passwordName: &HasÅ‚o ! --- resource for SelectFont dialog ------------------------------------------ *SelectFont.title: Wybór czcionki *SelectFont.sampletext: PrzykÅ‚adowy tekst, ĄąĘęĆćÅłŃńÓ󯿏ź ! --- resource for MessageDlg dialog ------------------------------------------ *MessageDlg.noneTitle: Wiadomość *MessageDlg.infoTitle: Informacja *MessageDlg.questionTitle: Pytanie *MessageDlg.warningTitle: Ostrzeżenie *MessageDlg.errorTitle: Błąd ! --- resource for PasswdDlg dialog ------------------------------------------- *PasswdDlg.title: Podaj nazwÄ™ użytkownika i hasÅ‚o ! vim:ft=xdefaults:ts=8:sw=4:sts=4:et tkabber/msgs/pt.msg000064400000000000000000001515501477701321300141640ustar00nobodynobody# pt.msg -- # # Portuguese messages for the Tkabber XMPP client. # # Author: Miguel # avatars.tcl ::msgcat::mcset pt "No avatar to store" "Não existem avatares para guardar" # browser.tcl ::msgcat::mcset pt "%s: %s/%s, Description: %s, Version: %s\nNumber of\ children: %s" "%s: %s/%s, Descrição: %s, Versão: %s\nNúmero de\ filhos: %s" ::msgcat::mcset pt "Add Group..." "Adicionar grupo..." ::msgcat::mcset pt "Browse" "Explorar" ::msgcat::mcset pt "Browse error: %s" "Erro ao explorar: %s" ::msgcat::mcset pt "JBrowser" "Explorador Jabber" ::msgcat::mcset pt "JID:" "JID:" ::msgcat::mcset pt "Join Group Chat..." "Entrar em grupo de conversa..." ::msgcat::mcset pt "List of browsed JIDs." "Lista de JIDs explorados." # chats.tcl ::msgcat::mcset pt ">>> Unable to decipher data: %s <<<" ">>> Não foi\ possível decifrar os dados: %s <<<" ::msgcat::mcset pt "Chat with %s" "Conversar com %s" ::msgcat::mcset pt "Default message type (if not specified explicitly)."\ "Tipo de mensagem por omissão(se não for explicitamente indicado)." ::msgcat::mcset pt "Disconnected" "Desligado" ::msgcat::mcset pt "Display description of user status in chat windows."\ "Mostrar descrição do estado do utilizador na janela de conversa." ::msgcat::mcset pt "Error %s" "Erro %s" ::msgcat::mcset pt "Error %s: %s" "Erro %s: %s" ::msgcat::mcset pt "Invite" "Convidar" ::msgcat::mcset pt "Invite %s to conferences" "Convidar %s para conferência" ::msgcat::mcset pt "Invite users to %s" "Convidar utilizadores para %s" ::msgcat::mcset pt "Invite users..." "Convidar utilizadores..." ::msgcat::mcset pt "No conferences in progress..." "Não existem conferências\ em curso..." ::msgcat::mcset pt "Normal" "Normal" ::msgcat::mcset pt "Please join %s" "Por favor, junta-te a %s" ::msgcat::mcset pt "Send custom presence" "Enviar presença personalizada" ::msgcat::mcset pt "Subject:" "Assunto:" ::msgcat::mcset pt "To:" "Para:" ::msgcat::mcset pt "Toggle encryption" "Activar/Desactivar encriptação" # custom.tcl ::msgcat::mcset pt "/me has changed the subject to: %s" "/me mudou o tema\ para: %s" ::msgcat::mcset pt "Chat options." "Opções de conversa." ::msgcat::mcset pt "Customization of the One True Jabber Client."\ "Configuração do Verdadeiro Cliente de Jabber." ::msgcat::mcset pt "Enable chat window autoscroll only when last message is\ shown." "Activar autoscroll na janela apenas quando for mostrada a\ última mensagem" ::msgcat::mcset pt "Enable messages emphasize." "Activar ênfase das\ mensagens." ::msgcat::mcset pt "Moderators" "Moderadores" ::msgcat::mcset pt "Open" "Abrir" ::msgcat::mcset pt "Parent group:" "Grupo pai:" ::msgcat::mcset pt "Parent groups:" "Grupos pai:" ::msgcat::mcset pt "Participants" "Participantes" ::msgcat::mcset pt "Reset to Current" "Restabelecer para valor actual" ::msgcat::mcset pt "Reset to Default" "Restabelecer para valor por omissão" ::msgcat::mcset pt "Reset to Saved" "Restabelecer para valor guardado" ::msgcat::mcset pt "Set for Current Session" "Activar para a sessão actual" ::msgcat::mcset pt "Set for Future Sessions" "Activar para sessões futuras" ::msgcat::mcset pt "State" "Estado" ::msgcat::mcset pt "Stop chat window autoscroll." "Desactivar o autoscroll da\ janela de conversa." ::msgcat::mcset pt "this option has been set and saved." "esta opção foi\ definida e guardada." ::msgcat::mcset pt "this option is unchanged from its standard setting."\ "esta opção não foi alterada da sua definição standard." ::msgcat::mcset pt "Users" "Utilizadores" ::msgcat::mcset pt "Visitors" "Visitantes" ::msgcat::mcset pt "you have edited the value, but you have not set the\ option." "Editaste o valor, mas não activaste a opção." ::msgcat::mcset pt "you have set this option, but not saved it for future\ sessions." "activaste esta opção mas não a guardaste para sessões\ futuras." # datagathering.tcl ::msgcat::mcset pt "Date:" "Data:" ::msgcat::mcset pt "Email:" "Email:" ::msgcat::mcset pt "Error requesting data: %s" "Erro ao pedir dados: %s" ::msgcat::mcset pt "Error submitting data: %s" "Erro ao submeter dados: %s" ::msgcat::mcset pt "First Name:" "Nome:" ::msgcat::mcset pt "Instructions" "Instruções" ::msgcat::mcset pt "Key:" "Chave:" ::msgcat::mcset pt "Last Name:" "Apelido:" ::msgcat::mcset pt "Misc:" "Outros:" ::msgcat::mcset pt "Phone:" "Telefone:" ::msgcat::mcset pt "Text:" "Texto:" ::msgcat::mcset pt "Zip:" "Código Postal:" # plugins/general/httpconn.tcl ::msgcat::mcset pt "Do http poll" "Fazer espera activa http" ::msgcat::mcset pt "Maximum Poll Time." "Tempo máximo de espera activa." ::msgcat::mcset pt "Minimum Poll Time." "Tempo mínimo de espera activa." ::msgcat::mcset pt "Url to connect to." "Url de ligação." ::msgcat::mcset pt "Url:" "Url:" # plugins/general/tkcon.tcl ::msgcat::mcset pt "Show Console" "Mostrar Consola" # plugins/general/stats.tcl ::msgcat::mcset pt "Open statistics monitor" "Abrir monitor de estatísticas" ::msgcat::mcset pt "Request" "Pedido" ::msgcat::mcset pt "Set" "Activar" ::msgcat::mcset pt "Statistics" "Estatísticas" ::msgcat::mcset pt "Statistics monitor" "Monitor de estatísticas" ::msgcat::mcset pt "Timer" "Temporizador" # disco.tcl ::msgcat::mcset pt "Error getting info: %s" "Erro ao obter informação: %s" ::msgcat::mcset pt "Error getting items: %s" "Erro ao obter items: %s" ::msgcat::mcset pt "Error negotiate: %s" "Erro na negociação: %s" ::msgcat::mcset pt "Jabber Discovery" "Procura Jabber" ::msgcat::mcset pt "Node:" "Nó:" # emoticons.tcl # filetransfer.tcl ::msgcat::mcset pt "Browse..." "Explorar..." ::msgcat::mcset pt "Connection closed" "Ligação encerrada" ::msgcat::mcset pt "Default directory for downloaded files." "Directoria por\ omissão para guardar ficheiros." ::msgcat::mcset pt "Description:" "Descrição:" ::msgcat::mcset pt "File not found or not regular file: %s" "Ficheiro não\ encontrado ou não é um ficheiro normal" ::msgcat::mcset pt "File to Send:" "Ficheiro a enviar:" ::msgcat::mcset pt "File Transfer options." "Opções de transferência de\ ficheiros." ::msgcat::mcset pt "IP address:" "Endereço IP:" ::msgcat::mcset pt "Receive" "Receber" ::msgcat::mcset pt "Receive file from %s" "Receber ficheiro de %s" ::msgcat::mcset pt "Request failed: %s" "O pedido falhou: %s" ::msgcat::mcset pt "Save as:" "Guardar como:" ::msgcat::mcset pt "Send file to %s" "Enviar ficheiro para %s" ::msgcat::mcset pt "Size:" "Tamanho:" ::msgcat::mcset pt "Transfering..." "A Transferir..." ::msgcat::mcset pt "Transferring..." "A Transferir..." # filters.tcl ::msgcat::mcset pt "Action" "Acção" ::msgcat::mcset pt "Add" "Adicionar" ::msgcat::mcset pt "Edit" "Editar" ::msgcat::mcset pt "Move down" "Mover para baixo" ::msgcat::mcset pt "Move up" "Mover para cima" ::msgcat::mcset pt "Remove" "Eliminar" # gpgme.tcl ::msgcat::mcset pt "%s purportedly signed by %s can't be verified.\n\n%s."\ "%s supostamente assinada por %s não pode ser verificada.\n\n%s." ::msgcat::mcset pt "Change security preferences for %s" "Mudar preferências\ de segurança para %s" ::msgcat::mcset pt "Data purportedly sent by %s can't be deciphered.\n\n%s."\ "Dados supostamente enviados por %s não puderam ser\ decifrados.\n\n%s." ::msgcat::mcset pt "Encrypt traffic" "Cifrar tráfego" ::msgcat::mcset pt "Error in signature verification software: %s." "Erro no\ software de verificação de assinatura: %s." ::msgcat::mcset pt "Key ID" "ID da chave" ::msgcat::mcset pt "Passphrase:" "Frase-chave:" ::msgcat::mcset pt "Please enter passphrase" "Por favor, introduz a\ frase-chave" ::msgcat::mcset pt "Please try again" "Por favor, tenta novamente" ::msgcat::mcset pt "Select" "Seleccionar" ::msgcat::mcset pt "Select Key for Signing Traffic" "Seleccionar a chave para\ assinar o tráfego" ::msgcat::mcset pt "Unable to encipher data for %s: %s.\n\nEncrypting traffic\ to this user is now disabled.\n\nSend it as PLAINTEXT?" "Não foi\ possível cifrar dados para %s: %s.\n\nO envio de dados cifrados para\ este utilizador está agora desactivado.\n\nEnviar em TEXTO LIMPO?" ::msgcat::mcset pt "Unable to sign message body: %s.\n\nSigning traffic is\ now disabled.\n\nSend it WITHOUT a signature?" "Não foi possível\ assinar o corpo da mensagem: %s.\n\nO tráfego assinado está agora\ desactivado.\n\nEnviar SEM assinatura?" ::msgcat::mcset pt "Unable to sign presence information: %s.\n\nPresence will\ be sent, but signing traffic is now disabled." "Não foi possível\ assinar informação de presença: %s.\n\nA presençaa vai ser enviada,\ mas o tráfego assinado está agora desactivado." ::msgcat::mcset pt "User ID" "ID de utilizador" ::msgcat::mcset pt "" # iface.tcl ::msgcat::mcset pt "Add conference..." "Adicionar conferência..." ::msgcat::mcset pt "Add group by regexp on JIDs..." "Adicionar grupo por\ regexp sobre JID..." ::msgcat::mcset pt "Add user..." "Adicionar utilizador..." ::msgcat::mcset pt "Admin tools" "ferramentas de administração" ::msgcat::mcset pt "Allow downloading" "Permitir download" ::msgcat::mcset pt "Announce" "Anunciar" ::msgcat::mcset pt "Avatar" "Avatar" ::msgcat::mcset pt "Away" "Ausente" ::msgcat::mcset pt "Browser" "Explorar" ::msgcat::mcset pt "Change password..." "Mudar palavra-chave..." ::msgcat::mcset pt "Chats" "Conversas" ::msgcat::mcset pt "Colors for tab alert levels." "Cores para os níveis de\ alerta das abas." ::msgcat::mcset pt "Create room..." "Criar sala de conversas" ::msgcat::mcset pt "Customize" "Configurar" ::msgcat::mcset pt "Delete message of the day" "Eliminar mensagem do dia" ::msgcat::mcset pt "Discovery" "Descoberta" ::msgcat::mcset pt "Do not disturb" "Não perturbar" ::msgcat::mcset pt "Edit my info..." "Editar a minha informação..." ::msgcat::mcset pt "Export roster..." "Exportar lista de contactos..." ::msgcat::mcset pt "Extended Away" "Ausência Prolongada" ::msgcat::mcset pt "Filters..." "Filtros..." ::msgcat::mcset pt "Free to chat" "Disponível para conversar" ::msgcat::mcset pt "Generate event messages" "Gerar mensagens de eventos" ::msgcat::mcset pt "Help" "Ajuda" ::msgcat::mcset pt "Import roster..." "Importar lista de contactos..." ::msgcat::mcset pt "Invisible" "Invisível" ::msgcat::mcset pt "Join group..." "Aderir a grupo..." ::msgcat::mcset pt "Log in..." "Iniciar sessão..." ::msgcat::mcset pt "Log out" "Fechar sessão" ::msgcat::mcset pt "Log out with reason..." "Fechar sessão com uma razão..." ::msgcat::mcset pt "Message archive" "Arquivo de mensagens" ::msgcat::mcset pt "Mute" "Silêncio" ::msgcat::mcset pt "Online" "Ligado" ::msgcat::mcset pt "Open raw XML window" "Abrir janela de XML bruto" ::msgcat::mcset pt "Options for main interface." "Opções para o interface\ principal." ::msgcat::mcset pt "Periodically browse roster conferences" "Inspeccionar\ periodicamente conferências da lista de contactos" ::msgcat::mcset pt "Presence" "Presença" ::msgcat::mcset pt "Privacy rules..." "Regras de privacidade..." ::msgcat::mcset pt "Profile on" "Perfil" ::msgcat::mcset pt "Profile report" "Relatório de perfil" ::msgcat::mcset pt "Quick help" "Ajuda rápida" ::msgcat::mcset pt "Quit" "Sair" ::msgcat::mcset pt "Raise new tab." "Criar nova aba." ::msgcat::mcset pt "Roster" "Lista de Contactos" ::msgcat::mcset pt "Send broadcast message..." "Enviar mensagem de\ difusão..." ::msgcat::mcset pt "Send message of the day..." "Enviar mensagem do dia..." ::msgcat::mcset pt "Send message..." "Enviar mensagem..." ::msgcat::mcset pt "Send to server" "Enviar ao servidor" ::msgcat::mcset pt "Services" "Serviços" ::msgcat::mcset pt "Show online users only" "Mostrar apenas utilizadores\ ligados" ::msgcat::mcset pt "Show user info..." "Mostrar informação de utilizador..." ::msgcat::mcset pt "Sound" "Som" ::msgcat::mcset pt "Stop autoscroll" "Parar o autoscroll automático" ::msgcat::mcset pt "Update message of the day..." "Actualizar mensagem do\ dia..." ::msgcat::mcset pt "Use aliases" "Usar aliases" ::msgcat::mcset pt "Jidlink" ::msgcat::mcset pt "Chats:" "Conversas:" ::msgcat::mcset pt "Close tab" "Fechar aba" ::msgcat::mcset pt "Complete nickname" "Completar nick" ::msgcat::mcset pt "Correct word" "Corrigir palavra" ::msgcat::mcset pt "Hide/Show roster" "Mostrar/Esconder lista" ::msgcat::mcset pt "Main window:" "Janela principal:" ::msgcat::mcset pt "Previous/Next history message" "Mensagem\ anterior/seguinte" ::msgcat::mcset pt "Previous/Next tab" "Aba anterior/seguinte" ::msgcat::mcset pt "Quick Help" "Ajuda Rápida" ::msgcat::mcset pt "Redo" "Refazer" ::msgcat::mcset pt "Scroll chat window up/down" "Deslizar janela de conversa\ para cima/baixo" ::msgcat::mcset pt "Show emoticons" "Mostrar emoticons" ::msgcat::mcset pt "Tabs:" "Abas:" ::msgcat::mcset pt "Undo" "Desfazer" ::msgcat::mcset pt "About" "Acerca de" ::msgcat::mcset pt "Alexey Shchepin" "Alexey Shchepin" ::msgcat::mcset pt "Authors:" "Autores:" ::msgcat::mcset pt "Marshall T. Rose" "Marshall T. Rose" ::msgcat::mcset pt "Michail Litvak" "Michail Litvak" ::msgcat::mcset pt "Sergei Golovan" "Sergei Golovan" ::msgcat::mcset pt "Add new user..." "Adicionar novo utilizador..." ::msgcat::mcset pt "Jabber Browser" "Explorador Jabber" #::msgcat::mcset pt "Join group..." "Aderir a grupo..." ::msgcat::mcset pt "Cancel" "Cancelar" ::msgcat::mcset pt "Close" "Fechar" ::msgcat::mcset pt "Close all tabs" "Fechar todas as abas" ::msgcat::mcset pt "Close other tabs" "Fechar as outras abas" ::msgcat::mcset pt "Send" "Enviar" ::msgcat::mcset pt "Smart autoscroll" "Autoscroll inteligente" ::msgcat::mcset pt "Toggle encryption (when possible)" "Activar/Desactivar a\ cifragem (quando for possível)" ::msgcat::mcset pt "Toggle showing offline users" "Activar/Desactivar a vista\ de utilizadores desligados" ::msgcat::mcset pt "Toggle signing" "Activar/Desactivar assinatura" ::msgcat::mcset pt "%s SSL Certificate Info" "Informação de Certificado SSL\ de %s" ::msgcat::mcset pt "Begin date" "Data de início" ::msgcat::mcset pt "Begin date:" "Data de início:" ::msgcat::mcset pt "Cipher" "Cifra" ::msgcat::mcset pt "Cipher:" "Cifra:" ::msgcat::mcset pt "Delay between getting focus and updating window or tab\ title in milliseconds." "Tempo, em milisegundos, entre a obtenção de\ focus e a actualização do título da aba." ::msgcat::mcset pt "Disabled\n" "Desactivado\n" ::msgcat::mcset pt "Emphasize" "Enfatizar" ::msgcat::mcset pt "Enabled\n" "Activado\n" ::msgcat::mcset pt "Expiry date" "Data em que expira" ::msgcat::mcset pt "Expiry date:" "Data em que expira:" ::msgcat::mcset pt "Extended away" "Ausência prolongada" ::msgcat::mcset pt "Issuer" "Emissor" ::msgcat::mcset pt "Issuer:" "Responsável:" ::msgcat::mcset pt "Serial number" "Número de série" ::msgcat::mcset pt "Serial number:" "Número de série:" ::msgcat::mcset pt "Show number of unread messages in tab titles." "Mostrar\ número de mensagens por ler no título das abas." ::msgcat::mcset pt "SSL certificate expired" "Certificado SSL expirado" ::msgcat::mcset pt "SSL Info" # itemedit.tcl ::msgcat::mcset pt "<- Remove" "<- Eliminar" ::msgcat::mcset pt "Add ->" "Adicionar ->" ::msgcat::mcset pt "Available groups" "Grupos disponíveis" ::msgcat::mcset pt "Current groups" "Grupos actuais" ::msgcat::mcset pt "Edit groups for %s" "Editar grupos para %s" ::msgcat::mcset pt "Edit nickname for %s" "Editar nick para %s" ::msgcat::mcset pt "Edit properties for %s" "Editar propriedades para %s" ::msgcat::mcset pt "Group:" "Grupo:" ::msgcat::mcset pt "Nickname:" "Nickname:" # jabberlib-tclxml/jabberlib.tcl ::msgcat::mcset pt "Authentication failed" "Falhou a Autenticação" ::msgcat::mcset pt "Authentication successful" "Autenticação bem sucedida" ::msgcat::mcset pt "Got authentication mechanisms" "Mecanismos de\ autenticação obtidos" ::msgcat::mcset pt "Got roster" "Lista de contactos obtida" ::msgcat::mcset pt "Got Stream" "'Stream' obtido" ::msgcat::mcset pt "Waiting for authentication mechanisms" "À espera dos\ mecanismos de autenticação" ::msgcat::mcset pt "Waiting for authentication results" "À espera dos\ resultados da autenticação" ::msgcat::mcset pt "Waiting for roster" "À espera da lista de contactos" ::msgcat::mcset pt "Waiting for Stream" "À espera do 'Stream'" # jidlink.tcl ::msgcat::mcset pt "Jidlink connection closed" "Ligação Jidlink fechada" ::msgcat::mcset pt "Opening Jidlink connection" "A abrir ligação Jidlink" # joingrdialog.tcl ::msgcat::mcset pt "Add group" "Adicionar grupo" ::msgcat::mcset pt "Address:" "Endereço:" ::msgcat::mcset pt "Connection:" "Ligação:" ::msgcat::mcset pt "Create" "Criar" ::msgcat::mcset pt "Create Room" "Criar sala" ::msgcat::mcset pt "Description:" "Descrição:" ::msgcat::mcset pt "Get conference info failed: %s" "O pedido de informação\ da conferência falhou: %s" ::msgcat::mcset pt "Group:" "Grupo:" ::msgcat::mcset pt "Join" "Entrar" ::msgcat::mcset pt "Join failed: %s" "Erro na adesão: %s" ::msgcat::mcset pt "Join group" "Aderir a grupo" ::msgcat::mcset pt "Name: " "Nome:" ::msgcat::mcset pt "Nick:" "Nick:" ::msgcat::mcset pt "Nickname:" "Nickname:" ::msgcat::mcset pt "Password (v2 only):" "Palavra-chave (apenas v2)" ::msgcat::mcset pt "Password:" "Palavra-chave:" ::msgcat::mcset pt "Server:" "Servidor:" ::msgcat::mcset pt "use v2 protocol" "usar protocolo v2" ::msgcat::mcset pt "Join group dialog data (groups)." ::msgcat::mcset pt "Join group dialog data (nicks)." ::msgcat::mcset pt "Join group dialog data (servers)." # login.tcl ::msgcat::mcset pt ". Proceed?\n\n" ". Continuar?\n\n" ::msgcat::mcset pt "Account" "Conta" ::msgcat::mcset pt "Authentication failed: %s\nCreate new account?" "A\ autenticação falhou: %s\nCriar nova conta?" ::msgcat::mcset pt "Can't authenticate: Remote server doesn't support\nplain\ or digest authentication method" "Não é possível fazer a\ autenticação: o servidor remoto não suporta\nmétodos de autenticação\ simple ou digest" ::msgcat::mcset pt "Change password" "Alterar palavra-chave" ::msgcat::mcset pt "Connect via alternate server" "Ligar através de servidor\ alternativo" ::msgcat::mcset pt "Connect via HTTP polling" "Ligar através de polling HTTP" ::msgcat::mcset pt "Connection" "Ligação" ::msgcat::mcset pt "Display SSL warnings." "Mostrar avisos relativos ao SSL." ::msgcat::mcset pt "Failed to connect: %s" "Erro ao ligar: %s" ::msgcat::mcset pt "HTTP Poll" "Polling HTTP" ::msgcat::mcset pt "HTTP proxy address." "Endereço do proxy HTTP." ::msgcat::mcset pt "HTTP proxy password." "Palavra-Chave do proxy HTTP." ::msgcat::mcset pt "HTTP proxy port." "Porto do proxy HTTP." ::msgcat::mcset pt "HTTP proxy username." "Utilizador do proxy HTTP." ::msgcat::mcset pt "Keep trying" "Continuar a tentar" ::msgcat::mcset pt "List of logout reasons." "Lista de razões para abandonar\ sessão." ::msgcat::mcset pt "Login" "Iniciar sessão" ::msgcat::mcset pt "Login options." "Opções de início de sessão." ::msgcat::mcset pt "Logout" "Encerrar Sessão" ::msgcat::mcset pt "Logout with reason" "Encerrar sessão com razão" ::msgcat::mcset pt "Maximum Poll Interval." "Intervalo máximo de 'Poll'." ::msgcat::mcset pt "Minimum Poll Interval." "Intervalo mínimo de 'Poll'." ::msgcat::mcset pt "New password:" "Nova palavra-chave:" ::msgcat::mcset pt "New passwords do not match" "As novas palavras-chaves não\ coincidem" ::msgcat::mcset pt "Old password is incorrect" "A palavra-chave antiga está\ incorrecta" ::msgcat::mcset pt "Old password:" "Palavra-chave antiga:" ::msgcat::mcset pt "Password change failed: %s" "A alteração de palavra-chave\ falhou: %s" ::msgcat::mcset pt "Password is changed" "Palavra-chave alterada" ::msgcat::mcset pt "Password." "Palavra-Chave." ::msgcat::mcset pt "Password:" "Palavra-Chave:" ::msgcat::mcset pt "Port:" "Porto:" ::msgcat::mcset pt "Priority." "Prioridade." ::msgcat::mcset pt "Priority:" "Prioridade:" ::msgcat::mcset pt "Profile" "Perfil" ::msgcat::mcset pt "Profiles" "Perfis" ::msgcat::mcset pt "Proxy Login:" "Utilizador do Proxy:" ::msgcat::mcset pt "Proxy Password:" "Palavra-chave do Proxy:" ::msgcat::mcset pt "Proxy Port:" "Porto do Proxy:" ::msgcat::mcset pt "Proxy Server:" "Servidor Proxy:" ::msgcat::mcset pt "Reason:" "Razão:" ::msgcat::mcset pt "Registration failed: %s" "O registo falhou: %s" ::msgcat::mcset pt "Repeat new password:" "Repete a nova palavra-chave:" ::msgcat::mcset pt "Replace opened connections" "Substituir sessões abertas" ::msgcat::mcset pt "Replace opened connections." "Substituir sessões\ abertas." ::msgcat::mcset pt "Resource." "Recurso." ::msgcat::mcset pt "Resource:" "Recurso:" ::msgcat::mcset pt "Retry to connect forever." "Tentar sempre ligar\ novamente." ::msgcat::mcset pt "SASL Certificate:" "Certificado SASL:" ::msgcat::mcset pt "SASL Port:" "Porto SASL:" ::msgcat::mcset pt "Server name or IP-address." "Nome do servidor ou endereço\ IP." ::msgcat::mcset pt "Server name." "Servidor." ::msgcat::mcset pt "Server port." "Porto." ::msgcat::mcset pt "Server Port:" "Porto do servidor:" ::msgcat::mcset pt "Server:" "Servidor:" ::msgcat::mcset pt "SSL CA file (optional)." "Ficheiro SSL CA (opcional)." ::msgcat::mcset pt "SSL certificate file (optional)." "Ficheiro de\ certificado SSL (opcional)." ::msgcat::mcset pt "SSL Certificate:" "Certificado SSL:" ::msgcat::mcset pt "SSL disabled" "SSL desactivado" ::msgcat::mcset pt "SSL enabled" "SSL activado" ::msgcat::mcset pt "SSL port." "Porto SSL." ::msgcat::mcset pt "SSL Port:" "Porto SSL:" ::msgcat::mcset pt "SSL private key file (optional)." "Ficheiro de chave SSL\ privada (opcional)." ::msgcat::mcset pt "URL to connect to." "URL para ligação." ::msgcat::mcset pt "URL to poll:" "URL para polling:" ::msgcat::mcset pt "Use client security keys" "Usar chaves de segurança do\ cliente" ::msgcat::mcset pt "Use explicitly-specified server address." "Usar\ explicitamente o endereço do servidor especificado.." ::msgcat::mcset pt "Use hashed password" "Usar palavra-chave hashed" ::msgcat::mcset pt "Use hashed password transmission." "Usar transmissão de\ chave hashed." ::msgcat::mcset pt "Use HTTP poll client security keys (recommended)." "Usar\ chaves de segurança do cliente de polling HTTP (recomendado)." ::msgcat::mcset pt "Use HTTP poll connection method." "Usar método de ligação\ por polling HTTP." ::msgcat::mcset pt "Use HTTP proxy to connect." "Usar proxy HTTP para a\ ligação." ::msgcat::mcset pt "Use Proxy" "Usar Proxy" ::msgcat::mcset pt "Use SASL authentification" "Usar autentificação SASL" ::msgcat::mcset pt "Use SASL authentification." "Usar autentificação SASL." ::msgcat::mcset pt "Use SSL" "Usar SSL" ::msgcat::mcset pt "Use SSL to connect to server." "Usar SSL para a ligação." ::msgcat::mcset pt "User name." "Nome do utilizador." ::msgcat::mcset pt "Username:" "Utilizador:" ::msgcat::mcset pt "Warning display options." "Opções de mensagens de aviso." ::msgcat::mcset pt "Warning: Remote server doesn't support\nhashed password\ authentication.\n\nProceed with PLAINTEXT authentication?" "Aviso: o\ servidor remoto não suporta\nautenticação com chaves\ hashed.\n\nContinuar com autenticação em TEXTO LIMPO?" ::msgcat::mcset pt "Proxy" ::msgcat::mcset pt "SASL" ::msgcat::mcset pt "SSL" # messages.tcl ::msgcat::mcset pt "\nReason is: %s" "\nA razão é: %s" ::msgcat::mcset pt "%s Headlines" "Cabeçalhos de %s" ::msgcat::mcset pt "%s invites you to conference room %s" "%s convida-te para\ a sala de conferência %s" ::msgcat::mcset pt "Attached file:" "Ficheiro anexo:" ::msgcat::mcset pt "Attached user:" "Utilizador anexo:" ::msgcat::mcset pt "Cache headlines on exit and restore on start." "Guardar\ cabeçalhos ao sair e recuperar ao iniciar." ::msgcat::mcset pt "Chat" "Conversar" ::msgcat::mcset pt "Delete" "Eliminar" ::msgcat::mcset pt "Delete all" "Apagar todos" ::msgcat::mcset pt "Delete seen" "Apagar os lidos" ::msgcat::mcset pt "Display headlines in single/multiple windows." "Mostrar\ cabeçalhos numa ou várias janelas." ::msgcat::mcset pt "Do not display headline descriptions as tree nodes." "Não\ mostrar descrições de cabeçalhos em árvore." ::msgcat::mcset pt "Extras from" "Extras de" ::msgcat::mcset pt "Extras from %s" "Extras de %s" ::msgcat::mcset pt "Forward headline" "Reenviar cabeçalho" ::msgcat::mcset pt "Forward to %s" "Reenviar a %s" ::msgcat::mcset pt "Forward..." "Reenviar..." ::msgcat::mcset pt "Headlines" "Cabeçalhos" ::msgcat::mcset pt "Invited to:" "Convidado para:" ::msgcat::mcset pt "List of JIDs to whom headlines have been sent." "Lista\ dos JIDs para os quais foram enviados os cabeçalhos." ::msgcat::mcset pt "List of message destination JIDs." "Lista dos JID\ destinatários." ::msgcat::mcset pt "Mark all seen" "Marcar todos como lidos" ::msgcat::mcset pt "Mark all unseen" "Marcar todos como não lidos" ::msgcat::mcset pt "Message and Headline options." "Opcções de Mensagem e\ Cabeçalhos." ::msgcat::mcset pt "Message body" "Corpo da mensagem" ::msgcat::mcset pt "Message from" "Mensagem de" ::msgcat::mcset pt "Message from %s" "Mensagem de %s" ::msgcat::mcset pt "One window per JID" "Uma janela por JID" ::msgcat::mcset pt "One window per JID/resource" "Uma janela por cada\ JID/recurso" ::msgcat::mcset pt "Quote" "Citar" ::msgcat::mcset pt "Reply" "Responder" ::msgcat::mcset pt "Reply subject:" "Assunto da resposta:" ::msgcat::mcset pt "Send message" "Enviar mensagem" ::msgcat::mcset pt "Send message to %s" "Enviar mensagem a %s" ::msgcat::mcset pt "Send subscription" "Enviar subscrição" ::msgcat::mcset pt "Send subscription to " "Enviar subscrição a " ::msgcat::mcset pt "Send subscription to %s" "Enviar subscrição a %s" ::msgcat::mcset pt "Single window" "Uma janela" ::msgcat::mcset pt "Sort" "Ordenar" ::msgcat::mcset pt "Subscribe" "Subscrever" ::msgcat::mcset pt "Subscribe request from" "Subscrever pedido de" ::msgcat::mcset pt "Subscribe request from %s" "Subscrever pedido de %s" ::msgcat::mcset pt "Toggle seen" "Activar/Desactivar Visibilidade" ::msgcat::mcset pt "Unsubscribe" "Remover subscrição" # muc.tcl ::msgcat::mcset pt "\n\tAffiliation: %s" "\n\tAfiliação: %s" ::msgcat::mcset pt "\n\tJID: %s" "\n\tJID: %s" ::msgcat::mcset pt " by %s" " por %s" ::msgcat::mcset pt "%s has become available" "%s está agora disponível" ::msgcat::mcset pt "%s has left" "%s saiu" ::msgcat::mcset pt "%s is now known as %s" "%s é agora conhecido por %s" ::msgcat::mcset pt "Ban" "Banir" ::msgcat::mcset pt "Configure" "Configurar" ::msgcat::mcset pt "Destroy" "Destruir" ::msgcat::mcset pt "Edit admin list" "Editar lista de administrador" ::msgcat::mcset pt "Edit ban list" "Editar lista de bans" ::msgcat::mcset pt "Edit member list" "Editar lista de membros" ::msgcat::mcset pt "Edit moderator list" "Editar lista de moderador" ::msgcat::mcset pt "Edit owner list" "Editar lista de donos" ::msgcat::mcset pt "Edit voice list" "Editar lista de vozes" ::msgcat::mcset pt "Generate event messages in MUC compatible conference\ rooms." "Gerar mensagens de eventos em salas de conferências\ compatíveis com MUC." ::msgcat::mcset pt "Grant Administrative Privilege" "Dar privilégios de\ administrador" ::msgcat::mcset pt "Grant Membership" "Dar Privilégios de Membro" ::msgcat::mcset pt "Grant Moderator Privilege" "Dar Privilégios de Moderador" ::msgcat::mcset pt "Grant Ownership Privilege" "Dar privilégios de dono" ::msgcat::mcset pt "Grant Voice" "Dar Voz" ::msgcat::mcset pt "Kick" "Chutar" ::msgcat::mcset pt "MUC" "MUC" ::msgcat::mcset pt "Revoke Administrative Privilege" "Retirar privilégios de\ administrador" ::msgcat::mcset pt "Revoke Membership" "Retirar Privilégios de Membro" ::msgcat::mcset pt "Revoke Moderator Privilege" "Retirar Privilégios de\ Moderador" ::msgcat::mcset pt "Revoke Ownership Privilege" "Retirar privilégios de dono" ::msgcat::mcset pt "Revoke Voice" "Retirar Voz" ::msgcat::mcset pt "Whois" "Quem é?" #::msgcat::mcset pt "Edit $val list" "Editar a lista $val" # plugins/chat/logger.tcl ::msgcat::mcset pt "Directory to store logs." "Directoria onde guardar logs." ::msgcat::mcset pt "Do search" "Procurar" ::msgcat::mcset pt "Export to XHTML" "Exportar para XHTML" ::msgcat::mcset pt "Go" "Ir" ::msgcat::mcset pt "History for %s" "Historial de %s" ::msgcat::mcset pt "Logging options." "Opções de log de mensagens." ::msgcat::mcset pt "Match by regexp" "Padrão para regexp" ::msgcat::mcset pt "Match case..." "Maiúsculas/Minúsculas..." ::msgcat::mcset pt "Search direction" "Direcção de procura" ::msgcat::mcset pt "Store group chats logs." "Guardar logs de conversas em\ grupo." ::msgcat::mcset pt "Store private chats logs." "Guardar logs de conversas\ privadas." # /home/alexey/src/tkabber-cvs/tkabber/plugins/chat/draw_xhtml_message.tcl ::msgcat::mcset pt "Enable rendering of XHTML messages." "Activar a\ visualização de mensagens XHTML." # presence.tcl ::msgcat::mcset pt "Not logged in" "Sessão não iniciada" #::msgcat::mcset pt "Online" "Ligado" #::msgcat::mcset pt "Free to chat" "Disponível para conversar" #::msgcat::mcset pt "Away" "Ausente" #::msgcat::mcset pt "Extended Away" "Ausência Prolongada" #::msgcat::mcset pt "Do not disturb" "Não perturbar" #::msgcat::mcset pt "Invisible" "Invisível" ::msgcat::mcset pt "Change Presence Priority" "Modificar Prioridade da\ Presença" ::msgcat::mcset pt "Change priority..." "Modificar prioridade..." ::msgcat::mcset pt "invalid userstatus value " "valor inválido do estado de\ utilizador " ::msgcat::mcset pt "Offline" "Desligado" # privacy.tcl ::msgcat::mcset pt "Action:" "Acção:" ::msgcat::mcset pt "Active" "Activa" ::msgcat::mcset pt "Add item" "Adicionar item" ::msgcat::mcset pt "Add list" "Adicionar lista" ::msgcat::mcset pt "Default" "Por omissão" ::msgcat::mcset pt "Edit list" "Editar lista" ::msgcat::mcset pt "No active" "Não activa" ::msgcat::mcset pt "No active list" "No existe uma lista activa" ::msgcat::mcset pt "No default list" "Não existe uma lista por omissão" ::msgcat::mcset pt "Remove list" "Eliminar lista" ::msgcat::mcset pt "Requesting privacy list: %s" "A pedir lista de\ privacidade: %s" ::msgcat::mcset pt "Requesting privacy rules: %s" "A pedir regras de\ privacidade: %s" ::msgcat::mcset pt "Subscription:" "Subscrição:" ::msgcat::mcset pt "Type:" "Tipo:" ::msgcat::mcset pt "Value:" "Valor:" ::msgcat::mcset pt "Zebra list: %s" "Lista Zebra: %s" ::msgcat::mcset pt "Zebra lists" "Listas Zebra" # register.tcl ::msgcat::mcset pt "Register in %s" "Registar em %s" ::msgcat::mcset pt "Registration is successful!" "Registo bem sucedido!" ::msgcat::mcset pt "Registration: %s" "Registo: %s" ::msgcat::mcset pt "Successful!" "Sucesso!" ::msgcat::mcset pt "Unsubscribed from %s" "Sem subscrição em %s" ::msgcat::mcset pt "We unsubscribed from %s" "Eliminámos subscrição em %s" # roster.tcl ::msgcat::mcset pt "is now" "está agora" ::msgcat::mcset pt "Undefined" "Indefinido" #::msgcat::mcset pt "Show online & offline users" \ # "Mostrar utilizadores ligados & desligados" #::msgcat::mcset pt "Show online users only" \ # "Mostrar apenas utilizadores ligados" ::msgcat::mcset pt "Add roster group by JID regexp" "Adicionar grupo à lista\ de contactos por regexp sobre JID" ::msgcat::mcset pt "Are you sure to remove %s from roster?" "Tens a certeza\ que queres remover %s da lista de contactos?" ::msgcat::mcset pt "JID regexp:" "JID regexp:" ::msgcat::mcset pt "New group name:" "Nome do novo grupo:" ::msgcat::mcset pt "Start chat" "Começar a conversar" #::msgcat::mcset pt "Send message..." "Enviar mensagem..." ::msgcat::mcset pt "Active Chats" "Conversas activas" ::msgcat::mcset pt "Add chats group in roster." "Adicionar grupo de conversas\ à lista de contactos" ::msgcat::mcset pt "All Files" "Todos os ficheiros" ::msgcat::mcset pt "Are you sure to remove group '%s' from roster?" "Tens a\ certeza de que queres eliminar o grupo '%s' da lista de contactos?" ::msgcat::mcset pt "Contact Information" "Informação de contacto" ::msgcat::mcset pt "Default nested roster group delimiter." "Delimitador por\ omissão de sub-grupos da lista de contactos." ::msgcat::mcset pt "Edit item..." "Editar item..." ::msgcat::mcset pt "Edit security..." "Editar segurança..." ::msgcat::mcset pt "Invite to conference..." "Convidar para conferência..." ::msgcat::mcset pt "Join..." "Aderir..." ::msgcat::mcset pt "Log in" "Iniciar sessão" ::msgcat::mcset pt "Log out" "Fechar sessão" ::msgcat::mcset pt "No users in roster..." "Não existem utilizadores na lista\ de contactos..." ::msgcat::mcset pt "Raw XML input" "Entrada em XML bruto" ::msgcat::mcset pt "Remove..." "Eliminar..." ::msgcat::mcset pt "Rename roster group" "Alterar nome do grupo da lista de\ contactos" ::msgcat::mcset pt "Rename..." "Alterar nome..." ::msgcat::mcset pt "Resubscribe" "Subscrever novamente" ::msgcat::mcset pt "Resubscribe to all users in group..." "Subscrever\ novamente todos os utilizadores do grupo..." ::msgcat::mcset pt "Roster Files" "Ficheiros da lista de contactos" ::msgcat::mcset pt "Roster of %s" "Lista de contactos de %s" ::msgcat::mcset pt "Roster options." "Opções da lista de contactos." ::msgcat::mcset pt "Send" "Enviar" ::msgcat::mcset pt "Send contacts to" "Enviar contactos a" ::msgcat::mcset pt "Send file via Jidlink..." "Enviar ficheiro através de\ Jidlink..." ::msgcat::mcset pt "Send file..." "Enviar ficheiro..." ::msgcat::mcset pt "Send users..." "Enviar utilizadores..." ::msgcat::mcset pt "Show detailed info on conference room members in roster\ item tooltips." "Mostrar informação detalhada sobre os membros de uma\ sala de conferência nos 'tooltips' da lista de contactos." ::msgcat::mcset pt "Show history" "Mostrar historial" ::msgcat::mcset pt "Show info" "Mostrar informação" ::msgcat::mcset pt "Show native icons for contacts, connected to\ transports/services in roster." "Mostrar ícones nativos para os\ contactos ligados ligados a transportes/serviços da lista de\ contactos." ::msgcat::mcset pt "Show native icons for transports/services in roster."\ "Mostrar ícones nativos para transportes/serviços na lista de\ contactos." ::msgcat::mcset pt "Show offline users" "Mostrar contactos desligados" ::msgcat::mcset pt "Show only online users in roster." "Mostrar apenas\ utilizadores da lista que estão ligados" ::msgcat::mcset pt "Show subscription type in roster item tooltips." "Mostrar\ tipo de subscrição em 'tooltips' na lista de contactos." # roster_nested.tcl ::msgcat::mcset pt "Enable nested roster groups." "Activar subgrupos na lista\ de contactos." # search.tcl ::msgcat::mcset pt "#" "#" ::msgcat::mcset pt "An error is occurred when searching in %s\n\n%s" "Ocorreu\ um erro ao procurar em %s\n\n%s" ::msgcat::mcset pt "An error occurred when searching in %s\n\n%s" "Ocorreu um\ erro durante a pesquisa em %s\n\n%s" ::msgcat::mcset pt "OK" "OK" ::msgcat::mcset pt "Search again" "Procurar novamente" ::msgcat::mcset pt "Search in" "Procurar em" ::msgcat::mcset pt "Search in %s" "Procurar em %s" ::msgcat::mcset pt "Search in %s: No items found" "Pesquisa em %s: Nenhum\ item encontrado" ::msgcat::mcset pt "Search: %s" "Procurar: %s" ::msgcat::mcset pt "Try again" "Tentar novamente" # splash.tcl ::msgcat::mcset pt "auto-away" "Ausência automática" ::msgcat::mcset pt "avatars" "avatares" ::msgcat::mcset pt "balloon help" "ajuda contextual" ::msgcat::mcset pt "browsing" "navegação" ::msgcat::mcset pt "bwidget workarounds" "soluções para o bwidget" ::msgcat::mcset pt "configuration" "configuração" ::msgcat::mcset pt "connections" "ligações" ::msgcat::mcset pt "cryptographics" "criptografia" ::msgcat::mcset pt "emoticons" "emoticons" ::msgcat::mcset pt "extension management" "gestão de extensões" ::msgcat::mcset pt "file transfer" "transferência de ficheiros" ::msgcat::mcset pt "jabber chat" "conversa jabber" ::msgcat::mcset pt "jabber groupchats" "grupos de conversa jabber" ::msgcat::mcset pt "jabber iq" "iq jabber" ::msgcat::mcset pt "jabber presence" "presença jabber" ::msgcat::mcset pt "jabber registration" "registo jabber" ::msgcat::mcset pt "jabber xml" "Jabber XML" ::msgcat::mcset pt "message/headline" "mensagem/cabeçalho" ::msgcat::mcset pt "multi-user chat" "conversas multi-utilizador" ::msgcat::mcset pt "negotiation" "negociação" ::msgcat::mcset pt "plugin management" "gestão de plugins" ::msgcat::mcset pt "presence" "presença" ::msgcat::mcset pt "privacy rules" "regras de privacidade" ::msgcat::mcset pt "rosters" "listas de contactos" ::msgcat::mcset pt "searching" "a procurar" ::msgcat::mcset pt "service discovery" "Procura de serviços" ::msgcat::mcset pt "sound" "som" ::msgcat::mcset pt "text undo" "Desfazer texto" ::msgcat::mcset pt "user interface" "interface do utilizador" ::msgcat::mcset pt "utilities" "ferramentas" ::msgcat::mcset pt "jidlink" ::msgcat::mcset pt "kde" ::msgcat::mcset pt "wmaker" # sound.tcl ::msgcat::mcset pt "External program, which is to be executed to play sound.\ If empty, Snack library is required to play sound." "Programa externo\ que será executado para reproduzir sons. Se deixares vazio, é\ necessária a biblioteca Snack para reproduzir sons." ::msgcat::mcset pt "Mute sound notification." "Desactivar notificações\ sonoras." ::msgcat::mcset pt "Mute sound notifying." "Desactivar notificações sonoras." ::msgcat::mcset pt "Mute sound when displaying delayed groupchat messages."\ "Desactivar notificações sonoras para mensagens de conversas em grupo\ atrasadas." ::msgcat::mcset pt "Mute sound when displaying delayed personal chat\ messages." "Desactivar notificações sonoras para mensagens de\ conversas privadas atrasadas." ::msgcat::mcset pt "Options for external play program" "Opções para o\ programa de reprodução externo" ::msgcat::mcset pt "Sound options." "Opções de som." ::msgcat::mcset pt "Time interval before playing next sound (in\ milliseconds)." "Intervalo de tempo entre reproduções de som (em\ milisegundos)." ::msgcat::mcset pt "Use sound notification only when being available." "Usar\ notificações sonoras apenas quanto estiveres disponível." # userinfo.tcl ::msgcat::mcset pt "%s info" "Informação de %s" ::msgcat::mcset pt "Address" "Endereço" ::msgcat::mcset pt "Address 2:" "Endereço 2:" ::msgcat::mcset pt "Address:" "Endereço:" ::msgcat::mcset pt "Cell:" "Telemóvel:" ::msgcat::mcset pt "City:" "Cidade:" ::msgcat::mcset pt "Country:" "País:" ::msgcat::mcset pt "Details" "Detalhes" ::msgcat::mcset pt "Family Name:" "Apelido:" ::msgcat::mcset pt "Fax:" "Fax:" ::msgcat::mcset pt "Full Name:" "Nome completo:" ::msgcat::mcset pt "Geographical position" "Posição geográfica" ::msgcat::mcset pt "Home:" "Casa:" ::msgcat::mcset pt "Information" "Informação" ::msgcat::mcset pt "ISDN:" "RDIS:" ::msgcat::mcset pt "Latitude:" "Latitude:" ::msgcat::mcset pt "Location" "Lugar" ::msgcat::mcset pt "Longitude:" "Longitude:" ::msgcat::mcset pt "Message Recorder:" "Gravador de Mensagens:" ::msgcat::mcset pt "Middle Name:" "Segundo nome:" ::msgcat::mcset pt "Modem:" "Modem:" ::msgcat::mcset pt "Name" "Nome" ::msgcat::mcset pt "Name:" "Nome:" ::msgcat::mcset pt "Nickname:" "Nickname:" ::msgcat::mcset pt "Organization" "Organização" ::msgcat::mcset pt "Pager:" "Pager:" ::msgcat::mcset pt "Personal" "Pessoal" ::msgcat::mcset pt "Phones" "Telefones" ::msgcat::mcset pt "Postal Code:" "Código Postal:" ::msgcat::mcset pt "Preferred:" "Preferido:" ::msgcat::mcset pt "Prefix:" "Prefixo:" ::msgcat::mcset pt "Show" "Mostrar" ::msgcat::mcset pt "Show user info" "Mostrar informação do utilizador" ::msgcat::mcset pt "State:" "Estado/Província:" ::msgcat::mcset pt "Suffix:" "Sufixo:" ::msgcat::mcset pt "Telephone numbers" "Números de telefone" ::msgcat::mcset pt "Video:" "Vídeo:" ::msgcat::mcset pt "Voice:" "Voz:" ::msgcat::mcset pt "Web Site:" "Página web:" ::msgcat::mcset pt "Work:" "Trabalho:" ::msgcat::mcset pt "BBS:" ::msgcat::mcset pt "E-mail:" ::msgcat::mcset pt "JID:" ::msgcat::mcset pt "PCS:" ::msgcat::mcset pt "UID:" # Space at the end of the next word is to distinguish it from another "Name:" ::msgcat::mcset pt "Name: " "Nome: " ::msgcat::mcset pt "Unit:" "Unidade:" # Space at the end of the next word is to distinguish it from # another "Personal" ::msgcat::mcset pt "Personal " "Pessoal " ::msgcat::mcset pt "Role:" "Papel:" ::msgcat::mcset pt "Title:" "Cargo:" ::msgcat::mcset pt " by " " por " # Space at the end of the next word is to distinguish it from another "About" ::msgcat::mcset pt "About " "Acerca de " ::msgcat::mcset pt "Avatar" "Avatar" ::msgcat::mcset pt "Birthday" "Data de nascimento" ::msgcat::mcset pt "Birthday:" "Data de nascimento:" ::msgcat::mcset pt "Client" "Cliente" ::msgcat::mcset pt "Client Info" "Informação do cliente" ::msgcat::mcset pt "Client:" "Cliente:" ::msgcat::mcset pt "Computer" "Computador" ::msgcat::mcset pt "Day:" "Dia:" ::msgcat::mcset pt "Description:" "Descrição:" ::msgcat::mcset pt "Image" "Imagem" ::msgcat::mcset pt "Interval:" "Intervalo:" ::msgcat::mcset pt "Last Activity or Uptime" "Última actividade ou tempo de\ actividade" ::msgcat::mcset pt "List of users for userinfo." "Lista de utilizadores por\ userinfo." ::msgcat::mcset pt "Load Image" "Carregar imagem" ::msgcat::mcset pt "Month:" "Mês:" ::msgcat::mcset pt "None" "Nenhuma" ::msgcat::mcset pt "OS:" "SO:" ::msgcat::mcset pt "Photo" "Foto" ::msgcat::mcset pt "Presence" "Presença" ::msgcat::mcset pt "Presence id signed" "ID de presença assinado" ::msgcat::mcset pt "Presence is signed" "A presença está assinada" ::msgcat::mcset pt "Time Zone:" "Zona horária:" ::msgcat::mcset pt "Time:" "Hora:" ::msgcat::mcset pt "URL" "URL" ::msgcat::mcset pt "URL:" "URL:" ::msgcat::mcset pt "Version:" "Versão:" ::msgcat::mcset pt "Year:" "Ano:" ::msgcat::mcset pt "UTC:" # utils.tcl ::msgcat::mcset pt "day" "dia" ::msgcat::mcset pt "days" "dias" ::msgcat::mcset pt "hour" "hora" ::msgcat::mcset pt "hours" "horas" ::msgcat::mcset pt "minute" "minuto" ::msgcat::mcset pt "minutes" "minutos" ::msgcat::mcset pt "second" "segundo" ::msgcat::mcset pt "seconds" "segundos" # plugins/chat/clear.tcl ::msgcat::mcset pt "Clear chat window" "Limpar janela de conversa" # plugins/jidlink/dtcp.tcl ::msgcat::mcset pt "Opening DTCP active connection" "A abrir ligação activa\ DTCP" ::msgcat::mcset pt "Opening DTCP passive connection" "A abrir ligação passiva\ DTCP" # plugins/jidlink/ibb.tcl ::msgcat::mcset pt "Opening IBB connection" "A abrir ligação IBB" # plugins/clientinfo.tcl ::msgcat::mcset pt "\n\tClient: %s" "\n\tCliente: %s" ::msgcat::mcset pt "\n\tName: %s" "\n\tNome: %s" ::msgcat::mcset pt "\n\tOS: %s" "\n\tSO: %s" # plugins/general/autoaway.tcl # "Automatically away due to idle" goes to textstatus (probably # no needs to translate) ::msgcat::mcset pt "Automatically away due to idle" "Automaticamente ausente\ devido a inactividade" # rest should be translated ::msgcat::mcset pt "Idle for %s" "Inactivo durante %s" ::msgcat::mcset pt "Idle threshold in milliseconds after that Tkabber marks\ you as away." "Intervalo de inactividade para que Tkabber te ponha em\ estado Ausente automaticamente." ::msgcat::mcset pt "Idle threshold in milliseconds after that Tkabber marks\ you as extended away." "Intervalo de inactividade para que Tkabber te\ ponha em estado Ausência Prolongada automaticamente." ::msgcat::mcset pt "Moving to extended away" "A passar para Ausência\ Prolongada" ::msgcat::mcset pt "Options for module that automatically marks you as away\ after idle threshold." "Opções para o módulo que te passa a ausente\ de forma automática depois algum tempo inactivo." ::msgcat::mcset pt "Returning from auto-away" "De volta da ausência\ automática" ::msgcat::mcset pt "Starting auto-away" "A passar para Ausência Automática" ::msgcat::mcset pt "Text status, which is set when Tkabber is moving in away\ state." "Estado textual que é utilizado pelo Tkabber quando passa ao\ estado Ausente." ::msgcat::mcset pt "Tkabber will set priority to 0 when moving in extended\ away state." "O Tkabber irá colocar a prioridade a 0 ao passar ao\ estado Ausência Prolongada." # plugins/general/conferenceinfo.tcl ::msgcat::mcset pt "\n\tCan't browse: %s" "\n\tNão é possível navegar: %s" ::msgcat::mcset pt "\nRoom is empty at %s" "\nA sala %s está vazia" ::msgcat::mcset pt "\nRoom participants at %s:" "\nParticipantes da sala %s:" ::msgcat::mcset pt "Interval after error reply on request of participants\ list" "Intervalo depois de ter sido obtido um erro ao pedir a lista\ de participantes" ::msgcat::mcset pt "Interval between requests of participants list"\ "Intervalo entre pedidos da lista de participantes" ::msgcat::mcset pt "Options for Conference Info module, that allows you to\ see list of participants in roster popup, regardless of whether you\ are currently joined with the conference." "Opções para o módulo de\ Informação sobre Conferência, que te permite ver a lista de\ participantes na janela, independentemente de participares ou não\ nela." ::msgcat::mcset pt "Use this module" "Usar este módulo" # plugins/general/message_archive.tcl ::msgcat::mcset pt "Dir" "Dir" ::msgcat::mcset pt "From/To" "De/Para" ::msgcat::mcset pt "From:" "De:" ::msgcat::mcset pt "Messages" "Mensagens" ::msgcat::mcset pt "Received/Sent" "Enviadas/Recebidas" ::msgcat::mcset pt "Subject" "Assunto" ::msgcat::mcset pt "To:" "Para:" # plugins/general/rawxml.tcl ::msgcat::mcset pt "Clear" "Limpar" ::msgcat::mcset pt "Indentation for pretty-printed XML subtags." "Indentação\ para as marcas XML." ::msgcat::mcset pt "Options for Raw XML Input module, which allows you to\ monitor incoming/outgoing traffic from connection to server and send\ custom XML stanzas." "Opções para o módulo de entrada de XML em\ bruto, que permite monitorizar o tráfego que entra e que sai na\ ligação ao servidor e enviar blocos XML" ::msgcat::mcset pt "Pretty print incoming and outgoing XML stanzas."\ "Imprimir os blocos de XML que entram e que saem com cores." ::msgcat::mcset pt "Pretty print XML" "Mostrar XML com cores" ::msgcat::mcset pt "Raw XML" "XML em bruto" ::msgcat::mcset pt "Templates" "Modelos" # plugins/unix/dockingtray.tcl ::msgcat::mcset pt "Hide Main Window" "Esconder janela principal" ::msgcat::mcset pt "Show Main Window" "Mostrar janela principal" # plugins/unix/ispell.tcl ::msgcat::mcset pt "- nothing -" "- nada -" ::msgcat::mcset pt "Check spell after every entered symbol." "Verificar erros\ ortográficos depois de cada símbolo." ::msgcat::mcset pt "Ispell dictionary encoding. If it is empty, system\ encoding is used." "Codificação do dicionário ispell. Se ficar vazio\ é utlizada a codificação do sistema." ::msgcat::mcset pt "Ispell dictionary. If it is empty, default dictionary is\ used." "Dicionário ispell. Se ficar vazio é utilizado o dicionário\ por omissão." ::msgcat::mcset pt "Path to the ispell executable." "Caminho para o\ executável do ispell." ::msgcat::mcset pt "Spell check options." "Opções de correcção ortográfica." # plugins/chat/events.tcl ::msgcat::mcset pt "%s is composing a reply" "%s está a escrever uma\ resposta" ::msgcat::mcset pt "Composing a reply" "A escrever uma resposta" ::msgcat::mcset pt "Message delivered" "Mensagem entregue" ::msgcat::mcset pt "Message delivered to %s" "Mensagem entregue a %s" ::msgcat::mcset pt "Message displayed" "Mensagem mostrada" ::msgcat::mcset pt "Message displayed to %s" "Mensagem mostrada a %s" ::msgcat::mcset pt "Message stored on %s's server" "Mensagem guardada no\ servidor de %s" ::msgcat::mcset pt "Message stored on the server" "Mensagem guardada no\ servidor" # plugins/chat/info_commands.tcl # new 20030924 ::msgcat::mcset pt "City" "Cidade" ::msgcat::mcset pt "Country" "País" ::msgcat::mcset pt "Family Name" "Apelido" ::msgcat::mcset pt "Full Name" "Nome completo" ::msgcat::mcset pt "last %s%s:" "último %s%s:" ::msgcat::mcset pt "last %s%s: %s" "último %s%s: %s" ::msgcat::mcset pt "Message stored on the server" "Mensagem guardada no\ servidor" ::msgcat::mcset pt "Middle Name" "Segundo nome" ::msgcat::mcset pt "Nickname" "Nickname" ::msgcat::mcset pt "Prefix" "Prefixo" ::msgcat::mcset pt "State " "Estado " ::msgcat::mcset pt "Suffix" "Sufixo" ::msgcat::mcset pt "time %s%s:" "tempo %s%s:" ::msgcat::mcset pt "time %s%s: %s" "tempo %s%s: %s" ::msgcat::mcset pt "vcard %s%s:" "vcard %s%s:" ::msgcat::mcset pt "vcard %s%s: %s" "vcard %s%s: %s" ::msgcat::mcset pt "vCard items to display in chat windows when using /vcard\ command." "elementos vCard a mostrar nas janelas de conversação\ quando se usa o comando /vcard." ::msgcat::mcset pt "version %s%s:" "versão %s%s:" ::msgcat::mcset pt "version %s%s: %s" "versão %s%s: %s" ::msgcat::mcset pt "Web Site" "Página web" ::msgcat::mcset pt "E-mail" ::msgcat::mcset pt "JID" ::msgcat::mcset pt "UID" # unix/wmdock.tcl ::msgcat::mcset pt "%s is %s" "%s está %s" ::msgcat::mcset pt "%s msgs" "%s mensagens" # error messages ::msgcat::mcset pt "Bad Request" "Pedido Inválido" ::msgcat::mcset pt "Conflict" "Conflito" ::msgcat::mcset pt "Forbidden" "Proibido" ::msgcat::mcset pt "Internal Server Error" "Erro interno do servidor" ::msgcat::mcset pt "Not Acceptable" "Não é aceitável" ::msgcat::mcset pt "Not Allowed" "Não é permitido" ::msgcat::mcset pt "Not Found" "Não encontrado" ::msgcat::mcset pt "Not Implemented" "Não implementado" ::msgcat::mcset pt "Payment Required" "É necessário pagar" ::msgcat::mcset pt "Redirect" "Redireccionar" ::msgcat::mcset pt "Registration Required" "É necessário registo" ::msgcat::mcset pt "Remote Server Error" "Erro do servidor remoto" ::msgcat::mcset pt "Remote Server Timeout" "Esgotou-se o tempo de espera do\ servidor remoto" ::msgcat::mcset pt "Request Timeout" "Esgotou-se o tempo de espera do pedido" ::msgcat::mcset pt "Service Unavailable" "Serviço indisponível" ::msgcat::mcset pt "Unauthorized" "Não autorizado" ::msgcat::mcset pt "Username Not Available" "O nome do utilizador não está\ disponível" # plugins/chat/complete_last_nick.tcl ::msgcat::mcset pt "Number of groupchat messages to expire nick completion\ according to the last personally addressed message." "Número de\ mensagens na sala de conferência para expirar a utilização da\ conclusão automática do nick a partir da sua saída." # plugins/chat/highlight.tcl ::msgcat::mcset pt "Enable highlighting plugin." "Activar plugin de destaque\ de mensagens." ::msgcat::mcset pt "Groupchat message highlighting plugin options." "Opções\ do plugin de destaque de mensagens de salas de conferência." ::msgcat::mcset pt "Highlight current nickname in messages." "Destacar o nick\ actual nas mensagens." ::msgcat::mcset pt "Highlight only whole words in messages." "Destacar apenas\ palavras completas nas mensagens." ::msgcat::mcset pt "Substrings to highlight in messages." "Sílabas a destacar\ nas mensagens." # plugins/general/presenceinfo.tcl ::msgcat::mcset pt "\n\tPresence is signed:" "\n\tA presença está assinada:" # /root/instala/tkabber/tkabber-plugins/whiteboard/whiteboard.tcl ::msgcat::mcset pt "%s whiteboard" "%s quadro" ::msgcat::mcset pt "Color" "Cor" ::msgcat::mcset pt "FreeHand" "Livre" ::msgcat::mcset pt "Move" "Mover" ::msgcat::mcset pt "PolyLine" "Poli-linha" ::msgcat::mcset pt "Whiteboard" "Quadro" # /root/instala/tkabber/tkabber-plugins/georoster/georoster.tcl ::msgcat::mcset pt "Automatically open GeoRoster window." "Abrir\ automaticamente a janela do GeoRoster." ::msgcat::mcset pt "Default country to use when looking at a vCard." "País a\ usar, por omissão, quando se procura num vCard." ::msgcat::mcset pt "GeoRoster" "GeoRoster" ::msgcat::mcset pt "GeoRoster options." "Opções do Georoster." ::msgcat::mcset pt "Latitude: %.2f Longitude: %.2f" "Latitude: %.2f \ Longitude: %.2f" ::msgcat::mcset pt "Send contacts to %s" "Enviar contactos a %s" ::msgcat::mcset pt "Show cities" "Mostrar cidades" ::msgcat::mcset pt "Store" "Armazenar" # /root/instala/tkabber/tkabber-plugins/chess/chess.tcl ::msgcat::mcset pt "%s want to play chess!" "%s quere jogar xadrez!" ::msgcat::mcset pt "Allow illegal moves" "Permitir movimentos ilegais" ::msgcat::mcset pt "Black" "Pretas" ::msgcat::mcset pt "Chess" "Xadrez" ::msgcat::mcset pt "Chess with %s" "Xadrez com %s" ::msgcat::mcset pt "History" "História" ::msgcat::mcset pt "Let's play chess, %s!" "Vamos jogar xadrez, %s!" ::msgcat::mcset pt "Move: " "Mover: " ::msgcat::mcset pt "Opponent %s refuse our request: %s" "O oponente %s\ recusou o teu pedido: %s" ::msgcat::mcset pt "Pawn promotion" "Promoção de peão" ::msgcat::mcset pt "Play" "Jogar" ::msgcat::mcset pt "White" "Brancas" # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/msgs/ro.msg000064400000000000000000000774711477701321300141720ustar00nobodynobody# ro.msg -- # # Romanian messages for the Tkabber XMPP client. # # Author: Adrian Rapa (e-mail & JID: adrian@dtedu.net) # Last-Updated: 25-07-2003 # avatars.tcl ::msgcat::mcset ro "No avatar to store" "Nu există nici un avatar de\ reÅ£inut." # browser.tcl ::msgcat::mcset ro "%s: %s/%s, Description: %s, Version: %s\nNumber of\ children: %s" "%s: %s/%s, Descriere: %s, Versiune: %s\nNumărul de\ copii: %s" ::msgcat::mcset ro "Browse" "Răsfoire" ::msgcat::mcset ro "JBrowser" "JBrowser" ::msgcat::mcset ro "JID:" "JID:" # chats.tcl ::msgcat::mcset ro ">>> Unable to decipher data: %s <<<" ">>> Nu am putut\ descifra datele: %s <<<" ::msgcat::mcset ro "Chat with %s" "DiscuÅ£ie cu %s" ::msgcat::mcset ro "Disconnected" "Deconectat" ::msgcat::mcset ro "Error %s" "Eroare° %s" ::msgcat::mcset ro "Error %s: %s" "Eroare %s: %s" ::msgcat::mcset ro "Invite" "Invită" ::msgcat::mcset ro "Invite %s to conferences" "Invită %s în conferinţă" ::msgcat::mcset ro "Invite users to %s" "Invită utilizatori în %s" ::msgcat::mcset ro "Invite users..." "Invită utilizatori..." ::msgcat::mcset ro "No conferences in progress..." "Nu există nici o\ conferinţă în desfăşurare..." ::msgcat::mcset ro "Please join %s" "Intră în %s" ::msgcat::mcset ro "Subject:" "Subiect:" ::msgcat::mcset ro "To:" "Către:" ::msgcat::mcset ro "Toggle encryption" "Comută criptarea" # datagathering.tcl # emoticons.tcl ::msgcat::mcset ro "Browse..." "Răsfoire..." ::msgcat::mcset ro "Connection closed" "Conexiunea a fost închisă" ::msgcat::mcset ro "Description:" "Descriere:" ::msgcat::mcset ro "File not found or not regular file: %s" "FiÅŸierul nu a\ fost găsit sau nu este un fiÅŸier obiÅŸnuit: %s" ::msgcat::mcset ro "File to Send:" "FiÅŸier de trimis:" ::msgcat::mcset ro "IP address:" "Adresă IP:" ::msgcat::mcset ro "Receive" "Primesc" ::msgcat::mcset ro "Receive file from %s" "Primesc fiÅŸier de la: %s" ::msgcat::mcset ro "Request failed: %s" "Cererea a eÅŸuat: %s" ::msgcat::mcset ro "Save as:" "Salvare ca:" ::msgcat::mcset ro "Send file to %s" "Trimite fiÅŸierul lui %s" ::msgcat::mcset ro "Size:" "Dimensiune:" ::msgcat::mcset ro "Transfering..." "Transfer..." # filters.tcl ::msgcat::mcset ro "Action" "AcÅ£iune" ::msgcat::mcset ro "Add" "Adaugă" ::msgcat::mcset ro "Edit" "Modifică" ::msgcat::mcset ro "Move down" "Mută mai jos" ::msgcat::mcset ro "Move up" "Mută mai sus" ::msgcat::mcset ro "Remove" "Åžterge" # gpgme.tcl ::msgcat::mcset ro "%s purportedly signed by %s can't be verified.\n\n%s."\ "%s pretins a fi semnat de %s, nu poate fi verificat.\n\n%s." ::msgcat::mcset ro "Change security preferences for %s" "Schimbă setările de\ securitate pentru %s" ::msgcat::mcset ro "Data purportedly sent by %s can't be deciphered.\n\n%s."\ "Datele pretinse a fi trimise de %s, nu pot fi descifrate.\n\n%s." ::msgcat::mcset ro "Encrypt traffic" "Criptează traficul" ::msgcat::mcset ro "Error in signature verification software: %s." "Eroare in\ semnătura programului de verificare: %s." ::msgcat::mcset ro "Key ID" "Identificatorul cheii" ::msgcat::mcset ro "Passphrase:" "Parola:" ::msgcat::mcset ro "Please enter passphrase" "IntroduceÅ£i parola" ::msgcat::mcset ro "Please try again" "ÃŽncercaÅ£i din nou" ::msgcat::mcset ro "Select" "Selectează" ::msgcat::mcset ro "Select Key for Signing Traffic" "Selectează cheia pentru\ traficul semnat" ::msgcat::mcset ro "Unable to encipher data for %s: %s.\n\nEncrypting traffic\ to this user is now disabled.\n\nSend it as PLAINTEXT?" "Nu am putu\ cifra datele pentru %s: %s.\n\n Traficul codat până la acest\ utilizator este dezactivat.\n\nÃŽl trimit în TEXT CLAR?" ::msgcat::mcset ro "Unable to sign message body: %s.\n\nSigning traffic is\ now disabled.\n\nSend it WITHOUT a signature?" "Nu am putu semna\ corbul mesajului: %s.\n\n Traficul semnat este acum dezactivat.\n\n\ ÃŽl trimit FÄ‚RÄ‚ semnătură?" ::msgcat::mcset ro "Unable to sign presence information: %s.\n\nPresence will\ be sent, but signing traffic is now disabled." "Nu am putu semna\ informaÅ£iile de prezenţă pentru: %s.\n\nPrezenÅŸa va fi trimisă, dar\ semnarea traficului este acum dezactivată." ::msgcat::mcset ro "User ID" "Identificatorul utilizatorului" ::msgcat::mcset ro "" # iface.tcl ::msgcat::mcset ro "Add conference..." "Adăugare conferinţă..." ::msgcat::mcset ro "Add group by regexp on JIDs..." "Adăugare grup după\ expresii regulate din JID-uri..." ::msgcat::mcset ro "Add user..." "Adăugare utilizator..." ::msgcat::mcset ro "Admin tools" "Instrumente de administrare" ::msgcat::mcset ro "Allow downloading" "Permite descărcare" ::msgcat::mcset ro "Announce" "Anunţă" ::msgcat::mcset ro "Avatar" "Avatar" ::msgcat::mcset ro "Away" "Plecat" ::msgcat::mcset ro "Browser" "Navigator" ::msgcat::mcset ro "Change password..." "Schimbare parolă..." ::msgcat::mcset ro "Chats" "DiscuÅ£ii" ::msgcat::mcset ro "Create room..." "Crează cameră..." ::msgcat::mcset ro "Customize" "Particularizare" ::msgcat::mcset ro "Delete message of the day" "Åžterge mesajul zilei" ::msgcat::mcset ro "Discovery" "Descoperire" ::msgcat::mcset ro "Do not disturb" "Nu deranjaÅ£i" ::msgcat::mcset ro "Edit my info..." "Modifică informaÅ£iile mele..." ::msgcat::mcset ro "Emphasize" "EvidenÅ£iere" ::msgcat::mcset ro "Export roster..." "Exportă listă..." ::msgcat::mcset ro "Extended Away" "Plecat mai mult" ::msgcat::mcset ro "Filters..." "Filtre..." ::msgcat::mcset ro "Free to chat" "Liber la discuÅ£ii" ::msgcat::mcset ro "Generate event messages" "Generează evenimetele\ mesajelor" ::msgcat::mcset ro "Help" "Ajutor" ::msgcat::mcset ro "Import roster..." "Importă listă..." ::msgcat::mcset ro "Invisible" "Invizibil" ::msgcat::mcset ro "Join group..." "Alăturare grup..." ::msgcat::mcset ro "Log in..." "Autentificare..." ::msgcat::mcset ro "Log out" "Deconectare" ::msgcat::mcset ro "Log out with reason..." "Deconectare cu motiv..." ::msgcat::mcset ro "Message archive" "Arhiva de mesaje" ::msgcat::mcset ro "Mute" "Fără sunet" ::msgcat::mcset ro "Online" "Conectat" ::msgcat::mcset ro "Open raw XML window" "Deschide fereastra pentru XML brut" ::msgcat::mcset ro "Open statistics monitor" "Arată statisticile" ::msgcat::mcset ro "Periodically browse roster conferences" "RăsfoieÅŸte\ periodic lista de conferinÅ£e" ::msgcat::mcset ro "Presence" "PrezenÅ£a" ::msgcat::mcset ro "Privacy rules..." "Reguli de intimitate..." ::msgcat::mcset ro "Profile on" "Pornire depanare" ::msgcat::mcset ro "Profile report" "Salvare raport depanare" ::msgcat::mcset ro "Quick help" "Ajutor rapid" ::msgcat::mcset ro "Quit" "IeÅŸire" ::msgcat::mcset ro "Roster" "Listă" ::msgcat::mcset ro "Send broadcast message..." "Trimite mesaj..." ::msgcat::mcset ro "Send message of the day..." "Trimite mesajul zilei..." ::msgcat::mcset ro "Send message..." "Trimite mesaj..." ::msgcat::mcset ro "Send to server" "Trimite la server" ::msgcat::mcset ro "Services" "Servicii" ::msgcat::mcset ro "Show user info..." "Arată informaÅ£ii utilizator..." ::msgcat::mcset ro "Smart autoscroll" "Autoderulare inteligentă" ::msgcat::mcset ro "Sound" "Sunet" ::msgcat::mcset ro "Stop autoscroll" "Fără derulare automată" ::msgcat::mcset ro "Toggle showing offline users" "Arată doar utilizatorii\ conectati sau pe toÅ£i" ::msgcat::mcset ro "Update message of the day..." "Actualizeaza mesajul\ zilei..." ::msgcat::mcset ro "Jidlink" ::msgcat::mcset ro "Chats:" "Dialoguri:" ::msgcat::mcset ro "Close tab" "ÃŽnchide pagina" ::msgcat::mcset ro "Hide/Show roster" "AfiÅŸează/Ascunde lista." ::msgcat::mcset ro "Main window:" "Fereastra principală:" ::msgcat::mcset ro "Move tab left/right" "Mută pagina în stânga/dreapta" ::msgcat::mcset ro "Previous/Next tab" "Pagina anterioară/următoare" ::msgcat::mcset ro "Quick Help" "Ajutor rapid" ::msgcat::mcset ro "Switch to tab number 10,1-9" "Comută pe pagina numărul\ 10,1-9" ::msgcat::mcset ro "Tabs:" "Pagini:" ::msgcat::mcset ro "Complete nickname" "Pseudonim complet" ::msgcat::mcset ro "Correct word" "Corectare cuvant" ::msgcat::mcset ro "Previous/Next history message" "Antecedentul/Următorul\ mesaj din istoric" ::msgcat::mcset ro "Redo" "Redo" ::msgcat::mcset ro "Right mouse" "Click dreapta" ::msgcat::mcset ro "Scroll chat window up/down" "Deruleaza discutia in\ sus/jos" ::msgcat::mcset ro "Show emoticons" "Arată emoticons" ::msgcat::mcset ro "Undo" "Undo" ::msgcat::mcset ro "About" "Despre" ::msgcat::mcset ro "Alexey Shchepin" "Alexey Shchepin" ::msgcat::mcset ro "Authors:" "Autori:" ::msgcat::mcset ro "Marshall T. Rose" "Marshall T. Rose" ::msgcat::mcset ro "Michail Litvak" "Michail Litvak" ::msgcat::mcset ro "Sergei Golovan" "Sergei Golovan" ::msgcat::mcset ro "Add new user..." "Adaugă utilizator nou..." ::msgcat::mcset ro "Cancel" "Renunţă" ::msgcat::mcset ro "Close" "ÃŽnchide" ::msgcat::mcset ro "Close all tabs" "ÃŽnchide toate paginile" ::msgcat::mcset ro "Close other tabs" "ÃŽnchide celelalte pagini" ::msgcat::mcset ro "Jabber Browser" "Navigator Jabber" ::msgcat::mcset ro "Send" "Trimite" ::msgcat::mcset ro "Show online & offline users" "Arată utilizatorii\ conectaÅ£i ÅŸi neconectaÅ£i" ::msgcat::mcset ro "Show online users only" "Arată doar utilizatorii\ conectaÅ£i" ::msgcat::mcset ro "Toggle encryption (when possible)" "Comută criptarea\ (când este posibil)" ::msgcat::mcset ro "Toggle signing" "Comută semnarea" ::msgcat::mcset ro "Use aliases" "FoloseÅŸte pseudonime" # itemedit.tcl ::msgcat::mcset ro "<- Remove" "<- Åžterge" ::msgcat::mcset ro "Add ->" "Adaugă ->" ::msgcat::mcset ro "Available groups" "Grupuri disponibile" ::msgcat::mcset ro "Current groups" "Grupuri curente" ::msgcat::mcset ro "Edit groups for %s" "Modifcă grupuri pentru %s" ::msgcat::mcset ro "Edit nickname for %s" "Modifică pseudonimul pentru %s" ::msgcat::mcset ro "Edit properties for %s" "Modifica proprietăţile pentruË›\ %s" ::msgcat::mcset ro "Group:" "Grup:" ::msgcat::mcset ro "Nickname:" "Pseudonim:" # jidlink.tcl ::msgcat::mcset ro "Jidlink connection closed" "Conexiunea Jidlink a fost\ închisă" ::msgcat::mcset ro "Opening Jidlink connection" "Deschide conexiune Jidlink" # joingrdialog.tcl ::msgcat::mcset ro "Add group" "Adaugă grup" ::msgcat::mcset ro "Address:" "Adresă:" ::msgcat::mcset ro "Create" "Creează" ::msgcat::mcset ro "Create Room" "Crează cameră" ::msgcat::mcset ro "Description:" "Description:" ::msgcat::mcset ro "Get conference info failed: %s" "ObÅ£inerea informaÅ£iilor\ despre conferinţă a eÅŸuat: %s" ::msgcat::mcset ro "Group:" "Grup:" ::msgcat::mcset ro "Join" "Alăturare" ::msgcat::mcset ro "Join failed: %s" "Alăturarea a eÅŸuat: %s" ::msgcat::mcset ro "Join group" "Alăturare grup" ::msgcat::mcset ro "Name: " "Nume:" ::msgcat::mcset ro "Nick:" "Pseudonim:" ::msgcat::mcset ro "Nickname:" "Pseudonim:" ::msgcat::mcset ro "Password (v2 only):" "Parola (numai pentru v2)" ::msgcat::mcset ro "Password:" "Parolă:" ::msgcat::mcset ro "Server:" "Server:" ::msgcat::mcset ro "use v2 protocol" "foloseÅŸte protocolul v2" # login.tcl ::msgcat::mcset ro "Authentication failed: %s\nCreate new account?"\ "Autentificarea a eÅŸuat: %s\nCreaÅ£i un cont nou?" ::msgcat::mcset ro "Change password" "Schimbă parola" ::msgcat::mcset ro "Connect via alternate server" "Conectare prin alt server" ::msgcat::mcset ro "Login" "Autentificare" ::msgcat::mcset ro "Logout with reason" "Deconectare cu motiv" ::msgcat::mcset ro "New password:" "Parola nouă:" ::msgcat::mcset ro "New passwords do not match" "Parolele noi nu se\ potrivesc" ::msgcat::mcset ro "Old password is incorrect" "Parola veche este incorectă" ::msgcat::mcset ro "Old password:" "Parola veche:" ::msgcat::mcset ro "Password change failed: %s" "Schimbarea parolei a eÅŸuat:\ %s" ::msgcat::mcset ro "Password is changed" "Parola este schimbatăË" ::msgcat::mcset ro "Password:" "Parolă:" ::msgcat::mcset ro "Port:" "Port:" ::msgcat::mcset ro "Priority:" "Prioritate:" ::msgcat::mcset ro "Profile" "Profil" ::msgcat::mcset ro "Profiles" "Profile" ::msgcat::mcset ro "Proxy Login:" "Autentificare proxy:" ::msgcat::mcset ro "Proxy Password:" "Parolă proxy:" ::msgcat::mcset ro "Proxy Port:" "Port proxy:" ::msgcat::mcset ro "Proxy Server:" "Server proxy:" ::msgcat::mcset ro "Reason:" "Motiv:" ::msgcat::mcset ro "Registration failed: %s" "ÃŽnregistrarea a eÅŸuat: %s" ::msgcat::mcset ro "Repeat new password:" "Repetă parola nouă:" ::msgcat::mcset ro "Resource:" "Resursă:" ::msgcat::mcset ro "Server:" "Server:" ::msgcat::mcset ro "SSL Port:" "Port SSL:" ::msgcat::mcset ro "Use hashed password" "FoloseÅŸte parolă codată (hashed)" ::msgcat::mcset ro "Use Proxy" "FoloseÅŸte proxy" ::msgcat::mcset ro "Use SSL" "FoloseÅŸte SSL" ::msgcat::mcset ro "Username:" "Nume utilizator:" # messages.tcl ::msgcat::mcset ro "Attached file:" "FiÅŸier ataÅŸat:" ::msgcat::mcset ro "Attached user:" "Utilizator ataÅŸat:" ::msgcat::mcset ro "Extras from" "Extras de la" ::msgcat::mcset ro "Extras from %s" "Extras de la %s" ::msgcat::mcset ro "Headlines" "Titluri" ::msgcat::mcset ro "I would like to add you to my roster." "Doresc să te\ adaug în lista de prieteni" ::msgcat::mcset ro "Invited to:" "Invitat la:" ::msgcat::mcset ro "Message body" "Corp Mesaj" ::msgcat::mcset ro "Message from" "Mesaj de la" ::msgcat::mcset ro "Message from %s" "Mesaj de la %s" ::msgcat::mcset ro "Reply" "Răspunde" ::msgcat::mcset ro "Send message" "Trimite mesaj" ::msgcat::mcset ro "Send message to %s" "Trimite mesaj lui %s" ::msgcat::mcset ro "Send subscription" "Trimite subscriere" ::msgcat::mcset ro "Send subscription to " "Trimite subscriere lui" ::msgcat::mcset ro "Send subscription to %s" "Trimite subscriere lui %s" ::msgcat::mcset ro "Sort" "Sortare" ::msgcat::mcset ro "Subscribe" "Subscrie" ::msgcat::mcset ro "Subscribe request from" "Cerere de subscriere de la" ::msgcat::mcset ro "Subscribe request from %s" "Cerere de subscriere de la\ %s" ::msgcat::mcset ro "Toggle seen" "Comută seen" ::msgcat::mcset ro "Unsubscribe" "Åžterge subscrierea" # muc.tcl ::msgcat::mcset ro "Ban" "Interzice access" ::msgcat::mcset ro "Configure" "Configureaz" ::msgcat::mcset ro "Destroy" "Distruge" ::msgcat::mcset ro "Edit admin list" "Modifică lista de administratori" ::msgcat::mcset ro "Edit ban list" "Modifică lista de bauri" ::msgcat::mcset ro "Edit member list" "Modifică lista de membrii" ::msgcat::mcset ro "Edit moderator list" "Modifică lista de moderatori" ::msgcat::mcset ro "Edit voice list" "Modifică lista de voce" ::msgcat::mcset ro "Grant Administrative Privilege" "Acordă privilegii\ administrative" ::msgcat::mcset ro "Grant Membership" "Acordă drept de membru" ::msgcat::mcset ro "Grant Moderator Privilege" "Acordă privilegiu de\ moderator" ::msgcat::mcset ro "Grant Voice" "Acordă voce" ::msgcat::mcset ro "Kick" "Dă afară" ::msgcat::mcset ro "MUC" "MUC" ::msgcat::mcset ro "Revoke Administrative Privilege" "Retrage privilegii\ administrative" ::msgcat::mcset ro "Revoke Membership" "Retrage drept de membru" ::msgcat::mcset ro "Revoke Moderator Privilege" "Retrage privilegiu de\ moderator" ::msgcat::mcset ro "Revoke Voice" "Retrage voce" ::msgcat::mcset ro "Whois" "Cine e" # presence.tcl ::msgcat::mcset ro "invalid usersatatus value " "valoare invalidă s\ statutului utilizatorului" ::msgcat::mcset ro "Not logged in" "Neautentificat" ::msgcat::mcset ro "Offline" "Neconectat" # register.tcl ::msgcat::mcset ro "Register in %s" "ÃŽnregistreazăte în %s" ::msgcat::mcset ro "Unsubscribed from %s" ::msgcat::mcset ro "We unsubscribed from %s" # roster.tcl ::msgcat::mcset ro "Add roster group by JID regexp" "Adăugare grup după\ expressi regulate din JID-uri..." ::msgcat::mcset ro "Are you sure to remove %s from roster?" "EÅŸti sigur că\ doreÅŸti să îl ÅŸtergi pe %s din listă?" ::msgcat::mcset ro "Contact Information" "InformaÅ£ii de contact" ::msgcat::mcset ro "Edit item..." "Modifică element..." ::msgcat::mcset ro "Edit security..." "Modifică securitatea..." ::msgcat::mcset ro "Invite to conference..." "Invită în conferinţă..." ::msgcat::mcset ro "is now" "este acum" ::msgcat::mcset ro "JID regexp:" "Expresie regulată din JID-uri" ::msgcat::mcset ro "Join..." "Alăturare..." ::msgcat::mcset ro "Log in" "Autentificare" ::msgcat::mcset ro "Log out" "Deconectare" ::msgcat::mcset ro "New group name:" "Nume de grup nou:" ::msgcat::mcset ro "No users in roster..." "Nu există utilizatori în\ listă..." ::msgcat::mcset ro "Raw XML input" "Introduce XML brut" ::msgcat::mcset ro "Remove..." "Åžterge..." ::msgcat::mcset ro "Rename roster group" "Redenumire grup din listă" ::msgcat::mcset ro "Rename..." "Redenumire" ::msgcat::mcset ro "Resubscribe" "Subscrie din nou" ::msgcat::mcset ro "Resubscribe to all users in group..." "Resubscrie către\ toÅ£i utilizatorii din grup..." ::msgcat::mcset ro "Send" "Trimite" ::msgcat::mcset ro "Send contacts to" "Trimite contactele către" ::msgcat::mcset ro "Send custom presence" "Trimite prezenţă personalizată" ::msgcat::mcset ro "Send file via Jidlink..." "Trimite fiÅŸier folosind\ Jidlink..." ::msgcat::mcset ro "Send file..." "Trimite fiÅŸier..." ::msgcat::mcset ro "Send users..." "Trimite utilizatori..." ::msgcat::mcset ro "Show history" "Arată istoric" ::msgcat::mcset ro "Show info" "Arată informaÅ£ii" ::msgcat::mcset ro "Start chat" "PorneÅŸte discuÅ£ie" ::msgcat::mcset ro "Undefined" "Nedefinit" # search.tcl ::msgcat::mcset ro "OK" "OK" ::msgcat::mcset ro "Search again" "Caută din nou" ::msgcat::mcset ro "Search in" "Caută în" # splash.tcl ::msgcat::mcset ro "auto-away" "retragere automată" ::msgcat::mcset ro "avatars" "avatars" ::msgcat::mcset ro "balloon help" "ajutor cu baloane" ::msgcat::mcset ro "browsing" "navigare" ::msgcat::mcset ro "configuration" "configuraÅ£ie" ::msgcat::mcset ro "connections" "conexiuni" ::msgcat::mcset ro "cryptographics" "criptografie" ::msgcat::mcset ro "emoticons" "emoticons" ::msgcat::mcset ro "extension management" "administrare extensii" ::msgcat::mcset ro "file transfer" "transfer fiÅŸiere" ::msgcat::mcset ro "jabber chat" "discuÅ£ii jabber" ::msgcat::mcset ro "jabber groupchats" "discuÅ£ii în group jabber" ::msgcat::mcset ro "jabber iq" "iq jabber" ::msgcat::mcset ro "jabber presence" "prezenţă jabber" ::msgcat::mcset ro "jabber registration" "înregistrare jabber" ::msgcat::mcset ro "jabber xml" "jabber xml" ::msgcat::mcset ro "kde" "kde" ::msgcat::mcset ro "message/headline" "mesaj/titlu" ::msgcat::mcset ro "plugin management" "administrare plugin-uri" ::msgcat::mcset ro "presence" "prezenÅ£a" ::msgcat::mcset ro "rosters" "liste" ::msgcat::mcset ro "searching" "căutare" #::msgcat::mcset ro "text undo" "" ::msgcat::mcset ro "user interface" "interfaţă utilizator" ::msgcat::mcset ro "utilities" "utilitare" ::msgcat::mcset ro "wmaker" "wmaker" # userinfo.tcl ::msgcat::mcset ro "%s info" "InformaÅ£ii %s" ::msgcat::mcset ro "Address" "Adresă" ::msgcat::mcset ro "Address 2:" "Adresă 2:" ::msgcat::mcset ro "Address:" "Adresă:" ::msgcat::mcset ro "BBS:" "BBS:" ::msgcat::mcset ro "Cell:" "Mobil:" ::msgcat::mcset ro "City:" "OraÅŸ:" ::msgcat::mcset ro "Country:" "Å¢ară:" ::msgcat::mcset ro "Details" "Detalii" ::msgcat::mcset ro "E-mail:" "E-mail" ::msgcat::mcset ro "Family Name:" "Nume de familie:" ::msgcat::mcset ro "Fax:" "Fax:" ::msgcat::mcset ro "Full Name:" "Nume complet:" ::msgcat::mcset ro "Geographical position" "PoziÅ£ie geografică" ::msgcat::mcset ro "Home:" "Acasă:" ::msgcat::mcset ro "Information" "InformaÅ£ii" ::msgcat::mcset ro "ISDN:" "ISDN:" ::msgcat::mcset ro "Latitude:" "Latitudine:" ::msgcat::mcset ro "Location" "LocaÅ£ie" ::msgcat::mcset ro "Longitude:" "Longitudine:" ::msgcat::mcset ro "Message Recorder:" "ÃŽnregistrator de mesaje:" ::msgcat::mcset ro "Middle Name:" "IniÅ£iala tatălui:" ::msgcat::mcset ro "Modem:" "Modem:" ::msgcat::mcset ro "Name" "Nume" ::msgcat::mcset ro "Name:" "nume:" ::msgcat::mcset ro "Nickname:" "Pseudonim:" ::msgcat::mcset ro "Organization" "OrganizaÅ£ie" ::msgcat::mcset ro "Pager:" "Pager:" ::msgcat::mcset ro "PCS:" "PCS:" ::msgcat::mcset ro "Personal" "Personale" ::msgcat::mcset ro "Phones" "Telefoane" ::msgcat::mcset ro "Postal Code:" "Cod PoÅŸtal:" ::msgcat::mcset ro "Preferred:" "Preferat:" ::msgcat::mcset ro "Prefix:" "Prefix:" ::msgcat::mcset ro "Show" "Arată" ::msgcat::mcset ro "Show user info" "Arată infotmaÅ£ii utilizator" ::msgcat::mcset ro "State:" "Stat/JudeÅ£:" ::msgcat::mcset ro "Suffix:" "Sufix:" ::msgcat::mcset ro "Telephone numbers" "Numere telefon" ::msgcat::mcset ro "Video:" "Video:" ::msgcat::mcset ro "Voice:" "Voce:" ::msgcat::mcset ro "Web Site:" "Pagină web:" ::msgcat::mcset ro "Work:" "Serviciu:" ::msgcat::mcset ro "JID:" ::msgcat::mcset ro "UID:" # Space at the end of the next word is to distinguish it from another "Name:" ::msgcat::mcset ro "Name: " "Nume:" ::msgcat::mcset ro "Unit:" "Unitate:" # Space at the end of the next word is to distinguish it from # another "Personal" ::msgcat::mcset ro "Personal " "Personal" ::msgcat::mcset ro "Role:" "Rol:" ::msgcat::mcset ro "Title:" "Titlu:" # Space at the end of the next word is to distinguish it from another "About" ::msgcat::mcset ro " by " " de " ::msgcat::mcset ro "About " "Despre" ::msgcat::mcset ro "Avatar" "Avatar" ::msgcat::mcset ro "Birthday" "Zi de naÅŸtere" ::msgcat::mcset ro "Birthday:" "Zi de naÅŸtere:" ::msgcat::mcset ro "Client" "Client" ::msgcat::mcset ro "Client Info" "InformaÅ£ii client" ::msgcat::mcset ro "Client:" "Client:" ::msgcat::mcset ro "Computer" "Computer" ::msgcat::mcset ro "Description:" "Descriere:" ::msgcat::mcset ro "Image" "Imagine" ::msgcat::mcset ro "Interval:" "Interval:" ::msgcat::mcset ro "Last Activity or Uptime" "Ultima activitate" ::msgcat::mcset ro "Load Image" "ÃŽncarcă imagine" ::msgcat::mcset ro "None" "Fără" ::msgcat::mcset ro "OS:" "Sistem de operare:" ::msgcat::mcset ro "Photo" "Fotografie" ::msgcat::mcset ro "Presence" "Prezenţă" ::msgcat::mcset ro "Presence id signed" "Identificator prezenţă semnat de" ::msgcat::mcset ro "Time Zone:" "Fus orar:" ::msgcat::mcset ro "Time:" "Timp:" ::msgcat::mcset ro "URL" "URL" ::msgcat::mcset ro "URL:" "URL:" ::msgcat::mcset ro "Version:" "Versiune:" ::msgcat::mcset ro "UTC:" # plugins/jidlink/dtcp.tcl ::msgcat::mcset ro "Opening DTCP active connection" "Deschid legătura DTCP\ activă" ::msgcat::mcset ro "Opening DTCP passive connection" "Deschid legătura DTCP\ pasivă" # plugins/jidlink/ibb.tcl ::msgcat::mcset ro "Opening IBB connection" "Deschid legătură IBB" # plugins/clientinfo.tcl ::msgcat::mcset ro "\n\tClient: %s" "\n\tClient: %s" ::msgcat::mcset ro "\n\tOS: %s" "\n\tSistem operare: %s" # unix/autoaway.tcl # "Automatically away due to idle" goes to textstatus (probably # no needs to translate) ::msgcat::mcset ro "Automatically away due to idle" "Plecat automat datorită\ inactivităţii" # rest should be translated ::msgcat::mcset ro "Idle for %s" "Inactiv pentru " ::msgcat::mcset ro "Moving to extended away" "Trecere în Plecat mai mult" ::msgcat::mcset ro "Returning from auto-away" "Revenire din auto-Plecat" ::msgcat::mcset ro "Starting auto-away" "Pornire auto-Plecat" # unix/dockingtray.tcl ::msgcat::mcset ro "Hide Main Window" "Ascunde fereastra principală" ::msgcat::mcset ro "Show Main Window" "Arată fereastra principală" # unix/ispell.tcl ::msgcat::mcset ro "- nothing -" "- nimic -" # unix/wmdock.tcl ::msgcat::mcset ro "%s is %s" "%s este %s" ::msgcat::mcset ro "%s msgs" "%s mdeaje." ::msgcat::mcset ro "%s SSL Certificate Info" "InformaÅ£ii certificat SSL\ pentru %s" ::msgcat::mcset ro "Begin date:" "Data de începere:" ::msgcat::mcset ro "Chat options." "OpÅ£iuni discuÅ£ii." ::msgcat::mcset ro "Cipher:" "Algoritm:" ::msgcat::mcset ro "Colors for tab alert levels." "Culorile pentru nivelul\ activităţii pe pagină." ::msgcat::mcset ro "Default directory for downloaded files." "Directorul\ implicit unde vor fi descărcate fiÅŸierele." ::msgcat::mcset ro "Directory to store logs." "Directorul unde este stocat\ jurnalul." ::msgcat::mcset ro "Enable chat window autoscroll only when last message is\ shown." "Activează auto-derularea ferestrei de discuÅ£ii numai când\ ultimul mesaj este afiÅŸat." ::msgcat::mcset ro "Enable messages emphasize." "Activează evidenÅ£ierea a\ mesajelor" ::msgcat::mcset ro "Enable nested roster groups." "Activează grupuri de listă\ amestecate." ::msgcat::mcset ro "Enable rendering of XHTML messages" "Activează randarea\ mesajelor XHTML" ::msgcat::mcset ro "Expiry date:" "Data de expirare:" ::msgcat::mcset ro "External program, which is to be executed to play sound.\ If empty, Snack library is required to play sound." "Programul extern\ cu care se redau sunetele. Dacă este gol, librăria snack este\ necesară pentru readrea sunetelor." ::msgcat::mcset ro "File Transfer options." "OpÅ£iuni transfer de fiÅŸiere." ::msgcat::mcset ro "From/To" "De la/Către" ::msgcat::mcset ro "From:" "De la:" ::msgcat::mcset ro "Generate event messages in MUC compatible conference\ rooms." "Generează evenimente de mesaje în camerel de discuÅ£ii\ compatibile MUC" ::msgcat::mcset ro "HTTP proxy address." "Adresă proxy HTTP." ::msgcat::mcset ro "HTTP proxy password." "Parolă proxy HTTP." ::msgcat::mcset ro "HTTP proxy port." "Port proxy HTTP." ::msgcat::mcset ro "HTTP proxy username." "Nume utilizator proxy HTTP." ::msgcat::mcset ro "Idle threshold in milliseconds after that Tkabber marks\ you as away." "Timpul în milisecunde după care Tkabber vă trece în\ starea de \"Plecat\"." ::msgcat::mcset ro "Idle threshold in milliseconds after that Tkabber marks\ you as extended away." "Timpul în milisecunde după care Tkabber vă\ trece în starea de \"Plecat mai mult\"." ::msgcat::mcset ro "Indentation for pretty-printed XML subtags." "Alinierea\ subtag-urilor XML formatate." ::msgcat::mcset ro "Interval after error reply on request of participants\ list" "Intervalul după care survine eroare în cererea listei\ participanÅ£ilor." ::msgcat::mcset ro "Interval between requests of participants list"\ "Intervalul dintre cererea listei participanÅ£ilor." ::msgcat::mcset ro "Issuer:" "Emitent:" ::msgcat::mcset ro "Logging options." "OpÅ£iuni jurnal." ::msgcat::mcset ro "Login options." "OpÅ£iuni autentificare." ::msgcat::mcset ro "Messages" "Mesaje" ::msgcat::mcset ro "Mute sound notification.." "Nu folosi notificările\ sonore." ::msgcat::mcset ro "Mute sound when displaying delayed groupchat messages."\ "Fără sunet la afiÅŸarea mesajelor de discuÅ£ii în grup venite cu\ întârziere." ::msgcat::mcset ro "Mute sound when displaying delayed personal chat\ messages." "Fără sunet la afiÅŸarea mesajelor personale venite cu\ întârziere." ::msgcat::mcset ro "Node" "Nod" ::msgcat::mcset ro "Open" "Deschide" ::msgcat::mcset ro "Options for Conference Info module, that allows you to\ see list of participants in roster popup, regardless of whether you\ are currently joined with the conference." "OpÅ£iuni pentru modulul de\ InformaÅ£ii despre ConferinÅ£e, care vă permite să vedeÅ£i lista de\ participanÅ£i într-un tooltip în lista de prieteni, indiferent dacă\ sunteÅ£i sau nu alăturat conferinÅ£ei." ::msgcat::mcset ro "Options for external play program" "OpÅ£iuni pentru\ programul extern." ::msgcat::mcset ro "Options for main interface." "OpÅ£iuni pentru interfaÅ£a\ principală." ::msgcat::mcset ro "Options for module that automatically marks you as away\ after idle threshold." "OpÅ£iuni pentru modulul care setează automat\ starea ca fiind Plecat după ce a expirat timpul setat." ::msgcat::mcset ro "Options for Raw XML Input module, which allows you to\ monitor incoming/outgoing traffic from connection to server and send\ custom XML stanzas." "OpÅ£iuni pentru modulul de Introdus XML Brut,\ care vă permite să monitorizaÅ£i trafic de intrare/ieÅŸire de la server\ ÅŸi să trimiteÅ£i fragmente de XML personalizate." ::msgcat::mcset ro "Parent group:" "Grup părinte:" ::msgcat::mcset ro "Password." "Parolă." ::msgcat::mcset ro "Pretty print incoming and outgoing XML stanzas."\ "Tipărirea formatată a părÅ£ilor de XML de intrare ÅŸi de ieÅŸire." ::msgcat::mcset ro "Pretty print XML" "AfiÅŸare formatată a XML-ului" ::msgcat::mcset ro "Priority." "Prioritate." ::msgcat::mcset ro "Raise new tab." "AfiÅŸează pagini noi." ::msgcat::mcset ro "Raw XML" "XML Brut" ::msgcat::mcset ro "Received/Sent" "Primite/Trimise" ::msgcat::mcset ro "Replace opened connections" "ÃŽnlocuieÅŸte conexiunile\ deschise" ::msgcat::mcset ro "Replace opened connections." "ÃŽnlocuieÅŸte conexiunile\ deschise." ::msgcat::mcset ro "Reset to Current" "Restaurează valoarea curentă." ::msgcat::mcset ro "Reset to Default" "Restaurează valoarea implicită." ::msgcat::mcset ro "Reset to Saved" "Restaurează valoarea salvată." ::msgcat::mcset ro "Resource." "Resursă." ::msgcat::mcset ro "Roster options." "OpÅ£iuni listă." ::msgcat::mcset ro "Serial number:" "Număr serial:" ::msgcat::mcset ro "Server name or IP-address." "Numele server-ului sau\ adresa IP." ::msgcat::mcset ro "Server name." "Nume server." ::msgcat::mcset ro "Server port." "Port server." ::msgcat::mcset ro "Set for Current Session" "Aplică pentru sesiunea\ curentă." ::msgcat::mcset ro "Set for Future Sessions" "Aplică pentru sesiunile\ viitoare." ::msgcat::mcset ro "Show number of unread messages in tab titles." "AfiÅŸează\ numărul de mesaje necitite în titlul tab-urilor." ::msgcat::mcset ro "Sound options." "OpÅ£iuni sunet." ::msgcat::mcset ro "SSL port." "Port SSL." ::msgcat::mcset ro "State" "Stare" ::msgcat::mcset ro "Statistics" "Statistici" ::msgcat::mcset ro "Stop chat window autoscroll." "OpreÅŸte auto-derularea\ ferestrei de discuÅ£ii." ::msgcat::mcset ro "Store group chats logs." "Stocare jurnal al discuÅ£iilor\ în grup." ::msgcat::mcset ro "Store private chats logs." "Stocare jurnal al discuÅ£iilor\ particulare." ::msgcat::mcset ro "Subject" "Subiect" ::msgcat::mcset ro "Text status, which is set when Tkabber is moving in away\ state." "Mesajul pe care tkabber îl va pune când intră in starea\ \"Plecat\"." ::msgcat::mcset ro "this option has been set and saved." "această opÅ£iune a\ fost aplicată ÅŸi salvată." ::msgcat::mcset ro "this option is unchanged from its standard setting."\ "această opÅ£iune este neschimbată faţă de setările standard." ::msgcat::mcset ro "Time interval before playing next sound (in\ milliseconds)." "Intervalul de timp dintre redarea a două sunete\ consecutive (în milisecunde)." ::msgcat::mcset ro "Timer" "Timp" ::msgcat::mcset ro "Tkabber will set priority to 0 when moving in extended\ away state." "Tkabber va aplica prioritatea 0 după trecerea în starea\ \"Plecat mai mult\"." ::msgcat::mcset ro "Units" "Unităţi" ::msgcat::mcset ro "Use explicitly-specified server address." "FoloseÅŸte\ adresa serverului specificată explicit." ::msgcat::mcset ro "Use HTTP proxy to connect." "FoloseÅŸte proxy HTTP pentru\ conectare." ::msgcat::mcset ro "Use sound notification only when being online."\ "FoloseÅŸte notificările sonore numai când sunt Conectat" ::msgcat::mcset ro "Use SSL to connect to server." "FoloseÅŸte SSL pentru\ conectarea la server." ::msgcat::mcset ro "Use this module" "FoloseÅŸte acest modul." ::msgcat::mcset ro "User name." "Nume utilizator." ::msgcat::mcset ro "Value" "Valoare" ::msgcat::mcset ro "you have edited the value, but you have not set the\ option." "valoarea este modificată, dar nu este aplicată." ::msgcat::mcset ro "you have set this option, but not saved it for future\ sessions." "valoarea este modificată, dar nu este salvată pentru\ sesiunile viitoare." # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/msgs/ru.msg000064400000000000000000005514601477701321300141730ustar00nobodynobody# ru.msg -- # # Russian messages for the Tkabber XMPP client. # # Author: Sergey Kalinin (aka BanZaj) # Updated: Sergei Golovan ::msgcat::mcset ru "\n\tActivity: %s" "\n\tЗанÑтие: %s" ::msgcat::mcset ru "\n\tAffiliation: %s" "\n\tРанг: %s" ::msgcat::mcset ru "\n\tCan't browse: %s" "\n\tПроÑмотреть не удалоÑÑŒ: %s" ::msgcat::mcset ru "\n\tClient: %s" "\n\tКлиент: %s" ::msgcat::mcset ru "\n\tLocation: %s : %s" "\n\tМеÑтонахождение: %s : %s" ::msgcat::mcset ru "\n\tMood: %s" "\n\tСоÑтоÑние: %s" ::msgcat::mcset ru "\n\tName: %s" "\n\tИмÑ: %s" ::msgcat::mcset ru "\n\tOS: %s" "\n\tОС: %s" ::msgcat::mcset ru "\n\tPresence is signed:" "\n\tПриÑутÑтвие подпиÑано:" ::msgcat::mcset ru "\n\tTune: %s - %s" "\n\tМелодиÑ: %s - %s" ::msgcat::mcset ru "\n\tUser activity subscription: %s" "\n\tПодпиÑка на\ занÑтие пользователÑ: %s" ::msgcat::mcset ru "\n\tUser location subscription: %s" "\n\tПодпиÑка на\ меÑтонахождение пользователÑ: %s" ::msgcat::mcset ru "\n\tUser mood subscription: %s" "\n\tПодпиÑка на\ ÑоÑтоÑние пользователÑ: %s" ::msgcat::mcset ru "\n\tUser tune subscription: %s" "\n\tПодпиÑка на мелодию\ пользователÑ: %s" ::msgcat::mcset ru "\nAlternative venue: %s" "\nÐльтернативное меÑто Ñбора:\ %s" ::msgcat::mcset ru "\nReason is: %s" "\nРезон: %s" ::msgcat::mcset ru "\nReason: %s" "\nРезон: %s" ::msgcat::mcset ru "\nRoom is empty at %s" "\nКомната пуÑта на %s" ::msgcat::mcset ru "\nRoom participants at %s:" "\nУчаÑтники конференции на\ %s:" ::msgcat::mcset ru " by " " " ::msgcat::mcset ru " by %s" " (Ñто Ñделал(а) %s)" ::msgcat::mcset ru "#" "â„–" ::msgcat::mcset ru "%s - Chat" "%s - Разговор" ::msgcat::mcset ru "%s has activated chat window" "%s активировал окно\ разговора" ::msgcat::mcset ru "%s has been assigned a new affiliation: %s" "%s приÑвоен\ ранг: %s" ::msgcat::mcset ru "%s has been assigned a new role: %s" "%s получил роль:\ %s" ::msgcat::mcset ru "%s has been assigned a new room position: %s/%s" "%s\ занимает положение: %s/%s" ::msgcat::mcset ru "%s has been banned" "%s запретили входить в комнату" ::msgcat::mcset ru "%s has been kicked" "%s выгнали из комнаты" ::msgcat::mcset ru "%s has been kicked because of membership loss" "%s\ выгнали из комнаты в результате потери членÑтва" ::msgcat::mcset ru "%s has been kicked because room became members-only" "%s\ выгнали из комнаты, потому что она Ñтала только Ð´Ð»Ñ Ñ‡Ð»ÐµÐ½Ð¾Ð²" ::msgcat::mcset ru "%s has changed nick to %s." "%s Ñменил пÑевдоним на %s." ::msgcat::mcset ru "%s has entered" "%s вошёл(а) в комнату" ::msgcat::mcset ru "%s has gone chat window" "%s закрыл окно разговора" ::msgcat::mcset ru "%s has inactivated chat window" "%s деактивировал окно\ разговора" ::msgcat::mcset ru "%s has left" "%s вышел(а) из комнаты" ::msgcat::mcset ru "%s Headlines" "%s новоÑти" ::msgcat::mcset ru "%s info" "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ %s" ::msgcat::mcset ru "%s invites you to conference room %s" "%s приглашает ВаÑ\ в конференцию %s" ::msgcat::mcset ru "%s is %s" "%s теперь %s" ::msgcat::mcset ru "%s is composing a reply" "%s пишет ответ" ::msgcat::mcset ru "%s is now known as %s" "%s изменил(а) Ð¸Ð¼Ñ Ð½Ð° %s" ::msgcat::mcset ru "%s is paused a reply" "%s оÑтановилÑÑ, Ð½Ð°Ð±Ð¸Ñ€Ð°Ñ Ð¾Ñ‚Ð²ÐµÑ‚" ::msgcat::mcset ru "%s msgs" "%s Ñообщ." ::msgcat::mcset ru "%s plugin" "раÑширение %s" ::msgcat::mcset ru "%s purportedly signed by %s can't be verified: %s." "То,\ что %s подпиÑано %s, невозможно проверить: %s." ::msgcat::mcset ru "%s purportedly signed by %s using key 0x%s can't be\ verified: %s." "То, что %s подпиÑано %s Ñ Ð¸Ñпользованием ключа 0x%s,\ невозможно проверить: %s." ::msgcat::mcset ru "%s request from %s" "Ð—Ð°Ð¿Ñ€Ð¾Ñ %s от %s" ::msgcat::mcset ru "%s SSL Certificate Info" "СвойÑтва Ñертификата SSL\ Ñервера %s" ::msgcat::mcset ru "%s was ignored" "%s теперь игнорируетÑÑ" ::msgcat::mcset ru "%s was unignored" "%s теперь не игнорируетÑÑ" ::msgcat::mcset ru "%s's activity changed to %s" "Пользователь %s занÑÑ‚:\ \"%s\"" ::msgcat::mcset ru "%s's activity is unset" "Пользователь %s отозвал\ публикацию Ñвоего занÑтиÑ" ::msgcat::mcset ru "%s's location changed to %s : %s" "МеÑтонахождение %s\ изменилоÑÑŒ на %s : %s" ::msgcat::mcset ru "%s's location is unset" "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ меÑтонахождении %s\ удалена" ::msgcat::mcset ru "%s's mood changed to %s" "СоÑтоÑние %s изменилоÑÑŒ на %s" ::msgcat::mcset ru "%s's mood is unset" "Пользователь %s отозвал публикацию\ Ñвоего ÑоÑтоÑниÑ" ::msgcat::mcset ru "%s's tune changed to %s - %s" "ÐœÐµÐ»Ð¾Ð´Ð¸Ñ %s изменилаÑÑŒ на\ %s - %s" ::msgcat::mcset ru "%s's tune has stopped playing" "ÐœÐµÐ»Ð¾Ð´Ð¸Ñ %s оÑтановлена." ::msgcat::mcset ru "%s's tune is unset" "Пользователь %s отозвал публикацию\ Ñвоей мелодии" ::msgcat::mcset ru "&Help" "&Помощь" ::msgcat::mcset ru "&Services" "&Службы" ::msgcat::mcset ru "- nothing -" "- нет вариантов -" ::msgcat::mcset ru ". Proceed?\n\n" ". Продолжить?\n\n" ::msgcat::mcset ru "/me has set the subject to: %s" "/me уÑтановил(а) тему в:\ %s" ::msgcat::mcset ru "<- Remove" "<- Удалить" ::msgcat::mcset ru "" "<нет>" ::msgcat::mcset ru ">>> Unable to decipher data: %s <<<" ">>> Ðе удалоÑÑŒ\ раÑшифровать данные: %s <<<" ::msgcat::mcset ru "A new room is created" "Создана Ð½Ð¾Ð²Ð°Ñ ÐºÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ" ::msgcat::mcset ru "Abbreviations:" "СокращениÑ:" ::msgcat::mcset ru "Aborted" "Прервано" ::msgcat::mcset ru "About" "О программе" ::msgcat::mcset ru "About " "О Ñебе" ::msgcat::mcset ru "Accept connections from my own JID." "Принимать\ подключение Ñ Ð¼Ð¾ÐµÐ³Ð¾ ÑобÑтвенного JID." ::msgcat::mcset ru "Accept connections from the listed JIDs." "Принимать\ подключение Ñ Ð¿ÐµÑ€ÐµÑ‡Ð¸Ñленных JID'Ñ‹." ::msgcat::mcset ru "Accept default config" "ПринÑть конфигурацию по\ умолчанию" ::msgcat::mcset ru "Accept messages from roster users only" "Принимать\ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ из контактов" ::msgcat::mcset ru "Access Error" "Ошибка доÑтупа" ::msgcat::mcset ru "Account" "Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ" ::msgcat::mcset ru "Action" "ДейÑтвие" ::msgcat::mcset ru "Activate lists at startup" "Ðктивировать ÑпиÑки при\ подключении" ::msgcat::mcset ru "Activate search panel" "Открыть панель поиÑка" ::msgcat::mcset ru "Activate visible/invisible/ignore/conference lists before\ sending initial presence." "Ðктивировать\ видимый/невидимый/игнорируемый ÑпиÑки (и ÑпиÑок конференций) перед\ тем, как объÑвлÑть о Ñвоём приÑутÑтвии в Ñети." ::msgcat::mcset ru "Activating privacy list failed: %s\n\nTry to reconnect.\ If problem persists, you may want to disable privacy list activation\ at start" "Ðе удалоÑÑŒ активировать ÑпиÑок приватноÑти:\ %s\n\nПопытайтеÑÑŒ подключитьÑÑ Ñнова. ЕÑли проблема оÑтаётÑÑ,\ возможно придётÑÑ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ активацию ÑпиÑков приватноÑти при Ñтарте" ::msgcat::mcset ru "Active" "Ðктивный" ::msgcat::mcset ru "Active Chats" "Открытые разговоры" ::msgcat::mcset ru "Activity" "ЗанÑтие" ::msgcat::mcset ru "Activity:" "ЗанÑтие:" ::msgcat::mcset ru "Add" "Добавить" ::msgcat::mcset ru "Add ->" "Добавить ->" ::msgcat::mcset ru "Add chats group in roster." "ДобавлÑть в контакты группу\ открытых разговоров." ::msgcat::mcset ru "Add Conference to Roster" "Добавление конференции в\ контакты" ::msgcat::mcset ru "Add conference to roster..." "Добавить конференцию в\ контакты..." ::msgcat::mcset ru "Add group by regexp on JIDs..." "Добавить группу по\ регулÑрному выражению Ð´Ð»Ñ JID..." ::msgcat::mcset ru "Add item" "Добавить Ñлемент" ::msgcat::mcset ru "Add JID" "Добавить JID" ::msgcat::mcset ru "Add list" "Добавить ÑпиÑок" ::msgcat::mcset ru "Add new item" "Добавить новый Ñлемент" ::msgcat::mcset ru "Add new user..." "Добавить нового пользователÑ..." ::msgcat::mcset ru "Add proxy" "Добавить прокÑи" ::msgcat::mcset ru "Add roster group by JID regexp" "Добавить группу по\ регулÑрному выражению Ð´Ð»Ñ JID" ::msgcat::mcset ru "Add user to roster..." "Добавить Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð²\ контакты..." ::msgcat::mcset ru "Add the recipient's JID and timestamp to the GPG-signed\ or encrypted outgoing messages. This prevents replay attacks." \ "ДобавлÑть JID Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ Ð¸ текущее Ð²Ñ€ÐµÐ¼Ñ Ðº ÑообщениÑм, подпиÑанным\ или зашифрованным Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ GPG. Это позволÑет предотвратить атаку\ повторного воÑпроизведениÑ." ::msgcat::mcset ru "Added abbreviation:\n%s: %s" "Добавлено Ñокращение:\n%s:\ %s" ::msgcat::mcset ru "Address" "ÐдреÑ" ::msgcat::mcset ru "Address 2" "ÐÐ´Ñ€ÐµÑ 2" ::msgcat::mcset ru "Address 2:" "ÐÐ´Ñ€ÐµÑ 2:" ::msgcat::mcset ru "Address Error" "Ошибка адреÑа" ::msgcat::mcset ru "Address type not supported" "Тип адреÑа не\ поддерживаетÑÑ" ::msgcat::mcset ru "Address type not supported by SOCKS proxy" "Тип адреÑа не\ поддерживаетÑÑ SOCKS5 прокÑи" ::msgcat::mcset ru "Address:" "ÐдреÑ:" ::msgcat::mcset ru "admin" "админ" ::msgcat::mcset ru "Admin tools" "ИнÑтрументы админиÑтратора" ::msgcat::mcset ru "Affiliation" "Ранг" ::msgcat::mcset ru "afraid" "иÑпуганное" ::msgcat::mcset ru "Alexey Shchepin" "ÐлекÑей Щепин" ::msgcat::mcset ru "All" "Ð’Ñе" ::msgcat::mcset ru "All files" "Ð’Ñе файлы" ::msgcat::mcset ru "All items:" "Добавить Ñлементы:" ::msgcat::mcset ru "All unread messages were forwarded to %s." "Ð’Ñе\ непрочитанные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð±Ñ‹Ð»Ð¸ переÑланы %s." ::msgcat::mcset ru "Allow downloading" "Разрешение загрузки" ::msgcat::mcset ru "Allow plaintext authentication mechanisms" "Разрешить\ механизмы аутентификации, иÑпользующие открытый текÑÑ‚" ::msgcat::mcset ru "Allow plaintext authentication mechanisms (when password\ is transmitted unencrypted)." "Разрешить механизмы аутентификации,\ иÑпользующие открытый текÑÑ‚ (при Ñтом пароль передаетÑÑ\ незашифрованным)." ::msgcat::mcset ru "Allow X-GOOGLE-TOKEN authentication mechanisms. It\ requires connection to Google via HTTPS." "Разрешить иÑпользование\ механизма аутентификации X-GOOGLE-TOKEN. Ð”Ð»Ñ Ñтого требуетÑÑ Ð¸Ð¼ÐµÑ‚ÑŒ\ возможноÑть ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Google Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ HTTPS." ::msgcat::mcset ru "Allow X-GOOGLE-TOKEN SASL mechanism" "Разрешить механизм\ SASL X-GOOGLE-TOKEN" ::msgcat::mcset ru "Already joined" "Уже приÑоединены" ::msgcat::mcset ru "Already joining" "Уже приÑоединÑемÑÑ" ::msgcat::mcset ru "Altitude:" "Ð’Ñ‹Ñота:" ::msgcat::mcset ru "Always use main JID label for metacontact." "Ð’Ñегда\ отображать метку оÑновного JID в заголовке метаконтакта." ::msgcat::mcset ru "amazed" "изумлённое" ::msgcat::mcset ru "An error occurred when searching in %s\n\n%s" "Возникла\ ошибка при поиÑке в %s\n\n%s" ::msgcat::mcset ru "An existing variable \"%s\" cannot be used as an XMPP\ token" "СущеÑтвующую переменную \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать в качеÑтве\ объекта XMPP" ::msgcat::mcset ru "and" "и" ::msgcat::mcset ru "angry" "раÑÑерженное" ::msgcat::mcset ru "Announce" "ОбъÑвление" ::msgcat::mcset ru "annoyed" "раздражённое" ::msgcat::mcset ru "anxious" "беÑпокойное" ::msgcat::mcset ru "Application Error" "Ошибка приложениÑ" ::msgcat::mcset ru "Approve subscription" "Утвердить подпиÑку" ::msgcat::mcset ru "April" "Ðпрель" ::msgcat::mcset ru "Are you sure to delete %s's metacontact?" "Ð’Ñ‹\ дейÑтвительно хотите удалить метаконтакт Ð´Ð»Ñ %s?" ::msgcat::mcset ru "Are you sure to delete metacontact?" "Ð’Ñ‹ дейÑтвительно\ хотите удалить метаконтакт?" ::msgcat::mcset ru "Are you sure to remove %s from roster?" "Ð’Ñ‹ дейÑтвительно\ хотите удалить %s из контактов?" ::msgcat::mcset ru "Are you sure to remove all users in group '%s' from\ roster? \n(Users which are not in this group only, will be removed\ from the roster as well.)" "Ð’Ñ‹ дейÑтвительно хотите удалить вÑех,\ входÑщих в группу '%s', из контактов? \n(Контакты, которые еÑть не\ только в Ñтой группе, удалÑÑŽÑ‚ÑÑ Ñ‚Ð¾Ð¶Ðµ.)" ::msgcat::mcset ru "Are you sure to remove group '%s' from roster? \n(Users\ which are in this group only, will be in undefined group.)" "Ð’Ñ‹\ дейÑтвительно хотите удалить группу '%s' из контактов? \n(Контакты,\ которые еÑть только в Ñтой группе, окажутÑÑ Ð±ÐµÐ· группы.)" ::msgcat::mcset ru "Area:" "МеÑто:" ::msgcat::mcset ru "aroused" "возбуждённое" ::msgcat::mcset ru "Artist:" "ИÑполнитель:" ::msgcat::mcset ru "as %s/%s" "как %s/%s" ::msgcat::mcset ru "ashamed" "приÑтыжённое" ::msgcat::mcset ru "Ask:" "ЗапроÑ:" ::msgcat::mcset ru "at the spa" "Ñ Ð² Ñпа" ::msgcat::mcset ru "Attached URL:" "Приложенный URL:" ::msgcat::mcset ru "Attached user:" "Приложенный пользователь:" ::msgcat::mcset ru "Attention" "Внимание" ::msgcat::mcset ru "August" "ÐвгуÑÑ‚" ::msgcat::mcset ru "Authentication" "ÐутентификациÑ" ::msgcat::mcset ru "Authentication error" "Ошибка аутентификации" ::msgcat::mcset ru "Authentication failed" "ÐутентифицироватьÑÑ Ð½Ðµ удалоÑÑŒ" ::msgcat::mcset ru "Authentication failed: %s" "ПодключитьÑÑ Ð½Ðµ удалоÑÑŒ: %s" ::msgcat::mcset ru "Authentication failed: %s\nCreate new account?"\ "ПодключитьÑÑ Ð½Ðµ удалоÑÑŒ: %s\nСоздать новую учетную запиÑÑŒ?" ::msgcat::mcset ru "Authentication succeeded" "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¿Ñ€Ð¾ÑˆÐ»Ð° уÑпешно" ::msgcat::mcset ru "Authorization error" "Ошибка авторизации" ::msgcat::mcset ru "Authors:" "Ðвторы:" ::msgcat::mcset ru "Auto-subscribe to other's user activity"\ "ÐвтоподпиÑыватьÑÑ Ð½Ð° занÑтие пользователей" ::msgcat::mcset ru "Auto-subscribe to other's user activity notifications."\ "ÐвтоматичеÑки подпиÑыватьÑÑ Ð½Ð° ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ занÑтии пользователей." ::msgcat::mcset ru "Auto-subscribe to other's user location"\ "ÐвтоподпиÑыватьÑÑ Ð½Ð° меÑтонахождение пользователей" ::msgcat::mcset ru "Auto-subscribe to other's user location notifications."\ "ÐвтоматичеÑки подпиÑыватьÑÑ Ð½Ð° ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ меÑтонахождении\ пользователей." ::msgcat::mcset ru "Auto-subscribe to other's user mood" "ÐвтоподпиÑыватьÑÑ\ на ÑоÑтоÑние пользователей" ::msgcat::mcset ru "Auto-subscribe to other's user mood notifications."\ "ÐвтоматичеÑки подпиÑыватьÑÑ Ð½Ð° ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ ÑоÑтоÑнии\ пользователей." ::msgcat::mcset ru "Auto-subscribe to other's user tune" "ÐвтоподпиÑыватьÑÑ\ на мелодии пользователей" ::msgcat::mcset ru "Auto-subscribe to other's user tune notifications."\ "ÐвтоматичеÑки подпиÑыватьÑÑ Ð½Ð° ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ мелодии пользователей." ::msgcat::mcset ru "Autologin to the server" "ÐвтоподключатьÑÑ Ðº Ñерверу" ::msgcat::mcset ru "Automatically away due to idle" "ÐвтоматичеÑки в\ ÑоÑтоÑнии \"отошёл\" по бездейÑтвию" ::msgcat::mcset ru "Automatically join conference upon connect"\ "ÐвтоматичеÑки приÑоединÑтьÑÑ Ðº конференции при подключении" ::msgcat::mcset ru "Available" "ДоÑтупен" ::msgcat::mcset ru "Available groups" "Группы" ::msgcat::mcset ru "Available presence" "ПриÑутÑтвие типа \"доÑтупен\"" ::msgcat::mcset ru "Avatar" "Ðватара" ::msgcat::mcset ru "avatars" "аватары" ::msgcat::mcset ru "Away" "Отошёл" ::msgcat::mcset ru "Bad format" "Ðекорректный формат" ::msgcat::mcset ru "Bad namespace prefix" "Ðекорректный Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð¿Ñ€Ð¾ÑтранÑтва\ имен" ::msgcat::mcset ru "Bad request" "Ðекорректный запроÑ" ::msgcat::mcset ru "balloon help" "вÑÐ¿Ð»Ñ‹Ð²Ð°ÑŽÑ‰Ð°Ñ Ð¿Ð¾Ð´Ñказка" ::msgcat::mcset ru "Ban" "Запретить входить в комнату" ::msgcat::mcset ru "Bearing:" "Ðаправление:" ::msgcat::mcset ru "Begin date" "Дата начала дейÑтвиÑ" ::msgcat::mcset ru "Birthday" "День рождениÑ" ::msgcat::mcset ru "Birthday:" "День рождениÑ:" ::msgcat::mcset ru "Blind carbon copy" "ÐÐµÐ²Ð¸Ð´Ð¸Ð¼Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ" ::msgcat::mcset ru "Blocking communication (XMPP privacy lists) options."\ "ÐаÑтройки блокировки Ñообщений (правил обеÑÐ¿ÐµÑ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð²Ð°Ñ‚Ð½Ð¾Ñти\ XMPP)." ::msgcat::mcset ru "bored" "Ñкукотища!" ::msgcat::mcset ru "BOSH" "BOSH" ::msgcat::mcset ru "Both TCP based and HTTP based connections" "ДлÑ\ подключений как по TCP, так и по HTTP" ::msgcat::mcset ru "Bottom" "Снизу" ::msgcat::mcset ru "brave" "вÑÑ‘ нипочём" ::msgcat::mcset ru "Browse" "ПроÑмотреть" ::msgcat::mcset ru "Browse..." "Выбрать..." ::msgcat::mcset ru "browsing" "проÑмотр Ñлужб" ::msgcat::mcset ru "brushing teeth" "чищу зубы" ::msgcat::mcset ru "Building:" "Строение:" ::msgcat::mcset ru "buying groceries" "покупаю продукты" ::msgcat::mcset ru "Cache headlines on exit and restore on start." "СохранÑть\ новоÑти при выходе и воÑÑтанавливать при Ñтарте." ::msgcat::mcset ru "Cache roster items offline and use roster versioning if\ supported by a server." "СохранÑть контакты офлайн и иÑпользовать\ протокол верÑий ÑпиÑка контактов, еÑли он поддерживаетÑÑ Ñервером." ::msgcat::mcset ru "Cached service categories and types (from disco#info)."\ "Сохраненные категории и типы Ñлужб (из disco#info)" ::msgcat::mcset ru "calm" "Ñпокойное" ::msgcat::mcset ru "Can't change nickname in MUC incompatible rooms" "Ðе могу\ Ñменить пÑевдоним в комнате, неÑовмеÑтимой Ñ MUC" ::msgcat::mcset ru "Can't open file \"%s\": %s" "Ðе удалоÑÑŒ открыть файл\ \"%s\": %s" ::msgcat::mcset ru "Can't receive file: %s" "Ðе удалоÑÑŒ получить файл: %s" ::msgcat::mcset ru "Can't switch transport to \"%s\": %s" "Ðе удалоÑÑŒ\ переключить транÑпорт на \"%s\": %s" ::msgcat::mcset ru "Cancel" "Отменить" ::msgcat::mcset ru "Cancelling configure form" "Отмена конфигурационной\ формы" ::msgcat::mcset ru "Cannot connect to %s:%s" "Ðевозможно приÑоединитьÑÑ Ðº\ %s:%s" ::msgcat::mcset ru "Cannot connect to proxy" "Ðе удалоÑÑŒ ÑоединитьÑÑ Ñ\ прокÑи" ::msgcat::mcset ru "Cannot connect to proxy %s:%s" "Ðевозможно приÑоединитьÑÑ\ к прокÑи %s:%s" ::msgcat::mcset ru "Cannot forbid digest mechanisms" "ÐÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð¿Ñ€ÐµÑ‰Ð°Ñ‚ÑŒ\ механизмы Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡ÐµÐ¹ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð² зашифрованном виде" ::msgcat::mcset ru "Cannot negotiate proxy connection" "Ðе удалоÑÑŒ\ ÑоглаÑовать Ñоединение Ñ Ð¿Ñ€Ð¾ÐºÑи" ::msgcat::mcset ru "Cannot publish empty activity" "Ð’Ñ‹ должны выбрать\ занÑтие" ::msgcat::mcset ru "Cannot publish empty mood" "Ð’Ñ‹ должны выбрать ÑоÑтоÑние" ::msgcat::mcset ru "CAPTCHA from %s" "Капча от %s" ::msgcat::mcset ru "Carbon copy" "КопиÑ" ::msgcat::mcset ru "Cell:" "Мобильный:" ::msgcat::mcset ru "Certificate has expired" "Срок дейÑÑ‚Ð²Ð¸Ñ Ñертификата\ иÑтёк" ::msgcat::mcset ru "Change icon on other users groupchat messages."\ "Показывать Ñпециальный значок при наличии новых Ñообщений от\ оÑтальных учаÑтников конференции." ::msgcat::mcset ru "Change icon on server and enter/exit groupchat messages."\ "Показывать Ñпециальный значок при наличии новых Ñообщений от Ñервера\ или Ñообщений о входе/выходе учаÑтников конференции." ::msgcat::mcset ru "Change password" "Смена паролÑ" ::msgcat::mcset ru "Change Password for %s" "Изменение Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð´Ð»Ñ %s" ::msgcat::mcset ru "Change password..." "Сменить пароль..." ::msgcat::mcset ru "Change Presence Priority" "Изменить приоритет\ приÑутÑтвиÑ" ::msgcat::mcset ru "Change priority..." "Изменить приоритет..." ::msgcat::mcset ru "Change security preferences for %s" "Изменение параметров\ безопаÑноÑти Ð´Ð»Ñ %s" ::msgcat::mcset ru "Changing accept messages from roster only: %s" "Изменение\ приема Ñообщений только из роÑтера: %s" ::msgcat::mcset ru "Chat" "Разговаривать" ::msgcat::mcset ru "Chat message" "Сообщение типа \"chat\"" ::msgcat::mcset ru "Chat message events plugin options." "ÐаÑтройки\ раÑширениÑ, отвечающего за уведомление об обработке Ñообщений в окне\ разговора." ::msgcat::mcset ru "Chat message window state plugin options." "ÐаÑтройки\ раÑширениÑ, отвечающего за уведомление о ÑоÑтоÑнии окна разговора." ::msgcat::mcset ru "Chat options." "Параметры разговора." ::msgcat::mcset ru "Chat window is active" "Окно разговора активно" ::msgcat::mcset ru "Chat window is gone" "Окно разговора закрыто" ::msgcat::mcset ru "Chat window is inactive" "Окно разговора неактивно" ::msgcat::mcset ru "Chats" "Конференции" ::msgcat::mcset ru "Chats History" "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ñ€Ð°Ð·Ð³Ð¾Ð²Ð¾Ñ€Ð¾Ð²" ::msgcat::mcset ru "Chats history" "Разговоры" ::msgcat::mcset ru "Chats history is converted.\nBackup of the old history is\ stored in %s" "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ñ€Ð°Ð·Ð³Ð¾Ð²Ð¾Ñ€Ð¾Ð² преобразована в новый\ формат.\nÐ ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Ñохранена в %s" ::msgcat::mcset ru "Chats:" "Окна разговора:" ::msgcat::mcset ru "Check spell after every entered symbol." "ПроверÑть\ правопиÑание поÑле каждого введенного Ñимвола." ::msgcat::mcset ru "Cipher" "Метод шифрованиÑ" ::msgcat::mcset ru "City" "Город" ::msgcat::mcset ru "City:" "Город:" ::msgcat::mcset ru "cleaning" "убираюÑÑŒ" ::msgcat::mcset ru "Clear" "ОчиÑтить" ::msgcat::mcset ru "Clear bookmarks" "ОчиÑтить закладки" ::msgcat::mcset ru "Clear chat window" "ОчиÑтить окно разговора" ::msgcat::mcset ru "Clear history" "ОчиÑтить иÑторию" ::msgcat::mcset ru "Clear window" "ОчиÑтить окно" ::msgcat::mcset ru "Client" "Клиент" ::msgcat::mcset ru "Client message" "Сообщение клиента" ::msgcat::mcset ru "Client's identd could not confirm the userid" "Identd\ клиента не Ñмог подтвердить личноÑть пользователÑ" ::msgcat::mcset ru "Client:" "Клиент:" ::msgcat::mcset ru "Close" "Закрыть" ::msgcat::mcset ru "Close all tabs" "Закрыть вÑе вкладки" ::msgcat::mcset ru "Close other tabs" "Закрыть оÑтальные вкладки" ::msgcat::mcset ru "Close tab" "Закрыть вкладку" ::msgcat::mcset ru "Close Tkabber" "Закрыть Tkabber" ::msgcat::mcset ru "coding" "программирую" ::msgcat::mcset ru "cold" "равнодушное" ::msgcat::mcset ru "Color message bodies in chat windows." "ИÑпользовать\ цветные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² окнах разговора." ::msgcat::mcset ru "Command not supported" "Команда не поддерживаетÑÑ" ::msgcat::mcset ru "Command to be run when you click a URL in a message. '%s'\ will be replaced with this URL (e.g. \"chromium %s >>& /dev/null\" or\ \"{C:/Program Files (x86)/Mozilla Firefox/firefox.exe} %s\")."\ "Команда, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ выполнена при нажатии на URL в Ñообщении.\ ВмеÑто '%s' будет подÑтавлен URL (например, \"chromium %s >>&\ /dev/null\" или \"{C:/Program Files (x86)/Mozilla\ Firefox/firefox.exe} %s\")." ::msgcat::mcset ru "Commands" "Команды" ::msgcat::mcset ru "Common:" "Общие:" ::msgcat::mcset ru "commuting" "трÑÑуÑÑŒ в общеÑтвенном транÑпорте" ::msgcat::mcset ru "Complete nickname or command" "Дополнить пÑевдоним или\ команду" ::msgcat::mcset ru "Component handshake aborted" "Рукопожатие компоненты\ прервано" ::msgcat::mcset ru "Component handshake failed" "Рукопожатие компоненты\ завершилоÑÑŒ неудачей" ::msgcat::mcset ru "Component handshake succeeded" "Рукопожатие компоненты\ завершилоÑÑŒ уÑпешно" ::msgcat::mcset ru "Component handshake timed out" "Рукопожатие компоненты\ прервано из-за таймаута" ::msgcat::mcset ru "Composing a reply" "Пишет ответ" ::msgcat::mcset ru "Compression" "Сжатие" ::msgcat::mcset ru "Compression aborted" "Сжатие потока прервано" ::msgcat::mcset ru "Compression negotiation failed" "СоглаÑовать Ñжатие не\ удалоÑÑŒ" ::msgcat::mcset ru "Compression negotiation successful" "Сжатие ÑоглаÑовано\ уÑпешно" ::msgcat::mcset ru "Compression setup failed" "Сжать поток не удалоÑÑŒ" ::msgcat::mcset ru "Compression timed out" "Сжатие потока прервано из-за\ таймаута" ::msgcat::mcset ru "Conference room %s will be destroyed\ permanently.\n\nProceed?" "ÐšÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ %s будет\ удалена.\n\nПродолжить?" ::msgcat::mcset ru "Conference:" "КонференциÑ:" ::msgcat::mcset ru "Conferences" "Конференции" ::msgcat::mcset ru "configuration" "конфигурациÑ" ::msgcat::mcset ru "Configure form: %s" "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ Ñ„Ð¾Ñ€Ð¼Ð°: %s" ::msgcat::mcset ru "Configure node" "Конфигурировать узел" ::msgcat::mcset ru "Configure room" "Конфигурировать комнату" ::msgcat::mcset ru "Configure room %s" "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ ÐºÐ¾Ð¼Ð½Ð°Ñ‚Ñ‹ %s" ::msgcat::mcset ru "Conflict" "Конфликт" ::msgcat::mcset ru "confused" "в замешательÑтве" ::msgcat::mcset ru "Connect via BOSH" "ПодключитьÑÑ Ñ Ð¸Ñпользованием BOSH" ::msgcat::mcset ru "Connect via HTTP polling" "ПодключитьÑÑ Ñ Ð¸Ñпользованием\ опроÑа HTTP" ::msgcat::mcset ru "Connecting to %s" "Подключение к %s" ::msgcat::mcset ru "Connection" "Соединение" ::msgcat::mcset ru "Connection aborted" "Соединение прервано" ::msgcat::mcset ru "Connection not allowed by ruleset" "Соединение не\ разрешено ÑоглаÑно правилам" ::msgcat::mcset ru "Connection refused by destination host" "Удалённый хоÑÑ‚\ отказал в Ñоединении" ::msgcat::mcset ru "Connection timed out" "Соединение прервано из-за\ таймаута" ::msgcat::mcset ru "Connection timeout" "Соединение разорвано по таймауту" ::msgcat::mcset ru "Connection via proxy aborted" "Соединение через прокÑи\ прервано" ::msgcat::mcset ru "Connection via proxy timed out" "Соединение через прокÑи\ прервано из-за таймаута" ::msgcat::mcset ru "Connection:" "Соединение:" ::msgcat::mcset ru "connections" "подключение" ::msgcat::mcset ru "Contact Information" "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ контактах" ::msgcat::mcset ru "contented" "довольное" ::msgcat::mcset ru "Conversion is finished" "Преобразование закончено" ::msgcat::mcset ru "Convert" "Преобразовать" ::msgcat::mcset ru "Convert screenname" "Преобразовать Ñкранное имÑ" ::msgcat::mcset ru "Converting Log Files" "Преобразование файлов иÑтории" ::msgcat::mcset ru "cooking" "готовлю" ::msgcat::mcset ru "Copy" "Скопировать" ::msgcat::mcset ru "Copy headline to clipboard" "Скопировать новоÑть в буфер\ обмена" ::msgcat::mcset ru "Copy JID to clipboard" "Скопировать JID в буфер обмена" ::msgcat::mcset ru "Copy real JID to clipboard" "Скопировать реальный JID в\ буфер обмена" ::msgcat::mcset ru "Copy selection to clipboard" "Скопировать выделение в\ буфер обмена" ::msgcat::mcset ru "Copy URL to clipboard" "Скопировать URL в буфер обмена" ::msgcat::mcset ru "Correct word" "ИÑправить Ñлово" ::msgcat::mcset ru "Could not start ispell server. Check your ispell path and\ dictionary name. Ispell is disabled now" "Ðе удалоÑÑŒ запуÑтить Ñервер\ ispell. Проверьте путь к ispell и Ð¸Ð¼Ñ ÑловарÑ. Ð¡ÐµÐ¹Ñ‡Ð°Ñ ispell\ отключён" ::msgcat::mcset ru "Country" "Страна" ::msgcat::mcset ru "Country:" "Страна:" ::msgcat::mcset ru "cranky" "недовольное" ::msgcat::mcset ru "Create metacontact" "Создать метаконтакт" ::msgcat::mcset ru "Create node" "Создать узел" ::msgcat::mcset ru "Created: %s" "Созданы: %s" ::msgcat::mcset ru "Creating default privacy list" "Создаём ÑпиÑок\ приватноÑти по умолчанию" ::msgcat::mcset ru "Creating default privacy list failed: %s\n\nTry to\ reconnect. If problem persists, you may want to disable privacy list\ activation at start" "Ðе удалоÑÑŒ Ñоздать ÑпиÑок приватноÑти по\ умолчанию: %s\n\nПопытайтеÑÑŒ подключитьÑÑ Ñнова. ЕÑли проблема\ оÑтаётÑÑ, возможно придётÑÑ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ активацию ÑпиÑков приватноÑти\ при Ñтарте" ::msgcat::mcset ru "cryptographics" "криптографиÑ" ::msgcat::mcset ru "curious" "любознательное" ::msgcat::mcset ru "Current groups" "Текущие группы" ::msgcat::mcset ru "Currently active profile" "Текущий дейÑтвующий профиль" ::msgcat::mcset ru "customization" "наÑтройки" ::msgcat::mcset ru "Customization of the One True Jabber Client." "ÐаÑтройка\ ИÑтинного клиента Jabber'а." ::msgcat::mcset ru "Customize" "ÐаÑтройки" ::msgcat::mcset ru "Cut" "Вырезать" ::msgcat::mcset ru "cycling" "катаюÑÑŒ на велоÑипеде" ::msgcat::mcset ru "Data purportedly sent by %s can't be deciphered.\n\n%s."\ "Данные, предположительно приÑланные от %s, невозможно\ раÑшифровать.\n\n%s." ::msgcat::mcset ru "Date" "Дата" ::msgcat::mcset ru "Date:" "Дата:" ::msgcat::mcset ru "day off" "у Ð¼ÐµÐ½Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ð¾Ð¹" ::msgcat::mcset ru "Day:" "День:" ::msgcat::mcset ru "Debug tools" "ИнÑтрументы отладки" ::msgcat::mcset ru "December" "Декабрь" ::msgcat::mcset ru "Decline subscription" "Отклонить подпиÑку" ::msgcat::mcset ru "Default" "По умолчанию" ::msgcat::mcset ru "Default directory for downloaded files." "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð²\ которой по умолчанию ÑохранÑÑŽÑ‚ÑÑ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ‹Ðµ файлы." ::msgcat::mcset ru "Default empty profile" "ПуÑтой профиль по умолчанию" ::msgcat::mcset ru "Default group for conferences in roster." "Группа по\ умолчанию Ð´Ð»Ñ ÐºÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ð¹ в контактах." ::msgcat::mcset ru "Default nested roster group delimiter." "Разделитель\ вложенных групп по умолчанию." ::msgcat::mcset ru "Default protocol for sending files." "Протокол передачи\ файлов по умолчанию." ::msgcat::mcset ru "Delay between getting focus and updating window or tab\ title in milliseconds." "Задержка (в миллиÑекундах) между получением\ фокуÑа и обновлением заголовка окна или вкладки." ::msgcat::mcset ru "Delete" "Удалить" ::msgcat::mcset ru "Delete all" "Удалить вÑе" ::msgcat::mcset ru "Delete current node and subnodes" "Удалить узел и вÑех\ его потомков" ::msgcat::mcset ru "Delete message of the day" "Удалить Ñообщение днÑ" ::msgcat::mcset ru "Delete metacontact" "Удалить метаконтакт" ::msgcat::mcset ru "Delete seen" "Удалить проÑмотренные" ::msgcat::mcset ru "Delete subnodes" "Удалить потомков узла" ::msgcat::mcset ru "Deleted abbreviation: %s" "Удалено Ñокращение: %s" ::msgcat::mcset ru "depressed" "подавленное" ::msgcat::mcset ru "Description:" "ОпиÑание:" ::msgcat::mcset ru "Destroy room" "Удалить комнату" ::msgcat::mcset ru "Details" "Детали" ::msgcat::mcset ru "Dir" "Куда" ::msgcat::mcset ru "Directory to store logs." "ДиректориÑ, в которой\ ÑохранÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ñ‹." ::msgcat::mcset ru "Disabled\n" "Отключён\n" ::msgcat::mcset ru "disappointed" "разочарованное" ::msgcat::mcset ru "Disconnected" "Соединение разорвано" ::msgcat::mcset ru "Disconnected from the room" "ОтÑоединены от комнаты" ::msgcat::mcset ru "Discovery" "Обзор" ::msgcat::mcset ru "disgusted" "чувÑтвую отвращение" ::msgcat::mcset ru "Display %s in chat window when using /vcard command."\ "Показывать параметр %s в окне разговора при иÑпользовании команды\ /vcard." ::msgcat::mcset ru "Display description of user status in chat windows."\ "Показывать детальное опиÑание ÑтатуÑа ÑобеÑедника в окне разговора." ::msgcat::mcset ru "Display headlines in single/multiple windows."\ "Показывать новоÑти в одном/неÑкольких окнах." ::msgcat::mcset ru "Display SSL warnings." "Показывать Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñ SSL." ::msgcat::mcset ru "Display status tooltip when main window is minimized to\ systray." "Показывать вÑплывающее ÑтатуÑное окно, когда главное окно\ Ñвернуто в ÑиÑтемный лоток." ::msgcat::mcset ru "Display warning dialogs when signature verification\ fails." "Показывать Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñ Ð² Ñлучае неудачи при проверке\ подпиÑи." ::msgcat::mcset ru "distracted" "раÑтерÑнное" ::msgcat::mcset ru "Do not display headline descriptions as tree nodes." "Ðе\ показывать опиÑание новоÑти в виде ветви дерева (только вÑплывающее\ окно)." ::msgcat::mcset ru "Do not disturb" "Ðе беÑпокоить" ::msgcat::mcset ru "Do nothing" "Ðе делать ничего" ::msgcat::mcset ru "doesn't want to be disturbed" "не хочет, чтобы его\ беÑпокоили" ::msgcat::mcset ru "doing chores" "занимаюÑÑŒ домашними делами" ::msgcat::mcset ru "doing maintenance" "Ñижу, Ð¿Ñ€Ð¸Ð¼ÑƒÑ Ð¿Ð¾Ñ‡Ð¸Ð½ÑÑŽ" ::msgcat::mcset ru "doing the dishes" "мою поÑуду" ::msgcat::mcset ru "doing the laundry" "Ñтираю бельё" ::msgcat::mcset ru "Don't show the login window" "Ðе показывать окно\ подключениÑ" ::msgcat::mcset ru "Down" "Вниз" ::msgcat::mcset ru "drinking" "пью" ::msgcat::mcset ru "driving" "веду машину" ::msgcat::mcset ru "eating" "ем" ::msgcat::mcset ru "Edit" "Изменить" ::msgcat::mcset ru "Edit %s color" "Изменение цвета Ð´Ð»Ñ %s" ::msgcat::mcset ru "Edit %s's Metacontact" "Редактирование метаконтакта длÑ\ %s" ::msgcat::mcset ru "Edit admin list" "Изменить ÑпиÑок админиÑтраторов" ::msgcat::mcset ru "Edit ban list" "Изменить чёрный ÑпиÑок" ::msgcat::mcset ru "Edit chat user colors" "Изменение цветов пÑевдонимов" ::msgcat::mcset ru "Edit conference list" "Изменение ÑпиÑка конференций" ::msgcat::mcset ru "Edit conference list " "Изменить ÑпиÑок конференций" ::msgcat::mcset ru "Edit groups for %s" "Изменение групп %s" ::msgcat::mcset ru "Edit ignore list" "Изменение игнорируемого ÑпиÑка" ::msgcat::mcset ru "Edit ignore list " "Изменить игнорируемый ÑпиÑок" ::msgcat::mcset ru "Edit invisible list" "Изменение невидимого ÑпиÑка" ::msgcat::mcset ru "Edit invisible list " "Изменить невидимый ÑпиÑок" ::msgcat::mcset ru "Edit item notes..." "Редактировать заметки..." ::msgcat::mcset ru "Edit item..." "Редактировать..." ::msgcat::mcset ru "Edit list" "Изменить ÑпиÑок" ::msgcat::mcset ru "Edit member list" "Изменить ÑпиÑок членов" ::msgcat::mcset ru "Edit Metacontact" "Редактирование метаконтакта" ::msgcat::mcset ru "Edit metacontact" "Редактировать метаконтакт" ::msgcat::mcset ru "Edit moderator list" "Изменить ÑпиÑок модераторов" ::msgcat::mcset ru "Edit MUC ignore rules" "Редактировать правила\ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ MUC" ::msgcat::mcset ru "Edit my info..." "Редактировать личную информацию..." ::msgcat::mcset ru "Edit nick color..." "Изменение цвета пÑевдонима..." ::msgcat::mcset ru "Edit nick colors..." "Изменить цвета пÑевдонимов..." ::msgcat::mcset ru "Edit nickname for %s" "Изменение пÑевдонима %s" ::msgcat::mcset ru "Edit outcast list" "Изменить ÑпиÑок изгнанных" ::msgcat::mcset ru "Edit owner list" "Изменить ÑпиÑок владельцев" ::msgcat::mcset ru "Edit participant list" "Изменить ÑпиÑок учаÑтников" ::msgcat::mcset ru "Edit privacy list" "Изменить ÑпиÑок приватноÑти" ::msgcat::mcset ru "Edit properties for %s" "Изменение ÑвойÑтв %s" ::msgcat::mcset ru "Edit room info..." "Редактировать информацию о\ конференции..." ::msgcat::mcset ru "Edit roster notes for %s" "Изменение заметок Ð´Ð»Ñ %s" ::msgcat::mcset ru "Edit security..." "Редактировать параметры\ безопаÑноÑти..." ::msgcat::mcset ru "Edit visible list" "Изменение видимого ÑпиÑка" ::msgcat::mcset ru "Edit visitor list" "Изменить ÑпиÑок поÑетителей" ::msgcat::mcset ru "Edit voice list" "Изменить ÑпиÑок учаÑтников" ::msgcat::mcset ru "embarrassed" "Ñмущённое" ::msgcat::mcset ru "emoticons" "Ñмоциконки" ::msgcat::mcset ru "Emphasize" "Выделение в ÑообщениÑÑ…" ::msgcat::mcset ru "Emphasize stylecoded messages using different fonts."\ "ВыделÑть ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñо Ñтилевыми кодами, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñ€Ð°Ð·Ð½Ñ‹Ðµ шрифты." ::msgcat::mcset ru "Empty nickname" "ПуÑтой пÑевдоним" ::msgcat::mcset ru "Enable announcing entity capabilities in every outgoing\ presence." "Разрешить передачу информации о возможноÑÑ‚ÑÑ… программы\ вмеÑте Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸ÐµÐ¹ о приÑутÑтвии." ::msgcat::mcset ru "Enable chat window autoscroll only when last message is\ shown." "Включить автопрокрутку окна разговора только еÑли в окне\ видно поÑледнюю Ñтроку текÑта." ::msgcat::mcset ru "Enable freedesktop system tray icon." "Включить\ freedesktop system tray icon." ::msgcat::mcset ru "Enable freedesktop systray icon." "Включить freedesktop\ systray icon." ::msgcat::mcset ru "Enable grouping contacts into a single metacontact in\ roster." "Включить группировку контактов в единые метаконтакты в\ ÑпиÑке контактов." ::msgcat::mcset ru "Enable highlighting plugin." "Включить модуль выделениÑ\ Ñлов." ::msgcat::mcset ru "Enable KDE tray icon." "ИÑпользовать значок в ÑиÑтемном\ лотке KDE." ::msgcat::mcset ru "Enable metacontacts" "Включить метаконтакты" ::msgcat::mcset ru "Enable nested roster groups." "Отображать вложенные\ группы в контактах." ::msgcat::mcset ru "Enable remote control." "Включить удалённое управление." ::msgcat::mcset ru "Enable rendering of XHTML messages." "Отображать\ ÑообщениÑ, форматированные Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ XHTML." ::msgcat::mcset ru "Enable sending chat message events." "Включить раÑÑылку\ уведомлений об обработке Ñообщений в окне разговора." ::msgcat::mcset ru "Enable sending chat state notifications." "Включить\ раÑÑылку уведомлений о ÑоÑтоÑнии окна разговора." ::msgcat::mcset ru "Enable SI transport %s." "Разрешить иÑпользование\ SI-транÑпорта %s" ::msgcat::mcset ru "Enable spellchecker in text input windows." "Разрешить\ проверку правопиÑÐ°Ð½Ð¸Ñ Ð² окнах ввода текÑта." ::msgcat::mcset ru "Enable windows tray icon." "ИÑпользовать значок в\ ÑиÑтемном лотке Windows" ::msgcat::mcset ru "Enabled\n" "Включён\n" ::msgcat::mcset ru "Encrypt messages (when possible)" "Шифровать ÑообщениÑ\ (где возможно)" ::msgcat::mcset ru "Encrypt traffic" "Шифровать ÑообщениÑ" ::msgcat::mcset ru "Encryption" "Шифрование" ::msgcat::mcset ru "Encryption (legacy SSL)" "Шифрование (Ñтарый SSL)" ::msgcat::mcset ru "Encryption (STARTTLS)" "Шифрование (STARTTLS)" ::msgcat::mcset ru "Enter screenname of contact you want to add" "Введите\ Ñкранное Ð¸Ð¼Ñ Ð´Ð¾Ð±Ð°Ð²Ð»Ñемого контакта" ::msgcat::mcset ru "Enter the new password for %s" "Введите новый пароль длÑ\ %s" ::msgcat::mcset ru "Error" "Ошибка" ::msgcat::mcset ru "Error completing command: %s" "Ошибка при завершении\ команды: %s" ::msgcat::mcset ru "Error displaying %s in browser\n\n%s" "Ошибка при\ открытии %s в окне проÑмотра Ñлужб\n\n%s" ::msgcat::mcset ru "Error executing command: %s" "Ошибка при выполнении\ команды: %s" ::msgcat::mcset ru "Error getting info: %s" "Ошибка при получении информации:\ %s" ::msgcat::mcset ru "Error getting items: %s" "Ошибка при получении Ñлементов:\ %s" ::msgcat::mcset ru "Error importing roster contact %s: %s" "Ошибка при\ импортировании контактов %s: %s" ::msgcat::mcset ru "Error in signature processing" "Ошибка при проверке\ подпиÑи" ::msgcat::mcset ru "Error in signature verification software: %s." "Ошибка в\ программе, проверÑющей цифровую подпиÑÑŒ: %s." ::msgcat::mcset ru "Error loading MUC ignore rules, purged." "Ошибка при\ загрузке правил Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ MUC. Правила удалены." ::msgcat::mcset ru "Error requesting data: %s" "Ошибка запроÑа данных: %s" ::msgcat::mcset ru "Error restoring annotations: %s" "Ошибка воÑÑтановлениÑ\ заметок: %s" ::msgcat::mcset ru "Error restoring conference bookmarks: %s" "Ошибка\ воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð°Ð´Ð¾Ðº на конференции: %s" ::msgcat::mcset ru "Error restoring metacontacts: %s" "Ошибка воÑÑтановлениÑ\ метаконтактов: %s" ::msgcat::mcset ru "Error while converting screenname: %s." "Ошибка при\ преобразовании Ñкранного имени: %s" ::msgcat::mcset ru "Error:" "Ошибка:" ::msgcat::mcset ru "excited" "взволнованное" ::msgcat::mcset ru "Exclude:" "ИÑключениÑ:" ::msgcat::mcset ru "Execute command" "Выполнить команду" ::msgcat::mcset ru "exercising" "занимаюÑÑŒ Ñпортом" ::msgcat::mcset ru "Expiry date" "Дата иÑÑ‚ÐµÑ‡ÐµÐ½Ð¸Ñ Ð´ÐµÐ¹ÑтвиÑ" ::msgcat::mcset ru "Explicitly specify host and port to connect" "Явно\ указать Ð°Ð´Ñ€ÐµÑ Ð¸ порт Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ" ::msgcat::mcset ru "Export roster" "ЭкÑпортировать контакты" ::msgcat::mcset ru "Export roster for %s..." "ЭкÑпортировать контакты %s..." ::msgcat::mcset ru "Export to XHTML" "ЭкÑпорт в XHTML" ::msgcat::mcset ru "Extended addressing fields:" "ÐŸÐ¾Ð»Ñ Ñ€Ð°Ñширенной\ адреÑации:" ::msgcat::mcset ru "Extended away" "Отошёл давно" ::msgcat::mcset ru "extension management" "управление раÑширениÑми" ::msgcat::mcset ru "External program, which is to be executed to play sound.\ If empty, Snack library is used (if available) to play sound."\ "ВнешнÑÑ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð°, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÐµÐ¼Ð°Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¸Ð³Ñ€Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð·Ð²ÑƒÐºÐ¾Ð². ЕÑли Ñтот\ параметр пуÑÑ‚, то иÑпользуетÑÑ (еÑли уÑтановлена) библиотека Snack." ::msgcat::mcset ru "Extras from %s" "Добавление от %s" ::msgcat::mcset ru "Extras from:" "Добавление от:" ::msgcat::mcset ru "Failed to connect to HTTPS proxy" "Ðе удалоÑÑŒ\ подключитьÑÑ Ðº HTTPS-прокÑи" ::msgcat::mcset ru "Failed to connect: %s" "ПодключитьÑÑ Ð½Ðµ удалоÑÑŒ: %s" ::msgcat::mcset ru "Failed to read SOCKS4a destination address" "Ðе удалоÑÑŒ\ прочитать Ð°Ð´Ñ€ÐµÑ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ SOCKS4a" ::msgcat::mcset ru "Failed to read SOCKS4a response" "Ðе удалоÑÑŒ прочитать\ ответ SOCKS4a" ::msgcat::mcset ru "Failed to read SOCKS5 authorization methods response" "Ðе\ удалоÑÑŒ прочитать ответ на Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð° авторизации SOCKS5" ::msgcat::mcset ru "Failed to read SOCKS5 authorization response" "Ðе удалоÑÑŒ\ прочитать ответ на Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¾Ð± авторизации SOCKS5" ::msgcat::mcset ru "Failed to read SOCKS5 connection response" "Ðе удалоÑÑŒ\ прочитать ответ на Ð·Ð°Ð¿Ñ€Ð¾Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ SOCKS5" ::msgcat::mcset ru "Failed to read SOCKS5 destination address type" "Ðе\ удалоÑÑŒ прочитать тип адреÑа Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ SOCKS5" ::msgcat::mcset ru "Failed to read SOCKS5 destination domain" "Ðе удалоÑÑŒ\ прочитать домен Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ SOCKS5" ::msgcat::mcset ru "Failed to read SOCKS5 destination domain length" "Ðе\ удалоÑÑŒ прочитать длину домена Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ SOCKS5" ::msgcat::mcset ru "Failed to read SOCKS5 destination IPv4 address and port"\ "Ðе удалоÑÑŒ прочитать Ð°Ð´Ñ€ÐµÑ Ð² формате IPv4 и порт Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ SOCKS5" ::msgcat::mcset ru "Failed to read SOCKS5 destination IPv6 address and port"\ "Ðе удалоÑÑŒ прочитать Ð°Ð´Ñ€ÐµÑ Ð² формате IPv6 и порт Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ SOCKS5" ::msgcat::mcset ru "Failed to read SOCKS5 destination port" "Ðе удалоÑÑŒ\ прочитать порт Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ SOCKS5" ::msgcat::mcset ru "Failed to send SOCKS4a request" "Ðе удалоÑÑŒ поÑлать\ Ð·Ð°Ð¿Ñ€Ð¾Ñ SOCKS4a" ::msgcat::mcset ru "Failed to send SOCKS5 authorization methods request" "Ðе\ удалоÑÑŒ поÑлать Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð° авторизации SOCKS5" ::msgcat::mcset ru "Failed to send SOCKS5 authorization request" "Ðе удалоÑÑŒ\ поÑлать Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ð¸ SOCKS5" ::msgcat::mcset ru "Failed to send SOCKS5 connection request" "Ðе удалоÑÑŒ\ поÑлать Ð·Ð°Ð¿Ñ€Ð¾Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ SOCKS5" ::msgcat::mcset ru "Family name" "ФамилиÑ" ::msgcat::mcset ru "Family name:" "ФамилиÑ:" ::msgcat::mcset ru "Fax:" "ФакÑ:" ::msgcat::mcset ru "Feature not implemented" "Ðе реализовано" ::msgcat::mcset ru "February" "Февраль" ::msgcat::mcset ru "Fetch all messages" "Получить вÑе ÑообщениÑ" ::msgcat::mcset ru "Fetch GPG key" "Получить ключ GPG" ::msgcat::mcset ru "Fetch message" "Получить Ñообщение" ::msgcat::mcset ru "Fetch nickname" "Получить пÑевдоним" ::msgcat::mcset ru "Fetch nicknames of all users in group" "Получить\ пÑевдонимы вÑех контактов в группе" ::msgcat::mcset ru "Fetch unseen messages" "Получить неполученные ÑообщениÑ" ::msgcat::mcset ru "Fetch user nicknames" "Получить пÑевдонимы контактов" ::msgcat::mcset ru "File %s cannot be opened: %s. History for %s (%s) is NOT\ converted\n" "Файл %s открыть не удалоÑÑŒ: %s. ИÑÑ‚Ð¾Ñ€Ð¸Ñ %s (%s) ÐЕ\ Ñконвертирована\n" ::msgcat::mcset ru "File %s cannot be opened: %s. History for %s is NOT\ converted\n" "Файл %s открыть не удалоÑÑŒ: %s. ИÑÑ‚Ð¾Ñ€Ð¸Ñ %s ÐЕ\ Ñконвертирована\n" ::msgcat::mcset ru "File %s is corrupt. History for %s (%s) is NOT\ converted\n" "Файл %s иÑпорчен. ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð»Ñ %s (%s) ÐЕ\ преобразована\n" ::msgcat::mcset ru "File %s is corrupt. History for %s is NOT converted\n"\ "Файл %s иÑпорчен. ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð»Ñ %s ÐЕ преобразована\n" ::msgcat::mcset ru "File path:" "Путь к файлу:" ::msgcat::mcset ru "file transfer" "передача файлов" ::msgcat::mcset ru "File transfer aborted" "Передача файла прервана" ::msgcat::mcset ru "File Transfer options." "Параметры передачи файлов." ::msgcat::mcset ru "Finish" "Закончить" ::msgcat::mcset ru "First name" "ИмÑ" ::msgcat::mcset ru "First name:" "ИмÑ:" ::msgcat::mcset ru "flirtatious" "кокетливое" ::msgcat::mcset ru "Floor:" "Этаж:" ::msgcat::mcset ru "Following" "Переходу по ÑÑылке" ::msgcat::mcset ru "Font to use in chat windows." "Шрифт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²\ окнах разговоров." ::msgcat::mcset ru "Font to use in roster windows." "Шрифт Ð´Ð»Ñ Ð¸ÑпользованиÑ\ в окнах ÑпиÑков контактов." ::msgcat::mcset ru "Forbidden" "Запрещено" ::msgcat::mcset ru "Force advertising this hostname (or IP address) for\ outgoing HTTP file transfers." "ОбъÑвлÑть указанное Ð¸Ð¼Ñ (или\ IP-адреÑ) Ð´Ð»Ñ Ð¸ÑходÑщей передачи файлов по HTTP." ::msgcat::mcset ru "Forced logout" "Вынужденное отключение" ::msgcat::mcset ru "Format Error" "Ошибка формата" ::msgcat::mcset ru "Format of timestamp in chat message. Refer to Tcl\ documentation of 'clock' command for description of\ format.\n\nExamples:\n \[%R\] - \[20:37\]\n \[%T\] - \[20:37:12\]\n \ \[%a %b %d %H:%M:%S %Z %Y\] - \[Thu Jan 01 03:00:00 MSK 1970\]"\ "Формат вывода даты/времени в ÑообщениÑÑ…. (Подробнее опиÑание формата\ можно узнать из документации к команде Tcl 'clock'.)\n\nПримеры:\n \ \[%R\] - \[20:37\]\n \[%T\] - \[20:37:12\]\n \[%a %b %d %H:%M:%S %Z\ %Y\] - \[Чтв Янв 01 03:00:00 MSK 1970\]" ::msgcat::mcset ru "Format of timestamp in delayed chat messages delayed for\ more than 24 hours." "Формат вывода даты/времени в ÑообщениÑÑ…,\ отправленных более Ñуток назад." ::msgcat::mcset ru "Format of timestamp in headline tree view. Set to empty\ string if you don't want to see timestamps." "Формат вывода\ даты/времени в окне новоÑтей. Ð”Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы не показывать\ дату/Ð²Ñ€ÐµÐ¼Ñ ÑовÑем, уÑтановите Ñту опцию в пуÑтую Ñтроку." ::msgcat::mcset ru "Forward headline" "ПереÑылка новоÑти" ::msgcat::mcset ru "Forward to %s" "ПереÑлать %s" ::msgcat::mcset ru "Forward..." "ПереÑлать..." ::msgcat::mcset ru "Forwarded by:" "ПереÑлано:" ::msgcat::mcset ru "Free to chat" "Свободен Ð´Ð»Ñ Ñ€Ð°Ð·Ð³Ð¾Ð²Ð¾Ñ€Ð°" ::msgcat::mcset ru "Free without disconnect" "Попытка удалить объект XMPP без\ предварительного отключениÑ" ::msgcat::mcset ru "From/To" "От кого/Кому" ::msgcat::mcset ru "From:" "От кого:" ::msgcat::mcset ru "From: " "От кого: " ::msgcat::mcset ru "frustrated" "раÑÑтроенное" ::msgcat::mcset ru "Full name" "Полное имÑ" ::msgcat::mcset ru "Full name:" "Полное имÑ:" ::msgcat::mcset ru "Full-text search" "ПолнотекÑтовый поиÑк" ::msgcat::mcset ru "gaming" "играю" ::msgcat::mcset ru "gardening" "работаю в Ñаду" ::msgcat::mcset ru "general plugins" "общие плагины" ::msgcat::mcset ru "General SOCKS server failure" "ÐžÐ±Ñ‰Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° Ñервера\ SOCKS5" ::msgcat::mcset ru "Generate chat messages when chat peer changes his/her\ status and/or status message" "Генерировать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾ том, что\ ÑобеÑедник Ñменил Ñвоё приÑутÑтвие или ÑтатуÑное Ñообщение." ::msgcat::mcset ru "Generate enter/exit messages" "Генерирование Ñообщений о\ входе/выходе" ::msgcat::mcset ru "Generate groupchat messages when occupant changes his/her\ status and/or status message." "Генерировать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾ том, что\ учаÑтник конференции Ñменил Ñвоё приÑутÑтвие или ÑтатуÑное\ Ñообщение." ::msgcat::mcset ru "Generate groupchat messages when occupant's room position\ (affiliation and/or role) changes." "Генерировать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾ том,\ что положение, занимаемое учаÑтником конференции (его ранг и/или\ роль), изменилиÑÑŒ." ::msgcat::mcset ru "Generate status messages when occupants enter/exit MUC\ compatible conference rooms." "Генерировать ÑтатуÑные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾\ входе/выходе учаÑтников в MUC-конференциÑÑ…." ::msgcat::mcset ru "Generic IQ" "Общий IQ-запроÑ" ::msgcat::mcset ru "Geographical position" "ГеографичеÑкое раÑположение" ::msgcat::mcset ru "Get items" "Получить объекты" ::msgcat::mcset ru "getting a haircut" "подÑтригаюÑÑŒ" ::msgcat::mcset ru "GIF images" "Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ GIF" ::msgcat::mcset ru "going out" "прогуливаюÑÑŒ" ::msgcat::mcset ru "Gone" "Объект Ñменил адреÑ" ::msgcat::mcset ru "Google selection" "ИÑкать выделенный текÑÑ‚ в Google" ::msgcat::mcset ru "GPG error" "Ошибка GPG" ::msgcat::mcset ru "GPG options (signing and encryption)." "Параметры GPG\ (Ñ†Ð¸Ñ„Ñ€Ð¾Ð²Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ и шифрование)." ::msgcat::mcset ru "GPG-encrypt outgoing messages where possible." "Шифровать\ иÑходÑщие ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ GPG, еÑли возможно." ::msgcat::mcset ru "GPG-sign outgoing groupchat messages." "ПодпиÑывать\ иÑходÑщие групповые ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ GPG." ::msgcat::mcset ru "GPG-sign outgoing personal messages." "ПодпиÑывать\ иÑходÑщие личные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ GPG." ::msgcat::mcset ru "GPG-sign outgoing presence updates." "ПодпиÑывать\ иÑходÑщие Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ÑутÑÑ‚Ð²Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ GPG." ::msgcat::mcset ru "GPS datum:" "СиÑтема координат GPS:" ::msgcat::mcset ru "Grant Admin Privileges" "ПредоÑтавить права\ админиÑтратора" ::msgcat::mcset ru "Grant Membership" "ПредоÑтавить членÑтво" ::msgcat::mcset ru "Grant Moderator Privileges" "ПредоÑтавить права\ модератора" ::msgcat::mcset ru "Grant Owner Privileges" "ПредоÑтавить права владельца" ::msgcat::mcset ru "Grant subscription" "ПредоÑтавить подпиÑку" ::msgcat::mcset ru "Grant Voice" "ПредоÑтавить право говорить" ::msgcat::mcset ru "grooming" "привожу ÑÐµÐ±Ñ Ð² порÑдок" ::msgcat::mcset ru "Group:" "Группа:" ::msgcat::mcset ru "Group: " "Группа: " ::msgcat::mcset ru "Groupchat message highlighting plugin options."\ "ÐаÑтройки Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ñлов в ÑообщениÑÑ… конференций." ::msgcat::mcset ru "grumpy" "ворчливое" ::msgcat::mcset ru "guilty" "виноватое" ::msgcat::mcset ru "Handle ROTFL/LOL smileys -- those like :))) -- by\ \"consuming\" all that parens and rendering the whole word with\ appropriate icon." "ЗаменÑть ROTFL/LOL обозначениÑ, которые выглÑдÑÑ‚\ как :))), ÑоответÑтвующей Ñмоциконкой, убрав повторÑющиеÑÑ\ Ñкобки." ::msgcat::mcset ru "Handling of \"emoticons\". Emoticons (also known as\ \"smileys\") are small pictures resembling a human face used to\ represent user's emotion. They are typed in as special mnemonics like\ :) or can be inserted using menu." "Обработка Ñмоциконок. Эмоциконки\ (или улыбки) Ñто небольшие картинки, похожие на человечеÑкое лицо,\ иÑпользуемые Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñмоций. Могут быть введены мнемоничеÑки,\ например как :), или вÑтавлены через меню." ::msgcat::mcset ru "Handling of \"stylecodes\". Stylecodes are (groups of)\ special formatting symbols used to emphasize parts of the text by\ setting them with boldface, italics or underlined styles, or as\ combinations of these." "Обработка Ñтилевых кодов. Стилевые коды -\ Ñто Ñпециальные Ñимволы Ð´Ð»Ñ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ñ‡Ð°Ñтей текÑта полужирным,\ курÑивным или подчеркнутым начертанием и их комбинациÑми." ::msgcat::mcset ru "hanging out" "туÑуюÑÑŒ где-то там" ::msgcat::mcset ru "happy" "ÑчаÑтливое" ::msgcat::mcset ru "having a beer" "пью пиво" ::msgcat::mcset ru "having a snack" "перекуÑываю" ::msgcat::mcset ru "having appointment" "у Ð¼ÐµÐ½Ñ Ð²Ñтреча" ::msgcat::mcset ru "having breakfast" "завтракаю" ::msgcat::mcset ru "having coffee" "пью кофе" ::msgcat::mcset ru "having dinner" "обедаю" ::msgcat::mcset ru "having lunch" "у Ð¼ÐµÐ½Ñ Ð»Ð°Ð½Ñ‡" ::msgcat::mcset ru "having tea" "пью чай" ::msgcat::mcset ru "Headline message" "Сообщение типа \"headline\"" ::msgcat::mcset ru "Headline read timeout value (in seconds)." "Величина\ таймаута (в Ñекундах), по иÑтечению которого новоÑть ÑчитаетÑÑ\ прочитанной." ::msgcat::mcset ru "Headlines" "ÐовоÑти" ::msgcat::mcset ru "Hide characters comprising stylecode markup." "Скрывать\ Ñимволы, задающие разметку Ñтилевых кодов." ::msgcat::mcset ru "Hide main window" "Убрать главное окно" ::msgcat::mcset ru "Hide/Show roster" "Скрыть/показать контакты" ::msgcat::mcset ru "Highlight current nickname in messages." "ВыделÑть\ текущий пÑевдоним в ÑообщениÑÑ…." ::msgcat::mcset ru "Highlight only whole words in messages." "ВыделÑть только\ целые Ñлова." ::msgcat::mcset ru "hiking" "хожу пешком" ::msgcat::mcset ru "History for %s" "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ñообщений %s" ::msgcat::mcset ru "Home:" "Домашний:" ::msgcat::mcset ru "Horizontal GPS error:" "Ð“Ð¾Ñ€Ð¸Ð·Ð¾Ð½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° GPS:" ::msgcat::mcset ru "Host gone" "ХоÑÑ‚ больше не обÑлуживаетÑÑ" ::msgcat::mcset ru "Host unknown" "ÐеизвеÑтный хоÑÑ‚" ::msgcat::mcset ru "Host unreachable" "ХоÑÑ‚ недоÑтижим" ::msgcat::mcset ru "Host:" "ХоÑÑ‚:" ::msgcat::mcset ru "hot" "пылаю" ::msgcat::mcset ru "HTTP options." "Параметры HTTP-транÑпорта." ::msgcat::mcset ru "HTTP Poll" "HTTP-подключение" ::msgcat::mcset ru "HTTP proxies" "HTTP-прокÑи" ::msgcat::mcset ru "HTTPS proxy negotiation aborted" "СоглаÑование Ñ\ HTTPS-прокÑи прервано" ::msgcat::mcset ru "HTTPS proxy negotiation timed out" "СоглаÑование Ñ\ HTTPS-прокÑи прервано из-за таймаута" ::msgcat::mcset ru "humbled" "Ñмиренное" ::msgcat::mcset ru "humiliated" "униженное" ::msgcat::mcset ru "hungry" "хочу еÑть" ::msgcat::mcset ru "hurt" "уÑзвлённое" ::msgcat::mcset ru "I would like to add you to my roster." "Мне бы хотелоÑÑŒ\ добавить Ð’Ð°Ñ Ð² ÑпиÑок контактов." ::msgcat::mcset ru "Iconize" "Иконизировать" ::msgcat::mcset ru "Idle for %s" "Ð’Ñ€ÐµÐ¼Ñ Ð±ÐµÐ·Ð´ÐµÐ¹ÑтвиÑ: %s" ::msgcat::mcset ru "Idle threshold in minutes after that Tkabber marks you as\ away." "Период бездейÑÑ‚Ð²Ð¸Ñ Ð² минутах, по иÑтечении которого Ñледует\ уÑтановить ÑоÑтоÑние \"Отошёл\"." ::msgcat::mcset ru "Idle threshold in minutes after that Tkabber marks you as\ extended away." "Период бездейÑÑ‚Ð²Ð¸Ñ Ð² минутах, по иÑтечении которого\ Ñледует уÑтановить ÑоÑтоÑние \"Отошёл давно\"." ::msgcat::mcset ru "If set then open chat window/tab when user doubleclicks\ roster item. Otherwise open normal message window." "ЕÑли включено,\ двойной щелчок мышью на Ñлементе ÑпиÑка контактов открывает\ окно/вкладку разговора, в противном Ñлучае открываетÑÑ Ð¾ÐºÐ½Ð¾ длÑ\ отÑылки обычного ÑообщениÑ." ::msgcat::mcset ru "Ignore" "Игнорирование" ::msgcat::mcset ru "Ignore autojoin option and do not automatically join\ conference rooms on login." "Ðе обращать Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ Ð½Ð° наÑтройку\ автоприÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¸ не приÑоединÑтьÑÑ Ðº конференциÑм автоматичеÑки\ при подключении." ::msgcat::mcset ru "Ignore chat messages" "Игнорировать приватные ÑообщениÑ" ::msgcat::mcset ru "Ignore groupchat messages" "Игнорировать групповые\ ÑообщениÑ" ::msgcat::mcset ru "Ignore list" "Игнорируемый ÑпиÑок" ::msgcat::mcset ru "Ignore mass chat state notifications in multi-user\ chatrooms." "Игнорировать маÑÑовые ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ ÑоÑтоÑнии окна\ разговора в многопользовательÑких конференциÑÑ…." ::msgcat::mcset ru "Ignoring groupchat and chat messages from selected\ occupants of multi-user conference rooms." "Игнорирование групповых и\ приватных Ñообщений от выбранных поÑетителей многопользовательÑкой\ конференции." ::msgcat::mcset ru "Illegal attribute \"xmlns\". Use -xmlns option" "Ðтрибут\ \"xmlns\" запрещён. ИÑпользуйте опцию -xmlns" ::msgcat::mcset ru "Illegal command \"%s\"" "ÐÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° \"%s\"" ::msgcat::mcset ru "Illegal IQ type \"%s\"" "Ðеправильный тип IQ-запроÑа\ \"%s\"" ::msgcat::mcset ru "Illegal nickname" "ÐедопуÑтимый пÑевдоним" ::msgcat::mcset ru "Illegal option \"%s\"" "ÐÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ Ð¾Ð¿Ñ†Ð¸Ñ \"%s\"" ::msgcat::mcset ru "Illegal presence type \"%s\"" "ÐедопуÑтимый тип\ приÑутÑÑ‚Ð²Ð¸Ñ \"%s\"" ::msgcat::mcset ru "Illegal result" "Ðекорректный результат" ::msgcat::mcset ru "Illegal value \"%s\" for option \"%s\"" "Ðеправильное\ значение \"%s\" опции \"%s\"" ::msgcat::mcset ru "Illegal value \"%s\" for option \"%s\", boolean expected"\ "Ðеправильное значение \"%s\" опции \"%s\", ожидалоÑÑŒ логичеÑкое\ значение" ::msgcat::mcset ru "Image" "Изображение" ::msgcat::mcset ru "Import roster" "Импортировать контакты" ::msgcat::mcset ru "Import roster for %s..." "Импортировать контакты длÑ\ %s..." ::msgcat::mcset ru "impressed" "под впечатлением" ::msgcat::mcset ru "Improper addressing" "ÐÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ Ð°Ð´Ñ€ÐµÑациÑ" ::msgcat::mcset ru "in a car" "еду в машине" ::msgcat::mcset ru "in a meeting" "у Ð¼ÐµÐ½Ñ Ñобрание" ::msgcat::mcset ru "in real life" "разговариваю в реале" ::msgcat::mcset ru "in_awe" "благоговейное" ::msgcat::mcset ru "in_love" "влюблённое" ::msgcat::mcset ru "inactive" "бездельничаю" ::msgcat::mcset ru "Include operating system info into a reply to version\ (jabber:iq:version) requests." "Включать информацию об операционной\ ÑиÑтеме в ответ на Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²ÐµÑ€Ñии (jabber:iq:version)." ::msgcat::mcset ru "Incorrect encoding" "ÐÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ°" ::msgcat::mcset ru "Incorrect SOCKS version" "ÐÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ SOCKS" ::msgcat::mcset ru "Incorrect SOCKS4a server version" "ÐÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ Ð²ÐµÑ€ÑиÑ\ Ñервера SOCKS4a" ::msgcat::mcset ru "Incorrect SOCKS5 server version" "ÐÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ Ð²ÐµÑ€ÑиÑ\ Ñервера SOCKS5" ::msgcat::mcset ru "Indentation for pretty-printed XML subtags." "Величина\ отÑтупа при форматировании." ::msgcat::mcset ru "indignant" "возмущённое" ::msgcat::mcset ru "Info/Query options." "Параметры Info/Query." ::msgcat::mcset ru "Info:" "ИнформациÑ:" ::msgcat::mcset ru "Information" "ИнформациÑ" ::msgcat::mcset ru "interested" "заинтереÑованное" ::msgcat::mcset ru "Internal server error" "ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° Ñервера" ::msgcat::mcset ru "Interval (in minutes) after error reply on request of\ participants list." "Интервал (в минутах) поÑле ошибки в ответ на\ Ð·Ð°Ð¿Ñ€Ð¾Ñ ÑпиÑка учаÑтников." ::msgcat::mcset ru "Interval (in minutes) between requests of participants\ list." "Интервал (в минутах) между запроÑами ÑпиÑка учаÑтников." ::msgcat::mcset ru "Interval server can wait before responding to BOSH\ request (in milliseconds)." "Интервал, в течение которого Ñервер\ может ждать перед тем, как ответить на Ð·Ð°Ð¿Ñ€Ð¾Ñ BOSH (в миллиÑекундах)" ::msgcat::mcset ru "Interval:" "Интервал:" ::msgcat::mcset ru "intoxicated" "одурманенное" ::msgcat::mcset ru "Invalid authzid" "ÐедопуÑтимый authzid" ::msgcat::mcset ru "Invalid from" "ÐедопуÑтимый From" ::msgcat::mcset ru "Invalid ID" "ÐедопуÑтимый ID" ::msgcat::mcset ru "Invalid mechanism" "ÐедопуÑтимый механизм" ::msgcat::mcset ru "Invalid namespace" "ÐедопуÑтимое проÑтранÑтво имён" ::msgcat::mcset ru "Invalid option \"%s\"" "ÐÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ Ð¾Ð¿Ñ†Ð¸Ñ \"%s\"" ::msgcat::mcset ru "Invalid signature" "ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ" ::msgcat::mcset ru "Invalid userstatus value %s" "ÐедопуÑтимое значение\ ÑтатуÑа %s" ::msgcat::mcset ru "Invalid XML" "ÐедопуÑтимый XML" ::msgcat::mcset ru "invincible" "неукротимое" ::msgcat::mcset ru "Invisible" "Ðевидимый" ::msgcat::mcset ru "Invisible list" "Ðевидимый ÑпиÑок" ::msgcat::mcset ru "Invite" "ПриглаÑить" ::msgcat::mcset ru "Invite %s to conferences" "Приглашение %s в конференцию" ::msgcat::mcset ru "Invite to conference..." "ПриглаÑить в конференцию..." ::msgcat::mcset ru "Invite users to %s" "ПриглаÑить пользователей в %s" ::msgcat::mcset ru "Invite users..." "ПриглаÑить пользователей..." ::msgcat::mcset ru "Invited to:" "Приглашение:" ::msgcat::mcset ru "IP address:" "IP адреÑ:" ::msgcat::mcset ru "IQ %s timed out" "IQ-Ð·Ð°Ð¿Ñ€Ð¾Ñ %s превыÑил Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ" ::msgcat::mcset ru "IQ id %s doesn't exist in memory" "Идентификатор\ IQ-запроÑа %s не ÑущеÑтвует" ::msgcat::mcset ru "is available" "доÑтупен Ð´Ð»Ñ Ñ€Ð°Ð·Ð³Ð¾Ð²Ð¾Ñ€Ð°" ::msgcat::mcset ru "is away" "отошёл от компьютера" ::msgcat::mcset ru "is extended away" "давно отошёл от компьютера" ::msgcat::mcset ru "is free to chat" "Ñвободен Ð´Ð»Ñ Ñ€Ð°Ð·Ð³Ð¾Ð²Ð¾Ñ€Ð°" ::msgcat::mcset ru "is invisible" "невидим" ::msgcat::mcset ru "is unavailable" "недоÑтупен Ð´Ð»Ñ Ñ€Ð°Ð·Ð³Ð¾Ð²Ð¾Ñ€Ð°" ::msgcat::mcset ru "Ispell dictionary encoding. If it is empty, system\ encoding is used." "Кодировка ÑÐ»Ð¾Ð²Ð°Ñ€Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ правопиÑаниÑ. ЕÑли\ пуÑтаÑ, то иÑпользуетÑÑ ÑиÑÑ‚ÐµÐ¼Ð½Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ°." ::msgcat::mcset ru "Ispell options. See ispell manual for\ details.\n\nExamples:\n -d russian\n -d german -T latin1\n -C -d\ english" "Параметры командной Ñтроки ispell. Подробнее Ñм. в\ руководÑтве Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ispell.\n\nПримеры:\n -d russian\n -d\ german -T latin1\n -C -d english" ::msgcat::mcset ru "Issuer" "Издатель" ::msgcat::mcset ru "Item not found" "Объект не найден" ::msgcat::mcset ru "January" "Январь" ::msgcat::mcset ru "jealous" "ревнивое" ::msgcat::mcset ru "JID list" "СпиÑок ÑобеÑедников" ::msgcat::mcset ru "JID malformed" "Ðеправильный JID" ::msgcat::mcset ru "JID regexp:" "РегулÑрное выражение Ð´Ð»Ñ JID:" ::msgcat::mcset ru "jogging" "бегаю труÑцой" ::msgcat::mcset ru "Join" "ПриÑоединитьÑÑ" ::msgcat::mcset ru "Join conference" "ПриÑоединитьÑÑ Ðº конференции" ::msgcat::mcset ru "Join group" "Подключение к конференции" ::msgcat::mcset ru "Join group dialog data (groups)." "Данные Ð´Ð»Ñ Ð´Ð¸Ð°Ð»Ð¾Ð³Ð°\ приÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ðº группе (группы)" ::msgcat::mcset ru "Join group dialog data (nicks)." "Данные Ð´Ð»Ñ Ð´Ð¸Ð°Ð»Ð¾Ð³Ð°\ приÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ðº группе (пÑевдонимы)" ::msgcat::mcset ru "Join group dialog data (servers)." "Данные Ð´Ð»Ñ Ð´Ð¸Ð°Ð»Ð¾Ð³Ð°\ приÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ðº группе (Ñерверы)" ::msgcat::mcset ru "Join group..." "ПриÑоединитьÑÑ Ðº группе..." ::msgcat::mcset ru "Join groupchat" "ПриÑоединитьÑÑ Ðº конференции" ::msgcat::mcset ru "Join..." "ПриÑоединитьÑÑ..." ::msgcat::mcset ru "JPEG images" "Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ JPEG" ::msgcat::mcset ru "July" "Июль" ::msgcat::mcset ru "June" "Июнь" ::msgcat::mcset ru "Keep trying" "Продолжать попытки" ::msgcat::mcset ru "Key" "Ключ" ::msgcat::mcset ru "Key ID" "ID ключа" ::msgcat::mcset ru "Kick" "Выгнать" ::msgcat::mcset ru "Konstantin Khomoutov" "КонÑтантин Хомутов" ::msgcat::mcset ru "last %s%s:" "Ð²Ñ€ÐµÐ¼Ñ Ð±ÐµÐ·Ð´ÐµÐ¹ÑтвиÑ/работы %s%s:" ::msgcat::mcset ru "last %s%s: %s" "Ð²Ñ€ÐµÐ¼Ñ Ð±ÐµÐ·Ð´ÐµÐ¹ÑтвиÑ/работы %s%s: %s" ::msgcat::mcset ru "Last activity" "Ð’Ñ€ÐµÐ¼Ñ Ð±ÐµÐ·Ð´ÐµÐ¹ÑтвиÑ" ::msgcat::mcset ru "Last activity or uptime" "Ð’Ñ€ÐµÐ¼Ñ Ð±ÐµÐ·Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ Ð¸Ð»Ð¸ времÑ\ работы" ::msgcat::mcset ru "Last name" "ФамилиÑ" ::msgcat::mcset ru "Latitude" "Широта" ::msgcat::mcset ru "Latitude:" "Широта:" ::msgcat::mcset ru "Leaving room" "Покидаем комнату" ::msgcat::mcset ru "Left" "Слева" ::msgcat::mcset ru "Left mouse button" "Ð›ÐµÐ²Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° мыши" ::msgcat::mcset ru "Length:" "ПродолжительноÑть:" ::msgcat::mcset ru "List name" "Ðазвание ÑпиÑка" ::msgcat::mcset ru "List of discovered JID nodes." "СпиÑок проÑмотренных\ узлов JID." ::msgcat::mcset ru "List of discovered JIDs." "СпиÑок проÑмотренных JID." ::msgcat::mcset ru "List of JIDs to whom headlines have been sent." "СпиÑок\ JID, кому были поÑланы новоÑти." ::msgcat::mcset ru "List of logout reasons." "СпиÑок причин отключениÑ." ::msgcat::mcset ru "List of message destination JIDs." "СпиÑок JID, кому были\ поÑланы ÑообщениÑ." ::msgcat::mcset ru "List of proxy servers for SOCKS5 bytestreams (all\ available servers will be tried for mediated connection)." "СпиÑок\ прокÑи-Ñерверов Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ потока SOCKS5 (попытка иÑпользовать в\ качеÑтве поÑредника будет предпринÑта Ð´Ð»Ñ Ð²Ñех доÑтупных Ñерверов)." ::msgcat::mcset ru "Load image" "Загрузить изображение" ::msgcat::mcset ru "Load state on start" "Загружать ÑоÑтоÑние при Ñтарте" ::msgcat::mcset ru "Load state on Tkabber start." "Загружать ÑоÑтоÑние при\ Ñтарте Tkabber'а." ::msgcat::mcset ru "Loading and unloading external plugins." "Загрузка и\ выгрузка внешних раÑширений." ::msgcat::mcset ru "Loading photo failed: %s." "Ðе удалоÑÑŒ загрузить фото:\ %s." ::msgcat::mcset ru "Locality:" "ÐаÑелённый пункт:" ::msgcat::mcset ru "Location" "ÐдреÑ" ::msgcat::mcset ru "Log in" "ПодключитьÑÑ" ::msgcat::mcset ru "Log in..." "ПодключитьÑÑ..." ::msgcat::mcset ru "Log out" "ОтключитьÑÑ" ::msgcat::mcset ru "Log out with reason..." "ОтключитьÑÑ Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸ÐµÐ¼\ причины..." ::msgcat::mcset ru "Logging options." "Параметры протоколированиÑ." ::msgcat::mcset ru "Login" "Подключение" ::msgcat::mcset ru "Login is successful" "Подключение завершилоÑÑŒ уÑпешно" ::msgcat::mcset ru "Login log" "Журнал подключений" ::msgcat::mcset ru "Login options." "Параметры подключениÑ." ::msgcat::mcset ru "Login retry for %s in %s" "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° подключениÑ\ %s через %s" ::msgcat::mcset ru "Logout" "Отключение" ::msgcat::mcset ru "Logout with reason" "Отключение Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸ÐµÐ¼ причины" ::msgcat::mcset ru "Logs" "Протоколы" ::msgcat::mcset ru "lonely" "одинокое" ::msgcat::mcset ru "Longitude" "Долгота" ::msgcat::mcset ru "Longitude:" "Долгота:" ::msgcat::mcset ru "macintosh plugins" "раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¼Ð°ÐºÐ¸Ð½Ñ‚Ð¾ÑˆÐ°" ::msgcat::mcset ru "Main window:" "Главное окно:" ::msgcat::mcset ru "Malformed signature block" "Ðеправильно Ñформирована\ подпиÑÑŒ" ::msgcat::mcset ru "Manage proxy servers" "Управление прокÑи-Ñерверами" ::msgcat::mcset ru "Manually edit rules" "Изменить правила вручную" ::msgcat::mcset ru "March" "Март" ::msgcat::mcset ru "Mark all seen" "Пометить вÑе как проÑмотренные" ::msgcat::mcset ru "Mark all unseen" "Пометить вÑе как непроÑмотренные" ::msgcat::mcset ru "Mark headline read by" "Помечать новоÑть как прочитанную\ по" ::msgcat::mcset ru "Marshall T. Rose" "Маршал Т. Роуз" ::msgcat::mcset ru "Match case while searching in chat, log or disco\ windows." "ИÑпользовать чувÑтвительный к региÑтру Ñимволов поиÑк в\ окнах разговора, протокола и обзора Ñлужб." ::msgcat::mcset ru "Match contact JIDs in addition to nicknames in roster\ filter." "Подбирать не только пÑевдоним, но и JID в фильтре\ контактов." ::msgcat::mcset ru "Match:" "Образцы:" ::msgcat::mcset ru "Maximum interval length in hours for which log messages\ should be shown in newly opened chat window (if set to negative then\ the interval is unlimited)." "МакÑимальный интервал (в чаÑах) длÑ\ которого запротоколированные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ð°Ð´Ð¾ показывать во вновь\ открываемом окне разговора (еÑли положить отрицательным, то\ неограниченный интервал)." ::msgcat::mcset ru "Maximum number of characters in the history in MUC\ compatible conference rooms." "МакÑимальное чиÑло Ñимволов в\ запрашиваемой иÑтории конференции, ÑовмеÑтимой Ñ MUC." ::msgcat::mcset ru "Maximum number of log messages to show in newly opened\ chat window (if set to negative then the number is unlimited)."\ "МакÑимальное чиÑло запротоколированных Ñообщений, которое надо\ показывать во вновь открываемом окне разговора (еÑли положить\ отрицательным, то неограниченное)." ::msgcat::mcset ru "Maximum number of requests the connection manager is\ allowed to keep waiting at any time." "МакÑимальное допуÑтимое чиÑло\ параллельных неотвеченных запроÑов BOSH." ::msgcat::mcset ru "Maximum number of stanzas in the history in MUC\ compatible conference rooms." "МакÑимальное чиÑло Ñообщений в\ запрашиваемой иÑтории конференции, ÑовмеÑтимой Ñ MUC." ::msgcat::mcset ru "Maximum number of status messages to keep. If the history\ size reaches this threshold, the oldest message will be deleted\ automatically when a new one is recorded." "МакÑимальное количеÑтво\ хранимых Ñообщений ÑтатуÑа. Когда количеÑтво Ñтих Ñообщений доÑтигает\ указанного порога, Ñамое Ñтарое Ñообщение автоматичеÑки удалÑетÑÑ Ð¿Ñ€Ð¸\ добавлении нового." ::msgcat::mcset ru "Maximum poll interval." "МакÑимальный интервал между\ HTTP-запроÑами." ::msgcat::mcset ru "Maximum time interval between unsuccessful connection\ retries to the server (in minutes)." "МакÑимальный интервал времени\ между поÑледовательными безуÑпешными попытками переприÑоединитьÑÑ Ðº\ Ñерверу (в минутах)." ::msgcat::mcset ru "Maximum width of tab buttons in tabbed mode."\ "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð° кнопок заголовков вкладок в режиме Ñо\ вкладками." ::msgcat::mcset ru "May" "Май" ::msgcat::mcset ru "mean" "Ñволочное" ::msgcat::mcset ru "Mechanism too weak" "Слишком Ñлабый механизм" ::msgcat::mcset ru "member" "член" ::msgcat::mcset ru "Message" "Сообщение" ::msgcat::mcset ru "Message and Headline options." "Параметры отображениÑ\ Ñообщений и новоÑтей." ::msgcat::mcset ru "Message archive" "Ðрхив Ñообщений" ::msgcat::mcset ru "Message body" "тело ÑообщениÑ" ::msgcat::mcset ru "Message delivered" "Сообщение доÑтавлено" ::msgcat::mcset ru "Message delivered to %s" "Сообщение доÑтавлено %s" ::msgcat::mcset ru "Message displayed" "Сообщение показано" ::msgcat::mcset ru "Message displayed to %s" "Сообщение показано %s" ::msgcat::mcset ru "Message from %s" "Сообщение от %s" ::msgcat::mcset ru "Message from:" "Сообщение от:" ::msgcat::mcset ru "Message recorder:" "Ðвтоответчик:" ::msgcat::mcset ru "Message stored on %s's server" "Сообщение Ñохранено на\ Ñервере %s" ::msgcat::mcset ru "Message stored on the server" "Сообщение Ñохранено на\ Ñервере" ::msgcat::mcset ru "Messages" "СообщениÑ" ::msgcat::mcset ru "Metacontact" "Метаконтакт" ::msgcat::mcset ru "Michail Litvak" "Михаил Литвак" ::msgcat::mcset ru "Middle mouse button" "СреднÑÑ ÐºÐ½Ð¾Ð¿ÐºÐ° мыши" ::msgcat::mcset ru "Middle name" "ОтчеÑтво" ::msgcat::mcset ru "Middle name:" "ОтчеÑтво:" ::msgcat::mcset ru "Minimize" "Минимизировать" ::msgcat::mcset ru "Minimize to systray (if systray icon is enabled,\ otherwise do nothing)" "Минимизировать в ÑиÑтемный лоток (еÑли значок\ в лотке включён, иначе ничего не делать)" ::msgcat::mcset ru "Minimum poll interval." "Минимальный интервал между\ HTTP-запроÑами." ::msgcat::mcset ru "Minimum width of tab buttons in tabbed mode."\ "ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð° кнопок заголовков вкладок в режиме Ñо вкладками." ::msgcat::mcset ru "Misc" "Дополнительно" ::msgcat::mcset ru "Missing option \"%s\"" "Пропущена Ð¾Ð¿Ñ†Ð¸Ñ \"%s\"" ::msgcat::mcset ru "Missing option \"-username\" or \"-domain\"" "Пропущены\ опции \"-username\" или \"-domain\"" ::msgcat::mcset ru "Modem:" "Модем:" ::msgcat::mcset ru "moderator" "модератор" ::msgcat::mcset ru "Moderators" "Модераторы" ::msgcat::mcset ru "Modified: %s" "Изменены: %s" ::msgcat::mcset ru "Month:" "МеÑÑц:" ::msgcat::mcset ru "Mood" "СоÑтоÑние" ::msgcat::mcset ru "Mood:" "СоÑтоÑние:" ::msgcat::mcset ru "moody" "унылое" ::msgcat::mcset ru "Move down" "ПеремеÑтить вниз" ::msgcat::mcset ru "Move tab left/right" "ПеремеÑтить вкладку влево/вправо" ::msgcat::mcset ru "Move up" "ПеремеÑтить вверх" ::msgcat::mcset ru "Moving to extended away" "УÑтанавливаетÑÑ ÑоÑтоÑние\ \"Отошёл давно\" (по бездейÑтвию)" ::msgcat::mcset ru "MUC Ignore" "Игнорирование в MUC" ::msgcat::mcset ru "MUC Ignore Rules" "Правила Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² MUC" ::msgcat::mcset ru "MUC room JID \"%s\" is malformed" "JID комнаты \"%s\"\ некорректный" ::msgcat::mcset ru "MUC room JID must have empty resource part. The specified\ JID was \"%s\"" "JID комнаты должен быть без реÑурÑа. Указанный вами\ JID был \"%s\"" ::msgcat::mcset ru "MUC token doesn't exist" "Токен MUC не ÑущеÑтвует" ::msgcat::mcset ru "Multiple signatures having different authenticity"\ "Разные подпиÑи имеют разную доÑтоверноÑть" ::msgcat::mcset ru "Must join room first" "Ðеобходимо Ñначала приÑоединитьÑÑ\ к комнате" ::msgcat::mcset ru "Mute sound" "Отключить звук" ::msgcat::mcset ru "Mute sound if Tkabber window is focused." "Отключить\ звук, еÑли Ñ„Ð¾ÐºÑƒÑ Ð¿Ñ€Ð¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ‚ окну Tkabber'а." ::msgcat::mcset ru "Mute sound notification." "Отключить звук." ::msgcat::mcset ru "Mute sound when displaying delayed groupchat messages."\ "Отключить звук при получении отложенных Ñообщений в конференциÑÑ…." ::msgcat::mcset ru "Mute sound when displaying delayed personal chat\ messages." "Отключить звук при получении отложенных перÑональных\ Ñообщений." ::msgcat::mcset ru "My Resources" "Мои реÑурÑÑ‹" ::msgcat::mcset ru "Name" "ИмÑ" ::msgcat::mcset ru "Name " "Ðазвание" ::msgcat::mcset ru "Name:" "ИмÑ:" ::msgcat::mcset ru "Name: " "Ðазвание:" ::msgcat::mcset ru "nervous" "на нервах" ::msgcat::mcset ru "Network failure" "Ошибка в Ñети" ::msgcat::mcset ru "Network unreachable" "Сеть недоÑтупна" ::msgcat::mcset ru "neutral" "безразличное" ::msgcat::mcset ru "New group name:" "Ðовое Ð¸Ð¼Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹:" ::msgcat::mcset ru "New password:" "Ðовый пароль:" ::msgcat::mcset ru "Next" "Далее" ::msgcat::mcset ru "Next bookmark" "След. закладка" ::msgcat::mcset ru "Next highlighted" "След. выделенное Ñообщение" ::msgcat::mcset ru "Nick" "ПÑевдоним" ::msgcat::mcset ru "Nick:" "ПÑевдоним:" ::msgcat::mcset ru "Nickname" "ПÑевдоним" ::msgcat::mcset ru "Nickname didn't change" "ПÑевдоним не изменилÑÑ" ::msgcat::mcset ru "Nickname is changing already" "ПÑевдоним уже в процеÑÑе\ изменениÑ" ::msgcat::mcset ru "Nickname:" "ПÑевдоним:" ::msgcat::mcset ru "No" "Ðет" ::msgcat::mcset ru "No active list" "Ðет активного ÑпиÑка" ::msgcat::mcset ru "No avatar to store" "Ðет аватары Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸" ::msgcat::mcset ru "No conferences for %s in progress..." "Ðет активной\ конференции Ð´Ð»Ñ %s..." ::msgcat::mcset ru "No default list" "Ðет ÑпиÑка по умолчанию" ::msgcat::mcset ru "No information available" "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½ÐµÐ´Ð¾Ñтупна" ::msgcat::mcset ru "No reply" "Ðе отвечать" ::msgcat::mcset ru "No SASL package found" "Пакеты, реализующие SASL, не\ найдены" ::msgcat::mcset ru "No such abbreviation: %s" "Ðет такого ÑокращениÑ: %s" ::msgcat::mcset ru "No users in %s roster..." "Ð’ контактах %s нет\ пользователей..." ::msgcat::mcset ru "No users in roster..." "Ð’ контактах нет пользователей..." ::msgcat::mcset ru "Node" "Узел" ::msgcat::mcset ru "Node:" "Узел:" ::msgcat::mcset ru "Non-SASL authentication aborted" "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð±ÐµÐ·\ иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ SASL прервана" ::msgcat::mcset ru "Non-SASL authentication failed" "ÐутентифицироватьÑÑ Ð±ÐµÐ·\ иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ SASL не удалоÑÑŒ" ::msgcat::mcset ru "Non-SASL authentication succeeded" "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð±ÐµÐ·\ иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ SASL прошла уÑпешно" ::msgcat::mcset ru "Non-SASL authentication timed out" "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð±ÐµÐ·\ иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ SASL прервана из-за таймаута" ::msgcat::mcset ru "None" "Ðет" ::msgcat::mcset ru "none" "нет" ::msgcat::mcset ru "Normal message" "Сообщение типа \"normal\"" ::msgcat::mcset ru "Not acceptable" "Ðеприемлемо" ::msgcat::mcset ru "Not allowed" "Ðе разрешено" ::msgcat::mcset ru "Not authorized" "Ðе авторизовано" ::msgcat::mcset ru "Not connected" "Соединение не уÑтановлено" ::msgcat::mcset ru "Not Found" "Ðе найдено" ::msgcat::mcset ru "Not Implemented" "Ðе реализовано" ::msgcat::mcset ru "Not logged in" "Ðе подключён" ::msgcat::mcset ru "Notes" "Заметки" ::msgcat::mcset ru "Nothing to block" "СпиÑок JID Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ пуÑÑ‚" ::msgcat::mcset ru "Notify only when available" "УведомлÑть только когда\ доÑтупен" ::msgcat::mcset ru "November" "ÐоÑбрь" ::msgcat::mcset ru "Number of BOSH client security keys to send before\ creating new key sequence." "ЧиÑло ключей безопаÑноÑти BOSH, поÑле\ передачи Ñерверу которых генерируетÑÑ Ð½Ð¾Ð²Ð°Ñ Ð¿Ð¾ÑледовательноÑть\ ключей." ::msgcat::mcset ru "Number of children:" "ЧиÑло ветвей:" ::msgcat::mcset ru "Number of groupchat messages to expire nick completion\ according to the last personally addressed message." "ЧиÑло\ Ñообщений, необходимое Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы отключить автодополнение\ пÑевдонима автора поÑледнего ÑообщениÑ, адреÑованного перÑонально." ::msgcat::mcset ru "Number of HTTP poll client security keys to send before\ creating new key sequence." "ЧиÑло ключей безопаÑноÑти, поÑле\ передачи Ñерверу которых генерируетÑÑ Ð½Ð¾Ð²Ð°Ñ Ð¿Ð¾ÑледовательноÑть\ ключей." ::msgcat::mcset ru "October" "ОктÑбрь" ::msgcat::mcset ru "offended" "обиженное" ::msgcat::mcset ru "Offline Messages" "Офлайновые ÑообщениÑ" ::msgcat::mcset ru "OK" "Продолжить" ::msgcat::mcset ru "Old password:" "Старый пароль:" ::msgcat::mcset ru "on a bus" "еду в автобуÑе" ::msgcat::mcset ru "on a plane" "лечу в Ñамолёте" ::msgcat::mcset ru "on a train" "еду в поезде" ::msgcat::mcset ru "on a trip" "Ñ Ð² поездке" ::msgcat::mcset ru "On any messages (including service messages)" "Ð”Ð»Ñ Ð²Ñех\ Ñообщений, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ñлужебные" ::msgcat::mcset ru "On conference and personal messages" "Ð”Ð»Ñ Ñообщений в\ конференциÑÑ… и личных Ñообщений" ::msgcat::mcset ru "On personal messages only" "Только Ð´Ð»Ñ Ð»Ð¸Ñ‡Ð½Ñ‹Ñ… Ñообщений" ::msgcat::mcset ru "on the phone" "разговариваю по телефону" ::msgcat::mcset ru "on vacation" "в отпуÑке" ::msgcat::mcset ru "on video phone" "разговариваю по видеотелефону" ::msgcat::mcset ru "One window per bare JID" "Одно окно Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾\ Ñокращенного JID (без реÑурÑа)" ::msgcat::mcset ru "One window per full JID" "Одно окно Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ полного\ JID" ::msgcat::mcset ru "Only one option \"-username\" or \"-domain\" is allowed"\ "Только одна Ð¾Ð¿Ñ†Ð¸Ñ Ð¸Ð· \"-username\" и \"-domain\" допуÑтима" ::msgcat::mcset ru "Only TCP based connections" "Только Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ð¹ по\ TCP" ::msgcat::mcset ru "Open" "Открыть" ::msgcat::mcset ru "Open chat" "Открытие окна разговора" ::msgcat::mcset ru "Open chat..." "Открытие окна разговора..." ::msgcat::mcset ru "Open login log" "Открыть журнал подключений" ::msgcat::mcset ru "Open new conversation" "Открыть новый разговор" ::msgcat::mcset ru "Open raw XML window" "Открыть окно XML" ::msgcat::mcset ru "Open statistics monitor" "Открыть монитор ÑтатиÑтики" ::msgcat::mcset ru "Opening IBB connection" "Открываем Ñоединение IBB" ::msgcat::mcset ru "Opening IQ-IBB connection" "Открываем Ñоединение IQ-IBB" ::msgcat::mcset ru "Opening SI connection" "Открываем Ñоединение SI" ::msgcat::mcset ru "Opening SOCKS5 listening socket" "Открываем принимающий\ Ñокет SOCKS5" ::msgcat::mcset ru "Opening stream aborted" "Открытие потока прервано" ::msgcat::mcset ru "Opening stream timed out" "Открытие потока прервано из-за\ таймаута" ::msgcat::mcset ru "Opens a new chat window for the new nick of the room\ occupant" "Открывает новое окно Ð´Ð»Ñ Ñ€Ð°Ð·Ð³Ð¾Ð²Ð¾Ñ€Ð° Ñ Ð¿Ð¾Ñетителем,\ Ñменившим пÑевдоним" ::msgcat::mcset ru "Option \"-command\" is illegal for IQ type \"%s\"" "ОпциÑ\ \"-command\" недопуÑтима Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° IQ \"%s\"" ::msgcat::mcset ru "Option \"-nick\" or \"-jid\" must be specified" "Один из\ параметров \"-nick\" или \"-jid\" должен быть задан" ::msgcat::mcset ru "Option -command is mandatory" "Параметр -command\ обÑзательный" ::msgcat::mcset ru "Options \"-host\" and \"-port\" are required (or your\ proxy filter hasn't returned them)" "Опции \"-host\" и \"-port\" не\ указаны (или прокÑи-фильтр их не вернул)" ::msgcat::mcset ru "Options for Client Info module, which allows you to\ automatically retrieve client names and versions for contacts in your\ roster." "ÐаÑтройки Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸ о клиентах, позволÑющего\ автоматичеÑки запрашивать название и верÑию клиента Ð´Ð»Ñ ÑобеÑедников\ из ÑпиÑка контактов." ::msgcat::mcset ru "Options for Conference Info module, that allows you to\ see list of participants in roster popup, regardless of whether you\ are currently joined with the conference." "ÐаÑтройки модулÑ\ информации о конференциÑÑ…, позволÑющего видеть ÑпиÑок учаÑтников\ конференции во вÑплывающем окне, незавиÑимо от того, подключены Ð’Ñ‹ к\ конференции или нет." ::msgcat::mcset ru "Options for entity capabilities plugin." "ÐаÑтройки\ раÑширениÑ, управлÑющего информацией о возможноÑÑ‚ÑÑ… программ." ::msgcat::mcset ru "Options for external play program" "Параметры командной\ Ñтроки программы Ð¿Ñ€Ð¾Ð¸Ð³Ñ€Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð·Ð²ÑƒÐºÐ¾Ð²." ::msgcat::mcset ru "Options for main interface." "Параметры оÑновного\ интерфейÑа." ::msgcat::mcset ru "Options for module that automatically marks you as away\ after idle threshold." "Параметры модулÑ, автоматичеÑки\ уÑтанавливающего ÑоÑтоÑние \"Отошёл\" поÑле уÑтановленного периода\ бездейÑтвиÑ." ::msgcat::mcset ru "Options for Raw XML Input module, which allows you to\ monitor incoming/outgoing traffic from connection to server and send\ custom XML stanzas." "Параметры Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð²Ð²Ð¾Ð´Ð° XML, позволÑющего\ проÑматривать входÑщий/иÑходÑщий поток XML Ñ Ñервера и поÑылать XML,\ Ñгенерированный вручную." ::msgcat::mcset ru "Organization" "ОрганизациÑ" ::msgcat::mcset ru "Organization name" "ОрганизациÑ: название" ::msgcat::mcset ru "Organization unit" "ОрганизациÑ: отдел" ::msgcat::mcset ru "Original from" "Изначально от кого" ::msgcat::mcset ru "Original to" "Изначально кому" ::msgcat::mcset ru "OS:" "ОС:" ::msgcat::mcset ru "outcast" "изгой" ::msgcat::mcset ru "owner" "владелец" ::msgcat::mcset ru "Pager:" "Пейджер:" ::msgcat::mcset ru "Parent group" "Группа уровнем выше" ::msgcat::mcset ru "Parent groups" "Группы уровнем выше" ::msgcat::mcset ru "Parser \"%s\" doesn't exist" "ПарÑер \"%s\" не\ ÑущеÑтвует" ::msgcat::mcset ru "participant" "учаÑтник" ::msgcat::mcset ru "Participants" "УчаÑтники" ::msgcat::mcset ru "partying" "Ñ Ð½Ð° вечеринке" ::msgcat::mcset ru "Passphrase:" "ÐŸÐ°Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñ„Ñ€Ð°Ð·Ð°:" ::msgcat::mcset ru "Password" "Пароль" ::msgcat::mcset ru "Password." "Пароль." ::msgcat::mcset ru "Password:" "Пароль:" ::msgcat::mcset ru "Paste" "Ð’Ñтавить" ::msgcat::mcset ru "Path to the ispell executable." "Путь к иÑполнÑемому\ файлу ispell." ::msgcat::mcset ru "Paused a reply" "ОÑтановилÑÑ, Ð½Ð°Ð±Ð¸Ñ€Ð°Ñ Ð¾Ñ‚Ð²ÐµÑ‚" ::msgcat::mcset ru "Payment required" "ТребуетÑÑ Ð¾Ð¿Ð»Ð°Ñ‚Ð°" ::msgcat::mcset ru "Periodically browse roster conferences" "ПериодичеÑкий\ проÑмотр конференций из контактов" ::msgcat::mcset ru "Personal" "Ð›Ð¸Ñ‡Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ" ::msgcat::mcset ru "Personal " "ДолжноÑть" ::msgcat::mcset ru "Personal eventing" "ПерÑональные уведомлениÑ" ::msgcat::mcset ru "Personal eventing via pubsub plugins options." "ÐаÑтройки\ раÑширений публикации и подпиÑки на перÑональные ÑобытиÑ." ::msgcat::mcset ru "Phone" "Телефон" ::msgcat::mcset ru "Phone BBS" "Телефон BBS" ::msgcat::mcset ru "Phone cell" "Телефон мобильный" ::msgcat::mcset ru "Phone fax" "Телефон факÑ" ::msgcat::mcset ru "Phone home" "Телефон домашний" ::msgcat::mcset ru "Phone ISDN" "Телефон ISDN" ::msgcat::mcset ru "Phone message recorder" "Телефон автоответчик" ::msgcat::mcset ru "Phone modem" "Телефон модем" ::msgcat::mcset ru "Phone pager" "Телефон пейджер" ::msgcat::mcset ru "Phone PCS" "Телефон PCS" ::msgcat::mcset ru "Phone preferred" "Телефон предпочтительный" ::msgcat::mcset ru "Phone video" "Телефон видео" ::msgcat::mcset ru "Phone voice" "Телефон обычный" ::msgcat::mcset ru "Phone work" "Телефон рабочий" ::msgcat::mcset ru "Phones" "Телефоны" ::msgcat::mcset ru "Photo" "ФотографиÑ" ::msgcat::mcset ru "Ping server using XMPP ping requests." "Пинговать Ñервер\ запроÑами XMPP ping." ::msgcat::mcset ru "pixmaps management" "изображениÑ" ::msgcat::mcset ru "Plaintext" "Открытый неÑжатый текÑÑ‚" ::msgcat::mcset ru "playful" "игривое" ::msgcat::mcset ru "playing sports" "Ñпортивные игры" ::msgcat::mcset ru "Please define environment variable BROWSER" "Определите\ переменную Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ BROWSER" ::msgcat::mcset ru "Please enter passphrase" "Введите парольную фразу" ::msgcat::mcset ru "Please join %s" "ПожалуйÑта приÑоединÑйтеÑÑŒ к %s" ::msgcat::mcset ru "Please try again" "Попробуйте еще раз" ::msgcat::mcset ru "Please, be patient while chats history is being converted\ to new format" "ПожалуйÑта подождите, пока иÑÑ‚Ð¾Ñ€Ð¸Ñ Ñ€Ð°Ð·Ð³Ð¾Ð²Ð¾Ñ€Ð¾Ð²\ преобразовываетÑÑ Ð² новый формат" ::msgcat::mcset ru "Please, be patient while Tkabber configuration directory\ is being transferred to the new location" "ПожалуйÑта подождите, пока\ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ñ Ð½Ð°Ñтройками Tkabber'а переноÑитÑÑ Ð² другое меÑто" ::msgcat::mcset ru "plugin management" "управление раÑширениÑми" ::msgcat::mcset ru "Plugins" "РаÑширениÑ" ::msgcat::mcset ru "Plugins options." "Параметры раÑширений." ::msgcat::mcset ru "PNG images" "Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ PNG" ::msgcat::mcset ru "Policy violation" "Ðарушение политики" ::msgcat::mcset ru "Pong from %s%s: %.2f seconds" "Ð’Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ÐºÐ»Ð¸ÐºÐ° %s%s: %.2f\ Ñекунды" ::msgcat::mcset ru "Pong from %s%s: %s" "Ð’Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ÐºÐ»Ð¸ÐºÐ° %s%s: %s" ::msgcat::mcset ru "Popup menu" "ВывеÑти меню" ::msgcat::mcset ru "Port for outgoing HTTP file transfers (0 for assigned\ automatically). This is useful when sending files from behind a NAT\ with a forwarded port." "Порт Ð´Ð»Ñ Ð¸ÑходÑщей передачи файлов по HTTP\ (еÑли равен 0, то выбираетÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки). ПрименÑетÑÑ, когда файл\ поÑылаетÑÑ Ñ‡ÐµÑ€ÐµÐ· NAT через пробраÑываемый порт." ::msgcat::mcset ru "Port:" "Порт:" ::msgcat::mcset ru "Postal code" "Почтовый индекÑ" ::msgcat::mcset ru "Postal code:" "Почтовый индекÑ:" ::msgcat::mcset ru "Preferred:" "Предпочтительный:" ::msgcat::mcset ru "Prefix" "ПрефикÑ" ::msgcat::mcset ru "Prefix:" "ПрефикÑ:" ::msgcat::mcset ru "Presence" "ПриÑутÑтвие" ::msgcat::mcset ru "presence" "приÑутÑтвие" ::msgcat::mcset ru "Presence bar" "Панель приÑутÑтвиÑ/ÑтатуÑа" ::msgcat::mcset ru "Presence information" "приÑутÑтвие" ::msgcat::mcset ru "Presence is signed" "ПриÑутÑтвие подпиÑано" ::msgcat::mcset ru "Pretty print incoming and outgoing XML stanzas."\ "Форматировать XML перед выводом." ::msgcat::mcset ru "Pretty print XML" "Форматировать XML" ::msgcat::mcset ru "Prev" "Ðазад" ::msgcat::mcset ru "Prev bookmark" "Пред. закладка" ::msgcat::mcset ru "Prev highlighted" "Пред. выделенное Ñообщение" ::msgcat::mcset ru "Previous/Next history message" "Предыдущее/Ñледующее\ Ñообщение" ::msgcat::mcset ru "Previous/Next tab" "ПредыдущаÑ/ÑÐ»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð²ÐºÐ»Ð°Ð´ÐºÐ°" ::msgcat::mcset ru "Priority." "Приоритет." ::msgcat::mcset ru "Priority:" "Приоритет:" ::msgcat::mcset ru "Privacy list is activated" "СпиÑок приватноÑти\ активирован" ::msgcat::mcset ru "Privacy list is not activated" "СпиÑок приватноÑти не\ активирован" ::msgcat::mcset ru "Privacy list is not created" "СпиÑок приватноÑти не\ Ñоздан" ::msgcat::mcset ru "Privacy lists" "СпиÑки приватноÑти" ::msgcat::mcset ru "Privacy lists are not implemented" "СпиÑки приватноÑти не\ реализованы" ::msgcat::mcset ru "Privacy lists are unavailable" "СпиÑки приватноÑти\ недоÑтупны" ::msgcat::mcset ru "Privacy lists error" "Ошибка ÑпиÑков приватноÑти" ::msgcat::mcset ru "Privacy rules" "ОбеÑпечение приватноÑти" ::msgcat::mcset ru "Profile" "Профиль" ::msgcat::mcset ru "Profile from config file" "Профиль из конфигурационного\ файла" ::msgcat::mcset ru "Profiles" "Профили" ::msgcat::mcset ru "Propose to configure newly created MUC room. If set to\ false then the default room configuration is automatically accepted."\ "Предлагать конфигурировать вновь Ñозданную конференцию. ЕÑли\ уÑтановить в false, то автоматичеÑки принимаетÑÑ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¿Ð¾\ умолчанию." ::msgcat::mcset ru "Protocol:" "Протокол:" ::msgcat::mcset ru "proud" "горделивое" ::msgcat::mcset ru "Proxy authentication required" "ТребуетÑÑ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ\ на прокÑи" ::msgcat::mcset ru "Proxy type:" "Тип прокÑи:" ::msgcat::mcset ru "Pub/sub" "Опу/под" ::msgcat::mcset ru "Publish" "Опубликовать" ::msgcat::mcset ru "Publish \"playback stopped\" instead" "Опубликовать\ \"воÑпроизведение оÑтановлено\" вмеÑто мелодии" ::msgcat::mcset ru "Publish node" "Опубликовать узел" ::msgcat::mcset ru "Publish user activity..." "Опубликовать занÑтие\ пользователÑ..." ::msgcat::mcset ru "Publish user location..." "Опубликовать меÑтонахождение\ пользователÑ" ::msgcat::mcset ru "Publish user mood..." "Опубликовать наÑтроение\ пользователÑ..." ::msgcat::mcset ru "Publish user tune..." "Опубликовать мелодию\ пользователÑ..." ::msgcat::mcset ru "Publishing is only possible while being online"\ "ÐŸÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð° лишь при активном подключении" ::msgcat::mcset ru "Pubsub request failed: %s" "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸/подпиÑки не\ удалÑÑ: %s" ::msgcat::mcset ru "Pubsub request succeeded" "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸/подпиÑки\ завершилÑÑ ÑƒÑпехом" ::msgcat::mcset ru "Purge all messages" "Удалить вÑе ÑообщениÑ" ::msgcat::mcset ru "Purge message" "Удалить Ñообщение" ::msgcat::mcset ru "Purge seen messages" "Удалить полученные ÑообщениÑ" ::msgcat::mcset ru "Purged all abbreviations" "Удалены вÑе ÑокращениÑ" ::msgcat::mcset ru "Quick Help" "ÐšÑ€Ð°Ñ‚ÐºÐ°Ñ Ñправка" ::msgcat::mcset ru "Quick help" "ÐšÑ€Ð°Ñ‚ÐºÐ°Ñ Ñправка" ::msgcat::mcset ru "Quit" "Выйти" ::msgcat::mcset ru "Quote" "Цитировать" ::msgcat::mcset ru "Raise new tab." "Размещать новую вкладку поверх\ оÑтальных." ::msgcat::mcset ru "Rating:" "Оценка:" ::msgcat::mcset ru "Raw XML" "Окно XML" ::msgcat::mcset ru "Read on..." "Читать далее..." ::msgcat::mcset ru "reading" "читаю" ::msgcat::mcset ru "Reason" "Причина" ::msgcat::mcset ru "Reason:" "Причина:" ::msgcat::mcset ru "Receive" "Получить" ::msgcat::mcset ru "Receive error: Stream ID is in use" "Ошибка получениÑ: ID\ потока уже иÑпользуетÑÑ" ::msgcat::mcset ru "Receive file from %s" "Получение файла от %s" ::msgcat::mcset ru "Received by:" "Получено:" ::msgcat::mcset ru "Received/Sent" "Получено/Отправлено" ::msgcat::mcset ru "Recipient Error" "Ошибка получателÑ" ::msgcat::mcset ru "Recipient unavailable" "Получатель недоÑтупен" ::msgcat::mcset ru "Reconnect to server if it does not reply (with result or\ with error) to XMPP ping request in specified time interval (in\ seconds)." "ПереподключатьÑÑ Ðº Ñерверу, еÑли он не ответил (возможно\ ошибкой) на XMPP пинг за указанный временной интервал (в Ñекундах)." ::msgcat::mcset ru "Redirect" "Перенаправление" ::msgcat::mcset ru "Redo" "Откатить откатку" ::msgcat::mcset ru "Region:" "Регион:" ::msgcat::mcset ru "Register" "РегиÑтрациÑ" ::msgcat::mcset ru "Register in %s" "РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð² %s" ::msgcat::mcset ru "Registration is successful!" "РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ ÑƒÑпешнаÑ!" ::msgcat::mcset ru "Registration required" "ТребуетÑÑ Ñ€ÐµÐ³Ð¸ÑтрациÑ" ::msgcat::mcset ru "Registration: %s" "РегиÑтрациÑ: %s" ::msgcat::mcset ru "rehearsing" "у Ð¼ÐµÐ½Ñ Ñ€ÐµÐ¿ÐµÑ‚Ð¸Ñ†Ð¸Ñ" ::msgcat::mcset ru "relaxing" "отдыхаю" ::msgcat::mcset ru "relieved" "гора Ñ Ð¿Ð»ÐµÑ‡" ::msgcat::mcset ru "remorseful" "раÑкаиваюÑÑŒ" ::msgcat::mcset ru "Remote connection failed" "Ошибка удаленного ÑоединениÑ" ::msgcat::mcset ru "Remote control options." "ÐаÑтройки удалённого\ управлениÑ." ::msgcat::mcset ru "Remote Server Error" "Ошибка удаленного Ñервера" ::msgcat::mcset ru "Remote server not found" "Сервер не найден" ::msgcat::mcset ru "Remote server timeout" "ИÑтекло Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð°\ Ñервера" ::msgcat::mcset ru "Remove" "Удалить" ::msgcat::mcset ru "Remove all users in group..." "Удалить вÑе контакты в\ группе..." ::msgcat::mcset ru "Remove from list" "Удалить из ÑпиÑка" ::msgcat::mcset ru "Remove from metacontact" "Удалить из метаконтакта" ::msgcat::mcset ru "Remove from roster..." "Удалить из контактов..." ::msgcat::mcset ru "Remove group..." "Удалить группу..." ::msgcat::mcset ru "Remove list" "Удалить ÑпиÑок" ::msgcat::mcset ru "Rename group..." "Переименовать группу..." ::msgcat::mcset ru "Rename roster group" "Переименование группы" ::msgcat::mcset ru "Repeat new password:" "Еще раз новый пароль:" ::msgcat::mcset ru "Replace opened connections" "Закрыть открытые ÑоединениÑ" ::msgcat::mcset ru "Replace opened connections." "Закрыть открытые\ ÑоединениÑ." ::msgcat::mcset ru "Reply" "Ответить" ::msgcat::mcset ru "Reply subject:" "Тема ответа:" ::msgcat::mcset ru "Reply to" "Отвечать" ::msgcat::mcset ru "Reply to current time (jabber:iq:time) requests."\ "Отвечать на запроÑÑ‹ времени (jabber:iq:time)." ::msgcat::mcset ru "Reply to entity time (urn:xmpp:time) requests." "Отвечать\ на запроÑÑ‹ о времени на компьютере Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (urn:xmpp:time)." ::msgcat::mcset ru "Reply to idle time (jabber:iq:last) requests." "Отвечать\ на запроÑÑ‹ времени бездейÑÑ‚Ð²Ð¸Ñ (jabber:iq:last)." ::msgcat::mcset ru "Reply to room" "Отвечать в конференцию" ::msgcat::mcset ru "Reply to version (jabber:iq:version) requests." "Отвечать\ на запроÑÑ‹ верÑии (jabber:iq:version)." ::msgcat::mcset ru "Reply to XMPP ping requests." "Отвечать на XMPP пинг." ::msgcat::mcset ru "Report the list of current MUC rooms on disco#items\ query." "Отвечать на Ð·Ð°Ð¿Ñ€Ð¾Ñ disco#items о MUC-конференциÑÑ…, в которых\ Ð’Ñ‹ принимаете учаÑтие." ::msgcat::mcset ru "Request" "ЗапроÑить" ::msgcat::mcset ru "Request default configuration" "ЗапроÑить конфигурацию по\ умолчанию" ::msgcat::mcset ru "Request error" "Ошибка запроÑа" ::msgcat::mcset ru "Request failed: %s" "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ðµ удалÑÑ: %s" ::msgcat::mcset ru "Request only unseen (which aren't displayed in the chat\ window) messages in the history in MUC compatible conference rooms."\ "Запрашивать только те ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸Ð· иÑтории, которые не показаны в\ уже открытом окне (Ð´Ð»Ñ ÐºÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ð¸, ÑовмеÑтимой Ñ MUC)." ::msgcat::mcset ru "Request rejected or failed" "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¾Ñ‚ÐºÐ»Ð¾Ð½Ñ‘Ð½ или не\ удалÑÑ" ::msgcat::mcset ru "Request subscription" "ЗапроÑить подпиÑку" ::msgcat::mcset ru "Request Timeout" "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¿Ñ€ÐµÐ²Ñ‹Ñил допуÑтимое времÑ" ::msgcat::mcset ru "Request unsubscription" "ЗапроÑить отпиÑку" ::msgcat::mcset ru "Requesting conference list: %s" "Ð—Ð°Ð¿Ñ€Ð¾Ñ ÑпиÑка\ конференций: %s" ::msgcat::mcset ru "Requesting ignore list: %s" "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€ÑƒÐµÐ¼Ð¾Ð³Ð¾ ÑпиÑка:\ %s" ::msgcat::mcset ru "Requesting invisible list: %s" "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½ÐµÐ²Ð¸Ð´Ð¸Ð¼Ð¾Ð³Ð¾ ÑпиÑка:\ %s" ::msgcat::mcset ru "Requesting privacy list: %s" "Ð—Ð°Ð¿Ñ€Ð¾Ñ ÑпиÑка приватноÑти:\ %s" ::msgcat::mcset ru "Requesting privacy rules: %s" "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð» обеÑпечениÑ\ приватноÑти: %s" ::msgcat::mcset ru "Requesting visible list: %s" "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð²Ð¸Ð´Ð¸Ð¼Ð¾Ð³Ð¾ ÑпиÑка: %s" ::msgcat::mcset ru "Reset to current value" "УÑтановить текущее значение" ::msgcat::mcset ru "Reset to default value" "УÑтановить значение по\ умолчанию" ::msgcat::mcset ru "Reset to saved value" "УÑтановить Ñохранённое значение" ::msgcat::mcset ru "Reset to value from config file" "УÑтановить значение из\ конфигурационного файла" ::msgcat::mcset ru "Resource constraint" "ÐедоÑтаточно реÑурÑов" ::msgcat::mcset ru "Resource." "РеÑурÑ." ::msgcat::mcset ru "Resource:" "РеÑурÑ:" ::msgcat::mcset ru "restless" "неугомонное" ::msgcat::mcset ru "Restricted XML" "Запрещённый XML" ::msgcat::mcset ru "Resubscribe to all users in group..." "ПереподпиÑатьÑÑ ÐºÐ¾\ вÑем пользователÑм в группе..." ::msgcat::mcset ru "Retract node" "ОтказатьÑÑ Ð¾Ñ‚ узла" ::msgcat::mcset ru "Retrieve offline messages using POP3-like protocol."\ "Получать офлайновые ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ Ð¸Ñпользованием протокола типа POP3." ::msgcat::mcset ru "Retrieve subscriptions" "Получить ÑпиÑок подпиÑчиков" ::msgcat::mcset ru "Retry to connect forever." "ПытатьÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð°Ñ‚ÑŒÑÑ\ беÑконечно много раз." ::msgcat::mcset ru "Retry to join MUC room with a different nickname (with\ added _ suffix) in case of name conflicts." "ПытатьÑÑ Ð¿Ñ€Ð¸ÑоединитьÑÑ\ к многопользовательÑкому разговору Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ пÑевдонимом (Ñ\ добавлением ÑуффикÑа _), еÑли текущий пÑевдоним в комнате уже еÑть." ::msgcat::mcset ru "Retrying with nickname '%s_'" "Пробуем повторно Ñ\ пÑевдонимом '%s_'" ::msgcat::mcset ru "Returning from auto-away" "Возврат из ÑоÑтоÑниÑ\ бездейÑтвиÑ" ::msgcat::mcset ru "Revoke Admin Privileges" "Отозвать права админиÑтратора" ::msgcat::mcset ru "Revoke Membership" "Отозвать членÑтво" ::msgcat::mcset ru "Revoke Moderator Privileges" "Отозвать права модератора" ::msgcat::mcset ru "Revoke Owner Privileges" "Отозвать права владельца" ::msgcat::mcset ru "Revoke subscription" "Отозвать подпиÑку" ::msgcat::mcset ru "Revoke Voice" "Отозвать право говорить" ::msgcat::mcset ru "Right" "Справа" ::msgcat::mcset ru "Right mouse button" "ÐŸÑ€Ð°Ð²Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° мыши" ::msgcat::mcset ru "Role" "Роль" ::msgcat::mcset ru "Role:" "ДолжноÑть:" ::msgcat::mcset ru "Room %s is successfully created" "Комната %s уÑпешно\ Ñоздана" ::msgcat::mcset ru "Room is created" "Комната Ñоздана" ::msgcat::mcset ru "Room is destroyed" "Комната удалена" ::msgcat::mcset ru "Room:" "Комната:" ::msgcat::mcset ru "Roster" "Контакты" ::msgcat::mcset ru "Roster files" "Файлы контактов" ::msgcat::mcset ru "Roster filter." "Фильтр контактов." ::msgcat::mcset ru "Roster group:" "Группа в контактах:" ::msgcat::mcset ru "Roster import for %s is completed" "Импорт контактов длÑ\ %s завершен" ::msgcat::mcset ru "Roster item may be dropped not only over group name but\ also over any item in group." "При перетаÑкивании контакта из одной\ группы контактов в другую, его можно отпуÑтить не только над\ названием группы, но и над любым контактом в Ñтой группе." ::msgcat::mcset ru "Roster Notes" "Заметки в контактах" ::msgcat::mcset ru "Roster options." "Параметры контактов." ::msgcat::mcset ru "roster plugins" "раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¾Ð²" ::msgcat::mcset ru "running" "Ñовершаю пробежку" ::msgcat::mcset ru "running an errand" "хожу по делам" ::msgcat::mcset ru "sad" "печальное" ::msgcat::mcset ru "sarcastic" "Ñзвительное" ::msgcat::mcset ru "SASL auth error:\n%s" "Ошибка аутентификации SASL:\n%s" ::msgcat::mcset ru "SASL authentication aborted" "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ SASL\ прервана" ::msgcat::mcset ru "SASL authentication timed out" "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ SASL\ прервана из-за таймаута" ::msgcat::mcset ru "SASL callback error: client needs to write \"%s\""\ "Ошибка обратного вызова SASL: у клиента запроÑили параметр \"%s\"" ::msgcat::mcset ru "SASL step error: %s" "Ошибка очередного шага SASL: %s" ::msgcat::mcset ru "Save" "Сохранить" ::msgcat::mcset ru "Save as:" "Сохранить как:" ::msgcat::mcset ru "Save state" "Сохранить ÑоÑтоÑние" ::msgcat::mcset ru "Save state on exit" "СохранÑть ÑоÑтоÑние при выходе" ::msgcat::mcset ru "Save state on Tkabber exit." "СохранÑть ÑоÑтоÑние при\ выходе из Tkabber'а." ::msgcat::mcset ru "Save To Log" "Сохранить в журнал" ::msgcat::mcset ru "scheduled holiday" "у Ð¼ÐµÐ½Ñ Ð¿Ð»Ð°Ð½Ð¾Ð²Ñ‹Ð¹ выходной" ::msgcat::mcset ru "Screenname conversion" "Преобразование Ñкранного имени" ::msgcat::mcset ru "Screenname:" "Экранное имÑ:" ::msgcat::mcset ru "Screenname: %s\n\nConverted JID: %s" "Экранное имÑ:\ %s\n\nПреобразованный JID: %s" ::msgcat::mcset ru "Scroll chat window up/down" "Прокрутить окно разговора\ вверх/вниз" ::msgcat::mcset ru "Search" "ПоиÑк" ::msgcat::mcset ru "Search again" "ИÑкать Ñнова" ::msgcat::mcset ru "Search down" "ИÑкать вниз" ::msgcat::mcset ru "Search in %s" "ПоиÑк в %s" ::msgcat::mcset ru "Search in %s: No matching items found" "ПоиÑк в %s:\ Объекты, удовлетворÑющие критериÑм поиÑка, не найдены" ::msgcat::mcset ru "Search in Tkabber windows options." "ÐаÑтройки поиÑка в\ окнах Tkabber'а." ::msgcat::mcset ru "search plugins" "раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð¸Ñка" ::msgcat::mcset ru "Search up" "ИÑкать вверх" ::msgcat::mcset ru "Search: %s" "ПоиÑк: %s" ::msgcat::mcset ru "searching" "поиÑк" ::msgcat::mcset ru "See other host" "Смотри другой хоÑÑ‚" ::msgcat::mcset ru "Select" "Выбрать" ::msgcat::mcset ru "Select Key for Signing %s Traffic" "Выбор ключа длÑ\ подпиÑÑ‹Ð²Ð°Ð½Ð¸Ñ Ñообщений %s" ::msgcat::mcset ru "Select month:" "Выберите меÑÑц:" ::msgcat::mcset ru "Selection" "Выделению" ::msgcat::mcset ru "Self signed certificate" "Сертификат ÑамоподпиÑан" ::msgcat::mcset ru "Send" "Отправить" ::msgcat::mcset ru "Send broadcast message..." "ПоÑлать широковещательное\ Ñообщение..." ::msgcat::mcset ru "Send contacts to %s" "Отправка контактов %s" ::msgcat::mcset ru "Send custom presence" "ПоÑлать Ñпециальное приÑутÑтвие" ::msgcat::mcset ru "Send file to %s" "Отправка файла %s" ::msgcat::mcset ru "Send file..." "Отправить файл..." ::msgcat::mcset ru "Send message" "Отправка ÑообщениÑ" ::msgcat::mcset ru "Send message of the day..." "ПоÑлать Ñообщение днÑ..." ::msgcat::mcset ru "Send message to %s" "Отправка ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ %s" ::msgcat::mcset ru "Send message to all users in group..." "Отправить\ Ñообщение вÑем пользователÑм в группе..." ::msgcat::mcset ru "Send message to group" "Отправка ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ðµ" ::msgcat::mcset ru "Send message to group %s" "Отправка ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ðµ %s" ::msgcat::mcset ru "Send message..." "Отправить Ñообщение..." ::msgcat::mcset ru "Send request to: " "Отправка запроÑа: " ::msgcat::mcset ru "Select room %s participants for encrypting traffic to" \ "Выберите учаÑтников конференции %s, Ð´Ð»Ñ ÐºÐ¾Ð³Ð¾ вы будете шифровать\ ÑообщениÑ" ::msgcat::mcset ru "Send subscription at %s" "Отправка запроÑа на подпиÑку на\ %s" ::msgcat::mcset ru "Send subscription request" "Отправка запроÑа на подпиÑку" ::msgcat::mcset ru "Send subscription request to %s" "Отправка запроÑа на\ подпиÑку %s" ::msgcat::mcset ru "Send subscription to: " "Отправка запроÑа на подпиÑку: " ::msgcat::mcset ru "Send to server" "Отправить на Ñервер" ::msgcat::mcset ru "Send users..." "Отправить контакты..." ::msgcat::mcset ru "Sending %s %s list" "Отправка %s %s ÑпиÑка" ::msgcat::mcset ru "Sending conference list: %s" "Отправка ÑпиÑка\ конференций: %s" ::msgcat::mcset ru "Sending configure form" "Отправка конфигурационной формы" ::msgcat::mcset ru "Sending ignore list: %s" "Отправка игнорируемого ÑпиÑка:\ %s" ::msgcat::mcset ru "Sending invisible list: %s" "Отправка невидимого ÑпиÑка:\ %s" ::msgcat::mcset ru "Sending visible list: %s" "Отправка видимого ÑпиÑка: %s" ::msgcat::mcset ru "September" "СентÑбрь" ::msgcat::mcset ru "Sergei Golovan" "Сергей Головань" ::msgcat::mcset ru "Serial number" "Серийный номер" ::msgcat::mcset ru "Serialized array of proxy servers to connect via."\ "Сериализованный маÑÑив прокÑи-Ñерверов, через которые ÑоединÑтьÑÑ." ::msgcat::mcset ru "serious" "Ñерьёзное" ::msgcat::mcset ru "Server cannot reach client's identd" "Сервер не Ñмог\ ÑвÑзатьÑÑ Ñ identd клиента" ::msgcat::mcset ru "Server doesn't support digest non-SASL authentication"\ "Сервер не поддерживает передачу шифрованных паролей при\ аутентификации без иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ SASL" ::msgcat::mcset ru "Server doesn't support plaintext non-SASL authentication"\ "Сервер не поддерживает передачу паролей открытым текÑтом при\ аутентификации без иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ SASL" ::msgcat::mcset ru "Server doesn't support plaintext or digest non-SASL\ authentication" "Сервер не поддерживает передачу паролей как открытым\ текÑтом, так и шифрованных при аутентификации без иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ SASL" ::msgcat::mcset ru "Server Error" "Ошибка Ñервера" ::msgcat::mcset ru "Server hasn't provided compress feature" "Сервер не\ поддерживает Ñжатие" ::msgcat::mcset ru "Server hasn't provided non-SASL authentication feature"\ "Сервер не поддерживает аутентификацию non-SASL" ::msgcat::mcset ru "Server hasn't provided SASL authentication feature"\ "Сервер не поддерживает аутентификацию SASL" ::msgcat::mcset ru "Server hasn't provided STARTTLS feature" "Сервер не\ поддерживает STARTTLS" ::msgcat::mcset ru "Server hasn't provided stream management feature" "Сервер\ не поддерживает управление потоком" ::msgcat::mcset ru "Server hasn't provided supported compress method" "Сервер\ не поддерживает доÑтупные методы ÑжатиÑ" ::msgcat::mcset ru "Server message" "Сообщение Ñервера" ::msgcat::mcset ru "Server name or IP-address." "Ð˜Ð¼Ñ Ñервера или IP-адреÑ." ::msgcat::mcset ru "Server name." "Ð˜Ð¼Ñ Ñервера." ::msgcat::mcset ru "Server port." "Порт Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº Ñерверу." ::msgcat::mcset ru "Server provided mechanism %s. It is forbidden" "Сервер\ предложил механизм %s. Он запрещен" ::msgcat::mcset ru "Server provided mechanisms %s. They are forbidden"\ "Сервер предложил механизмы %s. Они запрещены" ::msgcat::mcset ru "Server provided no SASL mechanisms" "Сервер не предложил\ механизмы SASL" ::msgcat::mcset ru "Server:" "Сервер:" ::msgcat::mcset ru "Service Discovery" "Обзор Ñлужб" ::msgcat::mcset ru "service discovery" "обзор Ñлужб" ::msgcat::mcset ru "Service info" "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ Ñлужбе" ::msgcat::mcset ru "Service statistics" "СтатиÑтика" ::msgcat::mcset ru "Service unavailable" "Служба недоÑтупна" ::msgcat::mcset ru "Session key bits" "Размер ключа ÑеÑÑии" ::msgcat::mcset ru "Set" "УÑтановить" ::msgcat::mcset ru "Set bookmark" "УÑтановить закладку" ::msgcat::mcset ru "Set for current and future sessions" "УÑтановить длÑ\ текущей и Ñледующих ÑеÑÑий" ::msgcat::mcset ru "Set for current session only" "УÑтановить только длÑ\ текущей ÑеÑÑии" ::msgcat::mcset ru "Set priority to 0 when moving to extended away state."\ "СбраÑывать приоритет в 0 при переходе в ÑоÑтоÑние \"Отошёл давно\"." ::msgcat::mcset ru "Settings of rich text facility which is used to render\ chat messages and logs." "ÐаÑтройка подÑиÑтемы Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ Ñ‚ÐµÐºÑта,\ ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¸ÑпользуетÑÑ Ð´Ð»Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð° Ñообщений и протоколов разговоров." ::msgcat::mcset ru "SHA1 hash" "SHA1 хеш" ::msgcat::mcset ru "shaving" "бреюÑÑŒ" ::msgcat::mcset ru "shocked" "потрÑÑённое" ::msgcat::mcset ru "shopping" "хожу по магазинам" ::msgcat::mcset ru "Show" "Показать" ::msgcat::mcset ru "Show all connections" "Показывать вÑе ÑоединениÑ" ::msgcat::mcset ru "Show balloons with headline messages over tree nodes."\ "Показывать вÑплывающие окна Ñ Ñ‚ÐµÐºÑтом новоÑти над заголовками\ Ñообщений." ::msgcat::mcset ru "Show console" "Показать конÑоль" ::msgcat::mcset ru "Show detailed info on conference room members in roster\ item tooltips." "Показывать детальную информацию об учаÑтниках\ конференции во вÑплывающем окне, ÑоответÑтвующем конференции, в\ контактах." ::msgcat::mcset ru "Show emoticons" "Показать Ñмоциконки" ::msgcat::mcset ru "Show history" "Показать иÑторию" ::msgcat::mcset ru "Show images for emoticons." "Показывать Ñмоциконки в виде\ картинок." ::msgcat::mcset ru "Show info" "Показать информацию" ::msgcat::mcset ru "Show IQ requests in the status line." "Показывать\ IQ-запроÑÑ‹ в ÑтатуÑной Ñтроке." ::msgcat::mcset ru "Show main window" "Показать главное окно" ::msgcat::mcset ru "Show menu tearoffs when possible." "ИÑпользовать\ \"отрывающиеÑÑ\" меню, где Ñто возможно." ::msgcat::mcset ru "Show my own resources in the roster." "Показывать в\ контактах ÑобÑтвенные реÑурÑÑ‹." ::msgcat::mcset ru "Show native icons for contacts, connected to\ transports/services in roster." "ИÑпользовать оригинальные\ пиктограммы Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¾Ð², подключённых через транÑпорты/Ñлужбы, в\ окне контактов." ::msgcat::mcset ru "Show native icons for transports/services in roster."\ "ИÑпользовать оригинальные пиктограммы Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ñпортов/Ñлужб в окне\ контактов." ::msgcat::mcset ru "Show number of unread messages in tab titles."\ "Показывать чиÑло непрочитанных Ñообщений в заголовках вкладок." ::msgcat::mcset ru "Show offline users" "Показывать неподключённые контакты" ::msgcat::mcset ru "Show online users only" "ПоказываютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ активные\ пользователи" ::msgcat::mcset ru "Show only online users in roster." "Показывать в окне\ контактов только подключённые контакты." ::msgcat::mcset ru "Show only the number of personal unread messages in\ window title." "Показывать в заголовке окна только чиÑло личных\ непрочитанных Ñообщений." ::msgcat::mcset ru "Show own resources" "Показывать ÑобÑтвенные реÑурÑÑ‹" ::msgcat::mcset ru "Show palette of emoticons" "Показать меню Ñмоциконок" ::msgcat::mcset ru "Show presence bar." "Показывать панель\ приÑутÑтвиÑ/ÑтатуÑа." ::msgcat::mcset ru "Show several most recently received messages in a newly\ opened chat window. They are taken from the logs, so you'll have to\ enable them for chats." "Показывать неÑколько поÑледних Ñообщений во\ вновь открываемом окне разговора. Они берутÑÑ Ð¸Ð· журналов, поÑтому\ вам придетÑÑ Ð²ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ их Ð´Ð»Ñ Ð¿ÐµÑ€Ñональных разговоров." ::msgcat::mcset ru "Show several most recently received messages in a newly\ opened conference window. They are taken from the logs, so you'll\ have to enable them for groupchat." "Показывать неÑколько поÑледних\ Ñообщений во вновь открываемом окне конференции. Они берутÑÑ Ð¸Ð·\ журналов, поÑтому вам придетÑÑ Ð²ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ их Ð´Ð»Ñ ÐºÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ð¹." ::msgcat::mcset ru "Show stanzas for all (current and past) connections in\ Raw XML window." "Показывать вывод Ð´Ð»Ñ Ð²Ñех (текущих и прошлых)\ Ñоединений в окне XML." ::msgcat::mcset ru "Show status bar." "Показывать ÑтатуÑную Ñтроку." ::msgcat::mcset ru "Show subscription type in roster item tooltips."\ "Показывать тип подпиÑки на приÑутÑтвие во вÑплывающем окне в\ контактах." ::msgcat::mcset ru "Show the login window" "Показывать окно подключениÑ" ::msgcat::mcset ru "Show TkCon console" "Показать конÑоль TkCon" ::msgcat::mcset ru "Show Toolbar." "Показывать панель инÑтрументов." ::msgcat::mcset ru "Show user or service info" "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ пользователе или\ Ñлужбе" ::msgcat::mcset ru "Show user or service info..." "Показать информацию о\ пользователе или Ñлужбе..." ::msgcat::mcset ru "shy" "заÑтенчивое" ::msgcat::mcset ru "SI connection closed" "Соединение SI закрыто" ::msgcat::mcset ru "sick" "болезненное" ::msgcat::mcset ru "Side where to place tabs in tabbed mode." "Сторона, Ñ\ которой размещать заголовки вкладок в режиме Ñ Ð²ÐºÐ»Ð°Ð´ÐºÐ°Ð¼Ð¸." ::msgcat::mcset ru "Sign presence updates" "ПодпиÑывать обновлениÑ\ приÑутÑтвиÑ" ::msgcat::mcset ru "Signature not processed due to missing key" "ПодпиÑÑŒ не\ проверена из-за отÑутÑÑ‚Ð²Ð¸Ñ ÐºÐ»ÑŽÑ‡Ð°" ::msgcat::mcset ru "Single window" "Одно окно" ::msgcat::mcset ru "Size:" "Размер:" ::msgcat::mcset ru "skiing" "катаюÑÑŒ на лыжах" ::msgcat::mcset ru "sleeping" "Ñплю" ::msgcat::mcset ru "sleepy" "Ñонное" ::msgcat::mcset ru "Smart autoscroll" "\"УмнаÑ\" автопрокрутка" ::msgcat::mcset ru "socializing" "общеÑтвенно-Ð¿Ð¾Ð»ÐµÐ·Ð½Ð°Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ð°" ::msgcat::mcset ru "SOCKS authentication failed" "Ошибка аутентификации\ SOCKS" ::msgcat::mcset ru "SOCKS command not supported" "Команда SOCKS не\ поддерживаетÑÑ" ::msgcat::mcset ru "SOCKS connection not allowed by ruleset" "Соединение\ SOCKS не разрешено наÑтройками" ::msgcat::mcset ru "SOCKS request failed" "Ð—Ð°Ð¿Ñ€Ð¾Ñ SOCKS не удалÑÑ" ::msgcat::mcset ru "SOCKS server cannot identify username" "Сервер SOCKS не\ Ñмог идентифицировать Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" ::msgcat::mcset ru "SOCKS server username identification failed"\ "Ð˜Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ð° Ñервере SOCKS не удалаÑÑŒ" ::msgcat::mcset ru "SOCKS4a proxy negotiation aborted" "СоглаÑование Ñ\ SOCKS4a прокÑи прервано" ::msgcat::mcset ru "SOCKS4a proxy negotiation timed out" "СоглаÑование Ñ\ SOCKS4a прокÑи прервано из-за таймаута" ::msgcat::mcset ru "SOCKS5 negotiation timed out" "СоглаÑование Ñ\ SOCKS5-прокÑи прервано из-за таймаута" ::msgcat::mcset ru "SOCKS5 proxy negotiation aborted" "СоглаÑование Ñ\ SOCKS5-прокÑи прервано" ::msgcat::mcset ru "SOCKS5 server authorization failed" "ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð°\ Ñервере SOCKS5 не удалаÑÑŒ" ::msgcat::mcset ru "SOCKS5 server authorization required" "ТребуетÑÑ\ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° Ñервере SOCKS5" ::msgcat::mcset ru "Sort" "Сортировать" ::msgcat::mcset ru "Sort by date" "Сортировать по дате" ::msgcat::mcset ru "Sort by from" "Сортировать по адреÑу отправителÑ" ::msgcat::mcset ru "Sort by node" "Сортировать по имени узла" ::msgcat::mcset ru "Sort by type" "Сортировать по типу" ::msgcat::mcset ru "Sort items by JID/node" "Сортировать по JID/узлу" ::msgcat::mcset ru "Sort items by name" "Сортировать по имени" ::msgcat::mcset ru "Sound" "Звук" ::msgcat::mcset ru "sound" "звук" ::msgcat::mcset ru "Sound options." "ÐаÑтройки звука." ::msgcat::mcset ru "Sound to play when available presence is received."\ "Звук, который проигрываетÑÑ Ð¿Ñ€Ð¸ получении приÑутÑÑ‚Ð²Ð¸Ñ Ñ‚Ð¸Ð¿Ð°\ \"доÑтупен\"." ::msgcat::mcset ru "Sound to play when connected to Jabber server." "Звук,\ который проигрываетÑÑ Ð¿Ñ€Ð¸ подключении к Jabber-Ñерверу." ::msgcat::mcset ru "Sound to play when disconnected from Jabber server."\ "Звук, который проигрываетÑÑ Ð¿Ñ€Ð¸ отключении от Jabber-Ñервера." ::msgcat::mcset ru "Sound to play when groupchat message from me is\ received." "Звук, который проигрываетÑÑ Ð¿Ñ€Ð¸ получении ÑобÑтвенного\ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸Ð· конференции." ::msgcat::mcset ru "Sound to play when groupchat message is received." "Звук,\ который проигрываетÑÑ Ð¿Ñ€Ð¸ получении обычного ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸Ð·\ конференции." ::msgcat::mcset ru "Sound to play when groupchat server message is received."\ "Звук, который проигрываетÑÑ Ð¿Ñ€Ð¸ получении Ñлужебного ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸Ð·\ конференции." ::msgcat::mcset ru "Sound to play when highlighted (usually addressed\ personally) groupchat message is received." "Звук, который\ проигрываетÑÑ Ð¿Ñ€Ð¸ получении выделенного (обычно перÑонально\ адреÑованного) ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸Ð· конференции." ::msgcat::mcset ru "Sound to play when personal chat message is received."\ "Звук, который проигрываетÑÑ Ð¿Ñ€Ð¸ получении ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸Ð· разговора." ::msgcat::mcset ru "Sound to play when sending personal chat message." "Звук,\ который проигрываетÑÑ Ð¿Ñ€Ð¸ отправке ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸Ð· разговора." ::msgcat::mcset ru "Sound to play when unavailable presence is received."\ "Звук, который проигрываетÑÑ Ð¿Ñ€Ð¸ получении приÑутÑÑ‚Ð²Ð¸Ñ Ñ‚Ð¸Ð¿Ð°\ \"недоÑтупен\"." ::msgcat::mcset ru "Source:" "ИÑточник:" ::msgcat::mcset ru "Specifies search mode while searching in chat, log or\ disco windows. \"substring\" searches exact substring, \"glob\" uses\ glob style matching, \"regexp\" allows to match regular expression."\ "Указывает режим поиÑка в окнах разговора, протокола и обзора Ñлужб.\ \"substring\" ищет подÑтроку, \"glob\" позволÑет иÑпользовать\ подÑтановочные Ñимволы, \"regexp\" иÑпользует регулÑрные выражениÑ." ::msgcat::mcset ru "Speed:" "СкороÑть:" ::msgcat::mcset ru "Spell check options." "Параметры проверки правопиÑаниÑ." ::msgcat::mcset ru "Spelling" "ОрфографиÑ" ::msgcat::mcset ru "SSL & Compression" "SSL & Сжатие" ::msgcat::mcset ru "SSL client certificate file bundled with private key\ (optional)." "Файл клиентÑкого Ñертификата SSL вмеÑте Ñ Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ñ‹Ð¼\ ключом (необÑзательный параметр)." ::msgcat::mcset ru "SSL certificate:" "Сертификат SSL:" ::msgcat::mcset ru "SSL certification authority file or directory\ (optional)." "Файл или Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ñ†ÐµÐ½Ñ‚Ñ€Ð° Ñертификации (CA) SSL\ (необÑзательный параметр)." ::msgcat::mcset ru "SSL Info" "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± SSL" ::msgcat::mcset ru "Start chat" "Ðачать беÑеду" ::msgcat::mcset ru "Starting auto-away" "УÑтанавливаетÑÑ ÑоÑтоÑние \"Отошёл\"\ (по бездейÑтвию)" ::msgcat::mcset ru "Starting login" "ÐачинаетÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ðµ" ::msgcat::mcset ru "STARTTLS aborted" "STARTTLS прерван" ::msgcat::mcset ru "STARTTLS failed" "STARTTLS не удалÑÑ" ::msgcat::mcset ru "STARTTLS successful" "STARTTLS уÑпешный" ::msgcat::mcset ru "STARTTLS timed out" "STARTTLS прерван из-за таймаута" ::msgcat::mcset ru "State" "СоÑтоÑние" ::msgcat::mcset ru "State " "ОблаÑть" ::msgcat::mcset ru "State:" "ОблаÑть:" ::msgcat::mcset ru "Statistics" "СтатиÑтика" ::msgcat::mcset ru "Statistics monitor" "Монитор ÑтатиÑтики" ::msgcat::mcset ru "Status bar" "СтатуÑÐ½Ð°Ñ Ñтрока" ::msgcat::mcset ru "Stop autoscroll" "Отключение автопрокрутки" ::msgcat::mcset ru "Stop chat window autoscroll." "Отключить автопрокрутку\ окна разговора." ::msgcat::mcset ru "Store" "Сохранить" ::msgcat::mcset ru "Store group chats logs." "СохранÑть протоколы\ конференций." ::msgcat::mcset ru "Store private chats logs." "СохранÑть протоколы\ перÑональных разговоров." ::msgcat::mcset ru "Stored collapsed roster groups." "Сохранённые\ закрытые/раÑпахнутые группы контактов." ::msgcat::mcset ru "Stored main window geometry" "Ð¡Ð¾Ñ…Ñ€Ð°Ð½Ñ‘Ð½Ð½Ð°Ñ Ð³ÐµÐ¾Ð¼ÐµÑ‚Ñ€Ð¸Ñ\ главного окна" ::msgcat::mcset ru "Stored main window geometry in non-tabbed mode"\ "Ð¡Ð¾Ñ…Ñ€Ð°Ð½Ñ‘Ð½Ð½Ð°Ñ Ð³ÐµÐ¾Ð¼ÐµÑ‚Ñ€Ð¸Ñ Ð³Ð»Ð°Ð²Ð½Ð¾Ð³Ð¾ окна в многооконном режиме" ::msgcat::mcset ru "Stored main window state (normal or zoomed)" "Сохранённое\ ÑоÑтоÑние (normal или zoomed) главного окна" ::msgcat::mcset ru "Stored main window state (normal or zoomed) in non-tabbed\ mode" "Сохранённое ÑоÑтоÑние (обычное или раÑÑ‚Ñнутое на веÑÑŒ Ñкран)\ главного окна в многооконном режиме" ::msgcat::mcset ru "Stored show offline roster groups." "СохранённаÑ\ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± отображении неподключённых контактов в группах\ контактов." ::msgcat::mcset ru "Stored user priority while she's away." "Сохранённый\ приоритет Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² то времÑ, когда она в ÑоÑтоÑнии Отошел." ::msgcat::mcset ru "Stored user priority." "Сохранённый приоритет\ пользователÑ." ::msgcat::mcset ru "Stored user status while she's away." "Сохранённый ÑтатуÑ\ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² то времÑ, когда она в ÑоÑтоÑнии Отошел." ::msgcat::mcset ru "Stored user status." "Сохранённый ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ." ::msgcat::mcset ru "Stored user text status while she's away." "Сохранённый\ текÑтовый ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² то времÑ, когда она в ÑоÑтоÑнии\ Отошел." ::msgcat::mcset ru "Stored user text status." "Сохранённый текÑтовый ÑтатуÑ\ пользователÑ." ::msgcat::mcset ru "Storing conferences failed: %s" "Ðе удалоÑÑŒ Ñохранить\ конференции: %s" ::msgcat::mcset ru "Storing roster metacontacts failed: %s" "Сохранить\ метаконтакт не удалоÑÑŒ: %s" ::msgcat::mcset ru "Storing roster notes failed: %s" "Ðе удалоÑÑŒ Ñохранить\ заметки к контактам: %s" ::msgcat::mcset ru "Stream error" "Ошибка потока" ::msgcat::mcset ru "Stream error (%s)" "Ошибка потока (%s)" ::msgcat::mcset ru "Stream error (%s): %s" "Ошибка потока (%s): %s" ::msgcat::mcset ru "Stream error: %s" "Ошибка потока: %s" ::msgcat::mcset ru "Stream initiation options." "Параметры SI-транÑпорта." ::msgcat::mcset ru "Stream management negotiation aborted" "СоглаÑование\ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÐ¾Ð¼ прервано" ::msgcat::mcset ru "Stream management negotiation failed" "Ðе удалоÑÑŒ\ ÑоглаÑовать ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÐ¾Ð¼" ::msgcat::mcset ru "Stream management negotiation successful" "СоглаÑование\ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÐ¾Ð¼ уÑпешное" ::msgcat::mcset ru "Stream management negotiation timed out" "СоглаÑование\ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÐ¾Ð¼ прервано по таймауту" ::msgcat::mcset ru "Stream method negotiation failed" "Ðе удалоÑÑŒ ÑоглаÑовать\ метод отправки потока" ::msgcat::mcset ru "Street:" "Улица:" ::msgcat::mcset ru "stressed" "напрÑжённое" ::msgcat::mcset ru "Strip leading \"http://jabber.org/protocol/\" from IQ\ namespaces in the status line." "ОпуÑкать\ \"http://jabber.org/protocol/\" при показе запроÑов в ÑтатуÑной\ Ñтроке." ::msgcat::mcset ru "studying" "учуÑÑŒ" ::msgcat::mcset ru "Subactivity" "Конкретнее" ::msgcat::mcset ru "Subactivity:" "Конкретнее:" ::msgcat::mcset ru "Subject" "Тема" ::msgcat::mcset ru "Subject is set to: %s" "Тема уÑтановлена в: %s" ::msgcat::mcset ru "Subject:" "Тема:" ::msgcat::mcset ru "Subject: " "Тема: " ::msgcat::mcset ru "Submit" "Отправить" ::msgcat::mcset ru "Subscribe" "ПодпиÑатьÑÑ" ::msgcat::mcset ru "Subscribe to a node" "ПодпиÑатьÑÑ Ð½Ð° узел" ::msgcat::mcset ru "Subscription" "ПодпиÑка на приÑутÑтвие" ::msgcat::mcset ru "Subscription request from %s" "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° подпиÑку на\ приÑутÑтвие от %s" ::msgcat::mcset ru "Subscription request from:" "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° подпиÑку на\ приÑутÑтвие от:" ::msgcat::mcset ru "Subscription required" "ТребуетÑÑ Ð¿Ð¾Ð´Ð¿Ð¸Ñка" ::msgcat::mcset ru "Subscription:" "ПодпиÑка:" ::msgcat::mcset ru "Subscriptions to pubsub nodes at %s" "ПодпиÑчики узла %s" ::msgcat::mcset ru "Substrings to highlight in messages." "ПодÑтроки, которые\ Ñледует выделÑть в ÑообщениÑÑ…." ::msgcat::mcset ru "Success" "УÑпех" ::msgcat::mcset ru "Suffix" "СуффикÑ" ::msgcat::mcset ru "Suffix:" "СуффикÑ:" ::msgcat::mcset ru "sunbathing" "загораю" ::msgcat::mcset ru "surprised" "удивлённое" ::msgcat::mcset ru "swimming" "плаваю" ::msgcat::mcset ru "Switch to tab number 1-9,10" "ПереключитьÑÑ Ð½Ð° вкладку\ 1-9,10" ::msgcat::mcset ru "System shutdown" "Завершение работы ÑиÑтемы" ::msgcat::mcset ru "Systray icon blinks when there are unread messages."\ "Значок в ÑиÑтемном лотке мигает, еÑли еÑть непрочитанные ÑообщениÑ." ::msgcat::mcset ru "Systray icon options." "Параметры значка ÑиÑтемного\ лотка." ::msgcat::mcset ru "Systray:" "СиÑтемный лоток:" ::msgcat::mcset ru "Tabs:" "Вкладки:" ::msgcat::mcset ru "taking a bath" "принимаю ванну" ::msgcat::mcset ru "taking a shower" "принимаю душ" ::msgcat::mcset ru "talking" "разговариваю" ::msgcat::mcset ru "Telephone numbers" "Телефонные номера" ::msgcat::mcset ru "Templates" "Шаблоны" ::msgcat::mcset ru "Temporary auth failure" "Ð’Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° аутентификации" ::msgcat::mcset ru "Temporary error" "Ð’Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°" ::msgcat::mcset ru "Text" "ТекÑÑ‚" ::msgcat::mcset ru "Text status, which is set when Tkabber is moving to away\ state." "ОпиÑание ÑоÑтоÑниÑ, уÑтанавливаемое когда Tkabber переходит\ в ÑоÑтоÑние \"Отошёл\"." ::msgcat::mcset ru "Text:" "ТекÑÑ‚:" ::msgcat::mcset ru "the option is set and saved." "параметр уÑтановлен и\ Ñохранён." ::msgcat::mcset ru "the option is set to its default value." "Ñтот параметр\ уÑтановлен в значение по умолчанию." ::msgcat::mcset ru "the option is set, but not saved." "параметр уÑтановлен,\ но не Ñохранён Ð´Ð»Ñ Ñледующих ÑеÑÑий." ::msgcat::mcset ru "the option is taken from config file." "параметр взÑÑ‚ из\ конфигурационного файла" ::msgcat::mcset ru "The room isn't joined yet" "ПриÑоединение к комнате еще\ не завершено" ::msgcat::mcset ru "The signature is good but has expired" "ПодпиÑÑŒ\ допуÑтимаÑ, но её Ñрок иÑтёк" ::msgcat::mcset ru "The signature is good but the key has expired" "ПодпиÑÑŒ\ допуÑтимаÑ, но Ñрок ключа иÑтёк" ::msgcat::mcset ru "thirsty" "хочу пить" ::msgcat::mcset ru "This message was forwarded by %s\n" "Это Ñообщение\ переÑлал %s\n" ::msgcat::mcset ru "This message was forwarded to %s" "Это Ñообщение было\ переÑлано %s" ::msgcat::mcset ru "This message was sent by %s\n" "Это Ñообщение было\ отправлено %s\n" ::msgcat::mcset ru "Time" "ВремÑ" ::msgcat::mcset ru "time %s%s:" "Ð²Ñ€ÐµÐ¼Ñ %s%s:" ::msgcat::mcset ru "time %s%s: %s" "Ð²Ñ€ÐµÐ¼Ñ %s%s: %s" ::msgcat::mcset ru "Time interval before playing next sound (in\ milliseconds)." "Минимальный интервал между ÑоÑедними звуками (в\ миллиÑекундах)." ::msgcat::mcset ru "Time Zone:" "Ð’Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð·Ð¾Ð½Ð°:" ::msgcat::mcset ru "Time zone:" "Ð’Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð·Ð¾Ð½Ð°:" ::msgcat::mcset ru "Time:" "ВремÑ:" ::msgcat::mcset ru "Timeout" "Таймаут" ::msgcat::mcset ru "Timeout " "Таймауту" ::msgcat::mcset ru "Timeout for waiting for BOSH responses (if set to zero,\ Tkabber will wait forever)." "Таймаут Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð° на Ð·Ð°Ð¿Ñ€Ð¾Ñ BOSH\ (еÑли равен нулю, Tkabber будет ждать неограниченно долго)." ::msgcat::mcset ru "Timeout for waiting for HTTP poll responses (if set to\ zero, Tkabber will wait forever)." "Таймаут Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð° на\ HTTP-Ð·Ð°Ð¿Ñ€Ð¾Ñ (еÑли равен нулю, Tkabber будет ждать неограниченно\ долго)." ::msgcat::mcset ru "Timer" "Таймер" ::msgcat::mcset ru "Timestamp:" "Момент времени:" ::msgcat::mcset ru "Title" "Ðазвание" ::msgcat::mcset ru "Title:" "Ðазвание:" ::msgcat::mcset ru "Tkabber configuration directory transfer failed\ with:\n%s\n Tkabber will use the old directory:\n%s" "ПереноÑ\ директории Ñ Ð½Ð°Ñтройками Tkabber'а не удалÑÑ:\n%s\n Тkabber будет\ иÑпользовать Ñтарую директорию:\n%s" ::msgcat::mcset ru "Tkabber emoticons theme. To make new theme visible for\ Tkabber put it to some subdirectory of %s." "Тема Ñмоциконок\ Tkabber'а. Ð”Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÑобÑтвенной темы размеÑтите её в\ поддиректории директории %s." ::msgcat::mcset ru "Tkabber icon theme. To make new theme visible for Tkabber\ put it to some subdirectory of %s." "Тема пиктограмм Tkabber'а. Чтобы\ иметь возможноÑть включить ÑобÑтвенную тему, положите её в\ поддиректорию директории %s." ::msgcat::mcset ru "Tkabber save state options." "ÐаÑтройки ÑохранениÑ\ ÑоÑтоÑÐ½Ð¸Ñ Tkabber'а." ::msgcat::mcset ru "Tkabber Systray" "Tkabber в ÑиÑтемном лотке" ::msgcat::mcset ru "TLS handshake failed: %s" "Ошибка Ñ€ÑƒÐºÐ¾Ð¿Ð¾Ð¶Ð°Ñ‚Ð¸Ñ TLS: %s" ::msgcat::mcset ru "To" "Кому" ::msgcat::mcset ru "To:" "Кому:" ::msgcat::mcset ru "To: " "Кому: " ::msgcat::mcset ru "Toggle encryption" "Вкл./выкл. шифрование" ::msgcat::mcset ru "Toggle encryption (when possible)" "Вкл./выкл. шифрование\ (еÑли возможно)" ::msgcat::mcset ru "Toggle seen" "Переключить ÑтатуÑ" ::msgcat::mcset ru "Toggle showing offline users" "Вкл./выкл. показ\ отключённых пользователей" ::msgcat::mcset ru "Toggle signing presence updates" "Вкл./выкл. подпиÑÑŒ\ обновлений приÑутÑтвиÑ" ::msgcat::mcset ru "Toolbar" "Панель инÑтрументов" ::msgcat::mcset ru "Top" "Сверху" ::msgcat::mcset ru "Track:" "Трек:" ::msgcat::mcset ru "Transfer failed: %s" "Передача не удалаÑÑŒ: %s" ::msgcat::mcset ru "Transferring..." "Передача файла..." ::msgcat::mcset ru "Transport \"%s\" already registered" "ТранÑпорт \"%s\"\ уже зарегиÑтрирован" ::msgcat::mcset ru "traveling" "путешеÑтвую" ::msgcat::mcset ru "Try again" "Попробовать Ñнова" ::msgcat::mcset ru "TTL expired" "ЗакончилоÑÑŒ Ð²Ñ€ÐµÐ¼Ñ Ð¶Ð¸Ð·Ð½Ð¸ пакета" ::msgcat::mcset ru "Tunnel proxies" "Туннелирующие прокÑи" ::msgcat::mcset ru "Turn blinking off" "Мигание выключено" ::msgcat::mcset ru "Type" "Тип" ::msgcat::mcset ru "Unable to encipher data for %s: %s.\n\nEncrypting traffic\ to this user is now disabled.\n\nSend it as PLAINTEXT?" "Ðевозможно\ зашифровать данные Ð´Ð»Ñ %s: %s.\n\nШифрование Ñообщений Ð´Ð»Ñ Ñтого\ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ‚ÐµÐ¿ÐµÑ€ÑŒ отключено.\n\nОтоÑлать Ñообщение\ ÐЕЗÐШИФРОВÐÐÐЫМ?" ::msgcat::mcset ru "Unable to sign message body: %s.\n\nSigning traffic is\ now disabled.\n\nSend it WITHOUT a signature?" "Ðевозможно подпиÑать\ тело ÑообщениÑ: %s.\n\nПодпиÑывание Ñообщений теперь\ отключено.\n\nОтоÑлать Ñообщение БЕЗ ПОДПИСИ?" ::msgcat::mcset ru "Unable to sign presence information: %s.\n\nPresence will\ be sent, but signing traffic is now disabled." "Ðевозможно подпиÑать\ информацию о приÑутÑтвии: %s.\n\nПриÑутÑтвие будет отоÑлано, но\ подпиÑывание Ñообщений теперь отключено." ::msgcat::mcset ru "Unauthorized" "Ðе авторизовано" ::msgcat::mcset ru "Unavailable" "ÐедоÑтупен" ::msgcat::mcset ru "Unavailable presence" "ПриÑутÑтвие типа \"недоÑтупен\"" ::msgcat::mcset ru "Undefined" "Без группы" ::msgcat::mcset ru "Undefined condition" "Ðеопределенное уÑловие" ::msgcat::mcset ru "Undo" "Откатка" ::msgcat::mcset ru "Unexpected request" "Ðеожиданный запроÑ" ::msgcat::mcset ru "Unit:" "Отделение:" ::msgcat::mcset ru "Units" "Единицы" ::msgcat::mcset ru "unix plugins" "раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð´Ð»Ñ unix" ::msgcat::mcset ru "unknown" "неизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°" ::msgcat::mcset ru "Unknown address type" "ÐеизвеÑтный тип адреÑа" ::msgcat::mcset ru "Unknown error" "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°" ::msgcat::mcset ru "Unknown IQ type \"%s\"" "ÐеизвеÑтный тип IQ \"%s\"" ::msgcat::mcset ru "Unknown message type %s" "ÐеизвеÑтный тип ÑообщениÑ\ \"%s\"" ::msgcat::mcset ru "Unknown SOCKS4a server error" "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° Ñервера\ SOCKS4a" ::msgcat::mcset ru "Unknown SOCKS5 destination address type" "ÐеизвеÑтный тип\ адреÑа Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ SOCKS5" ::msgcat::mcset ru "Unknown transport \"%s\"" "ÐеизвеÑтный транÑпорт \"%s\"" ::msgcat::mcset ru "Unpublish" "Отозвать публикацию" ::msgcat::mcset ru "Unpublish user activity" "Отозвать публикацию занÑтиÑ\ пользователÑ" ::msgcat::mcset ru "Unpublish user activity..." "Отменить публикацию занÑтиÑ\ пользователÑ..." ::msgcat::mcset ru "Unpublish user location" "Отменить публикацию\ меÑÑ‚Ð¾Ð½Ð°Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" ::msgcat::mcset ru "Unpublish user location..." "Отменить публикацию\ меÑÑ‚Ð¾Ð½Ð°Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ..." ::msgcat::mcset ru "Unpublish user mood" "Отозвать публикацию ÑоÑтоÑниÑ\ пользователÑ" ::msgcat::mcset ru "Unpublish user mood..." "Отменить публикацию наÑтроениÑ\ пользователÑ..." ::msgcat::mcset ru "Unpublish user tune" "Отозвать публикацию мелодии\ пользователÑ" ::msgcat::mcset ru "Unpublish user tune..." "Отменить публикацию мелодии\ пользователÑ..." ::msgcat::mcset ru "Unpublishing is only possible while being online" "Отзыв\ публикации возможен лишь при активном подключении" ::msgcat::mcset ru "Unrecoverable error" "ÐеуÑÑ‚Ñ€Ð°Ð½Ð¸Ð¼Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°" ::msgcat::mcset ru "Unregister" "ОтрегиÑтрироватьÑÑ" ::msgcat::mcset ru "Unsubscribe" "ОтпиÑатьÑÑ" ::msgcat::mcset ru "Unsubscribe from a node" "ОтпиÑатьÑÑ Ð¾Ñ‚ узла" ::msgcat::mcset ru "Unsubscribed from %s" "ОтпиÑаны от %s" ::msgcat::mcset ru "Unsupported compression method" "Ðеподдерживаемый метод\ ÑжатиÑ" ::msgcat::mcset ru "Unsupported encoding" "ÐÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ°" ::msgcat::mcset ru "Unsupported log dir format" "Ðеподдерживаемый формат\ директории протоколов." ::msgcat::mcset ru "Unsupported proxy \"%s\"" "Ðеподдерживаемый тип прокÑи\ \"%s\"" ::msgcat::mcset ru "Unsupported SOCKS authentication method"\ "Ðеподдерживаемый метод аутентификации SOCKS" ::msgcat::mcset ru "Unsupported SOCKS method" "Ðеподдерживаемый метод SOCKS" ::msgcat::mcset ru "Unsupported SOCKS5 authorization method"\ "Ðеподдерживаемый метод авторизации SOCKS5" ::msgcat::mcset ru "Unsupported stanza type" "Ðеподдерживаемый тип Ñлемента" ::msgcat::mcset ru "Unsupported stream XMLNS \"%s\"" "Ðеподдерживаемый тип\ потока XMPP \"%s\"" ::msgcat::mcset ru "Unsupported version" "ÐÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð²ÐµÑ€ÑиÑ" ::msgcat::mcset ru "Up" "Вверх" ::msgcat::mcset ru "Update" "Обновить" ::msgcat::mcset ru "Update item" "Обновить Ñлемент" ::msgcat::mcset ru "Update list" "Обновить ÑпиÑок" ::msgcat::mcset ru "Update message of the day..." "Обновить Ñообщение днÑ..." ::msgcat::mcset ru "Uptime" "Ð’Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹" ::msgcat::mcset ru "URI:" "СÑылка:" ::msgcat::mcset ru "URL to connect to using BOSH." "URL Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ\ иÑпользованием BOSH." ::msgcat::mcset ru "URL to connect to." "URL Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ (опроÑа)." ::msgcat::mcset ru "URL to poll:" "URL Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ:" ::msgcat::mcset ru "URL to use:" "URL Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ:" ::msgcat::mcset ru "Usage: /abbrev WHAT FOR" "ИÑпользование: /abbrev ЧТО\ ÐÐ_ЧТО" ::msgcat::mcset ru "Usage: /unabbrev WHAT" "ИÑпользование: /unabbrev ЧТО" ::msgcat::mcset ru "Usage: ::xmpp::Set xlib property ?value?" "СинтакÑиÑ:\ ::xmpp::Set xlib property ?value?" ::msgcat::mcset ru "Use BOSH client security keys (recommended)."\ "ИÑпользовать ключи безопаÑноÑти BOSH (рекомендуетÑÑ)." ::msgcat::mcset ru "Use BOSH connection method." "ИÑпользовать подключение\ BOSH (подключение Ñ Ð¸Ñпользованием HTTP)" ::msgcat::mcset ru "Use client security keys" "ИÑпользовать ключи\ безопаÑноÑти" ::msgcat::mcset ru "Use colored messages" "ИÑпользовать цветные ÑообщениÑ" ::msgcat::mcset ru "Use colored nicks" "ИÑпользовать цветные пÑевдонимы" ::msgcat::mcset ru "Use colored nicks in chat windows." "ИÑпользовать цветные\ пÑевдонимы в окнах разговоров/конференций." ::msgcat::mcset ru "Use colored nicks in groupchat rosters." "ИÑпользовать\ цветные пÑевдонимы в ÑпиÑках учаÑтников конференций." ::msgcat::mcset ru "Use colored roster nicks" "ИÑпользовать цветные\ пÑевдонимы в ÑпиÑке учаÑтников" ::msgcat::mcset ru "Use connection:" "Соединение:" ::msgcat::mcset ru "Use explicitly-specified server address and port."\ "ИÑпользовать Ñвно указанные Ð°Ð´Ñ€ÐµÑ Ñервера и порт Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ." ::msgcat::mcset ru "Use HTTP poll client security keys (recommended)."\ "ИÑпользовать ключи безопаÑноÑти HTTP-Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ (рекомендуетÑÑ)." ::msgcat::mcset ru "Use HTTP poll connection method." "ИÑпользовать\ HTTP-подключение." ::msgcat::mcset ru "Use mediated SOCKS5 connection if proxy is available."\ "ИÑпользовать Ñоединение SOCKS5 через поÑредника, еÑли он доÑтупен." ::msgcat::mcset ru "Use only whole words for emoticons." "Только целые Ñлова\ превращать в Ñмоциконки (не чаÑти Ñлов)." ::msgcat::mcset ru "Use roster filter" "ИÑпользовать фильтр контактов" ::msgcat::mcset ru "Use roster filter." "ИÑпользовать фильтр контактов." ::msgcat::mcset ru "Use SASL authentication" "ИÑпользовать SASL длÑ\ аутентификации" ::msgcat::mcset ru "Use SASL authentication." "ИÑпользовать SASL длÑ\ аутентификации." ::msgcat::mcset ru "Use sound notification only when being available."\ "ИÑпользовать звук только в ÑоÑтоÑниÑÑ… \"Ð’ Ñети\" и \"Свободен длÑ\ разговора\"." ::msgcat::mcset ru "Use specified key ID for signing and decrypting\ messages." "ИÑпользовать ключ Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼ идентификатором Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñи\ и дешифровки Ñообщений." ::msgcat::mcset ru "Use stream management" "ИÑпользовать управление потоком" ::msgcat::mcset ru "Use stream management protocol to acknowledge any stanza\ received from and sent to the server." "ИÑпользовать протокол\ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÐ¾Ð¼ Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð°ÐºÐµÑ‚Ð¾Ð², полученных от\ Ñервера и поÑланных Ñерверу." ::msgcat::mcset ru "Use Tabbed Interface (you need to restart)."\ "ИÑпользовать Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñ Ð·Ð°ÐºÐ»Ð°Ð´ÐºÐ°Ð¼Ð¸ (поÑле Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ÑÑ\ реÑтарт)." ::msgcat::mcset ru "Use the same passphrase for signing and decrypting\ messages." "ИÑпользовать одну и ту же парольную фразу Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñи и\ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñообщений." ::msgcat::mcset ru "Use the specified function to hash supported features\ list." "ИÑпользовать указанный алгоритм Ð´Ð»Ñ Ñ…ÐµÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÑпиÑка\ реализованных возможноÑтей программы." ::msgcat::mcset ru "Use this module" "Подключить данный модуль" ::msgcat::mcset ru "User activity" "ЗанÑтие пользователÑ" ::msgcat::mcset ru "User activity publishing failed: %s" "Ðе удалоÑÑŒ\ опубликовать занÑтие пользователÑ: %s" ::msgcat::mcset ru "User activity unpublishing failed: %s" "Ðе удалоÑÑŒ\ отозвать публикацию занÑÑ‚Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ: %s" ::msgcat::mcset ru "User already %s" "Пользователь уже %s" ::msgcat::mcset ru "User ID" "ID пользователÑ" ::msgcat::mcset ru "User info" "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ пользователе" ::msgcat::mcset ru "user interface" "Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" ::msgcat::mcset ru "User is not banned" "Пользователю не запрещено входить в\ комнату" ::msgcat::mcset ru "User is unbanned" "Ð”Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¾Ñ‚Ð¼ÐµÐ½ÐµÐ½ запрет\ входить в комнату" ::msgcat::mcset ru "User location" "МеÑтонахождение пользователÑ" ::msgcat::mcset ru "User location publishing failed: %s" "ПубликациÑ\ меÑÑ‚Ð¾Ð½Ð°Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ удалаÑÑŒ: %s" ::msgcat::mcset ru "User location unpublishing failed: %s" "Отмена публикации\ меÑÑ‚Ð¾Ð½Ð°Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ удалаÑÑŒ: %s" ::msgcat::mcset ru "User mood" "СоÑтоÑние пользователÑ" ::msgcat::mcset ru "User mood publishing failed: %s" "Ðе удалоÑÑŒ опубликовать\ ÑоÑтоÑние пользователÑ: %s" ::msgcat::mcset ru "User mood unpublishing failed: %s" "Ðе удалоÑÑŒ отозвать\ публикацию ÑоÑтоÑÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ: %s" ::msgcat::mcset ru "User name." "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ." ::msgcat::mcset ru "User tune" "ÐœÐµÐ»Ð¾Ð´Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" ::msgcat::mcset ru "User tune publishing failed: %s" "Ðе удалоÑÑŒ опубликовать\ мелодию пользователÑ: %s" ::msgcat::mcset ru "User tune unpublishing failed: %s" "Ðе удалоÑÑŒ отозвать\ публикацию мелодии пользователÑ: %s" ::msgcat::mcset ru "Username" "Пользователь" ::msgcat::mcset ru "Username Not Available" "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½ÐµÐ´Ð¾Ñтупно" ::msgcat::mcset ru "Username:" "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ:" ::msgcat::mcset ru "Users" "Пользователи" ::msgcat::mcset ru "utilities" "утилиты" ::msgcat::mcset ru "Value" "Значение" ::msgcat::mcset ru "value is changed, but the option is not set." "значение\ изменено, но параметр не уÑтановлен." ::msgcat::mcset ru "vcard %s%s:" "Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ %s%s:" ::msgcat::mcset ru "vcard %s%s: %s" "Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ %s%s: %s" ::msgcat::mcset ru "vCard display options in chat windows." "Параметры\ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ¹ vCard в окне разговора." ::msgcat::mcset ru "Version" "ВерÑиÑ" ::msgcat::mcset ru "version %s%s:" "верÑÐ¸Ñ %s%s:" ::msgcat::mcset ru "version %s%s: %s" "верÑÐ¸Ñ %s%s: %s" ::msgcat::mcset ru "Version:" "ВерÑиÑ:" ::msgcat::mcset ru "Video:" "Видео:" ::msgcat::mcset ru "View" "Вид" ::msgcat::mcset ru "Visible list" "Видимый ÑпиÑок" ::msgcat::mcset ru "visitor" "поÑетитель" ::msgcat::mcset ru "Visitors" "ПоÑетители" ::msgcat::mcset ru "Voice:" "Обычный:" ::msgcat::mcset ru "Waiting for activating privacy list" "Ждем, пока\ активируетÑÑ ÑпиÑок приватноÑти" ::msgcat::mcset ru "Waiting for component handshake result" "Ждём результат\ Ñ€ÑƒÐºÐ¾Ð¿Ð¾Ð¶Ð°Ñ‚Ð¸Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ñ‹" ::msgcat::mcset ru "Waiting for non-SASL authentication fields" "Ждём форму\ Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ без иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ SASL" ::msgcat::mcset ru "Waiting for non-SASL authentication results" "Ждём\ результаты аутентификации без иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ SASL" ::msgcat::mcset ru "walking" "гулÑÑŽ" ::msgcat::mcset ru "walking the dog" "выгуливаю Ñобаку" ::msgcat::mcset ru "Warning" "Предупреждение" ::msgcat::mcset ru "Warning display options." "Параметры отображениÑ\ предупреждений." ::msgcat::mcset ru "Warning:" "Предупреждение:" ::msgcat::mcset ru "WARNING: %s\n" "ПРЕДУПРЕЖДЕÐИЕ: %s\n" ::msgcat::mcset ru "watching a movie" "Ñмотрю кино" ::msgcat::mcset ru "watching tv" "Ñмотрю телевизор" ::msgcat::mcset ru "Web site" "Веб-Ñтраница:" ::msgcat::mcset ru "Web site:" "Веб-Ñтраница:" ::msgcat::mcset ru "What action does the close button." "ДейÑтвие,\ Ñовершаемое при нажатии на кнопку Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð¾ÐºÐ½Ð°." ::msgcat::mcset ru "When set, all changes to the ignore rules are applied\ only until Tkabber is closed\; they are not saved and thus will be\ not restored at the next run." "ЕÑли параметр уÑтановлен, то вÑе\ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð» Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ дейÑтвовать только до того, как\ Tkabber закроетÑÑ, и не будут воÑÑтановлены при Ñледующем запуÑке." ::msgcat::mcset ru "Whether to automatically login to server or show the\ login window." "ПодключатьÑÑ Ð»Ð¸ к Ñерверу автоматичеÑки, или\ показывать диалоговое окно подключениÑ." ::msgcat::mcset ru "Whois" "Кто Ñто?" ::msgcat::mcset ru "whois '%s': no info" "whois '%s': нет информации" ::msgcat::mcset ru "windows plugins" "раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð´Ð»Ñ windows" ::msgcat::mcset ru "Work:" "Рабочий:" ::msgcat::mcset ru "working" "работаю" ::msgcat::mcset ru "working out" "\"качаюÑÑŒ\" на тренажёрах" ::msgcat::mcset ru "worried" "беÑпокойное" ::msgcat::mcset ru "writing" "пишу" ::msgcat::mcset ru "XML not well-formed" "Ðеправильно Ñформированный XML" ::msgcat::mcset ru "xmpp chat/muc" "разговоры/конференции" ::msgcat::mcset ru "xmpp iq" "информациÑ" ::msgcat::mcset ru "xmpp library" "библиотека xmpp" ::msgcat::mcset ru "xmpp messages" "ÑообщениÑ" ::msgcat::mcset ru "xmpp presence" "приÑутÑтвие" ::msgcat::mcset ru "xmpp registration" "региÑтрациÑ" ::msgcat::mcset ru "xmpp roster" "контакты" ::msgcat::mcset ru "XMPP stream options when connecting to server."\ "ÐаÑтройки XMPP-потока при подключении к Ñерверу." ::msgcat::mcset ru "Year:" "Год:" ::msgcat::mcset ru "You are unsubscribed from %s" "Ð’Ñ‹ отпиÑаны от %s" ::msgcat::mcset ru "You must join the room to set %s" "Ð’Ñ‹ должны\ приÑоединитьÑÑ Ðº комнате, чтобы уÑтановить %s" ::msgcat::mcset ru "You're using root directory %s for storing Tkabber\ logs!\n\nI refuse to convert logs database." "Ð’Ñ‹ храните журналы\ разговоров Tkabber'а в корневой директории %s!\n\nКонвертирование\ журналов отменÑетÑÑ." ::msgcat::mcset ru "Your new Tkabber config directory is now:\n%s\nYou can\ delete the old one:\n%s" "ÐÐ¾Ð²Ð°Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ñ Ð½Ð°Ñтройками\ Tkabber'а:\n%s\nÐ’Ñ‹ можете удалить Ñтарую:\n%s" ::msgcat::mcset ru "Zip" "ИндекÑ" ::msgcat::mcset ru "not actually changed" "не изменилÑÑ" ::msgcat::mcset ru "entirely new key" "Ñовершенно новый ключ" ::msgcat::mcset ru "new user IDs" "новые ID пользователÑ" ::msgcat::mcset ru "new signatures" "новые подпиÑи" ::msgcat::mcset ru "new subkeys" "новые подключи" ::msgcat::mcset ru "contains private key" "Ñодержит закрытый ключ" ::msgcat::mcset ru "\n\tJID: %s" ::msgcat::mcset ru "auto-away" ::msgcat::mcset ru "BBS:" ::msgcat::mcset ru "bwidget workarounds" ::msgcat::mcset ru "day" ::msgcat::mcset ru "days" ::msgcat::mcset ru "E-mail" ::msgcat::mcset ru "E-mail:" ::msgcat::mcset ru "Edit entities affiliations: %s" ::msgcat::mcset ru "History of availability status messages" ::msgcat::mcset ru "hour" ::msgcat::mcset ru "hours" ::msgcat::mcset ru "HTTP" ::msgcat::mcset ru "HTTPS" ::msgcat::mcset ru "IQ" ::msgcat::mcset ru "ISDN:" ::msgcat::mcset ru "Jabber ID" ::msgcat::mcset ru "JID" ::msgcat::mcset ru "JID:" ::msgcat::mcset ru "kde" ::msgcat::mcset ru "List of users for chat." ::msgcat::mcset ru "List of users for userinfo." ::msgcat::mcset ru "minute" ::msgcat::mcset ru "minutes" ::msgcat::mcset ru "MUC" ::msgcat::mcset ru "negotiation" ::msgcat::mcset ru "Outcast" ::msgcat::mcset ru "Owner" ::msgcat::mcset ru "PCS:" ::msgcat::mcset ru "Pending" ::msgcat::mcset ru "Presence-in" ::msgcat::mcset ru "Presence-out" ::msgcat::mcset ru "privacy rules" ::msgcat::mcset ru "Publisher" ::msgcat::mcset ru "second" ::msgcat::mcset ru "seconds" ::msgcat::mcset ru "SOCKS4a" ::msgcat::mcset ru "SOCKS5" ::msgcat::mcset ru "SSL" ::msgcat::mcset ru "SubID" ::msgcat::mcset ru "Subscribed" ::msgcat::mcset ru "UID" ::msgcat::mcset ru "UID:" ::msgcat::mcset ru "Unconfigured" ::msgcat::mcset ru "URL" ::msgcat::mcset ru "URL:" ::msgcat::mcset ru "UTC:" ::msgcat::mcset ru "whois '%s': %s" ::msgcat::mcset ru "wmaker" #================================================================== namespace eval :: { proc load_russian_procs {} { rename format_time "" rename ru_format_time format_time } proc ru_word_form {t} { set modt [expr {$t % 10}] if {($t >= 10) && ($t < 20)} { return 0 } elseif {$modt == 1} { return 1 } elseif {($modt >= 2) && ($modt <= 4)} { return 2 } else { return 0 } } proc ru_format_time {t} { if {[string equal $t ""]} { return } set sec [expr {$t % 60}] set secs [lindex {"Ñекунд" "Ñекунда" "Ñекунды"} [ru_word_form $sec]] set t [expr {$t / 60}] set min [expr {$t % 60}] set mins [lindex {"минут" "минута" "минуты"} [ru_word_form $min]] set t [expr {$t / 60}] set hour [expr {$t % 24}] set hours [lindex {"чаÑов" "чаÑ" "чаÑа"} [ru_word_form $hour]] set day [expr {$t / 24}] set days [lindex {"дней" "день" "днÑ"} [ru_word_form $day]] set flag 0 set message "" if {$day != 0} { set flag 1 set message "$day $days" } if {$flag || ($hour != 0)} { set flag 1 set message [concat $message "$hour $hours"] } if {$flag || ($min != 0)} { set message [concat $message "$min $mins"] } return [concat $message "$sec $secs"] } hook::add postload_hook load_russian_procs } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/msgs/ru.rc000064400000000000000000000030101477701321300137700ustar00nobodynobody! ru.rc -- ! ! Definition of Russian resources for BWidget ! ! Author: Sergei Golovan ! --- symbolic names of buttons ----------------------------------------------- *abortName: Прервать *retryName: Повторить *ignoreName: Игнорировать *okName: Продолжить *cancelName: Отменить *yesName: Да *noName: Ðет ! --- symbolic names of label of SelectFont dialog ---------------------------- *boldName: Полужирный *italicName: КурÑивный *underlineName: Подчеркнутый *overstrikeName: Перечеркнутый *fontName: Шрифт *sizeName: Размер *styleName: Вид ! --- symbolic names of label of PasswdDlg dialog ----------------------------- *loginName: Ð˜Ð¼Ñ *passwordName: Пароль ! --- resource for SelectFont dialog ------------------------------------------ *SelectFont.title: Выбор шрифта *SelectFont.sampletext: Sample text, пример текÑта ! --- resource for MessageDlg dialog ------------------------------------------ *MessageDlg.noneTitle: Сообщение *MessageDlg.infoTitle: Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ *MessageDlg.questionTitle: Ð’Ð¾Ð¿Ñ€Ð¾Ñ *MessageDlg.warningTitle: Внимание! *MessageDlg.errorTitle: Ошибка ! --- resource for PasswdDlg dialog ------------------------------------------- *PasswdDlg.title: Ввод имени и Ð¿Ð°Ñ€Ð¾Ð»Ñ ! vim:ft=xdefaults:ts=8:sw=4:sts=4:et tkabber/msgs/uk.msg000064400000000000000000005451641477701321300141700ustar00nobodynobody# uk.msg -- # # Ukrainian messages for the Tkabber XMPP client. # # Author: Mykola Dzham # Updated: Artem Bondarenko # Updated: Sergei Golovan # Last-Modified: 2015-12-13 ::msgcat::mcset uk "#" "â„–" ::msgcat::mcset uk "Aborted" "Перервано" ::msgcat::mcset uk "About" "Про програму" # Space at the end of the next word is to distinguish it from another "About" ::msgcat::mcset uk "About " "Про Ñебе " ::msgcat::mcset uk "Accept connections from my own JID." "Приймати з'єднаннÑ\ з мого оÑобиÑтого JID" ::msgcat::mcset uk "Accept connections from the listed JIDs." "Приймати\ з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· перелічених JID" ::msgcat::mcset uk "Accept default config" "ПрийнÑти Ñтандартні налаштуваннÑ" ::msgcat::mcset uk "Access Error" "Помилка доÑтупу" ::msgcat::mcset uk "Account" "Обліковий запиÑ" ::msgcat::mcset uk "Action" "ДіÑ" ::msgcat::mcset uk "Activate lists at startup" "Ðктивувати ÑпиÑки при Ñтарті" ::msgcat::mcset uk "Activating privacy list failed: %s\n\nTry to reconnect.\ If problem persists, you may want to disable privacy list activation\ at start" "Ðе вдалоÑÑ Ð°ÐºÑ‚Ð¸Ð²ÑƒÐ²Ð°Ñ‚Ð¸ ÑпиÑок приватноÑті: %s\n\nСпробуйте\ перез'єднатиÑÑŒ. Якщо проблема залишитьÑÑ, можливо, треба вимкнути\ активацію ÑпиÑків приватноÑті при Ñтарті" ::msgcat::mcset uk "Active" "Ðктивний" ::msgcat::mcset uk "Active Chats" "Ðктивні чати" ::msgcat::mcset uk "Add" "Додати" ::msgcat::mcset uk "Add ->" "Додати ->" ::msgcat::mcset uk "Add chats group in roster." "Додати групу чатів в\ роÑтер." ::msgcat::mcset uk "Add conference to roster..." "Додати конференцію в\ роÑтер..." ::msgcat::mcset uk "Add group by regexp on JIDs..." "Додати групу по\ регулÑрному виразу Ð´Ð»Ñ JID..." ::msgcat::mcset uk "Add item" "Додати елемент" ::msgcat::mcset uk "Add JID" "Додати JID" ::msgcat::mcset uk "Add list" "Додати ÑпиÑок" ::msgcat::mcset uk "Add new user..." "Додати Ñпіврозмовника..." ::msgcat::mcset uk "Add roster group by JID regexp" "Додати групу роÑтера по\ регулÑрному виразу Ð´Ð»Ñ JID" ::msgcat::mcset uk "Add user to roster..." "Додати Ñпіврозмовника в\ роÑтер..." ::msgcat::mcset uk "Address" "ÐдреÑа" ::msgcat::mcset uk "Address 2" "ÐдреÑа 2" ::msgcat::mcset uk "Address 2:" "ÐдреÑа 2:" ::msgcat::mcset uk "Address Error" "Помилка адреÑи" ::msgcat::mcset uk "Address:" "ÐдреÑа:" ::msgcat::mcset uk "Admin tools" "ІнÑтрументи адмініÑтратора" ::msgcat::mcset uk "Affiliation" "Ранг" ::msgcat::mcset uk "Alexey Shchepin" "ОлекÑій Щєпін" ::msgcat::mcset uk "All" "Ð’Ñе" ::msgcat::mcset uk "All files" "Ð’ÑÑ– файли" ::msgcat::mcset uk "Allow downloading" "Дозволити завантаженнÑ" ::msgcat::mcset uk "Allow plaintext authentication mechanisms" "Дозволити\ механізми авторизації, що викориÑтовують відкритий текÑÑ‚" ::msgcat::mcset uk "Allow plaintext authentication mechanisms (when password\ is transmitted unencrypted)." "Дозволити механізми авторизації, що\ викориÑтовують відкритий текÑÑ‚ (при цьому пароль передаєтьÑÑ\ незашифрованим)." ::msgcat::mcset uk "An error occurred when searching in %s\n\n%s" "При пошуку\ в %s ÑталаÑÑŒ помилка\n\n%s" ::msgcat::mcset uk "Announce" "ОголошеннÑ" ::msgcat::mcset uk "Application Error" "Помилка прикладної програми" ::msgcat::mcset uk "Are you sure to remove %s from roster?" "Ви дійÑно хочете\ видалити %s з роÑтера?" ::msgcat::mcset uk "Are you sure to remove group '%s' from roster? \n(Users\ which are in this group only, will be in undefined group.)" "Ви\ дійÑно хочете видалити групу '%s' з роÑтера? \n(Контакти, що Ñ” тільки\ в цій групі, будуть без групи.)" ::msgcat::mcset uk "Attached user:" "Прикріплений контакт:" ::msgcat::mcset uk "Authentication" "ÐвторизаціÑ" ::msgcat::mcset uk "Authentication failed" "ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ñ–Ñ Ð½Ðµ вдалаÑÑŒ" ::msgcat::mcset uk "Authentication failed: %s" "ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ñ–Ñ Ð½Ðµ вдалаÑÑŒ: %s" ::msgcat::mcset uk "Authentication failed: %s\nCreate new account?"\ "ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ñ–Ñ Ð½Ðµ вдалаÑÑŒ: %s\nСтворити новий обліковий запиÑ?" ::msgcat::mcset uk "Authors:" "Ðвтори:" ::msgcat::mcset uk "Automatically join conference upon connect" "Ðвтоматично\ приєднуватиÑÑ Ð´Ð¾ конференції при під'єднанні" ::msgcat::mcset uk "Available" "ДоÑтупний" ::msgcat::mcset uk "Available presence" "ПриÑутніÑть \"доÑтупний\"" ::msgcat::mcset uk "auto-away" # "Automatically away due to idle" goes to textstatus # (probably no needs to translate) ::msgcat::mcset uk " by " " " ::msgcat::mcset uk " by %s" " %s" ::msgcat::mcset uk "&Help" "&Допомога" ::msgcat::mcset uk "/me has set the subject to: %s" "/me змінив(ла) тему на:\ %s" ::msgcat::mcset uk "Available groups" "ДоÑтупні групи" ::msgcat::mcset uk "Avatar" "Ðватара" ::msgcat::mcset uk "avatars" "аватари" ::msgcat::mcset uk "Away" "Відійшов" ::msgcat::mcset uk "balloon help" "підказка, що Ñпливає" ::msgcat::mcset uk "Ban" "Заборонити входити до кімнати" ::msgcat::mcset uk "Begin date" "Початкова дата" ::msgcat::mcset uk "Birthday" "День народженнÑ" ::msgcat::mcset uk "Birthday:" "День народженнÑ:" ::msgcat::mcset uk "Blocking communication (XMPP privacy lists) options."\ "Параметри Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ (правил Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ð²Ð°Ñ‚Ð½Ð¾Ñті\ XMPP)." ::msgcat::mcset uk "Browse" "ПроглÑнути" ::msgcat::mcset uk "Browse..." "ПроглÑнути..." ::msgcat::mcset uk "browsing" "переглÑданнÑ" ::msgcat::mcset uk "Cache headlines on exit and restore on start." "Кешувати\ новини при виході Ñ– відновлювати при Ñтарті." ::msgcat::mcset uk "Can't receive file: %s" "Ðе вдалоÑÑŒ прийнÑти файл: %s" ::msgcat::mcset uk "Cancel" "Відмінити" ::msgcat::mcset uk "Cell:" "Мобільний:" ::msgcat::mcset uk "Certificate has expired" "Строк дії Ñертифікату\ закінчивÑÑ" ::msgcat::mcset uk "Change password" "Зміна паролю" ::msgcat::mcset uk "Change password..." "Змінити пароль..." ::msgcat::mcset uk "Change Presence Priority" "Змінити пріоритет приÑутноÑті" ::msgcat::mcset uk "Change priority..." "Змінити пріоритет..." ::msgcat::mcset uk "Change security preferences for %s" "Зміна параметрів\ безпеки Ð´Ð»Ñ %s" ::msgcat::mcset uk "Chat" "РозмовлÑти" ::msgcat::mcset uk "Chat message" "Chat повідомленнÑ" ::msgcat::mcset uk "Chat message events plugin options." "Параметри плагіна,\ що відповідає за ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸ обробці повідомлень у вікні розмови." ::msgcat::mcset uk "Chat message window state plugin options." "Параметри\ плагіна, що відповідає за ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ Ñтан вікна розмови." ::msgcat::mcset uk "Chat options." "Параметри розмови." ::msgcat::mcset uk "Chat window is active" "Вікно розмови активне" ::msgcat::mcset uk "Chat window is gone" "Вікно розмови зачинено" ::msgcat::mcset uk "Chat window is inactive" "Вікно розмови неактивне" ::msgcat::mcset uk "Chats" "Розмови" ::msgcat::mcset uk "Chats:" "Розмови:" ::msgcat::mcset uk "Check spell after every entered symbol." "ПеревірÑти\ Ð¿Ñ€Ð°Ð²Ð¾Ð¿Ð¸Ñ Ð¿Ñ–ÑÐ»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ введеного Ñимволу." ::msgcat::mcset uk "Cipher" "Метод шифруваннÑ" ::msgcat::mcset uk "City" "МіÑто" ::msgcat::mcset uk "City:" "МіÑто:" ::msgcat::mcset uk "Clear" "ОчиÑтити" ::msgcat::mcset uk "Clear bookmarks" "ОчиÑтити закладки" ::msgcat::mcset uk "Clear chat window" "ОчиÑтити вікно розмови" ::msgcat::mcset uk "Client" "Клієнт" ::msgcat::mcset uk "Client:" "Клієнт:" ::msgcat::mcset uk "Close" "Закрити" ::msgcat::mcset uk "Close all tabs" "Закрити вÑÑ– вкладки" ::msgcat::mcset uk "Close other tabs" "Закрити інші вкладки" ::msgcat::mcset uk "Close tab" "Закрити вкладку" ::msgcat::mcset uk "Close Tkabber" "Закрити Tkabber" ::msgcat::mcset uk "Color message bodies in chat windows." "Кольорові\ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñƒ вікнах розмови." ::msgcat::mcset uk "Command to be run when you click a URL in a message. '%s'\ will be replaced with this URL (e.g. \"chromium %s >>& /dev/null\" or\ \"{C:/Program Files (x86)/Mozilla Firefox/firefox.exe} %s\")."\ "Команда, Ñка буде виконана при натиÑканні на URL, що міÑтитьÑÑ Ð²\ повідомленні. ЗаміÑть '%s' буде підÑтавлено URL (наприклад:\ \"chromium %s >>& /dev/null\" чи \"{C:/Program Files (x86)/Mozilla\ Firefox/firefox.exe} %s\")." ::msgcat::mcset uk "Composing a reply" "Пише відповідь" ::msgcat::mcset uk "Compression" "СтиÑненнÑ" ::msgcat::mcset uk "Compression negotiation failed" "Узгодити ÑтиÑÐ½ÐµÐ½Ð½Ñ Ð½Ðµ\ вдалоÑÑ" ::msgcat::mcset uk "Compression negotiation successful" "СтиÑÐ½ÐµÐ½Ð½Ñ Ð±ÑƒÐ»Ð¾\ узгоджено уÑпішно" ::msgcat::mcset uk "Compression setup failed" "СтиÑнути потік не вдалоÑÑ" ::msgcat::mcset uk "Conference room %s will be destroyed\ permanently.\n\nProceed?" "ÐšÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ñ–Ñ %s буде назавжди\ видалена.\n\nПродовжити?" ::msgcat::mcset uk "configuration" "налаштуваннÑ" ::msgcat::mcset uk "Configure form: %s" "Форма налаштувань: %s" ::msgcat::mcset uk "Configure room" "Ðалаштувати кімнату" ::msgcat::mcset uk "Conflict" "Конфлікт" ::msgcat::mcset uk "Connect via HTTP polling" "ПідключитиÑÑŒ викориÑтовуючи\ HTTP опитуваннÑ" ::msgcat::mcset uk "Connection" "З'єднаннÑ" ::msgcat::mcset uk "Connection:" "З'єднаннÑ:" ::msgcat::mcset uk "connections" "з'єднаннÑ" ::msgcat::mcset uk "Contact Information" "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ контакти" ::msgcat::mcset uk "Convert" "Перетворити" ::msgcat::mcset uk "Convert screenname" "Перетворити екранну назву" ::msgcat::mcset uk "Copy headline to clipboard" "Скопіювати новину до буферу\ обміну" ::msgcat::mcset uk "Copy selection to clipboard" "Скопіювати виділене до\ буферу обміну" ::msgcat::mcset uk "Copy URL to clipboard" "Скопіювати URL до буферу обміну" ::msgcat::mcset uk "Correct word" "Виправити Ñлово" ::msgcat::mcset uk "Country" "Країна" ::msgcat::mcset uk "Country:" "Країна:" ::msgcat::mcset uk "Create node" "Створити вузол" ::msgcat::mcset uk "Created: %s" "Створено: %s" ::msgcat::mcset uk "Creating default privacy list" "Створюємо Ñтандартний\ ÑпиÑок приватноÑті" ::msgcat::mcset uk "Creating default privacy list failed: %s\n\nTry to\ reconnect. If problem persists, you may want to disable privacy list\ activation at start" "Ðе вдалоÑÑ Ñтворити Ñтандартний ÑпиÑок\ приватноÑті: %s\n\nСпробуйте перепід'єднатиÑÑ. Якщо проблема\ залишитьÑÑ, можливо, треба вимкнути активацію ÑпиÑків приватноÑті при\ Ñтарті" ::msgcat::mcset uk "cryptographics" "криптографіÑ" ::msgcat::mcset uk "Current groups" "Поточні групи" ::msgcat::mcset uk "Customization of the One True Jabber Client."\ "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ”Ð´Ð¸Ð½Ð¾Ð³Ð¾ правильного клієнта Jabber." ::msgcat::mcset uk "Customize" "ÐалаштуваннÑ" ::msgcat::mcset uk "Data purportedly sent by %s can't be deciphered.\n\n%s."\ "Дані, ймовірно відправлені від %s, неможливо розшифрувати.\n\n%s." ::msgcat::mcset uk "Date:" "Дата:" ::msgcat::mcset uk "Day:" "День:" ::msgcat::mcset uk "Default" "Стандартний" ::msgcat::mcset uk "Default directory for downloaded files." "Стандартна тека\ Ð´Ð»Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð¸Ñ… файлів." ::msgcat::mcset uk "Default nested roster group delimiter." "Стандартний\ розділювач Ð´Ð»Ñ Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð¸Ñ… груп роÑтера." ::msgcat::mcset uk "Delay between getting focus and updating window or tab\ title in milliseconds." "Затримка між отриманнÑм фокуÑа Ñ– оновленнÑ\ заголовка вікна чи вкладки (в міліÑекундах)." ::msgcat::mcset uk "Delete" "Видалити" ::msgcat::mcset uk "Delete all" "Видалити вÑе" ::msgcat::mcset uk "Delete message of the day" "Видалити Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð´Ð½Ñ" ::msgcat::mcset uk "Delete seen" "Видалити переглÑнуте" ::msgcat::mcset uk "Description:" "СтатуÑ:" ::msgcat::mcset uk "Destroy room" "Знищити кімнату" ::msgcat::mcset uk "Details" "Деталі" ::msgcat::mcset uk "Dir" "Куди" ::msgcat::mcset uk "Directory to store logs." "Тека Ð´Ð»Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñ–Ð²." ::msgcat::mcset uk "Disabled\n" "Вимкнений\n" ::msgcat::mcset uk "Disconnected" "Роз'єднано" ::msgcat::mcset uk "Discovery" "ОглÑд" ::msgcat::mcset uk "Display %s in chat window when using /vcard command."\ "Показувати %s у вікні розмови при викориÑтанні команди /vcard." ::msgcat::mcset uk "Display description of user status in chat windows."\ "Показувати Ð¾Ð¿Ð¸Ñ ÑтатуÑу Ñпіврозмовника у вікні розмови." ::msgcat::mcset uk "Display headlines in single/multiple windows."\ "Показувати новини в одному/кількох вікнах." ::msgcat::mcset uk "Display SSL warnings." "Показувати Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ SSL." ::msgcat::mcset uk "Display status tooltip when main window is minimized to\ systray." "Показувати Ñпливаюче віконце, коли головне вікно звернуте\ до ÑиÑтемного трею." ::msgcat::mcset uk "Do not display headline descriptions as tree nodes." "Ðе\ показувати Ð¾Ð¿Ð¸Ñ Ð½Ð¾Ð²Ð¸Ð½Ð¸ у виглÑді гілки повідомленнÑ." ::msgcat::mcset uk "Do not disturb" "Ðе турбувати" ::msgcat::mcset uk "Do nothing" "Ðічого не робити" ::msgcat::mcset uk "Down" "Вниз" ::msgcat::mcset uk "Edit" "Редагувати" ::msgcat::mcset uk "Edit %s color" "Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð»ÑŒÐ¾Ñ€Ñƒ %s" ::msgcat::mcset uk "Edit admin list" "Редагувати ÑпиÑок адмініÑтраторів" ::msgcat::mcset uk "Edit ban list" "Редагувати ÑпиÑок заборон" ::msgcat::mcset uk "Edit chat user colors" "Редагувати кольори\ Ñпіврозмовників" ::msgcat::mcset uk "Edit groups for %s" "Зміна груп Ð´Ð»Ñ %s" ::msgcat::mcset uk "Edit ignore list" "Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ ÑпиÑку ігнорованих" ::msgcat::mcset uk "Edit ignore list " "Редагувати ÑпиÑок ігнорованих " ::msgcat::mcset uk "Edit invisible list" "Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ ÑпиÑку невидимоÑті" ::msgcat::mcset uk "Edit invisible list " "Редагувати ÑпиÑок невидимоÑті " ::msgcat::mcset uk "Edit item notes..." "Редагувати нотатки..." ::msgcat::mcset uk "Edit item..." "Редагувати..." ::msgcat::mcset uk "Edit list" "Редагувати ÑпиÑок" ::msgcat::mcset uk "Edit member list" "Редагувати ÑпиÑок учаÑників" ::msgcat::mcset uk "Edit moderator list" "Редагувати ÑпиÑок модераторів" ::msgcat::mcset uk "Edit my info..." "Редагувати інформацію про Ñебе..." ::msgcat::mcset uk "Edit nick color..." "Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð»ÑŒÐ¾Ñ€Ñƒ пÑевдоніму..." ::msgcat::mcset uk "Edit nick colors..." "Редагувати кольори пÑевдонімів..." ::msgcat::mcset uk "Edit nickname for %s" "Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñевдоніму %s" ::msgcat::mcset uk "Edit owner list" "Редагувати ÑпиÑок влаÑників" ::msgcat::mcset uk "Edit privacy list" "Редагувати ÑпиÑок приватноÑті" ::msgcat::mcset uk "Edit properties for %s" "Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð»Ð°ÑтивоÑтей %s" ::msgcat::mcset uk "Edit roster notes for %s" "Зміна приміток Ð´Ð»Ñ %s" ::msgcat::mcset uk "Edit security..." "Редагувати безпеку..." ::msgcat::mcset uk "Edit visible list" "Редагувати ÑпиÑок видимоÑті" ::msgcat::mcset uk "Edit voice list" "Редагувати ÑпиÑок права голоÑу" ::msgcat::mcset uk "emoticons" "Ñмайлики" ::msgcat::mcset uk "Emphasize" "ПідÑвічувати повідомленнÑ" ::msgcat::mcset uk "Enable chat window autoscroll only when last message is\ shown." "Вмикати автоматичне Ð¿Ñ€Ð¾Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ Ñкщо видно оÑтаннє\ повідомленнÑ." ::msgcat::mcset uk "Enable freedesktop systray icon." "Увімкнути freedesktop\ іконку в ÑиÑтемному треї." ::msgcat::mcset uk "Enable highlighting plugin." "Увімкнути модуль\ підÑвіченнÑ." ::msgcat::mcset uk "Enable KDE tray icon." "ВикориÑтовувати іконку в\ ÑиÑтемному треї KDE." ::msgcat::mcset uk "Enable nested roster groups." "Дозволити вкладені групи в\ роÑтері." ::msgcat::mcset uk "Enable remote control." "Увімкнути віддалений контроль" ::msgcat::mcset uk "Enable rendering of XHTML messages." "Дозволити\ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ, форматованих за допомогою XHTML." ::msgcat::mcset uk "Enable sending chat message events." "Увімкнути\ розÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñповіщень про обробку повідомлень у вікні розмови." ::msgcat::mcset uk "Enable sending chat state notifications." "Увімкнути\ розÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñповіщень про Ñтан вікна розмови." ::msgcat::mcset uk "Enable SI transport %s." "Дозволити викориÑтаннÑ\ SI-транÑпорту %s" ::msgcat::mcset uk "Enable windows tray icon." "ВикориÑтовувати іконку в\ ÑиÑтемному треї Windows" ::msgcat::mcset uk "Enabled\n" "Увімкнено\n" ::msgcat::mcset uk "Encrypt traffic" "Шифрувати трафік" ::msgcat::mcset uk "Encryption (legacy SSL)" "Ð¨Ð¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ (Ñтарий SSL)" ::msgcat::mcset uk "Encryption (STARTTLS)" "Ð¨Ð¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ (STARTTLS)" ::msgcat::mcset uk "Enter screenname of contact you want to add" "Введіть\ екранне ім'Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ñƒ, Ñкий Ви хочете додати" ::msgcat::mcset uk "Error" "Помилка" ::msgcat::mcset uk "Error completing command: %s" "Помилка при завершенні\ команди: %s" ::msgcat::mcset uk "Error displaying %s in browser\n\n%s" "Помилка при\ відкритті %s в переглÑдачі\n\n%s" ::msgcat::mcset uk "Error executing command: %s" "Помилка при виконанні\ команди: %s" ::msgcat::mcset uk "Error getting info: %s" "Помилка при отриманні\ інформації: %s" ::msgcat::mcset uk "Error getting items: %s" "помилка при отриманні\ елементів: %s" ::msgcat::mcset uk "Error in signature processing" "Помилка при перевірці\ підпиÑу" ::msgcat::mcset uk "Error in signature verification software: %s." "Помилка в\ програмі перевірки цифрового підпиÑу: %s." ::msgcat::mcset uk "Error requesting data: %s" "Помилка запиту даних: %s" ::msgcat::mcset uk "Error while converting screenname: %s." "Помилка при\ перетворенні екранного імені: %s" ::msgcat::mcset uk "Error:" "Помилка:" ::msgcat::mcset uk "Execute command" "Виконати команду" ::msgcat::mcset uk "Expiry date" "Дата Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ñтроку дії" ::msgcat::mcset uk "Explicitly specify host and port to connect" "Вказати\ адреÑу Ñ– порт Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ" ::msgcat::mcset uk "Export to XHTML" "ЕкÑпорт в XHTML" ::msgcat::mcset uk "Extended away" "Давно відійшов" ::msgcat::mcset uk "extension management" "ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð»Ð°Ð³Ñ–Ð½Ð°Ð¼Ð¸" ::msgcat::mcset uk "External program, which is to be executed to play sound.\ If empty, Snack library is used (if available) to play sound."\ "Ð—Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð°, Ñка буде виконуватиÑÑŒ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð²Ð°Ð½Ð½Ñ Ð·Ð²ÑƒÐºÑƒ. Якщо\ параметр порожній, то Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð²Ð°Ð½Ð½Ñ Ð±ÑƒÐ´Ðµ викориÑтовуватиÑÑ\ бібліотека Snack в разі Ñ—Ñ— наÑвноÑті." ::msgcat::mcset uk "Extras from %s" "Додаток від %s" ::msgcat::mcset uk "Extras from:" "Додаток від:" ::msgcat::mcset uk "Failed to connect: %s" "ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð½Ðµ вдалоÑÑŒ: %s" ::msgcat::mcset uk "Fax:" "ФакÑ:" ::msgcat::mcset uk "Fetch all messages" "Отримати вÑÑ– повідомленнÑ" ::msgcat::mcset uk "Fetch GPG key" "Отримати ключ GPG" ::msgcat::mcset uk "Fetch message" "Отримати повідомленнÑ" ::msgcat::mcset uk "Fetch unseen messages" "Отримати неотримані повідомленнÑ" ::msgcat::mcset uk "file transfer" "передача файла" ::msgcat::mcset uk "File Transfer options." "Параметри передачі файлів." ::msgcat::mcset uk "Finish" "Закінчити" ::msgcat::mcset uk "Forbidden" "Заборонено" ::msgcat::mcset uk "Format Error" "Помилка формату" ::msgcat::mcset uk "Format of timestamp in delayed chat messages delayed for\ more than 24 hours." "Формат виводу дати та чаÑу в повідомленнÑÑ…,\ відправлених більш ніж 24 години тому." ::msgcat::mcset uk "Format of timestamp in headline tree view. Set to empty\ string if you don't want to see timestamps." "Формат виводу дати/чаÑу\ у вікні новин. Ð”Ð»Ñ Ñ‚Ð¾Ð³Ð¾, щоб зовÑім не показувати дату/чаÑ,\ вÑтановіть цю опцію Ñк порожній Ñ€Ñдок." ::msgcat::mcset uk "Forward headline" "ПереÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð¾Ð²Ð¸Ð½Ð¸" ::msgcat::mcset uk "Forward to %s" "ПереÑлати до %s" ::msgcat::mcset uk "Forward..." "ПереÑлати..." ::msgcat::mcset uk "Free to chat" "Вільний Ð´Ð»Ñ Ñ€Ð¾Ð·Ð¼Ð¾Ð²Ð¸" ::msgcat::mcset uk "From/To" "Від кого/Кому" ::msgcat::mcset uk "From:" "Від кого:" ::msgcat::mcset uk "From: " "Від кого: " ::msgcat::mcset uk "Generic IQ" "Загальний IQ-запит" ::msgcat::mcset uk "Geographical position" "Географічне положенні" ::msgcat::mcset uk "Get items" "Отримати елементи" ::msgcat::mcset uk "GIF images" "Ð—Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ GIF" ::msgcat::mcset uk "Gone" "Об'єкт змінив адреÑу" ::msgcat::mcset uk "Google selection" "Шукати виділене в Google" ::msgcat::mcset uk "GPG options (signing and encryption)." "Параметри GPG\ (цифровий Ð¿Ñ–Ð´Ð¿Ð¸Ñ Ñ– шифруваннÑ)." ::msgcat::mcset uk "GPG-encrypt outgoing messages where possible." "Шифрувати\ вихідні Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð· допомогою GPG, Ñкщо це можливо." ::msgcat::mcset uk "Grant Admin Privileges" "Ðадати привілеї адмініÑтратора" ::msgcat::mcset uk "Grant Membership" "Ðадати членÑтво" ::msgcat::mcset uk "Grant Moderator Privileges" "Ðадати привілеї модератора" ::msgcat::mcset uk "Grant Owner Privileges" "Ðадати привілеї влаÑника" ::msgcat::mcset uk "Grant Voice" "Ðадати право говорити" ::msgcat::mcset uk "Group:" "Група:" ::msgcat::mcset uk "Groupchat message highlighting plugin options."\ "Параметри Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð´Ð»Ñ Ð¿Ñ–Ð´ÑÐ²Ñ–Ñ‡ÑƒÐ²Ð°Ð½Ð½Ñ Ñлів у конференціÑÑ…." ::msgcat::mcset uk "Headline message" "Заголовок новини" ::msgcat::mcset uk "Headlines" "Ðовини" ::msgcat::mcset uk "Hide/Show roster" "Сховати/показати роÑтер" ::msgcat::mcset uk "Highlight current nickname in messages." "ПідÑвічувати\ поточний пÑевдонім в повідомленнÑÑ…." ::msgcat::mcset uk "Highlight only whole words in messages." "ПідÑвічувати\ тільки цілі Ñлова в повідомленнÑÑ…." ::msgcat::mcset uk "History for %s" "ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ð´Ð»Ñ %s" ::msgcat::mcset uk "Home:" "Домашній:" ::msgcat::mcset uk "Host:" "ХоÑÑ‚:" ::msgcat::mcset uk "HTTP options." "Параметри HTTP." ::msgcat::mcset uk "HTTP Poll" "HTTP-опитуваннÑ" ::msgcat::mcset uk "Iconize" "Іконізувати" ::msgcat::mcset uk "Idle for %s" "Ð§Ð°Ñ Ð±ÐµÐ·Ð´Ñ–ÑльноÑті %s" ::msgcat::mcset uk "Idle threshold in minutes after that Tkabber marks you as\ away." "Період бездіÑльноÑті в хвилинах, піÑÐ»Ñ Ñкого Tkabber\ вÑтановить Ñтан \"Відійшов\"." ::msgcat::mcset uk "Idle threshold in minutes after that Tkabber marks you as\ extended away." "Період бездіÑльноÑті в хвилинах, піÑÐ»Ñ Ñкого Tkabber\ вÑтановить Ñтан \"Давно відійшов\"." ::msgcat::mcset uk "Ignore list" "СпиÑок ігнорованих" ::msgcat::mcset uk "Image" "ЗображеннÑ" ::msgcat::mcset uk "Incorrect encoding" "Ðевірне кодуваннÑ" ::msgcat::mcset uk "Indentation for pretty-printed XML subtags." "ВідÑтупи\ Ð´Ð»Ñ Ð½Ð°Ð¾Ñ‡Ð½Ð¾Ð³Ð¾ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ XML підтегів." ::msgcat::mcset uk "Info/Query options." "Параметри інформації/запитів." ::msgcat::mcset uk "Info:" "ІнформаціÑ:" ::msgcat::mcset uk "Information" "ІнформаціÑ" ::msgcat::mcset uk "Interval (in minutes) after error reply on request of\ participants list." "Інтервал (в хвилинах) піÑÐ»Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸ у відповідь\ на запит ÑпиÑку учаÑників." ::msgcat::mcset uk "Interval (in minutes) between requests of participants\ list." "Інтервал (в хвилинах) між запитами ÑпиÑку учаÑників." ::msgcat::mcset uk "Interval:" "Інтервал:" ::msgcat::mcset uk "Invalid authzid" "ÐеприпуÑтимий authzid" ::msgcat::mcset uk "Invalid ID" "ÐеприпуÑтимий ID" ::msgcat::mcset uk "Invalid mechanism" "ÐеприпуÑтимий механізм" ::msgcat::mcset uk "Invalid signature" "ÐеприпуÑтимий підпиÑ" ::msgcat::mcset uk "Invalid XML" "ÐеприпуÑтимий XML" ::msgcat::mcset uk "Invisible" "Ðевидимий" ::msgcat::mcset uk "Invisible list" "СпиÑок невидимоÑті" ::msgcat::mcset uk "Invite" "ЗапроÑити" ::msgcat::mcset uk "Invite %s to conferences" "Ð—Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ %s в конференцію" ::msgcat::mcset uk "Invite to conference..." "ЗапроÑити в конференцію..." ::msgcat::mcset uk "Invite users to %s" "ЗапроÑити Ñпіврозмовників до %s" ::msgcat::mcset uk "Invite users..." "ЗапроÑити Ñпіврозмовників..." ::msgcat::mcset uk "Invited to:" "Запрошений до:" ::msgcat::mcset uk "IP address:" "IP адреÑа:" ::msgcat::mcset uk "Ispell dictionary encoding. If it is empty, system\ encoding is used." "ÐšÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ñловника перевірки правопиÑу. Якщо\ порожнє, то викориÑтовуєтьÑÑ ÑиÑтемне кодуваннÑ." ::msgcat::mcset uk "Issuer" "Видавник" ::msgcat::mcset uk "JID regexp:" "РегулÑрний вираз Ð´Ð»Ñ JID:" ::msgcat::mcset uk "Join" "ПриєднатиÑÑŒ" ::msgcat::mcset uk "Join conference" "ПриєднатиÑÑŒ до конференції" ::msgcat::mcset uk "Join group" "ПриєднатиÑÑŒ до конференції" ::msgcat::mcset uk "Join group dialog data (groups)." "Дані Ð´Ð»Ñ Ð´Ñ–Ð°Ð»Ð¾Ð³Ñƒ\ Ð¿Ñ€Ð¸Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð¾ групи (групи)" ::msgcat::mcset uk "Join group dialog data (nicks)." "Дані Ð´Ð»Ñ Ð´Ñ–Ð°Ð»Ð¾Ð³Ñƒ\ Ð¿Ñ€Ð¸Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð¾ групи (пÑевдоніми)" ::msgcat::mcset uk "Join group dialog data (servers)." "Дані Ð´Ð»Ñ Ð´Ñ–Ð°Ð»Ð¾Ð³Ñƒ\ Ð¿Ñ€Ð¸Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð¾ групи (Ñервери)" ::msgcat::mcset uk "Join group..." "ПриєднатиÑÑŒ до конференції..." ::msgcat::mcset uk "Join groupchat" "ПриєднатиÑÑŒ до конференції" ::msgcat::mcset uk "Join..." "ПриєднатиÑÑŒ..." ::msgcat::mcset uk "JPEG images" "Ð—Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ JPEG" ::msgcat::mcset uk "Keep trying" "Продовжувати Ñпроби" ::msgcat::mcset uk "Key ID" "ID ключа" ::msgcat::mcset uk "Kick" "Вигнати" ::msgcat::mcset uk "last %s%s:" "триваліÑть бездіÑльноÑті/роботи %s%s:" ::msgcat::mcset uk "last %s%s: %s" "триваліÑть бездіÑльноÑті/роботи %s%s: %s" ::msgcat::mcset uk "Last activity" "ТриваліÑть бездіÑльноÑті" ::msgcat::mcset uk "Latitude" "Широта" ::msgcat::mcset uk "Latitude:" "Широта:" ::msgcat::mcset uk "List name" "Ðазва ÑпиÑку" ::msgcat::mcset uk "List of discovered JID nodes." "СпиÑок переглÑнутих\ вузлів JID." ::msgcat::mcset uk "List of discovered JIDs." "СпиÑок переглÑнутих JID." ::msgcat::mcset uk "List of JIDs to whom headlines have been sent." "СпиÑок\ JID, Ñким були надіÑлані новини." ::msgcat::mcset uk "List of logout reasons." "СпиÑок причин відключеннÑ." ::msgcat::mcset uk "List of message destination JIDs." "СпиÑок JID адреÑатів\ повідомленнÑ." ::msgcat::mcset uk "List of users for chat." "СпиÑок Ñпіврозмовників длÑ\ чату." ::msgcat::mcset uk "List of users for userinfo." "СпиÑок Ñпіврозмовників длÑ\ викориÑÑ‚Ð°Ð½Ð½Ñ ÑервіÑу userinfo" ::msgcat::mcset uk "Loading photo failed: %s." "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸\ Ñтільницю: %s." ::msgcat::mcset uk "Location" "ÐдреÑа" ::msgcat::mcset uk "Log in" "ПідключитиÑÑŒ" ::msgcat::mcset uk "Log in..." "ПідключитиÑÑŒ..." ::msgcat::mcset uk "Log out" "ВідключитиÑÑŒ" ::msgcat::mcset uk "Log out with reason..." "ВідключитиÑÑŒ з вказаною\ причиною..." ::msgcat::mcset uk "Logging options." "Параметри протоколюваннÑ." ::msgcat::mcset uk "Login" "ПідключеннÑ" ::msgcat::mcset uk "Login options." "Параметри підключеннÑ." ::msgcat::mcset uk "Logout" "ВідключеннÑ" ::msgcat::mcset uk "Logout with reason" "Ð’Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð· вказаною причиною" ::msgcat::mcset uk "Longitude" "Довгота" ::msgcat::mcset uk "Longitude:" "Довгота:" ::msgcat::mcset uk "Main window:" "Головне вікно:" ::msgcat::mcset uk "Malformed signature block" "Ðевірно Ñформований підпиÑ" ::msgcat::mcset uk "Manually edit rules" "Вручну редагувати правила" ::msgcat::mcset uk "Mark all seen" "Відмітити вÑÑ– Ñк переглÑнуті" ::msgcat::mcset uk "Mark all unseen" "Відмітити вÑÑ– Ñк не переглÑнуті" ::msgcat::mcset uk "Marshall T. Rose" "Маршал Т. Роуз" ::msgcat::mcset uk "Match case while searching in chat, log or disco\ windows." "РозрізнÑти регіÑтр Ñимволів при пошуку у вікнах чату,\ протоколу чи оглÑду Ñлужб" ::msgcat::mcset uk "Maximum number of characters in the history in MUC\ compatible conference rooms." "МакÑимальна кількіÑть Ñимволів в\ Ñ–Ñторії ÑуміÑних з MUC кімнат конференцій." ::msgcat::mcset uk "Maximum number of stanzas in the history in MUC\ compatible conference rooms." "МакÑимальна кількіÑть повідомлень в\ Ñ–Ñторії ÑуміÑних з MUC кімнат конференцій." ::msgcat::mcset uk "Maximum poll interval." "МакÑимальний інтервал\ HTTP-опитуваннÑ." ::msgcat::mcset ru "Maximum time interval between unsuccessful connection\ retries to the server (in minutes)." "МакÑимальний інтервал чаÑу\ між поÑлідовними невдалими Ñпробами переприєднатиÑÑ Ð´Ð¾\ Ñервера (в хвилинах)." ::msgcat::mcset uk "Mechanism too weak" "Занадто Ñлабкий механізм" ::msgcat::mcset uk "Message" "ПовідомленнÑ" ::msgcat::mcset uk "Message and Headline options." "Параметри повідомлень Ñ–\ новин." ::msgcat::mcset uk "Message archive" "Ðрхів повідомлень" ::msgcat::mcset uk "Message body" "Тіло повідомленнÑ" ::msgcat::mcset uk "Message delivered" "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð´Ð¾Ñтавлене" ::msgcat::mcset uk "Message delivered to %s" "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð´Ð¾Ñтавлене %s" ::msgcat::mcset uk "Message displayed" "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ðµ" ::msgcat::mcset uk "Message displayed to %s" "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ðµ %s" ::msgcat::mcset uk "Message from %s" "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ %s" ::msgcat::mcset uk "Message from:" "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´:" ::msgcat::mcset uk "Message stored on %s's server" "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ðµ на\ Ñервері %s" ::msgcat::mcset uk "Message stored on the server" "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ðµ на\ Ñервері" ::msgcat::mcset uk "Messages" "ПовідомленнÑ" ::msgcat::mcset uk "Michail Litvak" "Михайло Литвак" ::msgcat::mcset uk "Minimize" "Мінімізувати" ::msgcat::mcset uk "Minimize to systray (if systray icon is enabled,\ otherwise do nothing)" "Мінімізувати до ÑиÑтемного трею (Ñкщо іконка\ в треї увімкнена, в іншому разі нічого не робити)" ::msgcat::mcset uk "Minimum poll interval." "Мінімальний інтервал\ HTTP-опитуваннÑ." ::msgcat::mcset uk "Modem:" "Модем:" ::msgcat::mcset uk "Moderators" "Модератори" ::msgcat::mcset uk "Modified: %s" "Змінені: %s" ::msgcat::mcset uk "Month:" "МіÑÑць:" ::msgcat::mcset uk "Move down" "ПереміÑтити донизу" ::msgcat::mcset uk "Move tab left/right" "ПереміÑтити вкладку вліво/вправо" ::msgcat::mcset uk "Move up" "ПереміÑтити догори" ::msgcat::mcset uk "Moving to extended away" "Ð’ÑтановлюєтьÑÑ Ñтан \"Давно\ відійшов\" (по бездіÑльноÑті)" ::msgcat::mcset uk "MUC" "MUC" ::msgcat::mcset uk "Multiple signatures having different authenticity" "Різні\ підпиÑи мають різну доÑтовірніÑть" ::msgcat::mcset uk "Mute sound" "Вимкнути звук" ::msgcat::mcset uk "Mute sound if Tkabber window is focused." "Вимкнути звук,\ Ñкщо Ñ„Ð¾ÐºÑƒÑ Ð½Ð°Ð»ÐµÐ¶Ð¸Ñ‚ÑŒ вікну Tkabber'а." ::msgcat::mcset uk "Mute sound notification." "Вимкнути звукові ÑповіщеннÑ." ::msgcat::mcset uk "Mute sound when displaying delayed groupchat messages."\ "Вимкнути звук при показі відкладених повідомлень конференції." ::msgcat::mcset uk "Mute sound when displaying delayed personal chat\ messages." "Вимкнути звук при показі відкладених перÑональних\ повідомлень чату." ::msgcat::mcset uk "Name" "Ім’Ñ" ::msgcat::mcset uk "Name:" "Ім’Ñ:" ::msgcat::mcset uk "\n\tAffiliation: %s" "\n\tРанг: %s" ::msgcat::mcset uk "\n\tCan't browse: %s" "\n\tÐеможливо переглÑнути: %s" ::msgcat::mcset uk "\n\tClient: %s" "\n\tКлієнт: %s" ::msgcat::mcset uk "\n\tJID: %s" "\n\tJID: %s" ::msgcat::mcset uk "\n\tName: %s" "\n\tІм’Ñ: %s" ::msgcat::mcset uk "\n\tOS: %s" "\n\tОС: %s" ::msgcat::mcset uk "\n\tPresence is signed:" "\n\tПриÑутніÑть підпиÑана:" ::msgcat::mcset uk "\nAlternative venue: %s" "\nÐльтернативне міÑце збору:\ %s" ::msgcat::mcset uk "\nReason is: %s" "\nПричина: %s" ::msgcat::mcset uk "\nReason: %s" "\nПричина: %s" ::msgcat::mcset uk "\nRoom is empty at %s" "\nКімната Ð¿Ð¾Ñ€Ð¾Ð¶Ð½Ñ Ð½Ð° %s" ::msgcat::mcset uk "\nRoom participants at %s:" "\nУчаÑники конференції на\ %s:" ::msgcat::mcset uk "- nothing -" "- нічого -" # Space at the end of the next word is to distinguish it from another "Name:" ::msgcat::mcset uk "Name " "Ðазва " ::msgcat::mcset uk "Name: " "Ðазва: " ::msgcat::mcset uk "New group name:" "Ðова назва групи:" ::msgcat::mcset uk "New password:" "Ðовий пароль:" ::msgcat::mcset uk "Next" "Далі" ::msgcat::mcset uk "Next bookmark" "ÐаÑтупна закладка" ::msgcat::mcset uk "Next highlighted" "ÐаÑтупне підÑвічене повідомленнÑ" ::msgcat::mcset uk "Nick" "ПÑевдонім" ::msgcat::mcset uk "Nick:" "ПÑевдонім:" ::msgcat::mcset uk "Nickname" "ПÑевдонім" ::msgcat::mcset uk "Nickname:" "ПÑевдонім:" ::msgcat::mcset uk "No active list" "Ðемає активного ÑпиÑку" ::msgcat::mcset uk "No avatar to store" "Ðемає аватари Ð´Ð»Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ" ::msgcat::mcset uk "No conferences for %s in progress..." "ВідÑутні активні\ конференції Ð´Ð»Ñ %s..." ::msgcat::mcset uk "No default list" "ВідÑутній ÑпиÑок за умовчаннÑм" ::msgcat::mcset uk "No information available" "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð²Ñ–Ð´ÑутнÑ" ::msgcat::mcset uk "No users in %s roster..." "Ðемає Ñпіврозмовників у\ роÑтері %s..." ::msgcat::mcset uk "No users in roster..." "Ðемає Ñпіврозмовників у\ роÑтері..." ::msgcat::mcset uk "Node" "Вузол" ::msgcat::mcset uk "Node:" "Вузол:" ::msgcat::mcset uk "None" "Ðемає" ::msgcat::mcset uk "Normal message" "Звичайне повідомленнÑ" ::msgcat::mcset uk "Not Found" "Ðе знайдено" ::msgcat::mcset uk "Not Implemented" "Ðе реалізовано" ::msgcat::mcset uk "Not logged in" "Від'єднаний" ::msgcat::mcset uk "Notes" "Примітки" ::msgcat::mcset uk "Notify only when available" "Сповіщати тільки коли\ доÑтупний" ::msgcat::mcset uk "Number of groupchat messages to expire nick completion\ according to the last personally addressed message." "КількіÑть\ повідомлень, необхідна Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, щоб відключити автодоповненнÑ\ пÑевдоніма автора оÑтаннього повідомленнÑ, адреÑованого перÑонально." ::msgcat::mcset uk "Number of HTTP poll client security keys to send before\ creating new key sequence." "КількіÑть клієнтÑьких ключів безпеки\ HTTP Ð¾Ð¿Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ñ– перед генерацією нової поÑлідовноÑті\ ключів." ::msgcat::mcset uk "Offline Messages" "Офлайнові повідомленнÑ" ::msgcat::mcset uk "OK" "Добре" ::msgcat::mcset uk "Old password:" "Старий пароль:" ::msgcat::mcset uk "One window per bare JID" "Одне вікно Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾\ Ñкороченого JID (без реÑурÑа)" ::msgcat::mcset uk "One window per full JID" "Одне вікно Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ повного\ JID" ::msgcat::mcset uk "Open" "Відкрити" ::msgcat::mcset uk "Open chat" "Відкрити вікно розмови" ::msgcat::mcset uk "Open chat..." "Відкрити вікно розмови..." ::msgcat::mcset uk "Open raw XML window" "Відкрити вікно â€Ñирого†XML" ::msgcat::mcset uk "Open statistics monitor" "Відкрити монітор ÑтатиÑтики" ::msgcat::mcset uk "Opening IBB connection" "Ð’Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ IBB з’єднаннÑ" ::msgcat::mcset uk "Opening SI connection" "Ð’Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ SI з’єднаннÑ" ::msgcat::mcset uk "Opening SOCKS5 listening socket" "Ð’Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ SOCKS5 Ñокета\ Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð¹Ð¾Ð¼Ñƒ" ::msgcat::mcset uk "Options for Conference Info module, that allows you to\ see list of participants in roster popup, regardless of whether you\ are currently joined with the conference." "Параметри модулÑ\ інформації про конференції, що дозволÑÑ” бачити ÑпиÑок учаÑників\ конференції у Ñпливаючому вікні незалежно від того, підключені Ви до\ конференції чи ні." ::msgcat::mcset uk "Options for external play program" "Параметри длÑ\ зовнішньої програми програваннÑ." ::msgcat::mcset uk "Options for main interface." "Параметри оÑновного\ інтерфейÑу." ::msgcat::mcset uk "Options for module that automatically marks you as away\ after idle threshold." "Параметри модулÑ, що автоматично вÑтановлює\ Ñтан \"Відійшов\" піÑÐ»Ñ Ð²Ñтановленого періоду бездіÑльноÑті." ::msgcat::mcset uk "Options for Raw XML Input module, which allows you to\ monitor incoming/outgoing traffic from connection to server and send\ custom XML stanzas." "Параметри Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð²Ð²Ð¾Ð´Ñƒ â€Ñирого†XML, що\ дозволÑÑ” переглÑдати вхідний/вихідний XML потік Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· Ñервером\ Ñ– відправлÑти влаÑноруч Ñтворений XML." ::msgcat::mcset uk "Organization" "ОрганізаціÑ" ::msgcat::mcset uk "OS:" "ОС:" ::msgcat::mcset uk "Pager:" "Пейджер:" ::msgcat::mcset uk "Parent group" "Група рівнем вище" ::msgcat::mcset uk "Parent groups" "Групи рівнем вище" ::msgcat::mcset uk "Participants" "УчаÑники" ::msgcat::mcset uk "Passphrase:" "Парольна фраза:" ::msgcat::mcset uk "Password." "Пароль." ::msgcat::mcset uk "Password:" "Пароль:" ::msgcat::mcset uk "Path to the ispell executable." "ШлÑÑ… до виконуваного\ файлу ispell." ::msgcat::mcset uk "Paused a reply" "ЗупинивÑÑ Ð¿Ñ€Ð¸ друці відповіді" ::msgcat::mcset uk "Periodically browse roster conferences" "Періодичний\ переглÑд конференцій з роÑтера" ::msgcat::mcset uk "Personal" "ОÑобиÑта інформаціÑ" ::msgcat::mcset uk "Automatically away due to idle" ::msgcat::mcset uk "BBS:" ::msgcat::mcset uk "bwidget workarounds" ::msgcat::mcset uk "E-mail" ::msgcat::mcset uk "E-mail:" ::msgcat::mcset uk "IQ" ::msgcat::mcset uk "ISDN:" ::msgcat::mcset uk "JID" ::msgcat::mcset uk "JID:" ::msgcat::mcset uk "kde" ::msgcat::mcset uk "%s has activated chat window" "%s відкрив вікно розмови" ::msgcat::mcset uk "%s has been banned" "%s заборонено входити до кімнати" ::msgcat::mcset uk "%s has been kicked" "%s вигнали з кімнати" ::msgcat::mcset uk "%s has been kicked because of membership loss" "%s\ вигнали геть з кімнати Ñк результат втрати членÑтва" ::msgcat::mcset uk "%s has been kicked because room became members-only" "%s\ вигнали геть з кімнати, тому, що кімната Ñтала тільки Ð´Ð»Ñ Ñ‡Ð»ÐµÐ½Ñ–Ð²" ::msgcat::mcset uk "%s has changed nick to %s." "%s змінив пÑевдонім на %s." ::msgcat::mcset uk "%s has entered" "%s увійшов" ::msgcat::mcset uk "%s has gone chat window" "%s закрив вікно розмови" ::msgcat::mcset uk "%s has inactivated chat window" "%s лишив вікно розмови" ::msgcat::mcset uk "%s has left" "%s вийшов(ла) з кімнати" ::msgcat::mcset uk "%s Headlines" "%s заголовки новин" ::msgcat::mcset uk "%s info" "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ %s" ::msgcat::mcset uk "%s invites you to conference room %s" "%s запрошує Ð’Ð°Ñ Ð´Ð¾\ конференції %s" ::msgcat::mcset uk "%s is %s" "%s тепер %s" ::msgcat::mcset uk "%s is composing a reply" "%s пише відповідь" ::msgcat::mcset uk "%s is now known as %s" "%s тепер відомий(а) Ñк %s" ::msgcat::mcset uk "%s is paused a reply" "%s зупинив друк відповіді" ::msgcat::mcset uk "%s msgs" "%s пов." ::msgcat::mcset uk "%s plugin" "%s плагін" ::msgcat::mcset uk "%s request from %s" "Запит %s від %s" ::msgcat::mcset uk "%s SSL Certificate Info" "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ SSL Ñертифіката %s" ::msgcat::mcset uk "&Services" "&Служби" ::msgcat::mcset uk ". Proceed?\n\n" ". Продовжити?\n\n" ::msgcat::mcset uk "<- Remove" "<- Видалити" ::msgcat::mcset uk "" "немає" ::msgcat::mcset uk ">>> Unable to decipher data: %s <<<" ">>> Ðеможливо\ розшифрувати дані: %s <<<" ::msgcat::mcset uk "Abbreviations:" "СкороченнÑ:" ::msgcat::mcset uk "Accept messages from roster users only" "Приймати\ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ від Ñпіврозмовників з роÑтера" ::msgcat::mcset uk "Activate search panel" "Відкрити панель пошуку" ::msgcat::mcset uk "Activate visible/invisible/ignore/conference lists before\ sending initial presence." "Ðктивувати видимий/невидимий/ігнорований\ ÑпиÑки, а також ÑпиÑок конференцій перед оголошеннÑм Ñвоєї\ приÑутноÑті." ::msgcat::mcset uk "Add Conference to Roster" "Додати конференцію в роÑтер" ::msgcat::mcset uk "Added abbreviation:\n%s: %s" "Додано ÑкороченнÑ:\n%s: %s" ::msgcat::mcset uk "All unread messages were forwarded to %s." "Ð’ÑÑ–\ непрочитані Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð±ÑƒÐ»Ð¸ переÑлані %s" ::msgcat::mcset uk "and" "Ñ–" ::msgcat::mcset uk "Approve subscription" "Підтвердити підпиÑку" ::msgcat::mcset uk "April" "Квітень" ::msgcat::mcset uk "Ask:" "Запит:" ::msgcat::mcset uk "Attached URL:" "Прикріплене поÑиланнÑ:" ::msgcat::mcset uk "Attention" "Увага" ::msgcat::mcset uk "August" "Серпень" ::msgcat::mcset uk "Blind carbon copy" "Ðевидима копіÑ" ::msgcat::mcset uk "Cached service categories and types (from disco#info)."\ "Кешовані Ñлужбові категорії Ñ– типи (з disco#info)." ::msgcat::mcset uk "Can't open file \"%s\": %s" "Ðеможливо відкрити файл\ \"%s\": %s" ::msgcat::mcset uk "Cannot connect to proxy" "Ðе вдалоÑÑ Ð·'єднатиÑÑ Ð· прокÑÑ–" ::msgcat::mcset uk "Cannot negotiate proxy connection" "Ðе вдалоÑÑ ÑƒÐ·Ð³Ð¾Ð´Ð¸Ñ‚Ð¸\ з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· прокÑÑ–" ::msgcat::mcset uk "Carbon copy" "КопіÑ" ::msgcat::mcset uk "Changing accept messages from roster only: %s" "Заміна на\ прийом повідомлень тільки від кориÑтувачів з роÑтера: %s" ::msgcat::mcset uk "Chats History" "ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ð Ð¾Ð·Ð¼Ð¾Ð²" ::msgcat::mcset uk "Chats history" "ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ñ€Ð¾Ð·Ð¼Ð¾Ð²" ::msgcat::mcset uk "Chats history is converted.\nBackup of the old history is\ stored in %s" "ІÑторію чатів зконвертовано.\nРезервна ÐºÐ¾Ð¿Ñ–Ñ Ñтарої\ Ñ–Ñторії збережена в %s" ::msgcat::mcset uk "Clear window" "ОчиÑтити вікно" ::msgcat::mcset uk "Client message" "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ клієнта" ::msgcat::mcset uk "Commands" "Команди" ::msgcat::mcset uk "Common:" "Загальний:" ::msgcat::mcset uk "Complete nickname or command" "Доповнювати до кінцÑ\ пÑевдонім чи команду" ::msgcat::mcset uk "Conference:" "КонференціÑ:" ::msgcat::mcset uk "Conferences" "Конференції" ::msgcat::mcset uk "Conversion is finished" "ÐšÐ¾Ð½Ð²ÐµÑ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¾" ::msgcat::mcset uk "Converting Log Files" "ÐšÐ¾Ð½Ð²ÐµÑ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² Ñ–Ñторії" ::msgcat::mcset uk "Copy JID to clipboard" "Копіювати JID" ::msgcat::mcset uk "Could not start ispell server. Check your ispell path and\ dictionary name. Ispell is disabled now" "Ðевдалий запуÑк ispell\ Ñервера. Перевірте шлÑÑ… до ispell Ñ– назву Ñловника. Ispell вимкнено" ::msgcat::mcset uk "customization" "приÑтоÑуваннÑ" ::msgcat::mcset uk "day" "день" ::msgcat::mcset uk "days" "днів" ::msgcat::mcset uk "December" "Грудень" ::msgcat::mcset uk "Decline subscription" "ВідмовитиÑÑ Ð²Ñ–Ð´ підпиÑки" ::msgcat::mcset uk "Default protocol for sending files." "Стандартний\ протокол Ð´Ð»Ñ Ð²Ñ–Ð´ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð²." ::msgcat::mcset uk "Delete current node and subnodes" "Видалити поточний\ вузол Ñ– підвузли" ::msgcat::mcset uk "Delete subnodes" "Видалити підвузли" ::msgcat::mcset uk "Deleted abbreviation: %s" "Видалено cкороченнÑ: %s" ::msgcat::mcset uk "Display warning dialogs when signature verification\ fails." "Відображати помилки при невдалій перевірці підпиÑу." ::msgcat::mcset uk "doesn't want to be disturbed" "не хоче, щоб його\ турбували" ::msgcat::mcset uk "Edit conference list" "Редагувати ÑпиÑок конференцій" ::msgcat::mcset uk "Edit conference list " "Редагувати ÑпиÑок конференцій " ::msgcat::mcset uk "Edit MUC ignore rules" "Редагувати правила ігнору длÑ\ конференцій" ::msgcat::mcset uk "Emphasize stylecoded messages using different fonts."\ "Відображати Ñтильові Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтовуючи різні шрифти." ::msgcat::mcset uk "Enable freedesktop system tray icon." "Увімкнути\ freedesktop іконку в ÑиÑтемному треї" ::msgcat::mcset uk "Enable spellchecker in text input windows." "Увімкнути\ перевірку правопиÑу в полÑÑ… вводу текÑта." ::msgcat::mcset uk "Encryption" "ШифруваннÑ" ::msgcat::mcset uk "Error loading MUC ignore rules, purged." "Помилка\ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð» ігнору Ð´Ð»Ñ ÐºÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ñ–Ð¹, очищено." ::msgcat::mcset uk "Extended addressing fields:" "ÐŸÐ¾Ð»Ñ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð¾Ñ— адреÑації" ::msgcat::mcset uk "February" "Лютий" ::msgcat::mcset uk "Fetch nickname" "Отримати пÑевдонім" ::msgcat::mcset uk "Fetch user nicknames" "Отримати пÑевдоніми\ Ñпіврозмовників" ::msgcat::mcset uk "File %s cannot be opened: %s. History for %s (%s) is NOT\ converted\n" "Файл %s неможливо відкрити: %s. ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ð´Ð»Ñ %s (%s) не\ була зконвертована\n" ::msgcat::mcset uk "File %s cannot be opened: %s. History for %s is NOT\ converted\n" "Файл %s неможливо відкрити: %s. ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ð´Ð»Ñ %s не була\ зконвертована\n" ::msgcat::mcset uk "File %s is corrupt. History for %s (%s) is NOT\ converted\n" "Файл %s пошкоджений. ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ð´Ð»Ñ %s (%s) не була\ зконвертована\n" ::msgcat::mcset uk "File %s is corrupt. History for %s is NOT converted\n"\ "Файл %s пошкоджений. ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ð´Ð»Ñ %s не була зконвертована\n" ::msgcat::mcset uk "File path:" "ШлÑÑ… до файлу:" ::msgcat::mcset uk "Force advertising this hostname (or IP address) for\ outgoing HTTP file transfers." "ПримуÑово виголошувати дане ім'Ñ\ хоÑту (чи IP адреÑ) Ð´Ð»Ñ Ð²Ð¸Ñ…Ñ–Ð´Ð½Ð¾Ñ— передачі файлів по протоколу ÐТТР" ::msgcat::mcset uk "Forwarded by:" "ПереÑлано:" ::msgcat::mcset uk "Full-text search" "ПовнотекÑтовий пошук" ::msgcat::mcset uk "general plugins" "ОÑновні плагіни" ::msgcat::mcset uk "Generate chat messages when chat peer changes his/her\ status and/or status message" "Генерувати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‡Ð°Ñ‚Ñƒ, Ñкщо\ його учаÑник змінює Ñвій ÑÑ‚Ð°Ñ‚ÑƒÑ Ñ‡Ð¸ ÑтатуÑне повідомленнÑ" ::msgcat::mcset uk "Generate enter/exit messages" "Генерувати повідомленнÑ\ типу 'увійшов/вийшов'" ::msgcat::mcset uk "Generate status messages when occupants enter/exit MUC\ compatible conference rooms." "Генерувати ÑтатуÑні повідомленнÑ, коли\ учаÑники заходÑть/залишають ÑуміÑні з MUC конференції." ::msgcat::mcset uk "Grant subscription" "Ðадати підпиÑку" ::msgcat::mcset uk "Group: " "Група: " ::msgcat::mcset uk "Handle ROTFL/LOL smileys -- those like :))) -- by\ \"consuming\" all that parens and rendering the whole word with\ appropriate icon." "ЗамінÑти ROTFL/LOL Ñмайли, Ñко :))) чи інші,\ одним Ñмайлом відкинувши зайві чаÑтини" ::msgcat::mcset uk "Handling of \"emoticons\". Emoticons (also known as\ \"smileys\") are small pictures resembling a human face used to\ represent user's emotion. They are typed in as special mnemonics like\ :) or can be inserted using menu." "ВикориÑÑ‚Ð°Ð½Ð½Ñ Ñмайлів. Смайлики\ (англійÑькою - emoticons чи smileys) - це маленькі малюнки Ñхожі на\ Ð¾Ð±Ð»Ð¸Ñ‡Ñ‡Ñ Ð»ÑŽÐ´Ð¸Ð½Ð¸, Ñк викориÑтовуютьÑÑ Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ ÐµÐ¼Ð¾Ñ†Ñ–Ð¹. Вони\ можуть бути надруковані Ñк :), або додані через меню." ::msgcat::mcset uk "Handling of \"stylecodes\". Stylecodes are (groups of)\ special formatting symbols used to emphasize parts of the text by\ setting them with boldface, italics or underlined styles, or as\ combinations of these." "ВикориÑÑ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ð´Ñ–Ð² Ñтилів(\"stylecodes\").\ Коди Ñтилів - це Ñпеціальні форматувальні Ñимволи, Ñкі\ викориÑтовуютьÑÑ Ð´Ð»Ñ Ð½Ð°Ð´Ð°Ð½Ð½Ñ Ñ‚ÐµÐºÑту різного виглÑду, а Ñаме: жирний,\ курÑивний чи підкреÑлений текÑÑ‚, або Ñ—Ñ… комбінації." ::msgcat::mcset uk "hour" "година" ::msgcat::mcset uk "hours" "годин" ::msgcat::mcset uk "I would like to add you to my roster." "(En) I would like\ to add you to my contacts.\n---\n(Ua) Ви не проти, Ñкщо Ñ Ð´Ð¾Ð´Ð°Ð¼ ваÑ\ до моїх контактів?\n---\n(Ru) Ð’Ñ‹ не против, еÑли Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑŽ Ð²Ð°Ñ Ð² мои\ контакты?" ::msgcat::mcset uk "Ignore" "ІгноруваннÑ" ::msgcat::mcset uk "Ignore chat messages" "Ігнорувати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð· чату" ::msgcat::mcset uk "Ignore groupchat messages" "Ігнорувати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð·\ конференції" ::msgcat::mcset uk "Ignoring groupchat and chat messages from selected\ occupants of multi-user conference rooms." "Ð†Ð³Ð½Ð¾Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ в\ конференції Ñ– звичайному чаті від обраних учаÑників конференції." ::msgcat::mcset uk "Illegal result" "Ðевірний результат" ::msgcat::mcset uk "is available" "доÑтупний" ::msgcat::mcset uk "is away" "відійшов" ::msgcat::mcset uk "is extended away" "відійшов давно" ::msgcat::mcset uk "is free to chat" "вільний Ð´Ð»Ñ Ñ‡Ð°Ñ‚Ñƒ" ::msgcat::mcset uk "is invisible" "невидимий" ::msgcat::mcset uk "is unavailable" "недоÑтупний" ::msgcat::mcset uk "Jabber ID" "Jabber ID" ::msgcat::mcset uk "January" "Січень" ::msgcat::mcset uk "JID list" "СпиÑок JID" ::msgcat::mcset uk "July" "Липень" ::msgcat::mcset uk "June" "Червень" ::msgcat::mcset uk "List of proxy servers for SOCKS5 bytestreams (all\ available servers will be tried for mediated connection)." "Перелік\ прокÑÑ– Ñерверів Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ñ– потоку SOCKS5 (Ñпроба викориÑтовувати Ñк\ поÑередника буде вжита Ð´Ð»Ñ Ð²ÑÑ–Ñ… доÑтупних Ñерверів" ::msgcat::mcset uk "Load state on start" "Завантажувати Ñтан під Ñ‡Ð°Ñ Ñтарту" ::msgcat::mcset uk "Load state on Tkabber start." "Завантажити Ñтан при\ Ñтарті Ткаббера." ::msgcat::mcset uk "Logs" "Журнал" ::msgcat::mcset uk "macintosh plugins" "плагіни Ð´Ð»Ñ macintosh" ::msgcat::mcset uk "March" "Березень" ::msgcat::mcset uk "Maximum interval length in hours for which log messages\ should be shown in newly opened chat window (if set to negative then\ the interval is unlimited)." "МакÑимальний вік повідомлень в годинах,\ що будуть показані у щойно відкритому вікні чату (Ñкщо від'ємне, то\ Ñ—Ñ… вік необмежений)." ::msgcat::mcset uk "Maximum number of log messages to show in newly opened\ chat window (if set to negative then the number is unlimited)."\ "МакÑимальне чиÑло повідомлень протоколу, що буде показане у щойно\ відкритому вікні чату (Ñкщо від'ємне, то Ñ—Ñ… кількіÑть необмежена)." ::msgcat::mcset uk "May" "Травень" ::msgcat::mcset uk "Middle mouse button" "Ð¡ÐµÑ€ÐµÐ´Ð½Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° мишки" ::msgcat::mcset uk "minute" "хвилина" ::msgcat::mcset uk "minutes" "хвилини" ::msgcat::mcset uk "MUC Ignore" "Ð†Ð³Ð½Ð¾Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð² конференціÑÑ…" ::msgcat::mcset uk "MUC Ignore Rules" "Правила Ñ–Ð³Ð½Ð¾Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð² конференціÑÑ…" ::msgcat::mcset uk "My Resources" "Мої РеÑурÑи" ::msgcat::mcset uk "No reply" "Ðе відповідати" ::msgcat::mcset uk "No such abbreviation: %s" "Ðемає такого cкороченнÑ: %s" ::msgcat::mcset uk "November" "ЛиÑтопад" ::msgcat::mcset uk "October" "Жовтень" ::msgcat::mcset uk "Open new conversation" "Відкрити нову розмову" ::msgcat::mcset uk "Opening IQ-IBB connection" "Ð’Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ IQ-IBB з'єднаннÑ" ::msgcat::mcset uk "Opens a new chat window for the new nick of the room\ occupant" "Відкриває нове вікно чату Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ пÑевдоніма учаÑника\ кімнати" ::msgcat::mcset uk "Original from" "Першопочатково від кого" ::msgcat::mcset uk "Original to" "Першопочатково кому" ::msgcat::mcset uk "Outcast" "Вигнанець" ::msgcat::mcset uk "Owner" "ВлаÑник" ::msgcat::mcset uk "Pending" "ОчікуєтьÑÑ" # Space at the end of the next word is to distinguish # it from another "Personal" ::msgcat::mcset uk "Personal " "ПоÑада " ::msgcat::mcset uk "Phone BBS" "Телефон BBS" ::msgcat::mcset uk "Phone ISDN" "Телефон ISDN" ::msgcat::mcset uk "Phone PCS" "Телефон PCS" ::msgcat::mcset uk "Phones" "Телефони" ::msgcat::mcset uk "Photo" "ФотографіÑ" ::msgcat::mcset uk "pixmaps management" "ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ–ÐºÑмапами" ::msgcat::mcset uk "Plaintext" "Відкритий текÑÑ‚" ::msgcat::mcset uk "Please define environment variable BROWSER" "Будь лаÑка\ вÑтановіть змінну Ð¾Ñ‚Ð¾Ñ‡ÐµÐ½Ð½Ñ BROWSER" ::msgcat::mcset uk "Please enter passphrase" "Будь лаÑка введіть парольну\ фразу" ::msgcat::mcset uk "Please join %s" "ПриєднайтеÑÑŒ будь лаÑка до %s" ::msgcat::mcset uk "Please try again" "Спробуйте ще раз" ::msgcat::mcset uk "Please, be patient while chats history is being converted\ to new format" "Будь-лаÑка, зачекайте поки Ñ–ÑÑ‚Ð¾Ñ€Ñ–Ñ Ð±ÑƒÐ´Ðµ зконвертована\ у новий формат" ::msgcat::mcset uk "Please, be patient while Tkabber configuration directory\ is being transferred to the new location" "Будь-лаÑка, зачекайте доки\ тека з налаштуваннÑми Ткаббера буде Ð¿ÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð½Ð° нове міÑце" ::msgcat::mcset uk "plugin management" "ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð¿Ð»Ð°Ð³Ñ–Ð½Ð°Ð¼Ð¸" ::msgcat::mcset uk "Plugins" "Плагіни" ::msgcat::mcset uk "Plugins options." "Параметри плагінів." ::msgcat::mcset uk "PNG images" "Ð—Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ PNG" ::msgcat::mcset uk "Port for outgoing HTTP file transfers (0 for assigned\ automatically). This is useful when sending files from behind a NAT\ with a forwarded port." "Порт Ð´Ð»Ñ Ð²Ð¸Ñ…Ñ–Ð´Ð½Ð¾Ñ— передачі файлів по\ протоколу ÐТТР (0 - вÑтановлюєтьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾). Буде кориÑним у\ випадку відÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² через NAT з портфорвардінгом" ::msgcat::mcset uk "Port:" "Порт:" ::msgcat::mcset uk "Preferred:" "ОÑновний:" ::msgcat::mcset uk "Prefix" "ПрефікÑ" ::msgcat::mcset uk "Prefix:" "ПрефікÑ:" ::msgcat::mcset uk "Presence" "ПриÑутніÑть" ::msgcat::mcset uk "presence" "приÑутніÑть" ::msgcat::mcset uk "Presence bar" "Панель приÑутноÑті/ÑтатуÑу" ::msgcat::mcset uk "Presence information" "приÑутніÑть" ::msgcat::mcset uk "Presence is signed" "ПриÑутніÑть підпиÑана" ::msgcat::mcset uk "Pretty print incoming and outgoing XML stanzas."\ "Форматувати XML перед виводом." ::msgcat::mcset uk "Pretty print XML" "Форматувати XML" ::msgcat::mcset uk "Prev" "Ðазад" ::msgcat::mcset uk "Prev bookmark" "ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Ð·Ð°ÐºÐ»Ð°Ð´ÐºÐ°" ::msgcat::mcset uk "Prev highlighted" "Попереднє підÑвічене повідомленнÑ" ::msgcat::mcset uk "Previous/Next history message" "Попереднє/наÑтупне\ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ–Ñторії" ::msgcat::mcset uk "Previous/Next tab" "ПопереднÑ/наÑтупна вкладка" ::msgcat::mcset uk "Priority." "Пріоритет." ::msgcat::mcset uk "Priority:" "Пріоритет:" ::msgcat::mcset uk "Privacy list is activated" "СпиÑок приватноÑті\ активований" ::msgcat::mcset uk "Privacy list is not activated" "СпиÑок приватноÑті не\ активований" ::msgcat::mcset uk "Privacy list is not created" "СпиÑок приватноÑті не\ Ñтворено" ::msgcat::mcset uk "Privacy lists" "СпиÑки приватноÑті" ::msgcat::mcset uk "Privacy lists are not implemented" "СпиÑки приватноÑті не\ реалізовані" ::msgcat::mcset uk "Privacy lists are unavailable" "СпиÑки приватноÑті\ недоÑтупні" ::msgcat::mcset uk "Privacy lists error" "Помилка ÑпиÑків приватноÑті" ::msgcat::mcset uk "Privacy rules" "Правила приватноÑті" ::msgcat::mcset uk "privacy rules" "правила приватноÑті" ::msgcat::mcset uk "Profile" "Профіль" ::msgcat::mcset uk "Profiles" "Профілі" ::msgcat::mcset uk "Propose to configure newly created MUC room. If set to\ false then the default room configuration is automatically accepted."\ "Пропонувати налаштувати наново Ñтворену конференцію. Якщо вÑтановити\ у false, то автоматично приймаютьÑÑ Ñтандартні налаштуваннÑ." ::msgcat::mcset uk "Protocol:" "Протокол:" ::msgcat::mcset uk "Pub/sub" "Pub/sub" ::msgcat::mcset uk "Publish node" "Опублікувати вузол" ::msgcat::mcset uk "Publisher" "Видавець" ::msgcat::mcset uk "Purge all messages" "Видалити вÑÑ– повідомленнÑ" ::msgcat::mcset uk "Purge message" "Видалити повідомленнÑ" ::msgcat::mcset uk "Purge seen messages" "Видалити прочитані повідомленнÑ" ::msgcat::mcset uk "Purged all abbreviations" "Знищено вÑÑ– cкороченнÑ" ::msgcat::mcset uk "Quick Help" "Коротка допомога" ::msgcat::mcset uk "Quick help" "Коротка допомога" ::msgcat::mcset uk "Quit" "Вийти" ::msgcat::mcset uk "Quote" "Цитувати" ::msgcat::mcset uk "Raise new tab." "Розміщувати нову вкладку над іншими." ::msgcat::mcset uk "Raw XML" "\"Ñирий\" XML" ::msgcat::mcset uk "Read on..." "Читати..." ::msgcat::mcset uk "Reason" "ПідÑтава" ::msgcat::mcset uk "Reason:" "ПідÑтава:" ::msgcat::mcset uk "Receive" "Отримати" ::msgcat::mcset uk "Receive error: Stream ID is in use" "Помилка отримуваннÑ:\ Stream ID вже викориÑтовуєтьÑÑ" ::msgcat::mcset uk "Receive file from %s" "ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ від %s" ::msgcat::mcset uk "Received by:" "ПрийнÑто:" ::msgcat::mcset uk "Received/Sent" "ПрийнÑто/Відправлено" ::msgcat::mcset uk "Recipient Error" "Помилка у одержувача" ::msgcat::mcset uk "Redirect" "ПеренаправленнÑ" ::msgcat::mcset uk "Redo" "Відмінити відміну" ::msgcat::mcset uk "Register" "РеєÑтраціÑ" ::msgcat::mcset uk "Register in %s" "РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ð² %s" ::msgcat::mcset uk "Registration is successful!" "РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ð²Ð´Ð°Ð»Ð°!" ::msgcat::mcset uk "Registration: %s" "РеєÑтраціÑ: %s" ::msgcat::mcset uk "Remote control options." "Параметри віддаленого\ керуваннÑ." ::msgcat::mcset uk "Remote Server Error" "Помилка віддаленого Ñервера" ::msgcat::mcset uk "Remove" "Видалити" ::msgcat::mcset uk "Remove all users in group..." "Видалити вÑÑ–Ñ…\ Ñпіврозмовників у групі..." ::msgcat::mcset uk "Remove from list" "Видалити зі ÑпиÑку" ::msgcat::mcset uk "Remove from roster..." "Видалити з роÑтера..." ::msgcat::mcset uk "Remove group..." "Видалити групу..." ::msgcat::mcset uk "Remove list" "Видалити ÑпиÑок" ::msgcat::mcset uk "Rename group..." "Перейменувати групу..." ::msgcat::mcset uk "Rename roster group" "ÐŸÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ Ð³Ñ€ÑƒÐ¿Ð¸" ::msgcat::mcset uk "Repeat new password:" "Повторіть новий пароль:" ::msgcat::mcset uk "Replace opened connections" "Замінити відкриті з’єднаннÑ" ::msgcat::mcset uk "Replace opened connections." "Закрити відкриті\ з’єднаннÑ." ::msgcat::mcset uk "Reply" "ВідповіÑти" ::msgcat::mcset uk "Reply subject:" "Тема відповіді:" ::msgcat::mcset uk "Reply to" "ВідповіÑти" ::msgcat::mcset uk "Reply to current time (jabber:iq:time) requests."\ "Відповідати на запити чаÑу (jabber:iq:time)." ::msgcat::mcset uk "Reply to idle time (jabber:iq:last) requests."\ "Відповідати на запити чаÑу бездіÑльноÑті (jabber:iq:last)." ::msgcat::mcset uk "Reply to room" "ВідповіÑти до кімнати" ::msgcat::mcset uk "Reply to version (jabber:iq:version) requests."\ "Відповідати на запити верÑÑ–Ñ— (jabber:iq:version)." ::msgcat::mcset uk "Report the list of current MUC rooms on disco#items\ query." "Відповідати на запит disco#items про MUC-конференції, в Ñких\ Ви приймаєте учаÑть." ::msgcat::mcset uk "Request" "ЗапроÑити" ::msgcat::mcset uk "Request failed: %s" "Запит не вдавÑÑ: %s" ::msgcat::mcset uk "Request only unseen (which aren't displayed in the chat\ window) messages in the history in MUC compatible conference rooms."\ "Запитувати тільки ті Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ–Ñторії, Ñкі не показані у вже\ відкритих вікнах (Ð´Ð»Ñ ÐºÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ñ–Ñ—, ÑуміÑної з MUC)." ::msgcat::mcset uk "Request subscription" "Запитати підпиÑку" ::msgcat::mcset uk "Request Timeout" "Запит перевищив допуÑтимий чаÑ" ::msgcat::mcset uk "Requesting conference list: %s" "ЗапитуєтьÑÑ ÑпиÑок\ конференцій: %s" ::msgcat::mcset uk "Requesting ignore list: %s" "Запит ÑпиÑку ігнорованих:\ %s" ::msgcat::mcset uk "Requesting invisible list: %s" "Запит ÑпиÑку невидимоÑті:\ %s" ::msgcat::mcset uk "Requesting privacy list: %s" "Запит ÑпиÑку приватноÑті:\ %s" ::msgcat::mcset uk "Requesting privacy rules: %s" "Запит правил приватноÑті:\ %s" ::msgcat::mcset uk "Requesting visible list: %s" "Запит видимого ÑпиÑку: %s" ::msgcat::mcset uk "Reset to current value" "Ð’Ñтановити в Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñк зараз" ::msgcat::mcset uk "Reset to default value" "Ð’Ñтановити Ñтандартне значеннÑ" ::msgcat::mcset uk "Reset to saved value" "Ð’Ñтановити в збережене значеннÑ" ::msgcat::mcset uk "Reset to value from config file" "ВзÑти Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð· файлу\ налаштувань" ::msgcat::mcset uk "Resource." "РеÑурÑ." ::msgcat::mcset uk "Resource:" "РеÑурÑ:" ::msgcat::mcset uk "Restricted XML" "Заборонений XML" ::msgcat::mcset uk "Resubscribe to all users in group..." "ПерепідпиÑатиÑÑŒ до\ вÑÑ–Ñ… Ñпіврозмовників у групі..." ::msgcat::mcset uk "Retract node" "ВідмовитиÑÑŒ від вузла" ::msgcat::mcset uk "Retrieve offline messages using POP3-like protocol."\ "Отримати офлайнові Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтовуючи протокол, Ñхожий на\ POP3." ::msgcat::mcset uk "Retry to connect forever." "ÐамагатиÑÑŒ підключатиÑÑŒ\ поÑтійно." ::msgcat::mcset uk "Returning from auto-away" "ÐŸÐ¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ð·Ñ– Ñтану\ бездіÑльноÑті" ::msgcat::mcset uk "Revoke Admin Privileges" "Забрати привілеї\ адмініÑтратора" ::msgcat::mcset uk "Revoke Membership" "Забрати членÑтво" ::msgcat::mcset uk "Revoke Moderator Privileges" "Забрати привілеї\ модератора" ::msgcat::mcset uk "Revoke Owner Privileges" "Забрати права влаÑника" ::msgcat::mcset uk "Revoke Voice" "Відізвати право говорити" ::msgcat::mcset uk "Right mouse button" "Права кнопка миші" ::msgcat::mcset uk "Role" "Роль" ::msgcat::mcset uk "Role:" "Роль:" ::msgcat::mcset uk "Room %s is successfully created" "Кімната %s Ñтворена\ уÑпішно" ::msgcat::mcset uk "Room is created" "Кімната Ñтворена" ::msgcat::mcset uk "Room is destroyed" "Кімната видалена" ::msgcat::mcset uk "Roster" "РоÑтер" ::msgcat::mcset uk "Roster group:" "Група роÑтера" ::msgcat::mcset uk "Roster item may be dropped not only over group name but\ also over any item in group." "При перетÑгуванні контакта з однієї\ групи роÑтера в іншу, його можна відпуÑтити не тільки над назвою\ групи але й над будь-Ñким контактом в цій групі." ::msgcat::mcset uk "Roster Notes" "Примітки у контактах" ::msgcat::mcset uk "Roster options." "Параметри роÑтера." ::msgcat::mcset uk "roster plugins" "Плагіни роÑтера" ::msgcat::mcset uk "Save as:" "Зберегти Ñк:" ::msgcat::mcset uk "Save state" "Зберегти Ñтан" ::msgcat::mcset uk "Save state on exit" "Зберігати Ñтан при виході" ::msgcat::mcset uk "Save state on Tkabber exit." "Зберегти Ñтан при\ завершенні Ткаббера." ::msgcat::mcset uk "Save To Log" "Зберегти до потоколу" ::msgcat::mcset uk "Screenname conversion" "ÐšÐ¾Ð½Ð²ÐµÑ€Ñ‚Ð°Ñ†Ñ–Ñ ÐµÐºÑ€Ð°Ð½Ð½Ð¾Ð³Ð¾ імені" ::msgcat::mcset uk "Screenname:" "Екранні ім’Ñ:" ::msgcat::mcset uk "Screenname: %s\n\nConverted JID: %s" "Екранне ім’Ñ:\ %s\n\nПеретворений JID: %s" ::msgcat::mcset uk "Scroll chat window up/down" "Прогорнути вікно розмови\ догори/донизу" ::msgcat::mcset uk "Search" "Пошук" ::msgcat::mcset uk "Search again" "Шукати знову" ::msgcat::mcset uk "Search down" "Шукати вниз" ::msgcat::mcset uk "Search in %s" "Пошук в %s" ::msgcat::mcset uk "Search in %s: No matching items found" "Пошук в %s: не\ знайдено об’єктів, що підходÑть" ::msgcat::mcset uk "Search in Tkabber windows options." "Параметри пошуку у\ вікнах Ткаббера." ::msgcat::mcset uk "search plugins" "Пошукові плагіни" ::msgcat::mcset uk "Search up" "Шукати вгору" ::msgcat::mcset uk "Search: %s" "Пошук: %s" ::msgcat::mcset uk "searching" "пошук" ::msgcat::mcset uk "second" "Ñекунда" ::msgcat::mcset uk "seconds" "Ñекунди" ::msgcat::mcset uk "Select" "Вибрати" ::msgcat::mcset uk "Select Key for Signing %s Traffic" "Вибір ключа длÑ\ підпиÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ñ€Ð°Ñ„Ñ–ÐºÑƒ %s" ::msgcat::mcset uk "Select month:" "Виберіть міÑÑць:" ::msgcat::mcset uk "Self signed certificate" "СамопіпиÑаний Ñертифікат" ::msgcat::mcset uk "Send" "Відправити" ::msgcat::mcset uk "Send broadcast message..." "Відправити широкомовне\ повідомленнÑ..." ::msgcat::mcset uk "Send contacts to %s" "Відправка контактів до %s" ::msgcat::mcset uk "Send custom presence" "Відправити приÑутніÑть" ::msgcat::mcset uk "Send file to %s" "Відправка файла до %s" ::msgcat::mcset uk "Send file..." "Відправити файл..." ::msgcat::mcset uk "Send message" "Відправка повідомленнÑ" ::msgcat::mcset uk "Send message of the day..." "Відправити повідомленнÑ\ днÑ..." ::msgcat::mcset uk "Send message to %s" "Відправка Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð´Ð¾ %s" ::msgcat::mcset uk "Send message to all users in group..." "Відправити\ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ñім Ñпіврозмовникам групи..." ::msgcat::mcset uk "Send message to group" "Відправка Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð³Ñ€ÑƒÐ¿Ñ–" ::msgcat::mcset uk "Send message to group %s" "Відправка Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð³Ñ€ÑƒÐ¿Ñ–\ %s" ::msgcat::mcset uk "Send message..." "Відправити повідомленнÑ..." ::msgcat::mcset uk "Send request to: " "ВідіÑлати запит до:" ::msgcat::mcset uk "Send subscription at %s" "Відправка запиту на підпиÑку до\ %s" ::msgcat::mcset uk "Send subscription request" "ВідіÑлати запит на підпиÑку" ::msgcat::mcset uk "Send subscription request to %s" "ВідіÑлати запит на\ підпиÑку до %s" ::msgcat::mcset uk "Send subscription to: " "Відправити запит на підпиÑку до:\ " ::msgcat::mcset uk "Send to server" "Відправити на Ñервер" ::msgcat::mcset uk "Send users..." "Відправити контакти..." ::msgcat::mcset uk "Sending %s %s list" "Ð’Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ %s %s ÑпиÑку" ::msgcat::mcset uk "Sending conference list: %s" "ВідÑилаєтьÑÑ ÑпиÑок\ конференцій: %s" ::msgcat::mcset uk "Sending configure form" "Ð’Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ñ„Ð¾Ñ€Ð¼Ð¸ з\ налаштуваннÑми" ::msgcat::mcset uk "Sending ignore list: %s" "Ð’Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ ÑпиÑку\ ігнорованих: %s" ::msgcat::mcset uk "Sending invisible list: %s" "Ð’Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ ÑпиÑку\ невидимоÑті: %s" ::msgcat::mcset uk "Sending visible list: %s" "ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð²Ð¸Ð´Ð¸Ð¼Ð¾Ð³Ð¾ ÑпиÑку: %s" ::msgcat::mcset uk "September" "ВереÑень" ::msgcat::mcset uk "Sergei Golovan" "Сергій Головань" ::msgcat::mcset uk "Serial number" "Серійний номер" ::msgcat::mcset uk "Server Error" "Помилка Ñервера" ::msgcat::mcset uk "Server message" "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ Ñервера" ::msgcat::mcset uk "Server name or IP-address." "Ðазва чи ip-адреÑа Ñервера." ::msgcat::mcset uk "Server name." "Ðазва Ñервера." ::msgcat::mcset uk "Server port." "Порт Ñервера." ::msgcat::mcset uk "Server:" "Сервер:" ::msgcat::mcset uk "Service Discovery" "ОглÑд Ñлужб" ::msgcat::mcset uk "service discovery" "оглÑд Ñлужб" ::msgcat::mcset uk "Service info" "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ Ñлужбу" ::msgcat::mcset uk "Service statistics" "СтатиÑтика Ñлужби" ::msgcat::mcset uk "Set" "Ð’Ñтановити" ::msgcat::mcset uk "Set bookmark" "Ð’Ñтановити закладку" ::msgcat::mcset uk "Set for current and future sessions" "Ð’Ñтановити Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ—\ та наÑтупних ÑеÑій" ::msgcat::mcset uk "Set for current session only" "Ð’Ñтановити тільки Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ—\ ÑеÑÑ–Ñ—" ::msgcat::mcset uk "Set priority to 0 when moving to extended away state."\ "Ð’Ñтановлювати нульовий пріоритет при переході в Ñтан \"Давно\ відійшов\"." ::msgcat::mcset uk "Settings of rich text facility which is used to render\ chat messages and logs." "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´ÑиÑтеми розширеного текÑту,\ Ñка викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ чату та Ñ–Ñторії." ::msgcat::mcset uk "Show" "Показати" ::msgcat::mcset uk "Show balloons with headline messages over tree nodes."\ "Показувати плаваюче віконце з новинами понад гілкою повідомлень." ::msgcat::mcset uk "Show console" "Показати конÑоль" ::msgcat::mcset uk "Show detailed info on conference room members in roster\ item tooltips." "Показувати детальну інформацію про учаÑників\ конференції у Ñпливаючому вікні елементів роÑтера." ::msgcat::mcset uk "Show emoticons" "Показувати Ñмайлики" ::msgcat::mcset uk "Show history" "Показати Ñ–Ñторію" ::msgcat::mcset uk "Show images for emoticons." "Показувати малюнки до\ Ñмайликів." ::msgcat::mcset uk "Show info" "Показати інформацію" ::msgcat::mcset uk "Show IQ requests in the status line." "Показувати\ IQ-запити в Ñ€Ñдку ÑтатуÑу." ::msgcat::mcset uk "Show menu tearoffs when possible." "Відкривати меню, що\ \"відриваютьÑÑ\", де це можливо." ::msgcat::mcset uk "Show my own resources in the roster." "Показувати мої\ оÑобиÑті реÑурÑи в роÑтері" ::msgcat::mcset uk "Show native icons for contacts, connected to\ transports/services in roster." "ВикориÑтовувати оригінальні іконки\ Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ñ–Ð², що підключені через транÑпорти/Ñлужби в роÑтері." ::msgcat::mcset uk "Show native icons for transports/services in roster."\ "ВикориÑтовувати оригінальні іконки Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ñпортів/Ñлужби в\ роÑтері." ::msgcat::mcset uk "Show number of unread messages in tab titles."\ "Показувати кількіÑть непрочитаних повідомлень в заголовках вкладок." ::msgcat::mcset uk "Show offline users" "Показувати Ñпіврозмовників, що не в\ мережі" ::msgcat::mcset uk "Show online users only" "Показувати тільки\ Ñпіврозмовників в мережі" ::msgcat::mcset uk "Show only online users in roster." "Показувати в роÑтері\ тільки тих Ñпіврозмовників, що Ñ” в мережі." ::msgcat::mcset uk "Show own resources" "Показувати оÑобиÑті реÑурÑи" ::msgcat::mcset uk "Show palette of emoticons" "Показувати палітру Ñмайликів" ::msgcat::mcset uk "Show presence bar." "Показувати панель\ приÑутноÑті/ÑтатуÑу." ::msgcat::mcset uk "Show status bar." "Показувати Ñ€Ñдок ÑтатуÑу." ::msgcat::mcset uk "Show subscription type in roster item tooltips."\ "Показувати тип підпиÑки на приÑутніÑть у Ñпливаючому вікні елементів\ роÑтера." ::msgcat::mcset uk "Show TkCon console" "Показати ТКконÑоль" ::msgcat::mcset uk "Show Toolbar." "Показувати панель інÑтрументів." ::msgcat::mcset uk "Show user or service info" "Показати інформацію про\ Ñпіврозмовника, або ÑервіÑ" ::msgcat::mcset uk "Show user or service info..." "Показати інформацію\ про..." ::msgcat::mcset uk "SI connection closed" "SI Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð·Ð°Ñ‡Ð¸Ð½ÐµÐ½Ð¾" ::msgcat::mcset uk "Signature not processed due to missing key" "ÐŸÑ–Ð´Ð¿Ð¸Ñ Ð½Ðµ\ перевірено через відÑутніÑть ключа" ::msgcat::mcset uk "Single window" "Одне вікно" ::msgcat::mcset uk "Size:" "Розмір:" ::msgcat::mcset uk "Smart autoscroll" "\"Розумне\" автоматичне прогортаннÑ" ::msgcat::mcset uk "Sort" "Сортувати" ::msgcat::mcset uk "Sort by date" "Сортувати за датою" ::msgcat::mcset uk "Sort by from" "Сортувати за адреÑою відправника" ::msgcat::mcset uk "Sort by node" "Сортувати за назвою вузла" ::msgcat::mcset uk "Sort by type" "Сортувати за типом" ::msgcat::mcset uk "Sort items by JID/node" "Сортувати елементи по JID/вузлу" ::msgcat::mcset uk "Sort items by name" "Сортувати елементи по імені" ::msgcat::mcset uk "Sound" "Звук" ::msgcat::mcset uk "sound" "звук" ::msgcat::mcset uk "Sound options." "Параметри звуку." ::msgcat::mcset uk "Sound to play when available presence is received."\ "Звук, Ñкий програєтьÑÑ Ð¿Ñ€Ð¸ отриманні приÑутноÑті типу\ \"доÑтупний\"." ::msgcat::mcset uk "Sound to play when connected to Jabber server." "Звук,\ Ñкий програєтьÑÑ Ð¿Ñ€Ð¸ підключенні до Jabber-Ñервера." ::msgcat::mcset uk "Sound to play when groupchat message from me is\ received." "Звук, Ñкий програєтьÑÑ Ð¿Ñ€Ð¸ отриманні оÑобиÑтого\ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð· конференції." ::msgcat::mcset uk "Sound to play when groupchat message is received." "Звук,\ Ñкий програєтьÑÑ Ð¿Ñ€Ð¸ отриманні звичайного Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð·\ конференції." ::msgcat::mcset uk "Sound to play when groupchat server message is received."\ "Звук, Ñкий програєтьÑÑ Ð¿Ñ€Ð¸ отриманні Ñлужбового Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð·\ конференції." ::msgcat::mcset uk "Sound to play when highlighted (usually addressed\ personally) groupchat message is received." "Звук, Ñкий програєтьÑÑ\ при отриманні виділеного (переважно перÑонально адреÑованого)\ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð· конференції." ::msgcat::mcset uk "Sound to play when personal chat message is received."\ "Звук, Ñкий програєтьÑÑ Ð¿Ñ€Ð¸ отриманні Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð· розмови." ::msgcat::mcset uk "Sound to play when sending personal chat message." "Звук,\ Ñкий програєтьÑÑ Ð¿Ñ€Ð¸ відправці Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð· розмови." ::msgcat::mcset uk "Sound to play when unavailable presence is received."\ "Звук, Ñкий програєтьÑÑ Ð¿Ñ€Ð¸ отриманні приÑутноÑті типу\ \"недоÑтупний\"." ::msgcat::mcset uk "Specifies search mode while searching in chat, log or\ disco windows. \"substring\" searches exact substring, \"glob\" uses\ glob style matching, \"regexp\" allows to match regular expression."\ "Вказує метод пошуку в вікнах чату, протоколу чи оглÑду Ñлужб.\ \"substring\" шукає підрÑдок, \"glob\" дозволÑÑ” викориÑтовувати\ підÑтановочні Ñимволи, \"regexp\" викориÑтовує регулÑрні вирази." ::msgcat::mcset uk "Spell check options." "Параметри перевірки правопиÑу." ::msgcat::mcset uk "SSL & Compression" "SSL & СтиÑненнÑ" ::msgcat::mcset uk "SSL client certificate file bundled with private key\ (optional)." "Файл клієнтÑького Ñертифікату SSL разом з Ñекретним\ ключем (необов’Ñзковий параметр)." ::msgcat::mcset uk "SSL certification authority file or directory\ (optional)." "Файл чи тека центру Ñертифікації (CA) SSL\ (необов’Ñзковий параметр)." ::msgcat::mcset uk "SSL Info" "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ SSL" ::msgcat::mcset uk "Start chat" "Розпочати розмову" ::msgcat::mcset uk "Starting auto-away" "Ðвтоматичне вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñтану\ \"Відійшов\"" ::msgcat::mcset uk "STARTTLS failed" "STARTTLS не вдавÑÑ" ::msgcat::mcset uk "STARTTLS successful" "STARTTLS уÑпішний" ::msgcat::mcset uk "State" "Стан" ::msgcat::mcset uk "State " "ОблаÑть" ::msgcat::mcset uk "State:" "ОблаÑть:" ::msgcat::mcset uk "Statistics" "СтатиÑтика" ::msgcat::mcset uk "Statistics monitor" "Монітор ÑтатиÑтики" ::msgcat::mcset uk "Status bar" "РÑдок ÑтатуÑу" ::msgcat::mcset uk "Stop autoscroll" "Вимкнути автопрогортаннÑ" ::msgcat::mcset uk "Stop chat window autoscroll." "Зупинити автопрогортаннÑ\ вікна розмови." ::msgcat::mcset uk "Store" "Зберегти" ::msgcat::mcset uk "Store group chats logs." "Зберігати Ñ–Ñторію повідомлень в\ конференціÑÑ…." ::msgcat::mcset uk "Store private chats logs." "Зберігати Ñ–Ñторію\ перÑональних розмов." ::msgcat::mcset uk "Stored collapsed roster groups." "Збережені\ згорнуті/розгорнуті групи роÑтера." ::msgcat::mcset uk "Stored main window state (normal or zoomed)" "Збережений\ Ñтан (normal або zoomed) головного вікна" ::msgcat::mcset uk "Stored show offline roster groups." "Збережене\ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð½ÐµÐ¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ… груп роÑтера." ::msgcat::mcset uk "Stored user priority." "Збережений пріоритет\ кориÑтувача." ::msgcat::mcset uk "Stored user status." "Збережений ÑÑ‚Ð°Ñ‚ÑƒÑ ÐºÐ¾Ñ€Ð¸Ñтувача." ::msgcat::mcset uk "Stored user text status." "Збережений текÑтовий ÑтатуÑ\ кориÑтувача." ::msgcat::mcset uk "Storing conferences failed: %s" "Ðе вдалоÑÑ Ð·Ð±ÐµÑ€ÐµÐ³Ñ‚Ð¸\ конференції: %s" ::msgcat::mcset uk "Storing roster notes failed: %s" "Ðе вдалоÑÑ Ð·Ð±ÐµÑ€ÐµÐ³Ñ‚Ð¸\ примітки до контактів: %s" ::msgcat::mcset uk "Stream initiation options." "Параметри SI-транÑпорта." ::msgcat::mcset uk "Stream method negotiation failed" "Ð£Ð·Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð¼ÐµÑ‚Ð¾Ð´Ñƒ\ відправки потоку не вдалоÑÑŒ" ::msgcat::mcset uk "Strip leading \"http://jabber.org/protocol/\" from IQ\ namespaces in the status line." "ОпуÑкати\ \"http://jabber.org/protocol/\" в запитах в Ñ€Ñдку ÑтатуÑу." ::msgcat::mcset uk "SubID" "SubID" ::msgcat::mcset uk "Subject" "Тема" ::msgcat::mcset uk "Subject is set to: %s" "Тема вÑтановлена у: %s" ::msgcat::mcset uk "Subject:" "Тема:" ::msgcat::mcset uk "Subject: " "Тема: " ::msgcat::mcset uk "Submit" "Відправити" ::msgcat::mcset uk "Subscribe" "ПідпиÑатиÑÑ" ::msgcat::mcset uk "Subscribe to a node" "ПідпиÑатиÑÑ Ð½Ð° вузол" ::msgcat::mcset uk "Subscribed" "ПідпиÑаний" ::msgcat::mcset uk "Subscription" "ПідпиÑка" ::msgcat::mcset uk "Subscription request from %s" "Запит на підпиÑку від %s" ::msgcat::mcset uk "Subscription request from:" "Запит на підпиÑку від:" ::msgcat::mcset uk "Subscription:" "ПідпиÑка:" ::msgcat::mcset uk "Substrings to highlight in messages." "ЧаÑтини Ñ€Ñдків,\ Ñкі підÑвічувати в повідомленнÑÑ…." ::msgcat::mcset uk "Suffix" "СуфікÑ" ::msgcat::mcset uk "Suffix:" "СуфікÑ:" ::msgcat::mcset uk "Switch to tab number 1-9,10" "ПеремкнутиÑÑ Ð½Ð° вкладку\ 1-9,10" ::msgcat::mcset uk "Systray icon blinks when there are unread messages."\ "Іконка в ÑиÑтемному треї миготить, Ñкщо Ñ” непрочитані повідомленнÑ." ::msgcat::mcset uk "Systray icon options." "Параметри іконки ÑиÑтемного\ трею." ::msgcat::mcset uk "Tabs:" "Закладки:" ::msgcat::mcset uk "Telephone numbers" "Телефонні номери" ::msgcat::mcset uk "Templates" "Шаблони" ::msgcat::mcset uk "Temporary auth failure" "ТимчаÑова помилка авторизації" ::msgcat::mcset uk "Text status, which is set when Tkabber is moving to away\ state." "СтатуÑ, Ñкий вÑтановлюєтьÑÑ ÐºÐ¾Ð»Ð¸ Tkabber переходить в Ñтан\ \"Відійшов\"." ::msgcat::mcset uk "Text:" "ТекÑÑ‚:" ::msgcat::mcset uk "the option is set and saved." "параметр вÑтановлений Ñ–\ збережений." ::msgcat::mcset uk "the option is set to its default value." "параметр зі\ Ñтандартним значеннÑм." ::msgcat::mcset uk "the option is set, but not saved." "параметр\ вÑтановлений, але не збережений Ð´Ð»Ñ Ð½Ð°Ñтупних ÑеÑій." ::msgcat::mcset uk "the option is taken from config file." "параметр взÑто з\ файлу налаштувань" ::msgcat::mcset uk "The signature is good but has expired" "ПідпиÑ\ допуÑтимий, але його Ñтрок дії закінчивÑÑ" ::msgcat::mcset uk "The signature is good but the key has expired" "ПідпиÑ\ допуÑтимий, але Ñтрок дії ключа закінчивÑÑ" ::msgcat::mcset uk "This message was forwarded by %s\n" "Це повідомленнÑ\ переÑлав %s\n" ::msgcat::mcset uk "This message was forwarded to %s" "Це Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð±ÑƒÐ»Ð¾\ переÑлано %s" ::msgcat::mcset uk "This message was sent by %s\n" "Це Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð±ÑƒÐ»Ð¾\ переÑлано %s\n" ::msgcat::mcset uk "Time" "ЧаÑ" ::msgcat::mcset uk "time %s%s:" "Ñ‡Ð°Ñ %s%s:" ::msgcat::mcset uk "time %s%s: %s" "Ñ‡Ð°Ñ %s%s: %s" ::msgcat::mcset uk "Time interval before playing next sound (in\ milliseconds)." "Інтервал перед програваннÑм наÑтупного звуку (в\ міліÑекундах)." ::msgcat::mcset uk "Time Zone:" "ЧаÑовий поÑÑ:" ::msgcat::mcset uk "Time:" "ЧаÑ:" ::msgcat::mcset uk "Timeout" "Таймаут" ::msgcat::mcset uk "Timeout for waiting for HTTP poll responses (if set to\ zero, Tkabber will wait forever)." "Тайм-аут Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ñ–\ запиту HTTP-Ð¾Ð¿Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ (Ñкщо вÑтановлений в нуль, Tkabber буде чекати\ необмежено довго)." ::msgcat::mcset uk "Timer" "Таймер" ::msgcat::mcset uk "Title" "Ðазва" ::msgcat::mcset uk "Title:" "Ðазва:" ::msgcat::mcset uk "Tkabber configuration directory transfer failed\ with:\n%s\n Tkabber will use the old directory:\n%s" "ПереміщеннÑ\ теки з налаштуваннÑми Ткаббера не вдалоÑÑ Ð·:\n%s\n Ткаббер буде\ викориÑтовувати Ñтару теку:\n%s" ::msgcat::mcset uk "Tkabber emoticons theme. To make new theme visible for\ Tkabber put it to some subdirectory of %s." "Тема Ñмайликів у\ Ткаббері. Щоб зробити нову тему видимою Ð´Ð»Ñ Ð¢ÐºÐ°Ð±Ð±ÐµÑ€Ð°, потрібно\ поклаÑти Ñ—Ñ— до Ñкої-небудь піддиректорії у %s." ::msgcat::mcset uk "Tkabber icon theme. To make new theme visible for Tkabber\ put it to some subdirectory of %s." "Тема піктограм Tkabber'а. Щоб\ мати можливіÑть увімкнути Ñвою тему, покладіть Ñ—Ñ— до підтеки теки\ %s." ::msgcat::mcset uk "Tkabber save state options." "Параметри збереженнÑ\ Ñтану." ::msgcat::mcset uk "Tkabber Systray" "Tkabber ÑиÑтемний лоток" ::msgcat::mcset uk "To" "До" ::msgcat::mcset uk "To:" "Кому:" ::msgcat::mcset uk "To: " "Кому: " ::msgcat::mcset uk "Toggle encryption" "Перемкнути шифруваннÑ" ::msgcat::mcset uk "Toggle encryption (when possible)" "Перемкнути шифруваннÑ\ (Ñкщо можливо)" ::msgcat::mcset uk "Toggle seen" "Перемкнути ÑтатуÑ" ::msgcat::mcset uk "Toggle showing offline users" "Перемкнути показ\ Ñпіврозмовників, що не в мережі" ::msgcat::mcset uk "Toolbar" "Панель інÑтрументів" ::msgcat::mcset uk "Transfer failed: %s" "Передача не вдалаÑÑ: %s" ::msgcat::mcset uk "Transferring..." "Передача..." ::msgcat::mcset uk "Try again" "Спробувати знову" ::msgcat::mcset uk "Type" "Тип" ::msgcat::mcset uk "Unable to encipher data for %s: %s.\n\nEncrypting traffic\ to this user is now disabled.\n\nSend it as PLAINTEXT?" "Ðеможливо\ зашифрувати дані Ð´Ð»Ñ %s: %s.\n\nÐ¨Ð¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾\ контакту тепер вимкнено.\n\nВідправити Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ ÐЕЗÐШИФРОВÐÐИМ?" ::msgcat::mcset uk "Unable to sign message body: %s.\n\nSigning traffic is\ now disabled.\n\nSend it WITHOUT a signature?" "Ðеможливо підпиÑати\ тіло повідомленнÑ: %s.\n\nПідпиÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ тепер\ вимкнене.\n\nВідіÑлати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð‘Ð•Ð— ПІДПИСУ?" ::msgcat::mcset uk "Unable to sign presence information: %s.\n\nPresence will\ be sent, but signing traffic is now disabled." "Ðеможливо підпиÑати\ інформацію про приÑутніÑть: %s.\n\nÐ†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ приÑутніÑть буде\ відіÑлана, але підпиÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ тепер вимкнене." ::msgcat::mcset uk "Unauthorized" "Ðе авторизовано" ::msgcat::mcset uk "Unavailable" "ÐедоÑтупний" ::msgcat::mcset uk "Unavailable presence" "Стан приÑутноÑті \"недоÑтупний\"" ::msgcat::mcset uk "Unconfigured" "Ðеналаштований" ::msgcat::mcset uk "Undefined" "Ðевизначено" ::msgcat::mcset uk "Undo" "Відмінити" ::msgcat::mcset uk "Unit:" "Відділ:" ::msgcat::mcset uk "Units" "Одиниці" ::msgcat::mcset uk "unix plugins" "плагіни Ð´Ð»Ñ unix" ::msgcat::mcset uk "unknown" "невідома помилка" ::msgcat::mcset uk "Unregister" "ВідреєÑтруватиÑÑ" ::msgcat::mcset uk "Unsubscribe" "ВідпиÑатиÑÑ" ::msgcat::mcset uk "Unsubscribe from a node" "ВідпиÑатиÑÑŒ від вузла" ::msgcat::mcset uk "Unsubscribed from %s" "ВідпиÑано від %s" ::msgcat::mcset uk "Unsupported compression method" "Ðепідтримуваний метод\ ÑтиÑненнÑ" ::msgcat::mcset uk "Unsupported log dir format" "Ðепідтримуваний формат теки\ протоколів" ::msgcat::mcset uk "Up" "Догори" ::msgcat::mcset uk "Update message of the day..." "Оновити повідомленнÑ\ днÑ..." ::msgcat::mcset uk "Uptime" "ТриваліÑть роботи" ::msgcat::mcset uk "URL to connect to." "URL Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ (опитуваннÑ)." ::msgcat::mcset uk "URL to poll:" "URL Ð´Ð»Ñ Ð¾Ð¿Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ:" ::msgcat::mcset uk "Usage: /abbrev WHAT FOR" "ВикориÑтаннÑ: /abbrev ДЛЯ ЧОГО" ::msgcat::mcset uk "Usage: /unabbrev WHAT" "ВикориÑтаннÑ: /abbrev ЩО" ::msgcat::mcset uk "Use client security keys" "ВикориÑтовувати ключі безпеки\ клієнта" ::msgcat::mcset uk "Use colored messages" "ВикориÑтовувати кольорові\ повідомленнÑ" ::msgcat::mcset uk "Use colored nicks" "ВикориÑтовувати кольорові пÑевдоніми" ::msgcat::mcset uk "Use colored nicks in chat windows." "ВикориÑтовувати\ кольорові пÑевдоніми у вікнах розмов." ::msgcat::mcset uk "Use colored nicks in groupchat rosters." "ВикориÑтовувати\ кольорові пÑевдоніми в роÑтері конференції." ::msgcat::mcset uk "Use colored roster nicks" "ВикориÑтовувати кольорові\ пÑевдоніми в роÑтері" ::msgcat::mcset uk "Use explicitly-specified server address and port."\ "ВикориÑтовувати Ñвно вказану адреÑу Ñервера Ñ– порт." ::msgcat::mcset uk "Use HTTP poll client security keys (recommended)."\ "ВикориÑтовувати клієнтÑькі ключі безпеки Ð´Ð»Ñ HTTP-опитуваннÑ\ (рекомендуєтьÑÑ)." ::msgcat::mcset uk "Use HTTP poll connection method." "ВикориÑтовувати \ HTTP-опитуваннÑ." ::msgcat::mcset uk "Use mediated SOCKS5 connection if proxy is available."\ "ВикориÑтовувати з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ SOCKS5 через поÑередника, Ñкщо прокÑÑ–\ доÑтупний." ::msgcat::mcset uk "Use only whole words for emoticons." "ВикориÑтовувати\ лише цілі Ñлова Ð´Ð»Ñ Ñмайликів." ::msgcat::mcset uk "Use SASL authentication" "ВикориÑтовувати SASL длÑ\ авторизації" ::msgcat::mcset uk "Use SASL authentication." "ВикориÑтовувати SASL длÑ\ авторизації." ::msgcat::mcset uk "Use sound notification only when being available."\ "ВикориÑтовувати звук тільки коли Ñ Ð´Ð¾Ñтупний." ::msgcat::mcset uk "Use specified key ID for signing and decrypting\ messages." "ВикориÑтовувати ключ з вказаним ідентифікатором длÑ\ підпиÑу Ñ– Ð´ÐµÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ." ::msgcat::mcset uk "Use Tabbed Interface (you need to restart)."\ "ВикориÑтовувати Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð· вкладками (піÑÐ»Ñ Ð·Ð¼Ñ–Ð½Ð¸ потрібен\ реÑтарт)." ::msgcat::mcset uk "Use the same passphrase for signing and decrypting\ messages." "ВикориÑтовувати єдину парольну фразу Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñу Ñ–\ ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ." ::msgcat::mcset uk "Use this module" "ВикориÑтовувати цей модуль" ::msgcat::mcset uk "User already %s" "Співрозмовник вже %s" ::msgcat::mcset uk "User ID" "ID Ñпіврозмовника" ::msgcat::mcset uk "User info" "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ Ñпіврозмовника" ::msgcat::mcset uk "user interface" "Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÐºÐ¾Ñ€Ð¸Ñтувача" ::msgcat::mcset uk "User name." "Логін." ::msgcat::mcset uk "Username Not Available" "ПÑевдонім недоÑтупний" ::msgcat::mcset uk "Username:" "Логін:" ::msgcat::mcset uk "Users" "Співрозмовники" ::msgcat::mcset uk "utilities" "утиліти" ::msgcat::mcset uk "Value" "ЗначеннÑ" ::msgcat::mcset uk "value is changed, but the option is not set." "значеннÑ\ змінено, але параметр не вÑтановлено." ::msgcat::mcset uk "vcard %s%s:" "Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ %s%s:" ::msgcat::mcset uk "vcard %s%s: %s" "Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ %s%s: %s" ::msgcat::mcset uk "vCard display options in chat windows." "Параметри\ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ð»Ñ–Ð² vCard у вікні розмови." ::msgcat::mcset uk "Version" "ВерÑÑ–Ñ" ::msgcat::mcset uk "version %s%s:" "верÑÑ–Ñ %s%s:" ::msgcat::mcset uk "version %s%s: %s" "верÑÑ–Ñ %s%s: %s" ::msgcat::mcset uk "Version:" "ВерÑÑ–Ñ:" ::msgcat::mcset uk "Video:" "Відео:" ::msgcat::mcset uk "View" "ВиглÑд" ::msgcat::mcset uk "Visible list" "Видимий ÑпиÑок" ::msgcat::mcset uk "Visitors" "Відвідувачі" ::msgcat::mcset uk "Voice:" "ГолоÑовий:" ::msgcat::mcset uk "Waiting for activating privacy list" "ОчікуваннÑ\ активації ÑпиÑку приватноÑті" ::msgcat::mcset uk "Warning" "ПопередженнÑ" ::msgcat::mcset uk "Warning display options." "Параметри відображеннÑ\ попереджень." ::msgcat::mcset uk "Warning:" "ПопередженнÑ:" ::msgcat::mcset uk "WARNING: %s\n" "УВÐГÐ: %s\n" ::msgcat::mcset uk "What action does the close button." "ДіÑ, що виконуєтьÑÑ\ при натиÑканні на кнопку Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð²Ñ–ÐºÐ½Ð°." ::msgcat::mcset uk "When set, all changes to the ignore rules are applied\ only until Tkabber is closed\; they are not saved and thus will be\ not restored at the next run." "Якщо вÑтановлено, то вÑÑ– зміни до\ правил Ñ–Ð³Ð½Ð¾Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÑƒÐ´ÑƒÑ‚ÑŒ дійÑні допоки увімкнений Ткаббер\; вони не\ збережені, а отже не будуть відновлені при наÑтупному запуÑку." ::msgcat::mcset uk "Whois" "Хто це?" ::msgcat::mcset uk "windows plugins" "плагіни Ð´Ð»Ñ windows" ::msgcat::mcset uk "Work:" "Робочий:" ::msgcat::mcset uk "XMPP stream options when connecting to server."\ "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ XMPP-потоку при підключенні до Ñервера." ::msgcat::mcset uk "Year:" "Рік:" ::msgcat::mcset uk "You are unsubscribed from %s" "Ви були відпиÑані від %s" ::msgcat::mcset uk "Your new Tkabber config directory is now:\n%s\nYou can\ delete the old one:\n%s" "Зараз ваші Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¢ÐºÐ°Ð±Ð±ÐµÑ€Ð°\ знаходÑтьÑÑ Ð² теці:\n%s\nВи можете видалити попередню теку з\ налаштуваннÑми:\n%s" ::msgcat::mcset uk "Edit entities affiliations: %s" ::msgcat::mcset uk "negotiation" ::msgcat::mcset uk "PCS:" ::msgcat::mcset uk "Presence-in" ::msgcat::mcset uk "Presence-out" ::msgcat::mcset uk "SSL" ::msgcat::mcset uk "UID" ::msgcat::mcset uk "UID:" ::msgcat::mcset uk "URL" ::msgcat::mcset uk "URL:" ::msgcat::mcset uk "UTC:" ::msgcat::mcset uk "wmaker" # @@ Updated translation lines go below @@ # >> 28.09.2010 # ./plugins/roster/metacontacts.tcl ::msgcat::mcset uk "Are you sure to delete %s's metacontact?" "Ви дійÑно\ хочете видалити метаконтакт %s?" ::msgcat::mcset uk "Are you sure to delete metacontact?" "Ви дійÑно хочете\ видалити метаконтакт?" ::msgcat::mcset uk "Create metacontact" "Створити метаконтакт" ::msgcat::mcset uk "Delete metacontact" "Видалити метаконтакт" ::msgcat::mcset uk "Edit %s's Metacontact" "Редагувати метаконтакт %s" ::msgcat::mcset uk "Edit Metacontact" "Редагувати Метаконтакт" ::msgcat::mcset uk "Edit metacontact" "Редагувати метаконтакт" ::msgcat::mcset uk "Metacontact" "Метаконтакт" ::msgcat::mcset uk "Remove from metacontact" "Видалити з метаконтакту" ::msgcat::mcset uk "Storing roster metacontacts failed: %s" "Ðе вдалоÑÑ\ зберегти метаконтакти до роÑтеру: %s" # ./ifacetk/systray.tcl ::msgcat::mcset uk "Change icon on server and enter/exit groupchat messages."\ "Змінювати іконку при повідомленнÑÑ… з Ñерверу чи входах/виходах у\ кімнаті" ::msgcat::mcset uk "Hide main window" "Сховати головне вікно" ::msgcat::mcset uk "Show main window" "Показати головне вікно" # ./plugins/chat/info_commands.tcl ::msgcat::mcset uk "Family name" "Прізвище" ::msgcat::mcset uk "First name" "Ім'Ñ" ::msgcat::mcset uk "Full name" "Повне ім'Ñ" ::msgcat::mcset uk "Middle name" "По батькові" ::msgcat::mcset uk "Organization name" "КомпаніÑ" ::msgcat::mcset uk "Organization unit" "Відділ" ::msgcat::mcset uk "Phone cell" "Мобільний телефон" ::msgcat::mcset uk "Phone fax" "ФакÑ" ::msgcat::mcset uk "Phone home" "Домашній телефон" ::msgcat::mcset uk "Phone message recorder" "Ðвтовідповідач" ::msgcat::mcset uk "Phone modem" "Модем" ::msgcat::mcset uk "Phone pager" "Пейджер" ::msgcat::mcset uk "Phone preferred" "ОÑновний телефон" ::msgcat::mcset uk "Phone video" "Відеотелефон" ::msgcat::mcset uk "Phone voice" "ГолоÑовий телефон" ::msgcat::mcset uk "Phone work" "Робочий телефон" ::msgcat::mcset uk "Postal code" "ІндекÑ" ::msgcat::mcset uk "Web site" "Веб-Ñторінка" # ./tclxmpp/xmpp/tls.tcl ::msgcat::mcset uk "TLS handshake failed: %s" "РукоÑтиÑÐºÐ°Ð½Ð½Ñ TLS не вдалоÑÑ:\ %s" # ./ifacetk/iface.tcl ::msgcat::mcset uk "Bottom" "Знизу" ::msgcat::mcset uk "Clear history" "ОчиÑтити Ñ–Ñторію" ::msgcat::mcset uk "Debug tools" "ІнÑтрументи Ð´Ð»Ñ Ð²Ñ–Ð´Ð»Ð°Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ" ::msgcat::mcset uk "Enable metacontacts" "Увімкнути метаконтакти" ::msgcat::mcset uk "Font to use in chat windows." "Шрифт у вікнах чату" ::msgcat::mcset uk "Font to use in roster windows." "Шрифт у роÑтері" ::msgcat::mcset uk "History of availability status messages" "ІÑторіÑ\ ÑтатуÑних повідомлень доÑтупноÑті" ::msgcat::mcset uk "Konstantin Khomoutov" "КоÑÑ‚Ñнтин Хомутов" ::msgcat::mcset uk "Left" "Ліворуч" ::msgcat::mcset uk "Left mouse button" "Ліва кнопка миші" ::msgcat::mcset uk "Manage proxy servers" "Редагувати прокÑÑ–-Ñервери" ::msgcat::mcset uk "Maximum number of status messages to keep. If the history\ size reaches this threshold, the oldest message will be deleted\ automatically when a new one is recorded." "МакÑимальне чиÑло\ ÑтатуÑних повідомлень Ð´Ð»Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ. У разі Ð¿ÐµÑ€ÐµÐ¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ Ñ–Ñторії\ найÑтаріші Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð±ÑƒÐ´ÑƒÑ‚ÑŒ поÑтупово Ñтерті при надходженні\ нових." ::msgcat::mcset uk "Maximum width of tab buttons in tabbed mode."\ "МакÑимальна ширина вкладки" ::msgcat::mcset uk "Minimum width of tab buttons in tabbed mode." "Мінімальна\ ширина вкладки" ::msgcat::mcset uk "Open login log" "Відкрити журнал з'єднань" ::msgcat::mcset uk "Popup menu" "Показати меню" ::msgcat::mcset uk "Right" "Праворуч" ::msgcat::mcset uk "Show only the number of personal unread messages in\ window title." "Показувати лише кількіÑть перÑональних непрочитаних\ повідомлень у назві вікна" ::msgcat::mcset uk "Side where to place tabs in tabbed mode." "Сторона, на\ Ñкій розміщувати вкладки" ::msgcat::mcset uk "Systray:" "СиÑтемний лоток:" ::msgcat::mcset uk "Top" "Ðагорі" ::msgcat::mcset uk "Use roster filter" "Фільтрувати роÑтер" # ./tclxmpp/xmpp/annotations.tcl ::msgcat::mcset uk "Illegal option \"%s\"" "Ðевірний параметр \"%s\"" # ./plugins/general/geometry.tcl ::msgcat::mcset uk "Stored main window geometry" "Збережена Ð³ÐµÐ¾Ð¼ÐµÑ‚Ñ€Ñ–Ñ (форма)\ головного вікна" ::msgcat::mcset uk "Stored main window geometry in non-tabbed mode"\ "Збережена Ð³ÐµÐ¾Ð¼ÐµÑ‚Ñ€Ñ–Ñ Ð³Ð¾Ð»Ð¾Ð²Ð½Ð¾Ð³Ð¾ вікна у режимі 'без вкладок'" ::msgcat::mcset uk "Stored main window state (normal or zoomed) in non-tabbed\ mode" "Збережений Ñтан головного вікна (нормальний чи з наближеннÑм)\ у режимі 'без вкладок'" # ./plugins.tcl ::msgcat::mcset uk "Invalid option \"%s\"" "Ðевірний параметр \"%s\"" ::msgcat::mcset uk "Loading and unloading external plugins." "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ‚Ð°\ Ð²Ñ–Ð´Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ–Ñ… плагінів" ::msgcat::mcset uk "Missing option \"%s\"" "ВідÑутній параметр \"%s\"" # ./plugins/iq/time2.tcl ::msgcat::mcset uk "Reply to entity time (urn:xmpp:time) requests."\ "Відповідати на запити про Ñ‡Ð°Ñ Ð½Ð° комп'ютері кориÑтувача\ (urn:xmpp:time)" # ./tclxmpp/xmpp/xml.tcl ::msgcat::mcset uk "Illegal attribute \"xmlns\". Use -xmlns option" "Ðевірний\ атрибут \"xmlns\". ВикориÑтовуйте параметр -xmlns" ::msgcat::mcset uk "Parser \"%s\" doesn't exist" "ПарÑер \"%s\" не Ñ–Ñнує" # ./tclxmpp/xmpp/blocking.tcl ::msgcat::mcset uk "Nothing to block" "Ðічого блокувати" # ./si.tcl ::msgcat::mcset uk "File transfer aborted" "Передачу файла перервано" # ./plugins/roster/backup.tcl ::msgcat::mcset uk "Error importing roster contact %s: %s" "Помилка при\ імпортуванні контактів роÑтеру %s: %s" ::msgcat::mcset uk "Export roster" "ЕкÑпортувати роÑтер" ::msgcat::mcset uk "Export roster for %s..." "ЕкÑпортувати роÑтер Ð´Ð»Ñ %s..." ::msgcat::mcset uk "Import roster" "Імпортувати роÑтер" ::msgcat::mcset uk "Import roster for %s..." "Імпортувати роÑтер Ð´Ð»Ñ %s..." ::msgcat::mcset uk "Roster files" "Файли роÑтеру" ::msgcat::mcset uk "Roster import for %s is completed" "Імпорт роÑтеру Ð´Ð»Ñ %s\ завершено" # ./pep.tcl ::msgcat::mcset uk "Personal eventing" "ПерÑональні повідомленнÑ" ::msgcat::mcset uk "Personal eventing via pubsub plugins options."\ "ПерÑональні Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð· викориÑтаннÑм параметрів плагінів pubsub" # ./tclxmpp/xmpp/component.tcl - horrible ::msgcat::mcset uk "Component handshake aborted" "РукоÑтиÑÐºÐ°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ñ–Ð²\ перервано" ::msgcat::mcset uk "Component handshake failed" "РукоÑтиÑÐºÐ°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ñ–Ð²\ провалилоÑÑ" ::msgcat::mcset uk "Component handshake succeeded" "РукоÑтиÑÐºÐ°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ñ–Ð²\ завершене" ::msgcat::mcset uk "Component handshake timed out" "Ð§Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ\ рукоÑтиÑÐºÐ°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ñ–Ð² вийшов" ::msgcat::mcset uk "Waiting for component handshake result" "Чекаємо на\ результати рукоÑтиÑÐºÐ°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ñ–Ð²" # ./plugins/roster/bkup_metacontacts.tcl ::msgcat::mcset uk "Error restoring metacontacts: %s" "Ðеможливо відновити\ метаконтакти: %s" # ./ifacetk/login.tcl ::msgcat::mcset uk "Allow X-GOOGLE-TOKEN SASL mechanism" "Дозволити механізм\ SASL X-GOOGLE-TOKEN" ::msgcat::mcset uk "HTTPS" "HTTPS" ::msgcat::mcset uk "Proxy type:" "Тип прокÑÑ–:" ::msgcat::mcset uk "SOCKS4a" "SOCKS4a" ::msgcat::mcset uk "SOCKS5" "SOCKS5" ::msgcat::mcset uk "SSL certificate:" "Сертифікат SSL" # ./tclxmpp/xmpp/muc.tcl - 1 skipped ::msgcat::mcset uk "Already joined" "Вже тут" ::msgcat::mcset uk "Already joining" "Вже заходжу" ::msgcat::mcset uk "Disconnected from the room" "Відімкнений від кімнати" ::msgcat::mcset uk "Empty nickname" "ВідÑутній пÑевдонім" ::msgcat::mcset uk "Illegal nickname" "Ðевірний пÑевдонім" ::msgcat::mcset uk "Leaving room" "Залишаю кімнату" ::msgcat::mcset uk "MUC room JID \"%s\" is malformed" "JID конференції \"%s\"\ Ñ” невірним" ::msgcat::mcset uk "MUC room JID must have empty resource part. The specified\ JID was \"%s\"" "JID конференції повинен мати пуÑтий реÑурÑ. Вказаний\ JID був \"%s\"" ::msgcat::mcset uk "Must join room first" "Спершу зайди у кімнату" ::msgcat::mcset uk "Nickname didn't change" "ПÑевдонім не змінюєтьÑÑ" ::msgcat::mcset uk "Nickname is changing already" "ПÑевдонім вже змінюєтьÑÑ" ::msgcat::mcset uk "Option \"-nick\" or \"-jid\" must be specified" "Параметр\ \"-nick\" чи \"-jid\" має бути вказано заздалегідь" ::msgcat::mcset uk "The room isn't joined yet" "Ще не зайшов у кімнату" ::msgcat::mcset uk "User is not banned" "Співрозмовник не забанений" ::msgcat::mcset uk "MUC token doesn't exist" # ./tclxmpp/xmpp/search.tcl ::msgcat::mcset uk "Last name" "Прізвище" # ./pubsub.tcl ::msgcat::mcset uk "Configure node" "Ðалаштувати вузол" ::msgcat::mcset uk "Pubsub request failed: %s" "Запит з Pubsub не вдавÑÑ: %s" ::msgcat::mcset uk "Pubsub request succeeded" "Запит з Pubsub виконано" ::msgcat::mcset uk "Request default configuration" "Запит Ñтандартних\ налаштувань" ::msgcat::mcset uk "Retrieve subscriptions" "Отримати підпиÑки" ::msgcat::mcset uk "Subscriptions to pubsub nodes at %s" "ПідпиÑки до вузлів\ pubsub в %s" ::msgcat::mcset uk "Success" "УÑпіх" # ./utils.tcl ::msgcat::mcset uk "Copy" "Копіювати" ::msgcat::mcset uk "Cut" "Вирізати" ::msgcat::mcset uk "Paste" "Ð’Ñтавити" # ./tclxmpp/xmpp/socks4.tcl - translation of some terms is under the question ::msgcat::mcset uk "Failed to read SOCKS4a destination address" "Ðе вдалоÑÑ\ прочитати адреÑу Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñƒ SOCKS4a Ñервера" ::msgcat::mcset uk "Failed to read SOCKS4a response" "Ðе вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸\ відповідь від SOCKS4a" ::msgcat::mcset uk "Failed to send SOCKS4a request" "Ðе вдалоÑÑ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð¸Ñ‚Ð¸\ запит до SOCKS4a" ::msgcat::mcset uk "Incorrect SOCKS4a server version" "Ðевідповідна верÑÑ–Ñ\ SOCKS4a Ñервера" ::msgcat::mcset uk "Request rejected or failed" "Запит був відхилений або не\ вдавÑÑ" ::msgcat::mcset uk "Server cannot reach client's identd" "Сервер не зміг\ зв'ÑзатиÑÑ Ð· identd клієнта" ::msgcat::mcset uk "SOCKS4a proxy negotiation aborted" "Переговори з\ прокÑÑ–-Ñервером типу SOCKS4a перервано" ::msgcat::mcset uk "SOCKS4a proxy negotiation timed out" "Ð§Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ\ переговору з прокÑÑ–-Ñервером типу SOCKS4a вийшов" ::msgcat::mcset uk "Unknown SOCKS4a server error" "Ðевідома помилка SOCKS4a\ Ñервера" ::msgcat::mcset uk "Client's identd could not confirm the userid" # ./plugins/roster/conferences.tcl ::msgcat::mcset uk "Default group for conferences in roster." "Стандартна\ група Ð´Ð»Ñ ÐºÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ñ–Ð¹ у роÑтері" ::msgcat::mcset uk "Ignore autojoin option and do not automatically join\ conference rooms on login." "Ігнорувати автозахід Ñ– не заходити\ автоматично до кімнат під Ñ‡Ð°Ñ Ð»Ð¾Ð³Ñ–Ð½Ñƒ." # ./plugins/roster/bkup_conferences.tcl ::msgcat::mcset uk "Error restoring conference bookmarks: %s" "Помилка при\ відновленні закладок з конференціÑми" # ./chats.tcl ::msgcat::mcset uk "%s - Chat" "%s - Чат" # ./tclxmpp/xmpp/iq.tcl ::msgcat::mcset uk "Illegal IQ type \"%s\"" "Ðевірний тип IQ \"%s\"" # ./register.tcl ::msgcat::mcset uk "Change Password for %s" "Змінити Пароль Ð´Ð»Ñ %s" ::msgcat::mcset uk "Enter the new password for %s" "УвеÑти новий пароль длÑ\ %s" # ./plugins/general/ispell.tcl ::msgcat::mcset uk "Ispell options. See ispell manual for\ details.\n\nExamples:\n -d russian\n -d german -T latin1\n -C -d\ english" "Параметри Ispell. ДивітьÑÑ Ð¿Ð¾Ñібник длÑ\ деталей.\n\nÐаприклад:\n -d ukrainian\n -d german -T latin1\n -C\ -d english" ::msgcat::mcset uk "Spelling" "ПравопиÑ" # ./muc.tcl ::msgcat::mcset uk "%s has been assigned a new affiliation: %s" "%s було\ надано новий ранг: %s" ::msgcat::mcset uk "%s has been assigned a new role: %s" "%s було надано нову\ роль: %s" ::msgcat::mcset uk "%s has been assigned a new room position: %s/%s" "%s було\ надано нову поÑаду в кімнаті: %s/%s" ::msgcat::mcset uk "A new room is created" "Створено нову кімнату" ::msgcat::mcset uk "as %s/%s" "Ñк %s/%s" ::msgcat::mcset uk "Can't change nickname in MUC incompatible rooms"\ "Ðеможливо змінити пÑевдонім в конференціÑÑ… не ÑуміÑних з MUC" ::msgcat::mcset uk "Cancelling configure form" "ВідмінÑєтьÑÑ Ñ„Ð¾Ñ€Ð¼Ð° з\ налаштуваннÑми" ::msgcat::mcset uk "Generate groupchat messages when occupant changes his/her\ status and/or status message." "Генерувати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²\ конференції, коли Ñ—Ñ— мешканець змінює Ñвій ÑÑ‚Ð°Ñ‚ÑƒÑ Ñ‡Ð¸ ÑтатуÑне\ повідомленнÑ." ::msgcat::mcset uk "Generate groupchat messages when occupant's room position\ (affiliation and/or role) changes." "Генерувати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²\ конференції, коли змінюєтьÑÑ Ð¿Ð¾Ñада (ранг/роль) Ñ—Ñ— мешканців." ::msgcat::mcset uk "Retry to join MUC room with a different nickname (with\ added _ suffix) in case of name conflicts." "Спробувати зайти в\ кімнату з іншим пÑевдонімом (пÑевдонім_) у разі конфліктів імен." ::msgcat::mcset uk "Retrying with nickname '%s_'" "Спроба з пÑевдонімом\ '%s_'" ::msgcat::mcset uk "User is unbanned" "КориÑтувач не забанений" ::msgcat::mcset uk "whois '%s': %s" "Хто цей '%s': %s" ::msgcat::mcset uk "whois '%s': no info" "Хто цей '%s': Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð²Ñ–Ð´ÑутнÑ" ::msgcat::mcset uk "You must join the room to set %s" "Ви повинні бути у\ кімнаті аби вÑтановити %s" # ./tclxmpp/xmpp/stanzaerror.tcl ::msgcat::mcset uk "Authentication error" "Помилка авторизації" ::msgcat::mcset uk "Bad request" "Ðевдалий запит" ::msgcat::mcset uk "Feature not implemented" "Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ Ð½Ðµ реалізована" ::msgcat::mcset uk "Internal server error" "Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° Ñерверу" ::msgcat::mcset uk "Item not found" "Об'єкт не знайдено" ::msgcat::mcset uk "JID malformed" "Ðевірний JID" ::msgcat::mcset uk "Not acceptable" "ÐеприйнÑтно" ::msgcat::mcset uk "Not allowed" "Ðе дозволено" ::msgcat::mcset uk "Not authorized" "Ðе авторизовано" ::msgcat::mcset uk "Payment required" "Платно" ::msgcat::mcset uk "Recipient unavailable" "Одержувач недоÑтупний" ::msgcat::mcset uk "Registration required" "Потрібна реєÑтраціÑ" ::msgcat::mcset uk "Remote server not found" "Віддалений Ñервер не знайдено" ::msgcat::mcset uk "Remote server timeout" "Віддалений Ñервер не відповів\ вчаÑно" ::msgcat::mcset uk "Request error" "Помилка запиту" ::msgcat::mcset uk "Resource constraint" "ÐедоÑтатньо реÑурÑів" ::msgcat::mcset uk "Service unavailable" "Ð¡ÐµÑ€Ð²Ñ–Ñ Ð½ÐµÐ´Ð¾Ñтупний" ::msgcat::mcset uk "Subscription required" "Потрібна підпиÑка" ::msgcat::mcset uk "Temporary error" "ТимчаÑова помилка" ::msgcat::mcset uk "Undefined condition" "Ðевизначений Ñтан" ::msgcat::mcset uk "Unexpected request" "Ðеочікуваний запит" ::msgcat::mcset uk "Unrecoverable error" "Ðевиправна помилка" # ./tclxmpp/xmpp/presence.tcl ::msgcat::mcset uk "Illegal presence type \"%s\"" "Вказаний вид приÑутноÑті\ \"%s\" Ñ” невірним" # ./plugins/pep/user_activity.tcl ::msgcat::mcset uk "\n\tActivity: %s" "\n\tÐктивніÑть: %s" ::msgcat::mcset uk "\n\tUser activity subscription: %s" "\n\tПідпиÑка на\ активніÑть: %s" ::msgcat::mcset uk "%s's activity changed to %s" "ÐктивніÑть %s змінилаÑÑ Ð½Ð°\ %s" ::msgcat::mcset uk "%s's activity is unset" "ÐктивніÑть %s не пропиÑана" ::msgcat::mcset uk "Activity" "ÐктивніÑть" ::msgcat::mcset uk "Activity:" "ÐктивніÑть:" ::msgcat::mcset uk "at the spa" "на Ñпа" ::msgcat::mcset uk "Auto-subscribe to other's user activity" "ÐвтопідпиÑатиÑÑ\ на активніÑть інших Ñпіврозмовників" ::msgcat::mcset uk "Auto-subscribe to other's user activity notifications."\ "ÐвтопідпиÑатиÑÑ Ð½Ð° Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ активніÑть інших\ Ñпіврозмовників" ::msgcat::mcset uk "brushing teeth" "чищу зуби" ::msgcat::mcset uk "buying groceries" "в крамниці" ::msgcat::mcset uk "Cannot publish empty activity" "Ðеможливо публікувати\ невизначену активніÑть" ::msgcat::mcset uk "cleaning" "прибираю" ::msgcat::mcset uk "coding" "програмую" ::msgcat::mcset uk "commuting" "в маршрутці" ::msgcat::mcset uk "cooking" "готую" ::msgcat::mcset uk "cycling" "на велоÑипеді" ::msgcat::mcset uk "day off" "маю вихідний" ::msgcat::mcset uk "doing chores" "прибираю вдома" ::msgcat::mcset uk "doing maintenance" "лагоджу" ::msgcat::mcset uk "doing the dishes" "мию поÑуд" ::msgcat::mcset uk "doing the laundry" "перу білизну" ::msgcat::mcset uk "drinking" "п'ÑŽ" ::msgcat::mcset uk "driving" "за кермом" ::msgcat::mcset uk "eating" "їм" ::msgcat::mcset uk "exercising" "займаюÑÑ Ñ„Ñ–Ð·ÐºÑƒÐ»ÑŒÑ‚ÑƒÑ€Ð¾ÑŽ" ::msgcat::mcset uk "gaming" "граюÑÑ" ::msgcat::mcset uk "gardening" "в Ñадочку" ::msgcat::mcset uk "getting a haircut" "ÑтрижуÑÑ" ::msgcat::mcset uk "going out" "надворі" ::msgcat::mcset uk "grooming" "приводжу Ñебе в порÑдок" ::msgcat::mcset uk "hanging out" "туÑуюÑÑ" ::msgcat::mcset uk "having a beer" "п'ÑŽ пиво" ::msgcat::mcset uk "having a snack" "їм закуÑку" ::msgcat::mcset uk "having appointment" "на зуÑтрічі" ::msgcat::mcset uk "having breakfast" "Ñнідаю" ::msgcat::mcset uk "having coffee" "п'ÑŽ каву" ::msgcat::mcset uk "having dinner" "обідаю" ::msgcat::mcset uk "having lunch" "Ñнідаю" ::msgcat::mcset uk "having tea" "п'ÑŽ чай" ::msgcat::mcset uk "hiking" "подорожую пішки" ::msgcat::mcset uk "in a car" "в машині" ::msgcat::mcset uk "in a meeting" "на зібранні" ::msgcat::mcset uk "in real life" "деÑÑŒ IRL" ::msgcat::mcset uk "inactive" "бездар" ::msgcat::mcset uk "jogging" "бігаю підтюпцем" ::msgcat::mcset uk "on a bus" "в автобуÑÑ–" ::msgcat::mcset uk "on a plane" "в літаку" ::msgcat::mcset uk "on a train" "в поїзді" ::msgcat::mcset uk "on a trip" "подорожую" ::msgcat::mcset uk "on the phone" "на телефоні" ::msgcat::mcset uk "on vacation" "у відпуÑтці" ::msgcat::mcset uk "on video phone" "за відеотелефоном" ::msgcat::mcset uk "partying" "на вечірці" ::msgcat::mcset uk "playing sports" "займаюÑÑŒ Ñпортом" ::msgcat::mcset uk "Publish" "Публікувати" ::msgcat::mcset uk "Publish user activity..." "Публікувати активніÑть..." ::msgcat::mcset uk "Publishing is only possible while being online"\ "ÐŸÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð° лише тоді, коли ви в мережі" ::msgcat::mcset uk "reading" "читаю" ::msgcat::mcset uk "rehearsing" "репетирую" ::msgcat::mcset uk "relaxing" "відпочиваю" ::msgcat::mcset uk "running" "біжу" ::msgcat::mcset uk "running an errand" "у Ñправах" ::msgcat::mcset uk "scheduled holiday" "запланував вихідний" ::msgcat::mcset uk "shaving" "голюÑÑ" ::msgcat::mcset uk "shopping" "по магазинах" ::msgcat::mcset uk "skiing" "катаюÑÑ Ð½Ð° лижах" ::msgcat::mcset uk "sleeping" "Ñплю" ::msgcat::mcset uk "socializing" "ÑпілкуюÑÑ" ::msgcat::mcset uk "studying" "навчаюÑÑ" ::msgcat::mcset uk "Subactivity" "Конкретніше" ::msgcat::mcset uk "Subactivity:" "Конкретніше:" ::msgcat::mcset uk "sunbathing" "заÑмагаю" ::msgcat::mcset uk "swimming" "плаваю" ::msgcat::mcset uk "taking a bath" "приймаю ванну" ::msgcat::mcset uk "taking a shower" "приймаю душ" ::msgcat::mcset uk "talking" "балакаю" ::msgcat::mcset uk "traveling" "подорожую" ::msgcat::mcset uk "Unpublish" "Відмінити публікацію" ::msgcat::mcset uk "Unpublish user activity" "Відмінити публікацію\ активноÑті" ::msgcat::mcset uk "Unpublish user activity..." "Відмінити публікацію\ активноÑті..." ::msgcat::mcset uk "Unpublishing is only possible while being online"\ "Відміна публікації можлива тільки тоді, коли ви в мережі" ::msgcat::mcset uk "Use connection:" "Логін:" ::msgcat::mcset uk "User activity" "ÐктивніÑть" ::msgcat::mcset uk "User activity publishing failed: %s" "Ðе вдалоÑÑ\ опублікувати активніÑть: %s" ::msgcat::mcset uk "User activity unpublishing failed: %s" "Ðе вдалоÑÑ\ відмовитиÑÑ Ð²Ñ–Ð´ публікації активноÑті: %s" ::msgcat::mcset uk "walking" "прогулююÑÑ" ::msgcat::mcset uk "walking the dog" "вигулюю Ñобаку" ::msgcat::mcset uk "watching a movie" "дивлюÑÑ ÐºÑ–Ð½Ð¾" ::msgcat::mcset uk "watching tv" "дивлюÑÑ Ð·Ð¾Ð¼Ð±Ð¾Ñщик" ::msgcat::mcset uk "working" "працюю" ::msgcat::mcset uk "working out" "за тренажерами" ::msgcat::mcset uk "writing" "пишу" # ./iface.tcl ::msgcat::mcset uk "Session key bits" "Розмір ключа ÑеÑÑ–Ñ—" ::msgcat::mcset uk "SHA1 hash" "хеш SHA1" # ./plugins/richtext/stylecodes.tcl ::msgcat::mcset uk "Hide characters comprising stylecode markup." "Ховати\ Ñимволи, що вÑтановлюють розмітку через коди Ñтилів" # ./splash.tcl - fix me ::msgcat::mcset uk "xmpp chat/muc" "xmpp - чат/конференції" ::msgcat::mcset uk "xmpp iq" "xmpp - iq" ::msgcat::mcset uk "xmpp library" "xmpp - бібліотеки" ::msgcat::mcset uk "xmpp messages" "xmpp - повідомленнÑ" ::msgcat::mcset uk "xmpp presence" "xmpp - приÑутніÑть" ::msgcat::mcset uk "xmpp registration" "xmpp - реєÑтраціÑ" ::msgcat::mcset uk "xmpp roster" "xmpp - роÑтер" # ./ifacetk/muc.tcl ::msgcat::mcset uk "Add new item" "Додати новий елемент" ::msgcat::mcset uk "admin" "адмініÑтратор" ::msgcat::mcset uk "All items:" "Ð’ÑÑ– елементи:" ::msgcat::mcset uk "Edit outcast list" "Редагувати перелік вигнанців" ::msgcat::mcset uk "Edit participant list" "Редагувати перелік учаÑників" ::msgcat::mcset uk "Edit visitor list" "Редагувати перелік гоÑтей" ::msgcat::mcset uk "member" "член" ::msgcat::mcset uk "moderator" "модератор" ::msgcat::mcset uk "none" "ніхто" ::msgcat::mcset uk "outcast" "вигнанець" ::msgcat::mcset uk "owner" "влаÑник" ::msgcat::mcset uk "participant" "учаÑник" ::msgcat::mcset uk "Update item" "Оновити елемент" ::msgcat::mcset uk "visitor" "гіÑть" # ./tclxmpp/xmpp/starttls.tcl ::msgcat::mcset uk "Server hasn't provided STARTTLS feature" "Сервер не\ підтримує STARTTLS" ::msgcat::mcset uk "STARTTLS aborted" "STARTTLS перервано" ::msgcat::mcset uk "STARTTLS timed out" "STARTTLS не відгукнувÑÑ Ð²Ñ‡Ð°Ñно" # ./tclxmpp/xmpp/disco.tcl ::msgcat::mcset uk "Illegal value \"%s\" for option \"%s\", boolean expected"\ "Ðевірне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ \"%s\", очікуєтьÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ\ типу 'boolean'" # ./plugins/general/caps.tcl - unknown. fix me ::msgcat::mcset uk "Enable announcing entity capabilities in every outgoing\ presence." "Дозволити передачу інформації про можливоÑті програми\ разом з інформацією про приÑутніÑть" ::msgcat::mcset uk "Options for entity capabilities plugin." "Параметри\ плагіна, що керує інформацією про можливоÑті програм." ::msgcat::mcset uk "Use the specified function to hash supported features\ list." "ВикориÑтовувати вказаний алгоритм Ñ…ÐµÑˆÑƒÐ²Ð°Ð½Ð½Ñ ÑпиÑку\ реалізованих можливоÑтей програми." # ./tclxmpp/xmpp/https.tcl ::msgcat::mcset uk "Failed to connect to HTTPS proxy" "Ðе вдалоÑÑ Ð·'єднатиÑÑ\ з HTTPS прокÑÑ–" ::msgcat::mcset uk "HTTPS proxy negotiation aborted" "Переговори з\ прокÑÑ–-Ñервером перервано" ::msgcat::mcset uk "HTTPS proxy negotiation timed out" "Переговори з\ прокÑÑ–-Ñервером перервано через тайм-аут" # ./plugins/pep/user_tune.tcl ::msgcat::mcset uk "\n\tTune: %s - %s" "\n\tМузика: %s - %s" ::msgcat::mcset uk "\n\tUser tune subscription: %s" "\n\tПідпиÑка на музику:\ %s" ::msgcat::mcset uk "%s's tune changed to %s - %s" "%s перемкнув на %s - %s" ::msgcat::mcset uk "%s's tune has stopped playing" "%s переÑтав Ñлухати\ музику" ::msgcat::mcset uk "%s's tune is unset" "%s не публікує музику" ::msgcat::mcset uk "Artist:" "Виконавець:" ::msgcat::mcset uk "Auto-subscribe to other's user tune" "ÐвтопідпиÑатиÑÑ Ð½Ð°\ публікацію музики інших Ñпіврозмовників" ::msgcat::mcset uk "Auto-subscribe to other's user tune notifications."\ "ÐвтопідпиÑатиÑÑ Ð½Ð° Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ музику інших Ñпіврозмовників" ::msgcat::mcset uk "Length:" "Довжина:" ::msgcat::mcset uk "Publish \"playback stopped\" instead" "ЗаміÑть цього\ публікувати \"поÑтавив музику на паузу\"" ::msgcat::mcset uk "Publish user tune..." "Публікувати музику..." ::msgcat::mcset uk "Rating:" "Оцінка:" ::msgcat::mcset uk "Source:" "Джерело:" ::msgcat::mcset uk "Track:" "Доріжка:" ::msgcat::mcset uk "Unpublish user tune" "Відмінити публікацію музики" ::msgcat::mcset uk "Unpublish user tune..." "Відмінити публікацію музики..." ::msgcat::mcset uk "URI:" "URI:" ::msgcat::mcset uk "User tune" "Музика" ::msgcat::mcset uk "User tune publishing failed: %s" "Ðе вдалоÑÑ Ð¾Ð¿ÑƒÐ±Ð»Ñ–ÐºÑƒÐ²Ð°Ñ‚Ð¸\ музику: %s" ::msgcat::mcset uk "User tune unpublishing failed: %s" "Ðе вдалоÑÑ Ð²Ñ–Ð´Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸\ публікацію музики: %s" # ./tclxmpp/xmpp/xmpp.tcl - skipped ::msgcat::mcset uk "An existing variable \"%s\" cannot be used as an XMPP\ token" ::msgcat::mcset uk "Free without disconnect" ::msgcat::mcset uk "IQ %s timed out" ::msgcat::mcset uk "IQ id %s doesn't exist in memory" ::msgcat::mcset uk "Opening stream aborted" ::msgcat::mcset uk "Opening stream timed out" ::msgcat::mcset uk "Option \"-command\" is illegal for IQ type \"%s\"" ::msgcat::mcset uk "Unknown IQ type \"%s\"" ::msgcat::mcset uk "Unknown message type %s" ::msgcat::mcset uk "Unsupported stream XMLNS \"%s\"" ::msgcat::mcset uk "Usage: ::xmpp::Set xlib property ?value?" # ./plugins/iq/version.tcl ::msgcat::mcset uk "Include operating system info into a reply to version\ (jabber:iq:version) requests." "Показувати інформацію про операційну\ ÑиÑтему у відповідÑÑ… на запит 'version' (jabber:iq:version)." # ./login.tcl - fix me ::msgcat::mcset uk "Address type not supported by SOCKS proxy" "Такий тип\ адреÑи не підтримуєтьÑÑ SOCKS прокÑьою" ::msgcat::mcset uk "Allow X-GOOGLE-TOKEN authentication mechanisms. It\ requires connection to Google via HTTPS." "Дозволити механізми\ авторизації X-GOOGLE-TOKEN. Потребує з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð¾ Google через\ HTTPS." ::msgcat::mcset uk "Connecting to %s" "З'єднуюÑÑ Ð· %s" ::msgcat::mcset uk "Connection refused by destination host" "З'єднаннÑ\ розірвано віддаленим хоÑтом" ::msgcat::mcset uk "Forced logout" "Вимушений вихід" ::msgcat::mcset uk "Host unreachable" "ХоÑÑ‚ недоÑтупний" ::msgcat::mcset uk "Incorrect SOCKS version" "Ðевірна верÑÑ–Ñ SOCKS" ::msgcat::mcset uk "Login is successful" "Вхід уÑпішний" ::msgcat::mcset uk "Login log" "Журнал входів" ::msgcat::mcset uk "Login retry for %s in %s" "Спроба зайти Ð´Ð»Ñ %s в %s" ::msgcat::mcset uk "Network failure" "Помилка мережі" ::msgcat::mcset uk "Network unreachable" "Мережа недоÑтупна" ::msgcat::mcset uk "Proxy authentication required" "Потрібна Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ñ–Ñ Ð²\ прокÑÑ–" ::msgcat::mcset uk "SOCKS authentication failed" "ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ñ–Ñ Ð² SOCKS\ провалилаÑÑ" ::msgcat::mcset uk "SOCKS command not supported" "Команда SOCKS не\ підтримуєтьÑÑ" ::msgcat::mcset uk "SOCKS connection not allowed by ruleset" "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ·\ SOCKS правилами не дозволені" ::msgcat::mcset uk "SOCKS request failed" "Запит у SOCKS проваливÑÑ" ::msgcat::mcset uk "SOCKS server cannot identify username" "SOCKS Ñервер не\ може ідентифікувати ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача" ::msgcat::mcset uk "SOCKS server username identification failed"\ "Ð†Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ñ–Ð¼ÐµÐ½Ñ– кориÑтувача у SOCKS Ñервері провалилаÑÑ" ::msgcat::mcset uk "Starting login" "Починаю вхід" ::msgcat::mcset uk "Unknown address type" "Ðевідомий тип адреÑи" ::msgcat::mcset uk "Unknown error" "Ðевідома помилка" ::msgcat::mcset uk "Unsupported SOCKS authentication method" "Ðепідтримуваний\ метод авторизації SOCKS" ::msgcat::mcset uk "Unsupported SOCKS method" "Ðепідтримуваний метод SOCKS" ::msgcat::mcset uk "TTL expired" # ./userinfo.tcl - Імена ::msgcat::mcset uk "Family name:" "Прізвище:" ::msgcat::mcset uk "First name:" "Ім'Ñ:" ::msgcat::mcset uk "Full name:" "Повне ім'Ñ:" ::msgcat::mcset uk "Last activity or uptime" "ОÑÑ‚Ð°Ð½Ð½Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ–Ñть або чаÑ\ безперервної роботи" ::msgcat::mcset uk "Load image" "Завантажити малюнок" ::msgcat::mcset uk "Message recorder:" "Ðвтовідповідач:" ::msgcat::mcset uk "Middle name:" "По батькові:" ::msgcat::mcset uk "Postal code:" "Поштовий код:" ::msgcat::mcset uk "Time zone:" "ЧаÑовий поÑÑ:" ::msgcat::mcset uk "Update" "Оновити" ::msgcat::mcset uk "Web site:" "Веб-Ñторінка:" # ./tclxmpp/xmpp/pconnect.tcl ::msgcat::mcset uk "Cannot connect to %s:%s" "Ðеможливо з'єднатиÑÑ Ð´Ð¾ %s:%s" ::msgcat::mcset uk "Cannot connect to proxy %s:%s" "Ðеможливо з'єднатиÑÑ Ð´Ð¾\ прокÑÑ– %s:%s" ::msgcat::mcset uk "Connection aborted" "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ð¾" ::msgcat::mcset uk "Connection timed out" "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð½Ðµ вдалоÑÑ Ñ‡ÐµÑ€ÐµÐ·\ тайм-аут" ::msgcat::mcset uk "Connection via proxy aborted" "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· прокÑÑ–\ перервано" ::msgcat::mcset uk "Connection via proxy timed out" "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· прокÑÑ–\ не вдалоÑÑ Ñ‡ÐµÑ€ÐµÐ· тайм-аут" ::msgcat::mcset uk "Options \"-host\" and \"-port\" are required (or your\ proxy filter hasn't returned them)" "Параметри \"-host\" Ñ– \"-port\"\ Ñ” обов'Ñзковими (або ваш фільтр прокÑÑ– не надав Ñ—Ñ…)" ::msgcat::mcset uk "Unsupported proxy \"%s\"" "ПрокÑÑ– \"%s\" не\ підтримуєтьÑÑ" # ./tclxmpp/xmpp/auth.tcl - Big MESS ::msgcat::mcset uk "Illegal value \"%s\" for option \"%s\"" "Ðевірне значеннÑ\ \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ \"%s\"" ::msgcat::mcset uk "Non-SASL authentication aborted" "Ðвторизацію без SASL\ перервано" ::msgcat::mcset uk "Non-SASL authentication failed" "ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ñ–Ñ Ð±ÐµÐ· SASL\ провалилаÑÑ" ::msgcat::mcset uk "Non-SASL authentication succeeded" "Ðвторизацію без SASL\ здійÑнено уÑпішно" ::msgcat::mcset uk "Non-SASL authentication timed out" "Ðвторизацію без SASL\ перервано через тайм-аут" ::msgcat::mcset uk "Server doesn't support digest non-SASL authentication"\ "Сервер не підтримує авторизацію без SASL з передачею зашифрованого\ паролю" ::msgcat::mcset uk "Server doesn't support plaintext non-SASL authentication"\ "Сервер не підтримує авторизацію без SASL з передачею паролю\ відкритим текÑтом" ::msgcat::mcset uk "Server doesn't support plaintext or digest non-SASL\ authentication" "Сервер не підтримує авторизацію без SASL з передачею\ зашифрованого паролю або відкритим текÑтом" ::msgcat::mcset uk "Server hasn't provided non-SASL authentication feature"\ "Сервер не підтримує авторизацію без SASL" ::msgcat::mcset uk "Waiting for non-SASL authentication fields" "Очікую на\ форму Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ñ–Ñ— без SASL" ::msgcat::mcset uk "Waiting for non-SASL authentication results" "Очікую на\ результати авторизації без SASL" # ./ifacetk/roster.tcl - контакт чи Ñпіврозмовник чи ÑпівбеÑідник? ::msgcat::mcset uk "Always use main JID label for metacontact." "Завжди\ викориÑтовувати Ð´Ð»Ñ Ð¼ÐµÑ‚Ð°ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð° позначку з головного JID." ::msgcat::mcset uk "Are you sure to remove all users in group '%s' from\ roster? \n(Users which are not in this group only, will be removed\ from the roster as well.)" "Ви дійÑно хочете видалити вÑÑ– контакти в\ групі '%s' з роÑтеру? \n(Контакти, що розміщені не тільки в цій групі\ будуть також видалені)" ::msgcat::mcset uk "Enable grouping contacts into a single metacontact in\ roster." "Дозволити групувати контакти в один метаконтакт у роÑтері" ::msgcat::mcset uk "If set then open chat window/tab when user doubleclicks\ roster item. Otherwise open normal message window." "Якщо увімкнено,\ подвійне ÐºÐ»Ð°Ñ†Ð°Ð½Ð½Ñ Ð¼Ð¸ÑˆÐºÐ¾ÑŽ на контакті відкриє вікно/вкладку чату, в\ іншому разі відкриєтьÑÑ Ð²Ñ–ÐºÐ½Ð¾ Ð´Ð»Ñ Ð²Ñ–Ð´ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ." ::msgcat::mcset uk "Match contact JIDs in addition to nicknames in roster\ filter." "РозрізнÑти контакти Ñ– за JID Ñ– за пÑевдонімами у фільтрі\ Ð´Ð»Ñ Ñ€Ð¾Ñтеру." ::msgcat::mcset uk "Roster filter." "Фільтр роÑтера." ::msgcat::mcset uk "Use roster filter." "Фільтрувати роÑтер." # ./plugins/general/sound.tcl ::msgcat::mcset uk "Sound to play when disconnected from Jabber server."\ "МелодіÑ, що програєтьÑÑ Ð¿Ñ–ÑÐ»Ñ Ð²Ñ–Ð´Ñ–Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ Jabber Ñервера" # ./tclxmpp/xmpp/transport.tcl ::msgcat::mcset uk "Can't switch transport to \"%s\": %s" "Ðеможливо змінити\ транÑпорт на \"%s\": %s" ::msgcat::mcset uk "Illegal command \"%s\"" "Ðевірна команда \"%s\"" ::msgcat::mcset uk "Transport \"%s\" already registered" "ТранÑпорт \"%s\"\ вже зареєÑтровано" ::msgcat::mcset uk "Unknown transport \"%s\"" "Ðевідомий транÑпорт \"%s\"" # ./plugins/iq/ping.tcl ::msgcat::mcset uk "Ping server using XMPP ping requests." "Пінгувати Ñервер\ викориÑтовуючи запити 'XMPP ping'" ::msgcat::mcset uk "Reconnect to server if it does not reply (with result or\ with error) to XMPP ping request in specified time interval (in\ seconds)." "Перез'єднатиÑÑ Ð· Ñервером у разі відÑутноÑті відповіді чи\ помилці на запит 'XMPP ping' через визначений інтервал чаÑу в\ Ñекундах" ::msgcat::mcset uk "Reply to XMPP ping requests." "Відповідати на запити\ 'XMPP ping'" # ./messages.tcl ::msgcat::mcset uk "Request unsubscription" "Запитати відпиÑку" ::msgcat::mcset uk "Revoke subscription" "Відізвати підпиÑку" # ./plugins/chat/logger.tcl ::msgcat::mcset uk "You're using root directory %s for storing Tkabber\ logs!\n\nI refuse to convert logs database." "Ви викориÑтовуєте\ директорію %s Ð´Ð»Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñ–Ð² Tkabber!\n\nÐеможливо\ Ñконвертувати журнал." # ./tclxmpp/xmpp/streamerror.tcl ::msgcat::mcset uk "Bad format" "Ðевірний формат" ::msgcat::mcset uk "Bad namespace prefix" "Ðевірний Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ Ð¿Ñ€Ð¾Ñтору назв" ::msgcat::mcset uk "Connection timeout" "Ð§Ð°Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð²Ð¸Ñ‡ÐµÑ€Ð¿Ð°Ð²ÑÑ" ::msgcat::mcset uk "Host gone" "ХоÑÑ‚ не обÑлуговуєтьÑÑ" ::msgcat::mcset uk "Host unknown" "Ðевідомий хоÑÑ‚" ::msgcat::mcset uk "Improper addressing" "Ðевірна адреÑаціÑ" ::msgcat::mcset uk "Invalid from" "ÐеприпуÑтимий from" ::msgcat::mcset uk "Invalid namespace" "ÐеприпуÑтимий проÑтір назв" ::msgcat::mcset uk "Policy violation" "ÐŸÐ¾Ñ€ÑƒÑˆÐµÐ½Ð½Ñ Ð¿Ð¾Ð»Ñ–Ñ‚Ð¸ÐºÐ¸" ::msgcat::mcset uk "Remote connection failed" "Помилка віддаленого з'єднаннÑ" ::msgcat::mcset uk "See other host" "ДивиÑÑŒ інший хоÑÑ‚" ::msgcat::mcset uk "Stream error" "Помилка потоку" ::msgcat::mcset uk "Stream error (%s)" "Помилка потоку (%s)" ::msgcat::mcset uk "Stream error (%s): %s" "Помилка потоку (%s): %s" ::msgcat::mcset uk "Stream error: %s" "Помилка потоку: %s" ::msgcat::mcset uk "System shutdown" "Ð—Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ ÑиÑтеми" ::msgcat::mcset uk "Unsupported encoding" "ÐšÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ підтримуєтьÑÑ" ::msgcat::mcset uk "Unsupported stanza type" "Ðепідтримуваний тип Ñтанці" ::msgcat::mcset uk "Unsupported version" "Ðепідтримувана верÑÑ–Ñ" ::msgcat::mcset uk "XML not well-formed" "Ðевірно Ñформований XML" # ./plugins/general/rawxml.tcl ::msgcat::mcset uk "Not connected" "Від'єднаний" ::msgcat::mcset uk "Show all connections" "Показати вÑÑ– з'єднаннÑ" ::msgcat::mcset uk "Show stanzas for all (current and past) connections in\ Raw XML window." "Показувати Ñтанці Ð´Ð»Ñ Ð²ÑÑ–Ñ… (теперішніх та минулих)\ з'єднань у вікні 'Сирий XML'." # ./proxy.tcl ::msgcat::mcset uk "Add proxy" "Додати прокÑÑ–" ::msgcat::mcset uk "Exclude:" "Виключити:" ::msgcat::mcset uk "HTTP" "HTTP" ::msgcat::mcset uk "HTTP proxies" "HTTP-прокÑÑ–" ::msgcat::mcset uk "Match:" "Співпадають:" ::msgcat::mcset uk "Save" "Зберегти" ::msgcat::mcset uk "Serialized array of proxy servers to connect via."\ "ПорÑдок прокÑÑ–-Ñерверів Ð´Ð»Ñ Ð·'єднаннÑ" ::msgcat::mcset uk "Tunnel proxies" "Тунельні прокÑÑ–" # ./tclxmpp/xmpp/socks5.tcl ::msgcat::mcset uk "Address type not supported" "Такий тип адреÑи не\ підтримуєтьÑÑ" ::msgcat::mcset uk "Command not supported" "Команда не підтримуєтьÑÑ" ::msgcat::mcset uk "Connection not allowed by ruleset" "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð·Ð°Ð±Ð¾Ñ€Ð¾Ð½ÐµÐ½Ð¾\ правилами" ::msgcat::mcset uk "Failed to read SOCKS5 authorization methods response" "Ðе\ вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ відповідь про методи авторизації від SOCKS5" ::msgcat::mcset uk "Failed to read SOCKS5 authorization response" "Ðе вдалоÑÑ\ прочитати відповідь про авторизацію від SOCKS5" ::msgcat::mcset uk "Failed to read SOCKS5 connection response" "Ðе вдалоÑÑ\ прочитати відповідь від SOCKS5 на запит про з'єднаннÑ" ::msgcat::mcset uk "Failed to read SOCKS5 destination address type" "Ðе\ вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ тип адреÑи Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ SOCKS5" ::msgcat::mcset uk "Failed to read SOCKS5 destination domain" "Ðе вдалоÑÑ\ прочитати обраний домен SOCKS5" ::msgcat::mcset uk "Failed to read SOCKS5 destination domain length" "Ðе\ вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ довжину обраного домена SOCKS5" ::msgcat::mcset uk "Failed to read SOCKS5 destination IPv4 address and port"\ "Ðе вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ IPv4 адреÑу та порт віддаленого Ñервера SOCKS5" ::msgcat::mcset uk "Failed to read SOCKS5 destination IPv6 address and port"\ "Ðе вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ IPv6 адреÑу та порт віддаленого Ñервера SOCKS5" ::msgcat::mcset uk "Failed to read SOCKS5 destination port" "Ðе вдалоÑÑ\ прочитати віддалений порт SOCKS5" ::msgcat::mcset uk "Failed to send SOCKS5 authorization methods request" "Ðе\ вдалоÑÑ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð¸Ñ‚Ð¸ запит про Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¼ÐµÑ‚Ð¾Ð´Ñ–Ð² авторизації в SOCKS5" ::msgcat::mcset uk "Failed to send SOCKS5 authorization request" "Ðе вдалоÑÑ\ відправити запит про авторизацію в SOCKS5" ::msgcat::mcset uk "Failed to send SOCKS5 connection request" "Ðе вдалоÑÑ\ відправити запит про з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ SOCKS5" ::msgcat::mcset uk "General SOCKS server failure" "Загальна помилка SOCKS\ Ñервера" ::msgcat::mcset uk "Incorrect SOCKS5 server version" "Ðевірна верÑÑ–Ñ SOCKS5\ Ñервера" ::msgcat::mcset uk "SOCKS5 negotiation timed out" "Ð§Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ð¾Ð²Ð¾Ñ€Ñƒ\ з прокÑÑ–-Ñервером типу SOCKS5 вийшов" ::msgcat::mcset uk "SOCKS5 proxy negotiation aborted" "Переговори з\ прокÑÑ–-Ñервером типу SOCKS5 перервано" ::msgcat::mcset uk "SOCKS5 server authorization failed" "Ðе вдалоÑÑ\ авторизуватиÑÑ Ð½Ð° SOCKS5 Ñервері" ::msgcat::mcset uk "SOCKS5 server authorization required" "SOCKS5 Ñервер\ потребує авторизації" ::msgcat::mcset uk "Unknown SOCKS5 destination address type" "Ðевідомий тип\ адреÑи SOCKS5" ::msgcat::mcset uk "Unsupported SOCKS5 authorization method" "Такий метод\ авторизації в SOCKS5 не підтримуєтьÑÑ" # ./plugins/pep/user_location.tcl ::msgcat::mcset uk "\n\tLocation: %s : %s" "\n\tМіÑцезнаходженнÑ: %s : %s" ::msgcat::mcset uk "\n\tUser location subscription: %s" "\n\tПідпиÑка на\ міÑцезнаходженнÑ: %s" ::msgcat::mcset uk "%s's location changed to %s : %s" "МіÑÑ†ÐµÐ·Ð½Ð°Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ %s\ змінилоÑÑ Ð½Ð° %s : %s" ::msgcat::mcset uk "%s's location is unset" "МіÑÑ†ÐµÐ·Ð½Ð°Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ %s не\ пропиÑано" ::msgcat::mcset uk "Altitude:" "ВиÑота:" ::msgcat::mcset uk "Area:" "МіÑце:" ::msgcat::mcset uk "Auto-subscribe to other's user location" "ÐвтопідпиÑатиÑÑ\ на міÑÑ†ÐµÐ·Ð½Ð°Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ñ–Ð½ÑˆÐ¸Ñ… Ñпіврозмовників" ::msgcat::mcset uk "Auto-subscribe to other's user location notifications."\ "ÐвтопідпиÑатиÑÑ Ð½Ð° Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ міÑÑ†ÐµÐ·Ð½Ð°Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ñ–Ð½ÑˆÐ¸Ñ…\ Ñпіврозмовників" ::msgcat::mcset uk "Bearing:" "ÐапрÑм:" ::msgcat::mcset uk "Building:" "Будинок:" ::msgcat::mcset uk "Floor:" "Поверх:" ::msgcat::mcset uk "GPS datum:" "СиÑтема координат GPS:" ::msgcat::mcset uk "Horizontal GPS error:" "Горизонтальна похибка GPS" ::msgcat::mcset uk "Locality:" "ÐаÑелений пункт:" ::msgcat::mcset uk "Publish user location..." "Публікувати\ міÑцезнаходженнÑ..." ::msgcat::mcset uk "Region:" "Регіон:" ::msgcat::mcset uk "Room:" "Група:" ::msgcat::mcset uk "Speed:" "ШвидкіÑть:" ::msgcat::mcset uk "Street:" "ВулицÑ:" ::msgcat::mcset uk "Timestamp:" "Дата:" ::msgcat::mcset uk "Unpublish user location" "Відмінити публікацію\ міÑцезнаходженнÑ" ::msgcat::mcset uk "Unpublish user location..." "Відмінити публікацію\ міÑцезнаходженнÑ..." ::msgcat::mcset uk "User location" "МіÑцезнаходженнÑ" ::msgcat::mcset uk "User location publishing failed: %s" "Ðе вдалоÑÑ\ опублікувати міÑцезнаходженнÑ: %s" ::msgcat::mcset uk "User location unpublishing failed: %s" "Ðе вдалоÑÑ\ відмінити публікацію міÑцезнаходженнÑ: %s" # ./presence.tcl ::msgcat::mcset uk "Invalid userstatus value %s" "Ðевірне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÑтатуÑу\ %s" # ./tclxmpp/xmpp/sasl.tcl - few skipped ::msgcat::mcset uk "Authentication succeeded" "Ðвторизований уÑпішно" ::msgcat::mcset uk "Cannot forbid digest mechanisms" "Ðеможливо заборонити\ механізм авторизації з передаваннÑм зашифрованого паролю" ::msgcat::mcset uk "Missing option \"-username\" or \"-domain\"" "ВідÑутній\ параметр \"-username\" чи \"-domain\"" ::msgcat::mcset uk "No SASL package found" "Ðе знайдено бібліотеку SASL" ::msgcat::mcset uk "Only one option \"-username\" or \"-domain\" is allowed"\ "Дозволено викориÑтовувати лише один параметр - \"-username\" чи\ \"-domain\"" ::msgcat::mcset uk "SASL auth error:\n%s" "Помилка авторизації через\ SASL:\n%s" ::msgcat::mcset uk "SASL authentication aborted" "Ðвторизацію через SASL\ перервано" ::msgcat::mcset uk "SASL authentication timed out" "Ðвторизацію через SASL\ перервано через тайм-аут" ::msgcat::mcset uk "Server hasn't provided SASL authentication feature"\ "Сервер не підтримує авторизацію через SASL" ::msgcat::mcset uk "Server provided mechanism %s. It is forbidden" "Сервер\ надав механізм %s, але він Ñ” забороненим" ::msgcat::mcset uk "Server provided mechanisms %s. They are forbidden"\ "Сервер надав механізми %s, але вони Ñ” забороненими" ::msgcat::mcset uk "Server provided no SASL mechanisms" "Сервер не надав\ механізмів SASL" ::msgcat::mcset uk "SASL callback error: client needs to write \"%s\"" ::msgcat::mcset uk "SASL step error: %s" # ./tclxmpp/xmpp/compress.tcl ::msgcat::mcset uk "Compression aborted" "СтиÑÐºÐ°Ð½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÑƒ перервано" ::msgcat::mcset uk "Compression timed out" "СтиÑÐºÐ°Ð½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÑƒ перервано через\ тайм-аут" ::msgcat::mcset uk "Server hasn't provided compress feature" "Сервер не вміє\ ÑтиÑкати потік" ::msgcat::mcset uk "Server hasn't provided supported compress method" "Сервер\ не має методів ÑтиÑканнÑ, що підтримуютьÑÑ Tkabber" # ./plugins/general/clientinfo.tcl ::msgcat::mcset uk "Options for Client Info module, which allows you to\ automatically retrieve client names and versions for contacts in your\ roster." "Параметри Ð¼Ð¾Ð´ÑƒÐ»Ñ Client Info, Ñкі дозволÑють автоматично\ отримувати імена контактів з роÑтеру та верÑÑ–Ñ— клієнтів, що\ викориÑтовуютьÑÑ Ð½Ð¸Ð¼Ð¸." # ./plugins/chat/draw_timestamp.tcl ::msgcat::mcset uk "Format of timestamp in chat message. Refer to Tcl\ documentation of 'clock' command for description of\ format.\n\nExamples:\n \[%R\] - \[20:37\]\n \[%T\] - \[20:37:12\]\n \ \[%a %b %d %H:%M:%S %Z %Y\] - \[Thu Jan 01 03:00:00 MSK 1970\]"\ "Формат дати у вікні чату. ДивітьÑÑ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ñ–ÑŽ Tcl про команду\ 'clock', що міÑтить інформацію про шифр дати.\n\nÐаприклад:\n \[%R\]\ - \[20:37\]\n \[%T\] - \[20:37:12\]\n \[%a %b %d %H:%M:%S %Z %Y\] -\ \[Thu Jan 01 03:00:00 EST 1970\]" # ./plugins/pep/user_mood.tcl ::msgcat::mcset uk "\n\tMood: %s" "\n\tÐаÑтрій: %s" ::msgcat::mcset uk "\n\tUser mood subscription: %s" "\n\tПідпиÑка на наÑтрій:\ %s" ::msgcat::mcset uk "%s's mood changed to %s" "ÐаÑтрій %s змінивÑÑ Ð½Ð° %s" ::msgcat::mcset uk "%s's mood is unset" "ÐаÑтрій %s - невизначений" ::msgcat::mcset uk "afraid" "перелÑканий" ::msgcat::mcset uk "amazed" "вражений" ::msgcat::mcset uk "angry" "розгніваний" ::msgcat::mcset uk "annoyed" "роздратований" ::msgcat::mcset uk "anxious" "Ñтурбований" ::msgcat::mcset uk "aroused" "розбуджений" ::msgcat::mcset uk "ashamed" "приÑоромлений" ::msgcat::mcset uk "Auto-subscribe to other's user mood" "ÐвтопідпиÑатиÑÑ Ð½Ð°\ наÑтрій інших Ñпіврозмовників" ::msgcat::mcset uk "Auto-subscribe to other's user mood notifications."\ "ÐвтопідпиÑатиÑÑ Ð½Ð° Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ наÑтрій інших Ñпіврозмовників" ::msgcat::mcset uk "bored" "нудьгую" ::msgcat::mcset uk "brave" "Ñміливий" ::msgcat::mcset uk "calm" "Ñпокійний" ::msgcat::mcset uk "Cannot publish empty mood" "Ðеможливо опублікувати\ невизначений наÑтрій" ::msgcat::mcset uk "cold" "байдужий" ::msgcat::mcset uk "confused" "збентежений" ::msgcat::mcset uk "contented" "задоволений" ::msgcat::mcset uk "cranky" "невдоволений" ::msgcat::mcset uk "curious" "допитливий" ::msgcat::mcset uk "depressed" "пригнічений" ::msgcat::mcset uk "disappointed" "розчарований" ::msgcat::mcset uk "disgusted" "огидний" ::msgcat::mcset uk "distracted" "ошалілий" ::msgcat::mcset uk "embarrassed" "збентежений" ::msgcat::mcset uk "excited" "збуджений" ::msgcat::mcset uk "flirtatious" "кокетливий" ::msgcat::mcset uk "frustrated" "розпач" ::msgcat::mcset uk "grumpy" "Ñердитий" ::msgcat::mcset uk "guilty" "винний" ::msgcat::mcset uk "happy" "щаÑливий" ::msgcat::mcset uk "hot" "запальний" ::msgcat::mcset uk "humbled" "Ñкромний" ::msgcat::mcset uk "humiliated" "принижений" ::msgcat::mcset uk "hungry" "голодний" ::msgcat::mcset uk "hurt" "поранений" ::msgcat::mcset uk "impressed" "вражений" ::msgcat::mcset uk "in_awe" "трепітливий" ::msgcat::mcset uk "in_love" "закоханий" ::msgcat::mcset uk "indignant" "обурений" ::msgcat::mcset uk "interested" "зацікавлений" ::msgcat::mcset uk "intoxicated" "Ñп'Ñнілий" ::msgcat::mcset uk "invincible" "непереможний" ::msgcat::mcset uk "jealous" "ревнивий" ::msgcat::mcset uk "lonely" "Ñамотній" ::msgcat::mcset uk "mean" "підлий" ::msgcat::mcset uk "Mood" "ÐаÑтрій" ::msgcat::mcset uk "Mood:" "ÐаÑтрій:" ::msgcat::mcset uk "moody" "похмурий" ::msgcat::mcset uk "nervous" "нервовий" ::msgcat::mcset uk "neutral" "нейтральний" ::msgcat::mcset uk "offended" "ображений" ::msgcat::mcset uk "playful" "грайливий" ::msgcat::mcset uk "proud" "гордий" ::msgcat::mcset uk "Publish user mood..." "Публікувати наÑтрій..." ::msgcat::mcset uk "relieved" "заÑпокоєний" ::msgcat::mcset uk "remorseful" "Ñпівчутливий" ::msgcat::mcset uk "restless" "невгамовний" ::msgcat::mcset uk "sad" "Ñумний" ::msgcat::mcset uk "sarcastic" "ÑаркаÑтичний" ::msgcat::mcset uk "serious" "Ñерйозний" ::msgcat::mcset uk "shocked" "шокований" ::msgcat::mcset uk "shy" "боÑзкий" ::msgcat::mcset uk "sick" "хворобливий" ::msgcat::mcset uk "sleepy" "Ñонливий" ::msgcat::mcset uk "stressed" "напружений" ::msgcat::mcset uk "surprised" "здивований" ::msgcat::mcset uk "thirsty" "Ñпраглий" ::msgcat::mcset uk "Unpublish user mood" "Відмінити публікацію наÑтрою" ::msgcat::mcset uk "Unpublish user mood..." "Відмінити публікацію наÑтрою..." ::msgcat::mcset uk "User mood" "ÐаÑтрій" ::msgcat::mcset uk "User mood publishing failed: %s" "Ðе вдалоÑÑ Ð¾Ð¿ÑƒÐ±Ð»Ñ–ÐºÑƒÐ²Ð°Ñ‚Ð¸\ наÑтрій: %s" ::msgcat::mcset uk "User mood unpublishing failed: %s" "Ðе вдалоÑÑ Ð²Ñ–Ð´Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸\ публікацію наÑтрою: %s" ::msgcat::mcset uk "worried" "Ñтурбований" # ./plugins/roster/bkup_annotations.tcl ::msgcat::mcset uk "Error restoring annotations: %s" "Помилка відновленнÑ\ анотацій: %s" # ./plugins/general/copy_jid.tcl ::msgcat::mcset uk "Copy real JID to clipboard" "Копіювати реальний JID" # ./tclxmpp/xmpp/register.tcl ::msgcat::mcset uk "Date" "Дата" ::msgcat::mcset uk "Key" "Ключ" ::msgcat::mcset uk "Misc" "Різне" ::msgcat::mcset uk "Password" "Пароль" ::msgcat::mcset uk "Phone" "Телефон" ::msgcat::mcset uk "Text" "ТекÑÑ‚" ::msgcat::mcset uk "Username" "ПÑевдонім" ::msgcat::mcset uk "Zip" "ІндекÑ" # ./plugins/roster/fetch_nicknames.tcl ::msgcat::mcset uk "Fetch nicknames of all users in group" "Отримати вÑÑ–\ пÑевдоніми у цій групі" # Updated 2015-12-13 # ./ifacetk/systray.tcl ::msgcat::mcset uk "Change icon on other users groupchat messages."\ "Змінювати іконку при повідомленнÑÑ… від інших кориÑтувачів\ конференцій." ::msgcat::mcset uk "On any messages (including service messages)" "Ð”Ð»Ñ Ð²ÑÑ–Ñ…\ повідомлень (включаючи Ñлужбові)" ::msgcat::mcset uk "On conference and personal messages" "Ð”Ð»Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ в\ конференціÑÑ… та оÑобиÑтих повідомлень" ::msgcat::mcset uk "On personal messages only" "Тільки Ð´Ð»Ñ Ð¾ÑобиÑтих\ повідомлень" ::msgcat::mcset uk "Turn blinking off" "Вимкнути миганнÑ" # ./plugins/chat/info_commands.tcl ::msgcat::mcset uk "Pong from %s%s: %.2f seconds" "Ð§Ð°Ñ Ð½Ð° відповідь %s%s:\ %.2f Ñекунди" ::msgcat::mcset uk "Pong from %s%s: %s" "Ð§Ð°Ñ Ð½Ð° відповідь %s%s: %s" # ./plugins/chat/chatstate.tcl ::msgcat::mcset uk "Ignore mass chat state notifications in multi-user\ chatrooms." "Ігнорувати маÑові нотифікації про Ñтан вікон розмови в\ групових конференціÑÑ…." # ./ifacetk/login.tcl ::msgcat::mcset uk "BOSH" "BOSH" ::msgcat::mcset uk "Connect via BOSH" "ПідключатиÑÑ Ð·Ð° допомогою BOSH" ::msgcat::mcset uk "URL to use:" "URL Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ:" ::msgcat::mcset uk "Use stream management" "ВикориÑтовувати керуваннÑ\ потоком" # ./plugins/general/disco.tcl ::msgcat::mcset uk "Number of children:" "ЧиÑло гілок:" # ./plugins/general/headlines.tcl ::msgcat::mcset uk "Following" "Переходу за поÑиланнÑм" ::msgcat::mcset uk "Mark headline read by" "Помічати новину Ñк прочитану по" ::msgcat::mcset uk "Selection" "Виділенню" ::msgcat::mcset uk "Timeout " "Таймауту" ::msgcat::mcset uk "Headline read timeout value (in seconds)." # ./roster.tcl ::msgcat::mcset uk "Cache roster items offline and use roster versioning if\ supported by a server." "Кешувати елементи ÑпиÑку контактів Ñ–\ викориÑтовувати верÑÑ–ÑŽÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ñ–Ð², Ñкщо воно підтримуєтьÑÑ\ Ñервером." # ./plugins/chat/log_on_open.tcl ::msgcat::mcset uk "Show several most recently received messages in a newly\ opened chat window. They are taken from the logs, so you'll have to\ enable them for chats." "Показувати декілька оÑтанніх повідомлень у\ знову відчинÑємому вікні розмови. Вони берутьÑÑ Ð· журналу, тому ви\ повинні ввімкнути Ñ—Ñ… Ð´Ð»Ñ Ð¾ÑобиÑтих розмов." ::msgcat::mcset uk "Show several most recently received messages in a newly\ opened conference window. They are taken from the logs, so you'll\ have to enable them for groupchat." "Показувати декілька оÑтанніх\ повідомлень у знову відчинÑємому вікні конференції. Вони берутьÑÑ Ð·\ журналу, тому ви повинні ввімкнути Ñ—Ñ… Ð´Ð»Ñ ÐºÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ñ–Ð¹." # ./muc.tcl ::msgcat::mcset uk "Configure room %s" "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ ÐºÑ–Ð¼Ð½Ð°Ñ‚Ð¸ %s" # ./tclxmpp/xmpp/stanzaerror.tcl ::msgcat::mcset uk "Authorization error" "Помилка авторизації" # ./ifacetk/muc.tcl ::msgcat::mcset uk "Edit room info..." "Редагувати інформацію про\ конференцію..." ::msgcat::mcset uk "Update list" "Поновити ÑпиÑок" # ./plugins/general/gpgme.tcl ::msgcat::mcset uk "%s purportedly signed by %s using key 0x%s can't be\ verified: %s." "Те, що %s підпиÑано %s з викориÑтаннÑм ключа 0x%s,\ неможливо перевірити: %s." ::msgcat::mcset uk "Add the recipient's JID and timestamp to the GPG-signed\ or encrypted outgoing messages. This prevents replay attacks." \ "Додавати JID отримувача та наÑвний Ñ‡Ð°Ñ Ð´Ð¾ повідомлень, підпиÑаних\ за допомогою GPG. Це дозволÑÑ” запобігти атаці повторними повідомленнÑми." ::msgcat::mcset uk "Encrypt messages (when possible)" "Шифрувати повідомленнÑ\ (де можливо)" ::msgcat::mcset uk "GPG-sign outgoing groupchat messages." "ПідпиÑувати\ вихідні Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð· допомогою GPG у конференціÑÑ…." ::msgcat::mcset uk "GPG-sign outgoing personal messages." "ПідпиÑувати\ оÑобиÑті вихідні Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð· допомогою GPG." ::msgcat::mcset uk "GPG-sign outgoing presence updates." "ПідпиÑувати вихідні\ Ð¿Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸ÑутноÑті з допомогою GPG." ::msgcat::mcset uk "Sign presence updates" "ПідпиÑувати поновленнÑ\ приÑутноÑті" ::msgcat::mcset uk "Toggle signing presence updates" "Ввімкн./вимкн. підпиÑ\ поновлень приÑутноÑті" ::msgcat::mcset uk "Select room %s participants for encrypting traffic to" \ "Виберіть учаÑників коференції %s, Ð´Ð»Ñ ÐºÐ¾Ð³Ð¾ ви будете шифрувати\ повідомленнÑ" ::msgcat::mcset uk "not actually changed" "не змінивÑÑ" ::msgcat::mcset uk "entirely new key" "зовÑім новий ключ" ::msgcat::mcset uk "new user IDs" "нові ID кориÑтувача" ::msgcat::mcset uk "new signatures" "нові підпиÑи" ::msgcat::mcset uk "new subkeys" "нові підключі" ::msgcat::mcset uk "contains private key" "міÑтить закритий ключ" ::msgcat::mcset uk "%s purportedly signed by %s can't be verified: %s." "Те,\ що %s підпиÑано %s, неможливо перевірити: %s." ::msgcat::mcset uk "GPG error" "Помилка GPG" # ./plugins/general/autoaway.tcl ::msgcat::mcset uk "Stored user priority while she's away." "Збережений\ пріоритет кориÑтувача доки вона в Ñтані \"відійшла\"" ::msgcat::mcset uk "Stored user status while she's away." "Збережений ÑтатуÑ\ кориÑтувача доки вона в Ñтані \"відійшла\"" ::msgcat::mcset uk "Stored user text status while she's away." "Збережений\ текÑтовий ÑÑ‚Ð°Ñ‚ÑƒÑ ÐºÐ¾Ñ€Ð¸Ñтувача доки вона в Ñтані \"відійшла\"" # ./login.tcl ::msgcat::mcset uk "Autologin to the server" "ÐвтопідключатиÑÑ Ð´Ð¾ Ñервера" ::msgcat::mcset uk "Don't show the login window" "Ðе показувати вікно\ підключеннÑ" ::msgcat::mcset uk "Interval server can wait before responding to BOSH\ request (in milliseconds)." "Інтервал, протÑгом Ñкого Ñервер може\ очікувати перед тим, Ñк відповіÑти на запит BOSH (у міліÑекундах)." ::msgcat::mcset uk "Maximum number of requests the connection manager is\ allowed to keep waiting at any time." "МакÑимальна кількіÑть запитів,\ Ñкі менеджер підключень може тримати у Ñтані Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñƒ будь-Ñкий\ чаÑ." ::msgcat::mcset uk "Number of BOSH client security keys to send before\ creating new key sequence." "ЧиÑло ключів безпеки клієнта BOSH, піÑлÑ\ переÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñкого Ñерверу генеруєтьÑÑ Ð½Ð¾Ð²Ð° поÑлідовніÑть ключів." ::msgcat::mcset uk "Show the login window" "Показувати вікно підключеннÑ" ::msgcat::mcset uk "Timeout for waiting for BOSH responses (if set to zero,\ Tkabber will wait forever)." "Таймаут Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ñ– на запит\ BOSH (Ñкщо вÑтановлений у нуль, то Tkabber буде очікувати необмежено\ довго)." ::msgcat::mcset uk "URL to connect to using BOSH." "URL Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð·\ допомогою BOSH." ::msgcat::mcset uk "Use BOSH client security keys (recommended)."\ "ВикориÑтовувати ключі безпеки BOSH (рекомендовано)." ::msgcat::mcset uk "Use BOSH connection method." "ВикориÑтовувати підключеннÑ\ BOSH (Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð· допомогою HTTP)." ::msgcat::mcset uk "Use stream management protocol to acknowledge any stanza\ received from and sent to the server." "ВикориÑтовувати керуваннÑ\ потоком Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ð°ÐºÐµÑ‚Ñ–Ð², отриманих від Ñервера та\ відправлених на Ñервер." ::msgcat::mcset uk "Whether to automatically login to server or show the\ login window." "ПідключатиÑÑ Ð´Ð¾ Ñервера автоматично, чи показувати\ вікно з діалогом підключеннÑ." # ./plugins/general/captcha.tcl ::msgcat::mcset uk "CAPTCHA from %s" "Капча від %s" # ./tclxmpp/xmpp/sm.tcl ::msgcat::mcset uk "Option -command is mandatory" "ÐžÐ¿Ñ†Ñ–Ñ -command Ñ”\ обов'Ñзковою" ::msgcat::mcset uk "Server hasn't provided stream management feature" "Сервер\ не підтримує ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÐ¾Ð¼" ::msgcat::mcset uk "Stream management negotiation aborted" "УзгодженнÑ\ ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÐ¾Ð¼ перервано" ::msgcat::mcset uk "Stream management negotiation failed" "Ðе вдалоÑÑ\ узгодити ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÐ¾Ð¼" ::msgcat::mcset uk "Stream management negotiation successful" "УзгодженнÑ\ ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÐ¾Ð¼ уÑпішне" ::msgcat::mcset uk "Stream management negotiation timed out" "КеруваннÑ\ потоком перерване за таймаутом" # ./plugins/iq/ping.tcl ::msgcat::mcset uk "Both TCP based and HTTP based connections" "ДлÑ\ підключень Ñк по TCP, так Ñ– по HTTP" ::msgcat::mcset uk "No" "ÐÑ–" ::msgcat::mcset uk "Only TCP based connections" "Тільки Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½ÑŒ по\ TCP" # ./plugins/chat/muc_ignore.tcl ::msgcat::mcset uk "%s was ignored" "%s тепер ігноруєтьÑÑ" ::msgcat::mcset uk "%s was unignored" "%s тепер не ігноруєтьÑÑ" # ./proxy.tcl ::msgcat::mcset uk "Currently active profile" "Поточний діючий профіль" ::msgcat::mcset uk "Default empty profile" "Порожній профіль за\ замовчуваннÑм" ::msgcat::mcset uk "Profile from config file" "Профіль з конфігураційного\ файлу" #================================================================== namespace eval :: { proc load_ukrainian_procs {} { rename format_time "" rename uk_format_time format_time } proc uk_word_form {t} { set modt [expr {$t % 10}] if {($t >= 10) && ($t < 20)} { return 0 } elseif {$modt == 1} { return 1 } elseif {($modt >= 2) && ($modt <= 4)} { return 2 } else { return 0 } } proc uk_format_time {t} { if {[string equal $t ""]} { return } set sec [expr {$t % 60}] set secs [lindex {"Ñекунд" "Ñекунда" "Ñекунди"} [uk_word_form $sec]] set t [expr {$t / 60}] set min [expr {$t % 60}] set mins [lindex {"хвилин" "хвилина" "хвилини"} [uk_word_form $min]] set t [expr {$t / 60}] set hour [expr {$t % 24}] set hours [lindex {"годин" "година" "години"} [uk_word_form $hour]] set day [expr {$t / 24}] set days [lindex {"днів" "день" "дні"} [uk_word_form $day]] set flag 0 set message "" if {$day != 0} { set flag 1 set message "$day $days" } if {$flag || ($hour != 0)} { set flag 1 set message [concat $message "$hour $hours"] } if {$flag || ($min != 0)} { set message [concat $message "$min $mins"] } return [concat $message "$sec $secs"] } hook::add postload_hook load_ukrainian_procs } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/msgs/uk.rc000064400000000000000000000030231477701321300137650ustar00nobodynobody! uk.rc -- ! ! Definition of Ukrainian resources for BWidget ! ! Author: Artem Bondarenko ! --- symbolic names of buttons ----------------------------------------------- *abortName: Перервати *retryName: Повторити *ignoreName: Ігнорувати *okName: Продовжити *cancelName: Відмінити *yesName: Так *noName: ÐÑ– ! --- symbolic names of label of SelectFont dialog ---------------------------- *boldName: Ðапівжирний *italicName: КурÑивний *underlineName: ПідкреÑлений *overstrikeName: ПерекреÑлений *fontName: Шрифт *sizeName: Розмір *styleName: ВиглÑд ! --- symbolic names of label of PasswdDlg dialog ----------------------------- *loginName: Ім'Ñ *passwordName: Пароль ! --- resource for SelectFont dialog ------------------------------------------ *SelectFont.title: Вибір шрифту *SelectFont.sampletext: Sample text, приклад текÑту ! --- resource for MessageDlg dialog ------------------------------------------ *MessageDlg.noneTitle: ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ *MessageDlg.infoTitle: Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ *MessageDlg.questionTitle: ÐŸÐ¸Ñ‚Ð°Ð½Ð½Ñ *MessageDlg.warningTitle: Увага! *MessageDlg.errorTitle: Помилка ! --- resource for PasswdDlg dialog ------------------------------------------- *PasswdDlg.title: Ð£Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ–Ð¼ÐµÐ½Ñ– та паролю ! vim:ft=xdefaults:ts=8:sw=4:sts=4:et tkabber/muc.tcl000064400000000000000000001044241477701321300133460ustar00nobodynobody# muc.tcl -- # # Multi-User Chat support (XEP-0045) package require xmpp::muc namespace eval muc { variable winid 0 custom::defvar options(gen_enter_exit_msgs) 1 \ [::msgcat::mc "Generate status messages when occupants\ enter/exit MUC compatible conference rooms."] \ -type boolean -group Chat custom::defvar options(gen_muc_status_change_msgs) 0 \ [::msgcat::mc "Generate groupchat messages when occupant\ changes his/her status and/or status message."] \ -type boolean -group Chat custom::defvar options(gen_muc_position_change_msgs) 0 \ [::msgcat::mc "Generate groupchat messages when occupant's\ room position (affiliation and/or role) changes."] \ -type boolean -group Chat custom::defvar options(propose_configure) 0 \ [::msgcat::mc "Propose to configure newly created MUC room.\ If set to false then the default room configuration\ is automatically accepted."] \ -type boolean -group Chat custom::defvar options(history_maxchars) 10000 \ [::msgcat::mc "Maximum number of characters in the history in MUC\ compatible conference rooms."] \ -type integer -group Chat custom::defvar options(history_maxstanzas) 20 \ [::msgcat::mc "Maximum number of stanzas in the history in MUC\ compatible conference rooms."] \ -type integer -group Chat custom::defvar options(request_only_unseen_history) 1 \ [::msgcat::mc "Request only unseen (which aren't displayed in the\ chat window) messages in the history in MUC compatible\ conference rooms."] \ -type boolean -group Chat custom::defvar options(retry_with_different_nick) 0 \ [::msgcat::mc "Retry to join MUC room with a different nickname\ (with added _ suffix) in case of name conflicts."] \ -type boolean -group Chat custom::defvar options(report_muc_rooms) 0 \ [::msgcat::mc "Report the list of current MUC rooms on\ disco#items query."] \ -type boolean -group IQ } set ::NS(muc) http://jabber.org/protocol/muc set ::NS(muc#owner) http://jabber.org/protocol/muc#owner set ::NS(muc#user) http://jabber.org/protocol/muc#user set ::NS(muc#rooms) http://jabber.org/protocol/muc#rooms ############################################################################### proc set_our_groupchat_nick {chatid nick} { global groupchats debugmsg conference "SET NICK: $chatid '$nick'" set xlib [chat::get_xlib $chatid] set group [::xmpp::jid::normalize [chat::get_jid $chatid]] set groupchats(nick,$xlib,$group) $nick } proc get_our_groupchat_nick {chatid} { global groupchats debugmsg conference "GET NICK: $chatid" set xlib [chat::get_xlib $chatid] set group [::xmpp::jid::normalize [chat::get_jid $chatid]] return $groupchats(nick,$xlib,$group) } ############################################################################### proc muc::get_real_jid {xlib jid} { variable tokens set group [::xmpp::jid::removeResource $jid] set nick [::xmpp::jid::resource $jid] set chatid [chat::chatid $xlib $group] if {![info exists tokens($chatid)]} { return "" } else { return [::xmpp::muc::realJid $tokens($chatid) $nick] } } proc muc::get_affiliation {xlib jid} { variable tokens set group [::xmpp::jid::removeResource $jid] set nick [::xmpp::jid::resource $jid] set chatid [chat::chatid $xlib $group] if {![info exists tokens($chatid)]} { return "" } else { return [::xmpp::muc::affiliation $tokens($chatid) $nick] } } proc muc::get_role {xlib jid} { variable tokens set group [::xmpp::jid::removeResource $jid] set nick [::xmpp::jid::resource $jid] set chatid [chat::chatid $xlib $group] if {![info exists tokens($chatid)]} { return "" } else { return [::xmpp::muc::role $tokens($chatid) $nick] } } proc muc::whois {xlib user reschatid} { set group [::xmpp::jid::stripResource $user] set chatid [chat::chatid $xlib $group] set nick [chat::get_nick $xlib $user groupchat] set real_jid [get_real_jid $xlib $user] if {$real_jid != ""} { chat::add_message $reschatid $group info \ [::msgcat::mc "whois '%s': %s" $nick $real_jid] {} } else { chat::add_message $reschatid $group error \ [::msgcat::mc "whois '%s': no info" $nick] {} } } ############################################################################### proc muc::change_item_attr {xlib user attr value dir reason reschatid} { variable tokens set group [::xmpp::jid::stripResource $user] set chatid [chat::chatid $xlib $group] set nick [chat::get_nick $xlib $user groupchat] if {![info exists tokens($chatid)]} { chat::add_message $reschatid $group error \ "$attr $value '$nick':\ [::msgcat::mc {You must join the room to set %s} $attr]" {} return } set args [list -command \ [list muc::test_error_res \ "$attr $value '$nick'" $xlib $group $reschatid]] if {![string equal $reason ""]} { lappend args -reason $reason } switch -- $attr/$dir { affiliation/up { set command ::xmpp::muc::raiseAffiliation } affiliation/down { set command ::xmpp::muc::lowerAffiliation } role/up { set command ::xmpp::muc::raiseRole } role/down { set command ::xmpp::muc::lowerRole } } eval [list $command $tokens($chatid) $nick $value] $args } ############################################################################### proc muc::unban {xlib group jid} { ::xmpp::muc::unsetOutcast $xlib $group $jid \ -command [list muc::test_unban_res $xlib $group $jid] } proc muc::test_unban_res {xlib group jid status msg} { switch -- $status { ok { chat::add_message [chat::chatid $xlib $group] $group info \ [format "affiliation none '%s': %s" \ $jid [::msgcat::mc "User is unbanned"]] {} } default { chat::add_message [chat::chatid $xlib $group] $group error \ [format "affiliation none '%s': %s" \ $jid [error_to_string $msg]] {} } } } ############################################################################### proc muc::request_config_dialog {chatid} { variable winid set w .muc_req_config$winid incr winid if {[winfo exists $w]} { destroy $w } Dialog $w -title [::msgcat::mc "Room is created"] \ -modal none -anchor e -default 0 -cancel 1 set wf [$w getframe] Message $wf.message -aspect 50000 \ -text [::msgcat::mc "Room %s is successfully created" \ [chat::get_jid $chatid]] pack $wf.message -pady 2m $w add -text [::msgcat::mc "Configure room"] \ -command "[list destroy $w] [list [namespace current]::request_config $chatid]" $w add -text [::msgcat::mc "Accept default config"] \ -command "[list destroy $w] [list [namespace current]::request_instant_room $chatid]" $w draw } proc muc::request_instant_room {chatid} { ::xmpp::sendIQ [chat::get_xlib $chatid] set \ -query [::xmpp::xml::create query \ -xmlns $::NS(muc#owner) \ -subelement [::xmpp::data::submitForm {}]] \ -to [chat::get_jid $chatid] } proc muc::request_config {chatid} { ::xmpp::sendIQ [chat::get_xlib $chatid] get \ -query [::xmpp::xml::create query \ -xmlns $::NS(muc#owner)] \ -to [chat::get_jid $chatid] \ -command [list muc::receive_config $chatid] } proc muc::receive_config {chatid res child} { set group [chat::get_jid $chatid] if {![string equal $res ok]} { chat::add_message $chatid $group error \ [::msgcat::mc "Configure form: %s" [error_to_string $child]] \ {} return } ::xmpp::xml::split $child tag xmlns attrs cdata subels data::draw_window $subels \ [list muc::send_config $chatid] \ -cancelCommand [list muc::cancel_config $chatid] \ -title [::msgcat::mc "Configure room %s" $group] return } ############################################################################### proc muc::send_config {chatid w restags} { set xlib [chat::get_xlib $chatid] set group [chat::get_jid $chatid] ::xmpp::sendIQ $xlib set \ -query [::xmpp::xml::create query \ -xmlns $::NS(muc#owner) \ -subelements $restags] \ -to $group \ -command [list muc::test_error_res \ [::msgcat::mc "Sending configure form"] \ $xlib $group $chatid] destroy $w } ############################################################################### proc muc::cancel_config {chatid w} { set xlib [chat::get_xlib $chatid] set group [chat::get_jid $chatid] ::xmpp::sendIQ $xlib set \ -query [::xmpp::xml::create query \ -xmlns $::NS(muc#owner) \ -subelement [::xmpp::data::cancelForm]] \ -to $group \ -command [list muc::test_error_res \ [::msgcat::mc "Cancelling configure form"] \ $xlib $group $chatid] destroy $w } ############################################################################### proc muc::test_error_res {op xlib group reschatid res child} { if {![string equal $res ok]} { set chatid [chat::chatid $xlib $group] chat::add_message $reschatid $group error \ [format "%s: %s" $op [error_to_string $child]] {} return } } ############################################################################### proc muc::report_muc_event {chatid action nick args} { variable options debugmsg conference "MUC EVENT: $chatid $action $nick $args" if {![chat::is_opened $chatid]} return set xlib [chat::get_xlib $chatid] set group [chat::get_jid $chatid] set user $group/$nick switch -- $action { disconnect { set msg [::msgcat::mc "Disconnected"] foreach {key val} $args { switch -- $key { -error { set msg [::xmpp::stanzaerror::message $val] } } } chat::add_message $chatid $group error $msg {} client:presence $xlib $group unavailable "" {} } enter { hook::run chat_user_enter $chatid $nick report_available $chatid $nick 1 } presence { report_available $chatid $nick 0 } exit { report_unavailable $chatid $nick hook::run chat_user_exit $chatid $nick } position { eval [list track_room_position $xlib $user] $args } create { chat::add_message \ $chatid $group groupchat \ [::msgcat::mc "A new room is created"] {} if {$options(propose_configure)} { request_config_dialog $chatid } else { # requesting "instant" room as specified in XEP-0045 # if the user wants to configure room (s)he can do it later request_instant_room $chatid } } destroy { set msg [::msgcat::mc "Room is destroyed"] foreach {key val} $args { switch -- $key { -reason { append msg [::msgcat::mc "\nReason: %s" $val] } -jid { append msg [::msgcat::mc "\nAlternative venue: %s" \ $val] } } } if {$options(gen_enter_exit_msgs)} { chat::add_message \ $chatid $group groupchat $msg {} } } ban - kick - demember - members-only { set real_jid "" foreach {key val} $args { switch -- $key { -jid { set real_jid " ($val)" } -actor { set actor $val } -reason { set reason $val } } } switch -- $action { ban { set msg [::msgcat::mc "%s has been banned" \ $nick$real_jid] } kick { set msg [::msgcat::mc "%s has been kicked" \ $nick$real_jid] } demember { set msg [::msgcat::mc "%s has been kicked because\ of membership loss" \ $nick$real_jid] } members-only { set msg [::msgcat::mc \ "%s has been kicked because\ room became members-only" \ $nick$real_jid] } } if {[info exists actor] && $actor != ""} { append msg [::msgcat::mc " by %s" $actor] } if {[info exists reason] && $reason != ""} { append msg ": $reason" } if {$options(gen_enter_exit_msgs)} { chat::add_message $chatid $group groupchat $msg {} } } nick { set real_jid "" foreach {key val} $args { switch -- $key { -jid { set real_jid " ($val)" } -nick { set new_nick $val } } } # TODO may be this reporting should not be done # if the $nick is being ignored (MUC ignore) if {$options(gen_enter_exit_msgs)} { chat::add_message $chatid $group groupchat \ [::msgcat::mc "%s is now known as %s" \ $nick$real_jid $new_nick] {} } ::hook::run room_nickname_changed_hook $chatid $nick $new_nick } } } proc muc::report_unavailable {chatid nick} { variable options set group [chat::get_jid $chatid] if {$options(gen_enter_exit_msgs)} { set message [::msgcat::mc "%s has left" $nick] set xlib [chat::get_xlib $chatid] set error [get_jid_presence_info error $xlib $group/$nick] if {$error != ""} { set status [::xmpp::stanzaerror::message $error] } else { set status [get_jid_presence_info status $xlib $group/$nick] } if {$status != ""} { append message ": $status" } else { append message "" } chat::add_message $chatid $group groupchat $message {} } } proc muc::report_available {chatid nick entered} { variable options set xlib [chat::get_xlib $chatid] set group [chat::get_jid $chatid] if {![is_compatible $group]} return set jid $group/$nick set msg "" if {$entered && $options(gen_enter_exit_msgs)} { set real_jid [get_real_jid $xlib $jid] if {$real_jid != ""} { set occupant "$nick ($real_jid)" } else { set occupant $nick } set msg [::msgcat::mc "%s has entered" $occupant] if {$options(gen_muc_position_change_msgs)} { append msg " " [::msgcat::mc "as %s/%s" \ [::msgcat::mc [get_affiliation $xlib $jid]] \ [::msgcat::mc [get_role $xlib $jid]]] } } if {$options(gen_muc_status_change_msgs)} { set status [::get_user_status $xlib $jid] if {$entered && $options(gen_enter_exit_msgs)} { append msg " " [::msgcat::mc "and"] " " } else { append msg $nick " " } append msg [::get_long_status_desc $status] set desc [::get_user_status_desc $xlib $jid] if {$desc != {}} { append msg " ($desc)" } } chat::add_message $chatid $group groupchat $msg {} } proc muc::track_room_position {xlib jid args} { variable options set group [::xmpp::jid::stripResource $jid] if {![is_compatible $group]} return set chatid [chat::chatid $xlib $group] if {[chat::is_opened $chatid] && $options(gen_muc_position_change_msgs)} { set nick [chat::get_nick $xlib $jid groupchat] foreach {key val} $args { switch -- $key { -affiliation { set affiliation $val } -role { set role $val } } } if {[info exists affiliation]} { if {[info exists role]} { set msg [::msgcat::mc "%s has been assigned a new room\ position: %s/%s" \ $nick [::msgcat::mc $affiliation] \ [::msgcat::mc $role]] } else { set msg [::msgcat::mc "%s has been assigned a new\ affiliation: %s" \ $nick [::msgcat::mc $affiliation]] } } elseif {[info exists role]} { set msg [::msgcat::mc "%s has been assigned a new role: %s" \ $nick [::msgcat::mc $role]] } else { set msg "" } if {$msg != ""} { chat::add_message $chatid $group groupchat $msg {} } } } ############################################################################### proc muc::change_nick {chatid nick} { global userstatus textstatus variable tokens set xlib [chat::get_xlib $chatid] set group [chat::get_jid $chatid] if {![is_compatible $group]} { chat::add_message $chatid $group error \ [::msgcat::mc "Can't change nickname in MUC incompatible rooms"] {} return } debugmsg conference "CHANGE_NICK: $chatid $nick" eval [list ::xmpp::muc::setNick $tokens($chatid) $nick] \ [presence_args $xlib $userstatus -status $textstatus] \ [list -command [namespace code [list process_change_nick $chatid]]] } proc muc::process_change_nick {chatid status msg} { debugmsg conference "PROCESS_CHANGE_NICK: $chatid $status $msg" set xlib [chat::get_xlib $chatid] set group [chat::get_jid $chatid] switch -- $status { ok { set_our_groupchat_nick $chatid $msg } error { if {[chat::is_opened $chatid]} { chat::add_message $chatid $group error \ [::xmpp::stanzaerror::message $msg] {} } } } return } ############################################################################### proc muc::request_negotiation {xlib group} { variable muc_compatible # It's almost impossible to find MUC-incompatible room now, so the default # value is 1 set muc_compatible($group) 1 disco::request_info $xlib [::xmpp::jid::server $group] \ -cache yes \ -command [list muc::recv_negotiation1 $xlib $group] } proc muc::recv_negotiation1 {xlib group res identities features extras} { variable muc_compatible if {$res eq "ok" && $::NS(muc) in $features} { set muc_compatible($group) 1 set muc_compatible([::xmpp::jid::server $group]) 1 return } disco::request_info $xlib $group \ -cache yes \ -command [list muc::recv_negotiation2 $group] } proc muc::recv_negotiation2 {group res identities features extras} { variable muc_compatible if {$res eq "ok" && $::NS(muc) in $features} { set muc_compatible($group) 1 return } set muc_compatible($group) 0 } proc muc::is_compatible {group} { variable muc_compatible if {[info exists muc_compatible($group)]} { return $muc_compatible($group) } elseif {[info exists muc_compatible([::xmpp::jid::server $group])]} { return $muc_compatible([::xmpp::jid::server $group]) } else { return 0 } } proc muc::roster {chatid} { variable tokens if {![info exists tokens($chatid)]} { return {} } else { return [::xmpp::muc::roster $tokens($chatid)] } } proc muc::nick {chatid} { variable tokens if {![info exists tokens($chatid)]} { return "" } else { return [::xmpp::muc::nick $tokens($chatid)] } } proc muc::status {chatid} { variable tokens if {![info exists tokens($chatid)]} { return disconnected } else { return [::xmpp::muc::status $tokens($chatid)] } } ############################################################################### proc muc::add_user_popup_info {infovar xlib user} { upvar 0 $infovar info set real_jid [get_real_jid $xlib $user] if {$real_jid != ""} { append info [::msgcat::mc "\n\tJID: %s" $real_jid] } set affiliation [get_affiliation $xlib $user] if {$affiliation != ""} { append info [::msgcat::mc "\n\tAffiliation: %s" $affiliation] } } hook::add roster_user_popup_info_hook muc::add_user_popup_info ############################################################################### proc muc::set_message_timestamp {chatid from type body x} { variable timestamps if {[::xmpp::delay::exists $x]} { set ts [::xmpp::xml::getAttr [::xmpp::delay::parse $x] seconds] } else { if {[chat::is_disconnected $chatid]} { return } set ts [clock seconds] } set timestamps($chatid) $ts } hook::add draw_message_hook muc::set_message_timestamp 15 proc muc::clear_message_timestamp {chatid} { variable timestamps catch { unset timestamps($chatid) } } hook::add close_chat_post_hook muc::clear_message_timestamp ############################################################################### proc muc::new {chatid type} { variable tokens # MUC token is created only for groupchat windows if {![string equal $type groupchat]} return debugmsg conference "NEW_GROUP: $chatid" set xlib [chat::get_xlib $chatid] set group [chat::get_jid $chatid] set tokens($chatid) \ [::xmpp::muc::new $xlib $group \ -eventcommand [list muc::report_muc_event $chatid] \ -rostercommand [list chat::process_roster_event $chatid]] } hook::add open_chat_pre_hook muc::new ############################################################################### proc muc::join_group_raise {xlib group nick {password ""}} { if {[llength [connections]] == 0} return if {[string equal $xlib ""]} { set xlib [lindex [connections] 0] } join_group $xlib $group $nick $password chat::activate [chat::chatid $xlib [::xmpp::jid::normalize $group]] } proc muc::join_group {xlib group nick {password ""} {retries 2}} { global userstatus textstatus variable options variable timestamps variable muc_password variable tokens set group [::xmpp::jid::normalize $group] set chatid [chat::chatid $xlib $group] privacy::add_to_special_list $xlib conference [::xmpp::jid::server $group] set_our_groupchat_nick $chatid $nick chat::open_window $chatid groupchat update idletasks request_negotiation $xlib $group set x_args {} set muc_password($chatid) $password if {$options(history_maxchars) >= 0} { lappend x_args -maxchars $options(history_maxchars) } if {$options(history_maxstanzas) >= 0} { lappend x_args -maxstanzas $options(history_maxstanzas) } if {$options(request_only_unseen_history) && \ [info exists timestamps($chatid)]} { lappend x_args \ -seconds [expr {[clock seconds] - $timestamps($chatid) + 2}] } debugmsg conference "JOIN: $chatid $nick" incr retries -1 eval [list ::xmpp::muc::join $tokens($chatid) $nick \ -password $password \ -command [namespace code [list process_join $chatid \ $nick \ $password \ $retries]]] \ [presence_args $xlib $userstatus -status $textstatus] \ $x_args } proc muc::process_join {chatid nick password retries status msg} { variable options set xlib [chat::get_xlib $chatid] set group [chat::get_jid $chatid] debugmsg conference "PROCESS_JOIN: $chatid $status $msg" switch -- $status { ok { set_our_groupchat_nick $chatid $msg client:presence $xlib $group "" "" {} hook::run join_group_hook $chatid $msg } error { set message [::xmpp::stanzaerror::message $msg] if {$options(retry_with_different_nick) && \ [::xmpp::stanzaerror::condition $msg] eq "conflict" && \ $retries >= 0} { if {[chat::is_opened $chatid]} { append message " - " [::msgcat::mc "Retrying with nickname\ '%s_'" $nick] chat::add_message $chatid $group error $message {} } join_group $xlib $group ${nick}_ $password $retries } else { if {[chat::is_opened $chatid]} { chat::add_message $chatid $group error $message {} } } } } return } ############################################################################### proc muc::leave_group {chatid status} { variable tokens debugmsg conference "LEAVE_GROUP: $chatid" if {[info exists tokens($chatid)]} { if {![string equal $status ""]} { ::xmpp::muc::leave $tokens($chatid) -status $status } else { ::xmpp::muc::leave $tokens($chatid) } } } proc muc::reset_group {chatid} { variable tokens debugmsg conference "RESSET_GROUP: $chatid" ::xmpp::muc::reset $tokens($chatid) } proc muc::free {chatid} { variable tokens # This routine is called not only for groupchats, so checking existence of # tokens($chatid) is necessary. if {[info exists tokens($chatid)]} { debugmsg conference "FREE_GROUP: $chatid" ::xmpp::muc::free $tokens($chatid) unset tokens($chatid) } } hook::add close_chat_post_hook muc::free ############################################################################### proc muc::test_connection {chatid args} { variable tokens debugmsg conference "TEST_CONNECTION: $chatid" foreach {key val} $args { switch -- $key { -command { set command $val } } } if {![info exists command]} { return -code error "Command is mandatory" } if {![info exists tokens($chatid)]} { return -code error "MUC token doesn't exist" } set xlib [chat::get_xlib $chatid] set group [chat::get_jid $chatid] set nick [::xmpp::muc::nick $tokens($chatid)] ::xmpp::ping::ping $xlib -to $group/$nick \ -timeout 10000 \ -command [list muc::parse_test_connection $command] } proc muc::parse_test_connection {command status msg} { debugmsg conference "TEST_CONNECTION_REPLY: $status $msg" switch -- $status { ok { eval $command connected } error { lassign [error_type_condition $msg] type condition switch -- $type/$condition { cancel/not-allowed - modify/not-acceptable { eval $command disconnected } default { eval $command connected } } } default { eval $command disconnected } } } ############################################################################### proc muc::invite_muc {xlib group jid reason} { # If $jid is a 'real' JID then invite # If $jid is in a conference room try to invite real JID set real_jid [get_real_jid $xlib $jid] if {$real_jid == ""} { set real_jid $jid } message::send_msg $xlib $group \ -xlist [list \ [::xmpp::xml::create x \ -xmlns $::NS(muc#user) \ -subelement [::xmpp::xml::create invite \ -attrs [list to $real_jid] \ -subelement [::xmpp::xml::create reason \ -cdata $reason]]]] } proc muc::invite_xconference {xlib group jid reason} { message::send_msg $xlib $jid \ -type normal \ -subject "Invitation" \ -body $reason \ -xlist [list [::xmpp::xml::create x \ -xmlns $::NS(xconference) \ -attrs [list jid $group]]] } ############################################################################### proc muc::process_invitation {rowvar bodyvar f x xlib from id type replyP} { upvar 2 $rowvar row upvar 2 $bodyvar body foreach xa $x { ::xmpp::xml::split $xa tag xmlns attrs cdata subels switch -- $xmlns \ $::NS(xconference) { set xconference_group [::xmpp::xml::getAttr $attrs jid] set xconference_password "" if {[string equal $body ""] && ![string equal $cdata ""]} { set xconference_body $cdata } else { set xconference_body $body } } \ $::NS(muc#user) { set password "" set inviter "" foreach ch $subels { ::xmpp::xml::split $ch stag sxmlns sattrs scdata ssubels switch -- $stag { invite { set inviter [::xmpp::xml::getAttr $sattrs from] if {![string equal $inviter ""]} { foreach c [connections] { set rjid [roster::find_jid $c $inviter] set name \ [roster::itemconfig $c $rjid -name] if {$rjid != "" && $name != ""} break } if {![string equal $name ""]} { set inviter "$name ($inviter)" } set muc_body \ [::msgcat::mc \ "%s invites you to conference\ room %s" \ $inviter $from] foreach sch $ssubels { ::xmpp::xml::split $sch sstag ssxmlns \ ssattrs sscdata \ sssubels if {[string equal $sstag "reason"]} { append muc_body \ [::msgcat::mc "\nReason is: %s" \ $sscdata] } } } # TODO decline } password { set password $scdata } } } if {![string equal $inviter ""]} { set muc_group $from set muc_password $password } } } if {[info exists muc_group] && $muc_group != ""} { if {[status [::chat::chatid $xlib $muc_group]] eq "disconnected"} { process_x_conference $f $xlib $muc_group $muc_password $row incr row set body $muc_body return } else { # HACK: ignore the invitation if we are already in the room set body "" return } } elseif {[info exists xconference_group] && $xconference_group != ""} { if {[status [::chat::chatid $xlib $xconference_group]] eq "disconnected"} { process_x_conference $f $xlib $xconference_group \ $xconference_password $row incr row set body $xconference_body return } else { # HACK: ignore the invitation if we are already in the room set body "" return } } return } hook::add message_process_x_hook muc::process_invitation proc muc::process_x_conference {f xlib group password row} { Label $f.lgroup$row -text [::msgcat::mc "Invited to:"] Button $f.group$row -text $group \ -command [list muc::join_group_raise $xlib \ $group \ [get_group_nick $xlib $group] \ $password] grid $f.lgroup$row -row $row -column 0 -sticky e grid $f.group$row -row $row -column 1 -sticky ew } ############################################################################### proc muc::disco_reply {type xlib from lang} { variable options if {!$options(report_muc_rooms)} { return {error cancel not-allowed} } switch -- $type { info { return [list result {}] } items { set res {} foreach chatid [lfilter chat::is_groupchat [chat::opened $xlib]] { set group [chat::get_jid $chatid] if {[is_compatible $group]} { lappend res [list jid $group] } } return [list result $res] } } } hook::add postload_hook \ [list disco::register_node $::NS(muc#rooms) muc::disco_reply \ [::trans::trans "Current rooms"]] ############################################################################### # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/namespaces.tcl000064400000000000000000000020151477701321300146720ustar00nobodynobody# namespaces.tcl -- # # This file is a part of the Tkabebr XMPP client. It lists Jabber # namespaces registered by JSF and haven't yet moved to TclXMPP. # # Copyright (c) 2005 Sergei Golovan namespace eval :: { array set NS [list \ iqavatar "jabber:iq:avatar" \ xavatar "jabber:x:avatar" \ xconference "jabber:x:conference" \ event "jabber:x:event" \ xroster "jabber:x:roster" \ rosterx "http://jabber.org/protocol/rosterx" \ chatstate "http://jabber.org/protocol/chatstates" \ commands "http://jabber.org/protocol/commands" \ private "jabber:iq:private" \ delimiter "roster:delimiter" \ bookmarks "storage:bookmarks" \ tkabber:groups "tkabber:bookmarks:groups" \ pubsub "http://jabber.org/protocol/pubsub" \ nick "http://jabber.org/protocol/nick" \ ] } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/pep.tcl000064400000000000000000000035111477701321300133410ustar00nobodynobody# pep.tcl -- # # Personal eventing via pubsub XEP-0163 package require xmpp::pep namespace eval pep { custom::defgroup Plugins \ [::msgcat::mc "Plugins options."] \ -group Tkabber custom::defgroup PEP \ [::msgcat::mc "Personal eventing via pubsub plugins options."] \ -group Plugins } ########################################################################## # Returns a name of a submenu (of menu $m) for PEP commands to perform on # the roster item for a user with JID $jid. # This command automatically creates this submenu if needed. proc pep::get_roster_menu_pep_submenu {m xlib jid} { set pm $m.pep if {![winfo exists $pm]} { menu $pm -tearoff no $m add cascade -menu $pm \ -label [::msgcat::mc "Personal eventing"] } return $pm } ########################################################################## # Returns pathname of a frame comprising a page for PEP info in # the userinfo (vCard) dialog which notebook widget is $notebook. # If that page is not yet exist, it's created. proc pep::get_userinfo_dialog_pep_frame {notebook} { if {![winfo exists $notebook.pep] || [$notebook index pep] < 0} { return [$notebook insert end pep \ -text [::msgcat::mc "Personal eventing"]] } else { return [$notebook getframe pep] } } proc pep::get_main_menu_pep_submenu {} { return [.mainframe getmenu services].pep } proc pep::on_init {} { set m [.mainframe getmenu services] set idx [$m index [::msgcat::mc "Service Discovery"]] set pm [menu $m.pep -tearoff $::ifacetk::options(show_tearoffs)] $m insert [expr {$idx + 2}] cascade -menu $pm \ -label [::msgcat::mc "Personal eventing"] } hook::add finload_hook [namespace current]::pep::on_init # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/pixmaps.tcl000064400000000000000000000132331477701321300142400ustar00nobodynobody# pixmaps.tcl -- # # This file is a part of the Tkabber XMPP client. It implements loading # pixmaps themes. catch { package require vfs::zip } ############################################################################### namespace eval pixmaps { variable theme_dirs \ [concat [glob -nocomplain -directory \ [file join $::configdir pixmaps] *] \ [glob -nocomplain -directory [fullpath pixmaps] *]] variable themes array set themes {} variable filenames array set filenames {} } ############################################################################### proc pixmaps::init_custom {} { variable options variable themes set values {} set theme_names [lsort [array names themes]] set idx [lsearch -exact $theme_names Default] set theme_names [linsert [lreplace $theme_names $idx $idx] 0 Default] foreach theme $theme_names { lappend values $theme $theme } custom::defvar options(pixmaps_theme) Default \ [::msgcat::mc \ "Tkabber icon theme. To make new theme visible for Tkabber\ put it to some subdirectory of %s." \ [file join $::configdir pixmaps]] \ -group IFace -type options -values $values \ -command [namespace current]::load_stored_theme } hook::add postload_hook [namespace current]::pixmaps::init_custom 45 ############################################################################### proc pixmaps::load_stored_theme {args} { variable options load_theme $options(pixmaps_theme) hook::run set_theme_hook } ############################################################################### proc pixmaps::load_themes {} { variable theme_dirs variable themes array unset themes foreach dir $theme_dirs { load_theme_name [namespace current]::themes $dir } } hook::add postload_hook [namespace current]::pixmaps::load_themes 40 ############################################################################### proc pixmaps::load_theme_name {var dir} { set icondef_path [file join $dir icondef.xml] if {[file isfile $icondef_path]} { set thdir $dir } elseif {![catch {::vfs::zip::Mount $dir $dir} mount_fd] && \ ([llength [glob -nocomplain $dir/*/icondef.xml]] > 0)} { set icondef_path [lindex [glob -nocomplain $dir/*/icondef.xml] 0] set thdir [file dirname $icondef_path] } else { return } if {![catch {open $icondef_path} f]} { set icondef [read $f] close $f } else { catch {::vfs::zip::Unmount $mount_fd $dir} return } ::xmpp::xml::parseData $icondef [list pixmaps::find_name $var $thdir] } ############################################################################### proc pixmaps::find_name {var dir xmldata} { upvar #0 $var themes ::xmpp::xml::split $xmldata tag xmlns attrs cdata subels if {$tag == "name"} { set themes($cdata) $dir return 1 } set found 0 foreach subel $subels { if {[find_name $var $dir $subel]} { return 1 } } return 0 } ############################################################################### proc pixmaps::load_theme {theme} { variable themes load_dir $themes(Default) catch { load_dir $themes($theme) } } ############################################################################### proc pixmaps::load_dir {dir} { set icondef_path [file join $dir icondef.xml] if {![file isfile $icondef_path]} { return -code error } set f [open $icondef_path] set icondef [read $f] close $f ::xmpp::xml::parseData $icondef [list pixmaps::parse_icondef $dir] } ############################################################################### proc pixmaps::parse_icondef {dir xmldata} { ::xmpp::xml::split $xmldata tag xmlns attrs cdata subels if {$tag != "icondef"} { return -code error } foreach subel $subels { parse_item $dir $subel } } ############################################################################### proc pixmaps::parse_item {dir item} { ::xmpp::xml::split $item tag xmlns attrs cdata subels switch -- $tag { icon { parse_icon $dir $subels } } } ############################################################################### proc pixmaps::parse_icon {dir items} { variable filenames set type "" set image "" set object "" foreach item $items { ::xmpp::xml::split $item tag xmlns attrs cdata subels switch -- $tag { image { if {$xmlns == "tkimage"} { set image $cdata } } object { switch -glob -- [::xmpp::xml::getAttr $attrs mime] { image/ico { set type ico set object $cdata } image/* { set object $cdata } } } } } if {$image == "" || $object == ""} return set filename [file join $dir $object] set filenames($image) $filename switch -- $type { ico {} default { # TODO: use custom scale if icons are not 16x16 create_image $image -file $filename } } } ############################################################################### proc pixmaps::get_filename {image} { variable filenames if {[info exists filenames($image)]} { return $filenames($image) } else { return -code error } } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/pixmaps000075500000000000000000000000001477701321300134535ustar00nobodynobodytkabber/pixmaps/default-blue000075500000000000000000000000001477701321300160245ustar00nobodynobodytkabber/pixmaps/default-blue/docking000075500000000000000000000000001477701321300174425ustar00nobodynobodytkabber/pixmaps/default-blue/docking/available-away.gif000064400000000000000000000005571477701321300230760ustar00nobodynobodyGIF89a¥7t$$$-Ÿ "¿////Ä<<<@@@)=Æ&AÎ)GÒNNNOOO3GÊ9NÍ2RØ:QÐ```bbb>_ßF]ÕCcàjjjMfÚUgÔQlÞqqqtttNséRvêatÛ|||}}}f|ß‚‚‚^…òd…ìbˆòq‰çk”úr”ôx”îsžÿ¥®ç»Áí´ÄöÀÇïÂÉñÁÌõÅÌòÇÏóÉÒõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù?,ŒÀŸpH,Ȥr¹,8 Ìb¡Em ¢Â‚j»½F &Ô eò~A,ØécnbR³ÆÒV86GRO5$ %~ !47’“#~227 "7~1““~/œ’J. #©’KW% À}XÌXÏÐÑJA;tkabber/pixmaps/default-blue/docking/available-chat.gif000064400000000000000000000005631477701321300230510ustar00nobodynobodyGIF89a¥7t-Ÿ "¿/Ä)=ÆGGG&AÎ)GÒ3GÊ.KÓ9NÍ2RØ:QÐ^]]>_ßF]ÕCcàMfÚUgÔQlÞNséRvêatÛf|ß^…òd…ìbˆòq‰çk”úr”ôx”îsžÿ¥®ç»Áí´ÄöÛÝÀÇïÂÉñÁÌõÅÌòÇÏóééììÉÒõîîððóó÷÷ÿÿÿÿÿÿRÿÿ[ÿÿ—ÿÿ¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù?,ÀŸpH,Ȥr¹8Ì¢D¢BAg»½F™g“ñ~-Ÿ‘¦bnF8'NäÑV (,…8˜) -.-v(0242/‹H && 15751—G %+363+¤F " 1º±G!W$*$¼½^ÊÆFfÉÌÍXÓÔÕÕA;tkabber/pixmaps/default-blue/docking/available-dnd.gif000064400000000000000000000005401477701321300226720ustar00nobodynobodyGIF89a¥'i ŽÄÍèßòÿÿÆÌ##ÙÓ##ÿã##ÿôë##ÿ##ÿ''ÿ++Ø<<æ<<ÿ33í<<ÿ66ÿ99ÿ;;ÿAAã‘‘ÿ‰‰ÿššê¦¦îªªñªªôªª÷ªªûªªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù?,}ÀŸpH,Ȥr¹8Ì¢€Cå¢Bf»½Fʆ2ñ~!OÅan&4 MÑV "&SäPO %„…„~$'Ž~ ## †'‘H "ŽšG ! —„£J ¡¢¤HW††K·XF}½ÀÁÂGA;tkabber/pixmaps/default-blue/docking/available.gif000064400000000000000000000005201477701321300221250ustar00nobodynobodyGIF89a¥*t-Ÿ "¿*Ã/Ä3È!<Í)=Æ&AÎ)GÒ3GÊ.KÓ9NÍ2RØ:QÐ>_ßF]ÕCcàMfÚUgÔQlÞNséRvêatÛf|ß^…òd…ìbˆòq‰çk”úr”ôx”îsžÿ¥®ç»Áí´ÄöÀÇïÂÉñÁÌõÅÌòÇÏóÉÒõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù?,mÀŸpH,Ȥr¹ 8ÌbD¢Â@g»½F™g“ñ~-Ÿ‘¦bnF8&NäÑV(©¥QO( }H'†‡%%ŽG $•F " G!¤H©ª¬¥X°±²²A;tkabber/pixmaps/default-blue/docking/tkabber.ico000064400000000000000000000477161477701321300216460ustar00nobodynobody°h¶hh† hîhVh¾h&"hŽ'hö, ¨^2 ¨; ¨®C(VL(~M(¦N( ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ( tŸ-¿" Ã*Ä/È3Í箥íÁ»öÄ´ïÇÀñÉÂõÌÁòÌÅóÏÇõÒÉ                ûÿùÿùÿðÿàà?à?à?àððøøüþÿ( tŸ-¿" Ä/Æ=)ÎA&ÒG)ÊG3ØR2ÙU5ÛY8Ý]<ß_>箥íÁ»öÄ´ïÇÀñÉÂõÌÁòÌÅóÏÇõÒÉÿÿÿ                 ûÿùÿùðàààààððøøüþÿ(  tf aŸ-¿" Ä/Æ=)ÎA&ÒG)ÊG3ØU5ÙU5ÛY8Ý]<ß_>箥íÁ»öÄ´ÝÛïÇÀñÉÂõÌÁòÌÅóÏÇééììõÒÉîîððóó÷÷ÿÿÿÿRÿÿ[ÿÿ—ÿÿ¶ÿÿÿÿÿ   ### %(%#')'# "$&$!  ûÿùÇùƒðƒàààààððøøüþÿ(  iŽÄÍèßòÿÿÆ##ÌÙ##Óÿ##ãÿô##ë##ÿ''ÿ++ÿ<<Ø<<æ33ÿ<<í66ÿ99ÿ;;ÿAAÿ‘‘㉉ÿššÿ¦¦êªªîªªñªªôªª÷ªªûÿÿÿ '''''' ! ''' "'''''' ## ''$''''''%&&   ûÿùÿùðàààààððøøüþÿ( :::MMMNNNOOOPPP^^^```uuu¢¢¢¤¤¤¦¦¦¬¬¬±±±²²²³³³´´´¶¶¶···¸¸¸¼¼¼ÄÄÄÇÇÇÈÈÈÉÉÉËËËÐÐÐÑÑÑÓÓÓÖÖÖ×××ÚÚÚÜÜÜÝÝÝÿÿÿ""""""  """ """""""" """"""    !!!!ûÿùÿùðàààààððøøüþÿ( :::OOObbbfffhhhjjjoooqqqtttvvvxxxyyy€€€„„„………‡‡‡‰‰‰‹‹‹ŒŒŒ‘‘‘“““———™™™ššš²²²¾¾¾ÁÁÁÅÅÅÆÆÆÈÈÈÊÊÊÌÌÌ$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$ $$$$$$$$$! $$$$$$$$$" $$$$$$$$$## $$$$$$$$$  $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ûÿùÿùÿðÿàà?à?à?àððøøüþÿ( :::OOOVVVWWWXXXYYYZZZ[[[lllˆˆˆ¶¶¶···½½½ÃÃÃÆÆÆÇÇÇÈÈÈÊÊÊËËËÌÌÌÍÍÍÏÏÏÐÐÐÓÓÓÙÙÙàààâââäääæææèèèéééëëëíííîîîòòòóóóôôô÷÷÷ùùùûûûüüüþþþÿÿÿ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++  +++++++++ "+++++++++$+++++++++ #&+++++++++! '+++++++++$#%(++++++++++&'()*++++++++++()**+++++++++++++++ûÿùÿùÿðÿàà?à?à?àððøøüþÿ( ÿ=ÿ?ÿ?ÿ?ÿ@óCÿAÿBëFÿBÿD ÿE üG ÿGÿIÿIüKÿJùLÿM‚gÿNÿOÿPÿPÿQ¢eðTmpöTÁ`ÿRÿS\uÿU!²hÿZ'ÿZ(ÿ\*­n%÷^* s(¸p+Q†'ÿa1ôd1ÿb2ÿe6÷h7x„0E.8•. 4J’3T4ÿm@Ë{>ÿoCÿqF@:ÿsH«ŠFÉ„JÿxNaœBÿxOJ CJ¢D|˜H”IóRÿ|TP¤JV¤Lÿ€YN¨LU¦NV§Nÿ‚\†žVý…_ÿ†aL±Uÿˆdq«Xÿ‹gV²ZЍ^s­^ÿŽl¬¢dÿlV¶^®c`¶d\¸d[ºe`¹g`ºg†³jÿ–wÿ—wØ¢toºlXÀjÿšzÁªuaÂpmÂttÂwÿ¢†9Ônò¦…Ȳ‚iÈ|ÿ¥ŠhÉ{þ¦ŠkÉ|¨¼ƒlÊ~ê­‰~Ç€ø©ÿ©Žkσ̹¼ŒoІŠÊˆç·–ÿ±™¸Ã’rÖ¡Ë’tÖŽÿµžx֮ɘwØ’xØ“ö»¢ÿ¹¤ÿº¤ðÀ¥|Ü™þ½©üÀ¬Yë”àžÿÁ®ÿ®ÓΪƒâ¢±Ùª´ÙªÿÆ´…䦅æ§ÿÈ·ÿȸï͵ˆæªÂÙ±øË¾ÿ̼›å°òÏÄÀß·ÅÞ¸‘ë³ÿÓÆ•ï¸þÖÉÁ误¯¯¯¯¯¯¯¯¯¯¯¯¯¯'# ¯¯¯¯¯¯ "./EKB*¯¯¯¯$9AFg`VD(  ¯¯¯-)Js©£‚p†…m^I1Sƒ—¡®˜¦„‰vaM6!UŽ¥ “¨šŒxbL5¯J«¥–ˆ|~‹r_H2¯¯,nœŸ­¤udjl\C+¯¯¯OŠ’§{[J]R;¯¯¯¯3hqyiYN@@@çBàDÌ<'FFFGGGâOãOâP(AbJJJÛYÛbÛcWWWÕk6PtXXX,O|ÕtÔv]]]Ãm#Άφggghhh`iulllNf…É—ªcurrrao‚NltttuuuNn“vx|~~~ `édÞg솆†'rÛlîX€¯3wÏŠŠŠ$rà‹‹‹rñ’…¬'{ç'|ç"xô’†°5äb¾3„ê5„ê*€ø.„ú<Ší0‡û?ŒíNŽå3‰ü4Šý5Œý6þG’ï7ŽþN˜ñW˜îP˜ñTœóXžóZ ôa¤ög¦ñf¨÷k¬ùx¯ðm­ùq°úu²ûw´ümmmmmmmmmmmmmmmmmmmmmmmmmm m)mmmm(! %.8<@m+'  %.7;@Em2,# "-0/5:Gmm*IM3mm4$AF1mmmmW^_mmmmm?=>mmmPKJmmmmmmmBHLmmb`\VTmmmmmmRSUXmgfdcammmmmYZ[]mlkjiemmmmmQN&DmhO69CmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmÿÿÿÀƒÃããáÁÁÁãƒÿÇÿÿ( @ÿ=ÿ?ÿBéHÿHçLÿB¬ZÿRõT´[ ÿM6u ¶ddn…dLsþH'õQÿXôY¯jÓ]ÿR&/„qƒo"?jzÿ\#Èf+þX3±r¤p(ÿ_*A‰!‡x*m„"™y(ÿc2D&Èt,Ðm7;‘'èi7Þl:)–+ÿm0F5^Ž.t‹,ÿi=K”0E”5;˜4R”7ßtCCš2H—8&¥)ÿt=ÿpGFœAI :y–?ÿzFÿvOD¢?Q¢C…•J;¨A‚™GH¦DÁŒL°ŽO¬NÿOÿ}WO¦LÚ‰Ub¥K9®Kî‡[SªPÿƒ^G­OMªSÄ•ST¬Rªš[R±Pÿ‰cÓ–Z£\˜¢[ä’`S±Ze¯XHµZøf° aU´]Q·Y8¾WE»YX¸Xþp]¶\ÿ‘j!ÇRh±d^µeY¸aUºfQ¿dÿ•wÿ™q^½fõ™vÀ§u_½oþšzZÀlŒµqؤx»¨{¸­s¢°wPÅmnÀmÿ}É©{dÄm^Äpz½uó¤|XÅt@ÏkþŸ†ÿ¤‚Ú­~mÆugÆxİ„-ÚidËwø§‰þ¦‹²¹„ͲŠð¬nÍÿªh΂É„ÿ­ÝµŒþª–uÍ…qωÿ°“mÔˆtԆƽšÿ²›úµšuÔŽ’ÐŒq׋Rà…žÍ”ñ¸Ÿrד컞6ê…yØ’±Ë™ÿ» ÿ¸¦ÞÁ¡ÔĤ}Ü–“ÕxÞšþ¾¨ÙœŠÜ˜ó¾²†Þ¹Ó¡ÿÁ¬‚á›êƪñǦöïþó`후â¤<ø–ÿƶÿË·×Ô´âиæ®ÿɾçÌÁ²à®ÓسÄݳŒë­ýÏ¿‡í°ÐÛ¹ŽëµòÏÈ–í´ÿÓÃÚÝÀüÔÈ“ò»ô£ùȵöÌòèçðóñøûùââââââââââââââââââââââââââââââââââââââââââââââââââââââââ ââââââââââââââ -25+$âââââââââââ"',DN??:& âââââââââ"3333K`VSVND âââââââ 33==BB^qek`SN) ââââââ35#âââL‚²ÌÈØÇ¾Ã¸¤›ŠŠs”¡—zq`N95# ââââ3j‹±ÌÇÃÚáàÖ‹sl[_{zeeV>+âââââ!J}£À²¸¾ÚßßÍ‚sjTMdˆqZH++ââââââ 5n𹳤 ¤¤»“sj[TAYrfUC6âââââââ>pžª‹‹“‹yyj[TA=YhbF7 âââââââââ.Q€|°vsl[[TMQgÑjØmZZZ*P‚ÔvOšÑbbb°Ms·Έɉiiijjjˑƕ©elpppÈ™Zk„Èš+aªqqqMlÆŸ&b³0f¬Pn‘_Åvvv¥bwwwVäWåYå{{{[æSu€€€ aé m bꃃƒfë3tÈh쇇‡jík‰qãŠŠŠ‹‹‹sänïtäoŒuä4zÕqñ wå!wåtòuò)yè'{ç(|ç"wô#xô+~è,è%zõ4ã-€è%{öe½'}ö0‚ém‰Ç(~÷3„ê)€÷5…ë+ø+‚ø-ƒù9ˆì-„ù:‰ì.…ú‘Æ/…ú0†û>‹í1‡û?Œí1ˆû2ˆü@î2‰ü3‰üBŽî3ŠüDî4‹ý5Œý6þ7þF’ï7Žþ7ŽÿH“ï8Žÿ8ÿI”ðt–ÝašÞK•ðmÕM–ñO—ñQ™òSšòS›óT›óUœóVóWžóYžô[ ô\¡õ^¢õ_£õ`¤öa¤öb¥öc¦÷d¦÷e¨÷f¨÷h©øhªøiªøj«øk¬ùl¬ùm­ùn®ùo®úp¯úq¯úq°úr°úr±ûs±ût²ûu²ûu³ûv³üw´üxµüyµüz¶ü{·ý|¸ý}¸ý¹þºþÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ+$ ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ741*" Ü .5:@IRÜÜÜÜ<9741*"  .5:@DPVY]ÜÜA=9741*"  .5:@DPVY]adÜEA=9740)#  .5:@DPVY]adfÜÜGA=9740)# !.5:@DPVY]adfgÜÜKGA=3,&%)# ÜÜ5:?DPVY]adfglÜÜÜK>QŽŽ[;ÜÜÜ:?DP(-//IlÜÜÜÜÜBCÁÁÁÁÁ§#ÜÜÜÜÜÜP8‡‡‡‡LDÜÜÜÜÜÜÜÜ‚¯¯¯¯¯ÜÜÜÜÜÜÜÜÜOrrrrFÜÜÜÜÜÜÜÜhep}“–ÜÜÜÜÜÜÜÜÜÜÜÜÜ`\TSUÜÜÜÜÜÜÜ„zuqjmÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜWZ^ckÜÜÜÜÜ£›“Œ†yvÜÜÜÜÜÜÜÜÜÜÜÜÜbiosx~ƒÜÜÜܲ®¬© ™‘ŠÜÜÜÜÜÜÜÜÜÜÜÜÜw{€…ˆ‹ÜÜÜÜ»¸¶´±­«¦ ÜÜÜÜÜÜÜÜÜÜÜt‡‰”—šÜÜÜÆÄ¿½º·µ³°ÜÜÜÜÜÜÜÜÜÜÜH’•˜šœžÜÜÏÍÊÈÆÃÀ¾¼¹ÜÜÜÜÜÜÜÜÜ6œžžž¡¡ÜÜÕÔÓÑÎÌÉÇŨÜÜÜÜÜÜÜÜÜžžŸ¡¢¢¤¥ÜÜÙØ×ÖÕÓÒÐÎËÜÜÜÜÜÜÜÜÜ|¢¢n MMÜÜÛÚªN'''2XJÜÜÜÜÜÜÜÜÜ_M ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€€€€ÀàððàüÀÿþ€ü€ü€?ø?øðððððø€üÀÿÿà?ÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿ( @ææ!æ"æ#æ$æ&Ó)æ'æ(æ+é,æ-æ.æ/æ0æ1æ3æ4æ6æ7æ8æ9æ:æ<ì;æ=æ>æ?æ@æAæBæCïCõBæE=ZæFèFæGñEæHîGæIïHëIæJæKæLæMçMéMæOæPæQäRæRÑVóPÓVÚUæSÿOæTâUàVæUÙXßSæVÿRåXæXæYüUìXøVÿUÿVæ[à]æ\ýXöZö[æ_æaæbÀgæcÜ\æd;QeåeæeÒbægÿ[ÿcæhãjæjælçlÔnænên®kæoæpæqæsÙ^0ÎmÖkÓzæyÕmæzëe*ÿtåÑu%Æs/ÿv/ós?ÿy/§|Uÿ/ó}:·~Pÿƒ/þˆ.Ƀ\ø‡Oÿ‰O÷‰_ø‰_þ–fµ—…ª™ý¤]Á§”æ¬ÿ¨ݬ‘á²ì±”é¶ÿÉŸÐÇÂÑÉÃÕÌÈòÕ¿ÿÓ¿ûÜÏÿêßÿìßøïéýóïõóòûôïÿôïöõóÿÿÿ¤¤¤¤¤¤#¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤#¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤#¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤##¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤##¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤#[rnU<¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤‹jubG-¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤cŠxmT4"¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤Z„•yZ>&¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤7UY—‘O<&¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤&U\ŸqF/¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤Pep¢ŽB<&$¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤>Xn~ ^@/.¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤0NdW–“:6$&5¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤$0>vžLJGHGA.>¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤0(/2|£†Q1/..-/>¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤&&.)‡¡{K.0¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤"*'ˆ¡}9 3¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤%!‰›‚ "¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤,Mœƒ .¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤.+aw”€.¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤.SŒo *¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤  .¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤. "/¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤.".¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤.-&"$*/¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ýÿÿÿýÿÿÿýÿÿÿüÿÿÿüÿÿÿüÿÿþÿÿüÿÿüÿÿøÿø?ÿôÿüÿüÿüÿüÿüÿüÿþÿþÿÿÿ€?ÿ€ÿÀÿàÿðÿøÿüÿþÿÿ€ÿÿà?ÿÿÿÿ( qqquuu{{{………ˆˆˆŠŠŠ¶¶¶ººº¼¼¼¾¾¾ÂÂÂÅÅÅÉÉÉÍÍÍÿeT3"!ÿÿjª˜ˆwpÿÿjUUUwpÿÿkUUUWpÿÿkUUˆ‡pÿÿkUUUˆpÿÿl»ºªˆ€ÿÿlUUUY€ÿÿmUU»ªÿÿmUUUº ÿÿmUUU[ ÿÿnUUÜ˰ÿÿnîÝṴ̈ÿÿnîíÕUÀÿÿnîîÝÝÀÿÿeT3"!ÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ( qqquuu{{{†††ŠŠŠµµµàààåååêêêíííñññõõõøøøüüüÿUD3"!ÿÿY™ˆˆwpÿÿYfffwpÿÿZfffgpÿÿZffˆ‡pÿÿ[fffˆpÿÿ[»ª™ˆ€ÿÿ\fffh€ÿÿ\ffª™€ÿÿ]fff©ÿÿ]fffjÿÿ^ff˺ ÿÿ^îÝÌË ÿÿ^îíÖf°ÿÿ^îîÝÌÀÿÿUD3"!ÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ( jvo|u‚y‡}Œ²Èïÿ&ïÿ.ïþ9ñþEñþUñþbòþkòþÿUD3"ÿÿZ™ˆ‡wpÿÿZfffwpÿÿ[fffgpÿÿ[ff™ˆpÿÿ[fff˜€ÿÿ\Ë»ª™ÿÿ\fffjÿÿ\ff»ª ÿÿ]fffº ÿÿ]fffk°ÿÿ^ffÌ»°ÿÿ^íÝḬ̀ÿÿ^îÝÖfÀÿÿ^îîÝÜÀÿÿUD3"ÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀtkabber/pixmaps/default-blue/icondef.xml000064400000000000000000000030161477701321300202340ustar00nobodynobody Default Blue 2.1a Tkabber's Default Blue Style 2006-09-19 Artem Bannikov docking/chat docking/available-chat.gif docking/available docking/available.gif docking/away docking/available-away.gif docking/dnd docking/available-dnd.gif docking/tkabber docking/tkabber.ico roster/user/chat roster/available-chat.gif roster/user/available roster/available.gif roster/user/away roster/available-away.gif roster/user/dnd roster/available-dnd.gif tkabber/pixmaps/default-blue/roster000075500000000000000000000000001477701321300173425ustar00nobodynobodytkabber/pixmaps/default-blue/roster/available-away.gif000064400000000000000000000005441477701321300227720ustar00nobodynobodyGIF89aÕ8ÿÿÿ-Ÿtk”úsžÿOOO}}}NNNQlÞjjj<<_ß)GÒ&AÎRvêttt»Áíx”îÇÏóÀÇïF]Õbbb2RØ9NÍ|||!ù8,@œp( Äd‘À$”ÃÀ`:}BMJc±^[0ÐÇãM&™Rf¢*‰H$QsGW¢©@, Q,(!3Š‹Q  47 Q62'‹‹Q/& ”.Š D#¡ŠIO ¸vP8ÄCA;tkabber/pixmaps/default-blue/roster/available-chat.gif000064400000000000000000000005471477701321300227530ustar00nobodynobodyGIF89aÕ8-Ÿt^]]ÿÿk”úsžÿGGGÛÝ^…òQlÞbˆòÿÿR:QÐÿÿ—3GÊÂÉñÉÒõîîììÿÿCcàq‰çÇÏóRvêÿÿÿF]ÕÀÇï&AÎd…ì "¿>_ßÿÿ¶.KÓ÷÷/Ä¥®çMfÚf|ß´ÄöÁÌõx”îÿÿ[UgÔéé9NÍatÛ)GÒÅÌò)=Æóó2RØððr”ôNsé»Áí!ù8,„@œp(ÄdÑÀ4”C@a:}B‰Em‘°^1©SÇæM*”¥ò)ŠHD1 JÀ«t1…4xo.0"*2„E  8-+# œ7±œB$1O,³´VÁ½8^ÀÃÄPCA;tkabber/pixmaps/default-blue/roster/available-dnd.gif000064400000000000000000000005231477701321300225730ustar00nobodynobodyGIF89aÕ(ÿÿÿŽi ÿ33ÿ;;ñªªûªªÌ##Ùôÿ''ÿ##ÿÿ66æ<<ÄÍèã‘‘ÿ++í<<ò÷ªªôªªÿššÆÿAAã##ÿÿ‰‰Ø<<ꦦë##ÿÿ99ßÿÓ##!ù(,p@”p(Äd±À, ”Ca:}BŒiÁ°^;ÅäM ŽŒ£1*ŠÃAaqG%¢KÀïó£%†‡Q  …~‰E'!…‡†’( |šD˜™›BO~~I®PPvDA;tkabber/pixmaps/default-blue/roster/available.gif000064400000000000000000000005031477701321300220260ustar00nobodynobodyGIF89aÕ*t-Ÿk”úsžÿ)GÒbˆò3GÊQlÞCcàÉÒõÂÉñ^…ò:QÐq‰çr”ô3È2RØUgÔ/ÄÀÇïNs饮çf|ß´ÄöÅÌò*Ã9NÍ!<ÍÁÌõRvêx”î»Áí&AÎatÛ "¿d…ìMfÚF]ÕÇÏó)=Æ>_ß.KÓ!ù*,`@•p( ÄdqÀ”À`:}B‹‚£°°^;žËˆâM N*‡DâqG $“%E°A!%~E …*Œ"ŒB'šCŸ ¢›PCA;tkabber/pixmaps/default000075500000000000000000000000001477701321300150775ustar00nobodynobodytkabber/pixmaps/default/docking000075500000000000000000000000001477701321300165155ustar00nobodynobodytkabber/pixmaps/default/docking/available-away.gif000064400000000000000000000005401477701321300221410ustar00nobodynobodyGIF89a¥$NDQGTJXN\QdJrd‰eŒ| ¢Ž«–­˜±›´ž¹¢¾§Ä¬É°Í´Ð·Ô¼Ù¿ÛÀèÌéÏéÐ òÕûÜûÞÿàûà"ÿâÿä#ÿæ3ÿç;ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù?,}ÀŸpH,Ȥr¹D8Ì"bD¢B„h»½F¡æò~;•Ddnr( ÇÓV",…‚eSO"0„…„~ $Ž~†$‘H ŽšG  Œ™„£J ¡¢¤HW††K·XF}½ÀÁÂGA;tkabber/pixmaps/default/docking/available-chat.gif000064400000000000000000000005571477701321300221270ustar00nobodynobodyGIF89a¥2NDQGTJXN\QdJrd‰eŒ| ¢Ž«–­˜±›´ž¹¢¾§Ä¬É°Í´Ð·Ô¼Ù¿ÛÀäÉèÌéÏéÐ òÕÛÝûÜûÞÿàééììûà"ÿâîîððÿä#óóÿæ3ÿç;÷÷ÿÿÿÿÿÿRÿÿ[ÿÿ—ÿÿ¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù?,ŒÀŸpH,Ȥr¹D8Ì"BEU¢BDj»½F§Ñftò~?•„†dnz(ŠÔV",…‚…è3%&%M +-/-(ŠI,020,–H ".1."£G  ,¢L W!°I^}ÈQÆCÉÊXÏÐÑÑA;tkabber/pixmaps/default/docking/available-dnd.gif000064400000000000000000000005401477701321300217450ustar00nobodynobodyGIF89a¥%MPTi X[\q Ž‹/ ¢-ª0¬1°1³2¸4½5Ã7È8Ì9Î:Ø=Ú=ÓGçAñDùFèNýGèY!úTþUú_#þa$þl4þr<ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù?,}ÀŸpH,Ȥr¹L8Ìb‚D%¢ÂÄh»½F¢'$ò~?dnn*ˆÊ¦ÓV&,‡ƒESO&2„…„~%Ž~†%‘H  ŽšG  Œ™„£J ¡¢¤HW††K·XF}½ÀÁÂGA;tkabber/pixmaps/default/docking/available-xa.gif000064400000000000000000000005401477701321300216100ustar00nobodynobodyGIF89a¥":::MMMNNNOOOPPP^^^```uuu¢¢¢¤¤¤¦¦¦¬¬¬±±±²²²³³³´´´¶¶¶···¸¸¸¼¼¼ÄÄÄÇÇÇÈÈÈÉÉÉËËËÐÐÐÑÑÑÓÓÓÖÖÖ×××ÚÚÚÜÜÜÝÝÝÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù?,}ÀŸpH,Ȥr¹$8 Ì"!D ¢Bh»½F Åóñ~9D¥cnj††ÓV(…eSO4 „…„~ "Ž~†"‘H ŽšG  —„£J¡¢¤HW††K·XF}½ÀÁÂGA;tkabber/pixmaps/default/docking/available.gif000064400000000000000000000005201477701321300212000ustar00nobodynobodyGIF89a¥'NDQGTJXN\QdJrd‰eŒ| ¢Ž«–­˜±›´ž¹¢¾§Ä¬É°Ì³Í´Ð·ÔºÔ¼Ù¿ÛÀÞÃäÉèÌéÏéÐ òÕûÜûÞÿàûà"ÿâÿä#ÿæ3ÿç;ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù?,mÀŸpH,Ȥr¹<8ÌâÁD5¢ÂCi»½F$QGDò~Agdn~(Ê'ÔV.ÂÅSO6}H †‡ŽG •F G ¤H©ª¬¥X°±²²A;tkabber/pixmaps/default/docking/blank.gif000064400000000000000000000001201477701321300203430ustar00nobodynobodyGIF89aÂ333QQQfff)%¿ÿÿÿÿÿÿÿ!ù,xºÜþ0ÊI«½8ëÍ»ÿ`(Ždin ;tkabber/pixmaps/default/docking/invisible.gif000064400000000000000000000005211477701321300212450ustar00nobodynobodyGIF89a¥*:::OOOVVVWWWXXXYYYZZZ[[[lllˆˆˆ¶¶¶···½½½ÃÃÃÆÆÆÇÇÇÈÈÈÊÊÊËËËÌÌÌÍÍÍÏÏÏÐÐÐÓÓÓÙÙÙàààâââäääæææèèèéééëëëíííîîîòòòóóóôôô÷÷÷ùùùûûûüüüþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù?,nÀŸpH,Ȥr¹ 8Ìb•R©QaÀt¢^³ÒhSBaÁ!Ibs:3žâ12¹›ÃCº+ "~I  ‡ˆH –GžH¥Iª«­¦Y±²³³A;tkabber/pixmaps/default/docking/message-personal.gif000064400000000000000000000003051477701321300225260ustar00nobodynobodyGIF89aãvj|o‚u‡yŒ}Ȳÿïÿï&þï.þñ9þñEþñUþòbþòkÿÿÿ!ù,rðÉI«½8ë]K!Ä0B`Zá¬kã2 š©­kÜqZ70¼ÈÕ ÇX—BcÈ<¦–LÃB¡@Z Œæ”jíd£E¢KÁÔ„š<),À ‚-q3Õòýaô) ~{bqy€3!#%'’“”•;tkabber/pixmaps/default/docking/message-server.gif000064400000000000000000000003031477701321300222070ustar00nobodynobodyGIF89a³ˆˆˆÂÂÂÉÉÉÍÍÍ{{{ÅÅÅqqqŠŠŠ¶¶¶ºººuuu¾¾¾¼¼¼………!ù,pðÉI«½8ë]㤢Ú1¬«à š©¬ûqZ»EÈÕ +~)ÁðX/å²éL‹ãi9–F‚Û1b³‰4™r€Óˆõ¤=L'ñ”Œ—K |})YZvxy3!#%'‘’“;tkabber/pixmaps/default/docking/message.gif000064400000000000000000000003041477701321300207040ustar00nobodynobodyGIF89a³µµµåååàààêêêííí{{{ŠŠŠqqqõõõñññüüüuuuøøø†††!ù,qðÉI«½8ë]iã䲚¡¬+à 0𩬠܉ŒÑŠ # ‚݀AaŠalC‹Ù<¡)„óˆv´U@ ›J˜ ܱ—bH„Ç‚õÄ@hŽ‚xªÎË%}~)†wx„3!#%'‘’“”;tkabber/pixmaps/default/docking/tkabber.ico000064400000000000000000000477161477701321300207210ustar00nobodynobody°h¶hh† hîhVh¾h&"hŽ'hö, ¨^2 ¨; ¨®C(VL(~M(¦N( ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ( DNGQJTNXQ\Jddre‰ |Œ´Í·Ð¶ËºÔ¼Ô¿ÙÀÛÃÞÉäÌèÏé ÐéÕòÜûÞûàÿ"àûâÿ#äÿ3æÿ;çÿ            ûÿùÿùÿðÿàà?à?à?àððøøüþÿ( DNGQJTNXQ\Jddre‰ |Œ´Í·Ð¶Ë¼Ô¿ÙÀÛÌèÏé ÐéÕòÜûÞûàÿ"àûâÿ#äÿ3æÿ;çÿÿÿÿ              ûÿùÿùðàààààððøøüþÿ( DNGQJTNXQ\Jddre‰ |Œ´Í·Ð¶Ë¼Ô¿ÙÀÛÉäÌèÏé ÐéÕòÝÛÜûÞûàÿééìì"àûâÿîîðð#äÿóó3æÿ;çÿ÷÷ÿÿÿÿRÿÿ[ÿÿ—ÿÿ¶ÿÿÿÿÿ   $$$  &)&  $(*($  #%'%      !!!!!""""ûÿùÇùƒðƒàààààððøøüþÿ( MPT iX[\ qŽ /‹-¢0ª1¬1°2³4¸5½7Ã8È9Ì:Î=Ø=ÚGÓAçDñFùNèGý!YèTúUþ#_ú$aþ4lþÿoCÿqF@:ÿsH«ŠFÉ„JÿxNaœBÿxOJ CJ¢D|˜H”IóRÿ|TP¤JV¤Lÿ€YN¨LU¦NV§Nÿ‚\†žVý…_ÿ†aL±Uÿˆdq«Xÿ‹gV²ZЍ^s­^ÿŽl¬¢dÿlV¶^®c`¶d\¸d[ºe`¹g`ºg†³jÿ–wÿ—wØ¢toºlXÀjÿšzÁªuaÂpmÂttÂwÿ¢†9Ônò¦…Ȳ‚iÈ|ÿ¥ŠhÉ{þ¦ŠkÉ|¨¼ƒlÊ~ê­‰~Ç€ø©ÿ©Žkσ̹¼ŒoІŠÊˆç·–ÿ±™¸Ã’rÖ¡Ë’tÖŽÿµžx֮ɘwØ’xØ“ö»¢ÿ¹¤ÿº¤ðÀ¥|Ü™þ½©üÀ¬Yë”àžÿÁ®ÿ®ÓΪƒâ¢±Ùª´ÙªÿÆ´…䦅æ§ÿÈ·ÿȸï͵ˆæªÂÙ±øË¾ÿ̼›å°òÏÄÀß·ÅÞ¸‘ë³ÿÓÆ•ï¸þÖÉÁ误¯¯¯¯¯¯¯¯¯¯¯¯¯¯'# ¯¯¯¯¯¯ "./EKB*¯¯¯¯$9AFg`VD(  ¯¯¯-)Js©£‚p†…m^I1Sƒ—¡®˜¦„‰vaM6!UŽ¥ “¨šŒxbL5¯J«¥–ˆ|~‹r_H2¯¯,nœŸ­¤udjl\C+¯¯¯OŠ’§{[J]R;¯¯¯¯3hqyiYN@@@çBàDÌ<'FFFGGGâOãOâP(AbJJJÛYÛbÛcWWWÕk6PtXXX,O|ÕtÔv]]]Ãm#Άφggghhh`iulllNf…É—ªcurrrao‚NltttuuuNn“vx|~~~ `édÞg솆†'rÛlîX€¯3wÏŠŠŠ$rà‹‹‹rñ’…¬'{ç'|ç"xô’†°5äb¾3„ê5„ê*€ø.„ú<Ší0‡û?ŒíNŽå3‰ü4Šý5Œý6þG’ï7ŽþN˜ñW˜îP˜ñTœóXžóZ ôa¤ög¦ñf¨÷k¬ùx¯ðm­ùq°úu²ûw´ümmmmmmmmmmmmmmmmmmmmmmmmmm m)mmmm(! %.8<@m+'  %.7;@Em2,# "-0/5:Gmm*IM3mm4$AF1mmmmW^_mmmmm?=>mmmPKJmmmmmmmBHLmmb`\VTmmmmmmRSUXmgfdcammmmmYZ[]mlkjiemmmmmQN&DmhO69CmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmÿÿÿÀƒÃããáÁÁÁãƒÿÇÿÿ( @ÿ=ÿ?ÿBéHÿHçLÿB¬ZÿRõT´[ ÿM6u ¶ddn…dLsþH'õQÿXôY¯jÓ]ÿR&/„qƒo"?jzÿ\#Èf+þX3±r¤p(ÿ_*A‰!‡x*m„"™y(ÿc2D&Èt,Ðm7;‘'èi7Þl:)–+ÿm0F5^Ž.t‹,ÿi=K”0E”5;˜4R”7ßtCCš2H—8&¥)ÿt=ÿpGFœAI :y–?ÿzFÿvOD¢?Q¢C…•J;¨A‚™GH¦DÁŒL°ŽO¬NÿOÿ}WO¦LÚ‰Ub¥K9®Kî‡[SªPÿƒ^G­OMªSÄ•ST¬Rªš[R±Pÿ‰cÓ–Z£\˜¢[ä’`S±Ze¯XHµZøf° aU´]Q·Y8¾WE»YX¸Xþp]¶\ÿ‘j!ÇRh±d^µeY¸aUºfQ¿dÿ•wÿ™q^½fõ™vÀ§u_½oþšzZÀlŒµqؤx»¨{¸­s¢°wPÅmnÀmÿ}É©{dÄm^Äpz½uó¤|XÅt@ÏkþŸ†ÿ¤‚Ú­~mÆugÆxİ„-ÚidËwø§‰þ¦‹²¹„ͲŠð¬nÍÿªh΂É„ÿ­ÝµŒþª–uÍ…qωÿ°“mÔˆtԆƽšÿ²›úµšuÔŽ’ÐŒq׋Rà…žÍ”ñ¸Ÿrד컞6ê…yØ’±Ë™ÿ» ÿ¸¦ÞÁ¡ÔĤ}Ü–“ÕxÞšþ¾¨ÙœŠÜ˜ó¾²†Þ¹Ó¡ÿÁ¬‚á›êƪñǦöïþó`후â¤<ø–ÿƶÿË·×Ô´âиæ®ÿɾçÌÁ²à®ÓسÄݳŒë­ýÏ¿‡í°ÐÛ¹ŽëµòÏÈ–í´ÿÓÃÚÝÀüÔÈ“ò»ô£ùȵöÌòèçðóñøûùââââââââââââââââââââââââââââââââââââââââââââââââââââââââ ââââââââââââââ -25+$âââââââââââ"',DN??:& âââââââââ"3333K`VSVND âââââââ 33==BB^qek`SN) ââââââ35#âââL‚²ÌÈØÇ¾Ã¸¤›ŠŠs”¡—zq`N95# ââââ3j‹±ÌÇÃÚáàÖ‹sl[_{zeeV>+âââââ!J}£À²¸¾ÚßßÍ‚sjTMdˆqZH++ââââââ 5n𹳤 ¤¤»“sj[TAYrfUC6âââââââ>pžª‹‹“‹yyj[TA=YhbF7 âââââââââ.Q€|°vsl[[TMQgÑjØmZZZ*P‚ÔvOšÑbbb°Ms·Έɉiiijjjˑƕ©elpppÈ™Zk„Èš+aªqqqMlÆŸ&b³0f¬Pn‘_Åvvv¥bwwwVäWåYå{{{[æSu€€€ aé m bꃃƒfë3tÈh쇇‡jík‰qãŠŠŠ‹‹‹sänïtäoŒuä4zÕqñ wå!wåtòuò)yè'{ç(|ç"wô#xô+~è,è%zõ4ã-€è%{öe½'}ö0‚ém‰Ç(~÷3„ê)€÷5…ë+ø+‚ø-ƒù9ˆì-„ù:‰ì.…ú‘Æ/…ú0†û>‹í1‡û?Œí1ˆû2ˆü@î2‰ü3‰üBŽî3ŠüDî4‹ý5Œý6þ7þF’ï7Žþ7ŽÿH“ï8Žÿ8ÿI”ðt–ÝašÞK•ðmÕM–ñO—ñQ™òSšòS›óT›óUœóVóWžóYžô[ ô\¡õ^¢õ_£õ`¤öa¤öb¥öc¦÷d¦÷e¨÷f¨÷h©øhªøiªøj«øk¬ùl¬ùm­ùn®ùo®úp¯úq¯úq°úr°úr±ûs±ût²ûu²ûu³ûv³üw´üxµüyµüz¶ü{·ý|¸ý}¸ý¹þºþÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ+$ ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ741*" Ü .5:@IRÜÜÜÜ<9741*"  .5:@DPVY]ÜÜA=9741*"  .5:@DPVY]adÜEA=9740)#  .5:@DPVY]adfÜÜGA=9740)# !.5:@DPVY]adfgÜÜKGA=3,&%)# ÜÜ5:?DPVY]adfglÜÜÜK>QŽŽ[;ÜÜÜ:?DP(-//IlÜÜÜÜÜBCÁÁÁÁÁ§#ÜÜÜÜÜÜP8‡‡‡‡LDÜÜÜÜÜÜÜÜ‚¯¯¯¯¯ÜÜÜÜÜÜÜÜÜOrrrrFÜÜÜÜÜÜÜÜhep}“–ÜÜÜÜÜÜÜÜÜÜÜÜÜ`\TSUÜÜÜÜÜÜÜ„zuqjmÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜWZ^ckÜÜÜÜÜ£›“Œ†yvÜÜÜÜÜÜÜÜÜÜÜÜÜbiosx~ƒÜÜÜܲ®¬© ™‘ŠÜÜÜÜÜÜÜÜÜÜÜÜÜw{€…ˆ‹ÜÜÜÜ»¸¶´±­«¦ ÜÜÜÜÜÜÜÜÜÜÜt‡‰”—šÜÜÜÆÄ¿½º·µ³°ÜÜÜÜÜÜÜÜÜÜÜH’•˜šœžÜÜÏÍÊÈÆÃÀ¾¼¹ÜÜÜÜÜÜÜÜÜ6œžžž¡¡ÜÜÕÔÓÑÎÌÉÇŨÜÜÜÜÜÜÜÜÜžžŸ¡¢¢¤¥ÜÜÙØ×ÖÕÓÒÐÎËÜÜÜÜÜÜÜÜÜ|¢¢n MMÜÜÛÚªN'''2XJÜÜÜÜÜÜÜÜÜ_M ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿ€€€€ÀàððàüÀÿþ€ü€ü€?ø?øðððððø€üÀÿÿà?ÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿ( @=Z@dAdBdCdBnCxIƒOxJƒQxRxTxXxNSƒZ—U¢ S¶c—d—m [¶g¢c¬n¢hÕiÕfêkà {ÁЬqêË}Õkÿ†Õ Ávÿwÿxÿ|ÿ}ÿ~ÿ€ÿÿ‚ÿ‘àˆôƒÿ‰ô„ÿŠô…ÿê†ÿ‡ÿ‰ÿŠÿ‹ÿŒÿŽÿÿÿ‘ÿ’ÿ“ÿ”ÿ•ÿ–ÿ—ÿ™ÿšÿœÿ±ÕÿžÿŸÿ¥ô ÿ¡ÿ¢ÿ£ÿ¤ÿ¥ÿ´à¦ÿ§ÿ­ô¨ÿ©ÿªÿ«ÿ¬ÿ­ÿ®ÿ¯ÿ°ÿ±ÿ²ÿ³ÿ´ÿµÿÀê¶ÿ·ÿ½ô¸ÿ¹ÿºÿ»ÿ¼ÿÇê½ÿ¾ÿ¿ÿÀÿÁÿÂÿÃÿÅÿËôÆÿÌôÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÑÿÒÿÓÿÔÿÕÿ×ÿØÿÙÿÚÿÜÿ,BR&;K^nw(#-DVd7?QamuSA CRanx|raC)0I[hu}viwG8DRaoxzobQ@+ 2K[iu}uhuZH9DSboxznaTbRA,4K\iv}uh\i\I: EKRlzznaVqcSC."9*'5[tf[uk]K<3F=71.Bi`VrdVDM6GC?>>B_Zwl^PYQ$!LKKIKO]PreZ`[T/VY[\]^[Qmafa]W Nbflnol\Ysflic_Z Xqx€wiWnlokea[ jƒ‰Œ‹†xcitqmh\f% {Žˆn\nuro\mzUpŠ…}n]vuu\kx„yJ‡‚xo_vvuet~„†g„}vl]vu]htz€}vnc[u]ensvtmc]\^acb_[ýÿÿÿýÿÿÿýÿÿÿüÿÿÿüÿÿÿüÿÿþÿÿüÿÿüÿÿøÿø?ÿôÿüÿüÿüÿüÿüÿüÿþÿþÿÿÿ€?ÿ€ÿÀÿàÿðÿøÿüÿþÿÿ€ÿÿà?ÿÿÿÿ( qqquuu{{{………ˆˆˆŠŠŠ¶¶¶ººº¼¼¼¾¾¾ÂÂÂÅÅÅÉÉÉÍÍÍÿeT3"!ÿÿjª˜ˆwpÿÿjUUUwpÿÿkUUUWpÿÿkUUˆ‡pÿÿkUUUˆpÿÿl»ºªˆ€ÿÿlUUUY€ÿÿmUU»ªÿÿmUUUº ÿÿmUUU[ ÿÿnUUÜ˰ÿÿnîÝṴ̈ÿÿnîíÕUÀÿÿnîîÝÝÀÿÿeT3"!ÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ( qqquuu{{{†††ŠŠŠµµµàààåååêêêíííñññõõõøøøüüüÿUD3"!ÿÿY™ˆˆwpÿÿYfffwpÿÿZfffgpÿÿZffˆ‡pÿÿ[fffˆpÿÿ[»ª™ˆ€ÿÿ\fffh€ÿÿ\ffª™€ÿÿ]fff©ÿÿ]fffjÿÿ^ff˺ ÿÿ^îÝÌË ÿÿ^îíÖf°ÿÿ^îîÝÌÀÿÿUD3"!ÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ( jvo|u‚y‡}Œ²Èïÿ&ïÿ.ïþ9ñþEñþUñþbòþkòþÿUD3"ÿÿZ™ˆ‡wpÿÿZfffwpÿÿ[fffgpÿÿ[ff™ˆpÿÿ[fff˜€ÿÿ\Ë»ª™ÿÿ\fffjÿÿ\ff»ª ÿÿ]fffº ÿÿ]fffk°ÿÿ^ffÌ»°ÿÿ^íÝḬ̀ÿÿ^îÝÖfÀÿÿ^îîÝÜÀÿÿUD3"ÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀtkabber/pixmaps/default/docking/unavailable.gif000064400000000000000000000005201477701321300215430ustar00nobodynobodyGIF89a¥$:::OOObbbfffhhhjjjoooqqqtttvvvxxxyyy€€€„„„………‡‡‡‰‰‰‹‹‹ŒŒŒ‘‘‘“““———™™™ššš²²²¾¾¾ÁÁÁÅÅÅÆÆÆÈÈÈÊÊÊÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù?,mÀŸpH,Ȥr¹ 8Ìb`CÝ¢Â@f»½F–‹æbñ~'›ÎEbn:0 ŒƒÑV"£QdQO" }H! †‡ ŽG •FGXE£Iª¨©®°±²IA;tkabber/pixmaps/default/icondef.xml000064400000000000000000000405111477701321300173100ustar00nobodynobody Default 2.1t Tkabber's Default Style Artem Bannikov tkabber/logo tkabber/tkabber-logo.gif toolbar/add-user tkabber/toolbar-add-user.gif toolbar/disco tkabber/toolbar-disco.gif toolbar/join-conference tkabber/toolbar-join-conference.gif toolbar/show-offline tkabber/toolbar-show-offline.gif toolbar/show-online tkabber/toolbar-show-online.gif toolbar/gpg-signed tkabber/gpg-signed.gif toolbar/gpg-unsigned tkabber/gpg-unsigned.gif toolbar/gpg-encrypted tkabber/gpg-encrypted.gif toolbar/gpg-unencrypted tkabber/gpg-unencrypted.gif gpg/vsigned tkabber/gpg-vsigned.gif gpg/signed tkabber/gpg-signed.gif gpg/badsigned tkabber/gpg-badsigned.gif gpg/encrypted tkabber/gpg-encrypted.gif gpg/badencrypted tkabber/gpg-badencrypted.gif browser/server services/server.gif browser/client roster/available.gif browser/user roster/available.gif browser/conference roster/conference-available.gif browser/headline services/rss_online.gif browser/directory services/jud.gif browser/jud services/jud.gif browser/sms services/sms.gif browser/aim services/aim_online.gif browser/icq services/icq_online.gif browser/mrim services/mrim_online.gif browser/msn services/msn_online.gif browser/yahoo services/yahoo_online.gif browser/gadu-gadu services/gg_online.gif browser/weather services/weather_online.gif browser/x-weather services/weather_online.gif docking/blank docking/blank.gif docking/chat docking/available-chat.gif docking/available docking/available.gif docking/away docking/available-away.gif docking/xa docking/available-xa.gif docking/dnd docking/available-dnd.gif docking/invisible docking/invisible.gif docking/unavailable docking/unavailable.gif docking/message docking/message.gif docking/message-personal docking/message-personal.gif docking/message-server docking/message-server.gif docking/tkabber docking/tkabber.ico roster/user/chat roster/available-chat.gif roster/user/available roster/available.gif roster/user/away roster/available-away.gif roster/user/xa roster/available-xa.gif roster/user/dnd roster/available-dnd.gif roster/user/invisible roster/invisible.gif roster/user/unavailable roster/unavailable.gif roster/user/unsubscribed roster/stalker.gif roster/user/error roster/unavailable.gif roster/conference/available roster/conference-available.gif roster/conference/unavailable roster/conference-unavailable.gif roster/group/closed roster/group-closed.gif roster/group/opened roster/group-opened.gif services/aim/away services/aim_away.gif services/aim/chat services/aim_chat.gif services/aim/dnd services/aim_dnd.gif services/aim/unavailable services/aim_offline.gif services/aim/available services/aim_online.gif services/aim/xa services/aim_xa.gif services/gadu-gadu/away services/gg_away.gif services/gadu-gadu/chat services/gg_chat.gif services/gadu-gadu/dnd services/gg_dnd.gif services/gadu-gadu/unavailable services/gg_offline.gif services/gadu-gadu/available services/gg_online.gif services/gadu-gadu/xa services/gg_xa.gif services/icq/away services/icq_away.gif services/icq/chat services/icq_chat.gif services/icq/dnd services/icq_dnd.gif services/icq/unavailable services/icq_offline.gif services/icq/available services/icq_online.gif services/icq/xa services/icq_xa.gif services/jud services/jud.gif services/msn/away services/msn_away.gif services/msn/chat services/msn_chat.gif services/msn/dnd services/msn_dnd.gif services/msn/unavailable services/msn_offline.gif services/msn/available services/msn_online.gif services/msn/xa services/msn_xa.gif services/rss/away services/rss_online.gif services/rss/chat services/rss_online.gif services/rss/dnd services/rss_online.gif services/rss/unavailable services/rss_offline.gif services/rss/available services/rss_online.gif services/rss/xa services/rss_online.gif services/sms services/sms.gif services/weather/away services/weather_away.gif services/weather/chat services/weather_chat.gif services/weather/dnd services/weather_dnd.gif services/weather/unavailable services/weather_offline.gif services/weather/available services/weather_online.gif services/weather/xa services/weather_xa.gif services/x-weather/away services/weather_away.gif services/x-weather/chat services/weather_chat.gif services/x-weather/dnd services/weather_dnd.gif services/x-weather/unavailable services/weather_offline.gif services/x-weather/available services/weather_online.gif services/x-weather/xa services/weather_xa.gif services/yahoo/away services/yahoo_away.gif services/yahoo/chat services/yahoo_chat.gif services/yahoo/dnd services/yahoo_dnd.gif services/yahoo/unavailable services/yahoo_offline.gif services/yahoo/available services/yahoo_online.gif services/yahoo/xa services/yahoo_xa.gif services/mrim/away services/mrim_away.gif services/mrim/chat services/mrim_online.gif services/mrim/dnd services/mrim_away.gif services/mrim/unavailable services/mrim_offline.gif services/mrim/available services/mrim_online.gif services/mrim/xa services/mrim_away.gif chat/bookmark/red tkabber/chat-bookmark-red.gif chat/bookmark/green tkabber/chat-bookmark-green.gif chat/bookmark/blue tkabber/chat-bookmark-blue.gif xaddress/info/red tkabber/xaddress-red.gif xaddress/info/green tkabber/xaddress-green.gif xaddress/info/blue tkabber/xaddress-blue.gif tkabber/pixmaps/default/roster000075500000000000000000000000001477701321300164155ustar00nobodynobodytkabber/pixmaps/default/roster/available-away.gif000064400000000000000000000005231477701321300220420ustar00nobodynobodyGIF89aÕ%ÿÿÿ‰edJÿæ3ÿç;\Qûà"ûÜĬзNDÙ¿¾§ÿä#QG­˜òÕɰ«–XNèÌÿâ±›¢Ž¹¢´žÍ´éÏÛÀÔ¼TJûÞéÐ rdÿàŒ| !ù%,pÀ’p(Äd±À, ”Ca:}BŽCèà°^AÇâM  ‘1* ƒqG+JÀïó£ †‡Q  …~‰E …‡†’% „‘|šD˜™›BO~~I®PPvDA;tkabber/pixmaps/default/roster/available-chat.gif000064400000000000000000000005431477701321300220220ustar00nobodynobodyGIF89aÕ3‰edJÿæ3ÿÿÿç;\Qîîÿÿ—ÛÝÿÿRQG­˜ûà"¾§ììٿĬзÿä#ûÜÿÿNDéÐ ÿâŒ| rdèÌXNÔ¼¹¢ððóóéÏ´žÍ´ÿÿ[¢ŽÿÿÿÿàTJ÷÷±›äÉééÿÿ¶ûÞɰòÕÛÀ«–!ù3,€À™p( Äd±À,”ÃÀ`:}B“Æ¥1±^]LãM(„r*ƒ͈ؕãYf1*()$ ƒQ &E"%/ - ›3  •šJ2O , §CVv¿P½CÀÁPCA;tkabber/pixmaps/default/roster/available-dnd.gif000064400000000000000000000005231477701321300216460ustar00nobodynobodyGIF89aÕ&ÿÿÿŽi þl4þr<¬1\Ø=þa$½5Î:PMÃ7ùFú_#q ª0³2èN¢-èY!çAÈ8¸4Ì9ñD°1‹/ ÓGX[þUTÚ=úTýG!ù&,p@“p(Äd±À, ”Ca:}B ˆ’°^Iž%äM ‹ÈâQ*ˆÃ±qG/šOÀïó£#"†‡Q …~‰E …‡†’& „‘|šD ˜™›BO~~I®PPvDA;tkabber/pixmaps/default/roster/available-xa.gif000064400000000000000000000005231477701321300215110ustar00nobodynobodyGIF89aÕ#ÿÿÿOOO:::ÜÜÜÝÝÝNNNÐÐÐPPP×××¼¼¼ÓÓÓ¬¬¬±±±···ÚÚÚÉÉɸ¸¸¶¶¶^^^¦¦¦³³³```¤¤¤MMM´´´ÑÑÑÖÖÖËËËÄÄÄ¢¢¢ÈÈÈÇÇÇuuu²²²!ù#,pÀ‘p(Äd±À, ”Ca:}B(ñ°^¢PgãM Œ ã°( B¡qGÀï󣆇Q…~‰E…‡†’#  |šD˜™›BO~~I®PPvDA;tkabber/pixmaps/default/roster/available.gif000064400000000000000000000005031477701321300211010ustar00nobodynobodyGIF89aÕ'dJ‰eÿæ3ÿç;\Q­˜èÌûÜNDÿä#ûà"Ĭ¾§Ù¿QGзûÞéÐ rd̳¢ŽÔº´žÛÀÞÃòÕÿàɰäÉÍ´«–ÿâéϹ¢Œ| TJ±›Ô¼XN!ù',`À“p( ÄdqÀ”À`:}B ED‘°^!%èãMÉã ) ¡‘qG Sˆc°/$# ~E  …'Œ ŒBšCŸ ¢›PCA;tkabber/pixmaps/default/roster/conference-available.gif000064400000000000000000000011141477701321300232050ustar00nobodynobodyGIF89aæRu=v?:S™ÿÿ££óê“ÿ¼¼ÿ^^ðåvöÿ±±ÿSSdö^Ÿÿôì›òèˆïãlu­ÿÿæÓ£Èÿòè…z°ÿÿuuóê’_ëñçƒ\à×Åÿ  â\\7ˆÿëøÚÚ±Ñÿqÿïâj ÆÿX¢æÿ¯¯àéØ9ÐDDó½½òè‡ mÿDÿÔêþ{ÿmÿÿÿxxÿ11¼×ÿ*ÿîádÿDD1…ÿÿ>>€³ÿÿzzåÒÿÿ€€ÿ**ìÝOxÿÈ·ÿŽŽÿÜÊçÕ$¼Úõÿ77>ŒÿÿŽ»ÿc§¯Ðÿÿ¢¢Ê¹ÿ !ùR,©€R‚‚†††/H…‚‰Š&M…=P”‹„!+›ˆ•%N5*Ÿ;"šš$³ƒ9 L<'½´J ? È,´04DÒ7ŸR1 :EOAá B.K 3)î-6Ip8ânƒÈÀ`ˆ‘pâˆ)E HàÆRt} ;tkabber/pixmaps/default/roster/conference-unavailable.gif000064400000000000000000000005461477701321300235600ustar00nobodynobodyGIF89aÕ-VVVAAAØØØ©©©¼¼¼{{{®®®ÑÑÑŸŸŸéééÝÝ݇‡‡»»»ÃÃÔ””ÆÆÆ˜˜˜„„„›››ppp¡¡¡```××׳³³ÏÏÏÈÈÈ¿¿¿žžžºººuuuŽŽŽƒƒƒÂÂÂwww€€€‘‘‘ŠŠŠ†††¬¬¬oooÐÐÐzzzÇÇÇ!ù-,ƒÀ–£…fR @XŠÄ€uº$›$· d.Šª Ài¸€Áæàô¢÷0b€”Ïixpqsp|tqc …,*!” $%”•—#'”  ¢)+cd^ª¬HJÁ³µÁƼOJA;tkabber/pixmaps/default/roster/group-closed.gif000064400000000000000000000001141477701321300215620ustar00nobodynobodyGIF89a¡îîîÿÿÿÿÿÿ!ù ,”©ËÝà€Ñ€@ãÅusç}Œ—ø O Vîk;tkabber/pixmaps/default/roster/group-opened.gif000064400000000000000000000001141477701321300215630ustar00nobodynobodyGIF89a¡îîîÿÿÿÿÿÿ!ù ,”©Ë혴‚Þá®Ìy ØA™ø Ñʶ.S;tkabber/pixmaps/default/roster/invisible.gif000064400000000000000000000005061477701321300211500ustar00nobodynobodyGIF89aÕ+:::OOOÿÿÿüüüäääWWWóóóëëëþþþôôôûûûùùùlllÇÇÇYYYòòòXXXÈÈÈÆÆÆæææ½½½ZZZ¶¶¶îîîÐÐÐVVVÓÓÓËËË[[[èèèéé鈈ˆ÷÷÷àààÙÙÙÊÊÊÃÃ÷··ÌÌÌíííÍÍÍÏÏÏâââ!ù+,cÀ•p( Ädq€Êa`¡`>£«@Â@  ØÀeó!(ÀÊ€‡Ähèd@Sáˆqb`‚rPyR!%)'‚R&‰E *Y—B #C¢£¥žXBA;tkabber/pixmaps/default/roster/stalker.gif000064400000000000000000000003251477701321300206300ustar00nobodynobodyGIF89aÄ]]]nnn"""ªªª### $$$666MMM999!!!:::777III444FFF“““………¦¦¦›››!ù,R`%Žb`dZ ¬¨cв/,Æc,µm@’V ¡ÐKƒAƒI ƒÄ²I2& jõ= ¸]E–p&EÛ]Dh ¯ç«ü!;tkabber/pixmaps/default/roster/unavailable.gif000064400000000000000000000005041477701321300214450ustar00nobodynobodyGIF89aÕ$:::OOO™™™tttyyy“““ÆÆÆ———oooÌÌ̇‡‡‘‘‘ÊÊÊ………šššfffÁÁÁqqqxxxjjj€€€‰‰‰‹‹‹¾¾¾ÅÅŲ²²ÈÈÈvvvŒŒŒhhhbbb„„„!ù$,a@’p( ÄdQÀ”ÃÀ`:}B ƒÄа^5‚!ãMˆb) …‚QpG #ÇãC°+  ~E…$!Œ"ŒB„PJšD¡Ÿ ¥$A;tkabber/pixmaps/default/services000075500000000000000000000000001477701321300167225ustar00nobodynobodytkabber/pixmaps/default/services/aim_away.gif000064400000000000000000000005271477701321300212630ustar00nobodynobodyGIF89aÕ4ÿÿÿÿÊXÿÇSˤ`¿‘I|||ÿÀJÏ©gOOOÿ¶=ÿÊYÿÂMÿ±2ÿºDϪhЫiÉ¢]¾•Rÿª/ÿ¿LΨeÿÌ[È ]¼LbbbÓ¯pΧeº‹DÿÄȘcÌ¥aÿ³=À“Nÿ²5Ê¢]É¡^ttt¿’MÿÄQÿÅOÿ«)ÿ²4Ò®lÿÁJÿ±4É¡\¾H@@@ÿ¯5Ñ­k!ù4,t@špH‰È! òá’D«…JžÐb¢Á¸@°Y@Á2‡f(€²Ø ÓB@Fæxq‚øÿ~H‡ˆQ%#!†1Šq0+†ˆ‡•$/ &E.*"O›œŠF'X€€qG‚fA;tkabber/pixmaps/default/services/aim_chat.gif000064400000000000000000000005321477701321300212350ustar00nobodynobodyGIF89aÕ>ŽŽŽÎ·YηWк[ÿÓ)ÿåSÿèXÖÂfÿãSèAèBÿÖ5ÿÕ2ÿßLÿÖ4ÿÛDÿÏ/ÿÓ5ÿ×0ͶTĨDÿÑ)ÿÕ4ÿÝAĨGÿé[˵QÿÛ8ÿØ=¿¢>Á¥GÿØ1Å©HÿØ3ëMÿÖ/Ô¿cÔ¾b̵SÌ´RÿâMÿèY×Ãg×ÃfѼ^ÿáJÿäOÿÕ=Ä©CÓ¼`ÿãQϸXÇ­JͶX×ÃkθXÿßJÁ¦>Ñ»\Ó¾`ÕÀd!ù>,w@Ÿp8‰Èb¯%Ѐ°rÍ^;grjJ©4%íÖ ðbaTJ6¦·€Hçæ~O?’ÄÁ`8h£S#9,(vShGp 0'ˆ8 6 $o41 F:be!ZF" ¯iF5¸DA;tkabber/pixmaps/default/services/aim_dnd.gif000064400000000000000000000005271477701321300210670ustar00nobodynobodyGIF89aÕ4ÿÿÿÿSWÿX[Ë`g¿IS@@@É\c¼LWÒlqÏgmÿ=NÌciÉ^fÓpvÿ5EÿOTÿDPÈ]eÿ/Eÿ2BÎelÏhnÿ5Hÿ[\|||ÎekÐioOOOÑkpÉ]cÌahÿSZÿJQÊ]dÿMT¿MXÿQWbbb¾RZtttÿY\ÿJRÿLV¾HRºDPÿ=Kÿ)<ÿ4EÀNYÿ4D!ù4,t@špH‰È!€Ó°’D€BdŠ€žÐ₤Ê\°Y@aã‡f(€òz ÓB@" xµ øÿ~H,‡ˆQ †'Šq-3†ˆ‡•#)E102O›œŠF.%X€€qG‚fA;tkabber/pixmaps/default/services/aim_offline.gif000064400000000000000000000003501477701321300217360ustar00nobodynobodyGIF89aÄyyyttt}}}uuuhhhˆˆˆ{{{www†††xxxvvv‚‚‚~~~zzzƒƒƒlll€€€rrr„„„kkkqqq|||dddeeejjj………pppiii‰‰‰ggg!ù,eà'Ž`’èXJ¤$Ð0Ú„¼pyÿÊXˤ`É¡^Ñ­kÿÇSÿ­)¿‘IÆVº‹DΨe¼Lÿ±4ÿ°/¿‘Jÿ»AÓ¯pÈŸYÌ¥aÿ³3Ò®k¼ŽD¾•Rÿ³1ÇžXÿÄQÿ·8ÿ¿LÒ®lЫiÿ¶=É¢]ÿ«)ÿÊYÿ²4ÿÀJÇWÿ²5ÿºD̦cÿ±0–PÿÌ[ÿ±2ÿ³=Ï©gÿÅOÿ¯5ÿª/ÿÂMÈ ]¾H¿’MÿÄS¾GÀ“NÿÁJÉ¡\ΧeϪhÉ \Ê¢]!ù>,q@Ÿpè‰È! sÒ’D—qIžÐb+Rí°Y€@A‡f(æ ÓBÀâU  xÑ2¢D$zE&eGj%,z3"2 i=+9F<(`b 7XF6© 4fF)²‡QfA;tkabber/pixmaps/default/services/aim_xa.gif000064400000000000000000000005251477701321300207300ustar00nobodynobodyGIF89aÕ%ÿÿÿ™™™“““©©©žžž’’’¡¡¡•••„„„›››«««ššš¤¤¤———@@@‡‡‡ˆˆˆŸŸŸbbb–––ƒƒƒ|||¥¥¥§§§¦¦¦OOOœœœttt”””¨¨¨¬¬¬­­­†††˜˜˜!ù%,rÀ’pX‰È!€ó’DÀÄÊTžÐâB-°Y@b`‡f(àa@ ÓB€¢Q`êð¢ÄèûûH†‡Q …‰q…‡†” $ŽœEcOš›‰F#XqGfA;tkabber/pixmaps/default/services/gg_away.gif000064400000000000000000000005441477701321300211110ustar00nobodynobodyGIF89aÕ,ÿ¨§§kkkÿÿÿêêêåååáááÜÜÜÅÅÅÖÖÖïï﨨¨úúúóóóÑÑѵµµýýýíÉ÷ÑöööîÊùÓýÖóÎäÁöÐëÇÿçcøÒÿØß½ŸŸŸåÂêÆñÌѱаÿãGúÔØ·ìÈõÐÙ¸!ù,,@–pÈH#r¨6‹É"@0>‰€Že2J]™*ËárØd¾EÌÉÄ™ˆ>Ï*@"Ñ\<˜Ð %þ$€~‰% ,Š €’ ‰™‘  ¢¤œž© •­¦¯ ± ³•œ¾¸²¾D¾»,ÄGA;tkabber/pixmaps/default/services/gg_chat.gif000064400000000000000000000005271477701321300210700ustar00nobodynobodyGIF89aÕ(ÿY¤kÅ™æÿíÉß½óÎùÓÝ÷ÿåÂöнïÿîÊýÖ[×ÿ÷ÑäÁҲϯ­ëÿKÓÿÿçcʫήìÈÿãGÿØ3ÍÿõÐñÌÙ¸øÒˬֵêÆëÇÞ¼úÔkÛÿ!ù(,t@”pˆH#r¨6‹É"`0 ®IâÉÁÐA Rä*&&22<«€BaáØ‚w  ‚ c%‘‹c"!•cRU'–Nn(‚‚KP¤§ ‚·µ¯GA;tkabber/pixmaps/default/services/gg_dnd.gif000064400000000000000000000005441477701321300207150ustar00nobodynobodyGIF89aÕ.ÿ¨§§kkkÿÿÿêêêåååáááÜÜÜÅÅÅïïïÖÖÖÑÑÑýýý¨¨¨óóóúúúµµµó00í..ù11ý22î//öööö00÷00õ00Ù++ä--ú11å--ÿkkÑ))Ö**ê..ø11ŸŸŸÝ++ÿ22ñ//Ø**ì..ß,,þ22ë..Ð))ÿ‚‚!ù.,@—pèH#r¨6‹É"à0>‰ÑcB]™™‰Š’Ym¾ÅÇÓ„RÏ*@"¹PJ‘Žæ$þ€~‰$ , .Š €’ ‰™‘ ¢¤œž© •­¦¯±#³•œ¾¸²¾D¾».ÄGA;tkabber/pixmaps/default/services/gg_offline.gif000064400000000000000000000003311477701321300215640ustar00nobodynobodyGIF89aĬ¬¬±±±———¥¥¥œœœ«««¦¦¦•••®®®£££ªªªŸŸŸ   ›››¯¯¯¨¨¨­­­²²²“““ŽŽŽ¤¤¤ÐÐÐÇÇÇ‘‘‘ššš’’’!ù,V 'Ž@ž¨‰ŽªØ–i €ù’€¤q³…@p¸4~%D“ , ¯€@& Ç` Å9DcÐA '±± K Š¡‚yÛ†ìÅ­X+o+!;tkabber/pixmaps/default/services/gg_online.gif000064400000000000000000000005001477701321300214240ustar00nobodynobodyGIF89aÕ"ÿùÓíÉß½îÊýÖóÎäÁåÂöÐ÷ÑϯëÇÍ®êÆõÐÿçcÿãGÒ²Ù¸úÔñÌѱ޼øÒˬÿØÐ°ìÈήʫطֵ!ù",]@‘p(H#r¨6‹É"@0>‰€Œ`aé\™AÀh ¾ÅCEY<Ï*`0P6‡$Ç&hŠhE! ŽVUPGqXKLžKŽ KA;tkabber/pixmaps/default/services/gg_xa.gif000064400000000000000000000005431477701321300205570ustar00nobodynobodyGIF89aÕ*gggJJJŸŸŸnnnttthhh]]]}}}bbbSSSOOOXXXÌÌÌLLL›››†††•••ÒÒÒ×××ÍÍÍÅÅÅŽŽŽÚÚÚÕÕÕÔÔÔêêêÓÓÓÊÊÊÖÖÖIIIÆÆÆººº´´´ÀÀÀØØØÐÐÐËËË»»»æææÜÜܳ³³!ù*,€@•p¨H#r¨6‹É" 0>‰€ÎCj\™›‰à"(U¾EÉè¤ÁpDÏ* ÑÈ\P’ $þ!€~‰)*Š€’ ‰™‘ ¢¤œž© •­¦¯ ±³•œ¸²D¾CÄDA;tkabber/pixmaps/default/services/icq_away.gif000064400000000000000000000002471477701321300212700ustar00nobodynobodyGIF89a³ Z¥Î"ÿÿÿüáøütttOOO@@@bbb|||!ù ,T°ÉÙ ˜‚!®½“UqÅÛGšB'måºjg ƒ•Z~⻆Bá†Ûœ ¤2ùℨ4ûAŠƒ@…Å Òhw0`]qs$‡©´çR‰ùhp;tkabber/pixmaps/default/services/icq_chat.gif000064400000000000000000000003601477701321300212420ustar00nobodynobodyGIF89aÄZ¥Î"ÿàqÿÝqÿÕpÿíqÿóqÿèqÿñqÿÓpÿåqÿïqÿÚqÿüÄÿö…ÿòqÿØqÿØpÿäqš6ÿéqÿãqš‘6!ù,m`&Ž( Âiž£Y²­ÉÂëKÛB+®­€P¸S  ø~¦£€0l&„áA»] ‹âH8ŸQÉ™p PÞ.³Á0D“]4 d1QCoO%€5@‰262(/*[!;tkabber/pixmaps/default/services/icq_dnd.gif000064400000000000000000000002471477701321300210740ustar00nobodynobodyGIF89a³ uÍÿ66ÿÿÿüáøütttOOO@@@bbb|||!ù ,T°ÉÙ ˜‚!®½“UqÅÛGšB'måºjg ƒ•Z~⻆Bá†Ûœ ¤2ùℨ4ûAŠƒ@…Å Òhw0`]qs$‡©´çR‰ùhp;tkabber/pixmaps/default/services/icq_offline.gif000064400000000000000000000002001477701321300217360ustar00nobodynobodyGIF89aÂWWWuuu………¾¾¾ÿÿÿÿÿÿÿÿÿÿÿÿ!ù,EHºÀž{Ë5ZÅÓÅyA¥LÝ8J_ˆbØ]Ú9CþÂÓ—¨ˆ†-G"m#|µ2‰$ÌXZLj+&…Y½5B;tkabber/pixmaps/default/services/icq_online.gif000064400000000000000000000002001477701321300216000ustar00nobodynobodyGIF89a¢Z¥Î"üáøü!ù,EXºÀž{Ë5ZÅÓÅyA¥LÝ8J_ˆbØ]Ú9Ä0¼ðôå;Ž)FË‘LGšÒrû´2é8Œmf+ˆ+&…ej'X;tkabber/pixmaps/default/services/icq_xa.gif000064400000000000000000000002471477701321300207370ustar00nobodynobodyGIF89a³ AAA«««½½½ÿÿÿüáøü@@@bbb|||tttOOO!ù ,T°ÉÙ ˜‚!®½“UqÅÛGšB'måºjg ƒ•Z~⻃á†Ûœ¤2ùℨ4ûA ˆ„‚@…Å Òhw0`] qs$‡©´çR‰ùhp;tkabber/pixmaps/default/services/jud.gif000064400000000000000000000003601477701321300202510ustar00nobodynobodyGIF89a„wš]*šh2±{A!Ãÿ$Äÿ(Åÿ)Åÿ-Æÿ/Çÿ2Çÿ5Èÿ:Êÿ@ËÿBÌÿNÏÿTÑÿVÑÿYÒÿcÕÿnØÿrÙÿvÚÿ„Þÿ‰ßÿ•âÿœäÿªèÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù,mà'$)ž(‰]Öô˜è˜iÙEE ¦mLEâHèR—YíÖ@OËeÕz0ÏÑ„R¡L E!Ë{D$‘‡ca y Gƒ¡h¿y€âPp;#%:;†ˆ‰'‹‡Ž‘“†“”!;tkabber/pixmaps/default/services/mrim_away.gif000064400000000000000000000002321477701321300214520ustar00nobodynobodyGIF89a³ 6Ü"›ÿÿÿ|||ttt@@@OOObbb!ù ,GPÉ j˜†½AÖVx0*z‚j§’¦‹ôk¿1~ |ÏëÁ`HBÂ!Qg!qhÄU’tn5Ÿ¯º|Îç;tkabber/pixmaps/default/services/mrim_offline.gif000064400000000000000000000001451477701321300221360ustar00nobodynobodyGIF89a‘¥¥¥MMM!ù,6”™Çÿ@s*ÙÀŠoêE¦I¥…ŽêX²_ _±ùʶ¹‘öQ—cœ*A!äXD““¦¡;tkabber/pixmaps/default/services/mrim_online.gif000064400000000000000000000001451477701321300220000ustar00nobodynobodyGIF89a‘6Ü"›!ù,6”™Çÿ@s*ÙÀŠoêE¦I¥…ŽêX²_ _±ùʶ¹‘öQ—cœ*A!äXD““¦¡;tkabber/pixmaps/default/services/msn_away.gif000064400000000000000000000005311477701321300213050ustar00nobodynobodyGIF89aÕ-ÿÿÿg”¯LvYwœSo’HaWu™s¶`¦Mg‰e…®NiŠmŒ³`©AWuaªv“¸w”¸D\{@@@E^}Oj‹Ib‚Zyžg‡¯Wuš^}£d…®OOOb‚ªbƒ«bbbt’·z–¹tttgˆ±x”¸|||\z oŽ´YwXu™Le…!ù-,vÀ–P((†H¤ÀÁHŽÉáR‚ˆШ€0= †lRˆ>ÜNNß^^ÞXXÚEE»99¢55º99ÛHHÛJJÚFF¨66°88Ù@@Ò>>|||@@@OOOÖ??Ô??¶99½::±88àeeß``«77ßZZtttÝQQÝSSàffbbb!ù(,t@”P((†H¤@XŽÉá²xШ‘øD ”lR°xD,މXy ¡ÆZÉ LäÑñ`ŸÏþ€cE†‡J …'‰D%"&…‡†”($Ž#œDmš›”nR{¸¹HA;tkabber/pixmaps/default/services/msn_offline.gif000064400000000000000000000005241477701321300217700ustar00nobodynobodyGIF89aÕ'mmm‹‹‹xxx———”””‰‰‰kkk†††zzzrrr~~~dddƒƒƒ[[[lll………hhh€€€cccqqq„„„___|||eee‚‚‚ŽŽŽŒŒŒsssaaa–––™™™ttt{{{•••vvv‡‡‡‘‘‘˜˜˜!ù',qÀ“p(†Hd@Qh ŽI¢b@€Ðh @0UŒl2ЀTB‹X‰$ ÇZù`XäÑ1`Ÿïû‰E~"T$s'% s–k m# bnž{µ¶CA;tkabber/pixmaps/default/services/msn_online.gif000064400000000000000000000005301477701321300216270ustar00nobodynobodyGIF89aÕ8Lvg”¯So’Ywœs¶G`€NiŠ`¦AWuWu™v“¸w”¸e…®D\{Pm’HaMg‰aª`©mŒ³t’·^~§gˆ±Lh‹Oj‹E^}Ur—cƒ¬kбz–¹s‘µb‚ªXu™hˆ¯oŽ´YwZz¢\|¥^}£v“¶Sp•ZyžVt›\z d…®Jd†WušIb‚Hbƒg‡¯x”¸Ro”b‚«bƒ«Le…Yx !ù8,u@œp(†Hd`Â8 ŽIâDAˆ$ Ðh€AIl2pˆHF†X9H ÄZix4äÑ1`Ÿïû‰E~ s8" '!$s5,14%7*k&+).(3b 6/0- {¹ºCA;tkabber/pixmaps/default/services/msn_xa.gif000064400000000000000000000005271477701321300207610ustar00nobodynobodyGIF89aÕ!ÿÿÿttt±±±™™™¢¢¢›››¦¦¦•••ŠŠŠ®®®¨¨¨„„„œœœ«««‡‡‡¤¤¤£££@@@²²²OOOžžžŸŸŸ‹‹‹ˆˆˆ¯¯¯‘‘‘|||¬¬¬bbb!ù!,tÀP(†Hdà0ŽÉá’°Ðh± Šl2`ˆXy($šÆZP@äÑñ`ŸÏþ€cE†‡J… ‰D …‡†”! ŽœDmš›”nR{¸¹HA;tkabber/pixmaps/default/services/rss_offline.gif000064400000000000000000000002551477701321300220030ustar00nobodynobodyGIF89a³ˆˆˆÂÂÂ{{{ºººqqqŠŠŠÆÆÆÍÍͶ¶¶ÊÊʽ½½uuu¿¿¿………!ù,ZðÉIë,4ç„_ AGy$¨¡Š—‰&°ùªj0plèíQèÅ2 Ű`8"ÊQ3„*ËŸ.y`Gcw€X†DyÄ@«×î˜ ¯e6OȯD;tkabber/pixmaps/default/services/rss_online.gif000064400000000000000000000002541477701321300216440ustar00nobodynobodyGIF89a³±±±ééé{{{äääàààñññŠŠŠíííqqqõõõuuuùùùüüü†††!ù,YðÉIë4¦5ç„W BLÉ,h¢Š—™pÁJ$º¨E~̱À1Ýnôž!a„!“#&ìpx”¹B9èb<4aò(pN«/ϰ8­Ìl:Ÿe_‰;tkabber/pixmaps/default/services/server.gif000064400000000000000000000010541477701321300207760ustar00nobodynobodyGIF89aæAŒŒŒÿòÿÉiiiÿÏÿøÿ²ÿ¾ÿÚÿÁÿÓÿëÿçŒcÿÜÿ³ÿõÿ·ŒƒqÿØÿæÿ­ÿ¼ÿ´ÿíÿÙÿ¸Œ€iÿðŒcÿÈŒbÿûÿÌÿÂÿéÿåÿàÿäÿÕÿ®ÿáÿÛâµÿÃÿãÿî¤r ÷°â©Œ`ÿËÿÇÿöâ±ÿÔÿÍÿÖÿâÿ÷ÿèÿ¹ÿ¯ÿ»â¯!ùA,‰€A‚ƒ„…† †ƒ ?(Ž=9  &8… .$4† ; #3†,)5­…'<: >Ž  *!ŽA-%7"ØA”¸â0@+61áâ 2/âAöÿí@p€¡@;tkabber/pixmaps/default/services/sms.gif000064400000000000000000000002271477701321300202730ustar00nobodynobodyGIF89a³QQQeeeggg„„„vvv|||bÇhÔˆˆˆnnnuí}}}qåséÿÿÿ!ù,DðÉ9½Øâ ºÞŒß(ZrAÛ®p4 ‚ÀÕ¼87øÈ‡]p½|€R‰ 1 OFóG¨V§…A«À ¾ßéÏ‹;tkabber/pixmaps/default/services/weather_away.gif000064400000000000000000000003501477701321300221460ustar00nobodynobodyGIF89aÄJJJ~~~ŸŸŸºººtttnnnhhhbbb}}}˜˜˜SSS]]]XXX›››†††OOO•••¢¢¢LLL“““œœœIIIŽŽŽ©©©‹‹‹¸¸¸!ù,e 'Ždižf ’ê:DˆA6YÊÌÁ1±©7E%¢™ÁH€MIÎ.€tP‰‚À‰N’¤ö€` ¥`Ì#k 3 dz=.Ã!A—Þ¶/ðz]c…y…$…‚‹(‘’#!;tkabber/pixmaps/default/services/weather_chat.gif000064400000000000000000000005121477701321300221240ustar00nobodynobodyGIF89aÕ!ÊŠë¡ÿÿÿõBÿçÿëÿÙÿùžÿÓÿÖÿû¼ÿÝÿâÿÔÿåÿû·ÿð#ÿð)ÿ÷uÿÞÿø„ÿÒÿ×ÿãÿô=ÿìÿðÿú¦ÿÛÿîÿ÷QÿúŸÿá!ù!,gÀpH,C€$à8\ç p:«Ej5À h—Äd 38<¼`a2¸0Å&€S‰Cã¡H¼XH[ €vK  tkMx  hY[]_V‚ia‚X¥FJ©L­A;tkabber/pixmaps/default/services/weather_dnd.gif000064400000000000000000000003361477701321300217560ustar00nobodynobodyGIF89aÄJJJ‡Yÿä]]]bbb}}}tttnnn†††ŽŽŽIIIÿüäXXXhhh•••›››SSSŸŸŸLLLOOOÿÿÿ!ù,[ %ŽdiŽ@ªš*ð(‰q €¨JÐÏNA¤œN†èÀ #‘”Im°+ú “EM4è^»ƒ…xK °)À8£' Û톯ø@=.š£ù}€r v„rq!;tkabber/pixmaps/default/services/weather_offline.gif000064400000000000000000000010601477701321300226260ustar00nobodynobodyGIF89aæEÿÿÿ®ºÃÄîäÿ\\ÓÝú¤ÿMMÿiiÀÜÿeeòÇéÿBBÿ]]ÿ£õá²ÿ[[ÿÿÿïÿýÿµÍÉíÿOOÿ99þÿ88¸ÿAAÿNNöÿ++¨Ì¯ÿ??ÿ''Þÿÿÿaaÿ Ñÿ..ϼƭÛÿGG¹Õ!ùE,€E‚ƒ„…†‡ˆE‹‹‰< †70-…*.9(4„"8+B )5®‚ !:# ¼Š= AÀ/ 'Ê%D 6ÊŠC,?&2;ãE>@3$ç †  1HĨQ¢ƒ;tkabber/pixmaps/default/services/weather_online.gif000064400000000000000000000005501477701321300224730ustar00nobodynobodyGIF89aÕ,ÊŠ¨§§kkkÿÿÿë¡ÿÿåååêêêáááÜÜÜÅÅÅÖÖÖïïïµµµýýýúúúÿõBÑÑѨ¨¨óóóöööÿçÿÞÿâÿîÿÝÿú¦ÿ÷Qÿð#ÿ÷uÿìÿø„ÿô=ÿû·ÿãÿùžÿð)ÿû¼ŸŸŸÿåÿëÿúŸÿÛÿð!ù,,…@–pH,Y€$à8\ çPp:«Ej•À%h—Ä$Á…¼`a’E¡@©’†€SËiµùt¼XHƒ$„`Ž* ,„— ƒŽ–¡  ƒ¦¨ ¢­ š±ª³ µ&·š ¼¶ÂD¿,ÈEA;tkabber/pixmaps/default/services/weather_xa.gif000064400000000000000000000003321477701321300216150ustar00nobodynobodyGIF89aÄÞÿJJJlÿŸŸŸnnnttt}}}›››hhhSSS†††•••]]]ŽŽŽbbbOOOLLLXXXIII!ù,W Ed)žh@¬+R)K Œ³Faªs}ç‰GC¢ Ñl¸Bp¨€D£ŸRHtN #à`Û|nQÛ@§³š|FQk8ÙýfÛÑôwjüAlü¨þªþp‘ýLuüx—ýGqüRzýIsü8fü`„ý6düŒ§þ…¡þ•­þv–ý‰¤þKtü?kü€ýDoü;hü!ù;,tÀ@,…È!á0q@ P ‰':B \,Ãí…†Jv²HÍ«ÁõÁÌÞS@)éÐ6xI:,/!5‚T076 K ŒC"9V”;#$-_ œž.gi¥Rr«x¥ŒD]¸‚A;tkabber/pixmaps/default/tkabber/chat-bookmark-green.gif000064400000000000000000000005221477701321300230760ustar00nobodynobodyGIF89aÕ+Z¥¸Î"»´Ä!¿ Æ!¶Á  È!±Í"°Ì"¨Ê!¹²µ³¾ ¦¯¬À Ç!§É!½ Å!à ª®­·©º«Ë"¼!ù+,oÀ•@,…Èáä``@@ H‰#:Z—“Û<*„ H+-“(‚Ï‚“jO¨LáÄôØ“ %* T"zK‰C‚ V +&#_—™fh Rp¦v ‰D]˜³A;tkabber/pixmaps/default/tkabber/chat-bookmark-red.gif000064400000000000000000000005271477701321300225550ustar00nobodynobodyGIF89aÕ:|îÿllô11ùIIö<<ûUUúNNó''õ55ÿjjøGGõ33÷@@÷BBö::ô..ó,,ö88ü[[ò""ñïðïùLLùJJñ!!ýccðîïøEEðûVVý__ü^^þhhúQQïüYYü\\ô00ñò%%ó**ûXXõ77÷>>úPPþeeò$$ý``úSSó))þggøCCýbb!ù:,t@@,…Èa`•@ H8(Ž":B‹éÆíŒFÆ•SHÍ›ˆdJÉÞSÀ…5€iD4xI'+-/81‚T!3*KŒC6V”:_ œžgi¥Rr«x¥ŒD]¸‚A;tkabber/pixmaps/default/tkabber/gpg-badencrypted.gif000064400000000000000000000005271477701321300225020ustar00nobodynobodyGIF89aÕ9ÂÂ쬭………¬­­³²²ÉÉÉ»»»¡¡¡ÝÜÝÀÀÀÑÑÑÒÒÒ‚‚‚¸¸¸xwx€€€ÓÔÔ‡††ÕÕÕÃÂí¬­ààá½¼¼¶¶¶–——ÛÛÛÇÇÇÍÌÍ|{|«ªªÈÈÉÁÁÁººº±±±ØØØ×××­­­ÏÏÏÄÄÄÆÅÆÎÏϪªª|||¾¿¾ÊÊÊÃÃ‡‡‡³³³ËËË‚¨¨¨º¹¹———WWWÿÿÿÿÿÿ!ù9,tÀœpH,¹›R‰Þ„€ðDÞJá`èV7ŒM¸´Ù¾ÅÛ9½>Þè$ܽüÖãÉJFbúq!x7$ -.*„# 2'16„(,43„) /0+„ 5"– „uN·MºA;tkabber/pixmaps/default/tkabber/gpg-badsigned.gif000064400000000000000000000002531477701321300217520ustar00nobodynobodyGIF89a³ìììãããÝÝÝÔÔÔè»}ÊÊÊê½ÅÅÅûûûÂ~"¯DÅsçççÿÿÿˆˆˆÿÿÿ!ù,XðÉI«½8kéºÿÞCÀœg08bѹŽ ,ÀÁí(‹`"–{8F:EGƒ‘lXiABÔJu(­ ÃÂ`Ýv¿àt#Ú Þ'ö D†6ø¼Þ;tkabber/pixmaps/default/tkabber/gpg-encrypted.gif000064400000000000000000000005301477701321300220250ustar00nobodynobodyGIF89aÕ=ÂÂ쬭………¬­­¨¨¨ÈÈÉÁÁÁ–——ÎÏϳ²³ÊÊÊ”“”ººº€€€xwxÝÜÝž½¼¼­¬­ààá³²²ÃÂÃ×××¶¶¶¥¥¦ÛÛÛÁÂÂÓÔÔ‡††±±±|||‚‚‚»»»º¹¹ÀÀÀ®®¯ÇÇÇ‚ÏÏÏÕÕÕ‡‡‡ªªªØØØ­­­ÒÒÒ|{|«ªªÄÄÄÃÃÃËËË¡¡¡ÆÅÆÉÉÉÑÑѸ¸¸ÍÌͳ³³¾¿¾———WWWÿÿÿ!ù=,uÀžpH,=žR‰,ò,€(€×òX“Á À¥6y‡Ýr'®òÊV4’'ð&Ûߥ|¹¦hP§Â¦Qy¹6 1! *3D<+-209; ŠC<84: &–V%#7$)¢I5"; .­s¹UUA;tkabber/pixmaps/default/tkabber/gpg-signed.gif000064400000000000000000000002511477701321300213010ustar00nobodynobodyGIF89a³ˆˆˆÿÿÿçççÅsìììãããÔÔÔÝÝÝè»}ÊÊÊê½ûûûÅÅÅÂ~"¯Dÿÿÿ!ù,VðÉI«½8k ºÿ 0F!œga0—t qt/WØ€3ü @¬à ÂoIXÅ àÌ~ˆê3*™jŠâ 5~ÏÕ²Ô€j· ÜhþÙØïøL;tkabber/pixmaps/default/tkabber/gpg-unencrypted.gif000064400000000000000000000005331477701321300223730ustar00nobodynobodyGIF89aÕ=ÂÂ쬭………¬­­¨¨¨ÈÈÉÁÁÁ–——ÎÏϳ²³ÊÊÊ”“”ººº€€€xwxÝÜÝž½¼¼­¬­ààá³²²ÃÂÃ×××¶¶¶¥¥¦ÛÛÛÁÂÂÓÔÔ‡††±±±|||‚‚‚»»»º¹¹ÀÀÀ®®¯ÇÇÇ‚ÏÏÏÕÕÕ‡‡‡ªªªØØØ­­­ÒÒÒ|{|«ªªÄÄÄÃÃÃËËË¡¡¡ÆÅÆÉÉÉÑÑѸ¸¸ÍÌͳ³³¾¿¾———WWWÿÿÿ!ù=,xÀžpH,…¼dòhäYP9ä±&ƒA`;¥ò;å.LíñÈH4“'èšÛe%RI—y êTØ4*/nE<6 1! *3‚D<+-209; ŽU84: &šH%#7$)¥f5"; .°u¼eeA;tkabber/pixmaps/default/tkabber/gpg-unsigned.gif000064400000000000000000000002401477701321300216420ustar00nobodynobodyGIF89a³ ûûûÔÔÔãããÅÅÅÊÊÊìììÝÝÝçç爈ˆÿÿÿÿÿÿ!ù ,MPÉI«½8kŠºÿ ‡ pœ§ GtF$@at/'Øðq#1‚s ñ`²Äa8AÆCº$B¯X*SâÌz«Íj<l ôgÃn»3;tkabber/pixmaps/default/tkabber/gpg-vsigned.gif000064400000000000000000000003451477701321300214730ustar00nobodynobodyGIF89aÄìììè»}ÔÔÔÝÝÝãããûûûÊÊÊê½ÅÅÅÂ~"¯DÅsçç爈ˆÿÿÿÿÿÿÿ!ù,b $ŽdižhªŠMë¾0Ù"ÁÜ7! ­l´@` Z?ˆcÙ Š…4ÑJeƒñ(¤`@áÁÀŠÛ‡z( ¨Éf$ý>,oøyÎÍûõ# 8„„qs0Š.+Ž+!;tkabber/pixmaps/default/tkabber/tkabber-logo.gif000064400000000000000000000173041477701321300216340ustar00nobodynobodyGIF89ac–çÿ ")+)/1.796>@=9.â24äFHEKõ"?êMñD=ãQSPWø`ÿQ@ádÿ5MìeòjôqÑiÿY[XcßpìjîMLæCdÿ`Eàcö |¡rÿa ‚–-dÜnÿ5xÿrçKVêbda€±A[î‘V˜4bPãzÉŽ{¹.w¹%tãž':ið9oÓœ."sÿjkiFeñ$™=ßsUá#¢"Mq¸‡Ë~ÿ`q‘"‹°&Žl\æoqn"—we`è¦>/yþ0}æ"¥6]gë'’˜LvË*§'/§(’¤#ª2&¬ #žuJsõ+¡Stvs{_â1Ÿa)¨H(«;-„ÿ:þ6¤Cxzwd{­2Ý(²6vjè/²(Jù|~{4´ ]xò7Šÿ>œ6±:2²AD†þ;¶;˜¼~nçz‚Œ€‚?”Ðqƒ£@ŽñB°:{‚–EŽêY‚÷@ÿ9¹9Tˆû„†ƒ?³R|xëLÿ;¸GG–Ý>¸@>¼,A½C¨‹>³a7ÅA®{‰‹ˆH—ÿu…òE¾FT”ÿeøJÄ(JµyGÁAI¿NGÄ;Oª´NÃ2QÆYœóZ›ÿ\žïIÐQÄLKÎ(u“÷VÀ]W±­ošühžþXÍ.a­Äa«Ða£ÿXËCYÌ;ZËK_º™yœù^ÊRi§òkªâl©îmªèn¦ÿgÒ8eÌ^aàcÓBa×7~¤úm¼®eÑYhÒRjÓLdÞ#{ªÿoÓDt®ÿoÌoqÓ[~°ý³ÿ~ºâƒ³úuÛLvÝDzÌ•ƒ¶÷wÙa€Ð‰}ÜV|Ü]…ÅÆ·ÿ‹ÂÛ{ì-†àS„Üo¾ð…Þg–ºþ‘¿ÿ“¿ú€ñ"ŠàbŒÚ€“ÈÔŽâ]’álšÒÀ•æp”êd›Ùµ‘óE˜ék–í_©Êíœèy«Éû—òV äŽ¡äŸ©ë¥ñl§îx¤òu©ìŒ®æ§°î™°ó†¶òŒ»ò”µú~ÊÜöÚåðâåäñôòÿÿÿ!ù ÿ,c–þÿ H° ÁƒFˆ0aaC† &œH±¢Å‹!b˜€! 'BžèHrㄇSª\Y0â!wì1³¦Ì"Cz4)‘¥ÏŸeØ81A¤Ì&)š(mBdiÓ&YdÊ Ùñ$†€jň °jÀnezJ$L˜4`â¤Uk6 ˜§)¤î‚ãɬ[óÄÕW·jÝÎã§ ¡Ãˆ ù9ܦ Û·L‘Ö¤Zƒ †zõ~úäõkµsŸÏ‘ó#鑤N¨;™–$i!ÇŽÁ˜m’§Ñs©ò\˜ùç¦Mº>é¶Lð¹tíÚ¹S¥ÊTóç¦P³n½8Žu0`ü´Ê5ªJš!FþîžÐ[%£M¡8Ÿ[¶ÌZºxíâÅ“V+ذúµvÕ2=úôÅŽ©)¹°²J%CL%ÞI•w#¡„¢‹.ì¹'_<úèSO2Æt8Ì0Áà·Ks¦”ÒÉt¯YWX%ÂÃJ+n8A×G òæ B‰$B‰&¶Ø¢Œ5á ƒŽ<úÈs=ØLsÌ4zLˆÎE‡ši‹½æX£¬Â +˜,r=,¸D7´ÆšhòË/ÐDsÍ;¼ŒcŽ=øäCÍ4x*Éd‡öáG"j¥°VueܲЖšXâÆP ÖH^™] "˜¬ò‹›ÒÐŒ1ÇÓO=In“'žòy_-µhb ’(àþ†Š &‚Ð`x<õtãhüa ,Ås )õu(*6܈º6¢âÉé1|>‰js©­vXaqÌË/•Îú‡"N„PÙ]˜98…z€J/Â^S8KN³,³ô*›ç’ÐÓ'ªÎIw"€…å±È*­TjɬpT±Á¸5–wÃoDrI1·\óÍ7ô¸£Î4Ú0;o½£*™¯¾Òîej~œI+¾´² &ÿ ‹AGcêºÕ V¼qÉ%·sÍ5ë¸c48ËλMÒIË{/´ Þ"sü(èk®øò Á³ZbÉôêE6T`R¹ZéðÄ‚Œ2 1B_ìŽ=õ°ãñÝI3òþÈOJ»_ÕªµvXÖ,·ÒŠ×^ƒmf˜¡Å `…×O0ˆÁ„ m MŒÜGÓë¹Òz7o¾}†h2ହ¦ˆ/-~x⊟kÅZX 9å00áæpoþÑîŒSo½K./7L–jLÔüþøbÒ°‹á–¼þÇ!˜ñ†Vtß‚K“«”»‚,ò6Üœ ïqñŸ¿:ýô³Ï6Êè7Õ°*‰¤#}+ @ØÑ3+pïX¨ÀCl”ø@ ^0ß"ˆÁŒôiC^ë˜û>¦ ~Ä/~ûØ“©P•ª~Y5spF/z X€–ˆ„%°§=îu 9¨Qø,2\€þw˜Ã<á‰`ÄBÔ Æ™æ>z±cûð ?>Èmä D}k^'¤ÄT«-T—º‰ëÕð O°BÈÅ@ž )aˆƒ±Eû#Oy«7ØÁø1~S!§š´¯iU-P'êß YÆFâ‡xC÷º÷l"X¹ÈKvÀ9žF¨êÐ’†Ç>vøñ”ì?6¦¼å…Jü\)ÁŒ/‚…ê’!$µ8¼á ÀüžCÚ˜Žœ€“q$ÄiLQ‹apŠcxÓà6¸ÑGT‚ð‚­ÔˆHèUT‹ÄpF°ZFP’‡0ÃÖi…'Àl|ÔD8ÂÉ´f‹õþÙÔ1¸Á¤ñ•û@žž®ˆEü”?ž@/ž!NŠñ-¼„9#Qˆ7øÒ h| d0L)=¨g”‰ÏMuŠŸÃûÜÕ!P= ÒT÷{N*ž1´¡5ô……DAq HB ë|ž Hm¡gY ãÔ€Ò™ñ"e4õ6*|,j!âf-Hñ¡e£7íDo!ÑKPô…(„/ƒªQ¨à¨ ‰H9Òe†2^yË#ñœ–Œ¶Ò>YV-x±qdãÎȆ3nšSþŒ¢ýP)T¸®IÅ2Á@ÒN€Ò¤xj"3جª¾Ô•Y$¡4ÖQÓlÖ׸þÅp Q‰žU­z*Q ƒÞ’ ÃDHQRPOzUPÅ)?¶4§=MIMrå©ôS T\#ëp­W¬ÆþìgiUë:¿0T&è0(ÁBb„`Yˆc&ñþ ¯Œ¦Òœ‹¯èÚo›$œÅ7 { q\7·Xìlq ‹H86¼pÈídŸÐ[ôzà’(i‰f‰eJÂ9Í|&ÇšHÊ‘jd$“Z~TaŒzÃÀ¬Õ.l¿H[r~ÂãªFa´`½;üÇz…&„¡ ÷dæ“ö¹´¼æu‰O{)OEÂÁ’£°®=¬MÚÓKè…¸„Z{I^¡2ÇèþVtv’¤ Ã§9®>ñúd¦9ׯMb^`kAu¼øÊ‡}­3Ü]Xt™¬bNk/™T& —Ç/røèiäºnQKÎS~‰·ßª^µtÈE…9¾AŽRgùÔ ¦˜X í` …¹z„n™@k1ð/n†Rd"¹¾Ì¼oh¥*ͪŠPº¨ 6Ü1R;›¨Nuw½ûÝDÃAä%¯£a€^,0|8&,Ogî¥N†ò½’Á dgUßh6:Èo@Û®MìbŹBï¼£ðôÀ1 ÀÖ>€š×Œ¹óÈ„ £’7¥¤t‹ö^ΪÇ=ðad #¨xÇ;þ˜-¤yÏÛøvm4¤] F’“§7.„¬AkZ£½%ø6^N"î8Lb‹±h7Íß䙣Hú¸<È1y ÃéB¢w½Q®ò•¯¼å㌨ ažV ÓœàG¯¼9|G¾§~>tRÑöãM:º>æ‘!y4êBòÆÔQ¾G£ç÷-»ÌõKèAæ@%¸å pt½bÈÓb×G•Äžsî “!{ ýîñ@G<Êáôr £|G¹7¬ _´|…UWµ!œxm3^áeÏÊB@ß6|²™ÎœF_ì>§aƒØ@Æ8Þ‘! Åcχ~9¦O}o„ãúÞhSß}þ±rÖùb…/#(Îzx23ÚÖç±<`IC¤oŽÃ'—,ô»‘Voà°ÇÆñQ÷æÏë0zå €ÓåhÚ×z­çz¾@N[§.¯†V½”x5‡>ðh>  ·{'Ð{§‘l"fMFUÜ`r‚2î`©@ ´°Zh å0,´`´à ­ Zó ÞÇ:êRNã‡VŠÖhO~ ×c ·@'ãöaÀW#…Ó€ ù€ž—!÷ðà` ùQ5ÒPéÓÇ žP%Mu ÐÀ&­Çƒ†c88~TQ˜QÛf=æ" sgGMeyš–RÃWàPöïÐqþ÷a &ãM¥ ä†Þ û£ŠqÑ  ʰ&kÒ ¿À2 @¹ gus(TOÐ"/ÀcG „ÑkM¨dL¦_MZЕ r?ýb"À éà ÒP%mð†À ΀‰k" [³5.s8d A(„‘µNwÁ%àdyñ^M0_à‡#˜REç$YE5R‚´À ¨ðœ0¼À Ä Ë  ¹  ʸ ʸ5‡B=ШK¤8fãõ/ÀÁ2 GÕs5n}8 £2Z2æˆ*‹¬ò‹á©à ÖÀõ¨ ì! º ¹ %‡B0«€81„N‘¤[hÄþ3`e÷mQ#Ð#Õ » tÆ\Í•'Í0”CÙWü‚:(rwð ÊÐ ¹ ºÐ#&É ²%³b0ÏøH‘19ö33¹‡I¡YMÀYud‹ùµ_Ôdõ@né–+È Ø8ÿ°a™À ¾@’¶0!ºÀ ¶°%¬  «  ]ó5_ƒNÜ#Ií$“4)9zHO)Ê„i£4U¢¢õP…VxD"ò èðw (®ár²̰ }© §` §p —`˜0s˜f1oÀNBõ•w™ÃÄ{”‡iÊ5tÛœ¹q÷Мv'¢7}ä “˜"Žáf1n‹þ0§0!¡0›spePiâ-I‘„Qh„F%`.P“·ç{á¸$ “4ÔP…Ëé™ iw£wzá ¼ ±ÖÑØÙv ~•ßI ‹À'p‚€ˆ 3‹0Ð?`X [ÀÄßC#Á d¼&W&GdGà?P–iaŠ!(æ,ÉÖáÀ³+Áq“„«“~`_U5©ssp "¼%¿0˜ƒ™&ú¼k€ÅØ,ËMW0S€o z07\Î¥qBÿ‘"–¼Îm<¾øfÊK&„"~€-eà  °Ï€Ì TÐÊ9rþÅšÐÙ,ËW`Ð}Ð ­£`ìa¬‘©‘”mPÑw‘ÌI* tÒ±?Õq²q£ÐÏÒüÊÝÒWðÒQMT€ÐS°Ð£ ¨ Ñ:ŽE]D0ìŒ7d“é{¥ñ¦áVh±ÃMáYâψÐÊkðYŒýÒT]ÕU½ÐzÐ|0R¤AG&KÎs"®QÑ>|I–ÌË‘\ÆâÀAº? þ¼Òw6ØÓR=UÐzÐQpL5NQÂE‹)ÀÆòÔÂ:™Ê*ÒÀOq±wð+}¡x}&TÍ×TmÕ£]ÚP–‡gÑñ$t‘Ñþñ„a}AF竉-«éÀKÑÛM[`ãÙk€SÚTëÐV GP–ž´LÝTeÍãM'B–ÁÙ=éÛà *M{á±Z6h@ Î×MÕìA07 bðÉÄ¥À&C]É–Uô¬ß;ðÓ+!9Þˆ´GË¥ëJ4°àhÐà~-Ú.áAÀ3OP§GgÍ‘lÀ§g©‚ÝcâéYðµÛÛ4¾º60ýà=á6~7 O C©ô­}")65þ 'pým@6W·Š««b`ТmÕS`å7z þ:`áNPWò5Ë]ûR"½Ø köÇT¨s‘pN#1;£]åy~®å}.]°ãrö$æÖJXÔÐD€ÝiîØƒ "&9Aqnà•nã¶®X^„b°Q€d¥æsö,"Ã'ûÑ „' ¾Z!9qþê ±&±ñ•ó@]ÀºîΔùä„p3èžîw ïþð¹^-/ñöî}þ@Z€Ú“°»w/#fZPòñ²í ¹è7 Ÿ&ÏÅ«hï½Uñb€dÀYõå“ÃV|Î"àa0â!_GµÜxòkV5à@<¦0 ]PN`O‡;‹™]\h ŸÏó옜%zò*P- 4 @\€Î»ü”7¤²ö¥ÞO )qŸøÜ˜õ#/WEqLJÁ‡žuGy”4}Å…ª@Ý`ìU#X¿ø¹g“=ÿïåfnAŸÆZbJrÞ4 çÎ^â¨r¯øh“8ÓèJaö»;bwã,¬"qµûúq¯‡Çoáùf!áþÈ¢N-ÁP5~¨>Û±¯îî·Xîf¸|OˆÛiÒä’ÐßùÄÏýä"ú oL¸ï#µôV{AO%­ò?¼þÛõîŸðqbÇÀ&`â’ÔÉT°iÓ¶iÛÖpš±aµLu’çDŽþ}RäH’%Erœ!¥ÊŽ(;®œÃÌ#v¤h¦ ÂNª†“ØðÅZµTu"D$&K“M:m•åJ–U1LÀpBàŽœý$¬ ¨Ã‰CƒSe*ãÆ•Oݾ Y5%U˜-cÊ̺cD"` zdªÖO‰@«xtºp?uiWjÝ«3{Øl’3N?:…þ=66ô°Š%µÙ±”ãcÖ%«NuIu*ÖZ щP’à`Ʀ…zØ"Fs=¶F7²Ô—sc†Èk÷ß΂‡3œbâRIOPMþŸd¹åUÎÌÚc`–œ¹ ‹û°`FÕÆÉr•©xäÆ#ËFI¦ NA¯› òJ’R:Ùe°Ãè;k8?ÀØ!„—øCî¥×þS « j³-³®’DASv9+ÅúÒB*Œô[ ÃÖ&3/¥Ê²ªé@ÜÂ8ˆIJ)å•QlД‹N#¢B˜dœÑ? ›«L«­¸Ê"‹0ÒˆI&å/¿,å¢îÂHa \ØIÇèZ®Ãg¡¶ËvÀþa‡*Ã`£H EH^éPQ&$Ž&*Ä %5c®¼”Bxƒ&Å᪄‚<õܳO>÷œ¤>²À!„"€ ÍEÝÊÕF;BÖ]0µ‡ €" (Τ×=ÙsO6a£   ˆUáªU¦u5Õi¯ÅöXVpÁ[oÍ”W_{– :ÎXb…’u€4päÙ·’ÈaYe•¶}íÕ· þ¥@ÝV@b ƒw=ƒŽAèP˜á3 @"†$pÀX@Šxå}*‰ "X Ey H™‚u;€y…b@ .¸8ã .Æùf.$þ–@‚.fÀ…=6温$¶‚€úi¨§†ºbŠ%  h@˜™f |ö™Ž›ˆak¡+f!A:é’xH‚)œfàb¢ë:o«`k¿ük°Ç&ŠÛ]‚ØnÛí‘x€›!@ž:o@àr¾à[ë¿cœ ›k=â°NÙÅë`Üq“xØò$Š0A_¨óÆ}èŠù6Üï™k6x‰‚ –æ!èamGXoÜu | È0!•©vwå–'†9p!øƒ îa‰n#pA)ð`¼uçI‚~é-¶¨c!L¨`Y~þ—[‚½…BÀö=¨€ þr@†=0¯}Í{ß?d—„¥a cCŠP!äÀ&€B&eªI'¬ÒÐB †` ÙÆ:Fðqœ1¨öpEø!ð@!’ÁˆBÄÃð Ã6‘m6 âǃ ^p‡j¨ƒì°E;b‹DáDΰ}L|"C?ùYQ‡=Ôb¸F:ÒÑctâò(C5†DŠ8ÌáyÈE1z‘ެ#јGÆÕ¡Ïcc/X‡1ôÐZ´ƒ YÈ;² wyÉL6ó“tTƒ' <àö¬¦c7„VQŸƒä§!_Q5Ìo¤!)©Iy€Ò{Bn ÌçÕ©E,²ó’L n*’œž”§)…žôÚHÉ VRY̤¥Çƒ,u$ kN3ÀÓR–Óœ§Äf.7d «^%IXM:V”¢´¬Q5çÒ€j¼P<¬pm X V§¶5¥P-kJéêWÖ-ÛT“žô¤E ëXM ÖÀ±p@ÙÀ@­;YÔš¶³ÀgA Œ–´ @gK[ZÓà´ €b+[·ÐV´ÀmP;ØÊž´­P€âζ¶È%ÀiKZÐÈõUºÃ­îlE;€ÒÀ¤)5©t©ÞÖ„V´¸5€` Üõ²79ƵíðÚW<´pÕ;tkabber/pixmaps/default/tkabber/tkabber-logo.svg000064400000000000000000000266261477701321300216750ustar00nobodynobody tkabber/pixmaps/default/tkabber/toolbar-add-user.gif000064400000000000000000000012041477701321300224200ustar00nobodynobodyGIF89aæj×ÜÎÅÉÓåàîÀòé÷ûð“Hñ’Jì…9óœUåo(ìƒ:Ü`öŒLÁâg óŒIÍA)®wIè|0÷¦cøªhï†L lCé}2íŠ=¨g2ªn<¯yMèx+çj.ø’Pô›TÛ]÷£_àaÄñ•J÷ \ ô¡[ ÏS2¼ó™Pë„9¯{N¬sCö¢^ºët<øšZÝ]ìˆ:Òï‘Eçy-îŒ?ôœT ìr5ñ•KÈó‡Eìz:îBäl"©sFôŸYø§eås(ÊÚZú©kÙ[ðŒFñ˜Oäm*Ç$ä¯yK½Œÿÿÿ!ùj,á€j‚ƒ„…†‡ˆ‰Š… K‹‡.’„><›‚ Q1¦j+SCg&\D–±4Z)(7=0±V;E[AT/ ±$5Pc:MOJ‰ii…X-'2ŠÚ…B,N]Y‹å…#8_6ˆÚöö„ aIdõ÷ø‚Œ‘2㊘2@üBS ’*~€æ;Ah,˜PED0`èbF 48€ d(BƒR%K—0,˜™reK/c.¨8ÍM ¼è$* Ó§NcIJ(;tkabber/pixmaps/default/tkabber/toolbar-disco.gif000064400000000000000000000022461477701321300220240ustar00nobodynobodyGIF89aççBÿ*\ÿU¬W-^ÿGÿKuÿzÇiwÆfFqÿ@mÿa·WÀô™w—ÿq’ÿ¹ÉÿsÄcyMQÿe‰ÿCžPgº_›³ÿ‚Ïj#VÿLÿ[ÿhŒÿNÿY²TPÿ‰®ä®ÁÿJÿ{šÿ½Ìÿk¾^‹Ôs©½ÿW~ÿW‚ö CÿQ«P+ŒET|ÿsäV­XcˆÿkŽÿŠÎ‚µ×ÐHÿ.GsÄann¹Êÿf®&r »ËþOˆË1‡tG‚ÊYçÁÐÿ¦»ÿ°ÔÎX¶U”íQZµP¶ÏéAœO²ìm´Š“¬ÿ˜Ö††Ðn£Ý•=¡>9‹y4dÿŸ¼ìPµ³ìqª´Qzÿ˜Ñ M©N“ĺ nŸžÛ™Ô–6fÿ˜Ì³“Ò‹.ŠT}‡"‚[ ¶üJ¤W˜Üz¤äƒ“²ñ¶ÉùæææÆÎ(aè|Êi)^óÅì½Åñ®7˜D˜·êãçö"m¢j¼f=–n¹ï–Ÿà‡£ÿ{Ìai»a«¾ÿ£Ç×fö TÿŠÒs—¯ÿŠ¥ÿ‚Îl±Ãÿ©øsÈZ™Ý}u•ÿyÆi±ÕÏ”Ûvf¹_ixQ«SV}ÿV’±¼Ìÿe¹\'ŠBªÿŒ¸ÄG•‡®é¾òšTÿ³Åÿ¾Íþ²ë0{¨£Úž0•>&p£u­¿ Fÿ[»EŸÁÞ”¬ú¹Óå €U4jéB¾YÙb¸YÍ×úÅÒÿF|ÜNówÀ{(q¤2bÿ@œMšÝ}Y€ÿBoÿ?{Ê„·»‰Òq.eéSÿªÅí¬È焦ð‹§ÿ8gÿR±G¿Îÿ¨åˆªÇák¹iz­ÅF¥G•®ÿH¥L‰Òr§å†’ØwŽÓ~³îŒzªÍe§Oxÿ>H=šJQçjÿXÿgŠÿF¤J˜±ÿ×r à€e¿QY¡ Cÿ‚ŸÿY¨u]´DpÿnÂ[ŒÔs›Ý~´í—Ø„._ÿލÿCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ùÿ,þÿ H° Áƒ*üg®¡Ã† 6ÒiE3YZ‚d‚¨Ðœ a[4«€ªOrL™Kh.X7HÊ…b AZl½˜|YiУHÀðäxc&P'¾ ¶©O‚æB”áà*0uB°ðBCA•6£ž 4g‚˜¯Tý¨¶ËøZ)zö(‘XsÓ*ˆðaã®'g–À"a€‚€W*jÜÖÇ’ƒ2DØ,wlwZL˜á®H%>ˆZc”+\Œ2<¡Kg¨¶UÈH?²Rr‘€"­ Ý-@ˆÌJs¢h¢B †fÙf5áân º”ašô‹ŽkRì„Äáá w,ze̵pÈHX8rŠ“•0 Ë0A=Ë$Îi<07¥ pÁèõS˜p+žÂ$¶\Ðð7V¼xƒ€ pB1jì± ²tËä5Îì´Ø‘9DÐW¬â‰6EôÐC%©ä’;tkabber/pixmaps/default/tkabber/toolbar-join-conference.gif000064400000000000000000000020641477701321300237650ustar00nobodynobodyGIF89a÷nnnwww„„„þ6ˆˆˆVVV1*%ëa;ñùLîú9òHï}`F1-)Aðñ”K```–=ñKîý‹5‚`œ-ôìˆ8ø‚d÷•QßdXìë„5*õýŒ6ù›X@ñ?1&ø¢`í‰;ú†/ð”I‚O+dè###í?Õz4öv$ZI:"÷[_²ß`"pÅn.év2¸èw&òjÓ*÷ï’Fõ¢\Ê&ô–Q2ôTíú)öýŠ4ú&öç]&ÿŽ7ðŽH6óCðôœT`êîAd`¯ñˆ6ü‰2ø€*ùƒ-]ê¯Vø§cò™Q‹9û¨gô™Të€8 ûì\Â0 SízBÚ)hèyKšâl!\ëê€/àj#X-ò‡C‹‹‹GGGM8'ÜY4ó´\ þŽ7NîdQbñ–MæD ßZ ôžW0ôû‡1/èbbbïk.Ú7ëccc$$$ÿÿÿÿ!ù,ÿ H° Áƒ*<ø§¡Ã„Š‘áŸ± Øa (.°˜åŒ?$üƒ†8HŽ0a¥“9ÖˆB䂈´Ø¹’ÂÉŸ„8¤LAgà$x´Ð°A—/ÚØr„™…>nè(X§Í2 ýx ‹A¼Ì@èg‚Š7UÀè!˜GΑ=iÆô)èÇPãG`120px’àÎà~ F¬¸q >+¨±@ÂÍ —ùY£ùpbÏ}š|ˆ³¤A†ERÞ½{`Ÿ2_TbDƒÔ ?/ˆ $Ä!\#äÃÇqŸëØ“ó¨zrƒÛ¹wÿNºøîÞÉ ¤N]½û;tkabber/pixmaps/default/tkabber/toolbar-show-offline.gif000064400000000000000000000020311477701321300233130ustar00nobodynobodyGIF89a÷X:::ÿñÿÍèèèÿÝÿÑÿíl[:]]]ÿÚÏÏÏåååÖÖÖÂÂÂÿáÿÂÿäÍÍÍxo^ãããÿçÿ¿ÿÓÿÛÿ¹ÙÙÙÿÏ´´´êêê±±±áááÛÛÛ666ªªªMMMÿåÊÊÊ…Dÿ´ëëëÚÚÚ§S¿¿¿äÞÔl5àààl/ÔÅ¥×××ÞÞÞl2ÿôÌÌÌÿÈÐÐÐÿÞÿ¯ÿ×ÿîÃÃÃáѱÑÑÑÿÐÿèíííÿêÿëÿÊl3ÿÉÿ¼ÿÖaaaû¬çª555îîîÿÔÿÃäääÿãÿÅ999l`Fÿïlll¥¥¥ç¢!ùX,ö±H° Áƒ*\ÈЊÇ ZQAC‰¬Dh…ƒ1>ôØ‘q£N x‚âÅ•—0vÀÈW¢(0¤Ž+ ­D˜ÀÂ+5Œ€p¡À @Zɰ`ÀŠ+ ÐAႨAI|ðàኃ3¹á£BT© 2À¸’CH*?h0òö •4¸Å€ ôõÛ!DˆW,@ à ‰“ÅE€b‰ˆ+G$Æl° ¨«\)bAÃÒ«Èž}%‰’+&`À–DXÈp‘b#A ’O‘`|àìÙÍöö½ºõë;tkabber/pixmaps/default/tkabber/toolbar-show-online.gif000064400000000000000000000017111477701321300231610ustar00nobodynobodyGIF89a÷0mmmÿë;;;ÿÑÿÒÿßÿÁÿÞÿËÿÔÿãÿÄÿðÿåÿÎÿÀÿíÿòm3ÿæÿÇÿâÿÛÿºm\;m`Gÿïè¨ÿÜm1m/ÿóèŸÿÍHÿÆÿ³ÿÕè—ÿìÿèm3ÿ´ÿØÿõÿáÿÙè¢!ù0,¦aH° Áƒ*\Ȱ¡Ã#:ø‚€ x1ñ…ƒ p 0Bdž/ @`aÂN2|1!‹'*”X sá >0P!χ.0Ѐâ=zl @ .D•J €‚F·J}ÀŠZ' ¬ˆªÚµ 6¼0!vaŠ»<ˆx @ 2à  °a¾0(€¸±ãÇa;tkabber/pixmaps/default/tkabber/xaddress-blue.gif000064400000000000000000000002131477701321300220150ustar00nobodynobodyGIF89a³ )±c‡ýs“ý2aüT{ý‚Ÿý:güFpüªþœ³þ!ù ,8PÉI«½x+¶ZÀ`DYœTº¶BÀ’̺H‚ë4›Ï£ÚÕn¨b—}L(Ú¤Z¯;tkabber/pixmaps/default/tkabber/xaddress-green.gif000064400000000000000000000002131477701321300221660ustar00nobodynobodyGIF89a³ Z·¼¨±¬¥ Ç!Ë"!ù ,8PÉI«½x+¶Z€1DyœTº¶ÂÀ’̺H‚ë4›Ï£ÚÕn¨b—}L(Ú¤Z¯;tkabber/pixmaps/default/tkabber/xaddress-red.gif000064400000000000000000000002131477701321300216400ustar00nobodynobodyGIF89a³ |ýmmþ€€ý[[ýJJü22ü<<þ’’þ££ÿ±±!ù ,8PÉI«½x+¶Z@aCyœTº¶ÂÀ’̺H‚ë4›Ï£ÚÕn¨b—}L(Ú¤Z¯;tkabber/pixmaps/feather16000075500000000000000000000000001477701321300152405ustar00nobodynobodytkabber/pixmaps/feather16/docking000075500000000000000000000000001477701321300166565ustar00nobodynobodytkabber/pixmaps/feather16/docking/available-away.gif000064400000000000000000000005271477701321300223070ustar00nobodynobodyGIF89aò333QQQfff)%¿ÿÿÿÿÿÿÿ!ù,þxww‡www83w‡wwwxww‡w7wxwG„Dwwxww‡wwwHTU€wwwxwwƒsGUXUp‡wwwx7w‡TUUww‡ww7xwT…UUpxww‡w7wHUV…wwxww‡wGUhU‡wwwxww‡WeUww‡wwW…VUpx7w‡afxWV…w3xwa†ff1h‡wwwfb†b&xww‡7wa(&b‚pwx73‡wabhfbwwwxww‡&f(q‡wwwxww&fbww‡wwwxw†"wxww‡wwwx&‚wwxww‡www €wwwxww‡wwhr‡wwwxww‡www‡wwwxw—;tkabber/pixmaps/feather16/docking/available-chat.gif000064400000000000000000000005271477701321300222650ustar00nobodynobodyGIF89aòfff)%¿ÿÿÿÿÿÿ!ù,þXUU…UUUU…UUUXUU…UUXU%‚"UUXUU…UUU(23€UUUXUUQ%383P…UUUXU…233UU…UUXU2ƒ33PXUU…UU(34ƒUUXUU…U%3H3…UUUX…%C3UU…U@HDƒ43PXU…@DDHD0ƒUXU@„DH…UUUX@D„DDDPU…U@HD@„@DX…U@DH@„DUXUU…@DHD„UUXU„DDHD€UUUXU@„@DHU…UUUX@D€@DUU…UUUDD„DUXUU…UUDD€PUUXUU…UUU…UUUXU•;tkabber/pixmaps/feather16/docking/available-dnd.gif000064400000000000000000000006311477701321300221070ustar00nobodynobodyGIF89aó333fffƒa ÿÿÿÿÿÿÿÿÿ!ù,þ!„B!„Æ€!„B!„D!4B!! !„B!BHˆR @!ˆB¡1¥ÀR @!„B„(¥”B!„B!$J¥”B!„D!QÊ)¥„ B!„BH”O) „B!ˆBH”S @A„B!„€*žR @ „P0Ð*§”‚c „‚1Æ<€B¡` !ÆcÂ!B¡`ˆ!Äh@!4Æ@Á`ˆ1ÆB"„B¡`ˆ1˜B!„‚¡`ˆ1Ä„D!„B¡` G!& „B!B¡`1!ˆB!„BAÂ!„B"„B€!„B!„‚¡@@!„D!„Š;tkabber/pixmaps/feather16/docking/available-xa.gif000064400000000000000000000005271477701321300217560ustar00nobodynobodyGIF89aò333UUU«««ÿÿÿÿÿÿ!ù,þhff†fff83f†fffhff†f6fhfF„Dffhff†fffHDD‚fffhffƒcFDHDb†fffh6f†DDD(ff†ff6hfD„DDbhff†f6fHDE„$ffhff†fFDXD$†fffhff†FTD(ff†ffF„EDbhFf†QUhFE„$f3hfQ…UUAX$$†fffUR…R%hff†6fQ(%R‚bfh63†fQRXURfffhff†%U(`†fffhff%URff†fffhf…"fhff†fffh%‚ffhff†fff €fffhff†ffHb†fffhff†fff†fffhf–;tkabber/pixmaps/feather16/docking/available.gif000064400000000000000000000006311477701321300213440ustar00nobodynobodyGIF89aó333fff)%¿ÿƒa ÿÿÿÿÿÿÿÿ!ù,þ!„B!„„€!„B!„D!$B¡1à!„B!Bh B@!ˆB!!„@B@!„B „Ð „B!„B!4„B!„D¡AÈ!„„ B!„Bh! „B!ˆBhC@A„B!„€"B@ „P0Ð"‡‚B „‚1Æ<€B¡` )ÆcÂ!B¡`Š)Åh@!$„@Á`Š1ÆB"„B¡`Š1°B!„‚¡`Š1Å„D!„B¡``G)& „B!B¡`J1!ˆB!„BAD!„B"„B€!„B!„‚¡@@!„D!„Š;tkabber/pixmaps/feather16/docking/blank.gif000064400000000000000000000001201477701321300205040ustar00nobodynobodyGIF89aÂ333QQQfff)%¿ÿÿÿÿÿÿÿ!ù,xºÜþ0ÊI«½8ëÍ»ÿ`(Ždin ;tkabber/pixmaps/feather16/docking/invisible.gif000064400000000000000000000005011477701321300214040ustar00nobodynobodyGIF89añˆˆˆÿÿÿ!ù,þ”(Q¢D‰F”(Q¢D‰%JT(Q¢Ä„ %J”(Q¢D‰JT(Q¢D‰FT(Q¢B‰%J”QbD‰#J”(Q¢B‰ %J”Q¢D‰JŒ(Q¢B‰%J”(Q¡D…#J”(Q¢D‰ %FT(Q¢D… #JŒ¨PbD‰%F”¨PbĈ %&”¨P¢D‰ %&Œ(Q¢Äˆ %FT¨P¢D‰ %FŒ˜P¡Âˆ%&Œ(1bD‰ J”(Q¢D‰ JŒ˜P¢D‰%JT¨PbĈ%J”(Q¢Äˆ J”(Q¢D‰%FL¨P¢D‰%J”(1a„%J”(Q¢D‰ %&”(Q¢D‰%JT˜0¢D‰%J”(;tkabber/pixmaps/feather16/docking/message-personal.gif000064400000000000000000000002061477701321300226670ustar00nobodynobodyGIF89aÂ|O£s"¼qï¸dÿ»¡ÿÿÿÿÿÿÿÿÿ!ù ,KxºÜþ0ÊI«8k,ù`tßæctl[’aœBž`ß6J|Ïë*¤|¾â£6ÌÍ–Gäïé`6•Õ¨Û8Å@Ô®ic)›Ï‘;tkabber/pixmaps/feather16/docking/message-server.gif000064400000000000000000000002061477701321300223520ustar00nobodynobodyGIF89a¿¤ß¹Óºy÷ݱÿùëÿÿÿÿÿÿÿÿÿ!ù ,KxºÜþ0ÊI«8k,ù`tßæct l[’aœB^`ß6J|Ïë*¤|¾â£6ÌÍ–Gäïé`6•Õ¨Û8Å@Ô®ic)›Ï‘;tkabber/pixmaps/feather16/docking/message.gif000064400000000000000000000002061477701321300210460ustar00nobodynobodyGIF89aÂ|OÿôÖ£s"¼qï¸dÿÿÿÿÿÿÿÿÿ!ù ,KxºÜþ0ÊI«8k,Aø`tßæct l[’aœBÞ`ß6J|Ï몤|¾â£6ÌÍ–Gäïé`6•Õ¨Û8Å@Ô®ic)›Ï‘;tkabber/pixmaps/feather16/docking/tkabber.ico000064400000000000000000000230261477701321300210460ustar00nobodynobody°(¶(Þ((.(V(~°¦hV h¾ ¨& èÎ è¶(ž"(Æ#(î$( ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ( ÿ333¿%)ÿÿÿÿÿ" DBDB$DD $DD $DD%DB3Q" 0S01113ÇÿÇÿƒÿƒÿƒÿÿÿ€ÆþÿÿÿÀÿàÿø( ÿ333¿%)ÿÿÿ" DBDB$DD $DD $DD$DB3A" 0C01113ÇÿÇÿƒÿƒÿƒÿÿÿ€ÆþÿÿÿÀÿàÿø( ÿ¿%)ÿÿ33333033030333333333333033 2 !1!!"àÿ€?€?€€àÿÿÿÀÿàÿø( |333ÿÿÿÿÿÿ" DBDB$DD $DD $DD%DBS0" 503S05333300ÇÿÇÿƒÿƒÿƒÿÿÿ€ÆþÿÿÿÀÿàÿø( 333\\\«««ÿÿÿ10DADADDDDDD# DA3C2423C2343 33 332323ÇÿÇÿƒÿƒÿƒÿÿÿ€ÆþÿÿÿÀÿàÿø( 333\\\«««ÿÿÿ1031313333#33# 313C2423C2343 33 332323ÇÿÇÿƒÿƒÿƒÿÿÿ€ÆþÿÿÿÀÿàÿø( ___Çÿ×ÿ«ÿ»ÿ»ÿ}ÿ|ÿ|ºoƧþÛÿmÿ½ÿÞÿæÿøÇÿ×ÿ«ÿ»ÿ»ÿ}ÿ|ÿ|ºoƧþÛÿmÿ½ÿÞÿæÿø( *U*€U*>*ªUUU?*?UªU?U?UªU?U_UUÔU?ªª_UU_UUª_U_ªªUUU_Ôª………UªUÔªŸUŸª¤  UÿªŸªÿŸªU¿ªª¿ªÿŸÔªŸÿª¿Ôðʦÿ¿Ôª¿ÿÀÜÀªßÔUßÿÿßÔªßÿÿÿªÿÔÿßÿUÿÿªÿÿõüÿ! -! #!+  #7!#  -!))7! ( .76 ,,,( #6).&((((367!(("!%5  1! 752%77!%2/#6$'-0&&67)+# -!-! 4*!7+!#77-+ -þÀ€€€€€€€€€Àâöÿ( Uÿÿ*U>*ÿ*ÿUU?UUÔU?Uÿÿ?UU_Uªÿÿ?Uÿÿ_UUU?ÿU_ªÿ__ÿ………ÿU_ÿª_ÿÿÿªªÿŸÿÿŸªªŸÔUŸÿÿŸÔªŸÿU¿ÿª¿ÿÿßÔªßÿðûÿ      ! !!$$ $$"%%'$%%'#!( & ( üø?À€€€€€€„ÂÇçÏ( @9N>UAZIe!Li#Pn%Vx(]€*bˆ.k•0m–2pš.q.r¡3y§1}±<€­:…·;ŒÃDÃ=‘ÈD”Ê;™×CšÕ@ŸàJ¢Ü>¤êG¦åR¬çB«ñI°ïZ´îG³ýY¹ú`¿ÿcÁÿ$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" $$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"$$$$ $$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$"$$$$ $$$$$$$$$$$$$ $$$$$$!$$$$!!$$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$"$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$ $$$$ $$$$$$$$$$!$ $#$$$$$$$$$$$#$$$$$$$$$$$$$$$"$!$$$$$$ $$$$$$$$$$#$$$$$$$ $$$$$$$$$$! $$$$ $$$$$$$$$$$$$$ $!$! $$$$$$$$$$$$ $$# $$$$$$$$$$$$$!$$$#  $$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡ÿÿÿÿÿÿÀÿÿÿü<ÿþ<ÿÿÿÇÿÇÿãÿˆâüˆ`ø@âø@ñüDq‡üDqÇþ"‡ÿÿÁÀÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ( @h‚'¢É<´ÙA¹ÝRÆçhÔñDDDP""!BVfe"%fUfRE`VRB`f#$$""" DDT$"@  " "&e "%f 1Ua $ffV`&Pf@C`f`1Pa $`f`&Uf@ffV`#46@44B"#CÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÀÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿÀÿÿÿþü?ø?ø?ø?ø?ø?ü?þ€ÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ( @ÿ$$$333¿%) aƒfff{{{™™™ÿÿÿÿÿÿÿ`3f03f3c6c336c336c33333303UU303™Y•™39™Y•™“™™Y•™™09™™Y•™™“™™•™™Y™™0™™••YY™™09™™•Y•Y™™“f`9™™•™™Y™™“9™™Y™™•™™“9™™Y™™•™™“f9™™•UUY™™“`™™™™™™™™1™™™™™™™š;±9™™™™™™“»™™™™™™0±9™™™™“D»9™™“0»330`A±AfD`DwDDÿÿÿþÿÿüÿÿüÿÿüÿÿüÿÿøÿÿøÿÿðÿÿðÿÿàÿÀ?ÿ€ÿ€ÿÇûÿó}€?€Àà@ðÀøàþpÿÿøÿÿ¼ÿÿÎÿÿÿÿÿßÀÿÿãð( ŸŸŸÿÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÿÿ( åååÿÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÿÿ( ñÿÿÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÿÿtkabber/pixmaps/feather16/docking/unavailable.gif000064400000000000000000000005271477701321300217130ustar00nobodynobodyGIF89aò333UUU¬¬¬ÿÿÿÿÿÿ!ù,þhff†fff83f†fffhff†f6fhfF„Dffhff†fffHDD‚fffhffƒcFDHDb†fffh6f†DDD(ff†ff6hfD„DDbhff†f6VHDE„$ffhff†f6DXD$†fffhff†FTD(ff†ffF„EDbhFf†ADhFE„$f3hfA„DDAX$$†fffDB„B%hff†6fA($B‚bfh63†fABHDBfffhff†$D(`†fffhff$DBff†fffhf„"fhff†fffh$‚ffhff†fff €fffhff†ffHb†fffhff†fff†fffhf–;tkabber/pixmaps/feather16/icondef.xml000064400000000000000000000152431477701321300174550ustar00nobodynobody Feather 16 1.0 Tkabber's Old Default Iconset 2006-01-20 toolbar/add-user tkabber/toolbar-add-user.gif toolbar/disco tkabber/toolbar-disco.gif toolbar/join-conference tkabber/toolbar-join-conference.gif toolbar/show-offline tkabber/toolbar-show-offline.gif toolbar/show-online tkabber/toolbar-show-online.gif toolbar/gpg-signed tkabber/gpg-signed.gif toolbar/gpg-unsigned tkabber/gpg-unsigned.gif toolbar/gpg-encrypted tkabber/gpg-encrypted.gif toolbar/gpg-unencrypted tkabber/gpg-unencrypted.gif gpg/vsigned tkabber/gpg-vsigned.gif gpg/signed tkabber/gpg-signed.gif gpg/badsigned tkabber/gpg-badsigned.gif gpg/encrypted tkabber/gpg-encrypted.gif gpg/badencrypted tkabber/gpg-badencrypted.gif browser/client roster/available.gif browser/user roster/available.gif browser/conference roster/conference-available.gif browser/headline services/rss_online.gif docking/blank docking/blank.gif docking/chat docking/available-chat.gif docking/available docking/available.gif docking/away docking/available-away.gif docking/xa docking/available-xa.gif docking/dnd docking/available-dnd.gif docking/invisible docking/invisible.gif docking/unavailable docking/unavailable.gif docking/message docking/message.gif docking/message-personal docking/message-personal.gif docking/message-server docking/message-server.gif docking/tkabber docking/tkabber.ico roster/user/chat roster/available-chat.gif roster/user/available roster/available.gif roster/user/away roster/available-away.gif roster/user/xa roster/available-xa.gif roster/user/dnd roster/available-dnd.gif roster/user/invisible roster/invisible.gif roster/user/unavailable roster/unavailable.gif roster/user/unsubscribed roster/stalker.gif roster/user/error roster/unavailable.gif roster/conference/available roster/conference-available.gif roster/conference/unavailable roster/conference-unavailable.gif services/rss/away services/rss_away.gif services/rss/chat services/rss_chat.gif services/rss/dnd services/rss_dnd.gif services/rss/unavailable services/rss_offline.gif services/rss/available services/rss_online.gif services/rss/xa services/rss_xa.gif tkabber/pixmaps/feather16/roster000075500000000000000000000000001477701321300165565ustar00nobodynobodytkabber/pixmaps/feather16/roster/available-away.gif000064400000000000000000000003211477701321300221770ustar00nobodynobodyGIF89aò333)%¿ÿÿÿÿÿÿÿ!ù,–XUU…UUUX"R…UUUXU"ƒ#UUXUU…23XUU…U%38U…UUU(34ƒPUUXU2ƒ$UX…%CXUUD"H3P…UADHƒPUUDD„UUXU„DDQXUU…UDHQT…UUUXADUUUXUU€UXUU…UUUU…UUUX…UUUXU•;tkabber/pixmaps/feather16/roster/available-chat.gif000064400000000000000000000003211477701321300221550ustar00nobodynobodyGIF89aò)%¿ÿÿÿÿÿÿ!ù,–HDD„DDDHA„DDDHD‚DDHDD„!"HDD„D"8D„DDD"#‚@D ‚DH3ƒ3HDD€3338 @„D033ƒ@DD3ƒ03@HDƒ3338D„D0830ƒ@DD3€03@HDD€3338@D„D083€DDDHD€DDHD”;tkabber/pixmaps/feather16/roster/available-dnd.gif000064400000000000000000000003211477701321300220030ustar00nobodynobodyGIF89aò333ÿÿÿÿÿÿÿÿÿ!ù,–hff†fffh"b†fffhf"ƒffhff†23hff†f&38f†fff(35ƒ`ffhf2ƒ5fh†&ShffD"X3`†fADHƒ`ffDD„ffhf„DDahff†fDHae†fffhADfffhff€fhff†ffff†fffh†fffhf–;tkabber/pixmaps/feather16/roster/available-xa.gif000064400000000000000000000003211477701321300216460ustar00nobodynobodyGIF89aò333\\\ªªªÿÿÿÿÿÿ!ù,–XUU…UUUX3S…UUUXU3ƒ#UUXUU…33#XUU…U538#U…UUU834ƒRUUXU3ƒ4#UX…5C#XUUD3H3R…UADH$ƒRUUDD„!UUXU„DDQXUU…UDHQT…UUUXADUUUXUU€UXUU…UU0UU…UUUX…UUUXU•;tkabber/pixmaps/feather16/roster/available.gif000064400000000000000000000003211477701321300212400ustar00nobodynobodyGIF89aò333)%¿ÿÿÿÿÿÿÿÿÿ!ù,–hff†fffh"b†fffhf"ƒ#ffhff†23hff†f&38f†fff(35ƒ`ffhf2ƒ%fh†&ShffD"X3`†fADHƒ`ffDD„ffhf„DDahff†fDHae†fffhADfffhff€fhff†ffff†fffh†fffhf–;tkabber/pixmaps/feather16/roster/conference-available.gif000064400000000000000000000007111477701321300233500ustar00nobodynobodyGIF89aõ**?UUU?U?UU_UUUÿ*ÿ*ÿUÿU?ÿ?ÿU_ÿ_ÿÿª_Uÿ?ÔUÿUÿUÿ_ÿÿ_Uªÿÿªÿÿÿ_ªÿªÿŸÿŸUÿ¿U€€€ªŸÿÔŸªÿŸªÿ¿ªÔŸÿÿߪÔßÿÿûð!ù*,æ@•J¨T*• P©T*• €2T* e¨T*•  Tà@¨T* 2¨)@P©€* t"}€ÐáT* T:! Sêp*`D¦Ì€ÁT*• 2"ä¨'•Jø|Ìã¡h*•Jø\$€ÇcL•Jð\,GC¨P!CH¸X,R(C(¤\,C‘P(ƒJ¥R€B*•J¥R©T*@"‘¨T*•J¥R©T*¨T*•J¥ ;tkabber/pixmaps/feather16/roster/conference-unavailable.gif000064400000000000000000000004001477701321300237060ustar00nobodynobodyGIF89aó***JJJZZZjjjˆˆˆŸŸŸ¬¬¬¾¾¾ÏÏÏÔÔÔééé÷÷÷!ù,­ð½À{ï=Þƒï½ï=àï½÷À à`à½÷€à à½÷c+Ì*÷`lÁŠ­Þ ¦ÖR ¤tÀ{ð”€Zk%p €ï=P+¥ ï½’1 ¥c (€¼÷€1$8b0ƈÐÇbÌÆ@2À@Þ{À9ðÞ{ð½÷0Æ€÷Þƒï½÷Þ{€÷|ï½;tkabber/pixmaps/feather16/roster/invisible.gif000064400000000000000000000003001477701321300213010ustar00nobodynobodyGIF89añ‡‡‡ÿÿÿ!ù,‘”(Q¢D‰&”(Q¢D‰ #*”(Q¢D‰%*”(Q¢D…%F”(Q¢Äˆ %F”(Q¢B‰J”˜0¢B… #JT(Q¡Âˆ %JŒ(Qb„%JŒ(QbB‰%JŒ(QbD‰%JT(Q¡B‰%JT(Q¡D‰%JT¨P¡D‰%J”1¢D‰%J”˜0¢D‰%J;tkabber/pixmaps/feather16/roster/stalker.gif000064400000000000000000000005131477701321300207700ustar00nobodynobodyGIF89aôK%R+\3c:h>!lA#rG'~R0ppp²†Y5Ža<‘d?—iCª{Tÿ·ˆaÿÿÿ!ù,È $I’$I€$I’$I’$I’$ ’$’$I’$Nà I’$I’8Q´J’$IMôÇ€$IÀ²Œ³ÃHÀa ȱÅ CÄq A’$0 !H’$%€’$II’$I B ¤€$I’”@’’$I(%I’$€$I’$II’’$I $I’”$ ’$IR;tkabber/pixmaps/feather16/roster/unavailable.gif000064400000000000000000000003211477701321300216030ustar00nobodynobodyGIF89aò333\\\«««ÿÿÿÿÿÿ!ù,–XUU…UUUX3S…UUUXU3ƒ#UUXUU…33#XUU…U538#U…UUU834ƒRUUXU3ƒ4#UX…5C#XUU33H3R…U238$ƒRUU33ƒ!UUXUƒ33QXUU…U38QT…UUUX13UUUXUU€UXUU…UU0UU…UUUX…UUUXU•;tkabber/pixmaps/feather16/services000075500000000000000000000000001477701321300170635ustar00nobodynobodytkabber/pixmaps/feather16/services/rss_away.gif000064400000000000000000000001671477701321300214650ustar00nobodynobodyGIF89aò¿¤ß¹Óºy÷ݱÿùëÿÿÿ!ù,¿¤ß¹Óºy÷ݱÿùëÿÿÿ!ù,BxºÜ+0JÈ„¹8‹z§5ÛsdÙqY*Öà¾.ÈtMË"ñ.Ú»@!˜Ó3Ûp·:´ŒÄ_-¸D²R;Œå™(;tkabber/pixmaps/feather16/services/rss_offline.gif000064400000000000000000000001671477701321300221460ustar00nobodynobodyGIF89aò¿¤ß¹Óºy÷ݱÿùëÿÿÿ!ù,ZAeIiL!nP#xV%€](ˆb*•k.–m0q.šp2¡r.§y3±}1­€<·…:ÃŒ;È‘=×™;ê¤>ÃDÊ”DÕšCÜ¢JàŸ@å¦Gç¬Rï°Iî´Zñ«Bý³Gú¹Yÿ¿`ÿÁc!ù%, þÀR©T*•J¥R©T*•J¥R©T*•J¥R©T*•J¥R©T*•J¥R©T*•J¥R©T*•J¥R©T*•€¥R©T*•J¥R©T*•J¥R©T*•J¥Ð¦T*•J¥R©T*•J¥R©Te2O©T"u$Âñ¸C¥R©T*•J¥R©”Q$I©D’$“ÃA“Q–R©T*•J¥R)’•K©“ˆˆJ¢Ã!T‚ ‚I©T*•J¥R 3ДD F©s”J%Ì Q*•ƒJ©T*•J¥RéP •8J)2•J¥Ç@,•<ƒC¨T*•J¥Ri40xJJFt8”J¥‚`)•Nþ©T*•J¥R‰40TJ’LJC8”J¥Ï˜(qO©T*•J¥R©T¢ˆJ™£T!H¥RfpH ‰¨T*•J¥R©T*•J ãZhJ¥ð1 ”BCáQ*•J¥R©T*•J%ÆàR*•J¥Ré0°”J¥¡P*•J¥R©T*•J%àS*•J%`i48”J¥’dp(•J¥R©T*•J¥ÊàP*•J¥Ré2¨”J¥’c)•J¥R©T*•J%ÉÀQ*•JÀRI„”J¥’ˆ•J¥R©T*•J¥Rb )•J¥Qç)•J%N‚*•J¥R©T*•J¥áQ*•€%A(‰Ä¢R±*•J¥R©T*•J¥Qâ*•J¥Œd"¹H.™P©T*•J¥R©TÒd4¦T*K¥R©T*•J¥R©T*•J¥R©TE§T*•J¥R©T*•J¥R©T*•J¥R©Tê@$šR©T–J¥R©T*•J¥R©T*•J¥R©T*•J¥R©T*•J¥R©T*•J¥R©T*•J¥R©T*•J¥R©,•J¥R©T*•J¥R©T*•J¥R©T ;tkabber/pixmaps/feather16/tkabber/toolbar-join-conference.gif000064400000000000000000000002521477701321300241230ustar00nobodynobodyGIF89aÂÙ´<ݹAÉ¢'ñÔhçÆR‚hÿÿÿ!ù ,oxºÜþ0ÊI«= ƒÛ@°aÚyP)0 _`>€®é@¸0w T,ßIdhŠ^º‚A´ôež€æ‘z¬«‹{*i äI-ü*Yj™–ŒSÚÓ×13ý©_Zm ^~fƒŠ‹ŒŽ‹ ;tkabber/pixmaps/feather16/tkabber/toolbar-show-offline.gif000064400000000000000000000006261477701321300234640ustar00nobodynobodyGIF89a¥ÿ×iÿÑaê¹Fä´AÿßtÿÛnùÈWÞ®;×§5ÿÿÑÿä{ÿÔeð¿MÑ¡/Ê›*ÿáwëºGÓ£1Å–&Úª8õÄS½Ž!www^^^XXXÈ™)ì»H·‰}}}oooRRRNNNÆ—'ÿÏ_µµµˆˆˆxxxdddGGGBBBƒƒƒ___III???°‚OOOiii;;;777ÌÌÌ```uuuQQQÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù ?,³ÀŸpH,ȤRh–I@ç‚É<¡E©¬ãù€®ØŸvD*™N(0péŒRÕŠåT#O)îzvF(**} „Y ,5$Œ ’D(,& Ÿ 01 ª®Lu·ºb2324 !" ÂÄb6tM Ãa72W-РÞuâ…ÆÈæYÒÔa…ÜêGMîôõö÷øDA;tkabber/pixmaps/feather16/tkabber/toolbar-show-online.gif000064400000000000000000000005261477701321300233250ustar00nobodynobodyGIF89a¥ÿ×iÿÑaê¹Fä´AÿßtÿÛnùÈWÞ®;×§5ÿÿÑÿä{ÿÔeð¿MÑ¡/Ê›*ÿáwëºGÓ£1Å–&HHH666Úª8õÄS½Ž!£££’’’ŽŽŽRRRÈ™)ì»H·‰§§§ŠŠŠ~~~Æ—'ÿÏ_ÍÍÍ®®®–––‚‚‚«««yyy}}}°‚€€€™™™zzzwwwÌÌÌ```‡‡‡¡¡¡ŸŸŸQQQ???ÀÀÀªªªÜÜÜÿÿÿ!ù ?,sÀŸpH,ȤrÉl:ŸÐ¨@H…€€`@°F³Ã‘ð:ÁŠ£áx˜™AD$“÷080ìzS„I5 $% ‹{ ŒW?.–pUTW343¥9:¤¥<3¡M¯œ¶·¸¶A;tkabber/pixmaps/feather22000075500000000000000000000000001477701321300152355ustar00nobodynobodytkabber/pixmaps/feather22/icondef.xml000064400000000000000000000025331477701321300174500ustar00nobodynobody Feather 22 1.0 Tkabber's Feather 22 Iconset. 2006-01-21 roster/user/chat roster/available-chat.gif roster/user/available roster/available.gif roster/user/away roster/available-away.gif roster/user/xa roster/available-xa.gif roster/user/dnd roster/available-dnd.gif roster/user/invisible roster/invisible.gif roster/user/unavailable roster/unavailable.gif roster/user/error roster/unavailable.gif tkabber/pixmaps/feather22/roster000075500000000000000000000000001477701321300165535ustar00nobodynobodytkabber/pixmaps/feather22/roster/available-away.gif000064400000000000000000000005271477701321300222040ustar00nobodynobodyGIF89aò333QQQfff)%¿ÿÿÿÿÿÿÿ!ù,þxww‡www83w‡wwwxww‡w7wxwG„Dwwxww‡wwwHTU€wwwxwwƒsGUXUp‡wwwx7w‡TUUww‡ww7xwT…UUpxww‡w7wHUV…wwxww‡wGUhU‡wwwxww‡WeUww‡wwW…VUpx7w‡afxWV…w3xwa†ff1h‡wwwfb†b&xww‡7wa(&b‚pwx73‡wabhfbwwwxww‡&f(q‡wwwxww&fbww‡wwwxw†"wxww‡wwwx&‚wwxww‡www €wwwxww‡wwhr‡wwwxww‡www‡wwwxw—;tkabber/pixmaps/feather22/roster/available-chat.gif000064400000000000000000000005271477701321300221620ustar00nobodynobodyGIF89aòfff)%¿ÿÿÿÿÿÿ!ù,þXUU…UUUU…UUUXUU…UUXU%‚"UUXUU…UUU(23€UUUXUUQ%383P…UUUXU…233UU…UUXU2ƒ33PXUU…UU(34ƒUUXUU…U%3H3…UUUX…%C3UU…U@HDƒ43PXU…@DDHD0ƒUXU@„DH…UUUX@D„DDDPU…U@HD@„@DX…U@DH@„DUXUU…@DHD„UUXU„DDHD€UUUXU@„@DHU…UUUX@D€@DUU…UUUDD„DUXUU…UUDD€PUUXUU…UUU…UUUXU•;tkabber/pixmaps/feather22/roster/available-dnd.gif000064400000000000000000000006311477701321300220040ustar00nobodynobodyGIF89aó333fffƒa ÿÿÿÿÿÿÿÿÿ!ù,þ!„B!„Æ€!„B!„D!4B!! !„B!BHˆR @!ˆB¡1¥ÀR @!„B„(¥”B!„B!$J¥”B!„D!QÊ)¥„ B!„BH”O) „B!ˆBH”S @A„B!„€*žR @ „P0Ð*§”‚c „‚1Æ<€B¡` !ÆcÂ!B¡`ˆ!Äh@!4Æ@Á`ˆ1ÆB"„B¡`ˆ1˜B!„‚¡`ˆ1Ä„D!„B¡` G!& „B!B¡`1!ˆB!„BAÂ!„B"„B€!„B!„‚¡@@!„D!„Š;tkabber/pixmaps/feather22/roster/available-xa.gif000064400000000000000000000005271477701321300216530ustar00nobodynobodyGIF89aò333UUU«««ÿÿÿÿÿÿ!ù,þhff†fff83f†fffhff†f6fhfF„Dffhff†fffHDD‚fffhffƒcFDHDb†fffh6f†DDD(ff†ff6hfD„DDbhff†f6fHDE„$ffhff†fFDXD$†fffhff†FTD(ff†ffF„EDbhFf†QUhFE„$f3hfQ…UUAX$$†fffUR…R%hff†6fQ(%R‚bfh63†fQRXURfffhff†%U(`†fffhff%URff†fffhf…"fhff†fffh%‚ffhff†fff €fffhff†ffHb†fffhff†fff†fffhf–;tkabber/pixmaps/feather22/roster/available.gif000064400000000000000000000006311477701321300212410ustar00nobodynobodyGIF89aó333fff)%¿ÿƒa ÿÿÿÿÿÿÿÿ!ù,þ!„B!„„€!„B!„D!$B¡1à!„B!Bh B@!ˆB!!„@B@!„B „Ð „B!„B!4„B!„D¡AÈ!„„ B!„Bh! „B!ˆBhC@A„B!„€"B@ „P0Ð"‡‚B „‚1Æ<€B¡` )ÆcÂ!B¡`Š)Åh@!$„@Á`Š1ÆB"„B¡`Š1°B!„‚¡`Š1Å„D!„B¡``G)& „B!B¡`J1!ˆB!„BAD!„B"„B€!„B!„‚¡@@!„D!„Š;tkabber/pixmaps/feather22/roster/invisible.gif000064400000000000000000000005011477701321300213010ustar00nobodynobodyGIF89añˆˆˆÿÿÿ!ù,þ”(Q¢D‰F”(Q¢D‰%JT(Q¢Ä„ %J”(Q¢D‰JT(Q¢D‰FT(Q¢B‰%J”QbD‰#J”(Q¢B‰ %J”Q¢D‰JŒ(Q¢B‰%J”(Q¡D…#J”(Q¢D‰ %FT(Q¢D… #JŒ¨PbD‰%F”¨PbĈ %&”¨P¢D‰ %&Œ(Q¢Äˆ %FT¨P¢D‰ %FŒ˜P¡Âˆ%&Œ(1bD‰ J”(Q¢D‰ JŒ˜P¢D‰%JT¨PbĈ%J”(Q¢Äˆ J”(Q¢D‰%FL¨P¢D‰%J”(1a„%J”(Q¢D‰ %&”(Q¢D‰%JT˜0¢D‰%J”(;tkabber/pixmaps/feather22/roster/unavailable.gif000064400000000000000000000005271477701321300216100ustar00nobodynobodyGIF89aò333UUU¬¬¬ÿÿÿÿÿÿ!ù,þhff†fff83f†fffhff†f6fhfF„Dffhff†fffHDD‚fffhffƒcFDHDb†fffh6f†DDD(ff†ff6hfD„DDbhff†f6VHDE„$ffhff†f6DXD$†fffhff†FTD(ff†ffF„EDbhFf†ADhFE„$f3hfA„DDAX$$†fffDB„B%hff†6fA($B‚bfh63†fABHDBfffhff†$D(`†fffhff$DBff†fffhf„"fhff†fffh$‚ffhff†fff €fffhff†ffHb†fffhff†fff†fffhf–;tkabber/pixmaps/stars000075500000000000000000000000001477701321300146075ustar00nobodynobodytkabber/pixmaps/stars/docking000075500000000000000000000000001477701321300162255ustar00nobodynobodytkabber/pixmaps/stars/docking/available-away.gif000064400000000000000000000005521477701321300216540ustar00nobodynobodyGIF89a¥.²“µ•¶š¹œ»Ÿ½¤À¨Ã©Ã©Ä«Å°É±É³Ë´Ë·Í·ÎºÐ½Ñ¾ÒÄÖÅׯ×ÇÙÈÙÉÙÉÚÊÚÑßÒàÓáÖã×ãØäÙäÝçÞèßéåíæíçîèïòöô÷õøÿÿËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊ!þCreated with The GIMP!ù?,nÀŸpH,È$ò‚¡HJÎÔÉHHÎÈt"u*C«E¼|Lª*¤‰(ã!tZ±R¢NR:$()%c}?-!"ˆqBc ’cC™ˆ E’ £IœJ²³DA;tkabber/pixmaps/stars/docking/available-chat.gif000064400000000000000000000005521477701321300216320ustar00nobodynobodyGIF89a¥7ÿ‹ÿÿ‘ÿ’ÿ•ÿ—ÿ˜ÿ™ÿ›ÿŸÿ ÿ¤ÿ¥ÿ¦ÿ§ÿ©ÿ­ÿ®ÿ¯ÿ°ÿ±ÿ²ÿ³ÿ´ÿµÿ·ÿ¸ÿ¹ÿºÿ»ÿ½ÿÂÿÃÿÄÿÆÿÇÿÈÿÉÿÐÿÑÿÒÿÕÿÖÿ×ÿØÿÜÿÝÿßÿåÿæÿçÿòÿóÿõÿÿËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊ!þCreated with The GIMP!ù?,nÀŸpH,È$’D y*ÊÓŠ…*y$È“+&{¡B˜†ÍF©`´šŒEÚ<ã¡(›Ñb+’æ~L-00.' cdB6"&)*'ˆ}?c’cC™ˆ E’ £IœJ²³DA;tkabber/pixmaps/stars/docking/available-dnd.gif000064400000000000000000000005511477701321300214570ustar00nobodynobodyGIF89a¥-s|}‡ˆ‰”•–™š›¢£¥¦§¬­®¯°²³µ¶¸¹½¾¿ÀÄÈÊËÌÍÐÑÒÓÖËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊ!þCreated with The GIMP!ù?,mÀŸpH,È$òñT6ʆBÑxP:ÈÆ¡P84$™@|$!ñ¸|Jã¡ã¬œ,Œ0  c|?  ‡qBc‘c%,C˜‡ #+E‘ "$*J$$&(›J±²DA;tkabber/pixmaps/stars/docking/available-xa.gif000064400000000000000000000005511477701321300213220ustar00nobodynobodyGIF89a¥+rž{¤|¥}¦ˆ­Š®²‘³’´–·—·˜¸›ºœ»»ž¼¥Á¦Â§ÂªÄ«Å±É²Ê³Ê¶Ì¸Î¹Ï»Ð¼Ñ¾Ò¿ÓÄÖÄ×ÇØÇÙÌÜÑßÓáÔáÖâÚåÜçàêËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊËËÊ!þCreated with The GIMP!ù?,mÀŸpH,È$™T6JFBшX:H†@88(™@„$Aa!Á|Jã!DA Ömœ,œ4c|? ‡qBc‘c&*C˜‡"$)E‘ !#&¢I%%'(›J±²DA;tkabber/pixmaps/stars/docking/available.gif000064400000000000000000000005531477701321300207160ustar00nobodynobodyGIF89a¥>ÿÿ†ÿ‰ÿŠÿÿ“ÿ”ÿ•ÿ–ÿ˜ÿ™ÿšÿ›ÿžÿŸÿ¢ÿ£ÿ¤ÿ§ÿ¨ÿ©ÿ«ÿ¬ÿ®ÿ±ÿ²ÿ³ÿ´ÿµÿ¶ÿ·ÿ¸ÿ¹ÿºÿ¼ÿ½ÿ¿ÿÀÿÁÿÂÿÃÿÄÿÆÿÉÿÊÿËÿÌÿÏÿÐÿÑÿÒÿÓÿÔÿ×ÿÜÿÞÿßÿàÿáÿåÿçÿëËËÊËËÊ!þCreated with The GIMP!ù?,oÀŸpH,È$Òã ™XÊËdbá”\ÈËc¡pT>*@ìL„"¢9ÅrãaG’ Œ †‹ A  )cdB%‰~?c+$“c7=Cš‰+26 Stars 1.0 Tkabber's Stars Iconset. Serge Yudin 2006-09-11 toolbar/add-user tkabber/toolbar-add-user.gif toolbar/disco tkabber/toolbar-disco.gif toolbar/join-conference tkabber/toolbar-join-conference.gif toolbar/show-offline tkabber/toolbar-show-offline.gif toolbar/show-online tkabber/toolbar-show-online.gif browser/client roster/available.gif browser/user roster/available.gif browser/conference roster/conference-available.gif browser/headline services/rss_online.gif docking/chat docking/available-chat.gif docking/available docking/available.gif docking/away docking/available-away.gif docking/xa docking/available-xa.gif docking/dnd docking/available-dnd.gif docking/invisible docking/invisible.gif docking/unavailable docking/unavailable.gif docking/message docking/message.gif docking/message-personal docking/message-personal.gif docking/message-server docking/message-server.gif roster/user/chat roster/available-chat.gif roster/user/available roster/available.gif roster/user/away roster/available-away.gif roster/user/xa roster/available-xa.gif roster/user/dnd roster/available-dnd.gif roster/user/invisible roster/invisible.gif roster/user/unavailable roster/unavailable.gif roster/user/unsubscribed roster/stalker.gif roster/user/error roster/unavailable.gif roster/conference/available roster/conference-available.gif roster/conference/unavailable roster/conference-unavailable.gif roster/group/closed roster/group-closed.gif roster/group/opened roster/group-opened.gif services/rss/away services/rss_away.gif services/rss/chat services/rss_chat.gif services/rss/dnd services/rss_dnd.gif services/rss/unavailable services/rss_offline.gif services/rss/available services/rss_online.gif services/rss/xa services/rss_xa.gif chat/bookmark/red tkabber/chat-bookmark.gif chat/bookmark/green tkabber/chat-bookmark1.gif xaddress/info tkabber/xaddress.gif tkabber/pixmaps/stars/roster000075500000000000000000000000001477701321300161255ustar00nobodynobodytkabber/pixmaps/stars/roster/available-away.gif000064400000000000000000000002351477701321300215520ustar00nobodynobodyGIF89aÂrž‰®¡¾¸ÎÐÞçîÿÿ@|!þCreated with The GIMP!ù,IxºÜ À1ø‚u6D„Ê'L7œè96Â@¼ð²na„,Õ†’Ï—“´·ßŒq„½t¥V µZt>¡©rid6”à!,v$;tkabber/pixmaps/stars/roster/available-chat.gif000064400000000000000000000002351477701321300215300ustar00nobodynobodyGIF89aÂÿžÿ®ÿ¾ÿÎÿÞÿîÿÿÿ€!þCreated with The GIMP!ù,IxºÜ À1ø‚u6D„Ê'L7œè96Â@¼ð²na„,Õ†’Ï—“´·ßŒq„½t¥V µZt>¡©rid6”à!,v$;tkabber/pixmaps/stars/roster/available-dnd.gif000064400000000000000000000002041477701321300213520ustar00nobodynobodyGIF89aÂs…— ¨ºË Ý&&ÿ33!ù,IxºÜjÆ1øŠu¶DUˆ'ÊGL7œè96Ä ¼ð²n`‚,Õ€’Ï—“´·ßŒq„½t¥V µZt>¡©rid6”à!,v$;tkabber/pixmaps/stars/roster/available-xa.gif000064400000000000000000000002351477701321300212210ustar00nobodynobodyGIF89aÂ@{XŒoœ‡­Ÿ½·ÍÏÞ@|!þCreated with The GIMP!ù,IxºÜjÆ1øŠu¶DUˆ'ÊGL7œè96Ä ¼ð²n`‚,Õ€’Ï—“´·ßŒq„½t¥V µZt>¡©rid6”à!,v$;tkabber/pixmaps/stars/roster/available.gif000064400000000000000000000002351477701321300206130ustar00nobodynobodyGIF89aÂÿÿÿžÿ®ÿ½ÿÍÿÜÿ€!þCreated with The GIMP!ù,IxºÜjÆ1øŠu¶DUˆ'ÊGL7œè96Ä ¼ð²n`‚,Õ€’Ï—“´·ßŒq„½t¥V µZt>¡©rid6”à!,v$;tkabber/pixmaps/stars/roster/conference-available.gif000064400000000000000000000003061477701321300227170ustar00nobodynobodyGIF89aã ÿðâ&ŽÔ<ÆYÆ\Nœ¸„“ªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!þCreated with The GIMP!ù,ZðÉùÆ ˜ž}²äG"& 6"(2vSˆEa ¤‰DNÌõ—ÜP@(¨:W!ˆFRò·œÐãÃ…žE­( ÷ƈeX쥣"Ö‡ó;r<Û8³ñD;tkabber/pixmaps/stars/roster/conference-unavailable.gif000064400000000000000000000002601477701321300232610ustar00nobodynobodyGIF89aã TTTeeeuuu………†††•••–––¦¦¦¶¶¶ÆÆÆÖÖÖççççççççççççççç!ù,]ðÉù”¢˜¦²ä "" 6è1vSˆEa ¤yÄ0sý!7‚`( T…«0ÁàHR™N¨”ÚqáèÙ~·ä2Š9NÿD‡˜JÄúp€HŽçòí[u;tkabber/pixmaps/stars/roster/group-closed.gif000064400000000000000000000001731477701321300212770ustar00nobodynobodyGIF89aã TTTlllqqqvvv{{{€€€¬¬¬±±±¶¶¶ëëëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù ,(ðÉI«½8g +à`7 å Gz¢¸^P$tmä5ïùžp(‰;tkabber/pixmaps/stars/roster/group-opened.gif000064400000000000000000000001721477701321300212770ustar00nobodynobodyGIF89aã TTTjjjpppvvv|||‚‚‚¯¯¯µµµºººóóóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù ,'ðÉI«½8ëÍ+ø`X@`žÁxÂ@†Š’È àßýÀ ð;tkabber/pixmaps/stars/roster/invisible.gif000064400000000000000000000002351477701321300206570ustar00nobodynobodyGIF89aˆˆ‡˜˜—§§§···ÇÇÇ×××çççhhg!þCreated with The GIMP!ù,IxºÜ À1ø‚u6D„Ê'L7œè96Â@¼ð²na„,Õ†’Ï—“´·ßŒq„½t¥V µZt>¡©rid6”à!,v$;tkabber/pixmaps/stars/roster/stalker.gif000064400000000000000000000002041477701321300203340ustar00nobodynobodyGIF89aŸ>Ÿ¯^¯¿~¿ÏžÏß¾ßïÞïÿÿÿÿÿÿ!ù,IxºÜ À1ø‚u6D„Ê'L7œè96Â@¼ð²na„,Õ†’Ï—“´·ßŒq„½t¥V µZt>¡©rid6”à!,v$;tkabber/pixmaps/stars/roster/unavailable.gif000064400000000000000000000002351477701321300211560ustar00nobodynobodyGIF89aÂgggxxw‰‰ˆ™™˜ªª©ºººËËÊhhg!þCreated with The GIMP!ù,IxºÜjÆ1øŠu¶DUˆ'ÊGL7œè96Ä ¼ð²n`‚,Õ€’Ï—“´·ßŒq„½t¥V µZt>¡©rid6”à!,v$;tkabber/pixmaps/stars/services000075500000000000000000000000001477701321300164325ustar00nobodynobodytkabber/pixmaps/stars/services/rss_away.gif000064400000000000000000000002611477701321300210270ustar00nobodynobodyGIF89aã3™K+e²f²™ÌÌåÿÿÔÀŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!þCreated with The GIMP!ù,EðÉIë8kQú ÈQ^ެÀÙ™.©®&*•p`?Ë"ƒ.4( ^>@Ñ`”Ës@¸ÍXËB5+n¹]á&C@E;tkabber/pixmaps/stars/services/rss_chat.gif000064400000000000000000000002611477701321300210050ustar00nobodynobodyGIF89aãK+ÿ˜ÿ²ÔÀŠÿËÿÌÿåÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!þCreated with The GIMP!ù,EðÉIë 8ëPù ÈQ^ެÀÙ™.©®&*•°`?˃.4( ^>@ñ`”KspäÍXKCõ6°`g“K";tkabber/pixmaps/stars/services/rss_dnd.gif000064400000000000000000000002611477701321300206330ustar00nobodynobodyGIF89aã c‚K+¡ÀÁßÔÀŠddddddd!þCreated with The GIMP!ù,EðÉIë8ëQú ÈQ^ެÀÙ™.©®&*•ða?Ë"†.d ^>@Q`”ËÓP¸ÍXKB5+n¹]á&S@E;tkabber/pixmaps/stars/services/rss_offline.gif000064400000000000000000000002251477701321300215100ustar00nobodynobodyGIF89aÂ???DDDRRRiii†††¦¦¦ËËÊ!þCreated with The GIMP!ù,AxºÜ0ÊЂ¹SfsÞŒÀWy&'ލt¨àIà g1œ6@¯àSaCqð£­HÃbÕkN©ºI$·H;tkabber/pixmaps/stars/services/rss_online.gif000064400000000000000000000002611477701321300213520ustar00nobodynobodyGIF89aã K+ÿÿ˜ÿ±ÿ²ÔÀŠÿËÿåÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!þCreated with The GIMP!ù,EðÉIë 8ëPƒù ÈQ^Ž—¬ÀÙ™.©®&*•0b?ˇ.t(^>@q`”KópäÍXKBõ6°`g“K";tkabber/pixmaps/stars/services/rss_xa.gif000064400000000000000000000002611477701321300204760ustar00nobodynobodyGIF89aã 2™K+e²˜Ì™ÌËåÔÀŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!þCreated with The GIMP!ù,EðÉIë8ëQú ÈQ^ެÀÙ™.©®&*•ða?Ë"†.d ^>@Q`”ËÓP¸ÍXKB5+n¹]á&S@E;tkabber/pixmaps/stars/tkabber000075500000000000000000000000001477701321300162215ustar00nobodynobodytkabber/pixmaps/stars/tkabber/chat-bookmark.gif000064400000000000000000000002171477701321300215110ustar00nobodynobodyGIF89aã cd}~—˜±Ëå&&ÿÿÿÿÿÿÿ!ù,<ðÉI«•Ý{ή‡axŸŽåÊ­ÃÐvrC …H?6!´F$ShhDnV³Ô)ù™¦”Wlö;tkabber/pixmaps/stars/tkabber/chat-bookmark1.gif000064400000000000000000000002461477701321300215740ustar00nobodynobodyGIF89aã!!!"""&6&&7&+K+0`05u5:Š:?Ÿ??Ÿ??Ÿ??Ÿ??Ÿ??Ÿ??Ÿ??Ÿ?!þCreated with The GIMP!ù,:ÉI«•çÜkÌ®FQxŸŽ%Ê­ÃÐvÔqCÈ"Ø"\ hH&Xñ¸YÍR'ä'šJV­×O;tkabber/pixmaps/stars/tkabber/new-msg.gif000064400000000000000000000003061477701321300203430ustar00nobodynobodyGIF89aãK+µÚÿÔÀŠÿÿÿÿÿÿÿÿ!þCreated with The GIMP!ù ,ZÉI«½8ë-¶GÝ— D(VdQzAë ©¡ÂZpÜø‘›ç¤ž@E¶δ±¤ý8‹Ä[Õ7=l›¬Q+í~ka±ñœINÙ·~qÙí§¼~ÏïO";tkabber/pixmaps/stars/tkabber/toolbar-add-user.gif000064400000000000000000000002511477701321300221310ustar00nobodynobodyGIF89aÂÐÿžÿ®ÿ¾ÿÎÿÞÿîççç!þCreated with The GIMP!ù ,UxºÜþ0ÊI«½8¯$Ÿ :¢ÐM Ê:UJÌôüZQÀγ8`h0£rxI.Á'´’ã=-²ÙòFI­F TbK§ÈGÖ¸ß𸜑;tkabber/pixmaps/stars/tkabber/toolbar-disco.gif000064400000000000000000000002541477701321300215310ustar00nobodynobodyGIF89a€ZÿÌÿÿ~ÿÀÿæÿÿÌÿ!ù ,qxºÜþ0‚ ¢=@èz_Ö×1(ޏ¡T¹Ž@0©!ÜîiÅ7þvN6 ž°x9 …I×DB ¡¬ú,` Q*׋…&u'\@ŒÏ¯™ð"åH:êˆwïïyupyt„nˆ(ƒƒŒ( ;tkabber/pixmaps/stars/tkabber/toolbar-disco_old.gif000064400000000000000000000004721477701321300223710ustar00nobodynobodyGIF89a„Š*•*?Ÿ?TªTUªUi´ij´j¿”É””Ê”©Ô©ªÔª¾Þ¾¿ß¿ÓéÓÔéÔéôéÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!þCreated with The GIMP!ù ,žà'ŽdižhªžÀê°›BÈ"¬ 1ºØ¬V …ñ68 ‡hÒ TÑŒPDq($«Í¬b¡à~ÌÓUÌh0ʇ3¸´>  ÇÃñ6£K4  q$uwy‹ri’P•Us&4EOœE®AFrA9M»¼¾¿¼ÂÄÅ(!;tkabber/pixmaps/stars/tkabber/toolbar-show-offline.gif000064400000000000000000000003701477701321300230270ustar00nobodynobodyGIF89aãgggxxw‰‰ˆ™™˜ÿžªª©ÿ®ºººÿ¾ÿÎËËÊÿÞÿîÿÿçççççç!þCreated with The GIMP!ù ,ŒðÉI«½8ëÍ©RÚ·)Gi•¸E[Hnqtì`ß¶Ü=Å üÀÁKC À|d@PÜ Ð€Œb‹¸CG›(›Ëáá‘X¸ß „°Ã^0îŒE\8ã´ y .}!ƒ(*uxƒ"uonq;dgfac``bNVVXM©¨;­®¯®;tkabber/pixmaps/stars/tkabber/toolbar-show-online.gif000064400000000000000000000002211477701321300226640ustar00nobodynobodyGIF89aÂÿžÿ®ÿ¾ÿÎÿÞÿîÿÿççç!ù ,VxºÜþ0ÊI«½8ë}Þ¤C߬ ´BP­Cm×±% Dï.¯@,€˜¡Á`d”Ì#fG(6ƒª¯‡œín¶eÕzµd¢“‰”Š„ÜmŽ|~I;tkabber/pixmaps/stars/tkabber/xaddress.gif000064400000000000000000000003541477701321300206060ustar00nobodynobodyGIF89a„s¨ržÝ&&ooo¸Îÿ€ýžþŸÿ ÿÿÿ¯ÿÑÿáÿåÿÿoooooooooooooooooooooooooooooooooooooooooooooooo!ù ,ià‘@drhŠ0,‹¤0Ä84ƒ äûü8 ‚P(({4àTP «ã…*Eœ GÒñ–KnLLƲærzœ nT£™£ü›ÔXøé(0  my{u~ €poq|tvg(!;tkabber/plugins.tcl000064400000000000000000000070341477701321300142420ustar00nobodynobody# plugins.tcl -- # # This file is a part of the Tkabber XMPP client. It implements routines # which load internal (located inside Tkabber's root directory) or load # and unload external plugins (files like dir/plugin/plugin.tcl). namespace eval plugins {} proc plugins::load {dir args} { set dir [fullpath $dir] set uplev 0 foreach {attr val} $args { switch -- $attr { -uplevel {set uplev $val} } } foreach file [lsort [glob -nocomplain $dir/*.tcl]] { debugmsg plugins "Loading plugin from $file" if {$uplev} { uplevel [list source $file] } else { source $file } } } proc plugins::load_dir {plugins_dir} { foreach dir [lsort [glob -nocomplain -type {d l} \ [file join $plugins_dir *]]] { set file [file join $dir [file tail $dir].tcl] if {[file exists $file]} { debugmsg plugins "Loading plugin from $file" source $file } else { debugmsg plugins "Can't load plugin from directory $dir" } } } proc plugins::is_registered {name} { variable loaded if {[info exists loaded($name)]} { return 1 } else { return 0 } } proc plugins::register {name args} { foreach {key val} $args { switch -- $key { -namespace - -source - -description - -loadcommand - -unloadcommand { set opts($key) $val } default { return -code error [::msgcat::mc "Invalid option \"%s\"" $key] } } } foreach key {-namespace -source -description -loadcommand -unloadcommand} { if {![info exists opts($key)]} { return -code error [::msgcat::mc "Missing option \"%s\"" $key] } } custom::defgroup {Plugins Management} \ [::msgcat::mc "Loading and unloading external plugins."] \ -group Tkabber custom::defvar loaded($name) 0 $opts(-description) \ -type boolean \ -group {Plugins Management} \ -command [namespace code [list load_or_unload \ $name \ $opts(-namespace) \ $opts(-source) \ $opts(-loadcommand) \ $opts(-unloadcommand)]] } proc plugins::load_or_unload {name ns source load unload args} { variable loaded # Checking if a plugin is loaded by querying a list of commands in # a corresponding namespace. set commands [info commands ${ns}::*] if {$loaded($name)} { if {[llength $commands] == 0} { # Plugin isn't loaded, so loading it debugmsg plugins "Loading external plugin $name" source $source eval $load } else { debugmsg plugins "External plugin $name is already loaded" } } else { if {[llength $commands] > 0} { # Plugin is loaded, so unloading it debugmsg plugins "Unoading external plugin $name" eval $unload foreach cmd $commands { rename $cmd "" } } else { debugmsg plugins "External plugin $name is already unloaded" } } } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins000075500000000000000000000000001477701321300134535ustar00nobodynobodytkabber/plugins/chat000075500000000000000000000000001477701321300143725ustar00nobodynobodytkabber/plugins/chat/abbrev.tcl000064400000000000000000000073321477701321300164230ustar00nobodynobody# abbrev.tcl -- # # "abbrev" Tkabber plugin -- "Chat input abbreviations". # Written by Konstantin Khomoutov # # TODO More comments # TODO extensive testing namespace eval abbrev { variable abbrevs array set abbrevs {} trace add variable [namespace current]::abbrevs write \ [namespace current]::store_abbrevs custom::defvar stored_abbrevs {} \ "List of chat input abbreviations" \ -group Hidden \ -type string bind TextAbbrevs \ [list [namespace current]::expand_abbrevs %W] } proc abbrev::command_comps {chatid compsvar wordstart line} { upvar 0 $compsvar comps if {!$wordstart} { lappend comps {/abbrev } {/unabbrev } {/listabbrevs } } } hook::add generate_completions_hook \ [namespace current]::abbrev::command_comps proc abbrev::handle_command {chatid user body type} { variable abbrevs if {[string match "/abbrev*" $body]} { if {![regexp {^/abbrev\s+(\S+)\s+(.*)$} $body - what for]} { show error $chatid [::msgcat::mc "Usage: /abbrev WHAT FOR"] return stop } set abbrevs($what) $for show info $chatid [::msgcat::mc "Added abbreviation:\n%s: %s" \ $what $for] } elseif {[string match "/unabbrev*" $body]} { if {![regexp {^/unabbrev\s+(\S+)} $body - what]} { show error $chatid [::msgcat::mc "Usage: /unabbrev WHAT"] return stop } # Handle special case: * stands for "all abbreviations": if {[string equal $what *]} { array unset abbrevs * show info $chatid [::msgcat::mc "Purged all abbreviations" $what] return stop } if {[catch {unset abbrevs($what)}]} { show error $chatid [::msgcat::mc "No such abbreviation: %s" $what] return stop } else { show info $chatid [::msgcat::mc "Deleted abbreviation: %s" $what] } } elseif {[string match "/listabbrevs*" $body]} { set out [::msgcat::mc "Abbreviations:"] foreach ab [array names abbrevs] { append out "\n$ab: $abbrevs($ab)" } show info $chatid $out } else { return } return stop } hook::add chat_send_message_hook \ [namespace current]::abbrev::handle_command 15 proc abbrev::install_bindtag {chatid type} { set iw [chat::input_win $chatid] set bt [bindtags $iw] set ix [lsearch -exact $bt Text] if {$ix < 0} return ;# very, very strange... bindtags $iw [linsert $bt $ix TextAbbrevs] } hook::add open_chat_post_hook \ [namespace current]::abbrev::install_bindtag proc abbrev::expand_abbrevs {w} { variable abbrevs if {[catch {tk::TextPrevPos $w insert tcl_startOfPreviousWord} from]} { set from [tkTextPrevPos $w insert tcl_startOfPreviousWord] } set what [$w get $from insert] if {[info exists abbrevs($what)]} { set for $abbrevs($what) $w delete $from insert $w insert $from $for } } proc abbrev::store_abbrevs {args} { variable abbrevs variable stored_abbrevs set stored_abbrevs [array get abbrevs] } proc abbrev::restore_abbrevs {args} { variable abbrevs variable stored_abbrevs array set abbrevs $stored_abbrevs } # Prio of this handler must be > 60 since customize db is read at 60 hook::add postload_hook \ [namespace current]::abbrev::restore_abbrevs 70 # $type should be either "info" or "error" proc abbrev::show {type chatid msg} { set jid [chat::get_jid $chatid] set cw [chat::chat_win $chatid] chat::add_message $chatid $jid $type $msg {} } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/bookmark_highlighted.tcl000064400000000000000000000140051477701321300213220ustar00nobodynobody# bookmark_highlighted.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # implements scrolling to the previous/next highligthed message in # Tkabber chatlog windows. namespace eval bookmark { hook::add postload_hook [namespace current]::init hook::add open_chat_post_hook [namespace current]::on_open_chat hook::add close_chat_post_hook [namespace current]::on_close_chat hook::add chat_win_popup_menu_hook [namespace current]::popup_menu hook::add draw_message_hook [namespace current]::add_bookmark 80 } proc bookmark::init {} { global usetabbar if {$usetabbar} { bind . [list [namespace current]::next_bookmark .] catch {bind . [list [namespace current]::next_bookmark .]} bind . [list [namespace current]::prev_bookmark .] } } proc bookmark::on_open_chat {chatid type} { global usetabbar if {!$usetabbar} { set cw [chat::chat_win $chatid] set top [winfo toplevel $cw] bind $top [list [namespace current]::next_bookmark [double% $cw]] catch {bind $top [list [namespace current]::next_bookmark [double% $cw]]} bind $top [list [namespace current]::prev_bookmark [double% $cw]] } } proc bookmark::on_close_chat {chatid} { variable bookmark set cw [chat::chat_win $chatid] catch { array unset bookmark $cw,* } } proc bookmark::popup_menu {m W X Y x y} { set groupchat 0 foreach chatid [chat::opened] { if {[chat::chat_win $chatid] == $W} { set groupchat [expr {[chat::is_groupchat $chatid]}] break } } if {!$groupchat} return $m add command -label [::msgcat::mc "Prev highlighted"] -accelerator F3 \ -command [list [namespace current]::prev_bookmark $W] $m add command -label [::msgcat::mc "Next highlighted"] -accelerator Shift-F3 \ -command [list [namespace current]::next_bookmark $W] } proc bookmark::get_chatwin {} { global usetabbar if {!$usetabbar} { return "" } set cw "" foreach chatid [chat::opened] { if {[.nb raise] == [ifacetk::nbpage [chat::winid $chatid]]} { set cw [chat::chat_win $chatid] break } } return $cw } proc bookmark::add_bookmark {chatid from type body x} { variable bookmark if {$type != "groupchat"} return set cw [chat::chat_win $chatid] set xlib [chat::get_xlib $chatid] set jid [chat::get_jid $chatid] set myjid [chat::our_jid $chatid] set mynick [chat::get_nick $xlib $myjid $type] if {[string equal $jid $from] || [string equal $myjid $from] || \ ![check_message $mynick $body]} { return } if {![info exists bookmark($cw,id)]} { set bookmark($cw,id) 0 } set b [incr bookmark($cw,id)] $cw mark set hbookmark$b "end - 1 char" $cw mark gravity hbookmark$b left } proc bookmark::next_bookmark {cw} { variable bookmark if {$cw == "."} { set cw [get_chatwin] if {$cw == ""} return } set groupchat 0 foreach chatid [chat::opened] { if {[chat::chat_win $chatid] == $cw} { set groupchat [expr {[chat::is_groupchat $chatid]}] break } } if {!$groupchat} return if {![info exists bookmark($cw,last)] || \ [catch {$cw index $bookmark($cw,last)}]} { set bookmark($cw,last) 0.0 } set idx [$cw index $bookmark($cw,last)] if {$bookmark($cw,last) == "end" || \ (([lindex [$cw yview] 0] == 0 || [lindex [$cw yview] 1] == 1) && \ ([$cw dlineinfo $idx] == {} || "sel" ni [$cw tag names $idx]))} { set bookmark($cw,last) 0.0 } if {$bookmark($cw,last) == "0.0"} { set first_round 0 } else { set first_round 1 } while {($bookmark($cw,last) != {}) || $first_round} { if {$bookmark($cw,last) == {}} { set bookmark($cw,last) 0.0 set first_round 0 } set bookmark($cw,last) [$cw mark next $bookmark($cw,last)] if {[string match "hbookmark*" $bookmark($cw,last)]} { break } } if {$bookmark($cw,last) == {}} { set bookmark($cw,last) 0.0 } else { $cw tag remove sel 0.0 end $cw tag add sel \ "$bookmark($cw,last) linestart" \ "$bookmark($cw,last) lineend" $cw see $bookmark($cw,last) } return $bookmark($cw,last) } proc bookmark::prev_bookmark {cw} { variable bookmark if {$cw == "."} { set cw [get_chatwin] if {$cw == ""} return } set groupchat 0 foreach chatid [chat::opened] { if {[chat::chat_win $chatid] == $cw} { set groupchat [expr {[chat::is_groupchat $chatid]}] break } } if {!$groupchat} return if {![info exists bookmark($cw,last)] || \ [catch {$cw index $bookmark($cw,last)}]} { set bookmark($cw,last) end } set idx [$cw index $bookmark($cw,last)] if {$bookmark($cw,last) == "0.0" || \ ([lindex [$cw yview] 1] == 1 && \ ([$cw dlineinfo $idx] == {} || "sel" ni [$cw tag names $idx]))} { set bookmark($cw,last) end } if {$bookmark($cw,last) == "end"} { set first_round 0 } else { set first_round 1 } while {($bookmark($cw,last) != {}) || $first_round} { if {$bookmark($cw,last) == {}} { set bookmark($cw,last) end set first_round 0 } set bookmark($cw,last) [$cw mark previous $bookmark($cw,last)] if {[string match "hbookmark*" $bookmark($cw,last)]} { break } } if {($bookmark($cw,last) == {})} { set bookmark($cw,last) end } else { $cw tag remove sel 0.0 end $cw tag add sel \ "$bookmark($cw,last) linestart" \ "$bookmark($cw,last) lineend" $cw see $bookmark($cw,last) } return $bookmark($cw,last) } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/chatstate.tcl000064400000000000000000000230371477701321300171420ustar00nobodynobody# chatstate.tcl -- # # Chat State Notifications (XEP-0085) support. namespace eval chatstate { custom::defgroup Chatstate \ [::msgcat::mc "Chat message window state plugin options."] \ -group Chat custom::defvar options(enable) 0 \ [::msgcat::mc "Enable sending chat state notifications."] \ -type boolean -group Chatstate custom::defvar options(ignore_muc) 1 \ [::msgcat::mc "Ignore mass chat state notifications in multi-user\ chatrooms."] \ -type boolean -group Chatstate disco::register_feature $::NS(chatstate) } proc chatstate::is_reply_allowed {xlib jid} { variable options if {!$options(enable)} { return 0 } if {[get_jid_status $xlib $jid] == "unavailable"} { return 0 } set chatid [chat::chatid $xlib [::xmpp::jid::stripResource $jid]] if {[chat::is_groupchat $chatid]} { return 1 } return [roster::is_trusted $xlib $jid] } # Workaround a bug in JIT, which responds with error to chatstate # events without a body proc chatstate::ignore_error \ {xlib from id type is_subject subject body err thread priority x} { switch -- $type/$id { error/chatstate { return -code break } } } hook::add process_message_hook [namespace current]::chatstate::ignore_error 20 proc chatstate::flush_composing {chatid user body type} { variable chatstate variable event_afterid set chatstate(composing,$chatid) 1 set chatstate(paused,$chatid) 0 if {[info exists event_afterid(pause,$chatid)]} { after cancel $event_afterid(pause,$chatid) unset event_afterid(pause,$chatid) } } hook::add chat_send_message_hook \ [namespace current]::chatstate::flush_composing 91 proc chatstate::process_message \ {xlib from id type is_subject subject body err thread priority xs} { set chatid [chat::chatid $xlib $from] foreach x $xs { ::xmpp::xml::split $x tag xmlns attrs cdata subels switch -- $xmlns \ $::NS(chatstate) { return [process_x_chatstate $chatid $from $type $body $x] } } } hook::add process_message_hook [namespace current]::chatstate::process_message proc chatstate::process_x_chatstate {chatid from type body x} { variable options variable chatstate if {$options(ignore_muc) && $type == "groupchat"} { return } ::xmpp::xml::split $x tag xmlns attrs cdata subels switch -- $tag { active { if {![info exists chatstate(active,$chatid)] || \ !$chatstate(active,$chatid)} { set chatstate(active,$chatid) 1 change_status $chatid active } } inactive { if {[info exists chatstate(active,$chatid)] && \ $chatstate(active,$chatid)} { set chatstate(active,$chatid) 0 change_status $chatid inactive } } gone { set chatstate(active,$chatid) 0 change_status $chatid gone } composing - paused { change_status $chatid $tag } } return } proc chatstate::change_status {chatid status} { global usetabbar variable event_afterid if {[info exists event_afterid(clear,$chatid)]} { after cancel $event_afterid(clear,$chatid) } set cw [chat::winid $chatid] set jid [chat::get_jid $chatid] set text "" set stext "" switch -- $status { active { set text [::msgcat::mc "Chat window is active"] set stext [::msgcat::mc "%s has activated chat window" $jid] } composing { set text [::msgcat::mc "Composing a reply"] set stext [::msgcat::mc "%s is composing a reply" $jid] } paused { set text [::msgcat::mc "Paused a reply"] set stext [::msgcat::mc "%s is paused a reply" $jid] } inactive { set text [::msgcat::mc "Chat window is inactive"] set stext [::msgcat::mc "%s has inactivated chat window" $jid] } gone { set text [::msgcat::mc "Chat window is gone"] set stext [::msgcat::mc "%s has gone chat window" $jid] } } if {$stext != "" && $usetabbar} { set_status $stext } if {![winfo exists $cw]} return $cw.status.event configure -text $text set event_afterid(clear,$chatid) \ [after 10000 [list [namespace current]::clear_status $chatid]] } proc chatstate::clear_status {chatid} { set cw [chat::winid $chatid] if {![winfo exists $cw]} return $cw.status.event configure -text "" } proc chatstate::event_composing {iw sym} { variable options variable chatstate variable event_afterid if {$sym == ""} return set cw [join [lrange [split $iw .] 0 end-1] .] set chatid [chat::winid_to_chatid $cw] if {![chat::is_chat $chatid]} return if {![info exists chatstate(windowactive,$chatid)] || \ ($chatstate(windowactive,$chatid) == 0)} return set empty [expr {[string length [$iw get 0.0 "end-1c"]] == 0}] if {[info exists event_afterid(pause,$chatid)]} { after cancel $event_afterid(pause,$chatid) unset event_afterid(pause,$chatid) } set paused [expr {[info exists chatstate(paused,$chatid)] && \ $chatstate(paused,$chatid)}] if {!$empty} { set event_afterid(pause,$chatid) \ [after 6400 [list [namespace current]::send_paused $chatid]] if {($sym == "" || $sym == "") && !$paused} return } if {[info exists chatstate(composing,$chatid)] && \ ($chatstate(composing,$chatid) == $empty) && \ !$paused} return set xlib [chat::get_xlib $chatid] set jid [chat::get_jid $chatid] set chatstate(composing,$chatid) $empty set chatstate(paused,$chatid) 0 if {![is_reply_allowed $xlib $jid]} return if {$empty} { lappend xlist [::xmpp::xml::create active -xmlns $::NS(chatstate)] } else { lappend xlist [::xmpp::xml::create composing -xmlns $::NS(chatstate)] } ::xmpp::sendMessage $xlib $jid -type chat -id chatstate -xlist $xlist } proc chatstate::send_paused {chatid} { variable options variable chatstate variable event_afterid if {[info exists event_afterid(pause,$chatid)]} { after cancel $event_afterid(pause,$chatid) unset event_afterid(pause,$chatid) } if {![info exists chatstate(windowactive,$chatid)] || \ ($chatstate(windowactive,$chatid) == 0)} return if {![info exists chatstate(composing,$chatid)] || \ $chatstate(composing,$chatid)} return if {![chat::is_chat $chatid]} return set chatstate(paused,$chatid) 1 set xlib [chat::get_xlib $chatid] set jid [chat::get_jid $chatid] if {![is_reply_allowed $xlib $jid]} return lappend xlist [::xmpp::xml::create paused -xmlns $::NS(chatstate)] ::xmpp::sendMessage $xlib $jid -type chat -id chatstate -xlist $xlist } proc chatstate::setup_ui {chatid type} { variable chatstate if {![chat::is_chat $chatid]} return set cw [chat::winid $chatid] set input [chat::input_win $chatid] set l $cw.status.event if {![winfo exists $l]} { Label $l pack $l -side left } bind $input \ [list after idle [namespace code [list event_composing %W ]]] bind $input \ [list after idle [namespace code [list event_composing %W ]]] } hook::add text_on_keypress_hook [namespace current]::chatstate::event_composing hook::add open_chat_post_hook [namespace current]::chatstate::setup_ui proc chatstate::clear_status_on_send {chatid user body type} { if {![chat::is_chat $chatid]} return clear_status $chatid } hook::add chat_send_message_hook \ [namespace current]::chatstate::clear_status_on_send proc chatstate::make_xlist {varname chatid user id body type} { variable options variable chatstate upvar 2 $varname var if {$type != "chat"} { return } set xlib [chat::get_xlib $chatid] set jid [chat::get_jid $chatid] set chatstate(windowactive,$chatid) 1 if {![is_reply_allowed $xlib $jid]} return lappend var [::xmpp::xml::create active -xmlns $::NS(chatstate)] return } hook::add chat_send_message_xlist_hook \ [namespace current]::chatstate::make_xlist proc chatstate::send_gone {chatid} { variable options variable chatstate variable event_afterid if {[info exists event_afterid(pause,$chatid)]} { after cancel $event_afterid(pause,$chatid) unset event_afterid(pause,$chatid) } if {[info exists event_afterid(clear,$chatid)]} { after cancel $event_afterid(clear,$chatid) unset event_afterid(clear,$chatid) } if {![info exists chatstate(windowactive,$chatid)] || \ ($chatstate(windowactive,$chatid) == 0)} return if {![chat::is_chat $chatid]} return set xlib [chat::get_xlib $chatid] set jid [chat::get_jid $chatid] catch {unset chatstate(windowactive,$chatid)} catch {unset chatstate(composing,$chatid)} catch {unset chatstate(paused,$chatid)} if {![is_reply_allowed $xlib $jid]} return lappend xlist [::xmpp::xml::create gone -xmlns $::NS(chatstate)] ::xmpp::sendMessage $xlib $jid -type chat -id chatstate -xlist $xlist } hook::add close_chat_post_hook \ [namespace current]::chatstate::send_gone 10 # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/clear.tcl000064400000000000000000000025231477701321300162450ustar00nobodynobody# clear.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin # which implements /clear command in chat windows (it clears the # chatlog window). namespace eval clear {} proc clear::clear_chat_win {chatid} { set chatw [chat::chat_win $chatid] $chatw configure -state normal $chatw delete 0.0 end $chatw configure -state disabled } proc clear::handle_clear_command {chatid user body type} { set body [string trim $body] if {$body ne "/clear"} { return } clear_chat_win $chatid return stop } hook::add chat_send_message_hook \ [namespace current]::clear::handle_clear_command 50 proc clear::clear_command_comp {chatid compsvar wordstart line} { upvar 0 $compsvar comps if {!$wordstart} { lappend comps {/clear } } } hook::add generate_completions_hook \ [namespace current]::clear::clear_command_comp proc clear::add_chat_menu_item {m xlib jid} { set chatid [chat::chatid $xlib $jid] $m add command -label [::msgcat::mc "Clear chat window"] \ -command [list [namespace current]::clear_chat_win $chatid] } hook::add chat_create_conference_menu_hook \ [namespace current]::clear::add_chat_menu_item 41 hook::add chat_create_user_menu_hook \ [namespace current]::clear::add_chat_menu_item 41 # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/complete_last_nick.tcl000064400000000000000000000045561477701321300210260ustar00nobodynobody# complete_last_nick.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # raises priority (in the list of word completions) of that nickname # who addressed a message personally to me. namespace eval completion { custom::defvar options(completion_expire) 10 \ [::msgcat::mc "Number of groupchat messages to expire nick completion\ according to the last personally addressed message."] \ -type integer \ -group Chat } proc handle_last_nick {chatid from type body x} { global last_nick my_last_nick my_last_nick_counter if {$type != "groupchat"} return set xlib [chat::get_xlib $chatid] set nick [chat::get_nick $xlib $from $type] set myjid [chat::our_jid $chatid] set mynick [chat::get_nick $xlib $myjid $type] if {$nick != $mynick} { if {[check_message $mynick $body]} { set my_last_nick($chatid) $nick set my_last_nick_counter($chatid) 0 } else { set last_nick($chatid) $nick if {[info exists my_last_nick_counter($chatid)]} { incr my_last_nick_counter($chatid) } } } return } hook::add draw_message_hook [namespace current]::handle_last_nick 79 proc last_nick_comp {chatid compsvar wordstart line} { global last_nick my_last_nick my_last_nick_counter upvar 0 $compsvar comps if {$wordstart} return set prefix $::plugins::completion::options(nlprefix) set suffix $::plugins::completion::options(nlsuffix) if {[info exists last_nick($chatid)]} { set ln ${prefix}$last_nick($chatid)${suffix} set idx [lsearch -exact $comps $ln] #set comps [lreplace $comps $idx $idx] if {$idx > 0} { set comps [concat [list $ln] $comps] } } if {[info exists my_last_nick($chatid)] && \ (![info exists my_last_nick_counter($chatid)] || \ $my_last_nick_counter($chatid) < $::plugins::completion::options(completion_expire))} { set ln ${prefix}$my_last_nick($chatid)${suffix} set idx [lsearch -exact $comps $ln] #set comps [lreplace $comps $idx $idx] if {$idx > 0} { set comps [concat [list $ln] $comps] } } } hook::add generate_completions_hook [namespace current]::last_nick_comp 92 # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/completion.tcl000064400000000000000000000232051477701321300173300ustar00nobodynobody# completion.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # impements an inportant part of the Tkabber user interface: words # completion in chat input windows. namespace eval completion { variable options set options(prefix) "" set options(suffix) " " set options(nlprefix) "" set options(nlsuffix) ": " } # Run all generate_completions hooks and return only those completion # that could be used to complete given word, provided that it was typed in given window # from the given position proc completion::get_matching_completions {chatid input_window word_pos word} { variable comps {} hook::run generate_completions_hook \ $chatid [namespace current]::comps \ [string length [$input_window get 1.0 $word_pos]] \ [$input_window get 1.0 "end -1c"] set len [string length $word] set matches {} foreach comp $comps { if {[string equal -nocase -length $len $word $comp]} { lappend matches $comp } } return $matches } proc completion::complete {chatid shift} { variable completion # completion(state,$chatid) holds state of completion for each chatid. # Possible states are: # normal -- we are not currently completing anything # menu_start -- # menu_next -- # completed -- # # completion(word,$chatid) holds current word being completed # (for the "menu-style" completion) # # completion(idx,$chatid) variable options variable comps {} # TODO: find out what is this state transition for ... if {![info exists completion(state,$chatid)] || \ [string equal $completion(state,$chatid) normal]} { set completion(state,$chatid) completed } set iw [chat::input_win $chatid] if {$completion(state,$chatid) == "menu_next" && \ [$iw compare insert == compins]} { set word $completion(word,$chatid) set matches [get_matching_completions $chatid $iw compstart $word] set n [llength $matches] if {!$n} {return} # TODO: what is this for? set completion(idx,$chatid) [expr {($completion(idx,$chatid)+$shift) % $n}] set comp [lindex $matches $completion(idx,$chatid)] debugmsg plugins "COMPLETION deleting compstart compent for $comp" $iw delete compstart compend $iw insert compstart $comp return } elseif {$completion(state,$chatid) == "menu_next"} { set completion(state,$chatid) completed } set ins [lindex [split [$iw index insert] .] 1] set line [$iw get "insert linestart" "insert lineend"] set lbefore [string range $line 0 [expr {$ins - 1}]] #set lafter [string range $line $ins end] # Try to find out what part of the input we are going to complete. # If line is empty or consists of a single word, then complete that, # if there are several words, try to complete all of them, except for the case when first # word starts with a '/' - then it is a command name and must be excluded from completion if {[string first " " $lbefore] == -1} { # Trying to complete a single word set word $lbefore debugmsg plugins "COMPLETION SINGLEWORD: $word" } else { # Trying to complete multy-word phrase. # If there is no completion for current line, drop the first word # Repeat until there would be some completions or all words would be dropped if {[string equal -nocase -length 1 $lbefore "/"]} { # First word is a command and will be ignored by regexp later in the code set words $lbefore } else { # First word is not a command, we should add a bogus word to be ignored # by the regexp later in the code set words "foo $lbefore" } debugmsg plugins "COMPLETION MULTIWORD: $words" while {$words != ""} { if {[regexp {^\S+\s+(.*)$} $words temp word] == 0} { set word $words debugmsg plugins "MULTIWORD COMPLETION fallback to single word $word" break } set phrasestart [expr {$ins - [string length $word]}] set matches [get_matching_completions $chatid $iw "insert linestart +$phrasestart chars" $word] debugmsg plugins "COMPLETION for $word: $matches" if {[llength $matches] == 0} { # Drop first word. Since "$word" has all words from "$words" minus first, it is easy. set words $word } else { # we got some completions, lets apply them break } } } #set wordstart [expr {$ins - [string length $word]}] #set word [$iw get "insert -1 chars wordstart" insert] debugmsg plugins "COMPLETION: completing $word" set len [string length $word] if {1 || $word != ""} { set wordstart [expr {$ins - [string length $word]}] set matches [get_matching_completions $chatid $iw "insert linestart +$wordstart chars" $word] debugmsg plugins "COMPLETION: $matches" if {[llength [lsort -unique $matches]] == 1 || \ $completion(state,$chatid) == "menu_start"} { set comp [lindex $matches [expr {$shift==1?0:"end"}]] debugmsg plugins "COMPLETION deleting from $wordstart for $comp" $iw delete "insert linestart +$wordstart chars" insert $iw insert insert $comp if {$completion(state,$chatid) == "menu_start"} { set compstart $wordstart set compend [expr {$compstart + [string length $comp]}] $iw mark set compstart "insert linestart +$compstart chars" $iw mark gravity compstart left $iw mark set compend "insert linestart +$compend chars" $iw mark gravity compend right $iw mark set compins insert set completion(state,$chatid) menu_next set completion(word,$chatid) $word set completion(idx,$chatid) [expr {$shift==1?0:[llength $matches]-1}] } } elseif {[llength [lsort -unique $matches]] > 1} { set app "" while {[set ch [same_char $matches $len]] != ""} { debugmsg plugins "COMPLETION APP: $len; $ch" append app $ch incr len } $iw insert insert $app set completion(state,$chatid) menu_start } } } proc completion::same_char {strings pos} { if {![llength $strings]} { return "" } set strs [lassign $strings str1] set ch [string index $str1 $pos] foreach str $strs { if {![string equal -nocase $ch [string index $str $pos]]} { return "" } } return $ch } proc completion::nick_comps {chatid compsvar wordstart line} { if {![chat::is_groupchat $chatid]} return set xlib [chat::get_xlib $chatid] variable options upvar 0 $compsvar comps debugmsg plugins "COMPLETION N: $comps" if {!$wordstart} { set prefix $options(nlprefix) set suffix $options(nlsuffix) } else { set prefix $options(prefix) set suffix $options(suffix) } set nickcomps {} foreach nick [muc::roster $chatid] { lappend nickcomps $prefix$nick$suffix } set nickcomps [lsort -dictionary -unique $nickcomps] set comps [concat $nickcomps $comps] debugmsg plugins "COMPLETION N: $comps" } hook::add generate_completions_hook \ [namespace current]::completion::nick_comps 90 proc completion::sort_comps {chatid compsvar wordstart line} { upvar 0 $compsvar comps set comps [lsort -dictionary -unique $comps] debugmsg plugins "COMPLETION S: $comps" } hook::add generate_completions_hook \ [namespace current]::completion::sort_comps 75 proc completion::delete_suffix {chatid} { variable completion variable options set iw [chat::input_win $chatid] if {![info exists completion(state,$chatid)]} return if {([string equal $completion(state,$chatid) menu_next] || \ [string equal $completion(state,$chatid) completed]) && \ [$iw compare insert == {end - 1 chars}]} { set ind [list insert - [string length $options(suffix)] chars] if {[string equal [$iw get $ind insert] $options(suffix)]} { debugmsg plugins "COMPLETION deleting suffix" $iw delete $ind insert } } set completion(state,$chatid) normal } proc completion::on_keypress {chatid} { set iw [chat::input_win $chatid] after idle \ [list [namespace current]::on_keypress1 $chatid [$iw index insert]] } proc completion::on_keypress1 {chatid idx} { variable completion set iw [chat::input_win $chatid] if {![winfo exists $iw]} return if {[$iw index insert] != $idx} { set completion(state,$chatid) normal } } proc completion::setup_bindings {chatid type} { variable history set iw [chat::input_win $chatid] set cc CompCtl$iw set bt [bindtags $iw] set bt [lreplace $bt -1 -1 $cc] bindtags $iw $bt debugmsg plugins "COMPLETION TAGS: $bt" bind $cc \ [list [namespace current]::complete [double% $chatid] 1] bind $cc +break bind $cc \ [list [namespace current]::complete [double% $chatid] -1] bind $cc +break bind $cc \ [list [namespace current]::delete_suffix [double% $chatid]] bind $cc \ [list [namespace current]::on_keypress [double% $chatid]] } hook::add open_chat_post_hook [namespace current]::completion::setup_bindings # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/disco.tcl000064400000000000000000000022001477701321300162500ustar00nobodynobody# disco.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # registers /disco command for chat input windows. This command opens # a service discovery window. namespace eval cdisco {} proc cdisco::handle_disco_command {chatid user body type} { set xlib [chat::get_xlib $chatid] set jid [chat::get_jid $chatid] set bjid [::xmpp::jid::stripResource $jid] if {![chat::is_groupchat [chat::chatid $xlib $bjid]]} { set jid $bjid } set body [string trim $body] if {[string equal [string range $body 0 6] "/disco "]} { set jid [string range $body 7 end] } elseif {![string equal $body "/disco"]} { return } disco::browser::open_win $xlib $jid return stop } hook::add chat_send_message_hook \ [namespace current]::cdisco::handle_disco_command 50 proc cdisco::disco_command_comp {chatid compsvar wordstart line} { upvar 0 $compsvar comps if {!$wordstart} { lappend comps {/disco } } } hook::add generate_completions_hook \ [namespace current]::cdisco::disco_command_comp # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/draw_error.tcl000064400000000000000000000007221477701321300173240ustar00nobodynobody# draw_error.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin # which puts error messages to chatlog windows. proc handle_error {chatid from type body x} { if {$type eq "error"} { set chatw [chat::chat_win $chatid] $chatw insert end $body err set cw [chat::winid $chatid] return stop } } hook::add draw_message_hook [namespace current]::handle_error 10 # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/draw_info.tcl000064400000000000000000000006361477701321300171320ustar00nobodynobody# draw_info.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin # which puts info messages to chatlog windows. proc handle_info {chatid from type body x} { if {$type eq "info"} { ::richtext::render_message [chat::chat_win $chatid] $body info return stop } } hook::add draw_message_hook [namespace current]::handle_info 10 # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/draw_message.tcl000064400000000000000000000010221477701321300176110ustar00nobodynobody# draw_message.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin # which adds our own chat (not groupchat) messages to chatlog windows. proc draw_message {chatid user body type} { if {$type ne "groupchat" && [hook::is_flag chat_send_message_hook draw]} { chat::add_message $chatid [chat::our_jid $chatid] $type $body {} } hook::unset_flag chat_send_message_hook draw } hook::add chat_send_message_hook [namespace current]::draw_message 91 # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/draw_normal_message.tcl000064400000000000000000000024151477701321300211700ustar00nobodynobody# draw_normal_message.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin # which puts common chat or groupchat messages to chatlog windows. proc draw_normal_message {chatid from type body x} { if {[chat::is_our_jid $chatid $from]} { set tag me } else { set tag they } set xlib [chat::get_xlib $chatid] set chatw [chat::chat_win $chatid] set nick [chat::get_nick $xlib $from $type] set cw [chat::winid $chatid] $chatw insert end "<$nick>" [list $tag NICK-$nick] " " $chatw mark set MSGLEFT "end - 1 char" $chatw mark gravity MSGLEFT left if {$type eq "groupchat"} { set myjid [chat::our_jid $chatid] set mynick [chat::get_nick $xlib $myjid $type] ::richtext::property_add mynick $mynick ::richtext::render_message $chatw $body "" } else { ::richtext::render_message $chatw $body "" } $chatw tag add MSG-$nick MSGLEFT "end - 1 char" if {![catch {::plugins::mucignore::is_ignored $xlib $from $type} ignore] && \ $ignore != ""} { $chatw tag add $ignore {MSGLEFT linestart} {end - 1 char} } return stop } hook::add draw_message_hook [namespace current]::draw_normal_message 87 # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/draw_server_message.tcl000064400000000000000000000013671477701321300212130ustar00nobodynobody# draw_server_message.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin # which puts server messages (either groupchat messages originated # at the service itself, or chat messages without from attribute) # to chatlog windows. proc handle_server_message {chatid from type body x} { set jid [chat::get_jid $chatid] if {($type eq "groupchat" && [string equal $jid $from]) || \ ($type eq "chat" && $from == "")} { set chatw [chat::chat_win $chatid] $chatw insert end --- server_lab " " ::richtext::render_message $chatw $body server return stop } } hook::add draw_message_hook [namespace current]::handle_server_message 20 # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/draw_timestamp.tcl000064400000000000000000000026201477701321300201750ustar00nobodynobody# draw_timestamp.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # outputs the message timestamp into chatlog windows. Format of the # timestamps is customizable. custom::defvar options(timestamp_format) {[%R]} \ [::msgcat::mc "Format of timestamp in chat message.\ Refer to Tcl documentation of 'clock' command for\ description of format.\n\nExamples:\n \ \[%R\] - \[20:37\]\n \[%T\] - \[20:37:12\]\n \ \[%a %b %d %H:%M:%S %Z %Y\] -\ \[Thu Jan 01 03:00:00 MSK 1970\]"] \ -type string -group Chat custom::defvar options(delayed_timestamp_format) {[%m/%d %R]} \ [::msgcat::mc "Format of timestamp in delayed chat messages delayed\ for more than 24 hours."] \ -type string -group Chat proc draw_timestamp {chatid from type body x} { variable options set chatw [chat::chat_win $chatid] set seconds [::xmpp::xml::getAttr [::xmpp::delay::parse $x] seconds] set seconds1 [expr {[clock seconds] - 24*60*60 + 60}] if {$seconds <= $seconds1} { set format $options(delayed_timestamp_format) } else { set format $options(timestamp_format) } $chatw insert end [clock format $seconds -format $format] } hook::add draw_message_hook [namespace current]::draw_timestamp 9 # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/draw_xhtml_message.tcl000064400000000000000000000247121477701321300210400ustar00nobodynobody# draw_xhtml_message.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin # which puts XHTML messages if they are included into the message # stanza to chatlog windows. Currently, only chat messages are # supported, and not groupchat ones. namespace eval xhtml { variable options variable statevars { color lmargin1 lmargin2 weight slant size list_style list_counter } variable urlid 0 custom::defvar options(enable) 0 \ [::msgcat::mc "Enable rendering of XHTML messages."] \ -type boolean -group Chat } proc xhtml::draw_xhtml_message {chatid from type plainbody x} { variable options if {!$options(enable)} return foreach xelem $x { ::xmpp::xml::split $xelem tag xmlns attrs cdata subels if {[string equal $xmlns http://jabber.org/protocol/xhtml-im]} { set xhtml $subels } } if {![info exists xhtml]} return foreach el $xhtml { ::xmpp::xml::split $el tag xmlns attrs cdata subels if {$tag == "body"} { set body $el } } if {![info exists body]} return if {[chat::is_our_jid $chatid $from]} { set tag me } else { set tag they } set xlib [chat::get_xlib $chatid] set chatw [chat::chat_win $chatid] set nick [chat::get_nick $xlib $from $type] set cw [chat::winid $chatid] if {$type eq "groupchat"} { return # TODO $chatw insert end "<$nick>" $tag " " set myjid [chat::our_jid $chatid] set mynick [chat::get_nick $xlib $myjid $type] set mynickl [string length $mynick] if {[string equal -length [expr {$mynickl + 2}] $body "$mynick: "]} { $chatw insert end $mynick me ::richtext::render_message [::chat::chat_win $chatid] \ [string range $body $mynickl end] "" } else { ::richtext::render_message [::chat::chat_win $chatid] $body "" } } else { $chatw insert end "<$nick>" $tag " " init [::chat::chat_win $chatid] add_xhtml [::chat::chat_win $chatid] $body } return stop } hook::add draw_message_hook [namespace current]::xhtml::draw_xhtml_message 85 proc xhtml::init {cw} { variable state variable stack array unset stack array unset state set state(color) [$cw cget -foreground] set stack(color) {} set state(lmargin1) 0 set stack(lmargin1) {} set state(lmargin2) 0 set stack(lmargin2) {} set state(weight) 0 set stack(weight) {} set state(slant) 0 set stack(slant) {} # TODO: use default font size set state(size) 12 set stack(size) {} set state(list_style) ul set stack(list_style) {} set state(list_counter) 0 set stack(list_counter) {} set state(afterspace) 1 set state(lastnl) 2 } proc xhtml::add_xhtml {cw xhtml} { variable state ::xmpp::xml::split $xhtml name xmlns attrs cdata subels set nextcdata [::xmpp::xml::getFirstCdata $xhtml] push set tag "" set prefix "" set suffix "" set pre 0 parse_style [::xmpp::xml::getAttr $attrs style] switch -- $name { h1 - h2 - h3 - blockquote - p { set prefix [string repeat "\n" [expr {2 - $state(lastnl)}]] set suffix "\n\n" set state(afterspace) 1 } pre - li { set prefix [string repeat "\n" [expr {1 - $state(lastnl)}]] set suffix "\n" set state(afterspace) 1 } } switch -- $name { h1 { incr state(size) 6 set state(weight) 1 } h2 { incr state(size) 4 set state(weight) 1 } h3 { incr state(size) 2 set state(weight) 1 } p { } br { set prefix "\n" set state(afterspace) 1 } strong { set state(weight) 1 } em { set state(slant) [expr {!$state(slant)}] } a { set url [::xmpp::xml::getAttr $attrs href] lappend tag [get_url_tag $cw $url] } img { set imgsrc [::xmpp::xml::getAttr $attrs src] set imgalt [::xmpp::xml::getAttr $attrs alt] set nextcdata "\[$imgalt\]" lappend tag [get_url_tag $cw $imgsrc] } span {} blockquote { incr state(lmargin1) 32 incr state(lmargin2) 32 } q { #set nextcdata "\"[string trim $cdata]\"" #set subels {} set prefix \" set suffix \" } pre { set nextcdata $cdata set subels {} set pre 1 } li { ::richtext::render_message $cw $prefix "" -nonewline set prefix "" switch -- $state(list_style) { ul { set item_prefix "\u2022 " } ol { variable stack set item_prefix "[incr state(list_counter)]. " set stack(list_counter) \ [lreplace $stack(list_counter) 0 0 \ $state(list_counter)] } } ::richtext::render_message $cw $item_prefix \ [concat xhtml_symb [get_tags $cw]] -nonewline } ul { incr state(lmargin1) 32 incr state(lmargin2) 32 set state(list_style) ul } ol { incr state(lmargin1) 32 incr state(lmargin2) 32 set state(list_style) ol set state(list_counter) 0 } } # TODO set tag [concat $tag [get_tags $cw]] if {!$pre} { regsub -all {[[:space:]]+} $nextcdata " " formatted } else { set formatted [string trim $nextcdata "\n"] } if {$state(afterspace) && [string index $formatted 0] == " "} { set formatted [string range $formatted 1 end] } if {$formatted != ""} { set state(afterspace) [expr {[string index $formatted end] == " "}] } ::richtext::render_message $cw $prefix $tag -nonewline ::richtext::render_message $cw $formatted $tag -nonewline if {$formatted != ""} { set state(lastnl) 0 } foreach xelem $subels { add_xhtml $cw $xelem set nextcdata [::xmpp::xml::getNextCdata $xelem] regsub -all {[[:space:]]+} $nextcdata " " formatted if {$state(afterspace) && [string index $formatted 0] == " "} { set formatted [string range $formatted 1 end] } if {$formatted != ""} { set state(afterspace) [expr {[string index $formatted end] == " "}] } ::richtext::render_message $cw $formatted $tag -nonewline if {$formatted != ""} { set state(lastnl) 0 } } # messy set state(lastnl) 0 if {[$cw get "end - 2c"] == "\n"} { incr state(lastnl) set state(afterspace) 1 if {[$cw get "end - 3c"] == "\n"} { incr state(lastnl) } } if {$suffix == "\n\n"} { ::richtext::render_message $cw \ [string repeat "\n" [expr {2 - $state(lastnl)}]] "" -nonewline } elseif {$suffix == "\n"} { ::richtext::render_message $cw \ [string repeat "\n" [expr {1 - $state(lastnl)}]] "" -nonewline } else { ::richtext::render_message $cw $suffix $tag -nonewline } set state(lastnl) 0 if {[$cw get "end - 2c"] == "\n"} { incr state(lastnl) set state(afterspace) 1 if {[$cw get "end - 3c"] == "\n"} { incr state(lastnl) } } pop } proc xhtml::push {} { variable state variable stack variable statevars foreach name $statevars { set stack($name) [linsert $stack($name) 0 $state($name)] } } proc xhtml::pop {} { variable state variable stack variable statevars foreach name $statevars { if {[info exists stack($name)]} { set stack($name) [lassign $stack($name) state($name)] } } } proc xhtml::parse_style {style} { variable state set optlist [split $style ";"] foreach opt $optlist { lassign [split $opt ":"] arg val set val [string trim $val] switch -- $arg { color { set state(color) $val } } } } proc xhtml::get_tags {chatw} { variable state set tags {} set color_tag tag_color_$state(color) if {![catch {$chatw tag configure $color_tag -foreground $state(color)}]} { lappend tags $color_tag } set indent_tag tag_indent_$state(lmargin1)_$state(lmargin2) $chatw tag configure $indent_tag \ -lmargin1 $state(lmargin1) -lmargin2 $state(lmargin2) lappend tags $indent_tag if {$state(weight)} { set fweight bold if {$state(slant)} { set fslant i set fnt $::ChatBoldItalicFont } else { set fslant r set fnt $::ChatBoldFont } } else { set fweight normal if {$state(slant)} { set fslant i set fnt $::ChatItalicFont } else { set fslant r set fnt $::ChatFont } } # TODO: use different sizes set fsize $state(size) set font_tag tag_font_${fsize}_${fslant}_${fweight} $chatw tag configure $font_tag -font $fnt lappend tags $font_tag $chatw tag lower $font_tag xhtml_symb return $tags } proc xhtml::get_url_tag {chatw url} { variable urlid set tag xhtmlurl[incr urlid] set urlfg [option get $chatw urlforeground Text] set urlactfg [option get $chatw urlactiveforeground Text] $chatw tag configure $tag -foreground $urlfg -underline 1 $chatw tag bind $tag <1> [list browseurl [double% $url]] $chatw tag bind $tag \ [list ::richtext::highlighttext %W [double% $tag] [double% $urlactfg] hand2] $chatw tag bind $tag \ [list ::richtext::highlighttext %W [double% $tag] [double% $urlfg] xterm] $chatw tag raise $tag return $tag } proc xhtml::setup_xhtml_tags {chatid type} { set cw [::chat::chat_win $chatid] $cw tag configure xhtml_symb -font $::ChatFont $cw tag raise xhtml_symb } hook::add open_chat_post_hook [namespace current]::xhtml::setup_xhtml_tags # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/empty_body.tcl000064400000000000000000000012211477701321300173240ustar00nobodynobody# empty_body.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin # which prevents putting messages with empty body to chatlog windows # and prevents messages with empty body to be sent using chat # input windows. proc check_send_empty_body {chatid user body type} { if {$body eq ""} { return stop } } hook::add chat_send_message_hook [namespace current]::check_send_empty_body 10 proc check_draw_empty_body {chatid from type body x} { if {$body eq ""} { return stop } } hook::add draw_message_hook [namespace current]::check_draw_empty_body 2 # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/events.tcl000064400000000000000000000205321477701321300164630ustar00nobodynobody# events.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin # which implements Message Events (XEP-0022) protocol. namespace eval events { custom::defgroup Events \ [::msgcat::mc "Chat message events plugin options."] \ -group Chat custom::defvar options(enable) 1 \ [::msgcat::mc "Enable sending chat message events."] \ -type boolean -group Events disco::register_feature $::NS(event) } proc events::is_reply_allowed {xlib jid} { variable options if {!$options(enable)} { return 0 } if {[get_jid_status $xlib $jid] == "unavailable"} { return 0 } set chatid [chat::chatid $xlib [::xmpp::jid::stripResource $jid]] if {[chat::is_groupchat $chatid]} { return 1 } return [roster::is_trusted $xlib $jid] } proc events::process_message \ {xlib from id type is_subject subject body err thread priority xs} { set chatid [chat::chatid $xlib $from] foreach x $xs { ::xmpp::xml::split $x tag xmlns attrs cdata subels switch -- $xmlns \ $::NS(event) { return [process_x_event 0 $chatid $from $type $body $x] } } } hook::add process_message_hook [namespace current]::events::process_message proc events::process_x {chatid from type body xs} { variable chats variable options if {$type == "chat"} { foreach x $xs { ::xmpp::xml::split $x tag xmlns attrs cdata subels switch -- $xmlns \ $::NS(event) { return [process_x_event 1 $chatid $from $type $body $x] } } } } hook::add draw_message_hook [namespace current]::events::process_x 6 proc events::process_x_event {check_request chatid from type body x} { variable options variable events set xlib [chat::get_xlib $chatid] set jid [chat::get_jid $chatid] set cw [chat::winid $chatid] ::xmpp::xml::split $x tag xmlns attrs cdata subels set offline 0 set delivered 0 set displayed 0 set composing 0 set id 0 foreach subel $subels { ::xmpp::xml::split $subel stag sxmlns sattrs scdata ssubels switch -- $stag { offline {set offline 1} delivered {set delivered 1} displayed {set displayed 1} composing {set composing 1} id {set id 1} } } if {$id && !$check_request} { set status "" if {$offline} {set status offline} if {$delivered} {set status delivered} if {$displayed} {set status displayed} if {$composing} {set status composing} change_status $chatid $status if {$body != ""} { # due to some buggy clients (e.g. Yahoo-t), which send # with real messages return } else { return -code break } } elseif {!$id && $check_request} { clear_status $chatid set events(displayed,$chatid) $displayed set events(composing,$chatid) $composing if {![is_reply_allowed $xlib $jid]} return lappend eventtags [::xmpp::xml::create id \ -cdata $::chat::chats(id,$chatid)] if {$delivered} { lappend eventtags [::xmpp::xml::create delivered] } if {$displayed} { if {$::usetabbar} { set page [string range [win_id tab $cw] 1 end] if {[.nb raise] == $page} { lappend eventtags [::xmpp::xml::create displayed] set events(displayed,$chatid) 0 } } else { lappend eventtags [::xmpp::xml::create displayed] set events(displayed,$chatid) 0 } } if {[llength $eventtags] > 1} { lappend xlist [::xmpp::xml::create x \ -xmlns $::NS(event) \ -subelements $eventtags] ::xmpp::sendMessage $xlib $from -xlist $xlist } } return } proc events::change_status {chatid status} { variable event_afterid if {[info exists event_afterid($chatid)]} { after cancel $event_afterid($chatid) } set cw [chat::winid $chatid] set jid [chat::get_jid $chatid] set text "" set stext "" switch -- $status { offline { set text [::msgcat::mc "Message stored on the server"] set stext [::msgcat::mc "Message stored on %s's server" \ $jid] } delivered { set text [::msgcat::mc "Message delivered"] set stext [::msgcat::mc "Message delivered to %s" $jid] } displayed { set text [::msgcat::mc "Message displayed"] set stext [::msgcat::mc "Message displayed to %s" $jid] } composing { set text [::msgcat::mc "Composing a reply"] set stext [::msgcat::mc "%s is composing a reply" $jid] } } if {$stext != "" && $::usetabbar} {set_status $stext} if {![winfo exists $cw]} return $cw.status.event configure -text $text set event_afterid($chatid) \ [after 10000 [list [namespace current]::clear_status $chatid]] } proc events::clear_status {chatid} { set cw [chat::winid $chatid] if {![winfo exists $cw]} return $cw.status.event configure -text "" } proc events::send_event_on_raise {cw chatid} { variable options variable events if {![chat::is_chat $chatid]} return if {![info exists events(displayed,$chatid)] || \ !$events(displayed,$chatid)} return set xlib [chat::get_xlib $chatid] set jid [chat::get_jid $chatid] set events(displayed,$chatid) 0 if {![is_reply_allowed $xlib $jid]} return lappend eventtags [::xmpp::xml::create id \ -cdata $::chat::chats(id,$chatid)] lappend eventtags [::xmpp::xml::create displayed] lappend xlist [::xmpp::xml::create x \ -xmlns $::NS(event) \ -subelements $eventtags] ::xmpp::sendMessage $xlib $jid -xlist $xlist } hook::add raise_chat_tab_hook [namespace current]::events::send_event_on_raise proc events::event_composing {iw sym} { variable options variable events if {$sym == ""} return set cw [join [lrange [split $iw .] 0 end-1] .] set chatid [chat::winid_to_chatid $cw] if {![chat::is_chat $chatid]} return if {![info exists events(composing,$chatid)] || \ !$events(composing,$chatid)} return set xlib [chat::get_xlib $chatid] set jid [chat::get_jid $chatid] set events(composing,$chatid) 0 if {![is_reply_allowed $xlib $jid]} return lappend eventtags [::xmpp::xml::create id \ -cdata $::chat::chats(id,$chatid)] lappend eventtags [::xmpp::xml::create composing] lappend xlist [::xmpp::xml::create x \ -xmlns $::NS(event) \ -subelements $eventtags] ::xmpp::sendMessage $xlib $jid -xlist $xlist } proc events::setup_ui {chatid type} { variable events if {![chat::is_chat $chatid]} return set cw [chat::winid $chatid] set l $cw.status.event if {![winfo exists $l]} { Label $l pack $l -side left } } hook::add text_on_keypress_hook [namespace current]::events::event_composing hook::add open_chat_post_hook [namespace current]::events::setup_ui proc events::clear_status_on_send {chatid user body type} { if {![chat::is_chat $chatid]} return clear_status $chatid } hook::add chat_send_message_hook \ [namespace current]::events::clear_status_on_send proc events::make_xlist {varname chatid user id body type} { variable options upvar 2 $varname var if {$type != "chat"} return set xlib [chat::get_xlib $chatid] set jid [chat::get_jid $chatid] if {![is_reply_allowed $xlib $jid]} return lappend events [::xmpp::xml::create offline] lappend events [::xmpp::xml::create delivered] lappend events [::xmpp::xml::create displayed] lappend events [::xmpp::xml::create composing] lappend var [::xmpp::xml::create x \ -xmlns $::NS(event) \ -subelements $events] return } hook::add chat_send_message_xlist_hook [namespace current]::events::make_xlist # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/exec_command.tcl000064400000000000000000000020731477701321300176010ustar00nobodynobody# exec_command.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin # which implements /exec command. It executes the typed command # and inserts its output into the same chat input window. After # that you may review and send it to the recipient. proc handle_exec_command {chatid user body type} { if {[string equal -length 6 $body "/exec "]} { set iw [chat::input_win $chatid] set command [string range $body 6 end] set res [catch {set output [eval exec $command]} errMsg] if {$res} { set msg $errMsg } else { set msg $output } after idle [list $iw insert end "\$ $command\n" {} $msg] return stop } } hook::add chat_send_message_hook [namespace current]::handle_exec_command 15 proc exec_command_comps {chatid compsvar wordstart line} { upvar 0 $compsvar comps if {!$wordstart} { lappend comps {/exec } } } hook::add generate_completions_hook [namespace current]::exec_command_comps # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/histool.tcl000064400000000000000000000511551477701321300166450ustar00nobodynobody# histool.tcl -- # # History tool -- allows browsing and searching through Tkabber chat logs. option add *ChatHistory.geometry [winfo pixels . 18c]x[winfo pixels . 15c] widgetDefault option add *ChatHistory.oddBackground "" widgetDefault option add *ChatHistory.evenBackground "" widgetDefault option add *ChatHistory.bodyForeground "" widgetDefault if {$::darktheme} { option add *ChatHistory.headerForeground cornflowerblue widgetDefault option add *ChatHistory.warningForeground coral3 widgetDefault } else { option add *ChatHistory.headerForeground dodgerblue4 widgetDefault option add *ChatHistory.warningForeground firebrick widgetDefault } event add <> event add <> namespace eval histool { hook::add finload_hook [namespace current]::on_init } proc histool::on_init {} { set m [.mainframe getmenu services] set idx [$m index [::msgcat::mc "Service Discovery"]] $m insert [expr {$idx + 2}] command \ -label [::msgcat::mc "Chats history"] \ -command [namespace current]::browse } proc histool::browse args { if {[is_unsupported]} { NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "Unsupported log dir format"] return } set w .histool if {[winfo exists $w]} { focus -force $w return } browser_create $w } proc histool::browser_create {w} { variable loghier [get_log_hier] add_win $w \ -title [::msgcat::mc "Chats History"] \ -tabtitle [::msgcat::mc "Chats history"] \ -class ChatHistory \ -raise 1 set nb [Notebook $w.nb] bind $nb +[list [namespace current]::browser_cleanup] set p [$nb insert end jidlist \ -text [::msgcat::mc "JID list"] \ -raisecmd [list [namespace current]::jidlist_raise $nb]] jidlist_create $p set p [$nb insert end ltree \ -text [::msgcat::mc "Logs"] \ -raisecmd [list [namespace current]::ltree_raise $nb]] ltree_create $p set p [$nb insert end ftsearch \ -text [::msgcat::mc "Full-text search"] \ -raisecmd [list [namespace current]::ftsearch_raise $nb]] ftsearch_create $p -mainwindow $w pack $nb -fill both -expand true $nb raise jidlist } proc histool::browser_cleanup {} { variable loghier unset loghier } ################################################################ proc histool::jidlist_create {w} { variable loghier grid columnconfigure $w 0 -weight 1 set sw [ScrolledWindow $w.sw] set lbox [Listbox $w.lbox -takefocus 1 -exportselection 0] $lbox selection clear 0 end $lbox selection set 0 focus $lbox # Workaround for a bug in listbox (can't get focus on mouse clicks): bind Listbox {+ if {[winfo exists %W]} {focus %W}} bind $lbox [namespace code { jidlist_open_log %W [%W nearest %y] }] bind $lbox [namespace code { jidlist_open_log %W [%W index active] }] $sw setwidget $lbox grid $sw -sticky news grid rowconfigure $w 0 -weight 1 foreach jid [sort_jids [get_jids $loghier] -order {server node resource}] { $lbox insert end $jid } # Setup searching: set sp [::plugins::search::spanel $w.spanel \ -defaultdirection up \ -searchcommand [list ::plugins::search::listbox::do_search $lbox] \ -closecommand [list [namespace current]::jidlist_spanel_close $lbox]] bind $lbox <> \ [double% [list [namespace current]::jidlist_spanel_open $w $sp]] } proc histool::jidlist_open_log {w idx args} { variable loghier set jid [$w get $idx] set subdirs [get_subdirs of $loghier for $jid] ::logger::show_log $jid -subdirs $subdirs } proc histool::jidlist_spanel_open {w sp} { grid $sp -sticky we } proc histool::jidlist_spanel_close {lbox w} { grid forget $w focus $lbox } ################################################################ proc histool::ltree_create {w} { variable loghier variable ::logger::d2m set sw [ScrolledWindow $w.sw] set t [MyTree $w.tree] $sw setwidget $t pack $sw -fill both -expand yes $t tag bind Text \ [list [namespace current]::ltree_for_node [double% $t] ltree_node_action] if {[winfo exists $t.c]} { # Keyboard bindings don't work in BWidget Tree's bindText; # HACK: Tree.c widget is what receives keyboard events: bind $t.c <> \ [list [namespace current]::ltree_for_node [double% $t] ltree_node_action] bind $t.c <> \ [list [namespace current]::ltree_for_node [double% $t] ltree_step_up] } else { $t tag bind Text <> \ [list [namespace current]::ltree_for_node [double% $t] ltree_node_action] $t tag bind Text <> \ [list [namespace current]::ltree_for_node [double% $t] ltree_step_up] } [namespace parent]::search::browser::setup_panel $w $sw $t set counter 0 foreach LA [lsort -index 0 $loghier] { lassign $LA year months $t insert {} end -id .$year -text $year -tags {Text} foreach LB [lsort -index 0 $months] { lassign $LB month jids $t insert .$year end -id .$year.$month -text $d2m($month) -tags {Text} foreach jid [sort_jids $jids -order {server node resource}] { $t insert .$year.$month end -id [incr counter] -text $jid -tags {Text} } } } } proc histool::ltree_for_node {t script} { set node [lindex [$t selection] 0] if {[string equal $node ""]} return eval $script $t $node } proc histool::ltree_node_action {t n} { variable loghier if {[tree_node_is_leaf $t $n]} { variable ::logger::m2d set mn [$t parent $n] set yn [$t parent $mn] set year [$t item $yn -text] set month $m2d([$t item $mn -text]) set jid [$t item $n -text] ::logger::show_log $jid -when $year-$month \ -subdirs [get_subdirs of $loghier for $jid] } elseif {[winfo exists $t.c]} { $t item $n -open [expr {![$t item $n -open]}] $t selection set [list $n] } } proc histool::tree_node_is_leaf {t n} { string equal [lindex [$t children $n] 0] "" } proc histool::ltree_step_up {t n} { set p [$t parent $n] if {[string equal $p {}]} return $t item $p -open [expr {![$t item $p -open]}] $t selection set [list $p] catch {$t focus $n} } ################################################################ proc histool::ftsearch_create {w args} { variable loghier variable ftsearch grid columnconfigure $w 0 -weight 1 set sp $w.spanel ::plugins::search::spanel $sp \ -allowclose no \ -twoway no \ -searchcommand [namespace current]::ftsearch_do_search \ -stopcommand [namespace current]::ftsearch_cancel_search grid $sp -sticky we set sw [ScrolledWindow $w.sw] set r [Text $w.results -cursor "" -state disabled] $sw setwidget $r grid $sw -sticky news grid rowconfigure $w 1 -weight 1 set f [frame $w.cf -class Chat] $r tag configure they -foreground [option get $f theyforeground Chat] $r tag configure me -foreground [option get $f meforeground Chat] $r tag configure server_lab \ -foreground [option get $f serverlabelforeground Chat] $r tag configure server \ -foreground [option get $f serverforeground Chat] destroy $f bind [Wrapped $r] [namespace code { ftsearch_open_log %W %x %y break }] set ix [lsearch $args -mainwindow] if {$ix >= 0} { set mw [lindex $args [incr ix]] if {$mw != ""} { set val [option get $mw oddBackground ChatHistory] if {$val != ""} { $r tag configure ODD -background $val } set val [option get $mw evenBackground ChatHistory] if {$val != ""} { $r tag configure EVEN -background $val } set val [option get $mw headerForeground ChatHistory] if {$val != ""} { $r tag configure HEADER -foreground $val } set val [option get $mw bodyForeground ChatHistory] if {$val != ""} { $r tag configure BODY -background $val } set val [option get $mw warningForeground ChatHistory] if {$val != ""} { $r tag configure WARNING -foreground $val } } } set ftsearch(last) "" set ftsearch(results) $r set ftsearch(bg) EVEN bind $w +[list [namespace current]::ftsearch_cleanup] # Set search panel up: # TODO remove when fixed elsewhere. # See also [ftsearch_spanel_close] $r mark set sel_start end $r mark set sel_end 1.0 set asp [::plugins::search::spanel $w.auxspanel \ -defaultdirection up \ -searchcommand [list ::plugins::search::do_text_search $r] \ -closecommand [list [namespace current]::ftsearch_spanel_close $r $sp.sentry]] bind $sp.sentry <> \ [list [namespace current]::ftsearch_spanel_open [double% $w] [double% $asp]] } # Schedules an execution of a script produced by concatenating # the words of $args using the # [after idle [after 0 [list ...]]] # concept presented at http://mini.net/tcl/1526 # The idea is that some parts of Tk wait for all idle event # handlers to complete. So, when executes, our idle event handler # installed in [schedule] installs timed event handler that # will be executed ASAP, and since it's not an idle event, it # allows the event queue to be in a state free of scheduled # idle events (thus allowing Tk to do its job, keeping GUI alive). proc histool::schedule args { after idle [list after 0 $args] } # Must be used as the (almost) first command inside any procs # scheduled as [after ...] callbacks installed in the course # of performing full-text search. proc histool::ftsearch_can_proceed {} { variable ftsearch_terminate if {$ftsearch_terminate} { unset ftsearch_terminate return false } else { return true } } # This proc builds a list of log files to grep and then starts # an asynchronous searching through them proc histool::ftsearch_do_search {what dir args} { variable loghier variable ftsearch variable ftsearch_terminate false # Returning false means we refuse to start searching: if {$what == ""} { return 0 } if {[string equal $ftsearch(last) $what]} { return 0 } set ftsearch(now) $what set ftsearch(found) 0 set r $ftsearch(results) $r configure -state normal $r delete 1.0 end $r configure -state normal set slist {} foreach LA [lsort -index 0 $loghier] { lassign $LA year months foreach LB [lsort -index 0 $months] { lassign $LB month jids foreach jid $jids { lappend slist [list $year $month $jid] } } } set ix [lsearch $args -completioncommand] if {$ix >= 0} { set ftsearch(compcmd) [lindex $args [incr ix]] } else { set ftsearch(compcmd) "" } # will return almost immediately: ftsearch_grep_next of $slist for $what return 1 ;# signalize we've started the search process } # Tries to open the last file in the $slist and schedules # the execution of a handler that will read that file # looking for $what proc histool::ftsearch_grep_next {"of" slist "for" what args} { if {![ftsearch_can_proceed]} return variable ftsearch variable ::logger::options # Some files are unreadable due to some reason, so we loop # over the list of them until opening succeeds or the list # is exhausted: while true { lassign [lindex $slist end] year month jid set fname [file join $options(logdir) \ $year $month [::logger::jid_to_filename $jid]] if {[catch {open $fname} chan]} { set r $ftsearch(results) $r configure -state normal $r insert end [::msgcat::mc "WARNING: %s\n" $chan] WARNING $r configure -state disabled set slist [lrange $slist 0 end-1] if {[llength $slist] > 0} { continue } else { ftsearch_complete_search for $what return } } else break } fconfigure $chan -encoding utf-8 schedule \ [namespace current]::ftsearch_grep_msg of $slist for $what from $chan } # Reads one line from a log file opened as $chan, parses it, looks # for $what in the relevant parts of the aqcuired message, renders # it if it match. # Searching conditions are checked: this proc is either re-schedules # its execution (for the next line of the log file) or schedules the # reading of the next log file or completes the searching process. proc histool::ftsearch_grep_msg {"of" slist "for" what "from" chan} { if {![ftsearch_can_proceed]} return variable ftsearch set line [gets $chan] if {![eof $chan]} { set msg [::logger::log_to_str $line] if {![catch {array set mparts $msg}]} { foreach part {nick body} { if {[info exists mparts($part)] && \ [::plugins::search::match $what $mparts($part)]} { lassign [lindex $slist end] year month jid set r $ftsearch(results) $r configure -state normal ftsearch_render_msg $r $year $month $jid $msg $r configure -state disabled set ftsearch(found) 1 break } } } schedule \ [namespace current]::ftsearch_grep_msg of $slist for $what from $chan } else { close $chan set rem [lrange $slist 0 end-1] if {[llength $rem] > 0} { schedule \ [namespace current]::ftsearch_grep_next of $rem for $what } else { ftsearch_complete_search for $what } } } proc histool::ftsearch_render_msg {t year month jid msg} { variable ftsearch set tags [list $ftsearch(bg) YEAR-$year MONTH-$month JID-$jid] set mynick [get_group_nick "" $jid] if {[catch {array set mparts $msg}]} return set start [$t index {end - 1 char}] set header $jid if {[info exists mparts(timestamp)] && $mparts(timestamp) != ""} { set ts [::logger::formatxmppts $mparts(timestamp)] append header " \[$ts\]" lappend tags TS-$mparts(timestamp) } if {[info exists mparts(jid)] && $mparts(jid) == ""} { append header " " [::msgcat::mc "Client message"] } elseif {[info exists mparts(nick)]} { if {$mparts(nick) == ""} { append header " " [::msgcat::mc "Server message"] } else { append header " " [::msgcat::mc "From:"] " " $mparts(nick) } } $t insert end $header\n HEADER $t insert end $mparts(body)\n BODY set end [$t index {end - 1 char}] foreach tag $tags { $t tag add $tag $start $end } if {[string equal $ftsearch(bg) EVEN]} { set ftsearch(bg) ODD } else { set ftsearch(bg) EVEN } } proc histool::ftsearch_complete_search {"for" what} { variable ftsearch set ftsearch(now) "" set ftsearch(last) $what if {$ftsearch(compcmd) != ""} { eval $ftsearch(compcmd) $ftsearch(found) } } proc histool::ftsearch_cancel_search {args} { variable ftsearch variable ftsearch_terminate true set ftsearch(last) $ftsearch(now) set ftsearch(now) "" if {$ftsearch(compcmd) != ""} { eval $ftsearch(compcmd) $ftsearch(found) } } proc histool::ftsearch_open_log {t x y} { variable loghier set year "" set month "" set ts "" set jid "" foreach tag [$t tag names @$x,$y] { if {[string match YEAR-* $tag]} { set year [string range $tag 5 end] } if {[string match MONTH-* $tag]} { set month [string range $tag 6 end] } if {[string match TS-* $tag]} { set ts [string range $tag 3 end] } if {[string match JID-* $tag]} { set jid [string range $tag 4 end] } } if {$jid == ""} return set cmd [list ::logger::show_log $jid] if {$year != "" && $month != ""} { lappend cmd -when $year-$month if {$ts != ""} { lappend cmd -timestamp $ts } } lappend cmd -subdirs [get_subdirs of $loghier for $jid] eval $cmd } proc histool::ftsearch_spanel_open {w sp} { grid $sp -sticky we } proc histool::ftsearch_spanel_close {t sentry w} { # TODO remove when fixed elsewhere. # See also [ftsearch_create] $t tag remove search_highlight 0.0 end $t mark set sel_start end $t mark set sel_end 0.0 grid forget $w focus $sentry } # Cleans up relevant variables when the browser form # is destroyed. "ftsearch_terminate" variable is # unset in the [after ...] event handler, if such # handler is installed. proc histool::ftsearch_cleanup {} { variable ftsearch array unset ftsearch variable ftsearch_terminate if {[info exists ftsearch_terminate]} { set ftsearch_terminate true } } ################################################################ proc histool::jidlist_raise {nb} { set lbox [$nb getframe jidlist].lbox if {[winfo exists $lbox]} { focus $lbox } } proc histool::ltree_raise {nb} { set tree [$nb getframe ltree].tree if {[winfo exists $tree]} { focus $tree } } proc histool::ftsearch_raise {nb} { } # Sorts a list of JIDs based on their parts: node, server and resource. # The default comparison order is: server, node, resource. # Optional argument/value pairs are accepted: # -order LIST -- override the default comparison order. proc histool::sort_jids {jids args} { set order {server node resource} foreach {opt val} $args { switch -- $opt { -order { set order $val } default { error "invalid option: $opt" } } } set norder {} foreach part {node server resource} { lappend norder [lsearch $order $part] } set items {} foreach jid $jids { ::xmpp::jid::split $jid node server resource set parts [list $node $server $resource] set ordered [list \ [lindex $parts [lindex $norder 0]] \ [lindex $parts [lindex $norder 1]] \ [lindex $parts [lindex $norder 2]] \ ] set pat [join $ordered \u0000] lappend items [list $pat $jid] } set sorted {} foreach item [lsort -index 0 -dictionary $items] { lappend sorted [lindex $item 1] } set sorted } proc histool::is_unsupported {} { variable ::logger::options catch { set fd [open [file join $options(logdir) version]] if {![package vsatisfies [gets $fd] 1.0]} { close $fd error "unsupported log dir structure format" } close $fd } } proc histool::get_log_hier {} { variable ::logger::options set LA {} foreach dyear [glob -nocomplain -type d -directory $options(logdir) *] { set year [file tail $dyear] if {![regexp {^\d{4}$} $year]} continue set LB {} foreach dmonth [glob -nocomplain -type d -directory $dyear *] { set month [file tail $dmonth] if {![regexp {^0[1-9]$|^1[0-2]$} $month]} continue set LC {} foreach file [glob -nocomplain -type f -directory $dmonth *] { lappend LC [::logger::filename_to_jid [file tail $file]] } lappend LB [list $month $LC] } lappend LA [list $year $LB] } set LA } proc histool::get_jids {loghier} { foreach LA $loghier { foreach LB [lindex $LA 1] { foreach jid [lindex $LB 1] { set jids($jid) "" } } } array names jids } # From the log hierarchy given by $loghier builds a list of # YEAR-MONTH entries producing the same structure that # is generated by [::logger::get_subdirs]. # See plugins/chat/logger.tcl proc histool::get_subdirs {"of" loghier "for" jid} { set subdirs {} foreach LA $loghier { lassign $LA year months foreach LB $months { lassign $LB month jids if {$jid in $jids} { lappend subdirs $year-$month } } } set subdirs } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/history.tcl000064400000000000000000000036311477701321300166610ustar00nobodynobody# history.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin # which implements chat input window history. It also binds # and keys to retrieve the previous # and the next history item. proc history_move {chatid shift} { variable history set newpos [expr $history(pos,$chatid) + $shift] if {$newpos < 0} { set newpos 0 } set len [expr [llength $history(stack,$chatid)] - 1] if {$newpos > $len} { set newpos $len } set iw [chat::input_win $chatid] set body [$iw get 1.0 "end -1 chars"] if {$history(pos,$chatid) == 0} { set history(stack,$chatid) \ [lreplace $history(stack,$chatid) 0 0 $body] } set history(pos,$chatid) $newpos set newbody [lindex $history(stack,$chatid) $newpos] $iw delete 1.0 end after idle [list $iw insert end $newbody] } #debugmsg plugins "HISTORY: [namespace which history_move]" #namespace export history_move proc add_body_to_history {chatid user body type} { variable history set history(stack,$chatid) [linsert $history(stack,$chatid) 1 $body] set history(pos,$chatid) 0 } hook::add chat_send_message_hook [namespace current]::add_body_to_history 12 proc setup_history_bindings {chatid type} { variable history set iw [chat::input_win $chatid] bind $iw \ [list [namespace current]::history_move [double% $chatid] 1] bind $iw \ [list [namespace current]::history_move [double% $chatid] 1] bind $iw \ [list [namespace current]::history_move [double% $chatid] -1] bind $iw \ [list [namespace current]::history_move [double% $chatid] -1] set history(stack,$chatid) [list {}] set history(pos,$chatid) 0 } hook::add open_chat_post_hook [namespace current]::setup_history_bindings # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/info_commands.tcl000064400000000000000000000337411477701321300200010ustar00nobodynobody# info_commands.tcl -- # # This file is a part of the Tkabber XMPP client. It implements # commands /time, /last, /vcard, /version, /ping in chat and groupchat # windows. package require xmpp::ping namespace eval chatinfo { custom::defgroup VCard \ [::msgcat::mc "vCard display options in chat windows."] \ -group Chat variable vcard_defs \ [list fn [::msgcat::mc "Full name"] 1 \ family [::msgcat::mc "Family name"] 1 \ name [::msgcat::mc "First name"] 1 \ middle [::msgcat::mc "Middle name"] 0 \ prefix [::msgcat::mc "Prefix"] 0 \ suffix [::msgcat::mc "Suffix"] 0 \ nickname [::msgcat::mc "Nickname"] 1 \ email [::msgcat::mc "E-mail"] 1 \ url [::msgcat::mc "Web site"] 1 \ jabberid [::msgcat::mc "JID"] 1 \ uid [::msgcat::mc "UID"] 1 \ tel_home [::msgcat::mc "Phone home"] 1 \ tel_work [::msgcat::mc "Phone work"] 1 \ tel_voice [::msgcat::mc "Phone voice"] 1 \ tel_fax [::msgcat::mc "Phone fax"] 0 \ tel_pager [::msgcat::mc "Phone pager"] 0 \ tel_msg [::msgcat::mc "Phone message recorder"] 0 \ tel_cell [::msgcat::mc "Phone cell"] 1 \ tel_video [::msgcat::mc "Phone video"] 0 \ tel_bbs [::msgcat::mc "Phone BBS"] 0 \ tel_modem [::msgcat::mc "Phone modem"] 0 \ tel_isdn [::msgcat::mc "Phone ISDN"] 0 \ tel_pcs [::msgcat::mc "Phone PCS"] 0 \ tel_pref [::msgcat::mc "Phone preferred"] 1 \ address [::msgcat::mc "Address"] 1 \ address2 [::msgcat::mc "Address 2"] 0 \ city [::msgcat::mc "City"] 1 \ state [string trim [::msgcat::mc "State "]] 1 \ pcode [::msgcat::mc "Postal code"] 0 \ country [::msgcat::mc "Country"] 1 \ geo_lat [::msgcat::mc "Latitude"] 0 \ geo_lon [::msgcat::mc "Longitude"] 0 \ orgname [::msgcat::mc "Organization name"] 1 \ orgunit [::msgcat::mc "Organization unit"] 1 \ title [::msgcat::mc "Title"] 1 \ role [::msgcat::mc "Role"] 1 \ bday [::msgcat::mc "Birthday"] 1 \ desc [string trim [::msgcat::mc "About "]] 0] variable opt variable name variable default foreach {opt name default} $vcard_defs { custom::defvar options($opt) $default \ [::msgcat::mc "Display %s in chat window when using /vcard command." \ $name] \ -type boolean -group VCard } } ############################################################################## proc chatinfo::handle_info_commands {chatid user body type} { if {[string equal -length 6 "$body " "/time "]} { set name [string range $body 6 end] set command time } elseif {[string equal -length 6 "$body " "/last "]} { set name [string range $body 6 end] set command last } elseif {[string equal -length 7 "$body " "/vcard "]} { set name [string range $body 7 end] set command vcard } elseif {[string equal -length 9 "$body " "/version "]} { set name [string range $body 9 end] set command version } elseif {[string equal -length 6 "$body " "/ping "]} { set name [string range $body 6 end] set command ping } else { return } set xlib [chat::get_xlib $chatid] set jid [chat::get_jid $chatid] set jids {} set vcard_jids {} if {$type eq "groupchat"} { if {$name eq ""} { set jids [list $jid] } else { set jids [list "$jid/$name"] } set vcard_jids $jids } else { if {$name eq ""} { set bare_jid [::xmpp::jid::stripResource $jid] set full_jids [::get_jids_of_user $xlib $bare_jid] if {[lsearch $full_jids $jid] >= 0} { set jids [list $jid] } elseif {[llength $full_jids] == 0} { set jids [list $jid] } else { set jids $full_jids } set vcard_jids [list $bare_jid] } } if {[llength $jids] == 0} { lassign [roster_lookup $xlib $name] jids vcard_jids if {[llength $jids] == 0} { set jids [list $name] } } if {[llength $vcard_jids] == 0} { set vcard_jids $jids } if {$command eq "vcard"} { foreach jid $vcard_jids { request_vcard $xlib $chatid $jid } } elseif {$command eq "ping"} { foreach jid $jids { request_ping $xlib $chatid $jid } } else { foreach jid $jids { request_iq $command $xlib $chatid $jid } } return stop } hook::add chat_send_message_hook \ [namespace current]::chatinfo::handle_info_commands 15 ############################################################################## proc chatinfo::roster_lookup {xlib name} { set ret {} set ret1 {} foreach jid [roster::get_jids $xlib] { set rname [roster::get_label $xlib $jid] if {$rname eq $name} { set bare_jid [::xmpp::jid::stripResource $jid] set full_jids [::get_jids_of_user $xlib $bare_jid] if {[llength $full_jids] > 0} { set ret [concat $ret $full_jids] } else { lappend ret $bare_jid } lappend ret1 $bare_jid } } return [list [lsort -unique $ret] [lsort -unique $ret1]] } ############################################################################## proc chatinfo::info_commands_comps {chatid compsvar wordstart line} { upvar 0 $compsvar comps set commands [list "/time " "/last " "/vcard " "/version " "/ping "] if {!$wordstart} { set comps [concat $comps $commands] } elseif {![chat::is_groupchat $chatid]} { set q 0 foreach cmd $commands { if {[string equal -length [string length $cmd] $cmd $line]} { set q 1 break } } if {!$q} return set xlib [chat::get_xlib $chatid] set names {} foreach jid [roster::get_jids $xlib] { lappend names "[roster::get_label $xlib $jid] " } set comps [concat $comps [lsort -unique $names]] } } hook::add generate_completions_hook \ [namespace current]::chatinfo::info_commands_comps ############################################################################## proc chatinfo::request_iq {type xlib chatid jid} { ::xmpp::sendIQ $xlib get \ -query [::xmpp::xml::create query \ -xmlns jabber:iq:$type] \ -to $jid \ -command [list [namespace current]::parse_info_iq$type $chatid $jid] } ############################################################################## proc chatinfo::request_vcard {xlib chatid jid} { ::xmpp::sendIQ $xlib get \ -query [::xmpp::xml::create vCard \ -xmlns vcard-temp] \ -to $jid \ -command [list [namespace current]::parse_info_vcard $chatid $jid] } ############################################################################## proc chatinfo::get_secs {} { return [expr {[clock milliseconds]/1000.0}] } proc chatinfo::request_ping {xlib chatid jid} { package require xmpp::ping set secs [get_secs] ::xmpp::ping::ping $xlib \ -to $jid \ -command [list [namespace current]::parse_info_ping $chatid $jid $secs] } ############################################################################## proc chatinfo::whois {chatid jid} { set xlib [chat::get_xlib $chatid] set real_jid [muc::get_real_jid $xlib $jid] if {$real_jid != ""} { return " ($real_jid)" } else { return "" } } ############################################################################## proc chatinfo::parse_info_ping {chatid jid secs res child} { if {![winfo exists [chat::chat_win $chatid]]} { return } set rjid [whois $chatid $jid] if {$res != "ok"} { lassign [error_type_condition $child] type condition if {$res == "abort" || ($type == "cancel" && \ $condition != "feature-not-implemented")} { chat::add_message $chatid $jid error \ [::msgcat::mc "Pong from %s%s: %s" $jid $rjid \ [error_to_string $child]] {} return } } set csecs [get_secs] set psecs [expr {$csecs-$secs}] set message [::msgcat::mc "Pong from %s%s: %.2f seconds" $jid $rjid $psecs] chat::add_message $chatid $jid info $message {} } ############################################################################## proc chatinfo::parse_info_iqtime {chatid jid res child} { if {![winfo exists [chat::chat_win $chatid]]} { return } set rjid [whois $chatid $jid] if {$res ne "ok"} { chat::add_message $chatid $jid error \ [::msgcat::mc "time %s%s: %s" $jid $rjid \ [error_to_string $child]] {} return } ::xmpp::xml::split $child tag xmlns attrs cdata subels if {[string equal $xmlns jabber:iq:time]} { userinfo::parse_iqtime_item $jid $subels } set message [::msgcat::mc "time %s%s:" $jid $rjid] foreach {i j} [list time [::msgcat::mc "Time:"] \ tz [::msgcat::mc "Time Zone:"] \ utc [::msgcat::mc "UTC:"]] { if {[info exists ::userinfo::userinfo($i,$jid)] && \ $::userinfo::userinfo($i,$jid) ne ""} { append message "\n $j $::userinfo::userinfo($i,$jid)" } } chat::add_message $chatid $jid info $message {} } ############################################################################## proc chatinfo::parse_info_iqlast {chatid jid res child} { if {![winfo exists [chat::chat_win $chatid]]} { return } set rjid [whois $chatid $jid] if {$res ne "ok"} { chat::add_message $chatid $jid error \ [::msgcat::mc "last %s%s: %s" $jid $rjid [error_to_string $child]] {} return } ::xmpp::xml::split $child tag xmlns attrs cdata subels if {[string equal $xmlns jabber:iq:last]} { set ::userinfo::userinfo(lastseconds,$jid) \ [format_time [::xmpp::xml::getAttr $attrs seconds]] set ::userinfo::userinfo(lastdesc,$jid) $cdata } set message [::msgcat::mc "last %s%s:" $jid $rjid] foreach {i j} [list lastseconds [::msgcat::mc "Interval:"] \ lastdesc [::msgcat::mc "Description:"]] { if {[info exists ::userinfo::userinfo($i,$jid)] && \ $::userinfo::userinfo($i,$jid) ne ""} { append message "\n $j $::userinfo::userinfo($i,$jid)" } } chat::add_message $chatid $jid info $message {} } ############################################################################## proc chatinfo::parse_info_iqversion {chatid jid res child} { if {![winfo exists [chat::chat_win $chatid]]} { return } set rjid [whois $chatid $jid] if {$res ne "ok"} { chat::add_message $chatid $jid error \ [::msgcat::mc "version %s%s: %s" $jid $rjid [error_to_string $child]] {} return } ::xmpp::xml::split $child tag xmlns attrs cdata subels if {[string equal $xmlns jabber:iq:version]} { userinfo::parse_iqversion_item $jid $subels } set message [::msgcat::mc "version %s%s:" $jid $rjid] foreach {i j} [list clientname [::msgcat::mc "Client:"] \ clientversion [::msgcat::mc "Version:"] \ os [::msgcat::mc "OS:"]] { if {[info exists ::userinfo::userinfo($i,$jid)] && \ $::userinfo::userinfo($i,$jid) ne ""} { append message "\n $j $::userinfo::userinfo($i,$jid)" } } chat::add_message $chatid $jid info $message {} } ############################################################################## proc chatinfo::parse_info_vcard {chatid jid res child} { variable options variable vcard_defs if {![winfo exists [chat::chat_win $chatid]]} { return } set rjid [whois $chatid $jid] if {$res ne "ok"} { chat::add_message $chatid $jid error \ [::msgcat::mc "vcard %s%s: %s" $jid $rjid [error_to_string $child]] {} return } ::xmpp::xml::split $child tag xmlns attrs cdata subels foreach item $subels { userinfo::parse_vcard_item $jid $item } set message [::msgcat::mc "vcard %s%s:" $jid $rjid] foreach {def name ignore} $vcard_defs) { if {$options($def) && \ [info exists ::userinfo::userinfo($def,$jid)] && \ $::userinfo::userinfo($def,$jid) ne ""} { append message "\n $name: $::userinfo::userinfo($def,$jid)" } } chat::add_message $chatid $jid info $message {} } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/insert_nick.tcl000064400000000000000000000024311477701321300174650ustar00nobodynobody# insert_nick.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # allows user to insert someone's nickname into chat input window # by clicking the desired nickname either in the groupchat roster or # in the chatlog window. namespace eval insert_nick {} proc insert_nick::insert {chatid nick} { set ci [chat::input_win $chatid] if {[$ci compare insert == "1.0"]} { $ci insert insert \ $::plugins::completion::options(nlprefix)$nick$::plugins::completion::options(nlsuffix) } else { $ci insert insert \ $::plugins::completion::options(prefix)$nick$::plugins::completion::options(suffix) } } hook::add groupchat_roster_user_singleclick_hook \ [namespace current]::insert_nick::insert proc insert_nick::insert_from_window {chatid w x y} { set nick "" set cw [chat::chat_win $chatid] set tags [$cw tag names "@$x,$y"] if {[set idx [lsearch -glob $tags NICK-*]] >= 0} { set nick [string range [lindex $tags $idx] 5 end] } if {$nick == ""} return insert $chatid $nick focus -force [chat::input_win $chatid] return stop } hook::add chat_window_click_hook \ [namespace current]::insert_nick::insert_from_window # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/irc_commands.tcl000064400000000000000000000166321477701321300176230ustar00nobodynobody# irc_commands.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin # which implements /topic (or /subject), /nick, /invite, /join # /rejoin, /msg, and /part (or /leave) commands in chat or # groupchat windows. namespace eval irc {} proc irc::handle_irc_commands {chatid user body type} { set body [string trim $body] if {[string equal -length 7 $body "/topic "]} { set command subject set subject [string trim [string range $body 7 end]] } elseif {[string equal -length 9 $body "/subject "]} { set command subject set subject [string trim [string range $body 9 end]] } elseif {[string equal $body "/topic"] || \ [string equal $body "/subject"]} { set command show_subject } elseif {[string equal -length 6 $body "/nick "]} { set command nick set nick [string trim [string range $body 6 end]] } elseif {[string equal -length 8 $body "/invite "]} { set command invite set arg [string range $body 8 end] lassign [parse_body $arg "\n"] to reason } elseif {[string equal -length 6 $body "/join "]} { set command join set arg [string range $body 6 end] lassign [parse_body $arg " "] room password } elseif {[string equal $body "/join"]} { set command join set room "" set password "" } elseif {[string equal $body "/rejoin"]} { set command rejoin set password "" } elseif {[string equal -length 5 $body "/msg "]} { set command msg set arg [string range $body 5 end] lassign [parse_body $arg "\n"] nick body } elseif {[string equal $body "/nick"] || \ [string equal $body "/msg"] || \ [string equal $body "/invite"]} { return stop } elseif {[string equal -length 6 $body "/part "]} { set command leave set status [string trim [string range $body 6 end]] } elseif {[string equal -length 7 $body "/leave "]} { set command leave set status [string trim [string range $body 7 end]] } elseif {[string equal $body "/part"] || \ [string equal $body "/leave"]} { set command leave set status "" } else { return } set xlib [chat::get_xlib $chatid] set jid [chat::get_jid $chatid] switch -- $command { nick { if {$type ne "groupchat"} return muc::change_nick $chatid $nick debugmsg plugins "NICK: $nick" } subject { if {$type ne "groupchat"} return message::send_msg $xlib $jid -type groupchat -subject $subject debugmsg plugins "SUBJECT: $subject" } show_subject { chat::add_message $chatid $jid info \ "[::msgcat::mc Subject:] $::chat::chats(subject,$chatid)" {} } invite { if {$type eq "groupchat"} { muc::invite_muc $xlib $jid $to $reason } else { muc::invite_muc $xlib $to $jid $reason } debugmsg plugins "INVITE: $to $reason" } join { if {$type eq "groupchat"} { if {$room eq ""} { set room $jid } elseif {[::xmpp::jid::node $room] == ""} { set room [::xmpp::jid::jid $room [::xmpp::jid::server $jid]] } } set chatid [chat::chatid $xlib $room] if {[catch {get_our_groupchat_nick $chatid} nick]} { set nick [get_group_nick $xlib $room] } # HACK: TODO: remove usage of tokens. if {[chat::is_opened $chatid] && [info exists ::muc::tokens($chatid)]} { muc::test_connection $chatid \ -command [namespace code [list join_if_disconnected \ $xlib $room $nick $password]] } else { muc::leave_group $chatid "" muc::join_group $xlib $room $nick $password } debugmsg plugins "JOIN: $room $nick" } rejoin { if {$type ne "groupchat"} return if {[catch {get_our_groupchat_nick $chatid} nick]} { set nick [get_group_nick $xlib $jid] } muc::leave_group $chatid "" muc::join_group $xlib $jid $nick $password debugmsg plugins "REJOIN: $jid $nick" } msg { if {$type eq "groupchat" && $nick != "" && $body != ""} { chat::open_to_user $xlib $jid/$nick -message $body debugmsg plugins "MSG: $jid/$nick: $body" } else { chat::add_message $chatid $jid error \ "/msg to $nick failed" {} } } leave { set ::chat::chats(exit_status,$chatid) $status after idle [list ifacetk::destroy_win [chat::winid $chatid]] debugmsg plugins "LEAVE: $jid $status" } } return stop } hook::add chat_send_message_hook [namespace current]::irc::handle_irc_commands 50 proc irc::parse_body {line separator} { set ne [string first $separator $line] if {$ne < 0} { set nick $line set body "" } else { set nick [string range $line 0 [expr {$ne - 1}]] set body [string range $line [expr {$ne + [string length $separator]}] end] } return [list $nick [string trim $body]] } proc irc::irc_commands_comp {chatid compsvar wordstart line} { upvar 0 $compsvar comps if {!$wordstart} { lappend comps {/invite } lappend comps {/join } lappend comps {/leave } lappend comps {/msg } lappend comps {/nick } lappend comps {/part } lappend comps {/rejoin } lappend comps {/subject } lappend comps {/topic } } if {$wordstart && [string equal -length 8 $line "/invite "] && \ [string first "\n" $line] < 0} { set prefix $::plugins::completion::options(prefix) set suffix $::plugins::completion::options(suffix) set jidcomps {} set xlib [chat::get_xlib $chatid] if {[chat::is_groupchat $chatid]} { foreach jid [roster::get_jids $xlib] { if {[roster::itemconfig $xlib $jid -isuser]} { lappend jidcomps $prefix$jid$suffix } } } else { foreach chatid1 [lfilter chat::is_groupchat [chat::opened $xlib]] { set jid [chat::get_jid $chatid1] lappend jidcomps $prefix$jid$suffix } } set jidcomps [lsort -dictionary -unique $jidcomps] set comps $jidcomps debugmsg plugins "COMPLETION from roster: $comps" return stop } } hook::add generate_completions_hook [namespace current]::irc::irc_commands_comp proc irc::join_if_disconnected {xlib room nick password status} { set chatid [chat::chatid $xlib $room] debugmsg conference "TEXTJOIN: $xlib $room $status/[muc::status $chatid]" switch -glob -- $status/[muc::status $chatid] { connected/disconnected - disconnected/* { muc::leave_group $chatid "" muc::join_group $xlib $room $nick $password } default { chat::add_message $chatid $room info \ [::msgcat::mc "Already joined"] {} } } } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/log_on_open.tcl000064400000000000000000000107671477701321300174660ustar00nobodynobody# log_on_open.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # displays several previously received messages on opening a chat # window. The maximum number of messages and time interval for # messages too old to show are customizable. namespace eval log_on_open { custom::defvar options(enable_in_chats) 1 \ [::msgcat::mc "Show several most recently received messages in a\ newly opened chat window. They are taken from the\ logs, so you'll have to enable them for chats."] \ -type boolean -group Chat custom::defvar options(enable_in_groupchats) 0 \ [::msgcat::mc "Show several most recently received messages in a\ newly opened conference window. They are taken from\ the logs, so you'll have to enable them for\ groupchat."] \ -type boolean -group Chat custom::defvar options(max_messages) 20 \ [::msgcat::mc "Maximum number of log messages to show in newly\ opened chat window (if set to negative then the\ number is unlimited)."] \ -type integer -group Chat custom::defvar options(max_interval) 24 \ [::msgcat::mc "Maximum interval length in hours for which log\ messages should be shown in newly opened chat\ window (if set to negative then the interval is\ unlimited)."] \ -type integer -group Chat custom::defvar options(use_metacontacts) 0 \ [::msgcat::mc "If the chat window that is being opened belongs\ to a JID which corresponds to some metacontact\ in your roster then messages from all JIDs from\ that metacontact will show up in the window.\ This option requires enabling metacontacts in your\ roster."] \ -type boolean -group Chat } proc log_on_open::show {chatid type} { variable options if {$type ne "chat" && $type ne "groupchat"} return if {$type eq "chat" && !$options(enable_in_chats)} return if {$type eq "groupchat" && !$options(enable_in_groupchats)} return set xlib [chat::get_xlib $chatid] set jid [chat::get_jid $chatid] set bare_jid [::xmpp::jid::removeResource $jid] set gc [chat::is_groupchat [chat::chatid $xlib $bare_jid]] if {!$gc && (![::logger::logs_exist $jid] || \ [::xmpp::jid::equal $jid $bare_jid])} { set log_jids [list $bare_jid] if {$::ifacetk::roster::options(enable_metacontacts) && \ [llength [info procs ::plugins::metacontacts::*]] > 0 && \ $options(use_metacontacts)} { foreach tag [::plugins::metacontacts::get_all_tags $xlib] { set jids [::plugins::metacontacts::get_jids $xlib $tag] foreach j $jids { if {[::xmpp::jid::equal $j $bare_jid]} { set log_jids $jids break } } } } } else { set log_jids [list $jid] } set messages [::logger::get_last_messages $log_jids $type \ $options(max_messages) \ $options(max_interval)] foreach msg $messages { array unset tmp if {[catch {array set tmp $msg}]} continue set x {} if {[info exists tmp(timestamp)]} { set seconds [clock scan $tmp(timestamp) -gmt 1] lappend x [::xmpp::delay::create $seconds] } if {[info exists tmp(jid)]} { if {$tmp(jid) == ""} { # Synthesized message set from "" } elseif {(!$gc && [::xmpp::jid::removeResource $tmp(jid)] != $bare_jid) || \ $gc && $tmp(jid) != $jid} { set from $tmp(jid) } else { set from $jid } } else { set from "" } # Don't log this message. Request this by creating very special 'empty' # tag which can't be received from the peer. # TODO: Create more elegant mechanism lappend x [::xmpp::xml::create "" -xmlns tkabber:x:nolog] chat::add_message $chatid $from $type $tmp(body) $x } } hook::add open_chat_post_hook [namespace current]::log_on_open::show 100 # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/logger.tcl000064400000000000000000001032121477701321300164330ustar00nobodynobody# logger.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # provides chats and groupchats logging. namespace eval ::logger { variable options custom::defgroup Logging [::msgcat::mc "Logging options."] -group Chat custom::defvar options(logdir) [file join $::configdir logs] \ [::msgcat::mc "Directory to store logs."] \ -type string -group Logging custom::defvar options(log_chat) 1 \ [::msgcat::mc "Store private chats logs."] \ -type boolean -group Logging custom::defvar options(log_groupchat) 1 \ [::msgcat::mc "Store group chats logs."] \ -type boolean -group Logging variable version 1.0 if {![file exists $options(logdir)]} { file mkdir $options(logdir) # Storing version for possible future conversions variable fd [open [file join $options(logdir) version] w] puts $fd $version close $fd } variable m2d variable d2m array set m2d [list [::msgcat::mc "January"] 01 \ [::msgcat::mc "February"] 02 \ [::msgcat::mc "March"] 03 \ [::msgcat::mc "April"] 04 \ [::msgcat::mc "May"] 05 \ [::msgcat::mc "June"] 06 \ [::msgcat::mc "July"] 07 \ [::msgcat::mc "August"] 08 \ [::msgcat::mc "September"] 09 \ [::msgcat::mc "October"] 10 \ [::msgcat::mc "November"] 11 \ [::msgcat::mc "December"] 12] array set d2m [list 01 [::msgcat::mc "January"] \ 02 [::msgcat::mc "February"] \ 03 [::msgcat::mc "March"] \ 04 [::msgcat::mc "April"] \ 05 [::msgcat::mc "May"] \ 06 [::msgcat::mc "June"] \ 07 [::msgcat::mc "July"] \ 08 [::msgcat::mc "August"] \ 09 [::msgcat::mc "September"] \ 10 [::msgcat::mc "October"] \ 11 [::msgcat::mc "November"] \ 12 [::msgcat::mc "December"]] } ############################################################################# proc ::logger::add_menu_item {state category m xlib jid} { switch -- $category { roster { set rjid [roster::find_jid $xlib $jid] if {$rjid != ""} { set jid $rjid } } chat { set nas [::xmpp::jid::stripResource $jid] if {![chat::is_groupchat [chat::chatid $xlib $nas]]} { set jid $nas } } } $m add command -label [::msgcat::mc "Show history"] \ -state $state \ -command [list logger::show_log $jid -connection $xlib \ -metacontact 1] } ############################################################################# hook::add chat_create_user_menu_hook \ [list ::logger::add_menu_item normal chat] 65 hook::add chat_create_conference_menu_hook \ [list ::logger::add_menu_item normal group] 65 hook::add roster_create_groupchat_user_menu_hook \ [list ::logger::add_menu_item normal grouproster] 65 hook::add roster_conference_popup_menu_hook \ [list ::logger::add_menu_item normal roster] 65 hook::add roster_service_popup_menu_hook \ [list ::logger::add_menu_item disabled roster] 65 hook::add roster_jid_popup_menu_hook \ [list ::logger::add_menu_item normal roster] 65 hook::add message_dialog_menu_hook \ [list ::logger::add_menu_item disabled message] 65 hook::add search_popup_menu_hook \ [list ::logger::add_menu_item disabled search] 65 ############################################################################# proc ::logger::str_to_log {str} { return [string map {\\ \\\\ \r \\r \n \\n} $str] } ############################################################################# proc ::logger::log_to_str {str} { return [string map {\\\\ \\ \\r \r \\n \n} $str] } ############################################################################# proc ::logger::jid_to_filename {jid} { if {$jid == ""} { set jid @@empty } set utf8_jid [encoding convertto utf-8 $jid] set len [string length $utf8_jid] set filename "" for {set i 0} {$i < $len} {incr i} { binary scan $utf8_jid @${i}c sym set sym [expr {$sym & 0xFF}] switch -- $sym { 34 - 37 - 39 - 42 - 43 - 47 - 58 - 59 - 60 - 62 - 63 - 92 - 124 - 126 { # 34 " 37 % 39 ' 42 * 43 + 47 / 58 : 59 ; 60 < 62 > 63 ? 92 \ 124 | 126 ~ append filename [format "%%%02X" $sym] } 46 { # 46 . if {$i + 1 == $len} { append filename [format "%%%02X" $sym] } else { append filename [binary format c $sym] } } default { if {$sym >= 128 || $sym <= 32} { append filename [format "%%%02X" $sym] } else { append filename [binary format c $sym] } } } } if {[string index $filename 253] == "%"} { return [string range $filename 0 252] } if {[string index $filename 252] == "%"} { return [string range $filename 0 251] } return [string range $filename 0 253] } ############################################################################# proc ::logger::filename_to_jid {filename} { if {$filename == "@@empty"} { return $filename } else { set len [string length $filename] set utf8_jid "" for {set i 0} {$i < $len} {incr i} { catch { binary scan $filename @${i}a sym switch -- $sym { "%" { incr i binary scan $filename @${i}a2 num append utf8_jid [binary format c 0x$num] incr i } default { append utf8_jid $sym } } } } return [encoding convertfrom utf-8 $utf8_jid] } } ############################################################################# proc ::logger::cdopen {filepath {mode r}} { set dir [file dirname $filepath] set file [file tail $filepath] set current_dir [pwd] cd $dir if {[catch {open $file $mode} fd]} { cd $current_dir return -code error $fd } else { cd $current_dir return $fd } } ############################################################################# proc ::logger::log_message {chatid from type body x} { variable options if {$type == "chat" && !$options(log_chat)} return if {$type == "groupchat" && !$options(log_groupchat)} return if {![hook::is_flag draw_message_hook log]} return set xlib [chat::get_xlib $chatid] set jid [chat::get_jid $chatid] set nas [::xmpp::jid::stripResource $jid] if {$type == "chat" && ![chat::is_groupchat [chat::chatid $xlib $nas]]} { set jid $nas } set nick [chat::get_nick $xlib $from $type] if {[::xmpp::jid::equal $from [my_jid $xlib $jid]]} { set me 1 } else { set me 0 } set seconds [::xmpp::xml::getAttr [::xmpp::delay::parse $x] seconds] foreach xelem $x { ::xmpp::xml::split $xelem tag xmlns attrs cdata subels # Don't log message if this 'empty' tag is present. It indicates # messages history in chat window. if {[string equal $tag ""] && [string equal $xmlns tkabber:x:nolog]} { return } } set ts [clock format $seconds -format "%Y%m%dT%H%M%S" -gmt 1] set year [clock format $seconds -format %Y] set month [clock format $seconds -format %m] file mkdir [file join $options(logdir) $year $month] set fd [cdopen [file join $options(logdir) $year $month [jid_to_filename $jid]] a] fconfigure $fd -encoding utf-8 puts $fd [str_to_log [list timestamp $ts \ jid $from \ nick $nick \ body $body \ me $me \ type $type]] close $fd } hook::add draw_message_hook ::logger::log_message 15 ############################################################################# proc ::logger::winid {name} { set allowed_name [jid_to_tag $name] return .log_$allowed_name } ############################################################################# proc ::logger::describe_month {year-month} { variable d2m lassign [split ${year-month} -] year month return "$d2m($month) $year" } ############################################################################# proc ::logger::create_log_viewer {lw jid args} { global tcl_platform global defaultnick set metacontact 0 foreach {key val} $args { switch -- $key { -connection { set xlib $val } -subdirs { set subdirs $val } -metacontact { set metacontact $val } } } if {![info exists xlib]} { set xlib [lindex [connections] 0] } if {!$::ifacetk::roster::options(enable_metacontacts) || \ [llength [info procs ::plugins::metacontacts::*]] == 0} { set metacontact 0 } set jids [list $jid] if {$metacontact} { foreach tag [::plugins::metacontacts::get_all_tags $xlib] { set mjids [::plugins::metacontacts::get_jids $xlib $tag] foreach j $mjids { if {[::xmpp::jid::equal $j $jid]} { set jids $mjids break } } } } foreach j $jids { lappend logfiles [jid_to_filename $j] } set mynick [get_group_nick $xlib $jid] Toplevel $lw -class Chat wm group $lw . wm withdraw $lw set title [::msgcat::mc "History for %s" $jid] wm title $lw $title wm iconname $lw $title set lf [ScrolledWindow $lw.sw] set l [Text $lw.log -wrap word -takefocus 0] set mf [Frame $lw.mf] pack $mf -side top -fill x -expand no -padx 1m -pady 1m set jlabel [Label $mf.jlabel -text [::msgcat::mc "Log for:"]] pack $jlabel -side left if {[llength $logfiles] == 1} { set jselect [Label $mf.jselect \ -text "[::msgcat::mc {JID}] $jid"] } else { set textjids [list "[::msgcat::mc {Metacontact}] [lindex $jids 0]"] set idx 0 foreach j $jids { if {[::xmpp::jid::equal $j $jid]} { set idx [llength $textjids] } lappend textjids "[::msgcat::mc {JID}] $j" } set w 0 foreach textjid $textjids { set w [::tcl::mathfunc::max $w [string length $textjid]] } set jselect [Combobox $mf.jselect \ -editable no \ -exportselection no \ -values $textjids \ -width [expr {$w+2}] \ -modifycmd [list \ [namespace current]::change_month \ $mf.jselect $mf.mcombo $logfiles $l $mynick]] $jselect set [lindex $textjids $idx] } pack $jselect -side left set mlabel [Label $mf.mlabel -text " [::msgcat::mc {Select month:}]"] pack $mlabel -side left set ebutton [Button $mf.ebutton \ -text [::msgcat::mc "Export to XHTML"] \ -command [list [namespace current]::export \ $mf.jselect $mf.mcombo $logfiles $mynick]] pack $ebutton -side right pack $lf -padx 1m -pady 1m -fill both -expand yes $lf setwidget $l regsub -all %W [bind Text ] [double% $l] prior_binding regsub -all %W [bind Text ] [double% $l] next_binding bind $lw $prior_binding bind $lw $next_binding $l tag configure they -foreground [option get $lw theyforeground Chat] $l tag configure me -foreground [option get $lw meforeground Chat] $l tag configure server_lab \ -foreground [option get $lw serverlabelforeground Chat] $l tag configure server \ -foreground [option get $lw serverforeground Chat] $l configure -state disabled if {![info exists subdirs]} { foreach lf $logfiles { lappend subdirs {*}[get_subdirs $lf] } set subdirs [lsort -unique $subdirs] } set ympairs {} foreach sd [lsort -decreasing $subdirs] { lappend ympairs [describe_month $sd] } lappend ympairs [::msgcat::mc "All"] set mcombo [Combobox $mf.mcombo \ -editable no \ -exportselection no \ -values $ympairs \ -modifycmd [list \ [namespace current]::change_month \ $mf.jselect $mf.mcombo $logfiles $l $mynick]] $mcombo set [lindex $ympairs 0] pack $mcombo -side left hook::run open_log_post_hook $xlib $jid $lw wm deiconify $lw } ############################################################################# proc ::logger::show_log {jid args} { set lw [winid $jid] debugmsg plugins "LOGGER: $lw" variable $lw upvar 1 $lw state if {![winfo exists $lw]} { eval [list create_log_viewer $lw $jid] $args } else { focus -force $lw } foreach {key val} $args { switch -- $key { -when { set when $val } -timestamp { set timestamp $val } } } set logfile [jid_to_filename $jid] set mynick [get_group_nick "" $jid] set log $lw.log set jbox $lw.mf.jselect set cbox $lw.mf.mcombo set ympairs [$cbox cget -values] if {[info exists when]} { set text [describe_month $when] if {$text ni $ympairs} { error "no log entries for: $when" } } else { set text [lindex $ympairs 0] } $cbox set $text # TODO change_month $jbox $cbox [list $logfile] $log $mynick if {[info exists timestamp]} { set pos [lindex [$log tag ranges TS-$timestamp] 0] if {$pos == ""} { set pos end } } else { set pos end } $log see $pos } ############################################################################# proc ::logger::get_subdirs {logfile} { variable options set subdirs {} foreach yeard [glob -nocomplain -type d -directory $options(logdir) *] { foreach monthd [glob -nocomplain -type d -directory $yeard *] { if {[file exists [file join $monthd $logfile]]} { lappend subdirs [file tail $yeard]-[file tail $monthd] } } } return $subdirs } ############################################################################# proc ::logger::draw_messages {l hist mynick} { $l configure -state normal $l delete 1.0 end add_messages $l $hist $mynick } ############################################################################# proc ::logger::formatxmppts {xmppts} { set seconds [clock scan $xmppts -gmt 1] clock format $seconds -format {%Y-%m-%d %X} } ############################################################################# proc ::logger::exists_and_empty {what} { upvar 1 $what var expr {[info exists var] && $var == ""} } proc ::logger::exists_and_nonempty {what} { upvar 1 $what var expr {[info exists var] && $var != ""} } proc ::logger::add_messages {l hist mynick} { $l configure -state normal foreach vars $hist { array unset tmp if {[catch {array set tmp $vars}]} continue if {[info exists tmp(timestamp)]} { $l insert end \[[formatxmppts $tmp(timestamp)]\] \ [list TS-$tmp(timestamp)] } if {[exists_and_empty tmp(jid)]} { # synthesized message $l insert end "---" server_lab set servertag server } else { if {[exists_and_empty tmp(nick)]} { # message from the server: $l insert end "---" server_lab set servertag server } else { set nick $tmp(nick) if {([info exists tmp(me)] && $tmp(me)) || [string equal $nick $mynick]} { set tag me } else { set tag they } if {[info exists tmp(body)] && [regsub {^/me } $tmp(body) {} body]} { $l insert end "*$nick $body" $tag unset tmp(body) } else { $l insert end "<$nick>" $tag } set servertag "" } } if {[info exists tmp(body)]} { $l insert end " $tmp(body)" $servertag } if {![$l compare "end -1 chars linestart" == "end -1 chars"]} { $l insert end "\n" } } $l configure -state disabled } ############################################################################# proc ::logger::change_month {jselect mcombo logfiles l mynick} { variable m2d if {[catch {$jselect current} jidx]} { # jselect is a label set jidx -1 } incr jidx -1 if {$jidx >= 0 && [llength $logfiles] > 1} { set logfiles [list [lindex $logfiles $jidx]] } set month [$mcombo get] draw_messages $l {} $mynick if {$month == [::msgcat::mc "All"]} { foreach logfile $logfiles { foreach m [get_subdirs $logfile] { lappend tmp($m) $logfile } } foreach m [lsort -unique -increasing [array names tmp]] { set hist {} foreach logfile $logfiles { lappend hist {*}[read_hist_from_file $logfile $m] } add_messages $l [lsort -index 1 $hist] $mynick update } } else { set my_list [split $month " "] set month [lindex $my_list end]-$m2d([join [lrange $my_list 0 end-1] " "]) set hist {} foreach logfile $logfiles { lappend hist {*}[read_hist_from_file $logfile $month] } add_messages $l [lsort -index 1 $hist] $mynick } $l see end } ############################################################################# proc ::logger::read_hist_from_file {logfile month} { variable options lassign [split $month -] year month1 set filename [file join $options(logdir) $year $month1 $logfile] set hist {} if {[file exists $filename]} { set fd [cdopen $filename r] fconfigure $fd -encoding utf-8 set n 0 while {[gets $fd line] > 0} { incr n set str [log_to_str $line] if {![catch { array set tmp $str }]} { lappend hist $str } else { debugmsg plugins "LOGGER: Malformed log line $n in $filename: $line" } } close $fd } return $hist } ############################################################################# proc ::logger::logs_exist {jid} { expr {[llength [get_subdirs [jid_to_filename $jid]]] > 0} } proc ::logger::get_last_messages {jids type max interval} { if {$max == 0 || $interval == 0} { return {} } foreach jid $jids { set logfile [jid_to_filename $jid] foreach month [get_subdirs $logfile] { lappend logs($month) $logfile } } set messages {} set curseconds [clock seconds] set max1 [expr {$max - 1}] foreach m [lsort -decreasing [array names logs]] { foreach logfile $logs($m) { catch { lappend messages {*}[read_hist_from_file $logfile $m] } } set messages [lsort -increasing -index 1 $messages] if {$interval > 0} { set idx 0 foreach msg $messages { unset -nocomplain tmp array set tmp $msg if {[info exists tmp(type)] && $tmp(type) ne $type} continue if {![info exists tmp(timestamp)]} continue set seconds [clock scan $tmp(timestamp) -gmt 1] if {$seconds + $interval * 3600 < $curseconds} { incr idx } else { break } } if {$idx > 0} { set messages [lrange $messages $idx end] if {$max > 0 && [llength $messages] >= $max} { return [lrange $messages end-$max1 end] } else { return $messages } } } if {$max > 0 && [llength $messages] >= $max} { return [lrange $messages end-$max1 end] } } return $messages } ############################################################################# proc ::logger::export {jselect mcombo logfiles mynick} { variable m2d if {[catch {$jselect current} jidx]} { # jselect is a label set jidx -1 } incr jidx -1 if {$jidx >= 0 && [llength $logfiles] > 1} { set logfiles [list [lindex $logfiles $jidx]] } set month [$mcombo get] set hist {} if {$month == [::msgcat::mc "All"]} { foreach logfile $logfiles { foreach m [get_subdirs $logfile] { lappend tmp($m) $logfile } } foreach m [lsort -unique -increasing [array names tmp]] { set h {} foreach logfile $logfiles { lappend h {*}[read_hist_from_file $logfile $m] } lappend hist {*}[lsort -index 1 $h] } } else { set my_list [split $month " "] set month [lindex $my_list end]-$m2d([join [lrange $my_list 0 end-1] " "]) set h {} foreach logfile $logfiles { lappend h {*}[read_hist_from_file $logfile $month] } lappend hist {*}[lsort -index 1 $h] } set filename [tk_getSaveFile -defaultextension .html] if {$filename == ""} return set fd [open $filename w] fconfigure $fd -encoding utf-8 puts $fd {} puts $fd {} puts $fd {} puts $fd {} foreach vars $hist { array unset tmp if {[catch {array set tmp $vars}]} continue set subtags {} if {[info exists tmp(timestamp)]} { set seconds [clock scan $tmp(timestamp) -gmt 1] set timestamp [clock format $seconds -format {[%Y-%m-%d %X]}] lappend subtags [::xmpp::xml::create span \ -attrs {class timestamp} \ -cdata $timestamp] } if {[info exists tmp(nick)] && $tmp(nick) != ""} { if {([info exists tmp(me)] && $tmp(me)) || $tmp(nick) == $mynick} { set tag me } else { set tag they } if {[info exists tmp(body)] && [regsub {^/me } $tmp(body) {} body]} { set nick "*$tmp(nick) $body" unset tmp(body) } else { set nick "<$tmp(nick)> " } lappend subtags [::xmpp::xml::create span \ -attrs [list class $tag] \ -cdata $nick] if {[info exists tmp(body)]} { lappend subtags [::xmpp::xml::create span \ -attrs {class body} \ -cdata "$tmp(body)"] } } else { if {[info exists tmp(body)]} { lappend subtags [::xmpp::xml::create span \ -attrs {class server} \ -cdata "--- $tmp(body)"] } } #if {![$l compare "end -1 chars linestart" == "end -1 chars"]} { # puts "\n" #} set msg [::xmpp::xml::create div \ -attrs {class message} \ -subelements $subtags] puts $fd [::xmpp::xml::toText $msg] } puts $fd {} close $fd } ############################################################################# proc ::logger::write_css {} { return " html body { background-color: white; color: black; } .me { color: red; } .they { color: blue; } .server { color: green; } " } ############################################################################# proc ::logger::convert_subdir_log {t logfrom logto jid dir} { if {[catch { set fd [cdopen $logfrom r] } err]} { $t configure -state normal $t insert end [::msgcat::mc "File %s cannot be opened: %s.\ History for %s (%s) is NOT converted\n" \ $err $logfrom $jid $dir] error $t configure -state disabled $t see end update return } fconfigure $fd -encoding utf-8 set hist [read $fd] close $fd set fd [cdopen $logto a] fconfigure $fd -encoding utf-8 if {[catch { foreach vars $hist { puts $fd [str_to_log $vars] } }]} { $t configure -state normal $t insert end [::msgcat::mc "File %s is corrupt.\ History for %s (%s) is NOT converted\n" \ $logfrom $jid $dir] error $t configure -state disabled $t see end } else { $t configure -state normal $t insert end "($dir) $jid\n" $t configure -state disabled $t see end } close $fd update } proc ::logger::convert_root_log {t dirfrom dirto filename jid} { set logfile [file join $dirfrom $filename] if {[catch { set fd [cdopen $logfile r] } err]} { $t configure -state normal $t insert end [::msgcat::mc "File %s cannot be opened: %s.\ History for %s is NOT converted\n" \ $err $logfile $jid] error $t configure -state disabled $t see end update return } fconfigure $fd -encoding utf-8 set hist [read $fd] close $fd if {[catch { foreach vars $hist { array unset tmp if {[catch {array set tmp $vars}]} continue if {[info exists tmp(timestamp)]} { set seconds [clock scan $tmp(timestamp) -gmt 1] set ym [clock format $seconds -format %Y-%m] lappend newhist($ym) $vars } } }]} { $t configure -state normal $t insert end [::msgcat::mc "File %s is corrupt.\ History for %s is NOT converted\n" \ $logfile $jid] error $t configure -state disabled $t see end update return } foreach ym [lsort [array names newhist]] { $t configure -state normal $t insert end "($ym) $jid\n" $t configure -state disabled $t see end update lassign [split $ym -] year month set dir [file join $dirto $year $month] set newlog [file join $dir [jid_to_filename $jid]] file mkdir $dir set fd [cdopen $newlog a] fconfigure $fd -encoding utf-8 catch { foreach vars $newhist($ym) { puts $fd [str_to_log $vars] } } close $fd } } proc ::logger::convert_logs {t dirfrom dirto} { variable version # Heuristically reconstruct JIDs set fnlist {} foreach subdir [glob -nocomplain -type d -directory $dirfrom *] { set dir [file tail $subdir] if {![regexp {^(\d\d\d\d)-(\d\d)$} $dir -> year month]} continue foreach filepath [glob -nocomplain -type f -directory $subdir *] { lappend fnlist [file tail $filepath] } } foreach filepath [glob -nocomplain -type f -directory $dirfrom *] { lappend fnlist [file tail $filepath] } # Sort the list. It's important not only because it removes duplicates set fnlist [lsort -unique $fnlist] foreach fn $fnlist { # Set prefix (for processing groupchats) if {![info exists prefix] || ([string first $prefix $fn] != 0)} { set prefix $fn } # Simple case: no or one underscore in the filename set idx [string first _ $fn] if {($idx < 0) || ([string first _ $fn [expr {$idx + 1}]] < 0)} { set JID($fn) [string map {_ @} $fn] continue } # JID without a resource (very likely) # Since underscore is not allowed in domain names, just replace # the last one by @. It's the best guess we can do if {$prefix == $fn} { set idx [string last _ $fn] set pr [string range $fn 0 [expr {$idx - 1}]] set sf [string range $fn [expr {$idx + 1}] end] set JID($fn) $pr@$sf continue } # JID with a resource is a private chat with someone in the # conference room. Take room JID from the $prefix and add # resource (don't replace _ in the resource) set idx [expr {[string length $prefix] + 1}] set sf [string range $fn $idx end] set JID($fn) $JID($prefix)/$sf } # Create dir for new logs if {![file exists $dirto]} { file mkdir $dirto } # Process all subdirs YYYY-MM foreach subdir [glob -nocomplain -type d -directory $dirfrom *] { set dir [file tail $subdir] if {![regexp {^(\d\d\d\d)-(\d\d)$} $dir -> year month]} continue foreach filepath [glob -nocomplain -type f -directory $subdir *] { set jid $JID([file tail $filepath]) set filename [jid_to_filename $jid] set fdir [file join $dirto $year $month] file mkdir $fdir convert_subdir_log $t $filepath [file join $fdir $filename] $jid $dir } } # Process all files in log dir itself foreach filepath [glob -nocomplain -type f -directory $dirfrom *] { if {[file tail $filepath] == "message_archive"} { convert_subdir_log $t $filepath \ [file join $dirto [file tail $filepath]] \ message_archive "" } else { convert_root_log $t $dirfrom $dirto \ [file tail $filepath] $JID([file tail $filepath]) } } # Storing version for possible future conversions set fd [open [file join $dirto version] w] puts $fd $version close $fd } ############################################################################# proc ::logger::convert_on_start {} { variable version variable options set version_file [file join $options(logdir) version] if {[file exists $version_file]} { set fd [open $version_file r] set v [string trim [read $fd]] close $fd if {$v >= $version} return } set parent_dir [file dirname $options(logdir)] set log_dir [file tail $options(logdir)] if {$log_dir == ""} { return -code error \ [::msgcat::mc "You're using root directory %s for storing Tkabber\ logs!\n\nI refuse to convert logs database." \ $options(logdir)] } # Create temporary directory for converted logs set dir $log_dir.new while {[file exists [file join $parent_dir $dir]]} { set dir $dir~ } set w .log_convert Dialog $w -title [::msgcat::mc "Converting Log Files"] \ -separator 1 -anchor e -default 0 -cancel 0 -modal none bind $w [list set convert_result 1] $w add -text [::msgcat::mc "Close"] \ -state disabled \ -command [list destroy $w] set f [$w getframe] set msg [message $f.msg -aspect 50000 \ -text [::msgcat::mc "Please, be patient while chats\ history is being converted to new format"]] pack $msg set sw [ScrolledWindow $f.sw] pack $sw -expand yes -fill both set t [text $sw.t -state disabled -wrap word] $t tag configure error -foreground [option get $t errorForeground Text] $sw setwidget $t $w draw grab $w convert_logs $t $options(logdir) [file join $parent_dir $dir] set bdir $log_dir~ while {[file exists [file join $parent_dir $bdir]]} { set bdir $bdir~ } file rename -- $options(logdir) [file join $parent_dir $bdir] file rename -- [file join $parent_dir $dir] $options(logdir) if {[winfo exists $w]} { $w itemconfigure 0 -state normal $msg configure -text [::msgcat::mc "Chats history is converted.\nBackup\ of the old history\ is stored in %s" \ [file join $parent_dir $bdir]] $t configure -state normal $t insert end "[::msgcat::mc {Conversion is finished}]\n" $t configure -state disabled $t see end vwait convert_result } catch {unset ::convert_result} } hook::add finload_hook ::logger::convert_on_start 1000 # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/me_command.tcl000064400000000000000000000033611477701321300172570ustar00nobodynobody# me_command.tcl -- # # This file is a part of the Tkabber XMPP client. It implements # rendering and completing of /me command. Messages started with /me # traditionally render as if someone tells about herself in third # person. proc handle_me {chatid from type body x} { if {[regexp {^/me\M} $body]} { set body [string range $body 3 end] if {[chat::is_our_jid $chatid $from]} { set tag me } else { set tag they } set xlib [chat::get_xlib $chatid] set chatw [chat::chat_win $chatid] set nick [chat::get_nick $xlib $from $type] set cw [chat::winid $chatid] $chatw insert end "* $nick" [list $tag NICK-$nick] $chatw mark set MSGLEFT "end - 1 char" $chatw mark gravity MSGLEFT left if {[string equal $type groupchat]} { set myjid [chat::our_jid $chatid] set mynick [chat::get_nick $xlib $myjid $type] ::richtext::property_add mynick $mynick ::richtext::render_message $chatw $body $tag } else { ::richtext::render_message $chatw $body $tag } $chatw tag add NICKMSG-$nick MSGLEFT "end - 1 char" if {![catch {::plugins::mucignore::is_ignored $xlib $from $type} ignore] && \ $ignore != ""} { $chatw tag add $ignore {MSGLEFT linestart} {end - 1 char} } return stop } } hook::add draw_message_hook [namespace current]::handle_me 83 proc me_command_comp {chatid compsvar wordstart line} { upvar 0 $compsvar comps if {!$wordstart} { lappend comps {/me } } } hook::add generate_completions_hook [namespace current]::me_command_comp # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/muc_commands.tcl000064400000000000000000000115421477701321300176250ustar00nobodynobody# muc_commands.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # implements several MUC-related commands in chat input windows. They are # /whois, /kick, /ban, /banjid, /unban, /voice, /devoice, /member, # /demember, /moderator, /demoderator, /admin, /deadmin. Most commands # have two arguments: nickname (or jid) and reason. Reason is placed at # the second line in the window. # # Example: # /kick somebody # You are an annoying person! namespace eval muc {} ############################################################################### proc muc::handle_commands {chatid user body type} { if {![string equal $type groupchat]} return set xlib [chat::get_xlib $chatid] set group [chat::get_jid $chatid] if {[string equal [string range $body 0 5] "/kick "]} { set attr role set value none set dir down lassign [parse_nick_reason $body 6] nick reason } elseif {[string equal [string range $body 0 4] "/ban "]} { set attr affiliation set value outcast set dir down lassign [parse_nick_reason $body 5] nick reason } elseif {[string equal [string range $body 0 7] "/banjid "]} { lassign [parse_nick_reason $body 8] jid reason ::xmpp::muc::setAffiliation $xlib $group outcast \ -jid $jid -reason $reason \ -command [list muc::test_error_res \ "affiliation outcast '$jid'" \ $xlib $group $chatid] return stop } elseif {[string equal [string range $body 0 6] "/unban "]} { set jid [parse_nick $body 7] muc::unban $xlib $group $jid return stop } elseif {[string equal [string range $body 0 6] "/whois "]} { set nick [parse_nick $body 7] muc::whois $xlib $group/$nick $chatid return stop } elseif {[string equal [string range $body 0 6] "/voice "]} { set attr role set value participant set dir up lassign [parse_nick_reason $body 7] nick reason } elseif {[string equal [string range $body 0 8] "/devoice "]} { set attr role set value visitor set dir down lassign [parse_nick_reason $body 9] nick reason } elseif {[string equal [string range $body 0 7] "/member "]} { set attr affiliation set value member set dir up lassign [parse_nick_reason $body 8] nick reason } elseif {[string equal [string range $body 0 9] "/demember "]} { set attr affiliation set value none set dir down lassign [parse_nick_reason $body 10] nick reason } elseif {[string equal [string range $body 0 10] "/moderator "]} { set attr role set value moderator set dir up lassign [parse_nick_reason $body 11] nick reason } elseif {[string equal [string range $body 0 12] "/demoderator "]} { set attr role set value participant set dir down lassign [parse_nick_reason $body 13] nick reason } elseif {[string equal [string range $body 0 6] "/admin "]} { set attr affiliation set value admin set dir up lassign [parse_nick_reason $body 7] nick reason } elseif {[string equal [string range $body 0 8] "/deadmin "]} { set attr affiliation set value member set dir down lassign [parse_nick_reason $body 9] nick reason } else { return } muc::change_item_attr $xlib $group/$nick $attr $value $dir $reason $chatid return stop } hook::add chat_send_message_hook [namespace current]::muc::handle_commands 50 proc muc::parse_nick {body n} { return [lindex [parse_nick_reason $body $n] 0] } proc muc::parse_nick_reason {body n} { # Parse nickname and reason # first line is a nick, rest are reason set nick_reason [string range $body $n end] set ne [string first "\n" $nick_reason] if {$ne < 0} { set nick $nick_reason set reason "" } else { set nick [string range $nick_reason 0 [expr {$ne - 1}]] set reason [string range $nick_reason [expr {$ne + 1}] end] } return [list $nick [string trim $reason]] } ############################################################################### proc muc::commands_comps {chatid compsvar wordstart line} { set group [chat::get_jid $chatid] if {![muc::is_compatible $group]} return upvar 0 $compsvar comps if {!$wordstart} { lappend comps {/whois } {/kick } {/ban } {/banjid } {/unban } \ {/voice } {/devoice } \ {/member } {/demember } \ {/moderator } {/demoderator } \ {/admin } {/deadmin } } } hook::add generate_completions_hook [namespace current]::muc::commands_comps # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/muc_ignore.tcl000064400000000000000000000477621477701321300173240ustar00nobodynobody# muc_ignore.tcl -- # # Support for ignoring occupant activity in MUC rooms. # # A note on runtime ruleset format: # * A hash is used to hold ignore rules at runtime; each key # uniquely refers to its related "xlib, room, occupant, # message type" tuple; the existence of a key is used to # determine the fact of some type of a room occupant messages # being ignored. # * The format of the ruleset keys is as follows: # SESSION_JID NUL ROOM_JID/OCCUPANT NUL TYPE # where: # * NUL means character with code 0 (\u0000 in Tcl lingo). # It is used since ASCII NUL is prohibited in JIDs; # * SESSION_JID is the bare JID of a particular connection of # the Tkabber user (support for multiaccounting); # * ROOM_JID is the room bare JID; # * OCCUPANT is either an occupant's room nick OR her full # bare JID, if it's available; # * TYPE is either "chat" or "groupchat", literally, which determines # the type of messages to ignore. namespace eval mucignore { variable options variable ignored variable tid 0 variable tags variable menustate # Cutsomize section: custom::defvar stored_rules {} \ "Stored MUC ignore rules" \ -group Hidden \ -type string hook::add post_custom_restore [namespace current]::restore_rules custom::defgroup {MUC Ignoring} \ [::msgcat::mc "Ignoring groupchat and chat messages\ from selected occupants of multi-user conference\ rooms."] \ -group Privacy \ -group Chat custom::defvar options(transient_rules) 0 \ [::msgcat::mc "When set, all changes to the ignore rules are\ applied only until Tkabber is closed\;\ they are not saved and thus will be not restored at\ the next run."] \ -group {MUC Ignoring} \ -type boolean # Event handlers: # Handlers for creating various menus: hook::add chat_create_conference_menu_hook \ [namespace current]::setup_muc_menu hook::add chat_create_user_menu_hook \ [namespace current]::setup_private_muc_chat_menu hook::add roster_create_groupchat_user_menu_hook \ [namespace current]::setup_occupant_menu hook::add finload_hook \ [namespace current]::on_init # Block private MUC messages: hook::add process_message_hook \ [namespace current]::process_message # Weed out MUC room messages upon entering a room: hook::add open_chat_post_hook \ [namespace current]::sanitize_muc_display # Catch presence of ignored users. # NOTE: the order of this handler must be higher than # that of ::muc::process_presence (which is the default of 50) # since that handler extracts and stores the room occupant's # real JID in the non-anonymous rooms. hook::add client_presence_hook \ [namespace current]::catch_junkie_presence 55 # Adjust ignore rules on nick renames. # NOTE: this hook must be run earlier than client_presence_hook. hook::add room_nickname_changed_hook \ [namespace current]::trace_room_nick_change hook::add generate_completions_hook \ [namespace current]::add_completions hook::add chat_send_message_hook \ [namespace current]::handle_commands } # "Ignore tags" are used to mark whole messages posted in the room # by an ignored occupant. Their names are autogenerated and unique # throughout one Tkabber run. Each tag is bound to one particular # "room JID" of the ignored occupant. Ignore tags may be rebound # to another room JID when these change (on nickname changes). # Creates the ignore tag for a particular "room JID". # If matching tag exists, this proc does nothing, silently. # This provides for ignore tag "persistence". proc mucignore::ignore_tag_create {roomjid} { variable tid variable tags if {[info exists tags($roomjid)]} return set tags($roomjid) IGNORED-$tid incr tid } proc mucignore::ignore_tag_get {roomjid} { variable tags set tags($roomjid) } proc mucignore::ignore_tag_rebind {from to} { variable tags set tags($to) $tags($from) unset tags($from) } proc mucignore::ignore_tag_forget {roomjid} { variable tags unset tags($roomjid) } # Returns bare JID of the session identified by $xlib proc mucignore::session_bare_jid {xlib} { ::xmpp::jid::stripResource [connection_jid $xlib] } # Tries to get the real bare JID of the room occupant identified # by the $room_occupant_jid; returns that JID if it's available, # empty string otherwise. proc mucignore::get_real_bare_jid {xlib room_occupant_jid} { set real_jid [::muc::get_real_jid $xlib $room_occupant_jid] if {$real_jid != {}} { return [::xmpp::jid::stripResource $real_jid] } else { return {} } } # Creates an ignore rule suitable for using as a key to a hash of rules. # Expects: # * entity -- session's bare JID; # * jid -- JID to ignore ("room/nick" or "room/real_bare_jid"); # * type -- type of chat to ignore ("groupchat" or "chat"). # These parts are joined using the NUL character (since its appearance # is prohibited in any part of a JID) and so the rule can be reliably # split back into parts. # See also: [split_rule]. proc mucignore::mkrulekey {entity jid type} { join [list $entity $jid $type] \u0000 } # Creates an ignore rule suitable for using as a key to a hash of rules. # The $xlib parameter is converted to the session's bare JID first. # It's just a convenient wrapper around [mkrulekey]. proc mucignore::mkrule {xlib jid type} { mkrulekey [session_bare_jid $xlib] $jid $type } # Splits given rule into the list of [entity jid type], where: # * entity -- is a bare JID of the user's session; # * jid -- is a JID to be ignored (usually a full room JID); # * type -- one of: "groupchat" or "chat", designating the type of messages # originating from jid to be ignored. # This proc reverses what [mkrulekey] does. proc mucignore::split_rule {rule} { split $rule \u0000 } proc mucignore::setup_muc_menu {m xlib jid} { # TODO return $m add command \ -label [::msgcat::mc "Edit MUC ignore rules"] \ -command [list [namespace current]::editor::open $xlib $jid] } proc mucignore::on_init {} { # TODO return set menu [.mainframe getmenu plugins] $menu add command -label [::msgcat::mc "Edit MUC ignore rules"] \ -command [list [namespace current]::editor::open {} {}] } proc mucignore::setup_private_muc_chat_menu {m xlib jid} { set room [::xmpp::jid::stripResource $jid] if {![::chat::is_groupchat [::chat::chatid $xlib $room]]} return setup_occupant_menu $m $xlib $jid } # Prepares two global variables mirroring the current state of # ignoring for the room occupant on which groupchat roster nick # the menu is being created. They are used to represent # ignore state checkbutton menu entries. proc mucignore::setup_occupant_menu {m xlib jid} { variable ignored variable menustate set our_nick [::get_our_groupchat_nick [ ::chat::chatid $xlib [ ::xmpp::jid::stripResource $jid]]] set nick [::chat::get_nick $xlib $jid groupchat] if {$nick == $our_nick} { # don't allow to ignore ourselves set state disabled } else { set state normal } foreach type {groupchat chat} { set menustate($xlib,$jid,$type) [ info exists ignored([mkrule $xlib $jid $type])] } set sm [menu $m.mucignore -tearoff 0] $m add cascade -menu $sm \ -state $state \ -label [::msgcat::mc "Ignore"] $sm add checkbutton -label [::msgcat::mc "Ignore groupchat messages"] \ -variable [namespace current]::menustate($xlib,$jid,groupchat) \ -command [list [namespace current]::menu_toggle_ignoring \ $xlib $jid groupchat] $sm add checkbutton -label [::msgcat::mc "Ignore chat messages"] \ -variable [namespace current]::menustate($xlib,$jid,chat) \ -command [list [namespace current]::menu_toggle_ignoring \ $xlib $jid chat] bind $m +[double% [list \ [namespace current]::menu_cleanup_state $xlib $jid]] } proc mucignore::menu_toggle_ignoring {xlib jid type} { variable menustate if {$menustate($xlib,$jid,$type)} { occupant_ignore $xlib $jid $type } else { occupant_attend $xlib $jid $type } } proc mucignore::menu_cleanup_state {xlib jid} { variable menustate array unset menustate $xlib,$jid,* } # Ignores specified room occupant: # * Creates an ignore rule for her; # * Creates an ignore tag, if needed; # * Hides messages tagged with that tag, if any; # * Builds and saves current ruleset to the Customize db. proc mucignore::occupant_ignore {xlib jid args} { variable options variable ignored foreach type $args { set ignored([mkrule $xlib $jid $type]) true if {$type == "groupchat"} { ignore_tag_create $jid room_weed_messages $xlib $jid true } } if {!$options(transient_rules)} { store_rules $xlib } } # Un-ignores specified room occupant: # * Removes her ignore rules; # * Shows any hidden messages from her; # * Ignore tag is NOT removed to provide for "quick picking" # into what the ignored occupant have had written so far -- # when she is ignored again, all her messages tagged with # the appropriate ignore tag are again hidden. # * Builds and saves current ruleset to the Customize db. proc mucignore::occupant_attend {xlib jid args} { variable options variable ignored foreach type $args { set rule [mkrule $xlib $jid $type] if {[info exists ignored($rule)]} { unset ignored($rule) if {$type == "groupchat"} { room_weed_messages $xlib $jid false # we don't use [ignore_tag_forget] here # so when we switch ignoring back on, # all already marked messagess will be weed out } } } if {!$options(transient_rules)} { store_rules $xlib } } # Hides or shows messages tagged as ignored for the $jid, if any. proc mucignore::room_weed_messages {xlib jid hide} { set room [::xmpp::jid::stripResource $jid] set cw [::chat::chat_win [::chat::chatid $xlib $room]] $cw tag configure [ignore_tag_get $jid] -elide $hide } # This handler blocks further processing of the private room message # if its sender is blacklisted. # If the message is groupchat and its sender is blacklisted, it sets # the appropriate message property so that other message handlers # could treat such message in some special way. proc mucignore::process_message {xlib from id type args} { variable ignored if {$type == "chat" && \ [info exists ignored([mkrule $xlib $from chat])]} { return stop } } proc mucignore::is_ignored {xlib jid type} { variable ignored if {[info exists ignored([mkrule $xlib $jid $type])]} { return [ignore_tag_get $jid] } else { return "" } } # This handler is being run after opening the chat window. # It searches the ignore rules for JIDs matching the JID of the room, # extracts them from the rules and weeds out their messages from # the room display (chatlog). # NOTE that it gets executed before any presences arrive from the room # occupants, so the whole idea is to weed out messages with known (ignored) # nicks. proc mucignore::sanitize_muc_display {chatid type} { variable ignored if {$type != "groupchat"} return set xlib [::chat::get_xlib $chatid] set jid [::chat::get_jid $chatid] foreach rule [array names ignored [mkrule $xlib $jid/* groupchat]] { set junkie [lindex [split_rule $rule] 1] # TODO handle "real JIDs" case... ignore_tag_create $junkie room_weed_messages $xlib $junkie true } } # This handler is being run after the room_nickname_changed_hook # (which takes care of renaming the ignore list entries). # This proc serves two purposes: # * It converts rules from real JIDs and room JIDs and back # so that room JIDs are used for rule matching and real JIDs # are stored, if they are available, between sessions. # * It arranges for chat log display to be prepared to weed out # messages from ignored JIDs. # TODO why does real JID is available when this handler is run with # $type == "unavailable". memory leak in chats.tcl? # TODO use chat_user_enter/chat_user_exit instead? proc mucignore::catch_junkie_presence {xlib from pres args} { variable options variable ignored set room [::xmpp::jid::stripResource $from] set rjid [get_real_bare_jid $xlib $from] if {$pres == "available"} { debugmsg mucignore "avail: $from; real jid: $rjid" foreach type {groupchat chat} { if {$rjid != {} && \ [info exists ignored([mkrule $xlib $room/$rjid $type])]} { rename_rule_jid $xlib $room/$rjid $from $type } } if {[info exists ignored([mkrule $xlib $from groupchat])]} { ignore_tag_create $from room_weed_messages $xlib $from true } } elseif {$pres == "unavailable"} { debugmsg mucignore "unavail: $from; real jid: $rjid" if {[info exists ignored([mkrule $xlib $from groupchat])]} { ignore_tag_forget $from } foreach type {groupchat chat} { if {$rjid != {} && \ [info exists ignored([mkrule $xlib $from $type])]} { rename_rule_jid $xlib $from $room/$rjid $type } } } } proc mucignore::trace_room_nick_change {chatid oldnick newnick} { variable ignored set xlib [chat::get_xlib $chatid] set room [chat::get_jid $chatid] foreach type {groupchat chat} { if {[info exists ignored([mkrule $xlib $room/$oldnick $type])]} { rename_rule_jid $xlib $room/$oldnick $room/$newnick $type if {$type == "groupchat"} { ignore_tag_rebind $room/$oldnick $room/$newnick } } } } proc mucignore::rename_rule_jid {xlib from to type} { variable ignored set oldrule [mkrule $xlib $from $type] set newrule [mkrule $xlib $to $type] set ignored($newrule) [set ignored($oldrule)] unset ignored($oldrule) debugmsg mucignore "rule renamed:\ [string map {\u0000 |} $oldrule]\ [string map {\u0000 |} $newrule]" } proc mucignore::explode_room_jid {xlib room_occupant_jid vroom voccupant} { upvar 1 $vroom room $voccupant occupant set room [::xmpp::jid::stripResource $room_occupant_jid] set occupant [get_real_bare_jid $xlib $room_occupant_jid] if {$occupant == {}} { set occupant [::xmpp::jid::resource $room_occupant_jid] } } # Parses the runtime hash of ignore rules, makes up the hierarchical list # (a tree) of ignore rules, resolving the room JIDs to real JIDs, # if possible, then saves the list to the corresponding Customize variable. # The list has the form: # * session_bare_jid_1 # * room_bare_jid_1 # * occupant_1 (nick or real_jid) # * "groupchat" or "chat" or both # ...and so on proc mucignore::store_rules {xlib} { variable ignored variable stored_rules array set entities {} foreach rule [array names ignored] { lassign [split_rule $rule] entity jid type explode_room_jid $xlib $jid room occupant set entities($entity) 1 set rooms rooms_$entity if {![info exists $rooms]} { array set $rooms {} } set [set rooms]($room) 1 set occupants occupants_$entity$room if {![info exists $occupants]} { array set $occupants {} } lappend [set occupants]($occupant) $type } set LE {} foreach entity [array names entities] { set LR {} foreach room [array names rooms_$entity] { set LO {} set occupants occupants_$entity$room foreach occupant [array names $occupants] { lappend LO $occupant [set [set occupants]($occupant)] } lappend LR $room $LO } lappend LE $entity $LR } set stored_rules [list 1.0 $LE] ;# also record "ruleset syntax" version debugmsg mucignore "STORED: $LE" } proc mucignore::restore_rules {args} { variable ignored variable stored_rules array set ignored {} set failed [catch { lassign $stored_rules version ruleset array set entities $ruleset foreach entity [array names entities] { array set rooms $entities($entity) foreach room [array names rooms] { array set occupants $rooms($room) foreach occupant [array names occupants] { foreach type $occupants($occupant) { set ignored([mkrulekey $entity $room/$occupant $type]) true } } array unset occupants } array unset rooms } } err] if {$failed} { global errorInfo set bt $errorInfo set stored_rules {} after idle [list error \ [::msgcat::mc "Error loading MUC ignore rules, purged."] $bt] } debugmsg mucignore "RESTORED: [string map {\u0000 |} [array names ignored]]" } proc mucignore::add_completions {chatid compsvar wordstart line} { upvar 0 $compsvar comps lappend comps "/ignore " "/unignore " } proc mucignore::handle_commands {chatid user body type} { set xlib [chat::get_xlib $chatid] if {[string equal -length 8 $body "/ignore "]} { set nick [string range $body 8 end] set jid [chat::get_jid $chatid]/$nick occupant_ignore $xlib $jid $type set msg [::msgcat::mc "%s was ignored" $nick] ::chat::add_message $chatid "" chat $msg {} return stop } if {[string equal -length 10 $body "/unignore "]} { set nick [string range $body 10 end] set jid [chat::get_jid $chatid]/$nick occupant_attend $xlib $jid $type set msg [::msgcat::mc "%s was unignored" $nick] ::chat::add_message $chatid "" chat $msg {} return stop } } ######################################################################## # MUC Ignore ruleset editor ######################################################################## namespace eval mucignore::editor {} # ... # NOTE that both $xlib and $jid may be empty at the time of invocation. proc mucignore::editor::open {xlib jid} { set w .mucignore_rules_editor if {[winfo exists $w]} { return } add_win $w -title [::msgcat::mc "MUC Ignore Rules"] \ -tabtitle [::msgcat::mc "MUC Ignore"] \ -class MUCIgnoreRulesetEditor \ -raise 1 set sw [ScrolledWindow $w.sw -auto both] set t [MyTree $w.tree] $sw setwidget $t bind $sw [list [namespace current]::cleanup [double% $w]] pack $sw -fill both -expand true # NOTE that BWidget Tree doesn't aceept keyboard bindings. $t tag bind Text [list [namespace current]::tree_toggle [double% $t]] bind $w [list [namespace current]::tree_toggle [double% $t]] bind $w [list [namespace current]::tree_edit_item [double% $t]] bind $w [list [namespace current]::tree_insert_item [double% $t]] bind $w [list [namespace current]::tree_insert_item [double% $t]] } proc mucignore::editor::cleanup {w} { # TODO do appropriate cleanup... } proc mucignore::editor::tree_toggle {t} { set node [lindex [$t selection] 0] if {$node != {}} { $t item $node -open [expr {![$t item $node -open]}] } } proc mucignore::editor::tree_edit_item {t} { set node [lindex [$t selection] 0] if {$node == {}} return set text [$t item $node -text] # TODO implement #$t edit $node $text } proc mucignore::editor::tree_insert_item {t} { set parent [lindex [$t selection] 0] # TODO implement #add_nodes $t $parent {New {}} } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/nick_colors.tcl000064400000000000000000000246401477701321300174700ustar00nobodynobody# nick_colors.tcl -- # # Do full text coloring based upon nicks. Includes a color editor and # persistence for modified color selection. # # Copyright (C) 2004 Pat Thoyts # Modifications Sergei Golovan package require sum namespace eval nickcolors { custom::defvar options(use_colored_nicks) 0 \ [::msgcat::mc "Use colored nicks in chat windows."] \ -group Chat -type boolean \ -command [namespace current]::change_options custom::defvar options(use_colored_roster_nicks) 0 \ [::msgcat::mc "Use colored nicks in groupchat rosters."] \ -group Chat -type boolean \ -command [namespace current]::change_options custom::defvar options(use_colored_messages) 0 \ [::msgcat::mc "Color message bodies in chat windows."] \ -group Chat -type boolean \ -command [namespace current]::change_options hook::add open_chat_post_hook [namespace current]::chat_add_nick_colors hook::add close_chat_post_hook [namespace current]::chat_delete_nick_colors hook::add quit_hook [namespace current]::save_nick_colors hook::add draw_message_hook [namespace current]::check_nick 60 hook::add finload_hook [namespace current]::init_nick_colors hook::add chat_win_popup_menu_hook [namespace current]::add_chat_win_popup_menu 10 hook::add roster_create_groupchat_user_menu_hook \ [namespace current]::add_groupchat_user_menu_items variable NickColorPool if {![info exists NickColorPool]} { set NickColorPool [list blue4 green4 red brown4 orange3 purple3 \ tomato chocolate pink3] } variable NickColors if {![info exists NickColors]} { array set NickColors {} } } proc nickcolors::init_nick_colors {} { load_nick_colors add_nick_colors_menu } proc nickcolors::add_nick_colors_menu {} { set m [.mainframe getmenu chats] $m insert end checkbutton \ -label [::msgcat::mc "Use colored nicks"] \ -variable [namespace current]::options(use_colored_nicks) \ -command [namespace current]::change_options $m insert end checkbutton \ -label [::msgcat::mc "Use colored roster nicks"] \ -variable [namespace current]::options(use_colored_roster_nicks) \ -command [namespace current]::change_options $m insert end checkbutton \ -label [::msgcat::mc "Use colored messages"] \ -variable [namespace current]::options(use_colored_messages) \ -command [namespace current]::change_options $m insert end command \ -label [::msgcat::mc "Edit nick colors..."] \ -command [namespace current]::edit_nick_colors } # Called upon startup, this will merge the user's stored set of nick-colors # into the current array. New chat windows will pick these up. # proc nickcolors::load_nick_colors {} { variable NickColors set filename [file join $::configdir nickcolors.tcl] if {[file exists $filename]} { set f [open $filename r] fconfigure $f -encoding utf-8 while {![eof $f]} { set line [string trim [gets $f]] if {[string length $line] > 0 && ![string match \#* $line]} { catch { set NickColors([lindex $line 0]) [lindex $line 1] } } } close $f } } # Called at shutdown to save the current set of nick-colors to file. proc nickcolors::save_nick_colors {} { variable NickColors set filename [file join $::configdir nickcolors.tcl] set f [open $filename w] fconfigure $f -encoding utf-8 puts $f "# This is an automatically generated file. Do not edit." foreach {nick clr} [array get NickColors] { puts $f [list $nick $clr] } close $f } proc nickcolors::get_color {nick} { variable NickColors variable NickColorPool if {[info exists NickColors($nick)]} { return $NickColors($nick) } else { set index [expr {[crc::sum -- [encoding convertto utf-8 $nick]] % [llength $NickColorPool]}] return [lindex $NickColorPool $index] } } proc nickcolors::set_color {chatid nick color} { variable options if {[catch {set w [chat::chat_win $chatid]}] || \ ![winfo exists $w]} { return } if {$options(use_colored_nicks)} { $w tag configure NICK-$nick -foreground $color $w tag configure NICKMSG-$nick -foreground $color } if {$options(use_colored_messages)} { $w tag configure MSG-$nick -foreground $color $w tag lower MSG-$nick } } # Called upon opening a new chat window. This added all the currently defined # nick-colors as tags into the text widget. # proc nickcolors::chat_add_nick_colors {chatid type} { variable NicksInChat debugmsg chat "on_open_chat $chatid $type" set NicksInChat($chatid) {} } proc nickcolors::chat_delete_nick_colors {chatid} { variable NicksInChat debugmsg chat "on_close_chat $chatid" catch {unset NicksInChat($chatid)} } # draw_message hook used to check that the nick exists as a color and tag. proc nickcolors::check_nick {chatid from type body x} { variable NicksInChat set xlib [chat::get_xlib $chatid] set nick [chat::get_nick $xlib $from $type] if {$nick ni $NicksInChat($chatid)} { lappend NicksInChat($chatid) $nick set_color $chatid $nick [get_color $nick] } } proc nickcolors::edit_nick_colors {} { variable NickColors variable NickColorEdits array set NickColorEdits [array get NickColors] set w .edit_nicks Dialog $w -title [::msgcat::mc "Edit chat user colors"] \ -modal none -anchor e \ -default 0 -cancel 1 $w add -text [::msgcat::mc "OK"] \ -command [list [namespace current]::end_dialog $w ok] $w add -text [::msgcat::mc "Cancel"] \ -command [list [namespace current]::end_dialog $w cancel] set f [$w getframe] bind $f [list [namespace current]::end_dialog [double% $w] cancel] set tools [Frame $f.tools] pack $tools -side bottom -fill x set sw [ScrolledWindow $w.sw] set lf [Text $w.nicks -width 32 -height 14 -cursor left_ptr -font $::ChatFont] pack $sw -side top -expand yes -fill both -in $f -pady 1m -padx 1m $sw setwidget $lf foreach nick [lsort -dictionary [array names NickColors]] { set clr $NickColors($nick) $lf tag configure NICK-$nick -foreground $clr $lf tag bind NICK-$nick \ [double% [list [namespace current]::on_nick_hover $lf $nick Enter]] $lf tag bind NICK-$nick \ [double% [list [namespace current]::on_nick_hover $lf $nick Leave]] $lf tag bind NICK-$nick \ [double% [list [namespace current]::on_nick_click $lf $nick]] $lf insert end $nick [list NICK-$nick] $lf insert end "\n" } $lf configure -state disabled $w draw } proc nickcolors::end_dialog {w res} { variable options variable NickColors variable NickColorEdits bind [$w getframe] { } destroy $w if {$res == "ok"} { array set NickColors [array get NickColorEdits] change_options } catch {unset NickColorEdits} } proc nickcolors::on_nick_hover {w nick event} { if {$event == "Enter"} { $w tag configure NICK-$nick -underline 1 $w configure -cursor hand2 } else { $w tag configure NICK-$nick -underline 0 $w configure -cursor left_ptr } } proc nickcolors::on_nick_click {w nick} { variable NickColorEdits if {[info exists NickColorEdits($nick)]} { set clr $NickColorEdits($nick) } else { set clr [$w cget -foreground] } set new [tk_chooseColor -initialcolor $clr \ -title [::msgcat::mc "Edit %s color" $nick]] if {$new != ""} { $w tag configure NICK-$nick -foreground $new set NickColorEdits($nick) $new [namespace current]::save_nick_colors } } proc nickcolors::change_options {args} { variable options variable NicksInChat foreach chatid [chat::opened] { set wn [chat::chat_win $chatid] if {[winfo exists $wn]} { if {[chat::is_groupchat $chatid]} { chat::redraw_roster_after_idle $chatid } foreach nick $NicksInChat($chatid) { set clr [get_color $nick] $wn tag configure NICK-$nick \ -foreground [expr {$options(use_colored_nicks) ? $clr : ""}] $wn tag configure NICKMSG-$nick \ -foreground [expr {$options(use_colored_nicks) ? $clr : ""}] $wn tag configure MSG-$nick \ -foreground [expr {$options(use_colored_messages) ? $clr : ""}] } } } } proc nickcolors::add_chat_win_popup_menu {m chatwin X Y x y} { variable options set tags [$chatwin tag names "@$x,$y"] set nick "" if {$options(use_colored_messages)} { if {[set idx [lsearch -glob $tags MSG-*]] >= 0} { set nick [string range [lindex $tags $idx] 4 end] } } if {$options(use_colored_nicks)} { if {[set idx [lsearch -glob $tags NICK-*]] >= 0} { set nick [string range [lindex $tags $idx] 5 end] } if {[set idx [lsearch -glob $tags NICKMSG-*]] >= 0} { set nick [string range [lindex $tags $idx] 5 end] } } if {$nick == ""} return $m add command -label [::msgcat::mc "Edit nick color..."] \ -command [list [namespace current]::edit_nick_color $chatwin $nick] } proc nickcolors::add_groupchat_user_menu_items {m xlib jid} { variable options if {$options(use_colored_roster_nicks)} { set chatid [chat::chatid $xlib [::xmpp::jid::stripResource $jid]] set chatwin [chat::chat_win $chatid] set nick [chat::get_nick $xlib $jid groupchat] $m add command -label [::msgcat::mc "Edit nick color..."] \ -command [list [namespace current]::edit_nick_color $chatwin $nick] } } proc nickcolors::edit_nick_color {chatwin nick} { variable NickColors set new [tk_chooseColor -initialcolor [get_color $nick] \ -title [::msgcat::mc "Edit %s color" $nick]] if {$new == ""} return if {$new != [get_color $nick]} { set NickColors($nick) $new change_options [namespace current]::save_nick_colors } } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/open_chat.tcl000064400000000000000000000031731477701321300171210ustar00nobodynobody# open_chat.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin # which allows user to open new chat window. # Just type "/open jid" and press enter. # Command and JID could be completed in the usual way. proc handle_open_chat {chatid user body type} { if {[string equal -length 6 $body "/open "]} { set user [string range $body 6 end] # What if conference nickname contains "@"? if {[string first "@" $user] >= 0} { chat::open_to_user [chat::get_xlib $chatid] $user } else { chat::open_to_user [chat::get_xlib $chatid] \ [chat::get_jid $chatid]/$user } return stop } } hook::add chat_send_message_hook [namespace current]::handle_open_chat 15 proc roster_completions {chatid compsvar wordstart line} { upvar 0 $compsvar comps if {!$wordstart} { lappend comps {/open } } if {$wordstart && [string equal -length 6 $line "/open "]} { set prefix $::plugins::completion::options(prefix) set suffix $::plugins::completion::options(suffix) set jidcomps {} set xlib [chat::get_xlib $chatid] foreach jid [roster::get_jids $xlib] { if {[roster::itemconfig $xlib $jid -isuser]} { lappend jidcomps $prefix$jid$suffix } } set jidcomps [lsort -dictionary -unique $jidcomps] set comps [concat $comps $jidcomps] debugmsg plugins "COMPLETION from roster: $comps" } } hook::add generate_completions_hook \ [namespace current]::roster_completions 93 # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/open_window.tcl000064400000000000000000000011731477701321300175070ustar00nobodynobody# open_window.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # opens chat tab on incoming message if it's not open already, and # temporarily configures the chatlog window state to normal to help # other plugins with inserting message into it. proc chat_open_window {chatid from type body x} { if {$type eq "info"} { set type chat } chat::open_window $chatid $type -cleanroster 0 set chatw [chat::chat_win $chatid] $chatw configure -state normal } hook::add draw_message_hook [namespace current]::chat_open_window 3 # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/popupmenu.tcl000064400000000000000000000164631477701321300172170ustar00nobodynobody# popupmenu.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin # which creates popup menus in chatlog windows. It adds a few # commands to the menu by itself and runs a hook which allows # other plugins to populate the menu. The current plugin allows # to search selected string in Google (using Ctrl+H shortcut or # from the context menu) and bookmark some messages in the chat # log to return to them using the menu or F2 shortcut. package require http 2 namespace eval popupmenu { hook::add postload_hook [namespace current]::init hook::add open_chat_post_hook [namespace current]::on_open_chat hook::add close_chat_post_hook [namespace current]::on_close_chat } proc popupmenu::init {} { global usetabbar if {$usetabbar} { bind . [list [namespace current]::BookmarkNext .] catch {bind . [list [namespace current]::BookmarkNext .]} bind . [list [namespace current]::BookmarkPrev .] bind . [list [namespace current]::GoogleSelection .] bind . [list [namespace current]::GoogleSelection .] } } proc popupmenu::on_open_chat {chatid type} { global usetabbar set cw [chat::chat_win $chatid] bind $cw <> [list [namespace current]::popup_menu %W %X %Y %x %y] if {!$usetabbar} { set top [winfo toplevel $cw] bind $top [list [namespace current]::BookmarkNext [double% $cw]] catch {bind $top [list [namespace current]::BookmarkNext [double% $cw]]} bind $top [list [namespace current]::BookmarkPrev [double% $cw]] bind $top [list [namespace current]::GoogleSelection [double% $cw]] bind $top [list [namespace current]::GoogleSelection [double% $cw]] } } proc popupmenu::on_close_chat {chatid} { variable bookmark set cw [chat::chat_win $chatid] catch { array unset bookmark $cw,* } } proc popupmenu::popup_menu {W X Y x y} { set m .popup if {[winfo exists $m]} { destroy $m } menu $m -tearoff 0 hook::run chat_win_popup_menu_hook $m $W $X $Y $x $y tk_popup $m $X $Y } proc popupmenu::selection_popup {m W X Y x y} { if {[llength [$W tag ranges sel]] == 0} { set state disabled } else { set state normal } $m add command -label [::msgcat::mc "Copy selection to clipboard"] \ -command [list [namespace current]::CopySelection $W] \ -state $state $m add command -label [::msgcat::mc "Google selection"] -accelerator Ctrl-H \ -command [list [namespace current]::GoogleSelection $W]\ -state $state } hook::add chat_win_popup_menu_hook [namespace current]::popupmenu::selection_popup 20 proc popupmenu::bookmarks_popup {m W X Y x y} { $m add command -label [::msgcat::mc "Set bookmark"] \ -command [list [namespace current]::BookmarkAdd $W $x $y] $m add command -label [::msgcat::mc "Prev bookmark"] -accelerator F2 \ -command [list [namespace current]::BookmarkPrev $W] $m add command -label [::msgcat::mc "Next bookmark"] -accelerator Shift-F2 \ -command [list [namespace current]::BookmarkNext $W] $m add command -label [::msgcat::mc "Clear bookmarks"] \ -command [list [namespace current]::BookmarkClear $W] } hook::add chat_win_popup_menu_hook [namespace current]::popupmenu::bookmarks_popup 80 proc popupmenu::get_chatwin {} { global usetabbar if {!$usetabbar} { return "" } set cw "" foreach chatid [chat::opened] { if {[.nb raise] == [ifacetk::nbpage [chat::winid $chatid]]} { set cw [chat::chat_win $chatid] break } } return $cw } proc popupmenu::BookmarkAdd {cw x y} { variable bookmark $cw mark set AddBookmark "@$x,$y linestart" debugmsg popupmenu "BookmarkAdd at [$cw index AddBookmark]" if {![info exists bookmark($cw,id)]} { set bookmark($cw,id) 0 } $cw configure -state normal $cw image create AddBookmark -image chat/bookmark/red set b [incr bookmark($cw,id)] $cw mark set bookmark$b AddBookmark $cw mark gravity bookmark$b left $cw mark unset AddBookmark $cw configure -state disabled } proc popupmenu::BookmarkNext {cw} { variable bookmark if {$cw == "."} { set cw [get_chatwin] if {$cw == ""} return } if {![info exists bookmark($cw,last)] || \ [catch {$cw index $bookmark($cw,last)}]} { set bookmark($cw,last) 0.0 } if {$bookmark($cw,last) == "end" || \ ((([lindex [$cw yview] 0] == 0) || ([lindex [$cw yview] 1] == 1)) && \ ([$cw dlineinfo [$cw index $bookmark($cw,last)]] == {}))} { set bookmark($cw,last) 0.0 } while {$bookmark($cw,last) != {}} { set bookmark($cw,last) [$cw mark next $bookmark($cw,last)] if {[string match "bookmark*" $bookmark($cw,last)]} { break } } if {$bookmark($cw,last) == {}} { set bookmark($cw,last) end } $cw see $bookmark($cw,last) return $bookmark($cw,last) } proc popupmenu::BookmarkPrev {cw} { variable bookmark if {$cw == "."} { set cw [get_chatwin] if {$cw == ""} return } if {![info exists bookmark($cw,last)] || \ [catch {$cw index $bookmark($cw,last)}]} { set bookmark($cw,last) end } if {$bookmark($cw,last) == "0.0" || \ (([lindex [$cw yview] 1] == 1) && \ ([$cw dlineinfo [$cw index $bookmark($cw,last)]] == {}))} { set bookmark($cw,last) end } while {$bookmark($cw,last) != {}} { set bookmark($cw,last) [$cw mark previous $bookmark($cw,last)] if {[string match "bookmark*" $bookmark($cw,last)]} { break } } if {$bookmark($cw,last) == {}} { set bookmark($cw,last) 0.0 } $cw see $bookmark($cw,last) return $bookmark($cw,last) } proc popupmenu::BookmarkClear {cw} { debugmsg popupmenu "BookmarkClear" set mark 0.0 while {[set mark [$cw mark next $mark]] != {}} { if {[string match "bookmark*" $mark]} { set remove $mark set mark "[$cw index $mark]" BookmarkRemove $cw $remove } } } proc popupmenu::BookmarkRemove {cw mark} { if {$mark in [$cw mark names]} { debugmsg popupmenu "BookmarkRemove $mark" $cw configure -state normal $cw delete "$mark - 1 char" $cw mark unset $mark $cw configure -state disabled } } proc popupmenu::GoogleSelection {cw} { if {$cw == "."} { set cw [get_chatwin] if {$cw == ""} return } set sel [$cw tag ranges sel] if {$sel != ""} { set t [$cw get [lindex $sel 0] [lindex $sel 1]] debugmsg popupmenu "google for $t" browseurl \ http://www.google.com/search?[::http::formatQuery ie UTF-8 oe UTF-8 q $t] } } proc popupmenu::CopySelection {cw} { if {$cw == "."} { set cw [get_chatwin] if {$cw == ""} return } set sel [$cw tag ranges sel] if {$sel != ""} { set t [$cw get [lindex $sel 0] [lindex $sel 1]] debugmsg popupmenu "copy selection $t" clipboard clear -displayof $cw clipboard append -displayof $cw $t } } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/postpone.tcl000064400000000000000000000035541477701321300170330ustar00nobodynobody# postpone.tcl -- # # The "Postpone text" plugin for Tkabber. # # Provides a private hidden text buffer for each chat input window # and a binding to operate with it. # The idea is to provide for quick moving of the text typed into the chat # input window to that buffer, and then moving it back to the input window # with and . # This is helpful when the user types in some elaborate text and realizes she # wants to quickly post another text to the same chat and then continue with # editing. # # Written by Konstantin Khomoutov # Modified by Sergei Golovan namespace eval postpone { variable state event add <> event add <> ::hook::add open_chat_post_hook [namespace current]::setup_bindings } proc postpone::setup_bindings {chatid type} { variable state set w [::chat::input_win $chatid] set state($w,buffer) [list] bind $w +[list [namespace current]::cleanup_text_widget %W] bind $w <> [list [namespace current]::buffer_push %W] bind $w <> +break bind $w <> [list [namespace current]::buffer_pop %W] bind $w <> +break } proc postpone::cleanup_text_widget {w} { variable state array unset state $w,* } proc postpone::buffer_push {w} { variable state if {[$w compare 1.0 == {end - 1 char}]} return ;# empty lappend state($w,buffer) [$w get 1.0 {end - 1 char}] ;# don't get last newline $w delete 1.0 end } proc postpone::buffer_pop {w} { variable state if {[llength $state($w,buffer)] == 0} return set text [lindex $state($w,buffer) end] set state($w,buffer) [lrange $state($w,buffer) 0 end-1] $w insert insert $text } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/send_message.tcl000064400000000000000000000023741477701321300176200ustar00nobodynobody# send_message.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # actually composes the message to send and sends it. Also, it renders # GPG icons for encrypted or signed message proc send_message {chatid user body type} { set xlib [chat::get_xlib $chatid] set jid [chat::get_jid $chatid] set chatw [chat::chat_win $chatid] if {[hook::is_flag chat_send_message_hook send]} { set id [::xmpp::packetID $xlib] set command [list message::send_msg $xlib $jid \ -id $id \ -type $type \ -body $body] if {[info exists ::chat::chats(thread,$chatid)]} { lappend command -thread $::chat::chats(thread,$chatid) } set xlist {} hook::run chat_send_message_xlist_hook xlist \ $chatid $user $id $body $type if {[llength $xlist] > 0} { lappend command -xlist $xlist } lassign [eval $command] status x if {$status == "error"} { return stop } } hook::unset_flag chat_send_message_hook send } hook::add chat_send_message_hook [namespace current]::send_message 90 # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/shuffle.tcl000064400000000000000000000163051477701321300166160ustar00nobodynobody# shuffle.tcl -- # # It's a 1st Aprril joke plugin which shuffles letters in message words. # # Written by Ruslan Rakhmanin # Thanks to Serge Yudin xmpp:bigote@jabber.ru # Disabling it. return namespace eval text_shuffler { variable testing 0 variable nicks_collection variable url_regexp { (^|\s) ([^\w\d]*) ( (?: (?: ftp|https?)://[-\w]+(\.\w[-\w]*)* | (?: [a-z0-9][-a-z0-9]* \. )+ (?: com | edu | biz | gov | in(?:t|fo) | mil | net | org | name | aero | arpa | coop | museum | pro | travel | asia | [a-z][a-z] ) ) (?: : \d+ )? (?: (?: / [^.,?!:;"'<>()\[\]{}\s\x7F-\x9F]* )? (?: [.,?!:;]+ [^.,?!:;"'<>()\[\]{}\s\x7F-\x9F]+ )* )? ) ([^\w\d]*) (\s|$) } } # -------------------------------------------------- # Procedure for collecting nicks in groupchars # Thanks to Alexey Smirnov # -------------------------------------------------- proc text_shuffler::collecting_nicks {xlib jid type x args} { variable nicks_collection if {$type != "available" && $type != "unavailable"} { return } set group [::xmpp::jid::stripResource $jid] set chatid [::chat::chatid $xlib $group] if {[::chat::is_opened $chatid]} { if {[::chat::is_groupchat $chatid]} { if {[::xmpp::jid::resource $jid] == ""} { return } set nick [::chat::get_nick $xlib $jid groupchat] if {[info exists nicks_collection($group)]} { set idx [lsearch -exact $nicks_collection($group) $nick] if {$idx >= 0} { if {$type == "unavailable"} { set nicks_collection($group) \ [lreplace $nicks_collection($group) $idx $idx] } } else { if {$type == "available"} { lappend nicks_collection($group) $nick } } } else { if {$type == "available"} { lappend nicks_collection($group) $nick } } } } } hook::add client_presence_hook \ [namespace current]::text_shuffler::collecting_nicks 99 proc text_shuffler::shuffle_message {chatid user body type} { variable testing set group [chat::get_jid $chatid] set seconds [clock seconds] if {$testing || ([clock format $seconds -format %m/%d] == "04/01" && rand() < 0.05)} { upvar args margs set body [shuffle_text [lindex $margs 2] $group] set margs [lreplace $margs 2 2 $body] } } hook::add chat_send_message_hook \ [namespace current]::text_shuffler::shuffle_message 55 proc text_shuffler::shuffle_text {text {group ""}} { set shtext "" variable url_regexp set at 0 while {1} { set matched [regexp -expanded -nocase -indices \ -start $at -- $url_regexp $text -> _ _ bounds] if {$matched} { lassign $bounds ub ue if {$at != $ub} { append shtext [shuffle_subtext [string range $text $at [expr $ub - 1]] $group] } append shtext [string range $text $ub $ue] set at [expr $ue + 1] } else { append shtext [shuffle_subtext [string range $text $at end] $group] set at [string length $text] } if {$at == [string length $text]} { break } } return $shtext } proc text_shuffler::shuffle_subtext {text_part {group ""}} { variable nicks_collection set nicks "" if {[info exists nicks_collection($group)]} { set nicks $nicks_collection($group) } set tindex [list -1 [string length $text_part]] foreach nick $nicks { set startindex 0 set nicklen [string length $nick] while {[set index [string first $nick $text_part $startindex]] != -1} { set startindex [expr $index + $nicklen] set first 1 for {set i 0} {$i < [llength $tindex]} {incr i} { if {$first} { if {[lindex $tindex $i] >= $index} { set tindex [linsert $tindex $i $index] set first 0 } } else { if {[lindex $tindex $i] <= $index} { set tindex [lreplace $tindex $i $i] incr i -1 } else { set tindex [linsert $tindex $i [expr $index + $nicklen]] break } } } } } set shtext "" set previ 0 foreach {ib ie} $tindex { if {$ie == [llength $tindex]} { incr ie -1 } if {$previ != $ib} { append shtext [string range $text_part $previ $ib] } set previ $ie if {$ib != $ie} { set substring [string range $text_part [expr $ib + 1] [expr $ie - 1]] foreach subpart [regexp -inline -all {[[:alpha:]]+|[^[:alpha:]]} $substring] { if {[regexp {[[:alpha:]]} $subpart]} { set subpart [shuffle_word $subpart] } append shtext $subpart } } } if {$previ != [expr [llength $tindex] - 1]} { append shtext [string range $text_part $previ [expr [llength $tindex] - 1]] } return $shtext } proc text_shuffler::shuffle_word {nick} { set snick $nick if {[string length $snick] > 3} { if {[string length $snick] == 4} { set c1 [string index $snick 1] set c2 [string index $snick 2] set snick [string replace $snick 1 1 $c2] set snick [string replace $snick 2 2 $c1] } elseif {[string length $snick] == 5} { set c3 [string index $snick 3] set c2 [string index $snick 2] set snick [string replace $snick 3 3 $c2] set snick [string replace $snick 2 2 $c3] } elseif {[string length $snick] == 6} { set c3 [string index $snick 3] set c2 [string index $snick 2] set snick [string replace $snick 3 3 $c2] set snick [string replace $snick 2 2 $c3] } else { set ss [string range $snick 2 end-2] set ns "" set count 4 while {[string length $ss] > 1} { set slen [string length $ss] if {$count < $slen} { set slen $count } set n [expr int(rand() * $slen)] append ns [string index $ss $n] set ss [string replace $ss $n $n] if {$count == 0} { set count 4 } else { incr count -1 } } append ns $ss set snick [string replace $snick 2 end-2 $ns] } } return $snick } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/unisymbols.tcl000064400000000000000000000014461477701321300173660ustar00nobodynobody# unisymbols.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # replaces &Ctrl+; by a Unicode symbol with the specified code. namespace eval unisymbols {} proc unisymbols::expand_entity {iw} { set s [$iw get "insert linestart" insert] if {[regexp {.*&(.*)} $s temp e]} { if {$e != "" && [string is xdigit $e]} { $iw delete "insert -[string length $e] char -1c" insert $iw insert insert [format %c 0x$e] } } } proc unisymbols::setup_bindings {chatid type} { set iw [chat::input_win $chatid] bind $iw \ [list [namespace current]::expand_entity %W] } hook::add open_chat_post_hook [namespace current]::unisymbols::setup_bindings # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/chat/update_tab.tcl000064400000000000000000000032601477701321300172660ustar00nobodynobody# update_tab.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # updates tab headers upon receiving chat message. namespace eval update_tab {} proc update_tab::update {chatid from type body x} { set xlib [chat::get_xlib $chatid] set jid [chat::get_jid $chatid] set cw [chat::winid $chatid] foreach xelem $x { ::xmpp::xml::split $xelem tag xmlns attrs cdata subels # Don't update tab if this 'empty' tag is present. It indicates # messages history in chat window. if {[string equal $tag ""] && [string equal $xmlns tkabber:x:nolog]} { return } } if {![catch {::plugins::mucignore::is_ignored $xlib $from $type} ignore] && \ $ignore != ""} { return } switch -- $type { error - info { tab_set_updated $cw 1 $type } groupchat { if {$from == $jid} { tab_set_updated $cw 1 server } else { set myjid [chat::our_jid $chatid] set mynick [chat::get_nick $xlib $myjid $type] if {[check_message $mynick $body]} { tab_set_updated $cw 1 mesg_to_user } else { tab_set_updated $cw 1 message } } } chat - default { if {$from == ""} { # synthesized message tab_set_updated $cw 1 server } else { tab_set_updated $cw 1 mesg_to_user } } } } hook::add draw_message_hook [namespace current]::update_tab::update 8 # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/filetransfer000075500000000000000000000000001477701321300161375ustar00nobodynobodytkabber/plugins/filetransfer/http.tcl000064400000000000000000000262341477701321300177100ustar00nobodynobody# http.tcl -- # # This file is a part of the Tkabber XMPP client. It implements file # transfer via Out of Band Data (XEP-0066). namespace eval http { variable winid 0 variable chunk_size 4096 variable options custom::defgroup HTTP \ [::msgcat::mc "HTTP options."] \ -group {File Transfer} custom::defvar options(port) 0 \ [::msgcat::mc "Port for outgoing HTTP file transfers (0 for assigned\ automatically). This is useful when sending files from\ behind a NAT with a forwarded port."] \ -group HTTP -type integer custom::defvar options(host) "" \ [::msgcat::mc "Force advertising this hostname (or IP address) for\ outgoing HTTP file transfers."] \ -group HTTP -type string } ############################################################################### proc http::send_file {token} { upvar #0 $token state variable options if {![info exists state(fd)]} return #set ip [$f.ip get] #label $f.lip -text [::msgcat::mc "IP address:"] #entry $f.ip -textvariable [list [namespace current]::ip$winid] #variable ip$winid 127.0.0.1 set host 127.0.0.1 if {[string compare $options(host) ""] != 0} { set host $options(host) } else { catch { set host [info hostname] set host [lindex [host_info addresses $host] 0] } if {[::xmpp::ip $state(xlib)] != ""} { set host [::xmpp::ip $state(xlib)] } } set state(host) $host set state(servsock) \ [socket -server \ [list [namespace current]::send_file_accept $token] $options(port)] lassign [fconfigure $state(servsock) -sockname] addr hostname port set url "http://$state(host):$port/[file tail $state(filename)]" ::xmpp::sendIQ $state(xlib) set \ -query [::xmpp::xml::create query \ -xmlns jabber:iq:oob \ -subelement [::xmpp::xml::create url \ -cdata $url] \ -subelement [::xmpp::xml::create desc \ -cdata $state(desc)]] \ -to $state(jid) \ -command [list [namespace current]::send_file_error_handler $token] } ############################################################################### proc http::send_file_error_handler {token res child} { upvar #0 $token state if {![info exists state(fd)]} return if {$res eq "ok"} return eval $state(command) error \ [list [::msgcat::mc "Request failed: %s" [error_to_string $child]]] } ############################################################################### proc http::send_file_accept {token chan addr port} { upvar #0 $token state if {![info exists state(fd)]} return variable chanreadable$chan if {[info exists state(chan)]} { close $chan return } else { set state(chan) $chan } set size $state(size) fconfigure $chan -blocking 0 -translation binary -buffering line fileevent $chan readable [list set [namespace current]::chanreadable$chan 1] set request " " while {$request != ""} { vwait [namespace current]::chanreadable$chan set request [gets $chan] debugmsg filetransfer $request } fileevent $chan readable {} unset chanreadable$chan fconfigure $chan -translation binary puts -nonewline $chan "HTTP/1.0 200 OK\n" puts -nonewline $chan "Content-Length: $size\n" puts -nonewline $chan "Content-Type: application/octet-stream\n\n" fileevent $chan writable \ [list [namespace current]::send_file_transfer_chunk $token $chan] } ############################################################################### proc http::send_file_transfer_chunk {token chan} { upvar #0 $token state variable chunk_size if {![info exists state(fd)]} return set chunk [read $state(fd) $chunk_size] if {$chunk != ""} { if {[catch {puts -nonewline $chan $chunk}]} { eval $state(command) [list error "File transfer failed"] } else { eval $state(command) [list progress [tell $state(fd)]] } } else { eval $state(command) ok } } ############################################################################### proc http::send_file_close {token} { upvar #0 $token state if {![info exists state(fd)]} return catch {close $state(chan)} catch {close $state(servsock)} catch { variable chanreadable$state(chan) unset chanreadable$state(chan) } } ############################################################################### ############################################################################### proc http::recv_file_dialog {from lang urls desc} { variable winid variable result set w .ftrfd$winid while {[winfo exists $w]} { incr winid set w .ftrfd$winid } set url [lindex $urls 0] Dialog $w -title [::msgcat::mc "Receive file from %s" $from] \ -anchor e -transient 0 \ -modal none -default 0 -cancel 1 set f [$w getframe] Label $f.lurl -text [::msgcat::mc "URL:"] Label $f.url -text $url Label $f.ldesc -text [::msgcat::mc "Description:"] Message $f.desc -width 10c -text $desc set dir $::ft::options(download_dir) set fname [file tail $url] Label $f.lsaveas -text [::msgcat::mc "Save as:"] Entry $f.saveas -textvariable [list [namespace current]::saveas$winid] variable saveas$winid [file join $dir $fname] Button $f.browsefile -text [::msgcat::mc "Browse..."] \ -command [list [namespace current]::set_receive_file_name $w $winid $dir $fname] Progressbar $f.pb -variable [list [namespace current]::progress$f.pb] variable progress$f.pb 0 grid $f.lurl -row 0 -column 0 -sticky e grid $f.url -row 0 -column 1 -sticky w -columnspan 2 grid $f.ldesc -row 1 -column 0 -sticky en grid $f.desc -row 1 -column 1 -sticky ewns -columnspan 2 -pady 1m grid $f.lsaveas -row 2 -column 0 -sticky e grid $f.saveas -row 2 -column 1 -sticky ew grid $f.browsefile -row 2 -column 2 -sticky ew grid $f.pb -row 3 -column 0 -sticky ew -columnspan 3 -pady 2m grid columnconfigure $f 1 -weight 1 -minsize 8c grid rowconfigure $f 1 -weight 1 $w add -text [::msgcat::mc "Receive"] \ -command [list [namespace current]::recv_file_start $winid $from $lang $url] $w add -text [::msgcat::mc "Cancel"] \ -command [list destroy $w] bind .ftrfd$winid \ [double% [list [namespace current]::recv_file_cancel $winid $lang]] $w draw vwait [namespace current]::result($winid) set res $result($winid) unset result($winid) incr winid return $res } proc http::set_receive_file_name {w winid dir fname} { variable saveas$winid set file [tk_getSaveFile -parent $w -initialdir $dir -initialfile $fname] if {$file != ""} { set saveas$winid $file } } package require http 2 proc http::recv_file_start {winid from lang url} { variable saveas$winid variable chunk_size variable result variable fds set filename [set saveas$winid] .ftrfd$winid itemconfigure 0 -state disabled set f [.ftrfd$winid getframe] set fd [open $filename w] fconfigure $fd -translation binary set fds($winid) $fd set geturl \ [list ::http::geturl $url -channel $fd \ -blocksize $chunk_size \ -progress [list [namespace current]::recv_file_progress $f.pb] \ -command [list [namespace current]::recv_file_finish $winid $lang]] if {[package vcompare 2.3.3 [package present http]] <= 0} { lappend geturl -binary 1 } if {[catch $geturl token]} { bind .ftrfd$winid {} destroy .ftrfd$winid # TODO: More precise error messages? set result($winid) \ [list error cancel item-not-found \ -text [::trans::trans $lang "File not found"]] after idle [list MessageDlg .ftrecv_error$winid \ -aspect 50000 \ -icon error \ -message [::msgcat::mc \ "Can't receive file: %s" $token] \ -type user \ -buttons ok \ -default 0 \ -cancel 0] } else { bind .ftrfd$winid \ [double% [list [namespace current]::recv_file_cancel $winid $lang $token]] } } proc http::recv_file_progress {pb token total current} { variable progress$pb debugmsg filetransfer "$total $current" $pb configure -maximum $total set progress$pb $current } proc http::recv_file_finish {winid lang token} { variable result variable fds if {[info exists fds($winid)]} { close $fds($winid) unset fds($winid) } upvar #0 $token state debugmsg filetransfer "transfer $state(status) $state(http)" bind .ftrfd$winid {} destroy .ftrfd$winid if {[::http::ncode $token] == 200} { set result($winid) {result {}} } else { # TODO: More precise error messages? set result($winid) \ [list error cancel item-not-found \ -text [::trans::trans $lang "File not found"]] after idle [list MessageDlg .ftrecv_error$winid \ -aspect 50000 \ -icon error \ -message [::msgcat::mc \ "Can't receive file: %s" [::http::code $token]] \ -type user \ -buttons ok \ -default 0 \ -cancel 0] } } proc http::recv_file_cancel {winid lang {token ""}} { variable result variable fds if {[info exists fds($winid)]} { close $fds($winid) unset fds($winid) } bind .ftrfd$winid {} if {$token ne ""} { ::http::reset $token cancelled } set result($winid) \ [list error cancel not-allowed \ -text [::trans::trans $lang "File transfer is refused"]] } ############################################################################### proc http::iq_handler {xlib from child args} { ::xmpp::xml::split $child tag xmlns attrs cdata subels set urls "" set desc "" foreach child $subels { ::xmpp::xml::split $child stag sxmlns sattrs scdata ssubels switch -- $stag { url {lappend urls $scdata} desc {set desc $scdata} } } set lang [::xmpp::xml::getAttr $args -lang en] return [recv_file_dialog $from $lang $urls $desc] } ::xmpp::iq::register set query jabber:iq:oob \ [namespace current]::http::iq_handler ############################################################################### ft::register_protocol http \ -priority 30 \ -label "HTTP" \ -send [namespace current]::http::send_file \ -close [namespace current]::http::send_file_close # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/filetransfer/si.tcl000064400000000000000000000241301477701321300173350ustar00nobodynobody# si.tcl -- # # File transfer via Stream Initiation (XEP-0096) namespace eval si { variable winid 0 variable chunk_size 1024 variable options custom::defgroup {Stream Initiation} \ [::msgcat::mc "Stream initiation options."] \ -group {File Transfer} set ::NS(file-transfer) http://jabber.org/protocol/si/profile/file-transfer disco::register_feature $::NS(file-transfer) } ############################################################################### proc si::send_file {token} { upvar #0 $token state variable chunk_size if {![info exists state(fd)]} return set state(stream) [si::newout $state(xlib) $state(jid)] set profile [::xmpp::xml::create file \ -xmlns $::NS(file-transfer) \ -attrs [list name $state(name) \ size $state(size)] \ -subelement [::xmpp::xml::create desc \ -cdata $state(desc)]] si::connect $state(stream) $chunk_size application/octet-stream \ $::NS(file-transfer) $profile \ [list [namespace current]::send_file_result $token] } ############################################################################### proc si::send_file_result {token res} { upvar #0 $token state if {![info exists state(fd)]} return if {![lindex $res 0]} { eval $state(command) \ [list error \ [::msgcat::mc "Request failed: %s" [lindex $res 1]]] return } set_status [::msgcat::mc "Transferring..."] after idle [list [namespace current]::send_chunk $token] } proc si::send_chunk {token} { upvar #0 $token state variable chunk_size if {![info exists state(fd)]} return set chunk [read $state(fd) $chunk_size] if {$chunk != ""} { si::send_data $state(stream) $chunk \ [list [namespace current]::send_chunk_response $token] } else { eval $state(command) ok } } proc si::send_chunk_response {token res} { upvar #0 $token state if {![info exists state(fd)]} return if {![lindex $res 0]} { eval $state(command) \ [list error \ [::msgcat::mc "Transfer failed: %s" [lindex $res 1]]] return } eval $state(command) [list progress [tell $state(fd)]] after idle [list [namespace current]::send_chunk $token] } ############################################################################### proc si::send_file_close {token} { upvar #0 $token state if {![info exists state(stream)]} return catch {si::close $state(stream)} catch {si::freeout $state(stream)} } ############################################################################### ############################################################################### proc si::recv_file_dialog {xlib from lang id name size date hash desc command} { variable winid set token [namespace current]::[incr winid] upvar #0 $token state set w .rfd$winid set state(w) $w set state(xlib) $xlib set state(jid) $from set state(lang) $lang set state(id) $id Dialog $w -title [::msgcat::mc "Receive file from %s" $from] \ -anchor e -transient 0 \ -modal none -default 0 -cancel 1 set f [$w getframe] Label $f.lname -text [::msgcat::mc "Name:"] Label $f.name -text $name Label $f.lsize -text [::msgcat::mc "Size:"] Label $f.size -text $size Label $f.ldesc -text [::msgcat::mc "Description:"] Message $f.desc -width 10c -text $desc set dir $::ft::options(download_dir) Label $f.lsaveas -text [::msgcat::mc "Save as:"] Entry $f.saveas -textvariable ${token}(filename) set state(f) $f set state(size) $size set state(dir) $dir set state(name) $name set state(filename) [file join $dir $name] Button $f.browsefile -text [::msgcat::mc "Browse..."] \ -command [list [namespace current]::set_receive_file_name $token $w] set state(progress) 0 # Working around a bug in ProgressBar: # crash when setting PB variable while -maximum is 0: if {$size > 0} { Progressbar $f.pb -variable ${token}(progress) $f.pb configure -maximum $size grid $f.pb -row 5 -column 0 -sticky ew -columnspan 3 -pady 2m } # grid row 0 is used for displaying error messages grid $f.lname -row 1 -column 0 -sticky e grid $f.name -row 1 -column 1 -sticky w grid $f.lsize -row 2 -column 0 -sticky e grid $f.size -row 2 -column 1 -sticky w grid $f.ldesc -row 3 -column 0 -sticky en grid $f.desc -row 3 -column 1 -sticky ewns -columnspan 2 -pady 1m grid $f.lsaveas -row 4 -column 0 -sticky e grid $f.saveas -row 4 -column 1 -sticky ew grid $f.browsefile -row 4 -column 2 -sticky ew grid columnconfigure $f 1 -weight 1 -minsize 8c grid rowconfigure $f 3 -weight 1 $w add -text [::msgcat::mc "Receive"] -command \ [namespace code [list recv_file_start $token $w $command]] $w add -text [::msgcat::mc "Cancel"] -command \ [namespace code [list recv_file_cancel $token $w $command]] bind $w \ [double% [namespace code [list recv_file_cancel $token $w $command]]] $w draw return } proc si::set_receive_file_name {token w} { upvar #0 $token state set file [tk_getSaveFile -initialdir $state(dir) \ -initialfile $state(name) \ -parent $w] if {$file != ""} { set state(filename) $file } } ############################################################################### proc si::recv_file_cancel {token w command} { upvar #0 $token state bind $w {} destroy $w eval $command \ [list error \ [::xmpp::stanzaerror::error cancel not-allowed \ -text [::trans::trans $state(lang) \ "File transfer is refused"]]] return } ############################################################################### proc si::recv_file_start {token w command} { upvar #0 $token state ft::hide_error_msg $state(f) if {[catch {open $state(filename) w} fd]} { ft::report_cannot_open_file $state(f) $state(filename) \ [ft::get_POSIX_error_desc] return } fconfigure $fd -translation binary $state(w) itemconfigure 0 -state disabled $state(w) itemconfigure 1 -command [namespace code [list recv_file_close $token $w %W]] bind $w [namespace code [list recv_file_close [double% $token] [double% $w] %W]] if {[catch {si::newin $state(xlib) $state(jid) $state(id)} stream]} { # Return error to the sender but leave transfer window with disabled # 'Receive' button and error message. eval $command \ [list error [::xmpp::stanzaerror::error modify bad-request \ -text [::trans::trans $state(lang) \ "Stream ID is in use"]]] ft::report_error $state(f) \ [::msgcat::mc "Receive error: Stream ID is in use"] return } set state(stream) $stream set state(fd) $fd si::set_readable_handler \ $stream [list [namespace current]::recv_file_chunk $token] si::set_closed_handler \ $stream [list [namespace current]::closed $token] eval $command [list ok {}] return } ############################################################################### proc si::recv_file_chunk {token stream} { upvar #0 $token state if {![info exists state(w)] || ![winfo exists $state(w)]} {return 0} if {![info exists state(stream)] || !($state(stream) == $stream)} {return 0} set fd $state(fd) set filename $state(filename) set data [si::read_data $stream] debugmsg filetransfer "RECV into $filename data $data" puts -nonewline $fd $data set state(progress) [tell $fd] return 1 } ############################################################################### proc si::closed {token stream} { upvar #0 $token state if {![info exists state(w)] || ![winfo exists $state(w)]} {return 0} if {![info exists state(stream)] || !($state(stream) == $stream)} {return 0} debugmsg filetransfer "CLOSE" destroy $state(w) } ############################################################################### proc si::recv_file_close {token w1 w2} { upvar #0 $token state if {$w1 != $w2} return catch {close $state(fd)} catch {si::freein $state(stream)} catch {unset $token} } ############################################################################### ############################################################################### proc si::si_handler {xlib from lang id mimetype child command} { debugmsg filetransfer "SI set: [list $from $child]" ::xmpp::xml::split $child tag xmlns attrs cdata subels if {$tag == "file"} { set desc "" foreach item $subels { ::xmpp::xml::split $item stag sxmlns sattrs scdata ssubels switch -- $stag { desc {set desc $scdata} } } return [recv_file_dialog \ $xlib \ $from \ $lang \ $id \ [::xmpp::xml::getAttr $attrs name] \ [::xmpp::xml::getAttr $attrs size] \ [::xmpp::xml::getAttr $attrs date] \ [::xmpp::xml::getAttr $attrs hash] \ $desc \ $command] } else { return [list error modify bad-request] } } si::register_profile $::NS(file-transfer) [namespace current]::si::si_handler ############################################################################### ft::register_protocol si \ -priority 10 \ -label "Stream Initiation" \ -send [namespace current]::si::send_file \ -close [namespace current]::si::send_file_close # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/general000075500000000000000000000000001477701321300150705ustar00nobodynobodytkabber/plugins/general/autoaway.tcl000064400000000000000000000116511477701321300175110ustar00nobodynobody# autoaway.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugind which # switches Tkabber status to away or xa after a specified period of # inactivity. namespace eval autoaway { variable idletime if {[catch {tk inactive} idletime] || $idletime < 0} { return } custom::defgroup AutoAway \ [::msgcat::mc "Options for module that automatically marks\ you as away after idle threshold."] \ -group Tkabber custom::defvar options(awaytime) 5 \ [::msgcat::mc "Idle threshold in minutes after that\ Tkabber marks you as away."] \ -group AutoAway -type integer custom::defvar options(xatime) 15 \ [::msgcat::mc "Idle threshold in minutes after that\ Tkabber marks you as extended away."] \ -group AutoAway -type integer custom::defvar options(status) \ [::msgcat::mc "Automatically away due to idle"] \ [::msgcat::mc "Text status, which is set when\ Tkabber is moving to away state."] \ -group AutoAway -type string custom::defvar options(drop_priority) 1 \ [::msgcat::mc "Set priority to 0 when moving to extended away state."] \ -group AutoAway -type boolean custom::defvar savepriority 0 [::msgcat::mc "Stored user priority while she's away."] \ -type integer -group Hidden custom::defvar savestatus "" [::msgcat::mc "Stored user status while she's away."] \ -type string -group Hidden custom::defvar savetext "" [::msgcat::mc "Stored user text status while she's away."] \ -type string -group Hidden hook::add finload_hook [namespace current]::after_idle hook::add quit_hook [namespace current]::after_idle_cancel 10 } proc autoaway::after_idle {args} { after_idle_cancel after_idle_aux if {$::aquaP} { set msec 1000 } else { set msec 250 } after $msec [namespace current]::after_idle } proc autoaway::after_idle_cancel {args} { variable options variable savestatus variable savetext variable savepriority global userstatus textstatus userpriority if {[connections] == {}} { if {$savestatus ne ""} { if {$options(drop_priority) && $userpriority >= 0} { set userpriority $savepriority } set savepriority 0 set textstatus $savetext set savetext "" set userstatus $savestatus set savestatus "" } after cancel [namespace current]::after_idle } } proc autoaway::after_idle_aux {} { variable options variable savestatus variable savetext variable savepriority global userstatus textstatus userpriority if {$options(awaytime) <= 0 && $options(xatime) <= 0} { return } if {[catch {tk inactive} idletime] || $idletime < 0} { return } if {$idletime < $options(awaytime)*60*1000} { if {$savestatus ne ""} { if {$options(drop_priority) && $userpriority >= 0} { set userpriority $savepriority } set savepriority 0 set textstatus $savetext set savetext "" set userstatus $savestatus set savestatus "" set_status [::msgcat::mc "Returning from auto-away"] } return } switch -- $userstatus { available - chat { set savestatus $userstatus set savetext $textstatus set savepriority $userpriority if {$options(status) ne ""} { set textstatus $options(status) } if {$idletime >= $options(xatime)*60*1000} { if {$options(drop_priority) && $userpriority >= 0} { set userpriority 0 } set userstatus xa set_status [::msgcat::mc "Moving to extended away"] } else { set userstatus away set_status [::msgcat::mc "Starting auto-away"] } return } away { if {$savestatus ne "" && $idletime >= $options(xatime)*60*1000} { set savepriority $userpriority if {$options(status) ne ""} { set textstatus $options(status) } if {$options(drop_priority) && $userpriority >= 0} { set userpriority 0 } set userstatus xa set_status [::msgcat::mc "Moving to extended away"] return } } default { } } if {$savestatus ne ""} { set_status [::msgcat::mc "Idle for %s" [format_time [expr {$idletime/1000}]]] } } proc autoaway::set_status {status} { if {[llength [connections]] > 0} { ::set_status $status } } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/general/avatars.tcl000064400000000000000000000166441477701321300173270ustar00nobodynobody# avatars.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin # which implements a historical IQ-Based Avatars (XEP-0008) protocol. package require base64 package require sha1 namespace eval ::avatar { variable options set options(announce) 0 set options(share) 0 } ############################################################################## proc ::avatar::setup_menu {} { catch { #set m [.mainframe getmenu services] #for {set ind [$m index end]} {$ind > 0} {incr ind -1} { # if {[$m type $ind] == "separator"} { # break # } #} set m [.mainframe getmenu plugins] set mm .avatar_menu menu $mm -tearoff $::ifacetk::options(show_tearoffs) $mm add checkbutton -label [::msgcat::mc "Announce"] \ -variable avatar::options(announce) $mm add checkbutton -label [::msgcat::mc "Allow downloading"] \ -variable avatar::options(share) $mm add command -label [::msgcat::mc "Send to server"] \ -command {avatar::store_on_server} $m add cascade -label [::msgcat::mc "Avatar"] \ -menu $mm } } hook::add finload_hook ::avatar::setup_menu ############################################################################## proc ::avatar::load_file {filename} { variable avatar variable options create_image user_avatar -file $filename set f [open $filename] fconfigure $f -translation binary set data [read $f] close $f set avatar(userhash) [sha1::sha1 $data] set avatar(userdata) [base64::encode $data] set options(announce) 1 set options(share) 1 } ############################################################################## proc ::avatar::get_presence_x {varname xlib status} { variable avatar variable options upvar 2 $varname var if {$options(announce) && [info exists avatar(userhash)]} { lappend var [::xmpp::xml::create x \ -xmlns $::NS(xavatar) \ -subelement [::xmpp::xml::create hash \ -cdata $avatar(userhash)]] } return } hook::add presence_xlist_hook ::avatar::get_presence_x ############################################################################## proc ::avatar::process_presence {xlib from type x args} { switch -- $type { available - unavailable { foreach xs $x { ::xmpp::xml::split $xs tag xmlns attrs cdata subels if {$xmlns == $::NS(xavatar)} { set_hash $xlib $from $subels break } } } } } hook::add client_presence_hook ::avatar::process_presence ############################################################################## proc ::avatar::insert_userinfo {tab xlib jid editable} { if {$editable} return set avatar_img [get_image $xlib [get_jid_of_user $xlib $jid]] if {$avatar_img != ""} { set avatar [$tab insert end avatar -text [::msgcat::mc "Avatar"]] set av [userinfo::pack_frame $avatar.avatar [::msgcat::mc "Avatar"]] Label $av.a -image $avatar_img pack $av.a -expand yes -fill both } } hook::add userinfo_hook ::avatar::insert_userinfo 40 ############################################################################## proc ::avatar::set_hash {xlib jid children} { variable avatar debugmsg avatar "set hash $xlib $jid $children" foreach child $children { ::xmpp::xml::split $child tag xmlns attrs cdata subels if {$tag == "hash"} { set hash $cdata } } if {[info exists hash]} { if {![info exists avatar(hash,$xlib,$jid)] || \ $hash != $avatar(hash,$xlib,$jid)} { set avatar(hash,$xlib,$jid) $hash set avatar(needupdate,$xlib,$jid) 1 } } } ############################################################################## proc ::avatar::get_image {xlib jid} { variable avatar debugmsg avatar "$jid; [array name avatar]" if {[info exists avatar(hash,$xlib,$jid)]} { if {![info exists avatar(data,$xlib,$jid)]} { image create photo avatar$xlib@$jid get $xlib $jid } elseif {$avatar(needupdate,$xlib,$jid)} { get $xlib $jid } return avatar$xlib@$jid } else { return "" } } ############################################################################## proc ::avatar::get {xlib jid} { variable avatar set avatar(needupdate,$xlib,$jid) 0 ::xmpp::sendIQ $xlib get \ -query [::xmpp::xml::create query \ -xmlns $::NS(iqavatar)] \ -to $jid -command [list avatar::recv $xlib $jid] } proc ::avatar::recv {xlib jid res child} { variable avatar if {![string equal $res ok]} { ::xmpp::sendIQ $xlib get \ -query [::xmpp::xml::create query \ -xmlns storage:client:avatar] \ -to [::xmpp::jid::stripResource $jid] \ -command [list avatar::recv_from_serv $xlib $jid] return } ::xmpp::xml::split $child tag xmlns attrs cdata subels foreach subel $subels { ::xmpp::xml::split $subel stag sxmlns sattrs scdata ssubels if {$stag == "data"} { catch { set avatar(data,$xlib,$jid) [base64::decode $scdata] create_image avatar$xlib@$jid -data $avatar(data,$xlib,$jid) } } } } proc ::avatar::recv_from_serv {xlib jid res child} { variable avatar if {![string equal $res ok]} { # TODO return } ::xmpp::xml::split $child tag xmlns attrs cdata subels foreach subel $subels { ::xmpp::xml::split $subel stag sxmlns sattrs scdata ssubels if {$stag == "data"} { catch { set avatar(data,$xlib,$jid) [base64::decode $scdata] avatar$xlib@$jid put $scdata } } } } ############################################################################## proc ::avatar::store_on_server {{xlib ""}} { variable avatar if {[llength [connections]] == 0} return if {$xlib == ""} { set xlib [lindex [connections] 0] } if {![info exists avatar(userdata)]} { MessageDlg .avatar_error -aspect 50000 -icon error \ -message [::msgcat::mc "No avatar to store"] -type user \ -buttons ok -default 0 -cancel 0 return } ::xmpp::sendIQ $xlib set \ -query [::xmpp::xml::create query \ -xmlns storage:client:avatar \ -subelement [::xmpp::xml::create data \ -cdata $avatar(userdata)]] } ############################################################################## proc ::avatar::iq_reply {xlib from child args} { variable avatar variable options if {$options(share) && [info exists avatar(userdata)]} { set res [::xmpp::xml::create query \ -xmlns $::NS(iqavatar) \ -subelement [::xmpp::xml::create data \ -cdata $avatar(userdata)]] return [list result $res] } else { return [list error cancel service-unavailable] } } ::xmpp::iq::register get query $::NS(iqavatar) ::avatar::iq_reply # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/general/bob.tcl000064400000000000000000000017401477701321300164170ustar00nobodynobody# bob.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # searches for the Bits-of-Binary data in the received messages, IQs # and presence updates (XEP-0231). package require xmpp::bob namespace eval bob { hook::add process_message_hook [namespace current]::find_bob_in_message 1 hook::add client_presence_hook [namespace current]::find_bob_in_presence 1 hook::add client_iq_hook [namespace current]::find_bob_in_iq 1 } proc bob::find_bob_in_message {xlib from id type is_subject subject body err thread priority x} { ::xmpp::bob::cache $x } proc bob::find_bob_in_presence {xlib from type x args} { ::xmpp::bob::cache $x } proc bob::find_bob_in_iq {xlib from type queries args} { if {[string equal $type error]} return foreach xml $queries { ::xmpp::xml::split $xml tag xmlns attrs cdata subels ::xmpp::bob::cache $subels } } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/general/caps.tcl000064400000000000000000000164201477701321300166040ustar00nobodynobody# caps.tcl -- # # Entity capabilities support (XEP-0115) package require sha1 package require md5 package require base64 namespace eval caps { set ::NS(caps) http://jabber.org/protocol/caps variable caps_node "" custom::defgroup Plugins \ [::msgcat::mc "Plugins options."] \ -group Tkabber custom::defgroup Caps \ [::msgcat::mc "Options for entity capabilities plugin."] \ -group Plugins custom::defvar options(enable) 1 \ [::msgcat::mc "Enable announcing entity capabilities in\ every outgoing presence."] \ -group Caps -type boolean custom::defvar options(hash) sha-1 \ [::msgcat::mc "Use the specified function to hash supported\ features list."] \ -group Caps -type options -values {md5 MD5 sha-1 SHA-1} } proc caps::hash {identities features extras hash} { debugmsg caps "$identities; $features; $extras; $hash" set binidentities {} foreach id $identities { set category [::xmpp::xml::getAttr $id category] set type [::xmpp::xml::getAttr $id type] set lang [::xmpp::xml::getAttr $id xml:lang] set name [::xmpp::xml::getAttr $id name] lappend binidentities [encoding convertto utf-8 $category/$type/$lang/$name] } set binfeatures {} foreach fe $features { lappend binfeatures [encoding convertto utf-8 $fe] } set binextra {} foreach eform $extras { set bineform {} foreach {etag extra} $eform { lassign $extra var type label values switch -- $var/$type { FORM_TYPE/hidden { set form_type [encoding convertto utf-8 [lindex $values 0]] } default { set binex {} foreach val $values { lappend binex [encoding convertto utf-8 $val] } lappend bineform \ [linsert [lsort -ascii $binex] 0 \ [encoding convertto utf-8 $var]] } } } set bineform1 {} foreach ex [lsort -ascii -index 0 $bineform] { lappend bineform1 [join $ex "<"] } lappend binextra [linsert $bineform1 0 $form_type] } set binextra1 {} foreach b [lsort -ascii -index 0 $binextra] { lappend binextra1 [join $b "<"] } debugmsg caps "$binidentities; $binfeatures; $binextra1" set binstr [join [concat [lsort -ascii $binidentities] \ [lsort -ascii $binfeatures] \ $binextra1] "<"] debugmsg caps "$binstr" if {[string equal $binstr ""]} { return "" } append binstr "<" switch -- $hash { md5 { if {[catch {::md5::md5 -hex $binstr} hex]} { # Old md5 package. set hex [::md5::md5 $binstr] } set binhash [binary format H32 $hex] } sha-1 { set binhash [binary format H40 [::sha1::sha1 $binstr]] } default { # Unsupported hash type return "" } } return [base64::encode $binhash] } proc caps::get_presence_x {varname xlib status} { variable options variable caps_node upvar 2 $varname var if {!$options(enable)} return lassign [disco::info_query_get_handler $xlib "" "" en] \ status identities features extras debugmsg caps "$status; $identities; $features; $extras" if {![string equal $status result]} return set ver [hash $identities $features $extras $options(hash)] if {[string equal $ver ""]} return lappend var [::xmpp::xml::create c \ -xmlns $::NS(caps) \ -attrs [list hash $options(hash) \ node http://tkabber.jabber.ru/ \ ver $ver]] set caps_node http://tkabber.jabber.ru/#$ver debugmsg caps "$caps_node" return } hook::add presence_xlist_hook [namespace current]::caps::get_presence_x proc caps::disco_reply {varname type node xlib from lang} { variable caps_node upvar 2 $varname res if {$type != "info" || $node != $caps_node} return set res [disco::info_query_get_handler $xlib "" "" en] return stop } hook::add disco_node_reply_hook [namespace current]::caps::disco_reply # TODO match caps hash to a set of features proc caps::process_presence {xlib from type x args} { variable htype variable hnode variable hver switch -- $type { unavailable { catch {unset htype($xlib,$from)} catch {unset hnode($xlib,$from)} catch {unset hver($xlib,$from)} } available { foreach xs $x { ::xmpp::xml::split $xs tag xmlns attrs cdata subels if {[string equal $xmlns $::NS(caps)]} { set htype($xlib,$from) [::xmpp::xml::getAttr $attrs hash] set hnode($xlib,$from) [::xmpp::xml::getAttr $attrs node] set hver($xlib,$from) [::xmpp::xml::getAttr $attrs ver] return } } # Unset caps if they aren't included in catch {unset htype($xlib,$from)} catch {unset hnode($xlib,$from)} catch {unset hver($xlib,$from)} } } } hook::add client_presence_hook [namespace current]::caps::process_presence proc caps::clean {xlib} { variable htype variable hnode variable hver array unset htype $xlib,* array unset hnode $xlib,* array unset hver $xlib,* } hook::add disconnected_hook [namespace current]::caps::clean proc caps::request_info {xlib jid} { variable hnode variable hver if {![info exists hver($xlib,$jid)] || ![info exists hnode($xlib,$jid)]} { after idle [namespace code [list info_receive $xlib $jid error {} {} {}]] return } ::disco::request_info $xlib $jid \ -node $hnode($xlib,$jid)#$hver($xlib,$jid) \ -cache yes \ -command [namespace code [list info_receive $xlib $jid]] } proc caps::info_receive {xlib jid status identities features extras} { variable hidentities variable hfeatures variable htype variable hnode variable hver debugmsg caps "$xlib; $jid; $status; $identities; $features; $extras" if {![string equal $status ok]} return if {![info exists hver($xlib,$jid)] || ![info exists htype($xlib,$jid)]} return if {[string equal $htype($xlib,$jid) ""]} { debugmsg caps "Legacy caps ver $hver($xlib,$jid) for $jid" # TODO: legacy caps support } else { set hash [hash $identities $features $extras $htype($xlib,$jid)] if {![string equal $hash $hver($xlib,$jid)]} { debugmsg caps "Mismatched caps ver for $jid, expected $hver($xlib,$jid), calculated $hash" # TODO: Treat mismatched ver as legacy one return } debugmsg caps "Caps ver $hash for $jid matches its disco#info" set hidentities($htype($xlib,$jid),$hver($xlib,$jid)) $identities set hfeatures($htype($xlib,$jid),$hver($xlib,$jid)) $features } } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/general/captcha.tcl000064400000000000000000000033551477701321300172640ustar00nobodynobody# captcha.tcl -- # # CAPTCHA Forms support (XEP-0158) namespace eval captcha { hook::add message_process_x_hook [namespace current]::process_x 10 } ############################################################################### proc captcha::process_x {rowvar bodyvar f x xlib from id type replyP} { upvar 2 $rowvar row upvar 2 $bodyvar body set captcha 0 foreach xa $x { ::xmpp::xml::split $xa tag xmlns attrs cdata subels if {![string equal $xmlns urn:xmpp:captcha]} { continue } set captcha 1 lassign [::xmpp::data::findForm $subels] type form if {[string equal $type form]} { if {[catch {process_x_data $f $xlib $from $form}]} { # Cannot process CAPTCHA form, so falling back to a # legacy CAPTCHA method if any. # TODO: Show error message to user. set captcha 0 } } } if {!$captcha} { return } else { set body "" return -code break } } proc captcha::process_x_data {f xlib from x} { data::draw_window [list $x] \ [namespace code [list send_x_data $xlib $from]] \ -title [::msgcat::mc "CAPTCHA from %s" $from] } proc captcha::send_x_data {xlib to w restags} { ::xmpp::sendIQ $xlib set \ -query [::xmpp::xml::create captcha \ -xmlns urn:xmpp:captcha \ -subelements $restags] \ -to $to \ -command [list [namespace current]::result $xlib $to] destroy $w } proc captcha::result {xlib to status xml} { # TODO } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/general/clientinfo.tcl000064400000000000000000000051701477701321300200100ustar00nobodynobody# clientinfo.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # asks any user which precence packet is just received for his/her # client version. namespace eval clientinfo { custom::defgroup ClientInfo \ [::msgcat::mc "Options for Client Info module, which allows you to\ automatically retrieve client names and versions for\ contacts in your roster."] \ -group Plugins \ -tag "Client Info" custom::defvar options(autoask) 0 \ [::msgcat::mc "Use this module"] -group ClientInfo -type boolean } # TODO: xlib proc clientinfo::add_user_popup_info {infovar xlib jid} { variable users upvar 0 $infovar info if {[info exists ::userinfo::userinfo(fn,$jid)] && \ $::userinfo::userinfo(fn,$jid) != ""} { append info [::msgcat::mc "\n\tName: %s" \ $::userinfo::userinfo(fn,$jid)] } elseif {[info exists ::userinfo::userinfo(name,$jid)] && \ $::userinfo::userinfo(name,$jid) != ""} { append info [::msgcat::mc "\n\tName: %s" \ $::userinfo::userinfo(name,$jid)] if {[info exists ::userinfo::userinfo(family,$jid)] && \ $::userinfo::userinfo(family,$jid) != ""} { append info " $::userinfo::userinfo(family,$jid)" } } if {[info exists ::userinfo::userinfo(clientname,$jid)] && \ $::userinfo::userinfo(clientname,$jid) != ""} { append info [::msgcat::mc "\n\tClient: %s" \ $::userinfo::userinfo(clientname,$jid)] if {[info exists ::userinfo::userinfo(clientversion,$jid)]} { append info " $::userinfo::userinfo(clientversion,$jid)" } } if {[info exists ::userinfo::userinfo(os,$jid)] && \ $::userinfo::userinfo(os,$jid) != ""} { append info [::msgcat::mc "\n\tOS: %s" \ $::userinfo::userinfo(os,$jid)] } } hook::add roster_user_popup_info_hook \ [namespace current]::clientinfo::add_user_popup_info proc clientinfo::on_presence {xlib from type x args} { variable options variable asked if {!$options(autoask)} return switch -- $type { available { if {![info exists ::userinfo::userinfo(clientname,$from)] && \ ![info exists asked($from)]} { set asked($from) "" userinfo::request_iq version $xlib $from } } } } hook::add client_presence_hook \ [namespace current]::clientinfo::on_presence # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/general/comm.tcl000064400000000000000000000063361477701321300166160ustar00nobodynobody# comm.tcl -- # # Remote control via comm module. package require comm namespace eval comm { # Cleanup stale comm files variable filename variable fd variable id variable cookie foreach filename [glob -nocomplain -directory $::configdir comm.*] { set fd [open $filename] lassign [read $fd] id cookie close $fd if {[catch {::comm::comm send -async \ $id ::plugins::comm::eval_command list-commands}]} { file delete -force -- $filename } } set cookie [rand 1000000000][rand 1000000000][rand 1000000000] variable cookieFile [file join $::configdir comm.[pid]] file delete -force -- $cookieFile set fd [open $cookieFile w] puts $fd [list [::comm::comm self] $cookie] close $fd unset fd catch {file attributes $cookieFile -permissions 0600} hook::add quit_hook [namespace current]::cleanup 1 ::comm::comm hook incoming "[namespace current]::checkpass \$fid" rename ::comm::commIncoming ::comm::commIncoming:orig proc ::comm::commIncoming {args} { if {![catch {eval ::comm::commIncoming:orig $args} res]} { return $res } else { return } } } proc comm::cleanup {} { variable cookieFile file delete -force -- $cookieFile } proc comm::checkpass {fid} { variable wait variable cookie set blocking [fconfigure $fid -blocking] fconfigure $fid -blocking 0 fileevent $fid readable [namespace code [list getpass $fid]] after 2000 [list set [namespace current]::wait($fid) ""] vwait [namespace current]::wait($fid) set ans $wait($fid) unset wait($fid) fconfigure $fid -blocking $blocking if {$ans != $cookie} { return -code error "Incorrect cookie" } } proc comm::getpass {fid} { variable wait if {[gets $fid line] >= 0} { set wait($fid) $line } } proc comm::eval_script {script} { set status [catch {eval {uplevel #0} $script} res] return [list $status $res] } proc comm::register_command {command proc arguments} { variable commands set commands($command) [list $proc $arguments] } proc comm::unregister_command {command} { variable commands catch {unset commands($command)} } proc comm::eval_command {arglist} { variable commands set arglist [lassign $arglist command] if {![info exists commands($command)]} { return [list 1 [format "Command %s not found" $command]] } else { set status [catch {uplevel #0 [lindex $commands($command) 0] $arglist} res] return [list $status $res] } } proc comm::list_commands {} { variable commands set res {} foreach command [lsort -dictionary [array names commands]] { lappend res "$command [lindex $commands($command) 1]" } return [join $res \n] } comm::register_command list-commands [namespace current]::comm::list_commands "" proc comm::set_status {status {text \u0000}} { global userstatus global textstatus if {$text != "\u0000"} { set textstatus $text } set userstatus $status } comm::register_command set-status [namespace current]::comm::set_status "status ?textstatus?" # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/general/copy_jid.tcl000064400000000000000000000032261477701321300174560ustar00nobodynobody# copy_jid.tcl -- # # Copy JID to clipboard. namespace eval copy_jid {} proc copy_jid::copy {m jid} { clipboard clear -displayof $m clipboard append -displayof $m $jid } proc copy_jid::add_menu_item {m xlib jid} { $m add command \ -label [::msgcat::mc "Copy JID to clipboard"] \ -command [list [namespace current]::copy $m $jid] } proc copy_jid::add_muc_menu_item {m xlib jid} { set real_jid [::muc::get_real_jid $xlib $jid] if {$real_jid != ""} { $m add command \ -label [::msgcat::mc "Copy real JID to clipboard"] \ -command [list [namespace current]::copy $m $real_jid] } else { $m add command \ -label [::msgcat::mc "Copy real JID to clipboard"] \ -state disabled } } hook::add roster_create_groupchat_user_menu_hook \ [namespace current]::copy_jid::add_menu_item 44 hook::add roster_create_groupchat_user_menu_hook \ [namespace current]::copy_jid::add_muc_menu_item 44.5 hook::add chat_create_user_menu_hook \ [namespace current]::copy_jid::add_menu_item 44 hook::add chat_create_conference_menu_hook \ [namespace current]::copy_jid::add_menu_item 44 hook::add roster_jid_popup_menu_hook \ [namespace current]::copy_jid::add_menu_item 44 hook::add roster_conference_popup_menu_hook \ [namespace current]::copy_jid::add_menu_item 44 hook::add roster_service_popup_menu_hook \ [namespace current]::copy_jid::add_menu_item 44 hook::add message_dialog_menu_hook \ [namespace current]::copy_jid::add_menu_item 44 hook::add search_popup_menu_hook \ [namespace current]::copy_jid::add_menu_item 44 # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/general/disco.tcl000064400000000000000000000724031477701321300167620ustar00nobodynobody# disco.tcl -- # # This file is a part of the Tkabber XMPP client. It implements an # interface part for the Service Discovery mechanism (XEP-0030). option add *JDisco.fill $::defaultforeground widgetDefault if {$::darktheme} { option add *JDisco.featurecolor LightSteelBlue3 widgetDefault option add *JDisco.identitycolor darkolivegreen3 widgetDefault option add *JDisco.optioncolor mediumorchid3 widgetDefault } else { option add *JDisco.featurecolor MidnightBlue widgetDefault option add *JDisco.identitycolor DarkGreen widgetDefault option add *JDisco.optioncolor DarkViolet widgetDefault } # Disco Browser namespace eval ::disco::browser { variable winid 0 image create photo "" variable options # Do not show items number in node title if this number # is not greater than 20 # (It is questionnable whether to add this option to Customize). set options(upper_items_bound) 20 custom::defvar disco_list {} [::msgcat::mc "List of discovered JIDs."] \ -group Hidden custom::defvar node_list {} [::msgcat::mc "List of discovered JID nodes."] \ -group Hidden } ############################################################################### proc ::disco::browser::open_win {xlib jid args} { variable winid variable curjid variable disco_list variable node_list variable browser if {[llength [connections]] == 0} return if {$xlib == ""} { set xlib [lindex [connections] 0] } if {$jid == ""} { set curjid($winid) [connection_server $xlib] } else { set curjid($winid) $jid } set w .disco_$winid set wid $winid incr winid set browser(xlib,$w) $xlib add_win $w -title [::msgcat::mc "Service Discovery"] \ -tabtitle [::msgcat::mc "Discovery"] \ -raisecmd [list focus $w.tree] \ -class JDisco \ -raise 1 set config(fill) [option get $w fill JDisco] set config(featurecolor) [option get $w featurecolor JDisco] set config(identitycolor) [option get $w identitycolor JDisco] set config(optioncolor) [option get $w optioncolor JDisco] bind $w [list [namespace current]::destroy_state %W [double% $w]] Frame $w.navigate Button $w.navigate.back \ -text <- \ -width 3 \ -command [list [namespace current]::history_move $w 1] Button $w.navigate.forward \ -text -> \ -width 3 \ -command [list [namespace current]::history_move $w -1] Label $w.navigate.lentry -text [::msgcat::mc "JID:"] set c [Combobox $w.navigate.entry \ -textvariable [namespace current]::curjid($wid) \ -command [list [namespace current]::go $w] \ -values $disco_list] if {[winfo exists $c.e]} { #HACK: For BWidget combobox set c $c.e } DropSite::register $c -droptypes {JID {}} \ -dropcmd [list [namespace current]::entrydropcmd $w] Label $w.navigate.lnode -text [::msgcat::mc "Node:"] Combobox $w.navigate.node \ -textvariable [namespace current]::curnode($wid) \ -values $node_list \ -width 20 Button $w.navigate.browse \ -text [::msgcat::mc "Browse"] \ -command [list [namespace current]::go $w] bind $w.navigate.entry [list [namespace current]::go [double% $w]] bind $w.navigate.node [list [namespace current]::go [double% $w]] pack $w.navigate.back $w.navigate.forward $w.navigate.lentry -side left pack $w.navigate.browse -side right pack $w.navigate.entry -side left -expand yes -fill x pack $w.navigate.lnode -side left pack $w.navigate.node -side left -expand no -fill x pack $w.navigate -fill x set sw [ScrolledWindow $w.sw] set tw [MyTree $w.tree] $sw setwidget $tw if {[winfo exists $tw.c]} { DragSite::register $tw.c \ -draginitcmd [list [namespace current]::draginitcmd $w] } else { DragSite::register $tw \ -draginitcmd [list [namespace current]::draginitcmd $w] } $tw tag configure feature -foreground $config(featurecolor) $tw tag configure identity -foreground $config(identitycolor) $tw tag configure option -foreground $config(optioncolor) pack $sw -side top -expand yes -fill both $tw tag bind Text [list [namespace current]::activate_node [double% $w] [double% $tw]] $tw tag bind Text <> [list [namespace current]::textpopup [double% $w] [double% $tw] %x %y] # Override the default action which toggles the non-leaf nodes bind $tw break # Disable balloons until we'll fine something useful to show in them #balloon::setup $tw -command [list [namespace current]::textballoon $w] if {[winfo exists $tw.c]} { bind $tw.c [list [namespace current]::activate_node [double% $w] [double% $tw]] bind $tw.c [list [namespace current]::delete_node [double% $w] [double% $tw]] } else { $tw tag bind Text [list [namespace current]::activate_node [double% $w] [double% $tw]] $tw tag bind Text [list [namespace current]::delete_node [double% $w] [double% $tw]] # Override the default action which toggles the non-leaf nodes bind $tw break } lappend browser(opened) $w set browser(opened) [lsort -unique $browser(opened)] set browser(required,$w) {} set browser(tree,$w) $tw set browser(hist,$w) {} set browser(histpos,$w) 0 hook::run open_disco_post_hook $w $sw $tw go $w } proc ::disco::browser::go {bw} { variable browser variable disco_list variable node_list if {[winfo exists $bw]} { set jid [$bw.navigate.entry get] set node [$bw.navigate.node get] history_add $bw [list $jid $node] set disco_list [update_combo_list $disco_list $jid 20] set node_list [update_combo_list $node_list $node 20] $bw.navigate.entry configure -values $disco_list $bw.navigate.node configure -values $node_list lappend browser(required,$bw) $jid set browser(required,$bw) [lsort -unique $browser(required,$bw)] disco::request_info $browser(xlib,$bw) $jid -node $node disco::request_items $browser(xlib,$bw) $jid -node $node } } proc ::disco::browser::info_receive \ {xlib jid node res identities features extras featured_nodes} { variable browser if {![info exists browser(opened)]} return foreach w $browser(opened) { if {[winfo exists $w] && $jid in $browser(required,$w)} { draw_info $w $xlib $jid $node $res $identities \ $features $extras $featured_nodes } } } hook::add disco_info_hook \ ::disco::browser::info_receive proc ::disco::browser::draw_info \ {w xlib jid node res identities features extras featured_nodes} { variable browser set tw $browser(tree,$w) set parent_tag [jid_to_tag [list $jid $node]] set tnode [jid_to_tag [list $jid $node]] if {[$tw exists $tnode]} { lassign [$tw item $tnode -values] type _ _ _ name _ _ nitems } else { set type item set name "" set nitems 0 } set data [list $type $xlib $jid $node $name $identities $features $nitems] set desc [item_desc $jid $node $name $nitems] set icon "" add_line $tw $parent_tag $tnode $icon $desc $data -tags {Text} if {$res != "ok"} { set tnode [jid_to_tag "error info $jid $node"] set data [list error_info $xlib $jid] set desc [::msgcat::mc "Error getting info: %s" \ [error_to_string $identities]] set icon "" add_line $tw $parent_tag $tnode $icon $desc $data -tags {Text identity} remove_old $tw $parent_tag identity [list $tnode] remove_old $tw $parent_tag feature [list $tnode] remove_old $tw $parent_tag extra [list $tnode] remove_old $tw $parent_tag item2 [list $tnode] remove_old $tw $parent_tag error_info [list $tnode] reorder_node $tw $parent_tag return } set identitynodes {} set category "" set type "" foreach identity $identities { set tnode [jid_to_tag "identity $identity $jid $node"] lappend identitynodes $tnode set name [get_prop $identity name] set category [get_prop $identity category] set type [get_prop $identity type] set data [list identity $xlib $jid $node $category $type $name] set desc "$name ($category/$type)" set icon [item_icon $category $type] add_line $tw $parent_tag $tnode $icon $desc $data -tags {Text identity} } set extranodes {} foreach eform $extras { foreach {etag extra} $eform { lassign $extra var type label values if {$type == "hidden"} continue set tnode [jid_to_tag "extra $var $jid $node"] lappend extranodes $tnode set data [list extra $var $xlib $jid $node] set value [join $values ", "] if {$label != ""} { set desc "$label ($var): $value" } else { set desc "$var: $value" } set icon "" add_line $tw $parent_tag $tnode $icon $desc $data -tags {Text identity} } } set featurenodes {} foreach feature $features { set tnode [jid_to_tag "feature $feature $jid $node"] lappend featurenodes $tnode set data [list feature $xlib $jid $node $feature $category $type] set desc $feature if {[info exists browser(feature_handler_desc,$feature)]} { catch { array unset tmp } array set tmp $browser(feature_handler_desc,$feature) if {[info exists tmp($category)]} { set desc "$tmp($category) ($feature)" } elseif {[info exists tmp(*)]} { set desc "$tmp(*) ($feature)" } } set icon "" add_line $tw $parent_tag $tnode $icon $desc $data -tags {Text feature} } set item2nodes {} # Draw all implicit item nodes, which are not received explicitly # (don't overwrite node because it can have different name) foreach item $featured_nodes { set ijid [get_prop $item jid] set node [get_prop $item node] set name [get_prop $item name] set tnode [jid_to_tag [list $ijid $node]] lappend item2nodes $tnode if {[$tw exists $tnode]} { lassign [$tw item $tnode -values] type _ _ _ _ identities features nitems } else { set type item2 set identities {} set features {} set nitems 0 } set data [list item2 $xlib $ijid $node $name $identities $features $nitems] set desc [item_desc $ijid $node $name $nitems] set icon "" if {![$tw exists $tnode] || \ [lindex [$tw item $tnode -values] 0] != "item"} { add_line $tw $parent_tag $tnode $icon $desc $data -tags {Text} } } remove_old $tw $parent_tag identity $identitynodes remove_old $tw $parent_tag extra $extranodes remove_old $tw $parent_tag feature $featurenodes remove_old $tw $parent_tag item2 $item2nodes remove_old $tw $parent_tag error_info {} reorder_node $tw $parent_tag } proc ::disco::browser::items_receive {xlib jid node res items} { variable browser if {![info exists browser(opened)]} return foreach w $browser(opened) { if {[winfo exists $w] && $jid in $browser(required,$w)} { draw_items $w $xlib $jid $node $res $items } } } hook::add disco_items_hook \ ::disco::browser::items_receive proc ::disco::browser::draw_items {w xlib jid node res items} { variable browser set tw $browser(tree,$w) set parent_tag [jid_to_tag [list $jid $node]] set tnode [jid_to_tag [list $jid $node]] if {[$tw exists $tnode]} { lassign [$tw item $tnode -values] type _ _ _ name identities features } else { set type item set name "" set identities {} set features {} } set nitems [llength $items] set data [list $type $xlib $jid $node $name $identities $features $nitems] set desc [item_desc $jid $node $name $nitems] set icon "" add_line $tw $parent_tag $tnode $icon $desc $data -tags {Text} if {$res != "ok"} { set tnode [jid_to_tag "error items $jid $node"] set data [list error_items $xlib $jid] set desc [::msgcat::mc "Error getting items: %s" \ [error_to_string $items]] set icon "" add_line $tw $parent_tag $tnode $icon $desc $data -tags {Text} remove_old $tw $parent_tag item [list $tnode] remove_old $tw $parent_tag error_items [list $tnode] reorder_node $tw $parent_tag return } set itemnodes {} foreach item $items { set ijid [get_prop $item jid] set node [get_prop $item node] set name [get_prop $item name] set tnode [jid_to_tag [list $ijid $node]] if {[$tw exists $tnode]} { lassign [$tw item $tnode -values] type _ _ _ _ identities features nitems } else { set type item set identities {} set features {} set nitems 0 } set data [list item $xlib $ijid $node $name $identities $features $nitems] set desc [item_desc $ijid $node $name $nitems] set icon "" lappend itemnodes $tnode add_line $tw $parent_tag $tnode $icon $desc $data -tags {Text} } remove_old $tw $parent_tag item $itemnodes remove_old $tw $parent_tag error_items {} if {![info exists browser(sort,$w,$parent_tag)]} { set browser(sort,$w,$parent_tag) sort } browser_action $browser(sort,$w,$parent_tag) $w $parent_tag } proc ::disco::browser::add_line {tw parent node icon desc data args} { if {[$tw exists $node]} { if {[$tw parent $node] != $parent && [$tw exists $parent] && \ $parent != $node} { if {[catch {$tw move $node $parent end}]} { debugmsg disco "MOVE FAILED: $parent $node" } else { debugmsg disco "MOVE: $parent $node" } } if {[$tw item $node -values] != $data || [$tw item $node -text] != $desc} { debugmsg disco RECONF $tw item $node -text $desc -values $data -open 1 -image $icon {*}$args } } elseif {[$tw exists $parent]} { $tw insert $parent end -id $node -text $desc -open 1 -image $icon -values $data {*}$args } else { $tw insert {} end -id $node -text $desc -open 1 -image $icon -values $data {*}$args } } proc ::disco::browser::reorder_node {tw node {order {}}} { set subnodes [$tw children $node] set identities {} set features {} set extras {} set items {} foreach sn $subnodes { lassign [$tw item $sn -values] kind switch -- $kind { error_items - item - item2 {lappend items $sn} error_info - identity {lappend identities $sn} feature {lappend features $sn} extra {lappend extras $sn} } } if {$order == {}} { $tw children $node [concat $identities $extras $features $items] } else { $tw children $node [concat $identities $extras $features $order] } } proc ::disco::browser::remove_old {tw node kind newnodes} { set subnodes [$tw children $node] set items {} foreach sn $subnodes { lassign [$tw item $sn -values] kind1 if {$kind == $kind1 && $sn ni $newnodes} { $tw delete [list $sn] } } } proc ::disco::browser::item_desc {jid node name nitems} { variable options if {$node != ""} { set snode " \[$node\]" } else { set snode "" } if {$nitems > $options(upper_items_bound)} { set sitems " - $nitems" } else { set sitems "" } if {![string equal $name ""]} { return "$name$snode ($jid)$sitems" } else { return "$jid$snode$sitems" } } proc ::disco::browser::item_icon {category type} { switch -- $category { service - gateway - application { if {"browser/$type" in [image names]} { return browser/$type } else { return "" } } default { if {"browser/$category" in [image names]} { return browser/$category } else { return "" } } } } proc ::disco::browser::textaction {bw tnode} { variable disco variable browser set tw $browser(tree,$bw) set data [$tw item $tnode -values] set data2 [lassign $data type] switch -- $type { item - item2 { lassign $data2 xlib jid node goto $bw $jid $node } feature { lassign $data2 xlib jid node feature category subtype debugmsg disco $jid if {$feature != ""} { if {[info exists browser(feature_handler,$feature)]} { if {$browser(feature_handler_node,$feature)} { eval $browser(feature_handler,$feature) [list $xlib $jid $node \ -category $category -type $subtype] } else { eval $browser(feature_handler,$feature) [list $xlib $jid \ -category $category -type $subtype] } } } } } } proc ::disco::browser::textpopup {bw tw x y} { variable browser set m .discopopupmenu if {[winfo exists $m]} { destroy $m } menu $m -tearoff 0 $tw selection set [list [$tw identify item $x $y]] set tnode [lindex [$tw selection] 0] set data [$tw item $tnode -values] # Parent node category shouldn't impact node action in theory, # but sometimes (e.g. when joining MUC group) it's useful. set tparentnode [$tw parent $tnode] set parentdata {} catch {set parentdata [$tw item $tparentnode -values]} hook::run disco_node_menu_hook $m $bw $tnode $data $parentdata tk_popup $m [winfo pointerx .] [winfo pointery .] } proc ::disco::browser::textpopup_menu_setup {m bw tnode data parentdata} { variable browser set tw $browser(tree,$bw) if {[$m index end] != "none"} { $m add separator } set tparentnode [$tw parent $tnode] set data2 [lassign $data type] switch -- $type { feature { $m add command -label [::msgcat::mc "Browse"] \ -command [list [namespace current]::browser_action browse $bw $tnode] $m add separator } item - item2 { $m add command -label [::msgcat::mc "Browse"] \ -command [list [namespace current]::browser_action browse $bw $tnode] $m add command -label [::msgcat::mc "Sort items by name"] \ -command [list [namespace current]::browser_action sort $bw $tnode] $m add command -label [::msgcat::mc "Sort items by JID/node"] \ -command [list [namespace current]::browser_action sortjid $bw $tnode] $m add separator if {$tparentnode eq {}} { set label [::msgcat::mc "Delete current node and subnodes"] } else { set label [::msgcat::mc "Delete subnodes"] } $m add command -label $label \ -command [list [namespace current]::clear $bw $tnode] } default { } } $m add command -label [::msgcat::mc "Clear window"] \ -command [list [namespace current]::clearall $bw] } hook::add disco_node_menu_hook \ ::disco::browser::textpopup_menu_setup 100 proc ::disco::browser::clearall {bw} { variable browser set tw $browser(tree,$bw) $tw delete [$tw children {}] } proc ::disco::browser::clear {bw tnode} { variable browser set tw $browser(tree,$bw) set tparentnode [$tw parent $tnode] set type [lindex [$tw item $tnode -values] 0] if {$tparentnode ne {}} { if {$type != "item" && $type != "item2"} { set tnode $tparentnode } $tw delete [$tw children $tnode] lassign [$tw item $tnode -values] type xlib jid node name if {$type == "item" || $type == "item2"} { set desc [item_desc $jid $node $name 0] $tw item $tnode -text $desc } } else { $tw delete [list $tnode] } } proc ::disco::browser::activate_node {bw tw} { set tnode [lindex [$tw selection] 0] if {$tnode != ""} { textaction $bw $tnode } } proc ::disco::browser::delete_node {bw tw} { set tnode [lindex [$tw selection] 0] if {$tnode != ""} { clear $bw $tnode } } proc ::disco::browser::browser_action {action bw tnode} { variable browser set tw $browser(tree,$bw) set data [$tw item $tnode -values] set data2 [lassign $data type] switch -glob -- $type/$action { item/browse - item2/browse - feature/browse { textaction $bw $tnode } item/sort - item2/sort { set browser(sort,$bw,$tnode) sort set items {} foreach child [$tw children $tnode] { set data [lassign [$tw item $child -values] type] switch -- $type { item - item2 { lassign $data xlib jid node name lappend items [list $child $name] } } } set neworder {} foreach item [lsort -dictionary -index 1 $items] { lappend neworder [lindex $item 0] } reorder_node $tw $tnode $neworder foreach child [$tw children $tnode] { browser_action $action $bw $child } } item/sortjid - item2/sortjid { set browser(sort,$bw,$tnode) sortjid set items {} set items_with_nodes {} foreach child [$tw children $tnode] { set data [lassign [$tw item $child -values] type] switch -- $type { item - item2 { lassign $data xlib jid node if {$node != {}} { lappend items_with_nodes \ [list $child "$jid\u0000$node"] } else { lappend items [list $child $jid] } } } } set neworder {} foreach item [concat [lsort -dictionary -index 1 $items] \ [lsort -dictionary -index 1 $items_with_nodes]] { lappend neworder [lindex $item 0] } reorder_node $tw $tnode $neworder foreach child [$tw children $tnode] { browser_action $action $bw $child } } default { } } } # TODO proc ::disco::browser::textballoon {bw args} { variable browser set tw $browser(tree,$bw) if {[llength $args] == 1} { set node [lindex $args 0] } else { set bd [ttk::style lookup Treeview -borderwidth {} 1] set x [expr {[winfo pointerx $tw] - [winfo rootx $tw] - $bd}] set y [expr {[winfo pointery $tw] - [winfo rooty $tw] - $bd}] set node [$tw identify item $x $y] if {$node eq ""} { return [list $bw:$node ""] } } if {[catch {set data [$tw item $node -values]}]} { return [list $bw:$node ""] } lassign $data type xlib jid category subtype name version lassign $data type xlib jid node name identities features nitems if {$type eq "item" || $type eq "item2"} { return [list $bw:$node \ [item_balloon_text $jid $node $name $nitems]] } else { return [list $bw:$node ""] } } proc ::disco::browser::goto {bw jid node} { $bw.navigate.entry set $jid $bw.navigate.node set $node go $bw } proc ::disco::browser::get_parent_identities {bw tnode} { variable browser set tw $browser(tree,$bw) return [get_identities $bw [$tw parent $tnode]] } proc ::disco::browser::get_identities {bw tnode} { variable browser set tw $browser(tree,$bw) lassign [$tw item $tnode -values] type _ _ _ _ identities switch -- $type { item - item2 { return $identities } default { return {} } } } proc ::disco::browser::get_parent_features {bw tnode} { variable browser set t $browser(tree,$bw) return [get_features $bw [$t parent $tnode]] } proc ::disco::browser::get_features {bw tnode} { variable browser set tw $browser(tree,$bw) lassign [$tw item $tnode -values] type _ _ _ _ _ features switch -- $type { item - item2 { return $features } default { return {} } } } proc ::disco::browser::draginitcmd {bw tw x y top} { if {[winfo exists [winfo parent $tw].c]} { # HACK for BWidget Tree set tw [winfo parent $tw] } set tnode [lindex [$tw identify item [expr {$x-[winfo rootx $tw]}] \ [expr {$y-[winfo rooty $tw]}]] 0] set data [$tw item $tnode -values] set data2 [lassign $data type xlib jid node] if {$type == "item" || $type == "item2"} { if {[set img [$tw item $tnode -image]] != ""} { pack [label $top.l -image $img -padx 0 -pady 0] } set identities [get_identities $bw $tnode] if {[llength $identities] > 0} { lassign [lindex $identities 0] category type } if {![info exists category]} { # Using parent tag to get conference category. # ??? Which else category could be got from parent? set identities [get_identities $bw [$tw parent $tnode]] if {[llength $identities] > 0} { lassign [lindex $identities 0] category type } if {![info exists category] || ($category != "conference")} { # For other JIDs use heuristics from roster code. lassign [roster::get_category_and_subtype $xlib $jid] category type } } return [list JID {copy} [list $xlib $jid $category $type "" ""]] } else { return {} } } proc ::disco::browser::entrydropcmd {bw target source x y op type data} { set jid [lindex $data 1] after idle [list [namespace current]::goto $bw $jid ""] } proc ::disco::browser::history_move {bw shift} { variable browser set newpos [expr {$browser(histpos,$bw) + $shift}] if {$newpos < 0} { return } if {$newpos >= [llength $browser(hist,$bw)]} { return } set newjidnode [lindex $browser(hist,$bw) $newpos] set browser(histpos,$bw) $newpos lassign $newjidnode newjid newnode $bw.navigate.entry set $newjid $bw.navigate.node set $newnode disco::request_info $browser(xlib,$bw) $newjid -node $newnode disco::request_items $browser(xlib,$bw) $newjid -node $newnode } proc ::disco::browser::history_add {bw jid} { variable browser set browser(hist,$bw) [lreplace $browser(hist,$bw) 0 \ [expr {$browser(histpos,$bw) - 1}]] set browser(hist,$bw) [linsert $browser(hist,$bw) 0 $jid] set browser(histpos,$bw) 0 debugmsg disco $browser(hist,$bw) } proc ::disco::browser::item_balloon_text {jid node name children} { variable browser set text "$jid" set delim ": " if {$node ne ""} { append text " \[$node\]" set delim ": " } if {$name ne ""} { append text "$delim[::msgcat::mc Description:] $name" set delim ", " } append text "\n[::msgcat::mc {Number of children:}] $children" return $text } proc ::disco::browser::register_feature_handler {feature handler args} { variable browser set node 0 set desc "" foreach {attr val} $args { switch -- $attr { -node {set node $val} -desc {set desc $val} } } set browser(feature_handler,$feature) $handler set browser(feature_handler_node,$feature) $node if {$desc != ""} { set browser(feature_handler_desc,$feature) $desc } } proc ::disco::browser::unregister_feature_handler {feature} { variable browser catch {unset browser(feature_handler,$feature)} catch {unset feature_handler_node,$feature)} catch {unset browser(feature_handler_desc,$feature)} } # Destroy all (global) state assotiated with the given browser window. # Intended to be bound to a event handler for browser windows. proc ::disco::browser::destroy_state {bw bw1} { variable browser if {$bw != $bw1} return array unset browser *,$bw array unset browser *,$bw,* set idx [lsearch -exact $browser(opened) $bw] set browser(opened) [lreplace $browser(opened) $idx $idx] } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/general/geometry.tcl000064400000000000000000000064641477701321300175200ustar00nobodynobody# geometry.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # saves and restores the main Tkabber window geometry. namespace eval geometry { custom::defvar MainWindowState {} \ [::msgcat::mc "Stored main window state (normal or zoomed)"] \ -type string -group Hidden custom::defvar MainWindowStateUntabbed {} \ [::msgcat::mc "Stored main window state (normal or zoomed) in\ non-tabbed mode"] \ -type string -group Hidden custom::defvar MainWindowGeometry {} \ [::msgcat::mc "Stored main window geometry"] \ -type string -group Hidden custom::defvar MainWindowGeometryUntabbed {} \ [::msgcat::mc "Stored main window geometry in non-tabbed mode"] \ -type string -group Hidden hook::add finload_hook [namespace current]::setupBindings 101 hook::add finload_hook [namespace current]::restoreMainWindowState 99.9 } proc geometry::setupBindings {} { bind . [namespace current]::saveMainWindowState bind . [namespace current]::saveMainWindowGeometry } proc geometry::saveMainWindowState {} { global usetabbar variable MainWindowState variable MainWindowStateUntabbed set screen [winfo screen .] if {$usetabbar} { array set tmp $MainWindowState } else { array set tmp $MainWindowStateUntabbed } set state [wmstate .] if {![info exists tmp($screen)] || ![string equal $state $tmp($screen)]} { set tmp($screen) $state if {$usetabbar} { set MainWindowState [array get tmp] } else { set MainWindowStateUntabbed [array get tmp] } } } proc geometry::saveMainWindowGeometry {} { after cancel [namespace current]::afterSaveMainWindowGeometry after idle [namespace current]::afterSaveMainWindowGeometry } proc geometry::afterSaveMainWindowGeometry {} { global usetabbar variable MainWindowGeometry variable MainWindowGeometryUntabbed set state [wmstate .] if {![string equal $state normal]} { return } set screen [winfo screen .] if {$usetabbar} { array set tmp $MainWindowGeometry } else { array set tmp $MainWindowGeometryUntabbed } set geometry [wm geometry .] if {![info exists tmp($screen)] || ![string equal $geometry $tmp($screen)]} { set tmp($screen) $geometry if {$usetabbar} { set MainWindowGeometry [array get tmp] } else { set MainWindowGeometryUntabbed [array get tmp] } } } proc geometry::restoreMainWindowState {} { global tcl_platform global usetabbar variable MainWindowState variable MainWindowStateUntabbed variable MainWindowGeometry variable MainWindowGeometryUntabbed set screen [winfo screen .] if {$usetabbar} { array set tmp1 $MainWindowGeometry } else { array set tmp1 $MainWindowGeometryUntabbed } if {[info exists tmp1($screen)]} { wm geometry . $tmp1($screen) } if {$usetabbar} { array set tmp2 $MainWindowState } else { array set tmp2 $MainWindowStateUntabbed } if {[info exists tmp2($screen)] && [string equal $tmp2($screen) zoomed]} { wmstate . zoomed } update } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/general/gpgme.tcl000064400000000000000000001543271477701321300167660ustar00nobodynobody# gpgme.tcl -- # # This file is a part of the Tkabber XMPP client. It implements signing # and encrypting messages and presence updates using GnuPG (XEP-0027). namespace eval ::ssj { variable NS array set NS [list \ signed "jabber:x:signed" \ encrypted "jabber:x:encrypted" \ ] } ############################################################################# # Draw icons aside encrypted messages even if no GPG support proc ::ssj::draw_encrypted {chatid from type body x} { variable NS set chatw [chat::chat_win $chatid] if {![hook::is_flag rewrite_outgoing_message_hook encrypted]} { $chatw image create end -image gpg/encrypted hook::set_flag rewrite_outgoing_message_hook encrypted } else { foreach xe $x { ::xmpp::xml::split $xe tag xmlns attrs cdata subels if {$xmlns ne $NS(encrypted)} { continue } if {$cdata eq "" || [info commands ::ssj::encrypted:input] eq ""} { $chatw image create end -image gpg/badencrypted } else { # We already deciphered it in rewrite_message_hook $chatw image create end -image gpg/encrypted } break } } } hook::add draw_message_hook ::ssj::draw_encrypted 5 ############################################################################# proc ::ssj::process_x_encrypted {rowvar bodyvar f x xlib from id type replyP} { variable NS upvar 2 $rowvar row upvar 2 $bodyvar body if {!$replyP || $type eq "error"} { return } foreach xa $x { ::xmpp::xml::split $xa tag xmlns attrs cdata subels if {$xmlns ne $NS(encrypted)} continue set lb [join [lrange [split $f .] 0 end-1] .].title.encrypted if {[winfo exists $lb]} { destroy $lb } if {$cdata eq "" || [info commands ::ssj::encrypted:input] eq ""} { Label $lb -image gpg/badencrypted } else { # We already deciphered it in rewrite_message_hook Label $lb -image gpg/encrypted } grid $lb -row 1 -column 3 -sticky e } return } hook::add message_process_x_hook ::ssj::process_x_encrypted 21 ############################################################################# if {[catch {package require gpg}]} { debugmsg ssj "unable to load the GPG package, so no crypto!" return } namespace eval ::ssj { variable options custom::defgroup GPG [::msgcat::mc "GPG options (signing and\ encryption)."] \ -group Tkabber custom::defvar options(one-passphrase) 1 \ [::msgcat::mc "Use the same passphrase for signing and\ decrypting messages."] \ -group GPG -type boolean custom::defvar options(sign-traffic) 0 \ [::msgcat::mc "GPG-sign outgoing presence updates."] \ -group GPG -type boolean custom::defvar options(sign-personal-messages) 0 \ [::msgcat::mc "GPG-sign outgoing personal messages."] \ -group GPG -type boolean custom::defvar options(sign-groupchat-messages) 0 \ [::msgcat::mc "GPG-sign outgoing groupchat messages."] \ -group GPG -type boolean custom::defvar options(encrypt-traffic) 0 \ [::msgcat::mc "GPG-encrypt outgoing messages where possible."] \ -group GPG -type boolean custom::defvar options(prevent-replay-attack) 1 \ [::msgcat::mc "Add the recipient's JID and timestamp to the\ GPG-signed or encrypted outgoing messages. This\ prevents replay attacks."] \ -group GPG -type boolean custom::defvar options(key) "" \ [::msgcat::mc "Use specified key ID for signing and decrypting\ messages."] \ -group GPG -type string custom::defvar options(display_sig_warnings) 1 \ [::msgcat::mc "Display warning dialogs when signature\ verification fails."] \ -group GPG -type boolean } package require base64 namespace eval ::ssj { variable ctx variable e4me variable j2k variable options variable passphrase variable s2e variable f2s variable signers variable warnings variable gpg_error_id 0 array set ctx {} array set j2k {} array set options {} array set passphrase {} array set s2e \ [list none [::msgcat::mc "No information available"] \ bad [::msgcat::mc "Invalid signature"] \ nokey [::msgcat::mc "Signature not processed due\ to missing key"] \ nosig [::msgcat::mc "Malformed signature block"] \ error [::msgcat::mc "Error in signature processing"] \ diff [::msgcat::mc "Multiple signatures having different\ authenticity"] \ expired [::msgcat::mc "The signature is good but has\ expired"] \ expiredkey [::msgcat::mc "The signature is good but the key\ has expired"]] array set f2s \ [list unchanged [::msgcat::mc "not actually changed"] \ new_key [::msgcat::mc "entirely new key"] \ new_uids [::msgcat::mc "new user IDs"] \ new_sigs [::msgcat::mc "new signatures"] \ new_subkeys [::msgcat::mc "new subkeys"] \ new_private_key [::msgcat::mc "contains private key"]] unset -nocomplain warnings array set warnings {} variable signedid 0 } proc ::ssj::once_only {xlib} { global env variable options variable ctx debugmsg ssj "ONCE_ONLY $xlib" if {[info exists ctx($xlib)] && $ctx($xlib) ne ""} { return } set ctx($xlib) [gpg::new] $ctx($xlib) set -property armor \ -value true $ctx($xlib) set -property encoding \ -value utf-8 # Setting the passphrase-callback property doesn't prevent from using # pinentry via gpg-agent. passphrase-callback will just be ignored in # that case. It will only be used if the agent allows loopback pinentry # mode (allow-loopback-pinentry in ~/.gnupg/gpg-agent.conf) for gpg 2.1. # So, passphrase-callback is not ignored for: # 1. gpg 1.4 without GPG_AGENT_INFO set to something sensible # 2. gpg 2.1 with agent that allow using loopback pinentry $ctx($xlib) set -property passphrase-callback \ -value [list ::ssj::passphrase $xlib] set pattern [connection_bare_jid $xlib] set firstP 1 if {$options(key) ne ""} { set patterns [list $options(key)] } else { set patterns {} } lappend patterns $pattern "" foreach p $patterns { set args [list -secretonly true] if {$p ne ""} { lappend args -patterns [list $p] } set keys [$ctx($xlib) list-keys {*}$args] if {[llength $keys] > 0} { break } if {$p eq ""} { return } set firstP 0 } switch -- [llength $keys] { 0 { return } 1 { if {$firstP} { e4meP $xlib $keys return } } } set dw .selectkey[psuffix $xlib] catch {destroy $dw} set titles {} set balloons {} foreach key $keys { set key_info [$ctx($xlib) info-key -key $key] foreach {k v} $key_info { if {$k eq "email"} { lappend titles $key $v lappend balloons $key [key_balloon_text $key_info] break } } foreach {k v} [$ctx($xlib) info-key -key $key] { if {$k ne "subkeys"} { continue } foreach subkey $v { foreach {k1 v1} $subkey { if {$k1 eq "email"} { lappend titles $key $v1 lappend balloons $key [key_balloon_text $subkey] break } } } } } CbDialog $dw [::msgcat::mc "Select Key for Signing %s Traffic" $pattern] \ [list [::msgcat::mc "Select"] [list ::ssj::once_only_aux $dw $xlib] \ [::msgcat::mc "Cancel"] [list destroy $dw]] \ ::ssj::selectkey[psuffix $xlib] $titles $balloons \ -modal local } proc ::ssj::keyid {fingerprint} { string range $fingerprint end-15 end } proc ::ssj::key_balloon_text {key} { array set params $key if {[catch {format "%d%s/%s %s" $params(length) \ [string range $params(algorithm) 0 0] \ [keyid $params(keyid)] \ [clock format $params(created) \ -format "%Y-%m-%d"]} text]} { return "" } foreach {k v} $key { switch -- $k { userid { append text [format "\n\t%s" $v] } } } return $text } proc ::ssj::once_only_aux {dw xlib} { variable selectkey[psuffix $xlib] set keys {} foreach key [array names selectkey[psuffix $xlib]] { if {[set selectkey[psuffix $xlib]($key)]} { lappend keys $key } } destroy $dw unset -nocomplain selectkey[psuffix $xlib] if {[llength $keys] > 0} { e4meP $xlib $keys } } proc ::ssj::passphrase {xlib data} { variable passphrase variable options array set params $data if {!$options(one-passphrase)} { set params(keyid) $params(subkeyid) } set keyid $params(keyid) if {$params(hint) eq "enter" && [info exists passphrase($keyid)] && $passphrase($keyid) ne ""} { return $passphrase($keyid) } set pw .passphrase[psuffix $xlib] if {[winfo exists $pw]} { destroy $pw } set title [::msgcat::mc "Please enter passphrase"] switch -- $params(hint) { enter {} try_again { set title [::msgcat::mc "Please try again"] } default { append title ": " $params(hint) } } Dialog $pw -title $title -anchor e -default 0 -cancel 1 set pf [$pw getframe] grid columnconfigure $pf 1 -weight 1 foreach {k v} [list keyid [::msgcat::mc "Key ID"] \ userid [::msgcat::mc "User ID"]] { Label $pf.l$k -text ${v}: Entry $pf.$k $pf.$k insert 0 $params($k) if {[string length $params($k)] <= 72} { $pf.$k configure -width 0 } #set bgcolor [lindex [$pf.$k configure -background] 4] #$pf.$k configure -state readonly -readonlybackground $bgcolor $pf.$k:cmd configure -state readonly } Label $pf.lpassword -text [::msgcat::mc "Passphrase:"] Entry $pf.password \ -textvariable ::ssj::passphrase($xlib,$keyid) \ -show * set passphrase($xlib,$keyid) "" grid $pf.lkeyid -row 0 -column 0 -sticky e grid $pf.keyid -row 0 -column 1 -sticky ew grid $pf.luserid -row 1 -column 0 -sticky e grid $pf.userid -row 1 -column 1 -sticky ew grid $pf.lpassword -row 2 -column 0 -sticky e grid $pf.password -row 2 -column 1 -sticky ew $pw add -text [::msgcat::mc "OK"] -command [list $pw enddialog 0] $pw add -text [::msgcat::mc "Cancel"] -command [list $pw enddialog 1] set abort [$pw draw $pf.password] destroy $pw if {!$abort} { set passphrase($keyid) $passphrase($xlib,$keyid) unset passphrase($xlib,$keyid) return $passphrase($keyid) } else { return -code break } } proc ::ssj::armor:encode {text} { if {[set x [string first "\n\n" $text]] >= 0} { set text [string range $text [expr {$x + 2}] end] } if {[set x [string first "\n-----" $text]] > 0} { set text [string range $text 0 [expr {$x - 1}]] } return $text } proc ::ssj::armor:decode {text} { return "-----BEGIN PGP MESSAGE-----\n\n$text\n-----END PGP MESSAGE-----" } proc ::ssj::signed:input {xlib from signature data what} { variable ctx variable j2k variable s2e variable warnings variable options once_only $xlib if {[catch {$ctx($xlib) verify \ -input $data \ -signature [armor:decode $signature]} result]} { debugmsg ssj "verify processing error ($xlib): $result ($from)" if {![info exists warnings(verify-traffic,$xlib)]} { set warnings(verify-traffic,$xlib) 1 hook::run gpg_input_error_hook $xlib $from software \ [::msgcat::mc "Error in signature verification software: %s." \ $result] } set params(reason) $result return [array get params] } debugmsg ssj "VERIFY: $xlib $from ($data); $result" array set params $result set result $params(status) set signatures {} foreach signature $params(signatures) { unset -nocomplain sparams array set sparams $signature if {[info exists sparams(key)]} { set sparams(key) [$ctx($xlib) info-key -key $sparams(key)] foreach {k v} $sparams(key) { switch -- $k { keyid { set j2k($from) $v break } subkeys { foreach subkey $v { unset -nocomplain kparams array set kparams $subkey if {[info exists kparams(keyid)]} { set j2k($from) $kparams(keyid) break } } } } } } lappend signatures [array get sparams] } unset -nocomplain params array set params [list signatures $signatures] if {$result ne "good"} { if {[info exists s2e($result)]} { set result $s2e($result) } set params(reason) $result if {$options(display_sig_warnings) && ![info exists warnings(verify,$from)]} { set warnings(verify,$from) 1 if {[info exists j2k($from)]} { set message [::msgcat::mc "%s purportedly signed by %s\ using key 0x%s can't be\ verified: %s." \ $what $from \ [keyid $j2k($from)] \ $result] } else { set message [::msgcat::mc "%s purportedly signed by %s\ can't be verified: %s." \ $what $from $result] } hook::run gpg_input_error_hook $xlib $from $what $message } } return [array get params] } # ::ssj::signed:output -- # # Result: # "" if signing is disabled for the given JID # 'Armored signature' if signing is enabled and succeeded # Error if something went wrong proc ::ssj::signed:output {xlib data args} { variable ctx variable options variable warnings variable gpg_error_id if {[llength $args] == 0} { # Presence if {!$options(sign-traffic)} return } else { # Message set to [lindex $args 0] set chatid [chat::chatid $xlib $to] if {[chat::is_groupchat $chatid]} { if {!$options(sign-groupchat-messages)} return } else { if {!$options(sign-personal-messages)} return } } once_only $xlib if {[catch {$ctx($xlib) sign -input $data \ -mode detach} result]} { set options(sign-traffic) 0 set options(sign-personal-messages) 0 set options(sign-groupchat-messages) 0 debugmsg ssj "signature processing error ($xlib): $result ($data)" if {[llength $args] == 0} { set buttons ok set cancel 0 set message [::msgcat::mc "Unable to sign presence information:\ %s.\n\nPresence will be sent, but\ signing traffic is now disabled." \ $result] } else { set buttons {ok cancel} set cancel 1 set message [::msgcat::mc "Unable to sign message body:\ %s.\n\nSigning traffic is now\ disabled.\n\nSend it WITHOUT a\ signature?"\ $result] } incr gpg_error_id if {[MessageDlg .sign_error$gpg_error_id \ -aspect 50000 -icon error -type user \ -buttons $buttons -default 0 -cancel $cancel \ -message $message]} { # Return error to disable sending the message error "" } return } set result [armor:encode $result] debugmsg ssj "SIGN: $data; $result" whichkeys $xlib sign return $result } proc ::ssj::signed:info {pinfo} { set text "" array set params $pinfo foreach {k v} $pinfo { if {$k ne "signatures"} { if {$v ne ""} { append text [format "%s: %s\n" $k $v] } } } if {[info exists params(signatures)]} { foreach signature $params(signatures) { set info "" set addrs "" set s "" foreach {k v} $signature { switch -- $k { key { foreach {k v} $v { if {$k ne "subkeys"} { continue } foreach subkey $v { unset -nocomplain sparams array set sparams $subkey if {[info exists sparams(email)]} { append addrs $s $sparams(email) set s "\n " } } } } created { append info "created: [clock format $v]\n" } expires { append info "expires: [clock format $v]\n" } fingerprint { append info [format "keyid: 0x%s\n" [keyid $v]] append info [format "%s: %s\n" $k $v] } default { if {$v ne ""} { append info [format "%s: %s\n" $k $v] } } } } if {$addrs ne ""} { set info "email: $addrs\n$info" } if {$info ne ""} { append text "\n" [string trimright $info] } } } return [string trimleft $text] } proc ::ssj::signed:Label {lb xlib jid pinfo} { set rjid [::muc::get_real_jid $xlib $jid] if {$rjid eq ""} { set rjid [::xmpp::jid::stripResource $jid] } else { set rjid [::xmpp::jid::stripResource $rjid] } array set params $pinfo set checks {} set trust 0 foreach signature $params(signatures) { set emails {} set valid 0 foreach {k v} $signature { switch -- $k { key { foreach {k v} $v { if {$k ne "subkeys"} { continue } foreach subkey $v { unset -nocomplain sparams array set sparams $subkey if {[info exists sparams(email)]} { lappend emails $sparams(email) } } } } validity { switch -- $v { ultimate - full - marginal { set valid 1 } never - undefined - unknown - default { set valid 0 } } } } } if {$valid && $rjid in $emails} { set trust 1 break } } if {[info exists params(reason)]} { set args [list -image gpg/badsigned] } elseif {$trust} { set args [list -image gpg/signed] } else { set args [list -image gpg/vsigned] } set info [signed:info $pinfo] if {$info ne ""} { lappend args -helptext $info -helptype balloon } Label $lb {*}$args \ -cursor arrow \ -padx 0 \ -pady 0 \ -borderwidth 0 \ -highlightthickness 0 if {[info exists params(reason)] && $params(reason) eq "nokey"} { bind $lb <> [list ::ssj::signed:popup [double% $pinfo]] } return $lb } ############################################################################### proc ::ssj::signed:popup {pinfo} { set m .signed_label_popupmenu if {[winfo exists $m]} { destroy $m } menu $m -tearoff 0 $m add command -label [::msgcat::mc "Fetch GPG key"] \ -command [list ::ssj::fetchkeys $pinfo] tk_popup $m [winfo pointerx .] [winfo pointery .] } proc ::ssj::signed:user_menu {m xlib jid} { variable signed if {[info exists signed($xlib,$jid)]} { $m add command -label [::msgcat::mc "Fetch GPG key"] \ -command [list ::ssj::fetchkeys $xlib $signed($xlib,$jid)] } else { $m add command -label [::msgcat::mc "Fetch GPG key"] \ -state disabled } } hook::add chat_create_user_menu_hook ::ssj::signed:user_menu 78 hook::add roster_create_groupchat_user_menu_hook ::ssj::signed:user_menu 78 hook::add message_dialog_menu_hook ::ssj::signed:user_menu 78 ############################################################################### proc ::ssj::fetchkeys {xlib pinfo} { variable ctx array set params $pinfo set keyids {} foreach signature $params(signatures) { unset -nocomplain sparams array set sparams $signature if {[info exists sparams(keyid)]} { lappend keyids $sparams(keyid) } } $ctx($xlib) import -keys $keyids -command [list ::ssj::processFetchkeys $xlib] } proc ::ssj::processFetchkeys {xlib status output} { variable ctx variable gpg_error_id if {$status ne "ok"} { NonmodalMessageDlg .keyfetch_error[incr gpg_error_id] \ -aspect 50000 -icon error \ -message "Key fetch error\n\n$output" } else { # In case of success let's update the affected keys info set patterns {} foreach {fp status} $output { lappend patterns $fp } $ctx($xlib) list-keys -patterns $patterns \ -command [list ::ssj::reportFetchkeys $xlib $output] } } proc ::ssj::reportFetchkeys {xlib output status keys} { variable ctx variable gpg_error_id variable f2s set text "" foreach {fp info} $output { unset -nocomplain status array set status $info if {$status(status) ne "ok"} { append text "\n0x[keyid $fp]: $status(reason)" } else { set flags {} foreach f $status(flags) { lappend flags $f2s($f) } set tflags [join $flags ",\n\t"] if {[catch {$ctx($xlib) info-key -key $fp} keyinfo]} { append text "\n0x[keyid $fp]:\n\t$tflags" } else { set uids "" foreach {k v} $keyinfo { if {$k eq "userid"} { append uids "\n $v" } } append text "\n0x[keyid $fp]$uids:\n\t$tflags" } } } NonmodalMessageDlg .keyfetch_ok[incr gpg_error_id] \ -aspect 50000 -icon info \ -message "Key fetch result\n$text" } ############################################################################### proc ::ssj::rewrite_message_body \ {vxlib vfrom vid vtype vis_subject vsubject vbody verr vthread vpriority vx} { variable NS upvar 2 $vxlib xlib upvar 2 $vfrom from upvar 2 $vbody body upvar 2 $vx x set badenc 0 set xs {} foreach xe $x { ::xmpp::xml::split $xe tag xmlns attrs cdata subels if {$xmlns ne $NS(encrypted)} { lappend xs $xe } elseif {$cdata eq ""} { # in case the sender didn't check the exit code from gpg we ignore # jabber:x:encrypted } elseif {[catch {ssj::encrypted:input $xlib $from $cdata} msg]} { set body [::msgcat::mc ">>> Unable to decipher data: %s <<<" $msg] # Add empty x tag to show problems with gpg lappend xs [::xmpp::xml::create x -xmlns $NS(encrypted)] set badenc 1 } else { set body $msg lappend xs $xe } } set x $xs if {$badenc} { # if decryption failed, then remove signature. It can't be correct. set xs {} foreach xe $x { ::xmpp::xml::split $xe tag xmlns attrs cdata subels if {$xmlns ne $NS(signed)} { lappend xs $xe } } set x $xs } else { # Check the signature before some other plugin rewrites # the message body set xs {} foreach xe $x { ::xmpp::xml::split $xe tag xmlns attrs cdata subels if {$xmlns ne $NS(signed)} { lappend xs $xe } else { # in case the sender didn't check the exit code from gpg... if {$cdata ne ""} { # Create special tag with signature info lappend xs [::xmpp::xml::create "" -xmlns $NS(signed) \ -attrs [signed:input $xlib $from \ $cdata $body \ [::msgcat::mc "Message body"]]] } } } set x $xs } return } hook::add rewrite_message_hook ::ssj::rewrite_message_body 70 ############################################################################### proc ::ssj::encrypted:input {xlib from data} { variable ctx variable warnings variable gpg_error_id once_only $xlib if {[catch {$ctx($xlib) decrypt -input [armor:decode $data]} result]} { debugmsg ssj "decryption processing error ($xlib): $result ($from)" if {![info exists warnings(decrypt,$from)]} { set warnings(decrypt,$from) 1 incr gpg_error_id after idle [list NonmodalMessageDlg .decrypt_error$gpg_error_id \ -aspect 50000 -icon error \ -message [::msgcat::mc \ "Data purportedly sent by\ %s can't be\ deciphered.\n\n%s." \ $from $result]] } error $result } debugmsg ssj "DECRYPT: $xlib; $from; $result" array set params $result return $params(plaintext) } # ::ssj::encrypted:output -- # # Result: # "" if encrypting is disabled for the given JID # 'enciphered data' if encrypting is enabled and succeeded # error if something went wrong proc ::ssj::encrypted:output {xlib data to} { variable ctx variable e4me variable j2k variable options variable gpg_error_id variable groupchat_encrypt if {$data eq ""} { return } if {![encryptP $xlib $to]} { return } set bto [::xmpp::jid::stripResource $to] set chatid [chat::chatid $xlib $to] if {[chat::is_groupchat $chatid]} { set name {} foreach n [::muc::roster $chatid] { set idx [list $xlib $to $n] if {[info exists groupchat_encrypt($idx)] && $groupchat_encrypt($idx)} { lappend name $j2k([::xmpp::jid::replaceResource $to $n]) } } } else { if {[info exists j2k($to)]} { set name [list $j2k($to)] } elseif {[llength [set k [array names j2k $to/*]]] > 0} { set name [list $j2k([lindex $k 0])] } else { set name [list $bto] } } set recipient [gpg::recipient] foreach n $name { $recipient add -name $n \ -validity full } foreach signer $e4me($xlib) { $recipient add -name $signer \ -validity full } once_only $xlib set code [catch {$ctx($xlib) encrypt -input $data \ -recipients $recipient} result] $recipient free if {$code} { debugmsg ssj "encryption processing error ($xlib): $result ($data)" set options(encrypt,$xlib,$to) 0 incr gpg_error_id if {[MessageDlg .encrypt_error$gpg_error_id \ -aspect 50000 \ -icon error \ -type user \ -buttons {ok cancel} \ -default 0 \ -cancel 1 \ -message [::msgcat::mc \ "Unable to encipher data for %s:\ %s.\n\nEncrypting traffic to this user is\ now disabled.\n\nSend it as PLAINTEXT?" \ $to $result]]} { error "" } return } set result [armor:encode $result] debugmsg ssj "ENCRYPT: $xlib; $data; $result" return $result } proc ::ssj::whichkeys {xlib what} { variable ctx variable warnings if {[catch {$ctx($xlib) set -property last-op-info} s]} { return } set keys {} while {([set x [string first $s]] > 0) && ([set y [string first $s]] > $x) && ($x+45 == $y)} { lappend keys [string range $s [expr {$x + 20}] [expr {$y - 1}]] set s [string range $s $y end] } if {![info exists warnings($what)]} { set warnings($what) "" } elseif {$warnings($what) eq $keys} { return } set warnings($what) $keys debugmsg ssj "${what}ing with $keys" } ############################################################################# proc ::ssj::prefs {xlib jid} { variable ctx variable options variable optionsX set w [win_id security_preferences [list $xlib $jid]] if {[winfo exists $w]} { focus -force $w return } Dialog $w \ -title [::msgcat::mc "Change security preferences for %s" $jid] \ -anchor e -default 0 -cancel 1 $w add -text [::msgcat::mc "OK"] \ -command [list ::ssj::prefs_ok $w $xlib $jid] $w add -text [::msgcat::mc "Cancel"] -command [list destroy $w] set f [$w getframe] if {![info exists options(encrypt,$xlib,$jid)]} { set options(encrypt,$xlib,$jid) [encryptP $xlib $jid] } set optionsX(encrypt,$xlib,$jid) $options(encrypt,$xlib,$jid) Checkbutton $f.encrypt \ -text [::msgcat::mc "Encrypt traffic"] \ -variable ::ssj::optionsX(encrypt,$xlib,$jid) pack $f.encrypt -side left pack [Frame $f.f -width 9c -height 2c] $w draw $f.name } proc ::ssj::prefs_ok {w xlib jid} { variable options variable optionsX set options(encrypt,$xlib,$jid) $optionsX(encrypt,$xlib,$jid) destroy $w } proc ::ssj::prefs_user_menu {m xlib jid} { $m add command -label [::msgcat::mc "Edit security..."] \ -command [list ::ssj::prefs $xlib $jid] } hook::add chat_create_user_menu_hook ::ssj::prefs_user_menu 78 hook::add chat_create_conference_menu_hook ::ssj::prefs_user_menu 78 hook::add roster_create_groupchat_user_menu_hook ::ssj::prefs_user_menu 78 hook::add roster_conference_popup_menu_hook ::ssj::prefs_user_menu 78 hook::add roster_service_popup_menu_hook ::ssj::prefs_user_menu 78 hook::add roster_jid_popup_menu_hook ::ssj::prefs_user_menu 78 hook::add message_dialog_menu_hook ::ssj::prefs_user_menu 78 ############################################################################# proc ::ssj::signP {} { variable options return $options(sign-traffic) } proc ::ssj::encryptP {xlib jid} { variable ctx variable j2k variable options if {$jid eq ""} { return $options(encrypt-traffic) } lassign [roster::get_category_and_subtype $xlib $jid] \ category subtype switch -- $category { conference - server - gateway - service { set resP 0 } default { set resP 1 } } set bjid [::xmpp::jid::stripResource $jid] if {[info exists options(encrypt,$xlib,$jid)]} { return $options(encrypt,$xlib,$jid) } elseif {[info exists options(encrypt,$xlib,$bjid)]} { return $options(encrypt,$xlib,$bjid) } elseif {[info exists options(encrypt,$jid)]} { return $options(encrypt,$jid) } elseif {[info exists options(encrypt,$bjid)]} { return $options(encrypt,$jid) } if {!$options(encrypt-traffic)} { return 0 } if {[info exists options(encrypt-tried,$xlib,$jid)]} { return $options(encrypt-tried,$xlib,$jid) } once_only $xlib if {[info exists j2k($jid)]} { set name $j2k($jid) } elseif {($resP) && ([llength [set k [array names j2k $jid/*]]] > 0)} { set name $j2k([lindex $k 0]) } else { set name $bjid } set recipient [gpg::recipient] $recipient add -name $name \ -validity full if {[catch {$ctx($xlib) encrypt -input "Hello world." \ -recipients $recipient}]} { set options(encrypt-tried,$xlib,$jid) 0 } else { set options(encrypt-tried,$xlib,$jid) 1 } $recipient free return $options(encrypt-tried,$xlib,$jid) } ############################################################################# proc ::ssj::e4meP {xlib keys} { variable ctx variable e4me variable signers $ctx($xlib) set -property signers \ -value [set signers($xlib) $keys] set e4me($xlib) {} foreach signer $signers($xlib) { set recipient [gpg::recipient] $recipient add -name $signer \ -validity full if {![catch {$ctx($xlib) encrypt -input "Hello world." \ -recipients $recipient} result]} { lappend e4me($xlib) $signer } $recipient free } } ############################################################################# proc ::ssj::sign:toggleP {} { variable options set options(sign-traffic) [expr {!$options(sign-traffic)}] } proc ::ssj::encrypt:toggleP {{xlib ""} {jid ""}} { variable options if {$jid eq ""} { set options(encrypt-traffic) [expr {!$options(encrypt-traffic)}] return } if {$xlib ne ""} { if {![info exists options(encrypt,$xlib,$jid)]} { set options(encrypt,$xlib,$jid) [encryptP $xlib $jid] } set options(encrypt,$xlib,$jid) \ [expr {!$options(encrypt,$xlib,$jid)}] } else { return -code error \ "::ssj::encrypt:toggleP: xlib is empty and jid is not" } } ############################################################################# proc ::ssj::signed:trace {script} { variable options variable trace if {![info exists trace(sign-traffic)]} { set trace(sign-traffic) {} ::trace add variable ::ssj::options(sign-traffic) write ::ssj::trace } lappend trace(sign-traffic) $script } proc ::ssj::encrypted:trace {script {xlib ""} {jid ""}} { variable options variable trace if {$jid eq ""} { set k encrypt-traffic } else { if {$xlib ne ""} { set k encrypt,$xlib,$jid } else { return -code error \ "::ssj::encrypted:trace: xlib is empty and jid is not" } } if {![info exists trace($k)]} { set trace($k) {} ::trace add variable ::ssj::options($k) write ::ssj::trace } lappend trace($k) $script } proc ::ssj::trace {name1 name2 op} { variable trace set new {} foreach script $trace($name2) { if {[catch {eval $script} result]} { debugmsg ssj "$result -- $script" } else { lappend new $script } } set trace($name2) $new } ############################################################################# proc ::ssj::clear_signatures {xlib} { variable signed array unset signed $xlib,* } hook::add disconnected_hook ::ssj::clear_signatures ############################################################################# proc ::ssj::check_signature {xlib from type x args} { variable NS variable signed switch -- $type { unavailable - available { unset -nocomplain signed($xlib,$from) set signature "" foreach xs $x { ::xmpp::xml::split $xs tag xmlns attrs cdata subels if {$xmlns eq $NS(signed)} { set signature $cdata break } } # in case the sender didn't check the exit code from gpg... if {$signature eq ""} return set status "" foreach {key val} $args { switch -- $key { -status { set status $val } } } set signed($xlib,$from) \ [signed:input $xlib $from $signature $status \ [::msgcat::mc "Presence information"]] } } } hook::add client_presence_hook ::ssj::check_signature ############################################################################# proc ::ssj::make_signature {varname xlib status} { variable NS upvar 2 $varname var if {![catch {signed:output $xlib $status} cdata] && $cdata ne ""} { lappend var [::xmpp::xml::create x -xmlns $NS(signed) \ -cdata $cdata] } return } hook::add presence_xlist_hook ::ssj::make_signature ############################################################################# proc ::ssj::add_timestamp \ {vxlib vto vid vtype vsubject vbody verr vthread vx} { variable options upvar 2 $vxlib xlib upvar 2 $vto to upvar 2 $vbody body upvar 2 $vx x if {!$options(prevent-replay-attack)} return if {![info exists body]} return if {(![catch {ssj::signed:output $xlib $body $to} cdata] && $cdata ne "") || \ (![catch {ssj::encrypted:output $xlib $body $to} cdata] && $cdata ne "")} { set timestamp [clock format [clock seconds] \ -format "%Y%m%dT%TZ" -gmt true] if {$body ne ""} { set body " $body" } set body "\[To: [::xmpp::jid::removeResource $to], Date: $timestamp\]$body" } return } hook::add rewrite_outgoing_message_hook ::ssj::add_timestamp 5 proc ::ssj::sign_encrypt_body \ {vxlib vto vid vtype vsubject vbody verr vthread vx} { variable NS upvar 2 $vxlib xlib upvar 2 $vto to upvar 2 $vtype type upvar 2 $vbody body upvar 2 $vx x if {![info exists body]} return set newbody $body foreach tag {encrypted signed} { if {[catch {ssj::${tag}:output $xlib $body $to} cdata]} { debugmsg ssj "ssj::${tag}:output: $cdata" # Disable sending the message hook::unset_flag rewrite_outgoing_message_hook send return } if {$cdata ne ""} { lappend x [::xmpp::xml::create x -xmlns $NS($tag) -cdata $cdata] if {$type ne "groupchat"} { # Groupchat messages are shown only when come back, so don't # setup drawing the signed/encrypted icons for them hook::unset_flag rewrite_outgoing_message_hook $tag } if {$tag eq "encrypted"} { if {$type eq "groupchat"} { set newbody "This message is encrypted." } else { set lang [get_jid_presence_info lang $xlib $to] set newbody [::trans::trans $lang "This message is encrypted."] } } } } set body $newbody return } hook::add rewrite_outgoing_message_hook ::ssj::sign_encrypt_body ############################################################################# proc ::ssj::userinfo {tab xlib jid editable} { variable signed if {$editable} return set bare_jid [::xmpp::jid::stripResource $jid] set chatid [chat::chatid $xlib $bare_jid] if {[chat::is_groupchat $chatid]} { if {[info exists signed($xlib,$jid)]} { set jids [list $xlib,$jid] } else { set jids [list] } } else { set jids [array names signed $xlib,$bare_jid/*] } if {[llength $jids] > 0} { set presenceinfo [$tab insert end presenceinfo \ -text [::msgcat::mc "Presence"]] set i 0 foreach j $jids { regexp {[^,]*,(.*)} $j -> fjid set x [userinfo::pack_frame $presenceinfo.presence_$i $fjid] unset -nocomplain params array set params $signed($j) set kv {} set addrs "" set s "" foreach signature $params(signatures) { foreach {k v} $signature { switch -- $k { key { foreach {k v} $v { if {$k ne "subkeys"} continue foreach subkey $v { unset -nocomplain sparams array set sparams $subkey if {[info exists sparams(email)]} { append addrs $s $sparams(email) set s ", " } } } continue } status { continue } created - expires { set v [clock format $v] } fingerprint { lappend kv keyid [format "0x%s" [keyid $v]] } default { if {$v eq ""} continue } } lappend kv $k $v } } userinfo::pack_entry $jid $x $i presence_$i \ [::msgcat::mc "Reason:"] if {![info exists params(reason)]} { set params(reason) [::msgcat::mc "Presence is signed"] if {$addrs ne ""} { append params(reason) [::msgcat::mc " by "] $addrs } } set ::userinfo::userinfo(presence_$i,$jid) $params(reason) incr i foreach {k v} $kv { userinfo::pack_entry $jid $x $i presence_$i \ [::msgcat::mc [string totitle ${k}:]] set ::userinfo::userinfo(presence_$i,$jid) $v incr i } } } } hook::add userinfo_hook ::ssj::userinfo 90 ############################################################################# proc ::ssj::message_buttons {mw xlib jid} { set bbox1 [ButtonBox $mw.bottom.buttons1 -spacing 0] # TODO reflect changes of xlib set b [$bbox1 add \ -image [encrypted:icon $xlib $jid] \ -helptype balloon \ -helptext [::msgcat::mc "Toggle encryption"] \ -relief link \ -command [list ::ssj::encrypt:toggleP $xlib $jid]] encrypted:trace \ "$b configure -image \ \[::ssj::encrypted:icon [list $xlib] [list $jid]\]" \ $xlib $jid pack $bbox1 -side left -fill x -padx 2m -pady 2m } hook::add open_message_post_hook ::ssj::message_buttons ############################################################################# proc ::ssj::process_x_signed {rowvar bodyvar f x xlib from id type replyP} { variable NS upvar 2 $rowvar row upvar 2 $bodyvar body if {!$replyP || $type eq "error"} { return } foreach xa $x { ::xmpp::xml::split $xa tag xmlns attrs cdata subels if {$tag ne "" || $xmlns ne $NS(signed)} { continue } set lb [join [lrange [split $f .] 0 end-1] .].title.signed if {[winfo exists $lb]} { destroy $lb } grid [signed:Label $lb $xlib $from $attrs] -row 1 -column 2 -sticky e } return } hook::add message_process_x_hook ::ssj::process_x_signed 20 ############################################################################# proc ::ssj::signed:icon {} { return [lindex [list toolbar/gpg-unsigned toolbar/gpg-signed] \ [signP]] } proc ::ssj::encrypted:icon {{xlib ""} {jid ""}} { return [lindex [list toolbar/gpg-unencrypted toolbar/gpg-encrypted] \ [encryptP $xlib $jid]] } ############################################################################# proc ::ssj::draw_signed {chatid from type body x} { variable NS variable signedid set chatw [chat::chat_win $chatid] if {![hook::is_flag rewrite_outgoing_message_hook signed]} { $chatw image create end -image gpg/signed hook::set_flag rewrite_outgoing_message_hook signed } else { foreach xe $x { ::xmpp::xml::split $xe tag xmlns attrs cdata subels if {$tag ne "" || $xmlns ne $NS(signed)} continue incr signedid set xlib [chat::get_xlib $chatid] catch { set lb $chatw.signed$signedid $chatw window create end \ -window [signed:Label $lb $xlib $from $attrs] $lb configure -background [get_conf $chatw -background] } } } } hook::add draw_message_hook ::ssj::draw_signed 5.2 ############################################################################### proc ::ssj::chat_window_button {chatid type} { variable groupchat_encrypt variable signed variable options set xlib [chat::get_xlib $chatid] set jid [chat::get_jid $chatid] set cw [chat::winid $chatid] set w $cw.status.encrypted if {$type eq "chat"} { set command [list ::ssj::encrypt:toggleP $xlib $jid] } else { set command [list ::ssj::groupchat_encrypt_dialog $xlib $jid] set options(encrypt,$xlib,$jid) 0 } Button $w \ -relief link \ -image [encrypted:icon $xlib $jid] \ -helptype balloon \ -helptext [::msgcat::mc "Toggle encryption"] \ -command $command encrypted:trace \ "$w configure -image \[::ssj::encrypted:icon $xlib $jid\]" $xlib $jid pack $w -side left -before $cw.status.mb foreach nick [::muc::roster $chatid] { set user_jid [::xmpp::jid::replaceResource $jid $nick] if {![info exists signed($xlib,$user_jid)]} continue set idx [list $xlib $jid $nick] if {![info exists groupchat_encrypt($idx)]} { set groupchat_encrypt($idx) 0 } } } hook::add open_chat_post_hook ::ssj::chat_window_button proc ::ssj::on_close_chat {chatid} { variable groupchat_encrypt variable options set xlib [chat::get_xlib $chatid] set jid [chat::get_jid $chatid] array unset groupchat_encrypt [list $xlib $jid *] set options(encrypt,$xlib,$jid) 0 } hook::add close_chat_post_hook ::ssj::on_close_chat proc ::ssj::groupchat_encrypt_dialog {xlib jid} { variable groupchat_encrypt variable signed variable groupencrypt[psuffix $xlib] unset -nocomplain groupencrypt[psuffix $xlib] set chatid [chat::chatid $xlib $jid] set nicks {} set balloons {} set disabled {} foreach nick [lsort -dictionary [::muc::roster $chatid]] { set user_jid [::xmpp::jid::replaceResource $jid $nick] if {![info exists signed($xlib,$user_jid)]} { set groupencrypt[psuffix $xlib]($nick) 0 continue } lappend nicks $nick $nick lappend balloons $nick [signed:info $signed($xlib,$user_jid)] unset -nocomplain params array set params $signed($xlib,$user_jid) if {[info exists params(reason)]} { set groupencrypt[psuffix $xlib]($nick) 0 lappend disabled $nick 1 } else { set idx [list $xlib $jid $nick] if {[info exists groupchat_encrypt($idx)]} { set groupencrypt[psuffix $xlib]($nick) $groupchat_encrypt($idx) } } } set dw .groupencrypt[psuffix $xlib] if {[winfo exists $dw]} { destroy $dw } CbDialog $dw [::msgcat::mc "Select room %s participants for encrypting\ traffic to" $jid] \ [list [::msgcat::mc "OK"] [list ::ssj::save_groupchat_encrypt $dw $xlib $jid] \ [::msgcat::mc "Cancel"] [list destroy $dw]] \ ::ssj::groupencrypt[psuffix $xlib] $nicks $balloons \ -disabled $disabled -modal local } proc ::ssj::save_groupchat_encrypt {dw xlib jid} { variable groupchat_encrypt variable groupencrypt[psuffix $xlib] foreach nick [array names groupencrypt[psuffix $xlib]] { set idx [list $xlib $jid $nick] if {![info exists groupchat_encrypt($idx)]} { set groupchat_encrypt($idx) 0 } if {[set groupencrypt[psuffix $xlib]($nick)]} { set groupchat_encrypt($idx) 1 } else { set groupchat_encrypt($idx) 0 } } destroy $dw unset -nocomplain groupencrypt[psuffix $xlib] } proc ::ssj::aggregate_encrypt {name1 name2 op} { variable options variable groupchat_encrypt # Node and server can't contain a comma lassign [split $name2] xlib jid set chatid [chat::chatid $xlib $jid] foreach nick [::muc::roster $chatid] { set idx [list $xlib $jid $nick] if {[info exists groupchat_encrypt($idx)] && $groupchat_encrypt($idx)} { set options(encrypt,$xlib,$jid) 1 return } } set options(encrypt,$xlib,$jid) 0 } trace add variable ::ssj::groupchat_encrypt {write} ::ssj::aggregate_encrypt ############################################################################### proc ::ssj::toolbar {} { set idx [ifacetk::add_toolbar_button \ [signed:icon] \ ::ssj::sign:toggleP \ [::msgcat::mc "Toggle signing presence updates"]] signed:trace \ [list ifacetk::set_toolbar_icon $idx ::ssj::signed:icon] set idx [ifacetk::add_toolbar_button \ [encrypted:icon] \ ::ssj::encrypt:toggleP \ [::msgcat::mc "Toggle encryption (when possible)"]] encrypted:trace \ [list ifacetk::set_toolbar_icon $idx ::ssj::encrypted:icon] } hook::add finload_hook ::ssj::toolbar ############################################################################### proc ::ssj::setup_menu {} { variable options set m [.mainframe getmenu tkabber] set ind [$m index [::msgcat::mc "View"]] incr ind -1 set mm .ssj_menu menu $mm -tearoff $::ifacetk::options(show_tearoffs) $mm add checkbutton -label [::msgcat::mc "Sign presence updates"] \ -variable ::ssj::options(sign-traffic) $mm add checkbutton \ -label [::msgcat::mc "Encrypt messages (when possible)"] \ -variable ::ssj::options(encrypt-traffic) $m insert $ind cascade -label [::msgcat::mc "Encryption"] \ -menu $mm } hook::add finload_hook ::ssj::setup_menu ############################################################################### proc ::ssj::add_user_popup_info {infovar xlib jid} { variable signed upvar 0 $infovar info if {[info exists signed($xlib,$jid)]} { set signed_info [signed:info $signed($xlib,$jid)] append info [::msgcat::mc "\n\tPresence is signed:"] regsub -all {(\n)} "\n$signed_info" "\\1\t " extra append info $extra } } hook::add roster_user_popup_info_hook ::ssj::add_user_popup_info 99 ############################################################################### proc ::ssj::process_gpg_input_error {xlib from what message} { show_error $message } hook::add gpg_input_error_hook ::ssj::process_gpg_input_error 99 proc ::ssj::show_error {message} { set w .gpg_error if {![winfo exists $w]} { Dialog $w -title [::msgcat::mc "GPG error"] \ -modal none -transient no \ -anchor e -default 0 $w add -text [::msgcat::mc "Close"] -command [list destroy $w] set f [$w getframe] ScrolledWindow $f.sw -scrollbar vertical pack $f.sw -fill both -expand yes -side bottom Text $f.text -wrap word $f.sw setwidget $f.text $w draw } set t [$w getframe].text $t configure -state normal $t insert end [format {[%s]: %s} \ [clock format [clock seconds]] $message\n\n] $t configure -state disabled } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/general/headlines.tcl000064400000000000000000001002251477701321300176070ustar00nobodynobody# headlines.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # implements processing and displaying headline messages. namespace eval headlines { variable headid 0 variable headlines array set headlines {} variable selected_id variable options variable trees {} custom::defvar send_jids {} \ [::msgcat::mc "List of JIDs to whom headlines have been sent."] \ -group Hidden custom::defvar options(cache) 0 \ [::msgcat::mc "Cache headlines on exit and restore on start."] \ -group Messages -type boolean custom::defvar options(multiple) 0 \ [::msgcat::mc "Display headlines in single/multiple windows."] \ -group Messages -type options \ -values [list 0 [::msgcat::mc "Single window"] \ 1 [::msgcat::mc "One window per bare JID"] \ 2 [::msgcat::mc "One window per full JID"]] custom::defvar options(mark_seen_by) following \ [::msgcat::mc "Mark headline read by"] \ -group Messages -type options \ -values [list following [::msgcat::mc "Following"] \ selection [::msgcat::mc "Selection"] \ timeout [string trim [::msgcat::mc "Timeout "]]] custom::defvar options(mark_timeout) 2 \ [::msgcat::mc "Headline read timeout value (in seconds)."] \ -group Messages -type integer custom::defvar options(display_subject_only) 1 \ [::msgcat::mc "Do not display headline descriptions as tree nodes."] \ -group Messages -type boolean custom::defvar options(timestamp_format) {[%R] } \ [::msgcat::mc "Format of timestamp in headline tree view. Set to\ empty string if you don't want to see timestamps."] \ -group Messages -type string custom::defvar options(show_balloons) 0 \ [::msgcat::mc "Show balloons with headline messages over tree nodes."] \ -group Messages -type boolean } ############################################################################# package require md5 ############################################################################# proc headlines::process_message {xlib from id type is_subject subject body err thread priority x} { switch -- $type { headline { show $xlib $from $type $subject $body $thread $priority $x return stop } } return } hook::add process_message_hook \ [namespace current]::headlines::process_message 90 ############################################################################# proc headlines::get_win {xlib from} { variable options switch -- $options(multiple) { 0 { return .headlines } 1 { return .headlines_[jid_to_tag [::xmpp::jid::stripResource $from]] } default { return .headlines_[jid_to_tag $from] } } } ############################################################################# proc headlines::get_tree {xlib from} { set hw [get_win $xlib $from] return $hw.tree } ############################################################################# proc headlines::open_window {xlib from} { global tcl_platform variable options variable trees set hw [get_win $xlib $from] if {[winfo exists $hw]} return switch -- $options(multiple) { 0 { set title [::msgcat::mc "Headlines"] set tabtitle [::msgcat::mc "Headlines"] } 1 { set user [::xmpp::jid::stripResource $from] set title [::msgcat::mc "%s Headlines" $user] set tabtitle [::xmpp::jid::node $from] } default { set title [::msgcat::mc "%s Headlines" $from] set tabtitle [::xmpp::jid::node $from]/[::xmpp::jid::resource $from] } } set tw [get_tree $xlib $from] if {$tw ni $trees} { lappend trees $tw } add_win $hw -title $title -tabtitle $tabtitle \ -raisecmd [list focus $tw] \ -class JDisco PanedWin $hw.pw -orient vertical pack $hw.pw -fill both -expand yes set uw [PanedWinAdd $hw.pw -weight 1] set dw [PanedWinAdd $hw.pw -weight 1] Frame $dw.date if {[catch {$dw.date configure -background}]} { set bg [ttk::style lookup TFrame -background] } else { set bg [lindex [$dw.date configure -background] 4] } Label $dw.date.label -anchor w -text [::msgcat::mc "Date:"] entry $dw.date.ts -state readonly \ -takefocus 0 \ -highlightthickness 0 \ -relief flat \ -readonlybackground $bg pack $dw.date -fill x pack $dw.date.label -side left pack $dw.date.ts -side left -fill x -expand yes Frame $dw.from Label $dw.from.label -anchor w -text [::msgcat::mc "From:"] entry $dw.from.jid -state readonly \ -takefocus 0 \ -highlightthickness 0 \ -relief flat \ -readonlybackground $bg pack $dw.from -fill x pack $dw.from.label -side left pack $dw.from.jid -side left -fill x -expand yes Frame $dw.subject Label $dw.subject.lsubj -anchor w -text [::msgcat::mc "Subject:"] text $dw.subject.subj \ -height 1 \ -takefocus 0 \ -highlightthickness 0 \ -relief flat \ -state disabled \ -background $bg pack $dw.subject -fill x pack $dw.subject.lsubj -side left pack $dw.subject.subj -side left -fill x -expand yes if {[string equal $tcl_platform(platform) unix] && \ ![string equal [option get $hw disabledForeground JDisco] ""]} { set config(seencolor) [option get $hw disabledForeground JDisco] } else { set config(seencolor) [option get $hw featurecolor JDisco] } set config(unseencolor) [option get $hw fill JDisco] set sw [ScrolledWindow $uw.sw] MyTree $tw $tw tag configure seen -foreground $config(seencolor) $tw tag configure unseen -foreground $config(unseencolor) bind $tw <> \ [list [namespace current]::update_body \ [double% $dw.date.ts] \ [double% $dw.from.jid] \ [double% $dw.subject.subj] \ [double% $hw.body] %W] $sw setwidget $tw pack $sw -side top -expand yes -fill both $tw tag bind Text <> [list [namespace current]::select_popup [double% $hw] %x %y] $tw tag bind Text \ [double% "[namespace current]::action browse $hw \[$tw selection\]"] balloon::setup $tw -command [list [namespace current]::balloon $hw] if {[winfo exists $tw.c]} { # HACK bind $tw.c \ [double% "[namespace current]::action browse $hw \[$tw selection\]"] bind $tw.c \ [double% "[namespace current]::action delete $hw \[$tw selection\]"] bind $tw.c \ [double% "[namespace current]::action toggle $hw \[$tw selection\]"] } else { $tw tag bind Text \ [double% "[namespace current]::action browse $hw \[$tw selection\]"] $tw tag bind Text \ [double% "[namespace current]::action delete $hw \[$tw selection\]"] $tw tag bind Text \ [double% "[namespace current]::action toggle $hw \[$tw selection\]"] } set dsw [ScrolledWindow $dw.sw] Text $hw.body -height 12 -state disabled \ -wrap word -takefocus 1 ::richtext::config $hw.body -using url $dsw setwidget $hw.body pack $dsw -expand yes -fill both -anchor nw bind $hw.body [list focus %W] foreach ww [list $hw.body $dw.date.ts $dw.from.jid $dw.subject.subj] { foreach event { } { if {[winfo exists $tw.c]} { set w $tw.c } else { set w Treeview } bind $ww $event [string map [list %W [double% $tw]] [bind $w $event]] } } hook::run open_headlines_post_hook $hw $tw $uw $dw } ############################################################################# proc headlines::show {xlib from type subject body thread priority x {data {}}} { variable headid variable headlines variable trees variable options set subject [string trim $subject] set body [string trim $body] set desc "" set url "" set seconds [::xmpp::xml::getAttr [::xmpp::delay::parse $x] seconds] foreach extra $x { ::xmpp::xml::split $extra tag xmlns attrs cdata subels switch -- $xmlns { jabber:x:oob { foreach item $subels { ::xmpp::xml::split $item stag sxmlns sattrs scdata ssubels switch -- $stag { desc - url { set $stag [string trim $scdata] } } } } } } if {[string equal $subject ""] && [string equal $body ""] && \ [string equal $desc ""] && [string equal $url ""]} { # Ignore an empty message return } if {[string equal $subject ""]} { set subject $desc } else { if {$options(display_subject_only)} { set desc $subject } } if {$subject == ""} { set dsubject [::msgcat::mc ""] } else { set dsubject $subject } if {$desc == ""} { set ddesc [::msgcat::mc ""] } else { set ddesc $desc } set hw [get_win $xlib $from] if {![winfo exists $hw]} { open_window $xlib $from } set tw [get_tree $xlib $from] if {$options(multiple) > 1} { set text $dsubject } else { set text $from } set fnode [str2node $text] if {![$tw exists $fnode]} { $tw insert {} end -id $fnode \ -text [string map [list "\n" " "] $text] \ -open 1 \ -image browser/headline \ -tags {Text seen} \ -values [list type from text $text unseen 0] } if {($options(multiple) > 1) || ([string equal $subject $desc])} { set snode $fnode } else { set snode $fnode-subject-[str2node $dsubject] if {![$tw exists $snode]} { $tw insert $fnode end -id $snode \ -text [string map [list "\n" " "] $dsubject] \ -open 1 \ -image browser/headline \ -tags {Text seen} \ -values [list type subject text $subject unseen 0] } } set anode $fnode-article-[incr headid] if {[$tw exists $anode]} { $tw delete [list $anode] } array set props [list type article unseen 1 seconds $seconds] array set props $data array set props [list text $desc url $url body $body] set nodetext \ [clock format $props(seconds) -format $options(timestamp_format)] append nodetext [string map [list "\n" " "] $ddesc] $tw insert $snode end -id $anode \ -text $nodetext \ -open 1 \ -tags {Text seen} \ -values [array get props] if {$props(unseen)} { $tw item $anode -tags {Text unseen} } set headlines($anode) [list $xlib $from $type $subject $body $thread $priority $x] update $tw $anode tab_set_updated $hw 1 message } ############################################################################# proc headlines::str2node {string} { set utf8str [encoding convertto utf-8 $string] if {[catch { ::md5::md5 -hex $utf8str } ret]} { return [::md5::md5 $utf8str] } else { return $ret } } ############################################################################# proc headlines::update_body {wdate wfrom wsubj wbody tw} { variable headlines variable options variable selected_id variable shown set node [lindex [$tw selection] 0] if {[info exists shown($tw)] && $shown($tw) eq $node} { return } set shown($tw) $node if {[catch {array set props [$tw item $node -values]}] || ![info exists props(type)] || \ $props(type) != "article"} { set from "" set subj "" set body "" set date "" set url "" } else { set from [lindex $headlines($node) 1] set subj [string map [list "\n" " "] $props(text)] set body $props(body) set date [clock format $props(seconds)] set url $props(url) if {[info exists selected_id]} { after cancel $selected_id } if {$props(unseen)} { switch -- $options(mark_seen_by) { selection { after idle \ [namespace code [list action toggle \ [winfo parent $tw] $node]] } timeout { if {$props(unseen) == 1} { set selected_id [after [expr {$options(mark_timeout)*1000}] \ [namespace code [list action markseen \ [winfo parent $tw] $node]]] } } } } } foreach {w s} [list $wdate $date \ $wfrom $from] { $w configure -state normal $w delete 0 end $w insert 0 $s if {[catch {$w configure -state readonly}]} { $w configure -state disabled } } $wsubj configure -state normal $wsubj delete 0.0 end $wsubj insert 0.0 $subj $wsubj delete {end - 1 char} $wsubj mark set sel_start end $wsubj mark set sel_end 0.0 $wsubj configure -state disabled $wbody configure -state normal $wbody delete 0.0 end ::richtext::render_message $wbody "$body\n\n" "" if {$url != ""} { ::plugins::urls::render_url $wbody url $url {} \ -title [::msgcat::mc "Read on..."] \ -add-command [namespace code [list action markseen \ [winfo parent $tw] $node]] } $wbody mark set sel_start end $wbody mark set sel_end 0.0 $wbody configure -state disabled } ############################################################################# proc headlines::update_menu {menu num} { variable send_jids set ind 3 if {$num} { $menu delete $ind [expr $ind + $num - 1] } foreach jid $send_jids { $menu insert $ind command \ -label [::msgcat::mc "Forward to %s" $jid] \ -command "[namespace current]::forward3 [list $menu] [list $jid] \ \$[namespace current]::headwindow \$[namespace current]::headnode" incr ind } } ############################################################################# namespace eval headlines { variable m if {[winfo exists [set m .h1popmenu]]} { destroy $m } menu $m -tearoff 0 $m add command -label [::msgcat::mc "Browse"] \ -command "[namespace current]::action browse \ \$[namespace current]::headwindow \$[namespace current]::headnode" $m add separator $m add command -label [::msgcat::mc "Forward..."] \ -command "[namespace current]::action forward \ \$[namespace current]::headwindow \$[namespace current]::headnode" $m add separator $m add command -label [::msgcat::mc "Copy headline to clipboard"] \ -command "[namespace current]::action copy_headline \ \$[namespace current]::headwindow \$[namespace current]::headnode" $m add command -label [::msgcat::mc "Copy URL to clipboard"] \ -command "[namespace current]::action copy_url \ \$[namespace current]::headwindow \$[namespace current]::headnode" $m add command -label [::msgcat::mc "Toggle seen"] \ -command "[namespace current]::action toggle \ \$[namespace current]::headwindow \$[namespace current]::headnode" \ -accelerator Insert $m add command -label [::msgcat::mc "Delete"] \ -command "[namespace current]::action delete \ \$[namespace current]::headwindow \$[namespace current]::headnode" hook::add finload_hook [list [namespace current]::update_menu $m 0] if {[winfo exists [set m .h2popmenu]]} { destroy $m } menu $m -tearoff 0 $m add command -label [::msgcat::mc "Sort"] \ -command "[namespace current]::action sort \ \$[namespace current]::headwindow \$[namespace current]::headnode" $m add command -label [::msgcat::mc "Sort by date"] \ -command "[namespace current]::action datesort \ \$[namespace current]::headwindow \$[namespace current]::headnode" $m add command -label [::msgcat::mc "Mark all seen"] \ -command "[namespace current]::action markseen \ \$[namespace current]::headwindow \$[namespace current]::headnode" $m add command -label [::msgcat::mc "Mark all unseen"] \ -command "[namespace current]::action markunseen \ \$[namespace current]::headwindow \$[namespace current]::headnode" $m add command -label [::msgcat::mc "Delete seen"] \ -command "[namespace current]::action deleteseen \ \$[namespace current]::headwindow \$[namespace current]::headnode" $m add command -label [::msgcat::mc "Delete all"] \ -command "[namespace current]::action delete \ \$[namespace current]::headwindow \$[namespace current]::headnode" } ############################################################################# proc headlines::select_popup {hw x y} { variable headwindow variable headnode set tw $hw.tree $tw selection set [list [$tw identify item $x $y]] set node [lindex [$tw selection] 0] if {[catch {array set props [$tw item $node -values]}]} { return } set headwindow $hw set headnode $node switch -- $props(type) { article { set hm .h1popmenu } default { set hm .h2popmenu } } tk_popup $hm [winfo pointerx .] [winfo pointery .] } ############################################################################# proc headlines::action {action hw node} { variable headlines variable options if {[catch {array set props [[set tw $hw.tree] item $node -values]}]} { return } switch -glob -- $props(type)/$action { article/browse { if {$props(url) != ""} { browseurl $props(url) } if {$props(unseen)} { switch -- $options(mark_seen_by) { following { set props(unseen) 0 $tw item $node -tags {Text seen} -values [array get props] update $tw $node } } } } article/forward { forward .h1popmenu $tw $node } article/copy_headline { clipboard clear -displayof $hw clipboard append -displayof $hw "$props(text)\n$props(body)\n$props(url)" } article/copy_url { clipboard clear -displayof $hw clipboard append -displayof $hw $props(url) } article/toggle { if {$props(unseen)} { set props(unseen) 0 set tag seen } else { set props(unseen) 1 set tag unseen } $tw item $node -tags [list Text $tag] -values [array get props] update $tw $node } article/markseen { set props(unseen) 0 $tw item $node -tags {Text seen} -values [array get props] update $tw $node } article/markunseen { set props(unseen) 1 $tw item $node -tags {Text unseen} -values [array get props] update $tw $node } */delete { set props(unseen) 0 $tw item $node -tags {Text seen} -values [array get props] update $tw $node # Deduce the node to select after $node is deleted: # Next sibling is tried first, then previous, then parent node. set p [$tw parent $node] set end [expr {[llength [$tw children $p]] - 1}] set ix [$tw index $node] if {$ix < $end} { set next [lindex [$tw children $p] [incr ix]] } elseif {$ix > 0} { set next [lindex [$tw children $p] [incr ix -1]] } else { set next $p } $tw delete [list $node] if {![string equal $next {}]} { $tw selection set [list $next] } } article/deleteseen { if {$props(unseen) == 0} { action delete $hw $node } } from/markseen - subject/markseen { foreach child [$tw children $node] { action markseen $hw $child } } from/markunseen - subject/markunseen { foreach child [$tw children $node] { action markunseen $hw $child } } from/deleteseen - subject/deleteseen { if {$props(unseen) > 0} { foreach child [$tw children $node] { action deleteseen $hw $child } } else { action delete $hw $node } } from/sort - subject/sort { set children {} foreach child [$tw children $node] { catch {unset props} array set props [$tw item $child -values] lappend children [list $child $props(text)] } set neworder {} foreach child [lsort -index 1 $children] { lappend neworder [lindex $child 0] } $tw children $node $neworder foreach child [$tw children $node] { action $action $hw $child } } from/datesort - subject/datesort { set children {} set seconds [clock seconds] foreach child [$tw children $node] { catch {unset props} set props(seconds) $seconds array set props [$tw item $child -values] lappend children [list $child $props(seconds)] } set neworder {} foreach child [lsort -decreasing -index 1 $children] { lappend neworder [lindex $child 0] } $tw children $node $neworder foreach child [$tw children $node] { action $action $hw $child } } default { } } } ############################################################################# proc headlines::update {tw node} { for {set parent [$tw parent $node]} \ {![string equal $parent {}]} \ {set parent [$tw parent $parent]} { set unseen 0 foreach child [$tw children $parent] { catch {unset props} array set props [$tw item $child -values] incr unseen $props(unseen) } catch {unset props} array set props [$tw item $parent -values] set props(unseen) $unseen set text $props(text) if {$text == ""} { set text [::msgcat::mc ""] } set tag seen if {$unseen > 0} { append text " ($unseen)" set tag unseen } $tw item $parent -text $text \ -tags [list Text $tag] \ -values [array get props] } } ############################################################################# proc headlines::balloon {hw args} { variable options set tw $hw.tree if {[llength $args] == 1} { set node [lindex $args 0] } else { if {$::interface eq "ttk"} { set bd [ttk::style lookup Treeview -borderwidth {} [winfo pixels $tw 0.25m]] } else { set bd [winfo pixels $tw 0.25m] } set x [expr {[winfo pointerx $tw] - [winfo rootx $tw] - $bd}] set y [expr {[winfo pointery $tw] - [winfo rooty $tw] - $bd}] set node [$tw identify item $x $y] if {$node eq ""} { return [list $hw:$node ""] } } if {!$options(show_balloons)} { return [list $hw:$node ""] } if {[catch {array set props [$tw item $node -values]}]} { return [list $hw:$node ""] } set width [expr {[winfo width $tw] * 0.8}] if {$width < [winfo pixels $tw 12c]} { set width [winfo pixels $tw 12c] } switch -- $props(type) { article { if {![string equal $props(body) ""]} { return [list $hw:$node $props(body) -width $width] } } } return [list $hw:$node ""] } ############################################################################# proc headlines::save {} { variable options variable trees if {!$options(cache)} { return } if {[catch {open [set file1 [file join $::configdir headlines1.tcl]] \ {WRONLY CREAT TRUNC}} fd]} { debugmsg headlines "unable to open $file: $fd" return } fconfigure $fd -encoding utf-8 set code [catch { foreach tw $trees { save_aux $tw {} $fd } } result] catch {close $fd} if {$code} { debugmsg headlines $result catch {file delete $file1} return } set renameP 0 if {![file exists [set file [file join $::configdir headlines.tcl]]]} { } elseif {[file size $file] == 0} { catch { file delete -force $file } } else { set renameP 1 catch {file rename -force $file \ [set file0 [file join $::configdir headlines0.tcl]]} } if {![catch {file rename $file1 $file} result]} { return } debugmsg headlines "unable to rename $file1 to $file: $result" if {($renameP) && ([catch {file rename -force $file0 $file} result])} { debugmsg headlines "unable to rename $file0 back to $file: $result" } catch {file delete $file1} return } ############################################################################# proc headlines::save_aux {tw node fd} { variable headlines if {![winfo exists $tw]} { return } if {[llength [set children [$tw children $node]]] > 0} { foreach child $children { save_aux $tw $child $fd } } elseif {([info exists headlines($node)]) \ && (![catch {array set props [$tw item $node -values]}])} { puts $fd [concat [list [namespace current]::show] \ $headlines($node) [list [array get props]]] } } ############################################################################# proc headlines::restore {} { variable options if {$options(cache)} { if {[file exists [set file [file join $::configdir headlines.tcl]]]} { catch { set fd [open $file "r"] fconfigure $fd -encoding utf-8 uplevel #0 [read $fd] close $fd } } } return "" } ############################################################################# proc headlines::forward3 {menu to tw node} { variable send_jids if {[catch {array set props [$tw.tree item $node -values]}]} { return } if {[llength [connections]] == 0} return set xlib [lindex [connections] 0] # TODO: xlib message::send_msg $xlib $to -type headline \ -subject $props(text) \ -body $props(body) \ -xlist [list [::xmpp::xml::create x \ -xmlns jabber:x:oob \ -subelement [::xmpp::xml::create url \ -cdata $props(url)] \ -subelement [::xmpp::xml::create desc \ -cdata $props(text)]]] set len [llength $send_jids] set send_jids [update_combo_list $send_jids $to 10] update_menu $menu $len } ############################################################################# proc headlines::forward2 {menu tw node} { global forward_hl variable send_jids if {[catch {array set props [$tw item $node -values]}]} { return } set len [llength $send_jids] set _send_jids $send_jids foreach choice [array names forward_hl] { if {$forward_hl($choice)} { lassign $choice xlib to message::send_msg $xlib $to -type headline \ -subject $props(text) \ -body $props(body) \ -xlist [list [::xmpp::xml::create x \ -xmlns jabber:x:oob \ -subelement [::xmpp::xml::create url \ -cdata $props(url)] \ -subelement [::xmpp::xml::create desc \ -cdata $props(text)]]] set _send_jids [update_combo_list $_send_jids $to 10] } } set send_jids $_send_jids update_menu $menu $len } ############################################################################# proc headlines::forward {menu tw node} { global forward_hl set gw .forward_headline catch {destroy $gw} set choices {} set balloons {} foreach c [connections] { foreach choice [roster::get_jids $c] { if {![string equal [roster::itemconfig $c $choice -category] conference]} { lappend choices [list $c $choice] [roster::get_label $c $choice] lappend balloons [list $c $choice] $choice } } } if {[llength $choices] == 0} { MessageDlg ${gw}_err -aspect 50000 -icon info \ -message [::msgcat::mc "No users in roster..."] -type user \ -buttons ok -default 0 -cancel 0 return } CbDialog $gw [::msgcat::mc "Forward headline"] \ [list [::msgcat::mc "Send"] "[namespace current]::forward2 [list $menu] \ [list $tw] \ [list $node] destroy $gw" \ [::msgcat::mc "Cancel"] [list destroy $gw]] \ forward_hl $choices $balloons } ############################################################################# hook::add finload_hook [namespace current]::headlines::restore hook::add quit_hook [namespace current]::headlines::save ############################################################################# proc headlines::restore_window {from xlib jid} { open_window $xlib $from } ############################################################################# # TODO: Work with changes in options(multiple) proc headlines::save_session {vsession} { upvar 2 $vsession session global usetabbar # We don't need JID at all, so make it empty (special case) set user "" set server "" set resource "" # TODO if {!$usetabbar} return set prio 0 foreach page [.nb pages] { set path [ifacetk::nbpath $page] if {[string equal $path .headlines]} { lappend session [list $prio $user $server $resource \ [list [namespace current]::restore_window ""] \ ] } if {[regexp {^.headlines_(.*)} $path -> tag]} { set jid [tag_to_jid $tag] lappend session [list $prio $user $server $resource \ [list [namespace current]::restore_window $jid] \ ] } incr prio } } hook::add save_session_hook [namespace current]::headlines::save_session # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/general/ispell.tcl000064400000000000000000000260661477701321300171550ustar00nobodynobody# ispell.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # implements spellchecking in the Tkabber text input windows. package require textutil ############################################################################# namespace eval ispell { custom::defgroup Plugins [::msgcat::mc "Plugins options."] \ -group Tkabber custom::defgroup Ispell [::msgcat::mc "Spell check options."] \ -group Plugins variable options custom::defvar options(enable) 0 \ [::msgcat::mc "Enable spellchecker in text input windows."] \ -type boolean \ -group Ispell \ -command [namespace current]::stop custom::defvar options(executable) /usr/bin/ispell \ [::msgcat::mc "Path to the ispell executable."] \ -group Ispell \ -command [namespace current]::stop custom::defvar options(command_line) "" \ [::msgcat::mc "Ispell options. See ispell manual for\ details.\n\nExamples:\n -d russian\n -d german -T\ latin1\n -C -d english"] \ -type string \ -group Ispell \ -command [namespace current]::stop custom::defvar options(dictionary_encoding) "" \ [::msgcat::mc "Ispell dictionary encoding. If it is empty,\ system encoding is used."] \ -type string \ -group Ispell \ -command [namespace current]::stop custom::defvar options(check_every_symbol) 0 \ [::msgcat::mc "Check spell after every entered symbol."] \ -type boolean \ -group Ispell \ -command [namespace current]::stop variable misspelled variable word_id 0 if {$::darktheme} { option add *Text.errorColor coral3 widgetDefault option add *Text.comboColor cornflowerblue widgetDefault } else { option add *Text.errorColor firebrick widgetDefault option add *Text.comboColor dodgerblue4 widgetDefault } } ############################################################################# proc ispell::stop {args} { variable pipe catch {close $pipe} catch {unset pipe} } ############################################################################# proc ispell::start {} { variable options variable pipe if {[catch {open "|[list $options(executable)] -a $options(command_line)" r+} pipe]} { stop return } set version [gets $pipe] if {[string equal $version ""]} { stop return } fconfigure $pipe -blocking off -buffering line if {![string equal $options(dictionary_encoding) ""]} { fconfigure $pipe -encoding $options(dictionary_encoding) } fileevent $pipe readable [namespace current]::process_filter } ############################################################################# proc ispell::process_filter {} { variable pipe variable response variable current_word variable input_window variable misspelled set word [read $pipe] if {[string length $word] <= 1} { set response $word return } switch -- [string index $word 0] { \- { set misspelled($current_word) combo } \& - \? - \# { set misspelled($current_word) err } default { set misspelled($current_word) ok } } set response $word } ############################################################################# proc ispell::pipe_word {word} { variable options variable pipe variable response variable current_word variable misspelled if {!$options(enable)} return set current_word $word if {![info exist pipe]} { start if {![info exist pipe]} { after idle [list NonmodalMessageDlg .ispell_error \ -aspect 50000 \ -icon error \ -message [::msgcat::mc "Could not start ispell\ server. Check your ispell\ path and dictionary name.\ Ispell is disabled now"]] set options(enable) 0 return } } if {[string length $word] <= 1} { set misspelled($word) ok return } puts $pipe $word vwait [namespace current]::response } ############################################################################# proc ispell::process_word {iw insind} { variable input_window variable misspelled variable word_id set wid $word_id incr word_id set ins [lindex [split $insind .] 1] set line [$iw get "$insind linestart" "$insind lineend"] set wordstart [string wordstart $line $ins] set wordend [expr {[string wordend $line $ins] - 1}] set w [string range $line $wordstart $wordend] $iw mark set ispell_wordstart$wid "insert linestart +$wordstart chars" $iw mark set ispell_wordend$wid \ "insert linestart +$wordend chars +1 chars" if {[info exists misspelled($w)]} { $iw tag remove err ispell_wordstart$wid ispell_wordend$wid $iw tag remove combo ispell_wordstart$wid ispell_wordend$wid $iw tag add $misspelled($w) \ ispell_wordstart$wid ispell_wordend$wid } elseif {[string length $w] > 1} { pipe_word $w if {![winfo exists $iw]} { return 0 } $iw tag remove err ispell_wordstart$wid ispell_wordend$wid $iw tag remove combo ispell_wordstart$wid ispell_wordend$wid if {[info exists misspelled($w)]} { $iw tag add $misspelled($w) \ ispell_wordstart$wid ispell_wordend$wid } } else { $iw tag remove err ispell_wordstart$wid ispell_wordend$wid $iw tag remove combo ispell_wordstart$wid ispell_wordend$wid $iw mark unset ispell_wordstart$wid $iw mark unset ispell_wordend$wid return 0 } $iw mark unset ispell_wordstart$wid $iw mark unset ispell_wordend$wid return 1 } ############################################################################# proc ispell::process_line {iw sym} { variable state variable insert_prev variable options if {![winfo exists $iw]} { return } switch -- $state($iw) { 0 { if {[string equal $sym ""]} { set state($iw) 1 # in state 0 it's more likely that the word is to the left # of cursor position set leftword [process_word $iw [$iw index "$insert_prev -1 chars"]] # but in rare cases (BackSpace) the word could be to the right if {!$leftword} { process_word $iw [$iw index "$insert_prev +0 chars"] } } elseif {![string is wordchar $sym] && ($sym != "\u0008")} { set state($iw) 1 process_word $iw [$iw index "$insert_prev -1 chars"] process_word $iw [$iw index "insert +0 chars"] } elseif {$options(check_every_symbol)} { process_word $iw [$iw index "insert -1 chars"] } } 1 { if {[string equal $sym ""]} { # do nothing } elseif {![string is wordchar $sym]} { process_word $iw [$iw index "$insert_prev -1 chars"] process_word $iw [$iw index "insert +0 chars"] process_word $iw [$iw index "insert -1 chars"] } else { set leftword [process_word $iw [$iw index "insert -1 chars"]] set cur_sym [$iw get "insert" "insert +1 chars"] if {!$leftword && ![string is wordchar $cur_sym]} { set state($iw) 0 } } } } set insert_prev [$iw index "insert"] variable after_id unset after_id($iw) } ############################################################################# proc ispell::clear_ispell {iw} { variable misspelled variable state variable insert_prev set insert_prev [$iw index "insert"] if {[llength [array names misspelled]] > 2048} { array unset misspelled } set state($iw) 0 } ############################################################################# proc ispell::popup_menu {m iw x y} { variable response set ind [$iw index @$x,$y] lassign [split $ind .] l i set line [$iw get "$ind linestart" "$ind lineend"] set wordstart [string wordstart $line $i] set wordend [expr {[string wordend $line $i] - 1}] set w [string range $line $wordstart $wordend] pipe_word $w if {[catch { string trim $response } r]} { return } if {[winfo exists [set im $m.ispellpopupmenu]]} { destroy $im } menu $im -tearoff 0 switch -- [string index $r 0] { \& - \? { regsub -all {: } $r {:} r regsub -all {, } $r {,} r set variants [split [lindex [split $r ":"] 1] ","] foreach var $variants { $im add command -label "$var" \ -command [list [namespace current]::substitute $iw \ $l.$wordstart $l.[expr {$wordend + 1}] \ $var] } $m add cascade -menu $im -label [::msgcat::mc "Spelling"] } \# { $im add command -label [::msgcat::mc "- nothing -"] -command {} $m add cascade -menu $im -label [::msgcat::mc "Spelling"] } default {} } } ############################################################################# proc ispell::substitute {iw wordstart wordend sub} { $iw delete $wordstart $wordend $iw insert $wordstart $sub } ############################################################################# proc ispell::key_process {iw key} { if {$key == 65288} { # BackSpace after_process $iw "\u0008" } elseif {$key >= 65280} { # All nonletters after_process $iw "" } } ############################################################################# proc ispell::after_process {iw sym} { variable state variable after_id if {![info exists state($iw)]} return if {![info exists after_id($iw)]} { set after_id($iw) \ [after idle [list [namespace current]::process_line $iw $sym]] } } hook::add text_on_keypress_hook [namespace current]::ispell::after_process ############################################################################# proc ispell::setup_bindings {iw} { clear_ispell $iw bind $iw [list [namespace current]::key_process %W %N] bind $iw +[list [namespace current]::clear_ispell %W] hook::add textinput_popup_menu_hook [namespace current]::popup_menu $iw tag configure err -foreground [option get $iw errorColor Text] $iw tag configure combo -foreground [option get $iw comboColor Text] } hook::add text_on_create_hook [namespace current]::ispell::setup_bindings # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/general/message_archive.tcl000064400000000000000000000201131477701321300207750ustar00nobodynobody# message_archive.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin # which stores normal messages into an archive and aloows user to # browse through it. option add *Messages.listheight 10 widgetDefault namespace eval ::message_archive { variable logdir [file join $::configdir logs] if {![file exists $logdir]} { file mkdir $logdir } variable archive_file [file join $logdir message_archive] variable label array set label [list to [::msgcat::mc "To:"] from [::msgcat::mc "From:"]] variable messages } ############################################################################# proc ::message_archive::str_to_log {str} { return [string map {\\ \\\\ \r \\r \n \\n} $str] } ############################################################################# proc ::message_archive::log_to_str {str} { return [string map {\\\\ \\ \\r \r \\n \n} $str] } ############################################################################# proc ::message_archive::log_message {from to subject body x} { variable archive_file set seconds [::xmpp::xml::getAttr [::xmpp::delay::parse $x] seconds] set ts [clock format $seconds -format "%Y%m%dT%H%M%S"] set fd [open $archive_file a] fconfigure $fd -encoding utf-8 puts $fd [str_to_log [list timestamp $ts id $ts[rand 10000] from $from to $to subject $subject body $body]] close $fd } proc ::message_archive::show_archive {} { variable label variable messages set w .message_archive if {[winfo exists $w]} { return } add_win $w -title [::msgcat::mc "Messages"] \ -tabtitle [::msgcat::mc "Messages"] \ -class Messages \ -raise 1 PanedWin $w.pw -orient vertical pack $w.pw -fill both -expand yes set uw [PanedWinAdd $w.pw -weight 1] set dw [PanedWinAdd $w.pw -weight 1] Frame $dw.title Label $dw.title.label -text $label(from) Label $dw.title.jid pack $dw.title -fill x pack $dw.title.label -side left pack $dw.title.jid -side left Frame $dw.subject Label $dw.subject.lsubj -text [::msgcat::mc "Subject:"] Label $dw.subject.subj pack $dw.subject -fill x pack $dw.subject.lsubj -side left pack $dw.subject.subj -side left set body [ScrolledWindow $dw.sw] Text $body.body -height 20 -state disabled -wrap word pack $body -expand yes -fill both -anchor nw $body setwidget $body.body ::richtext::config $body.body -using {url emoticon stylecode} set sww [ScrolledWindow $w.items] set height [option get $w listheight Messages] ::mclistbox::mclistbox $sww.listbox \ -width 90 \ -height $height set l $sww.listbox pack $sww -expand yes -fill both -anchor nw -in $uw $sww setwidget $l bindtags $l [list [winfo class $l] $l [winfo toplevel $l] all] bind $l <> [namespace code [list print_body_selected [double% $dw] [double% $l]]] # bind $l <> "event generate [double% $l] <1> # after idle {[namespace current]::popup_menu_selected [double% $dw] [double% $l]}" bindscroll $sww $l $l column add N -label [::msgcat::mc #] $l column add id -label "" -visible 0 $l column add timestamp -label [::msgcat::mc Received/Sent] $l column add dir -label [::msgcat::mc Dir] $l column add fromto -label [::msgcat::mc From/To] $l column add subject -label [::msgcat::mc Subject] array unset messages foreach var {timestamp dir fromto subject} { $l column configure $var -image search/sort/noArrow \ -command [list search::Sort $l $var] } $l column add lastcol -label "" -width 0 $l configure -fillcolumn lastcol fill_list $l $l show end $l sel clear 0 end $l sel set end } proc ::message_archive::fill_list {l} { variable archive_file if {![file exists $archive_file]} { return } foreach i {N timestamp dir fromto subject} { set w [string length [$l column cget $i -label]] incr w 5 $l column configure $i -width $w } set hist {} set fd [open $archive_file r] fconfigure $fd -encoding utf-8 while {[gets $fd line] > 0} { catch {fill_row $l [log_to_str $line]} } close $fd } proc ::message_archive::fill_row {l var} { variable messages set connections [connections] if {[llength $connections] == 0} { set myjid "" } else { set myjid [connection_bare_jid [lindex $connections 0]] } foreach i {N timestamp dir fromto subject} { set width($i) 0 } set row {} array unset tmp array set tmp $var if {[info exists tmp(id)]} { set id $tmp(id) lappend row $id } else { return } if {[info exists tmp(timestamp)]} { set seconds [clock scan $tmp(timestamp) -gmt 0] set str [clock format $seconds -format {%Y-%m-%d %X}] lappend row $str set width(timestamp) [string length $str] } else { lappend row {} } set q 0 if {[info exists tmp(from)]} { set str [::xmpp::jid::stripResource $tmp(from)] if {$str == $myjid} { set q 1 set fromto to set dir "->" set messages($id,dir) to } } else { set tmp(from) {} } if {[info exists tmp(to)]} { set str [::xmpp::jid::stripResource $tmp(to)] if {$str == $myjid} { set q 1 set fromto from set dir "<-" set messages($id,dir) from } } else { set tmp(to) {} } set width(dir) [string length $dir] if {!$q} { return } else { lappend row $dir set str [::xmpp::jid::stripResource $tmp($fromto)] lappend row $str set width(fromto) [string length $str] set messages($id,fromto) $tmp($fromto) } if {[info exists tmp(subject)]} { lappend row $tmp(subject) set width(subject) [string length $tmp(subject)] set messages($id,subject) $tmp(subject) } else { lappend row {} set messages($id,subject) "" } if {[info exists tmp(body)]} { set messages($id,body) $tmp(body) } else { set messages($id,body) "" } set rownum [$l size] incr rownum set width(N) [string length $rownum] set row [linsert $row 0 $rownum] foreach i {N timestamp dir fromto subject} { set width($i) [::tcl::mathfunc::max [$l column cget $i -width] [expr {$width($i) + 2}]] } $l insert end $row foreach i {N timestamp dir fromto subject} { $l column configure $i -width $width($i) } } proc ::message_archive::sort {l tag} { set image [$l column cget $tag -image] if {$image eq ""} return set data [$l get 0 end] set index [lsearch -exact [$l column names] $tag] if {$image eq "search/sort/downArrow"} { set result [lsort -decreasing -dictionary -index $index $data] $l column configure $tag -image search/sort/upArrow } else { set result [lsort -dictionary -index $index $data] $l column configure $tag -image search/sort/downArrow } foreach t {timestamp dir fromto subject} { if {$t ne $tag} { $l column configure $t -image search/sort/noArrow } } set i 0 foreach row $result { lset result $i 0 [incr i] } $l delete 0 end eval $l insert end $result } proc ::message_archive::print_body_selected {w l} { variable label variable messages set curselection [$l curselection] if {[llength $curselection] == 0} return set id [lindex [$l get [lindex $curselection 0]] 1] if {$id == ""} { return } $w.title.label configure -text $label($messages($id,dir)) $w.title.jid configure -text $messages($id,fromto) $w.subject.subj configure -text $messages($id,subject) $w.sw.body configure -state normal $w.sw.body delete 0.0 end ::richtext::render_message $w.sw.body $messages($id,body) "" $w.sw.body configure -state disabled } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/general/nickname.tcl000064400000000000000000000034051477701321300174420ustar00nobodynobody# nickname.tcl -- # # XEP-0172: User Nickname namespace eval nick {} proc nick::process_presence {xlib from type x args} { variable names set newname "" switch -- $type { subscribe - subscribed - available { foreach xs $x { ::xmpp::xml::split $xs tag xmlns attrs cdata subels if {[string equal $xmlns $::NS(nick)]} { set newname $cdata } } } } if {$type == "subscribed"} { # JIT workaround: when receving stanza with name attribute and # roster item doesn't have name, fill the name foreach {opt val} $args { switch -- $opt { -name { set newname $val } } } } if {$newname == ""} return set jid [roster::find_jid $xlib $from] if {$jid == ""} { set names($xlib,$from) $newname } elseif {[roster::itemconfig $xlib $jid -name] == ""} { roster::itemconfig $xlib $jid -name $newname roster::send_item $xlib $jid ::redraw_roster } } hook::add client_presence_hook \ [namespace current]::nick::process_presence ############################################################################### proc nick::set_received_name {xlib jid name groups subsc ask} { variable names if {$subsc == "remove"} return if {[info exists names($xlib,$jid)]} { if {[roster::itemconfig $xlib $jid -name] == ""} { roster::itemconfig $xlib $jid -name $names($xlib,$jid) roster::send_item $xlib $jid } unset names($xlib,$jid) } } hook::add roster_push_hook \ [namespace current]::nick::set_received_name 60 # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/general/offline.tcl000064400000000000000000000315501477701321300173010ustar00nobodynobody# offline.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin # which implements retrieving oflline messages using a special # POP3-like protocol (XEP-0013). namespace eval offline { set ::NS(offline) "http://jabber.org/protocol/offline" custom::defvar options(flexible_retrieval) 0 \ [::msgcat::mc "Retrieve offline messages using POP3-like protocol."] \ -type boolean -group Messages } proc offline::request_headers {xlib} { variable options if {$options(flexible_retrieval)} { ::xmpp::sendIQ $xlib get \ -query [::xmpp::xml::create offline \ -xmlns $::NS(offline)] \ -command [list [namespace current]::receive_headers $xlib] } } hook::add connected_hook [namespace current]::offline::request_headers 9 proc offline::receive_headers {xlib res child} { if {$res != "ok"} { return } fill_tree $xlib $child } proc offline::open_window {} { global tcl_platform set w .offline_messages if {[winfo exists $w]} { return } add_win $w -title [::msgcat::mc "Offline Messages"] \ -tabtitle [::msgcat::mc "Offline Messages"] \ -raisecmd [list focus $w.tree] \ -class JDisco if {$tcl_platform(platform) eq "unix" && \ ![string equal [option get $w disabledForeground JDisco] ""]} { set config(seencolor) [option get $w disabledForeground JDisco] } else { set config(seencolor) [option get $w featurecolor JDisco] } set config(unseencolor) [option get $w fill JDisco] set sw [ScrolledWindow $w.sw] set tw [MyTree $w.tree] $sw setwidget $tw pack $sw -side top -expand yes -fill both $tw tag configure seen -foreground $config(seencolor) $tw tag configure unseen -foreground $config(unseencolor) $tw tag bind Text <> \ [list [namespace current]::message_popup [double% $tw] %x %y] $tw tag bind Text \ [double% "[namespace current]::message_action fetch $tw \[$tw selection\]"] if {[winfo exists $tw.c]} { # HACK bind $tw.c \ [double% "[namespace current]::message_action fetch $tw \[$tw selection\]"] } else { $tw tag bind Text \ [double% "[namespace current]::message_action fetch $tw \[$tw selection\]"] } } proc offline::fill_tree {xlib xml} { ::xmpp::xml::split $xml tag xmlns attrs cdata subels if {[llength $subels] == 0} { return } set w .offline_messages if {![winfo exists $w]} { open_window } set tw $w.tree foreach subel $subels { ::xmpp::xml::split $subel stag sxmlns sattrs scdata ssubels switch -- $stag { item { set node [::xmpp::xml::getAttr $sattrs node] set from [::xmpp::xml::getAttr $sattrs from] set category [::xmpp::xml::getAttr $sattrs category] set type [::xmpp::xml::getAttr $sattrs type] add_message $tw $xlib $node $from $category $type } } } } package require md5 proc offline::add_message {tw xlib node from category type} { set jid [connection_jid $xlib] set fnode [str2node $jid] if {![$tw exists $fnode]} { $tw insert {} end -id $fnode -text $jid -open 1 \ -tags {Text unseen} -image browser/user \ -values [list nodetype jid xlib $xlib jid $jid unseen 1] } set snode [str2node $node] if {![$tw exists $snode]} { if {$type == ""} { set t "" } else { set t " ($type)" } $tw insert $fnode end -id $snode -text "$category$t from $from \[$node\]" -open 1 \ -tags {Text unseen} \ -values [list nodetype node xlib $xlib jid $jid node $node \ from $from category $category type $type unseen 1] message_update $tw $snode } } proc offline::str2node {string} { set utf8str [encoding convertto utf-8 $string] if {[catch { ::md5::md5 -hex $utf8str } ret]} { return [::md5::md5 $utf8str] } else { return $ret } } proc offline::message_popup {tw x y} { $tw selection set [list [$tw identify item $x $y]] set node [lindex [$tw selection] 0] if {[catch {array set props [$tw item $node -values]}]} { return } set m .offline_popup_menu if {[winfo exists $m]} { destroy $m } menu $m -tearoff 0 switch -- $props(nodetype) { jid { $m add command -label [::msgcat::mc "Sort by from"] \ -command [list [namespace current]::message_action sortfrom $tw $node] $m add command -label [::msgcat::mc "Sort by node"] \ -command [list [namespace current]::message_action sortnode $tw $node] $m add command -label [::msgcat::mc "Sort by type"] \ -command [list [namespace current]::message_action sorttype $tw $node] $m add command -label [::msgcat::mc "Fetch unseen messages"] \ -command [list [namespace current]::message_action fetchunseen $tw $node] $m add command -label [::msgcat::mc "Fetch all messages"] \ -command [list [namespace current]::message_action fetch $tw $node] $m add command -label [::msgcat::mc "Purge seen messages"] \ -command [list [namespace current]::message_action purgeseen $tw $node] $m add command -label [::msgcat::mc "Purge all messages"] \ -command [list [namespace current]::message_action purge $tw $node] } node { $m add command -label [::msgcat::mc "Fetch message"] \ -command [list [namespace current]::message_action fetch $tw $node] $m add command -label [::msgcat::mc "Purge message"] \ -command [list [namespace current]::message_action purge $tw $node] } default { return } } tk_popup $m [winfo pointerx .] [winfo pointery .] } proc offline::message_action {action tw node} { if {[catch {array set props [$tw item $node -values]}]} { return } switch -glob -- $props(nodetype)/$action { node/fetch { ::xmpp::sendIQ $props(xlib) get \ -query [::xmpp::xml::create offline \ -xmlns $::NS(offline) \ -subelement [::xmpp::xml::create item \ -attrs [list action view \ node $props(node)]]] \ -command [list [namespace current]::action_result $action $tw $node] } node/purge { ::xmpp::sendIQ $props(xlib) set \ -query [::xmpp::xml::create offline \ -xmlns $::NS(offline) \ -subelement [::xmpp::xml::create item \ -attrs [list action remove \ node $props(node)]]]] \ -command [list [namespace current]::action_result $action $tw $node] } jid/fetch { ::xmpp::sendIQ $props(xlib) get \ -query [::xmpp::xml::create offline \ -xmlns $::NS(offline) \ -subelement [::xmpp::xml::create fetch]] \ -command [list [namespace current]::action_result $action $tw $node] } jid/purge { ::xmpp::sendIQ $props(xlib) set \ -query [::xmpp::xml::create offline \ -xmlns $::NS(offline) \ -subelement [::xmpp::xml::create purge]] \ -command [list [namespace current]::action_result $action $tw $node] } jid/fetchunseen { set q 0 set items {} foreach child [$tw children $node] { catch {array unset props1} if {![catch {array set props1 [$tw item $child -values]}] && \ $props1(unseen) > 0} { lappend items [::xmpp::xml::create item \ -attrs [list action view \ node $props1(node)]] } else { set q 1 } } if {$q} { if {[llength $items] > 0} { ::xmpp::sendIQ $props(xlib) get \ -query [::xmpp::xml::create offline \ -xmlns $::NS(offline) \ -subelements $items] \ -command [list [namespace current]::action_result $action $tw $node] } } else { message_action fetch $tw $node } } jid/purgeseen { if {$props(unseen) > 0} { set items {} foreach child [$tw children $node] { catch {array unset props1} if {![catch {array set props1 [$tw item $child -values]}]} { if {$props1(unseen) == 0} { lappend items [::xmpp::xml::create item \ -attrs [list action remove \ node $props1(node)]] } } } if {[llength $items] > 0} { ::xmpp::sendIQ $props(xlib) set \ -query [::xmpp::xml::create offline \ -xmlns $::NS(offline) \ -subelements $items] \ -command [list [namespace current]::action_result $action $tw $node] } } else { message_action purge $tw $node } } jid/sortfrom { sort_nodes $tw $node from } jid/sortnode { sort_nodes $tw $node node } jid/sorttype { sort_nodes $tw $node category type } default { } } } proc offline::sort_nodes {tw node type {subtype ""}} { set children {} foreach child [$tw children $node] { catch {unset props} array set props [$tw item $child -values] if {$subtype == ""} { lappend children [list $child $props($type)] } else { lappend children \ [list $child [list $props($type) $props($subtype)]] } } set neworder {} foreach child [lsort -index 1 $children] { lappend neworder [lindex $child 0] } $tw children $node $neworder } proc offline::action_result {action tw node res child} { if {$res != "ok"} { return } if {[catch {array set props [$tw item $node -values]}]} { return } switch -glob -- $props(nodetype)/$action { node/fetch - node/fetchunseen { if {$props(unseen)} { set props(unseen) 0 $tw item $node -tags {Text seen} -values [array get props] message_update $tw $node } } node/purge { set props(unseen) 0 $tw item $node -tags {Text seen} -values [array get props] message_update $tw $node $tw delete [list $node] } node/purgeseen { if {!$props(unseen)} { action_result purge $tw $node ok {} } } jid/fetch - jid/fetchunseen { foreach child [$tw children $node] { action_result $action $tw $child ok {} } } jid/purge - jid/purgeseen { foreach child [$tw children $node] { action_result $action $tw $child ok {} } if {[llength [$tw children $node]] == 0} { $tw delete [list $node] } } default { } } } proc offline::message_update {tw node} { for {set parent [$tw parent $node]} \ {$parent ne {}} \ {set parent [$tw parent $parent]} { set unseen 0 foreach child [$tw children $parent] { catch {unset props} array set props [$tw item $child -values] incr unseen $props(unseen) } catch {unset props} array set props [$tw item $parent -values] set props(unseen) $unseen set text $props(jid) set tag seen if {$unseen > 0} { append text " ($unseen)" set tag unseen } $tw item $parent -text $text -tags [list Text $tag] \ -values [array get props] } } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/general/rawxml.tcl000064400000000000000000000520141477701321300171670ustar00nobodynobody# rawxml.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin # which shows all communications between the client and servers # in a special window or tab. The XML stanzas syntax is highlighted. if {$::darktheme} { option add *RawXML.inforeground #f99393 widgetDefault option add *RawXML.outforeground #add8cc widgetDefault option add *RawXML.intagforeground #f99393 widgetDefault option add *RawXML.inattrforeground #f99393 widgetDefault option add *RawXML.invalueforeground #e899b5 widgetDefault option add *RawXML.incdataforeground #add8cc widgetDefault option add *RawXML.outtagforeground #e899b5 widgetDefault option add *RawXML.outattrforeground #e899b5 widgetDefault option add *RawXML.outvalueforeground #bbe8bb widgetDefault option add *RawXML.outcdataforeground #add8cc widgetDefault } else { option add *RawXML.inforeground DarkRed widgetDefault option add *RawXML.outforeground DarkBlue widgetDefault option add *RawXML.intagforeground DarkRed widgetDefault option add *RawXML.inattrforeground DarkRed widgetDefault option add *RawXML.invalueforeground Purple4 widgetDefault option add *RawXML.incdataforeground SteelBlue widgetDefault option add *RawXML.outtagforeground DarkMagenta widgetDefault option add *RawXML.outattrforeground DarkMagenta widgetDefault option add *RawXML.outvalueforeground DarkGreen widgetDefault option add *RawXML.outcdataforeground DarkBlue widgetDefault } option add *RawXML.inputheight 4 widgetDefault namespace eval rawxml { custom::defgroup Plugins [::msgcat::mc "Plugins options."] -group Tkabber custom::defgroup RawXML \ [::msgcat::mc "Options for Raw XML Input module,\ which allows you to monitor\ incoming/outgoing traffic from connection to server\ and send custom XML stanzas."] \ -group Plugins -tag "Raw XML Input" custom::defvar options(pretty_print) 1 \ [::msgcat::mc "Pretty print incoming and outgoing XML stanzas."] \ -group RawXML -type boolean custom::defvar options(indent) 2 \ [::msgcat::mc "Indentation for pretty-printed XML subtags."] \ -group RawXML -type integer custom::defvar options(view_all_xlibs) 1 \ [::msgcat::mc "Show stanzas for all (current and past) connections\ in Raw XML window."] \ -group RawXML -type boolean variable tabs variable rawxml_xlib_jid variable rawxml_xlib } if {![catch {clock milliseconds}]} { proc rawxml::timestamp {} { set ms [clock milliseconds] set seconds [expr {$ms/1000}] set fraction [format %03d [expr {$ms%1000}]] return [clock format $seconds -format %T].$fraction } } else { proc rawxml::timestamp {} { clock format [clock seconds] -format %T } } proc rawxml::format_comment {xlib prefix} { set id "($xlib)" catch {set id "($xlib, [connection_jid $xlib])"} set safe_id [string map { -- -- } $id] return "" } proc rawxml::handle_inout {xlib dir type msg} { variable options set w .rawxml if {![winfo exists $w]} return if {$options(pretty_print) && $type == "xml"} { handle_inout_x $xlib $dir $msg return } elseif {$type == "xml"} { set msg [::xmpp::xml::toText $msg] } switch -- $dir { output { set prefix OUT set tag out } default { set prefix IN set tag in } } set dump $w.dump $dump configure -state normal set scroll [expr {[lindex [$dump yview] 1] == 1}] $dump insert end \ [format_comment $xlib $prefix]\n [list xlib$xlib] \ $msg [list $tag xlib$xlib] if {![$dump compare "end -1 chars linestart" == "end -1 chars"]} { $dump insert end "\n" [list xlib$xlib] } if {$scroll} { after idle [list $dump yview moveto 1] } $dump configure -state disabled } proc rawxml::handle_inout_x {xlib dir xml} { variable options set w .rawxml if {![winfo exists $w]} return if {!$options(pretty_print)} return switch -- $dir { output { set prefix OUT set tag out } default { set prefix IN set tag in } } set dump $w.dump $dump configure -state normal set scroll [expr {[lindex [$dump yview] 1] == 1}] $dump insert end [format_comment $xlib $prefix]\n [list xlib$xlib] pretty_print $dump $xml "" $tag $xlib if {![$dump compare "end -1 chars linestart" == "end -1 chars"]} { $dump insert end "\n" [list xlib$xlib] } if {$scroll} { $dump see end } $dump configure -state disabled } proc rawxml::pretty_print {t xmldata prefix tag {xlib {}} {pxmlns jabber:client} {prefixes {xml xml http://etherx.jabber.org/streams stream}}} { variable options variable tabs variable rawxml_xlib ::xmpp::xml::split $xmldata stag xmlns attrs cdata subels array set p $prefixes set ps {} foreach ns [array names p] { lappend ps $p($ns) } set attrs1 {} foreach {attr value} $attrs { set l [::split $attr :] if {[llength $l] > 1} { set axmlns [join [lrange $l 0 end-1] :] set aattr [lindex $l end] if {[string equal $axmlns $xmlns]} { lappend attrs1 $aattr $value } elseif {[info exists p($axmlns)]} { lappend attrs1 $p($axmlns):$aattr $value } else { set p($axmlns) [::xmpp::xml::FindNewPrefix $ps] lappend attrs1 xmlns:$p($axmlns) $axmlns $p($axmlns):$aattr $value } } else { lappend attrs1 $attr $value } } if {$pxmlns != $xmlns && $xmlns != ""} { if {![info exists p($xmlns)]} { lappend attrs1 xmlns $xmlns set pxmlns $xmlns } else { set stag $p($xmlns):$stag } } $t insert end "$prefix<" [list xlib$xlib] $stag [list ${tag}tag xlib$xlib] if {[llength $attrs1] != 0} { set arr_index "$prefix<$stag " if {![info exists tabs($arr_index)]} { set tabs($arr_index) [font measure [$t cget -font] $arr_index] } $t tag configure $arr_index -tabs [list $tabs($arr_index)] set attrs2 [lassign $attrs1 attr value] if {$tag == "template" && $attr == "id" && $value == "" && $rawxml_xlib!=""} { set value [::xmpp::packetID $rawxml_xlib] } $t insert end \ " $attr" [list ${tag}attr xlib$xlib] \ "=" [list xlib$xlib] \ "'[::xmpp::xml::Escape $value]'" [list ${tag}value xlib$xlib] foreach {attr value} $attrs2 { if {$tag == "template" && $attr == "id" && $value == "" && $rawxml_xlib!=""} { set value [::xmpp::packetID $rawxml_xlib] } $t insert end \ "\n\t$attr" [list ${tag}attr $arr_index xlib$xlib]\ "=" [list xlib$xlib] \ "'[::xmpp::xml::Escape $value]'" [list ${tag}value xlib$xlib] } } if {$cdata == "" && [llength $subels] == 0} { $t insert end "/>\n" [list xlib$xlib] return } else { $t insert end ">" [list xlib$xlib] } if {[llength $subels] == 0} { $t insert end [::xmpp::xml::Escape $cdata] [list ${tag}cdata xlib$xlib] $t insert end "\n" [list xlib$xlib] } else { $t insert end "\n" [list xlib$xlib] foreach subdata $subels { pretty_print $t $subdata \ $prefix[string repeat " " $options(indent)] $tag $xlib \ $pxmlns [array get p] } $t insert end "$prefix\n" [list xlib$xlib] } } hook::add log_hook [namespace current]::rawxml::handle_inout proc rawxml::open_window {} { variable rawxml_xlib variable rawxml_xlib_jid set w .rawxml if {[winfo exists $w]} { return } add_win $w -title [::msgcat::mc "Raw XML"] \ -tabtitle [::msgcat::mc "Raw XML"] \ -class RawXML \ -raisecmd {focus [Wrapped .rawxml.input]} \ -raise 1 set tools [Frame $w.tools] pack $tools -side top -anchor w -fill x #Checkbutton $tools.pp -text [::msgcat::mc "Pretty print XML"] \ # -variable [namespace current]::options(pretty_print) #pack $tools.pp -side left -anchor w Menubutton $tools.templates -text [::msgcat::mc "Templates"] \ -menu .rawxml.tools.templates.root pack $tools.templates -side left -anchor w create_template_menu Button $tools.clear -text [::msgcat::mc "Clear"] \ -command " [list $w.dump] configure -state normal [list $w.dump] delete 0.0 end [list $w.dump] configure -state disabled " pack $tools.clear -side left -anchor w set connection_jids {} foreach c [connections] { lappend connection_jids [connection_jid $c] } set rawxml_xlib [lindex [connections] 0] set rawxml_xlib_jid [lindex $connection_jids 0] Label $tools.lconnection -text [::msgcat::mc "Connection:"] Combobox $tools.connection -textvariable [namespace current]::rawxml_xlib_jid \ -values $connection_jids \ -editable false \ -modifycmd [namespace current]::select_xlib Checkbutton $tools.allxlibs -variable [namespace current]::options(view_all_xlibs) \ -command [namespace current]::select_xlib \ -text [::msgcat::mc "Show all connections"] if {[llength $connection_jids] > 1} { pack $tools.lconnection -side left -anchor w pack $tools.connection -side left -anchor w } pack $tools.allxlibs -side left -anchor w PanedWin $w.pw -orient vertical pack $w.pw -fill both -expand yes set uw [PanedWinAdd $w.pw -weight 1] set dw [PanedWinAdd $w.pw -weight 0] set isw [ScrolledWindow $w.isw -scrollbar vertical] pack $isw -side bottom -fill both -expand yes -in $dw set input [textUndoable $w.input \ -height [option get $w inputheight RawXML]] $isw setwidget $input [winfo parent $dw] configure -height [winfo reqheight $input] set sw [ScrolledWindow $w.sw -scrollbar vertical] pack $sw -side top -fill both -expand yes -in $uw set dump [Text $w.dump] $sw setwidget $dump $dump configure -state disabled bind [Wrapped $input] " [namespace current]::send_xml break" $dump tag configure in \ -foreground [option get $w inforeground RawXML] $dump tag configure out \ -foreground [option get $w outforeground RawXML] $dump tag configure intag \ -foreground [option get $w intagforeground RawXML] $dump tag configure inattr \ -foreground [option get $w inattrforeground RawXML] $dump tag configure invalue \ -foreground [option get $w invalueforeground RawXML] $dump tag configure incdata \ -foreground [option get $w incdataforeground RawXML] $dump tag configure outtag \ -foreground [option get $w outtagforeground RawXML] $dump tag configure outattr \ -foreground [option get $w outattrforeground RawXML] $dump tag configure outvalue \ -foreground [option get $w outvalueforeground RawXML] $dump tag configure outcdata \ -foreground [option get $w outcdataforeground RawXML] variable history bind [Wrapped $input] \ [list [namespace current]::history_move 1] bind [Wrapped $input] \ [list [namespace current]::history_move -1] set history(stack) [list {}] set history(pos) 0 regsub -all %W [bind Text ] [double% [Wrapped $dump]] prior_binding regsub -all %W [bind Text ] [double% [Wrapped $dump]] next_binding bind [Wrapped $input] $prior_binding bind [Wrapped $input] $next_binding bind [Wrapped $input] $prior_binding bind [Wrapped $input] $next_binding hook::run open_rawxml_post_hook $w } proc rawxml::select_xlib {} { variable rawxml_xlib_jid variable rawxml_xlib variable options set w .rawxml.dump set rawxml_xlib {} foreach c [connections] { if {[connection_jid $c] == $rawxml_xlib_jid} { set rawxml_xlib $c break } } foreach tag [lsearch -all -glob -inline [$w tag names] xlib*] { set elide [expr {"xlib$rawxml_xlib" != $tag && !$options(view_all_xlibs) \ && $rawxml_xlib != ""}] $w tag configure $tag -elide $elide } } proc rawxml::update_xlib_choice {action xlib} { variable rawxml_xlib_jid variable rawxml_xlib set tools .rawxml.tools set combobox $tools.connection if {![winfo exists $combobox]} return set connection_jids [lindex [$combobox configure -values] 4] set connection_jid [connection_jid $xlib] switch $action { add { lappend connection_jids $connection_jid if {[llength $connection_jids] == 1} { set rawxml_xlib_jid $connection_jid set rawxml_xlib $xlib } } remove { set idx [lsearch -exact $connection_jids $connection_jid] set connection_jids [lreplace $connection_jids $idx $idx] if {$rawxml_xlib == $xlib} { set rawxml_xlib [lindex [connections] 0] if {$rawxml_xlib != ""} { set rawxml_xlib_jid [connection_jid $rawxml_xlib] } else { set rawxml_xlib_jid "" } select_xlib } } } $combobox configure -values $connection_jids if {[llength $connection_jids] > 1} { pack $tools.lconnection -side left -anchor w -before $tools.allxlibs pack $combobox -side left -anchor w -before $tools.allxlibs } else { pack forget $tools.lconnection $combobox } } hook::add connected_hook [list [namespace current]::rawxml::update_xlib_choice add] hook::add disconnected_hook [list [namespace current]::rawxml::update_xlib_choice remove] proc rawxml::history_move {shift} { variable history set newpos [expr $history(pos) + $shift] if {!($newpos < 0 || $newpos >= [llength $history(stack)])} { set iw .rawxml.input set body [$iw get 1.0 "end -1 chars"] if {$history(pos) == 0} { set history(stack) \ [lreplace $history(stack) 0 0 $body] } set history(pos) $newpos set newbody [lindex $history(stack) $newpos] $iw delete 1.0 end $iw insert 0.0 $newbody } } proc rawxml::send_xml {} { variable history variable rawxml_xlib set input .rawxml.input set xml [$input get 0.0 "end - 1c"] set history(stack) [linsert $history(stack) 1 $xml] set history(pos) 0 if {[llength [connections]] == 0} { return -code error [::msgcat::mc "Not connected"] } else { ::xmpp::outText $rawxml_xlib $xml } $input delete 1.0 end } proc rawxml::setup_menu {} { catch { set m [.mainframe getmenu debug] $m add command -label [::msgcat::mc "Open raw XML window"] \ -command [namespace current]::open_window } } hook::add finload_hook [namespace current]::rawxml::setup_menu proc rawxml::add_template_group {parent group name} { set m .rawxml.tools.templates.$group set mparent .rawxml.tools.templates.$parent if {![winfo exists $m]} { menu $m -tearoff 0 } $mparent add cascade -label $name -menu $m } proc rawxml::add_template {group name xmldata} { set m .rawxml.tools.templates.$group set input .rawxml.input $m add command -label $name \ -command [list [namespace current]::pretty_print \ $input $xmldata "" template] } proc rawxml::create_template_menu {} { if {[winfo exists .rawxml.tools.templates.root]} { destroy .rawxml.tools.templates.root } else { menu .rawxml.tools.templates.root -tearoff 0 } add_template_group root message [::msgcat::mc "Message"] add_template message [::msgcat::mc "Normal message"] \ [::xmpp::xml::create message \ -attrs {to "" type normal} \ -subelement [::xmpp::xml::create body -cdata " "]] add_template message [::msgcat::mc "Chat message"] \ [::xmpp::xml::create message \ -attrs {to "" type chat} \ -subelement [::xmpp::xml::create body -cdata " "]] add_template message [::msgcat::mc "Headline message"] \ [::xmpp::xml::create message \ -attrs {to "" type headline} \ -subelement [::xmpp::xml::create subject -cdata " "] \ -subelement [::xmpp::xml::create body -cdata " "] \ -subelement [::xmpp::xml::create x \ -xmlns jabber:x:oob \ -subelement [::xmpp::xml::create url -cdata " "] \ -subelement [::xmpp::xml::create desc -cdata " "]]] add_template_group root presence [::msgcat::mc "Presence"] add_template presence [::msgcat::mc "Available presence"] \ [::xmpp::xml::create presence \ -attrs {to ""} \ -subelement [::xmpp::xml::create status -cdata " "] \ -subelement [::xmpp::xml::create show -cdata " "]] add_template presence [::msgcat::mc "Unavailable presence"] \ [::xmpp::xml::create presence \ -attrs {to "" type unavailable} \ -subelement [::xmpp::xml::create status -cdata " "]] add_template_group root iq [::msgcat::mc "IQ"] add_template iq [::msgcat::mc "Generic IQ"] \ [::xmpp::xml::create iq \ -attrs {to "" type "" id ""} \ -subelement [::xmpp::xml::create query \ -xmlns ""]] add_template iq "jabber:iq:time get" \ [::xmpp::xml::create iq \ -attrs {to "" type get id ""} \ -subelement [::xmpp::xml::create query \ -xmlns jabber:iq:time]] add_template iq "jabber:iq:version get" \ [::xmpp::xml::create iq \ -attrs {to "" type get id ""} \ -subelement [::xmpp::xml::create query \ -xmlns jabber:iq:version]] add_template iq "jabber:iq:last get" \ [::xmpp::xml::create iq \ -attrs {to "" type get id ""} \ -subelement [::xmpp::xml::create query \ -xmlns jabber:iq:last]] add_template_group iq pubsub [::msgcat::mc "Pub/sub"] pubsub_template [::msgcat::mc "Create node"] set \ [::xmpp::xml::create create \ -attrs {node ""}] pubsub_template [::msgcat::mc "Publish node"] set \ [::xmpp::xml::create publish \ -attrs {node ""} \ -subelement [::xmpp::xml::create item]] pubsub_template [::msgcat::mc "Retract node"] set \ [::xmpp::xml::create retract \ -attrs {node ""} \ -subelement [::xmpp::xml::create item]] pubsub_template [::msgcat::mc "Subscribe to a node"] set \ [::xmpp::xml::create subscribe \ -attrs {node "" jid ""}] pubsub_template [::msgcat::mc "Unsubscribe from a node"] set \ [::xmpp::xml::create unsubscribe \ -attrs {node "" jid ""}] pubsub_template [::msgcat::mc "Get items"] get \ [::xmpp::xml::create items \ -attrs {node ""}] } proc rawxml::pubsub_template {name type subtag} { add_template pubsub $name \ [::xmpp::xml::create iq \ -attrs [list to "" type $type id ""] \ -subelement [::xmpp::xml::create pubsub \ -xmlns http://jabber.org/protocol/pubsub \ -subelement $subtag]] } ############################################################################## proc rawxml::restore_window {args} { open_window } proc rawxml::save_session {vsession} { upvar 2 $vsession session global usetabbar # We don't need JID at all, so make it empty (special case) set user "" set server "" set resource "" # TODO if {!$usetabbar} return set prio 0 foreach page [.nb pages] { set path [ifacetk::nbpath $page] if {[string equal $path .rawxml]} { lappend session [list $prio $user $server $resource \ [list [namespace current]::restore_window] \ ] } incr prio } } hook::add save_session_hook [namespace current]::rawxml::save_session # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/general/remote.tcl000064400000000000000000000706131477701321300171550ustar00nobodynobody# remote.tcl -- # # Implementation of Remote Controlling Clients (XEP-0146) # via Ad-Hoc Commands (XEP-0050) for Tkabber. # namespace eval ::remote { variable commands variable sessions variable prefix array set commands {} array set sessions {} set prefix "::remote::sessions" custom::defgroup {Remote Control} \ [::msgcat::mc "Remote control options."] -group Tkabber custom::defvar options(enable) 1 \ [::msgcat::mc "Enable remote control."] \ -type boolean -group {Remote Control} custom::defvar options(accept_from_myjid) 1 \ [::msgcat::mc "Accept connections from my own JID."] \ -type boolean -group {Remote Control} custom::defvar options(accept_list) "" \ [::msgcat::mc "Accept connections from the listed JIDs."] \ -type string -group {Remote Control} #custom::defvar options(show_my_resources) 1 \ # [::msgcat::mc "Show my own resources in the roster."] \ # -type boolean -group {Remote Control} } namespace eval ::remote::sessions {} ############################################ proc ::remote::allow_remote_control {xlib from} { variable options if {!$options(enable)} { return 0 } set from [::xmpp::jid::normalize $from] set myjid [::xmpp::jid::normalize \ [::xmpp::jid::removeResource [connection_jid $xlib]]] set bare_from [::xmpp::jid::removeResource $from] if {$options(accept_from_myjid) && $myjid eq $bare_from} { return 1 } set accept_list [split [string tolower $options(accept_list)] " "] if {$bare_from != "" && $bare_from in $accept_list} { return 1 } return 0 } ############################################ # Register and announce commands via disco proc ::remote::register_command {node command name args} { variable commands set commands(command,$node) $command set commands(name,$node) $name lappend commands(nodes) $node ::disco::register_subnode $node \ [namespace code [list common_command_infoitems_handler $node]] \ $name } proc ::remote::common_command_infoitems_handler {node type xlib from lang} { variable commands if {![allow_remote_control $xlib $from]} { return {error cancel not-allowed} } if {![string equal $node ""] && [info exists commands(command,$node)]} { if {[string equal $type info]} { return \ [list result [list [list category automation \ type command-node \ name [::trans::trans $lang \ $commands(name,$node)]]] \ [list $::NS(commands)] {}] } else { return [list result {}] } } else { return {error modify bad-request} } } proc ::remote::commands_list_handler {type xlib from lang} { variable commands if {![allow_remote_control $xlib $from]} { return {error cancel not-allowed} } set myjid [connection_jid $xlib] switch -- $type { items { set items {} foreach node $commands(nodes) { lappend items [list jid $myjid \ node $node \ name [::trans::trans $lang \ $commands(name,$node)]] } return [list result $items] } info { return [list result [list [list category automation \ type command-list \ name [::trans::trans $lang \ "Remote control"]]] \ {} {}] } } } ::disco::register_feature $::NS(commands) ::disco::register_node $::NS(commands) \ ::remote::commands_list_handler [::trans::trans "Remote control"] ####################################### # Base engine. proc ::remote::clear_session {session node} { variable commands variable sessions if {![info exists commands(command,$node)]} return $commands(command,$node) $session cancel {} upvar 0 $session state catch {unset sessions($state(xlib),$state(from),$state(node),$state(id))} catch {unset $session} } proc ::remote::create_session {node xlib from lang} { variable commands variable sessions variable prefix if {![info exists commands(command,$node)]} return set id [rand 1000000000] while {[info exists sesssions($xlib,$from,$node,$id)]} { set id [rand 1000000000] } set counter 1 while {[info exists "${prefix}::${counter}"]} { incr counter } set session "${prefix}::${counter}" upvar 0 $session state set state(id) $id set state(xlib) $xlib set state(from) $from set state(node) $node set state(lang) $lang set sessions($xlib,$from,$node,$id) $session return $session } proc ::remote::command_set_handler {xlib from child args} { variable commands variable sessions if {![allow_remote_control $xlib $from]} { return {error cancel not-allowed} } ::xmpp::xml::split $child tag xmlns attrs cdata subels set node [::xmpp::xml::getAttr $attrs node] set action [::xmpp::xml::getAttr $attrs action] set id [::xmpp::xml::getAttr $attrs sessionid] set lang [::xmpp::xml::getAttr $args -lang en] if {![info exists commands(command,$node)]} { return {error cancel item-not-found} } if {$id eq ""} { # We use lang only when create session. # Probably it would be better to use it after every request. set session [create_session $node $xlib $from $lang] } else { if {![info exists sessions($xlib,$from,$node,$id)]} { return [get_error modify bad-request bad-sessionid] } set session $sessions($xlib,$from,$node,$id) } upvar 0 $session state set id $state(id) if {$action eq "cancel"} { clear_session $session $node return [list result [::xmpp::xml::create command \ -xmlns $::NS(commands) \ -attrs [list sessionid $id \ node $node \ status canceled]]] } set result [$commands(command,$node) $session $action $subels] set status [lindex $result 0] switch -- $status { error { set error_type [lindex $result 1] if {$error_type ne "modify"} { clear_session $session $node } return $result } completed { clear_session $session $node } executing {} default { clear_session $session $node return {error wait internal-server-error} } } return [list result [::xmpp::xml::create command \ -xmlns $::NS(commands) \ -attrs [list sessionid $id \ node $node \ status $status] \ -subelements [lrange $result 1 end]]] } ::xmpp::iq::register set command $::NS(commands) ::remote::command_set_handler proc ::remote::get_error {type general {specific ""}} { set res [list error $type $general] if {$specific ne ""} { lappend res -application-specific \ [::xmpp::xml::create $specific -xmlns $::NS(commands)] } return $res } ############################################ # Common functions for command implementations. # Scheduler for one-step dialogs and wizards proc ::remote::standard_scheduler {steps prefix session action children} { upvar 0 $session state if {$action eq "cancel"} { for {set i 1} {$i <= $steps} {incr i} { ${prefix}clear_step$i $session } return } if {![info exists state(step)] } { # First step if {$action eq "execute" || $action eq ""} { set state(step) 1 return [${prefix}get_step$state(step) $session] } else { return [::remote::get_error modify bad-request bad-action] } } elseif {($state(step) < $steps) && ($state(step) > 0)} { # Inner step if {$action eq "next" || $action eq "execute" || $action eq ""} { set res [${prefix}set_step$state(step) $session $children] if {[lindex $res 0] eq "error"} { return $res } incr state(step) return [${prefix}get_step$state(step) $session] } elseif {$action eq "prev"} { incr state(step) -1 ${prefix}clear_step$state(step) $session return [${prefix}get_step$state(step) $session] } elseif {$action eq "complete"} { set res [${prefix}set_step$state(step) $session $children] if {[lindex $res 0] eq "error"} { return $res } return [${prefix}get_finish $session] } else { return [::remote::get_error modify bad-request bad-action] } } elseif {$state(step) == $steps} { # Last step if {$action eq "complete" || $action eq "execute" || $action eq ""} { set res [${prefix}set_step$state(step) $session $children] if {[lindex $res 0] eq "error"} { return $res } return [${prefix}get_finish $session] } elseif {$action eq "prev"} { incr state(step) -1 ${prefix}clear_step$state(step) $session return [${prefix}get_step$state(step) $session] } else { return [::remote::get_error modify bad-request bad-action] } } else { return {error wait internal-server-error} } } # Parse form result and returns array with values, check for correct form type proc ::remote::standard_parseresult {children_b form_type} { set result {} lassign [::xmpp::data::findForm $children_b] type form if {![string equal $type submit]} { return [::remote::get_error modify bad-request bad-payload] } foreach {tag field} [::xmpp::data::parseSubmit $form] { lassign $field var type label values switch -- $var { FORM_TYPE { if {![string equal [lindex $values 0] $form_type]} { return [::remote::get_error modify bad-request bad-payload] } } default { lappend result $var $values } } } return $result } ############################ #Change status namespace eval ::remote::change_status {} proc ::remote::change_status::scheduler {session action children} { return [::remote::standard_scheduler 1 "[namespace current]::" \ $session $action $children] } ::remote::register_command "http://jabber.org/protocol/rc#set-status" \ ::remote::change_status::scheduler [::trans::trans "Change status"] # step1: # send standard form proc ::remote::change_status::get_step1 {session} { global userstatus global textstatus global userpriority upvar 0 $session state set lang $state(lang) set fields \ [concat [::xmpp::data::formField field \ -var FORM_TYPE \ -type hidden \ -value "http://jabber.org/protocol/rc"] \ [::xmpp::data::formField title \ -value [::trans::trans $lang "Change Status"]] \ [::xmpp::data::formField instructions \ -value [::trans::trans $lang \ "Choose status, priority, and\ status message"]]] set options {} foreach {status statusdesc} \ [list available [::trans::trans $lang "Available"] \ chat [::trans::trans $lang "Free to chat"] \ away [::trans::trans $lang "Away"] \ xa [::trans::trans $lang "Extended away"] \ dnd [::trans::trans $lang "Do not disturb"] \ unavailable [::trans::trans $lang "Unavailable"]] { lappend options $statusdesc $status } set fields \ [concat $fields \ [::xmpp::data::formField field \ -var status \ -type list-single \ -label [::trans::trans $lang "Status"] \ -required 1 \ -value $userstatus \ -options $options] \ [::xmpp::data::formField field \ -var status-priority \ -type text-single \ -label [::trans::trans $lang "Priority"] \ -value $userpriority \ -required 1] \ [::xmpp::data::formField field \ -var status-message \ -type text-multi \ -label [::trans::trans $lang "Message"] \ -values [split $textstatus "\n"]]] return [list executing [::xmpp::data::form $fields]] } proc ::remote::change_status::set_step1 {session children} { upvar 0 $session state set result [remote::standard_parseresult $children \ "http://jabber.org/protocol/rc"] if {[lindex $result 0] eq "error"} { return $result } array set params $result if {![info exists params(status)] || \ ![info exists params(status-priority)] || \ ![info exists ::statusdesc($params(status))] || \ [catch {expr int($params(status-priority))}]} { return [::remote::get_error modify bad-request bad-payload] } set state(textstatus) {} catch { set state(textstatus) \ [join $params(status-message) "\n"] } set state(userstatus) \ [lindex $params(status) 0] set state(userpriority) \ [lindex $params(status-priority) 0] return {} } proc ::remote::change_status::clear_step1 {session} {} # finish: # change status # report proc ::remote::change_status::get_finish {session} { global userstatus global textstatus global userpriority upvar 0 $session state set lang $state(lang) if {$state(userstatus) != "unavailable"} { set textstatus $state(textstatus) set userpriority $state(userpriority) set userstatus $state(userstatus) } else { # Special processing -- disconnect current session. # It is scheduled for idle processing so that the remote-command # processing machinery has a chance to send the result. after idle [list ::logout $state(xlib)] } return [list completed [::xmpp::xml::create note \ -attrs {type info} \ -cdata \ [::trans::trans $lang \ "Status was changed successfully"]]] } ############################ # Leave groupchats namespace eval ::remote::leave_groupchats {} proc ::remote::leave_groupchats::scheduler {session action children} { return [::remote::standard_scheduler 1 "[namespace current]::" $session $action $children] } ::remote::register_command "http://jabber.org/protocol/rc#leave-groupchats" \ ::remote::leave_groupchats::scheduler [::trans::trans "Leave groupchats"] # step1: # allow users to choose which chats to leave proc ::remote::leave_groupchats::get_step1 {session} { upvar 0 $session state set options {} set lang $state(lang) set xlib $state(xlib) foreach chatid [lfilter chat::is_groupchat [chat::opened $xlib]] { set jid [chat::get_jid $chatid] if {[get_jid_presence_info show $xlib $jid] ne ""} { set nick [get_our_groupchat_nick $chatid] lappend options [format [::trans::trans $lang "%s at %s"] \ $nick $jid] $jid } } if {[llength $options] == 0} { return [list completed [::xmpp::xml::create note \ -attrs {type info} \ -cdata [::trans::trans $lang \ "No groupchats to leave"]]] } set fields \ [concat [::xmpp::data::formField field \ -var FORM_TYPE \ -type hidden \ -value "http://jabber.org/protocol/rc"] \ [::xmpp::data::formField title \ -value [::trans::trans $lang "Leave Groupchats"]] \ [::xmpp::data::formField instructions \ -value [::trans::trans $lang \ "Choose groupchats you want to leave"]] \ [::xmpp::data::formField field \ -var x-all \ -type boolean \ -label [::trans::trans $lang "Leave all groupchats"] \ -value 0] \ [::xmpp::data::formField field \ -var groupchats \ -type list-multi \ -label [::trans::trans $lang "Groupchats"] \ -required 1 \ -options $options] \ [::xmpp::data::formField field \ -var x-reason \ -type text-single \ -label [::trans::trans $lang "Reason"]]] return [list executing [::xmpp::data::form $fields]] } proc ::remote::leave_groupchats::set_step1 {session children} { upvar 0 $session state set result [remote::standard_parseresult $children \ "http://jabber.org/protocol/rc"] if {[lindex $result 0] eq "error"} { return $result } array set params $result if {![info exists params(groupchats)]} { return [::remote::get_error modify bad-request bad-payload] } set state(all) [lindex $params(x-all) 0] set state(groupchats) $params(groupchats) set state(reason) "" catch { set state(reason) [lindex $params(x-reason) 0] } return {} } proc ::remote::leave_groupchats::clear_step1 {session} {} # finish step # leave groupchats. # report proc ::remote::leave_groupchats::get_finish {session} { upvar 0 $session state set xlib $state(xlib) set args {} set lang $state(lang) if {![string equal $state(reason) ""]} { lappend args -status $state(reason) } # "all" workaround, will be removed soon if $state(all) { set state(groupchats) "" foreach chatid [lfilter chat::is_groupchat [chat::opened $xlib]] { set jid [chat::get_jid $chatid] if {![string equal [get_jid_presence_info show $xlib $jid] ""]} { lappend state(groupchats) $jid } } } foreach jid $state(groupchats) { eval [list send_presence $xlib unavailable -to $jid] $args } return [list completed [::xmpp::xml::create note \ -attrs {type info} \ -cdata [::trans::trans $lang \ "Groupchats were left\ successfully"]]] } ################################ # Forward unread messages namespace eval ::remote::forward { variable unread array set unread {} } proc ::remote::forward::scheduler {session action children} { return [::remote::standard_scheduler 1 "[namespace current]::" $session $action $children] } ::remote::register_command "http://jabber.org/protocol/rc#forward" \ ::remote::forward::scheduler [::trans::trans "Forward unread messages"] # step1: # form with list of unreaded correspondence proc ::remote::forward::get_step1 {session} { upvar 0 $session state variable unread set options {} set lang $state(lang) set xlib $state(xlib) foreach id [array names unread] { lassign $id type chatid if {[chat::get_xlib $chatid] ne $xlib} continue set jid [chat::get_jid $chatid] set rjid [::roster::find_jid $xlib $jid] set name [::roster::itemconfig $xlib $rjid -name] if {$rjid != "" && $name != ""} { set name [format "%s (%s)" $name $jid] } else { set name $jid } set count [llength $unread($id)] switch -- $type { chat {set msg [::trans::trans $lang "%s: %s chat message(s)"]} groupchat {set msg [::trans::trans $lang "%s: %s groupchat message(s)"]} headline {set msg [::trans::trans $lang "%s: %s headline message(s)"]} normal {set msg [::trans::trans $lang "%s: %s normal message(s)"]} default {set msg [::trans::trans $lang "%s: %s unknown message(s)"]} } lappend options [format $msg $name $count] $id } if {[llength $options] == 0} { return [list completed [::xmpp::xml::create note \ -attrs {type info} \ -cdata \ [::trans::trans $lang \ "There are no unread messages"]]] } set fields \ [concat [::xmpp::data::formField field \ -var FORM_TYPE \ -type hidden \ -value "tkabber:plugins:remote:forward_form"] \ [::xmpp::data::formField title \ -value [::trans::trans $lang \ "Forward Unread Messages"]] \ [::xmpp::data::formField instructions \ -value [::trans::trans $lang \ "Choose chats or groupchats from which you\ want to forward messages"]] \ [::xmpp::data::formField field \ -var all \ -type boolean \ -label [::trans::trans $lang "Forward all messages"] \ -value 0] \ [::xmpp::data::formField field \ -var chats \ -type list-multi \ -label [::trans::trans $lang "Forward messages from"] \ -required 1 \ -options $options]] return [list executing [::xmpp::data::form $fields]] } proc ::remote::forward::set_step1 {session children} { upvar 0 $session state set result [remote::standard_parseresult $children \ "tkabber:plugins:remote:forward_form"] if {[lindex $result 0] eq "error"} { return $result } array set params $result if {![info exists params(chats)]} { return [::remote::get_error modify bad-request bad-payload] } set state(all) [lindex $params(all) 0] set state(chats) $params(chats) return {} } proc ::remote::forward::clear_step1 {session} {} # finish: # forward selected unread messages # report proc ::remote::forward::get_finish {session} { upvar 0 $session state variable unread set xlib $state(xlib) set lang $state(lang) set oto [connection_jid $xlib] set target $state(from) # "all" workaround, will be removed soon if $state(all) { set state(chats) {} foreach id [array names unread] { lassign $id type chatid if {[chat::get_xlib $chatid] ne $xlib} continue lappend state(chats) $id } } foreach id $state(chats) { forward_messages $id $xlib $oto $target } return [list completed \ [::xmpp::xml::create note \ -attrs {type info} \ -cdata [::trans::trans $lang \ "Unread messages were forwarded\ successfully"]]] } ############################# # Forward namespace # forwards messages # leaves marks that they were forwarded. # cleanup arrays proc ::remote::forward::forward_messages {id xlib oto target} { variable unread variable msgdata lassign $id type chatid if {![info exists unread($id)]} { return } foreach elem $unread($id) { switch -- $type { groupchat - chat { lassign $elem date ofrom body x } normal { lassign $msgdata($elem) date ofrom body x } } lappend x [::xmpp::xml::create addresses \ -xmlns $::NS(xaddress) \ -subelement [::xmpp::xml::create address \ -attrs [list type ofrom \ jid $ofrom]] \ -subelement [::xmpp::xml::create address \ -attrs [list type oto \ jid $oto]]] lappend x [::xmpp::delay::create $date] ::xmpp::sendMessage $xlib $target -body $body \ -type $type \ -xlist $x switch -- $type { normal { set lab \ [Label $elem.forwlab \ -text [::msgcat::mc \ "This message was forwarded to %s" \ $target]] pack $lab -anchor w -fill none -expand no -before $elem.title catch {unset msgdata($elem)} } } } catch {unset unread($id)} switch -- $type { groupchat - chat { after idle \ [list ::chat::add_message $chatid $ofrom info \ [::msgcat::mc "All unread messages were forwarded to %s." \ $target] \ {}] } } } # store message into the unread if type == chat proc ::remote::forward::draw_message_handler {chatid from type body extras} { variable unread if {[ifacetk::chat_window_is_active $chatid]} return if {$type ni {chat groupchat}} return if {$from == ""} { # Don't forward service messages return } set date [clock seconds] set message [list $date $from $body $extras] set id [list $type $chatid] lappend unread($id) $message return 0 } hook::add draw_message_hook ::remote::forward::draw_message_handler 19 # clear list of unread messages with type == chat proc ::remote::forward::trace_number_msg {var1 chatid mode} { variable unread if {$::ifacetk::number_msg($chatid) == 0} { if {[chat::is_chat $chatid]} { set type chat } else { set type groupchat } set id [list $type $chatid] catch {unset unread($id)} } } trace add variable ::ifacetk::number_msg read ::remote::forward::trace_number_msg # store message with type == normal proc ::remote::forward::message_process_x \ {rowvar bodyvar f x xlib from id type replyP} { upvar 2 $rowvar row upvar 2 $bodyvar body variable unread variable msgdata if {!$replyP || $type eq "error"} { return } set id [list normal [chat::chatid $xlib $from]] if {![info exists unread($id)]} { set unread($id) {} } set msgwin [winfo toplevel $f] lappend unread($id) $msgwin bind $f \ +[double% [namespace code [list on_msgwin_destroy $msgwin $id]]] set date [clock seconds] set msgdata($msgwin) [list $date $from $body $x] return } hook::add message_process_x_hook ::remote::forward::message_process_x # clear message with type == normal if it was closed proc ::remote::forward::on_msgwin_destroy {msgwin id} { variable unread variable msgdata if {![info exists unread($id)]} return if {[set index [lsearch -exact $unread($id) $msgwin]] >= 0} { set unread($id) [lreplace $unread($id) $index $index] catch {unset msgdata($msgwin)} } if {[llength $unread($id)] == 0} { catch {unset unread($id)} } } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/general/session.tcl000064400000000000000000000065401477701321300173430ustar00nobodynobody# session.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin # which implements saving and opening Tkabber sessions infrastructure. # Every pluging which wants to save it's state on exit and restore it # on Tkabber start can add a procedure to the save_session_hook hook. # # Session is a list of {priority user server resource script} namespace eval session { variable session_file [file join $::configdir session.tcl] custom::defgroup State [::msgcat::mc "Tkabber save state options."] \ -group Tkabber custom::defvar options(save_on_exit) 1 \ [::msgcat::mc "Save state on Tkabber exit."] \ -type boolean -group State custom::defvar options(open_on_start) 1 \ [::msgcat::mc "Load state on Tkabber start."] \ -type boolean -group State } ############################################################################# proc session::save_session {} { variable session_file set session {} hook::run save_session_hook session set fd [open $session_file w] fconfigure $fd -encoding utf-8 puts $fd $session close $fd } ############################################################################# proc session::save_session_on_exit {} { variable options if {$options(save_on_exit)} { save_session } } hook::add quit_hook [namespace current]::session::save_session_on_exit ############################################################################# proc session::open_session {} { variable session_file set session_script_list {} catch { set fd [open $session_file r] fconfigure $fd -encoding utf-8 set session_script_list [read $fd] close $fd } foreach script [lsort -integer -index 0 $session_script_list] { lassign $script priority user server resource command set jid [::xmpp::jid::jid $user $server $resource] if {($user != "") || ($server != "") || ($resource != "")} { # HACK. It works if called before any JID is connected set xlib [create_xlib $jid] } else { set xlib "" } after idle [list eval $command [list $xlib $jid]] } } ############################################################################# proc session::open_session_on_start {} { variable options if {$options(open_on_start)} { open_session } } hook::add finload_hook [namespace current]::session::open_session_on_start 90 ############################################################################# proc session::setup_menu {} { catch { set m [.mainframe getmenu tkabber] set ind [expr {[$m index [::msgcat::mc "Chats"]] + 1}] set mm .session_menu menu $mm -tearoff $::ifacetk::options(show_tearoffs) $mm add command -label [::msgcat::mc "Save state"] \ -command [namespace current]::save_session $mm add checkbutton -label [::msgcat::mc "Save state on exit"] \ -variable [namespace current]::options(save_on_exit) $mm add checkbutton -label [::msgcat::mc "Load state on start"] \ -variable [namespace current]::options(open_on_start) $m insert $ind cascade -label [::msgcat::mc "State"] -menu $mm } } hook::add finload_hook [namespace current]::session::setup_menu 60 # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/general/sigh.tcl000064400000000000000000000046611477701321300166140ustar00nobodynobody# sigh.tcl -- # # An April 1st joke plugin which makes Tkabber sigh. # # Written by Ruslan Rakhmanin # Sound and testing by Serge Yudin xmpp:bigote@jabber.ru return namespace eval sigh { # Maximum number of animation steps variable steps_num 20 # Step duration in mc variable step_duration 100 variable testing 0 } proc sigh::setup {} { set ::sound::options(sigh_sound) [fullpath sounds default sigh.wav] ::sound::load_sound_file sigh after 1000 [namespace current]::is_sigh } hook::add finload_hook [namespace current]::sigh::setup proc sigh::is_sigh {} { variable testing # Every 15 seconds try random number after 300000 [namespace current]::is_sigh set seconds [clock seconds] if {$testing || [clock format $seconds -format %m/%d] == "04/01"} { # Probability of sigh is 5% at every 5 minutes if {$testing || rand() < 0.05} { regexp -- {([0-9]+)x([0-9]+)\+?([0-9-]+)\+?([0-9-]+)} \ [wm geometry .] -> x y kx ky ::sound::play $::sound::sounds(sigh) [namespace current]::make_step 1 $x $y $kx $ky } } } proc sigh::make_step {step x y kx ky} { variable step_duration variable steps_num # Geometry of window could be changed maximum in 5% set dif_w [expr {($x / 100 * 5) * sin(3.1415926 / $steps_num * $step)} ] set dif_h [expr {($y / 100 * 5) * sin(3.1415926 / $steps_num * $step)} ] set newgeometry [expr round($dif_w + $x)]x[expr round($dif_h + $y)] if {$kx >= 0} { set sx [expr round(-$dif_w/2 + $kx)] if {$sx < 0} { set sx 0 } append newgeometry +$sx } else { set sx [expr round(-$dif_w/2 - $kx)] if {$sx < 0} { set sx 0 } append newgeometry -$sx } if {$ky >= 0} { set sy [expr round(-$dif_h/2 + $ky)] if {$sy < 0} { set sy 0 } append newgeometry +$sy } else { set sy [expr round(-$dif_h/2 - $ky)] if {$sy < 0} { set sy 0 } append newgeometry -$sy } wm geometry . $newgeometry if {$step == 0} { return } incr step if {$step <= $steps_num} { after $step_duration [namespace current]::make_step $step $x $y $kx $ky } else { after $step_duration [namespace current]::make_step 0 $x $y $kx $ky } } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/general/sound.tcl000064400000000000000000000304141477701321300170050ustar00nobodynobody# sound.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin # which implements sound notifications for a predefined set of events. namespace eval ::sound { # First, try to load Snack sound library. It uses Tcl event loop when # playing sounds, so it suffers from `heavy' procedures called in event # loop. Therefore it's better to put all sounds to a separate thread # if it's possible. variable snack if {![catch {package require Thread 2-}]} { variable SoundThread [thread::create] if {![catch {thread::send $SoundThread {package require sound 2.0}}]} { set snack 2 } else { set snack 0 thread::release $SoundThread unset SoundThread } } else { if {![catch {package require sound 2.0}]} { set snack 1 } else { set snack 0 } } custom::defgroup Sound [::msgcat::mc "Sound options."] -group Tkabber variable options variable groupchat_may_notify variable vfs if {[catch { set vfs [string match tclvfs* [file system [fullpath sound]]] }]} { set vfs 0 } variable mute 0 custom::defvar options(mute) 0 \ [::msgcat::mc "Mute sound notification."] \ -type boolean \ -group Sound custom::defvar options(notify_online) 1 \ [::msgcat::mc "Use sound notification only when being available."] \ -type boolean \ -group Sound custom::defvar options(mute_groupchat_delayed) 1 \ [::msgcat::mc "Mute sound when displaying delayed groupchat\ messages."] \ -type boolean \ -group Sound custom::defvar options(mute_chat_delayed) 0 \ [::msgcat::mc "Mute sound when displaying delayed personal chat\ messages."] \ -type boolean \ -group Sound custom::defvar options(mute_if_focus) 0 \ [::msgcat::mc "Mute sound if Tkabber window is focused."] \ -type boolean \ -group Sound # One could use external play program instead of Snack custom::defvar options(external_play_program) "" \ [::msgcat::mc "External program, which is to be executed to play\ sound. If empty, Snack library is used (if available)\ to play sound."] \ -type string \ -group Sound # Command line options for external play program custom::defvar options(external_play_program_options) "" \ [::msgcat::mc "Options for external play program"] \ -type string \ -group Sound custom::defvar options(connected_sound) \ [fullpath sounds default connected.wav] \ [::msgcat::mc "Sound to play when connected to Jabber server."] \ -command [namespace code [list load_sound_file connected]] \ -type file \ -group Sound custom::defvar options(disconnected_sound) \ [fullpath sounds default disconnected.wav] \ [::msgcat::mc "Sound to play when disconnected from Jabber server."] \ -command [namespace code [list load_sound_file disconnected]] \ -type file \ -group Sound custom::defvar options(presence_available_sound) \ [fullpath sounds default presence_available.wav] \ [::msgcat::mc "Sound to play when available presence is received."] \ -command [namespace code [list load_sound_file presence_available]] \ -type file \ -group Sound custom::defvar options(presence_unavailable_sound) \ [fullpath sounds default presence_unavailable.wav] \ [::msgcat::mc "Sound to play when unavailable presence is received."] \ -command [namespace code [list load_sound_file presence_unavailable]] \ -type file \ -group Sound custom::defvar options(chat_my_message_sound) \ [fullpath sounds default chat_my_message.wav] \ [::msgcat::mc "Sound to play when sending personal chat message."] \ -command [namespace code [list load_sound_file chat_my_message]] \ -type file \ -group Sound custom::defvar options(chat_their_message_sound) \ [fullpath sounds default chat_their_message.wav] \ [::msgcat::mc "Sound to play when personal chat message is received."] \ -command [namespace code [list load_sound_file chat_their_message]] \ -type file \ -group Sound custom::defvar options(groupchat_server_message_sound) \ [fullpath sounds default groupchat_server_message.wav] \ [::msgcat::mc "Sound to play when groupchat server message is received."] \ -command [namespace code [list load_sound_file groupchat_server_message]] \ -type file \ -group Sound custom::defvar options(groupchat_my_message_sound) \ [fullpath sounds default groupchat_my_message.wav] \ [::msgcat::mc "Sound to play when groupchat message from me is received."] \ -command [namespace code [list load_sound_file groupchat_my_message]] \ -type file \ -group Sound custom::defvar options(groupchat_their_message_sound) \ [fullpath sounds default groupchat_their_message.wav] \ [::msgcat::mc "Sound to play when groupchat message is received."] \ -command [namespace code [list load_sound_file groupchat_their_message]] \ -type file \ -group Sound custom::defvar options(groupchat_their_message_to_me_sound) \ [fullpath sounds default chat_their_message.wav] \ [::msgcat::mc "Sound to play when highlighted (usually addressed personally)\ groupchat message is received."] \ -command [namespace code [list load_sound_file groupchat_their_message_to_me]] \ -type file \ -group Sound variable play_id "" variable play_priority 0 # Do not allow play sound very often custom::defvar options(delay) 200 \ [::msgcat::mc "Time interval before playing next sound\ (in milliseconds)."] \ -type integer \ -group Sound hook::add finload_hook [namespace current]::setup_menu hook::add on_change_user_presence_hook \ [namespace current]::presence_notify 100 hook::add change_our_presence_post_hook [namespace current]::mute_setup 100 hook::add connected_hook [namespace current]::connected_notify 100 hook::add disconnected_hook [namespace current]::disconnected_notify hook::add postload_hook [namespace current]::sound_setup 100 hook::add draw_message_hook [namespace current]::chat_message_notify 19 } proc ::sound::setup_menu {} { variable options set m [.mainframe getmenu tkabber] set ind [$m index [::msgcat::mc "Chats"]] incr ind set mm .sound_menu menu $mm -tearoff $::ifacetk::options(show_tearoffs) $mm add checkbutton -label [::msgcat::mc "Mute sound"] \ -variable [namespace current]::options(mute) $mm add checkbutton -label [::msgcat::mc "Notify only when available"] \ -variable [namespace current]::options(notify_online) $m insert $ind cascade -label [::msgcat::mc "Sound"] \ -menu $mm } proc ::sound::load_sound_file {name args} { variable snack variable options variable sounds variable SoundThread if {[file exist $options(${name}_sound)]} { set sounds($name) $options(${name}_sound) switch -- $snack { 1 { catch {$sounds($name) destroy} catch {snack::sound $sounds($name) -file $sounds($name)} } 2 { thread::send $SoundThread \ [list catch [list $sounds($name) destroy]] thread::send $SoundThread \ [list catch [list snack::sound $sounds($name) -file $sounds($name)]] } } } else { set sounds($name) "" } } proc ::sound::sound_setup {} { variable options variable groupchat_may_notify variable sounds foreach name [list groupchat_server_message groupchat_my_message \ groupchat_their_message chat_my_message \ chat_their_message connected disconnected \ presence_available presence_unavailable \ groupchat_their_message_to_me] { load_sound_file $name } } proc ::sound::play {name {priority 0}} { global userstatus variable snack variable options variable play_id variable play_priority variable SoundThread if {$name == ""} return if {$play_id != ""} { if {$priority >= $play_priority} { return } else { after cancel $play_id } } if {$options(delay) > 0} { set play_id \ [after $options(delay) [list set [namespace current]::play_id {}]] } set play_priority $priority if {$options(external_play_program) == ""} { switch -- $snack { 1 { catch {$name play -block 0} } 2 { thread::send -async $SoundThread \ [list catch [list $name play -block 0]] } } } else { catch {eval "exec $options(external_play_program)\ $options(external_play_program_options)\ [list $name] &"} } } proc ::sound::chat_message_notify {chatid from type body extras} { variable options variable sounds if {[is_mute]} return set delayed [::xmpp::delay::exists $extras] switch -- $type { groupchat { if {$delayed && $options(mute_groupchat_delayed)} { return } if {[chat::get_jid $chatid] eq $from} { play $sounds(groupchat_server_message) } elseif {[chat::is_our_jid $chatid $from]} { play $sounds(groupchat_my_message) } else { set mynick [chat::get_nick [chat::get_xlib $chatid] \ [chat::our_jid $chatid] $type] if {[check_message $mynick $body]} { play $sounds(groupchat_their_message_to_me) -1 } else { play $sounds(groupchat_their_message) } } } chat { if {$delayed && $options(mute_chat_delayed)} { return } foreach xelem $extras { ::xmpp::xml::split $xelem tag xmlns attrs cdata subels # Don't play sound if this 'empty' tag is present. It indicates # messages history in chat window. if {[string equal $tag ""] && \ [string equal $xmlns tkabber:x:nolog]} { return } } if {[chat::is_our_jid $chatid $from]} { play $sounds(chat_my_message) } elseif {$from == ""} { play $sounds(groupchat_server_message) } else { play $sounds(chat_their_message) -1 } } } } proc ::sound::presence_notify {name status} { variable options variable sounds if {[is_mute]} return if {$status == "available" || $status == "chat"} { play $sounds(presence_available) } else { play $sounds(presence_unavailable) } } proc ::sound::mute_setup {status} { variable options variable mute if {$options(notify_online)} { switch -- $status { available - chat { set mute 0 } default { set mute 1 } } } else { set mute 0 } } proc ::sound::connected_notify {xlib} { variable options variable sounds if {[is_mute]} return play $sounds(connected) 1 } proc ::sound::disconnected_notify {xlib} { variable options variable sounds if {[is_mute]} return play $sounds(disconnected) 1 } proc ::sound::is_mute {} { variable snack variable options variable mute expr {($options(external_play_program) == "" && $snack == 0) || \ $options(mute) || \ $mute || \ ($options(mute_if_focus) && [focus -displayof .] != "")} } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/general/stats.tcl000064400000000000000000000167071477701321300170240ustar00nobodynobody# stats.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin # which implements the Statistics Gathering (XEP-0039) protocol. namespace eval stats {} set ::NS(stats) http://jabber.org/protocol/stats proc stats::open_window {} { variable lastline variable f set w .stats if {[winfo exists $w]} { return } add_win $w -title [::msgcat::mc "Statistics monitor"] \ -tabtitle [::msgcat::mc "Statistics"] \ -class Stats \ -raise 1 #-raisecmd [list focus $w.tree] \ set sw [ScrolledWindow $w.sw] pack $sw -side top -fill both -expand yes set sf [ScrollableFrame $w.sf] $sw setwidget $sf set f [$sf getframe] set i 0 foreach label [list [::msgcat::mc "JID"] \ [::msgcat::mc "Node"] \ [::msgcat::mc "Name "] \ [::msgcat::mc "Value"] \ [::msgcat::mc "Units"]] { set l [label $f.titlelabel$i -text $label] grid $l -row 0 -column $i -sticky w incr i } set i 7 set l [label $f.titlelabel$i -text [::msgcat::mc "Timer"]] grid $l -row 0 -column $i -sticky w -columnspan 2 set lastline 1 } proc stats::add_line {jid node name} { variable data variable lastline variable f set n $lastline incr lastline set l [label $f.ljid$n -text $jid] grid $l -row $n -column 0 -sticky w set l [label $f.lnode$n -text $node] grid $l -row $n -column 1 -sticky w set l [label $f.lname$n -text $name] grid $l -row $n -column 2 -sticky w set l [label $f.lvalue$n \ -textvariable [namespace current]::data(value,$jid,$node,$name)] grid $l -row $n -column 3 -sticky e set l [label $f.lunits$n \ -textvariable [namespace current]::data(units,$jid,$node,$name)] grid $l -row $n -column 4 -sticky w set b [button $f.brequest$n -text [::msgcat::mc "Request"] \ -command [list [namespace current]::request_value \ $jid $node $name]] grid $b -row $n -column 5 -sticky w set b [button $f.bremove$n -text [::msgcat::mc "Remove"] \ -command [list [namespace current]::remove_line \ $n]] grid $b -row $n -column 6 -sticky w set s [Spinbox $f.spin$n 0 1000000000 1 \ [namespace current]::data(tmpperiod,$jid,$node,$name) \ -width 4] trace add variable [namespace current]::data(tmpperiod,$jid,$node,$name) write \ [list [namespace current]::unset_timer $n $jid $node $name] grid $s -row $n -column 7 -sticky w catch {unset data(period,$jid,$node,$name)} set b [button $f.bsettimer$n -text [::msgcat::mc "Set"] \ -relief raised \ -command [list [namespace current]::toggle_timer \ $n $jid $node $name]] grid $b -row $n -column 8 -sticky w } proc stats::query_list {xlib jid node args} { set vars {} if {$node != ""} { lappend vars node $node } if {$xlib == ""} { set xlib [lindex [connections] 0] } ::xmpp::sendIQ $xlib get \ -query [::xmpp::xml::create query \ -xmlns $::NS(stats) \ -attrs $vars] \ -to $jid \ -command [list [namespace current]::recv_query_list_result $jid $node] } proc stats::recv_query_list_result {jid node res child} { variable data if {$res ne "ok"} { return } open_window ::xmpp::xml::split $child tag xmlns attrs cdata subels foreach item $subels { ::xmpp::xml::split $item stag sxmlns sattrs scdata ssubels if {$stag == "stat"} { set name [::xmpp::xml::getAttr $sattrs name] add_line $jid $node $name } } } proc stats::request_value {jid node name} { set vars {} if {$node != ""} { lappend vars node $node } ::xmpp::sendIQ [lindex [connections] 0] get \ -query [::xmpp::xml::create query \ -xmlns $::NS(stats) \ -attrs $vars \ -subelement [::xmpp::xml::create stat \ -attrs [list name $name]]] \ -to $jid \ -command [list [namespace current]::recv_values_result $jid $node] } proc stats::recv_values_result {jid node res child} { variable data if {$res ne "ok"} { return } open_window ::xmpp::xml::split $child tag xmlns attrs cdata subels foreach item $subels { ::xmpp::xml::split $item stag sxmlns sattrs scdata ssubels if {$stag == "stat"} { set name [::xmpp::xml::getAttr $sattrs name] set value [::xmpp::xml::getAttr $sattrs value] set units [::xmpp::xml::getAttr $sattrs units] foreach sitem $ssubels { ::xmpp::xml::split $sitem sstag ssxmlns ssattrs sscdata sssubels if {$sstag == "error"} { set error [error_to_string \ [list [::xmpp::xml::getAttr $ssattrs code] \ $sscdata]] break } } if {[info exists error]} { set data(value,$jid,$node,$name) $error set data(units,$jid,$node,$name) error } else { set data(value,$jid,$node,$name) $value set data(units,$jid,$node,$name) $units } } } } proc stats::remove_line {n} { variable f foreach slave [grid slaves $f -row $n] { destroy $slave } } proc stats::unset_timer {n jid node name args} { variable data variable f if {[info exists data(period,$jid,$node,$name)]} { unset data(period,$jid,$node,$name) $f.bsettimer$n configure -relief raised } } proc stats::toggle_timer {n jid node name} { variable data variable f if {![info exists data(period,$jid,$node,$name)]} { if {[string is integer -strict $data(tmpperiod,$jid,$node,$name)] && \ $data(tmpperiod,$jid,$node,$name) > 0} { set data(period,$jid,$node,$name) $data(tmpperiod,$jid,$node,$name) $f.bsettimer$n configure -relief sunken timer $n $jid $node $name } } else { unset data(period,$jid,$node,$name) $f.bsettimer$n configure -relief raised } } proc stats::timer {n jid node name} { variable data variable f if {![winfo exists $f.spin$n]} return request_value $jid $node $name if {![info exists data(period,$jid,$node,$name)]} return set p $data(period,$jid,$node,$name) after cancel \ [list [namespace current]::timer $n $jid $node $name] if {$p > 0 && [winfo exists $f.spin$n]} { after [expr {$p * 1000}] \ [list [namespace current]::timer $n $jid $node $name] } } proc stats::setup_menu {} { catch { set m [.mainframe getmenu admin] $m add command -label [::msgcat::mc "Open statistics monitor"] \ -command [namespace current]::open_window } } hook::add finload_hook [namespace current]::stats::setup_menu stats::setup_menu hook::add postload_hook \ [list disco::browser::register_feature_handler $::NS(stats) \ [namespace current]::stats::query_list -node 1 \ -desc [list * [::msgcat::mc "Service statistics"]]] # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/general/subscribe_gateway.tcl000064400000000000000000000165311477701321300213630ustar00nobodynobody# subscribe_gateway.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # implements subscription dialogs for external gateways/transports. namespace eval gateway { variable msgid 0 hook::add roster_service_popup_menu_hook \ [namespace current]::add_menu_item 30 } proc gateway::add_menu_item {m xlib jid} { $m add command -label [::msgcat::mc "Add user to roster..."] \ -command [list [namespace current]::subscribe_dialog $xlib $jid] } proc gateway::subscribe_dialog {xlib service} { variable msgid set mw .gwmsg$msgid Toplevel $mw wm group $mw . set title [::msgcat::mc "Send subscription at %s" $service] wm title $mw $title wm iconname $mw $title set bbox [ButtonBox $mw.buttons -spacing 0 -padx 2m -default 0] $bbox add -text [::msgcat::mc "Subscribe"] \ -command [list [namespace current]::send_subscribe $mw $xlib $service] $bbox add -text [::msgcat::mc "Cancel"] -command [list destroy $mw] bind $mw "ButtonBox::invoke [double% $bbox] default" bind $mw "ButtonBox::invoke [double% $bbox] 1" pack $bbox -side bottom -anchor e -padx 2m -pady 2m Frame $mw.frame pack $mw.frame -side top -fill both -expand yes -padx 2m -pady 2m Label $mw.prompt pack $mw.prompt -side top -anchor w -in $mw.frame variable $mw.prompt fulljid bind $mw [list catch [list unset [namespace current]::%W.prompt]] ::xmpp::sendIQ $xlib get \ -query [::xmpp::xml::create query \ -xmlns jabber:iq:gateway] \ -to $service \ -command [list [namespace current]::configure_prompt $mw.prompt] Frame $mw.subj Label $mw.subj.lab -text [::msgcat::mc "Send subscription to: "] Entry $mw.subj.entry pack $mw.subj.lab -side left pack $mw.subj.entry -side left -fill x -expand yes pack $mw.subj -side top -anchor w -fill x -expand yes -in $mw.frame Frame $mw.space pack $mw.space -side top -fill x -in $mw.frame -pady 0.5m ScrolledWindow $mw.sw pack $mw.sw -side top -fill both -expand yes -in $mw.frame textUndoable $mw.body -width 60 -height 8 -wrap word $mw.body insert 0.0 [::msgcat::mc "I would like to add you to my roster."] $mw.sw setwidget $mw.body focus $mw.subj.entry incr msgid } proc gateway::configure_prompt {w res child} { if {![winfo exists $w]} return $w configure \ -text [::msgcat::mc "Enter screenname of contact you want to add"] if {$res != "ok"} { return } ::xmpp::xml::split $child tag xmlns attrs cdata subels foreach ch $subels { ::xmpp::xml::split $ch stag sxmlns sattrs scdata ssubels if {($stag == "desc") && ($scdata != "")} { $w configure -text $scdata variable $w screenname break } } } proc gateway::send_subscribe {mw xlib service} { variable $mw.prompt switch -- [set $mw.prompt] { fulljid { $mw.subj.entry insert end "@$service" message::send_subscribe $mw $xlib } screenname { set screenname [$mw.subj.entry get] ::xmpp::sendIQ $xlib set \ -query [::xmpp::xml::create query \ -xmlns jabber:iq:gateway \ -subelement [::xmpp::xml::create prompt \ -cdata $screenname]] \ -to $service \ -command [list [namespace current]::gw_send_subscribe $mw \ "$screenname@$service" \ $xlib] } } } proc gateway::gw_send_subscribe {mw fallback xlib res child} { set jid $fallback if {$res == "ok"} { ::xmpp::xml::split $child tag xmlns attrs cdata subels foreach ch $subels { ::xmpp::xml::split $ch stag sxmlns sattrs scdata ssubels if {($stag == "jid" || ($stag == "prompt")) && \ ($scdata != "")} { set jid $scdata break } } } $mw.subj.entry delete 0 end $mw.subj.entry insert 0 $jid message::send_subscribe $mw $xlib } proc gateway::convert_jid {xlib jid args} { ::xmpp::sendIQ $xlib get \ -query [::xmpp::xml::create query \ -xmlns jabber:iq:gateway] \ -to $jid \ -command [list [namespace current]::convert_jid_dialog \ $xlib $jid] } proc gateway::convert_jid_dialog {xlib jid res child} { variable msgid if {$res != "ok"} return set w .gwmsg$msgid Dialog $w -title [::msgcat::mc "Screenname conversion"] \ -anchor e -modal none \ -default 0 -cancel 1 set f [$w getframe] $w add -text [::msgcat::mc "Convert"] \ -command [list [namespace current]::convert_screenname $w $xlib $jid] $w add -text [::msgcat::mc "Cancel"] -command [list destroy $w] ::xmpp::xml::split $child tag xmlns attrs cdata subels set row 0 foreach ch $subels { ::xmpp::xml::split $ch stag sxmlns sattrs scdata ssubels switch -- $stag { desc { if {![winfo exists $f.desc]} { Message $f.desc -text $scdata -width 15c grid $f.desc -row $row -column 0 \ -columnspan 2 -sticky w -pady 2m } } prompt { if {![winfo exists $f.prompt]} { Label $f.lprompt -text [::msgcat::mc "Screenname:"] Entry $f.prompt grid $f.lprompt -row $row -column 0 grid $f.prompt -row $row -column 1 -sticky ew -padx 1m } } } incr row } incr msgid $w draw $f.prompt } proc gateway::convert_screenname {w xlib jid} { set f [$w getframe] set screenname [$f.prompt get] destroy $w ::xmpp::sendIQ $xlib set \ -query [::xmpp::xml::create query \ -xmlns jabber:iq:gateway \ -subelement [::xmpp::xml::create prompt \ -cdata $screenname]] \ -to $jid \ -command [list [namespace current]::display_conversion $w $screenname] } proc gateway::display_conversion {w screenname res child} { if {$res != "ok"} { NonmodalMessageDlg $w -aspect 50000 -icon error \ -message [::msgcat::mc "Error while converting screenname: %s." \ [error_to_string $child]] } else { set jid "" ::xmpp::xml::split $child tag xmlns attrs cdata subels foreach ch $subels { ::xmpp::xml::split $ch stag sxmlns sattrs scdata ssubels if {($stag == "jid" || ($stag == "prompt")) && \ ($scdata != "")} { set jid $scdata break } } NonmodalMessageDlg $w -aspect 50000 \ -title [::msgcat::mc "Screenname conversion"] \ -message [::msgcat::mc "Screenname: %s\n\nConverted JID: %s" \ $screenname $jid] } } hook::add postload_hook \ [list disco::browser::register_feature_handler jabber:iq:gateway \ [namespace current]::gateway::convert_jid \ -desc [list * [::msgcat::mc "Convert screenname"]]] # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/general/tkcon.tcl000064400000000000000000000031211477701321300167660ustar00nobodynobody# tkcon.tcl -- # # This file is a part of the Tkabber XMPP client. It shows TkCon console # in the Tkabber menu if you're running tkabber under the tkcon package # # http://tkcon.sourceforge.net # # e.g., # # % tkcon.tcl -name tkabber -exec "" -root .tkconn -main "source tkabber.tcl" # # or if tkcon is installed as a Tcl package and can be sourced via # [package require] (tkcon isn't loaded at start, so it doesn't waste # resources if it's unneeded). if {[llength [package versions tkcon]] == 0 && \ [llength [info commands ::tkcon::*]] <= 0} { return } namespace eval tkcon { variable onceP 1 variable showP 0 } proc tkcon::add_tkcon_to_tkabber_menu {args} { catch { set menu [.mainframe getmenu debug] $menu add checkbutton -label [::msgcat::mc "Show TkCon console"] \ -command [namespace current]::show_console \ -variable [namespace current]::showP show_console } } proc tkcon::show_console {} { variable onceP variable showP if {[llength [info commands ::tkcon::*]] <= 0} { package require tkcon } if {$showP} { tkcon show if {$onceP} { wm protocol $::tkcon::PRIV(root) WM_DELETE_WINDOW \ [namespace current]::hide_console set onceP 0 } } else { tkcon hide } } proc tkcon::hide_console {} { variable showP tkcon hide set showP 0 } hook::add finload_hook [namespace current]::tkcon::add_tkcon_to_tkabber_menu # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/general/xaddress.tcl000064400000000000000000000220221477701321300174660ustar00nobodynobody# xaddress.tcl -- # # Implementation of XEP-0033: Extended Stanza Addressing # # The sender address is rewritten, but the original address is stored # in an additional element: # # set ::NS(xaddress) "http://jabber.org/protocol/address" set ::NS(xaddress_store) "tkabber:xaddress:store" namespace eval ::xaddress { variable xaddrinfoid 0 variable names array set names [list \ ofrom [::msgcat::mc "Original from"] \ oto [::msgcat::mc "Original to"] \ replyto [::msgcat::mc "Reply to"] \ replyroom [::msgcat::mc "Reply to room"] \ noreply [::msgcat::mc "No reply"] \ to [::msgcat::mc "To"] \ cc [::msgcat::mc "Carbon copy"] \ bcc [::msgcat::mc "Blind carbon copy"] \ ] } ####################################################### # Common procs proc ::xaddress::parse_xaddress_fields {xe {elems {}}} { ::xmpp::xml::split $xe tag xmlns attrs cdata subels if {![string equal $xmlns $::NS(xaddress)]} { return {} } if {![string equal $tag addresses]} { return {} } set res {} foreach subel $subels { ::xmpp::xml::split $subel stag sxmlns sattrs scdata ssubels if {![string equal $stag address]} continue set type [::xmpp::xml::getAttr $sattrs type] if {[llength $elems] > 0 && $type ni $elems} continue set params {} foreach elem {jid node uri descr delivered} { set value [::xmpp::xml::getAttr $sattrs $elem] if {![string equal $value ""]} { lappend params $elem $value } } lappend res $type $params } return $res } proc ::xaddress::format_addressinfo_tooltip {type from real_from reason fields} { variable names set lines {} switch -- $reason { ofrom { lappend lines \ [::msgcat::mc "This message was forwarded by %s\n" \ $real_from] } #replyto - #replyroom { # lappend lines \ # [::msgcat::mc "This message was sent by %s\n" $real_from] #} } lappend lines [::msgcat::mc "Extended addressing fields:"] foreach {type params} $fields { array set arparams $params if {[info exists names($type)]} { set line " $names($type):" } else { set line " $type:" } if {[info exists arparams(descr)]} { append line " <$arparams(descr)>" } if {[info exists arparams(jid)]} { append line " $arparams(jid)" if {[info exists arparams(node)]} { append line " [$arparams(node)]" } } elseif {[info exists arparams(uri)]} { append line " $arparams(uri)" } lappend lines $line array unset arparams } return [join $lines "\n"] } ###################################################### # Replace original jid. Read README.xaddress proc ::xaddress::modify_from \ {vxlib vfrom vid vtype vis_subject vsubject \ vbody verr vthread vpriority vx} { upvar 2 $vxlib xlib upvar 2 $vfrom from upvar 2 $vtype type upvar 2 $vx x # those types are supported at now. if {$type ni {chat normal groupchat ""}} return # Rewrite the from address only if forwarding happens to be from my own JID # (from another resource). if {![::xmpp::jid::equal [::xmpp::jid::removeResource $from] \ [::xmpp::jid::removeResource [connection_jid $xlib]]]} { return } foreach xe $x { ::xmpp::xml::split $xe tag xmlns attrs cdata subels if {[llength [set res [parse_xaddress_fields $xe {ofrom}]]] == 0} continue # FIX: now we get only first but what if there are several ofrom fields? lassign $res reason attrs1 set ofrom [::xmpp::xml::getAttr $attrs1 jid] if {[string equal $ofrom ""]} return # Use the empty tag which can't be received from the outside set x [linsert $x 0 [::xmpp::xml::create "" \ -xmlns $::NS(xaddress_store) \ -attrs [list from $from \ reason $reason]]] set from $ofrom return } } hook::add rewrite_message_hook ::xaddress::modify_from ##################################################################### # Draw special icon and tooltip for xaddress messages in the chat. proc ::xaddress::draw_xaddress {chatid from type body x} { variable xaddrinfoid set chatw [chat::chat_win $chatid] set real_from "" set reason "" set image xaddress/info/blue foreach xe $x { ::xmpp::xml::split $xe tag xmlns attrs cdata subels if {$xmlns eq $::NS(xaddress_store) && $tag eq ""} { # This auxiliary element was inserted into yhe very beginning of # the 'x' list, so we don't have to use a separate loop to # extract it set real_from [::xmpp::xml::getAttr $attrs from] set reason [::xmpp::xml::getAttr $attrs reason] set image xaddress/info/green continue } if {[llength [set fields [parse_xaddress_fields $xe]]] == 0} continue incr xaddrinfoid set label \ [Label $chatw.xaddrinfo$xaddrinfoid \ -image $image \ -helptext [format_addressinfo_tooltip \ $type $from $real_from $reason $fields] \ -helptype balloon \ -bg [$chatw cget -background]] $chatw window create end -window $label break } } hook::add draw_message_hook ::xaddress::draw_xaddress 4 ########################################################## # Draw xaddress fields in the new message dialog proc ::xaddress::process_x_data {rowvar bodyvar f x xlib from id type replyP} { upvar 2 $rowvar row upvar 2 $bodyvar body variable names if {!$replyP || [string equal $type error]} { return } set title [join [lrange [split $f .] 0 end-1] .].title foreach xe $x { ::xmpp::xml::split $xe tag xmlns attrs cdata subels # if "from" was modified draw reason and real_from if {[string equal $xmlns $::NS(xaddress_store)] && [string equal $tag x]} { set real_from [::xmpp::xml::getAttr $attrs from] set reason [::xmpp::xml::getAttr $attrs reason] switch -- $reason { ofrom { grid [Label $title.flabel \ -text [::msgcat::mc "Forwarded by:"]] \ -column 0 -row 2 -sticky e grid [Label $title.fjid -text $real_from] \ -column 1 -row 2 -sticky w } } continue } if {[llength [set fields [parse_xaddress_fields $xe]]] == 0} continue # draw most important xaddress fields set other_fields {} foreach {type params} $fields { array unset aparams array set aparams $params switch -- $type { noreply - replyroom - replyto { if {![info exist aparams(jid)]} { lappend other_fields $type $params continue } set text "" if {[info exists aparams(descr)]} { append text "<$aparams(descr)> " } append text $aparams(jid) if {[info exists aparams(node)]} { append text " [$aparams(node)]" } grid [Label $f.lxaddr${row} \ -text $names($type):] \ -column 0 -row $row -sticky e grid [Label $f.xaddr${row} -text $text] \ -column 1 -row $row -sticky w incr row } default { lappend other_fields $type $params } } } # draw rest in tooltip if {[llength $other_fields] > 0} { set label \ [Label $title.xaddrinfo \ -image xaddress/info/green \ -helptext [format_addressinfo_tooltip \ $type $from "" "" $other_fields] \ -helptype balloon \ -bg [$title cget -background]] grid $label -row 1 -column 4 -sticky e } } return } hook::add message_process_x_hook ::xaddress::process_x_data # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/general/xcommands.tcl000064400000000000000000000360121477701321300176460ustar00nobodynobody# xcommands.tcl -- # # Ad-Hoc Commands support (XEP-0050) ########################################################################## namespace eval xcommands { variable winid 0 } ########################################################################## proc xcommands::execute {xlib jid node args} { set category automation foreach {key val} $args { switch -- $key { -category { set category $val } } } if {$category != "automation"} return set vars [list action execute] if {$node != ""} { lappend vars node $node } ::xmpp::sendIQ $xlib set \ -query [::xmpp::xml::create command \ -xmlns $::NS(commands) \ -attrs $vars] \ -command [list [namespace current]::execute_result $xlib $jid $node] \ -to $jid } ########################################################################## proc xcommands::execute_result {xlib jid node res child} { variable winid if {[string equal $res error]} { incr winid set w .xcommands_err$winid if {[winfo exists $w]} { destroy $w } MessageDlg $w -aspect 50000 -icon error \ -message [format \ [::msgcat::mc "Error executing command: %s"] \ [error_to_string $child]] \ -type user -buttons ok -default 0 -cancel 0 return } ::xmpp::xml::split $child tag xmlns attrs cdata subels set node [::xmpp::xml::getAttr $attrs node] set sessionid [::xmpp::xml::getAttr $attrs sessionid] set status [::xmpp::xml::getAttr $attrs status] draw_window $xlib $jid $node $sessionid $status $subels } ########################################################################## proc xcommands::draw_window {xlib jid node sessionid status xmldata} { variable winid lassign [find_note $xmldata] type note lassign [find_actions $xmldata] actions execute # Only jabber:x:data payloads are supported lassign [::xmpp::data::findForm $xmldata] type form set xdata [::xmpp::data::parseForm $form] switch -- $status { executing - completed { } canceled - default { return } } incr winid set w .xcommands$winid if {[winfo exists $w]} { destroy $w } Dialog $w -transient 0 \ -modal none \ -anchor e \ -class XData \ -default 0 \ -cancel 1 set geometry [option get $w geometry XData] if {$geometry != ""} { wm geometry $w $geometry } set sw [ScrolledWindow $w.sw] set sf [ScrollableFrame $w.fields -constrainedwidth yes] set f [$sf getframe] $sw setwidget $sf set nf [Frame $w.note] pack_note $nf $type $note set focus [data::fill_fields_x $f $xdata] switch -- $status { executing { if {[llength $actions] == 0 || \ ([llength $actions] == 1 && "complete" in $actions)} { $w add -text [::msgcat::mc "Submit"] \ -command [list [namespace current]::execute_window \ $w $xlib $jid $node $sessionid complete \ [list [namespace current]::complete_result]] $w add -text [::msgcat::mc "Cancel"] \ -command [list [namespace current]::cancel_window \ $w $xlib $jid $node $sessionid] $w configure -default 0 set cancel 1 } else { $w add -text [::msgcat::mc "Prev"] \ -state disabled \ -command [list [namespace current]::execute_window \ $w $xlib $jid $node $sessionid prev \ [list [namespace current]::next_result]] $w add -text [::msgcat::mc "Next"] \ -state disabled \ -command [list [namespace current]::execute_window \ $w $xlib $jid $node $sessionid next \ [list [namespace current]::next_result]] $w add -text [::msgcat::mc "Finish"] \ -state disabled \ -command [list [namespace current]::execute_window \ $w $xlib $jid $node $sessionid complete \ [list [namespace current]::complete_result]] $w add -text [::msgcat::mc "Cancel"] \ -command [list [namespace current]::cancel_window \ $w $xlib $jid $node $sessionid] set_default_button $w $actions $execute set cancel 3 } } completed { $w add -text [::msgcat::mc "Close"] \ -command [list [namespace current]::close_window $w] $w configure -default 0 set cancel 0 } } # Can't configure -cancel option because of bug in BWidget # $w configure -cancel $cancel bind $w [list $w.bbox invoke $cancel] bind $f [list data::cleanup %W] bindscroll $f $sf pack $nf -side top -expand no -fill x -padx 2m -pady 0m -in [$w getframe] pack $sw -side top -expand yes -fill both -padx 2m -pady 2m -in [$w getframe] update idletasks $nf configure -width [expr {[winfo reqwidth $f] + [winfo pixels $f 1c]}] if {$focus != ""} { $w draw $focus } else { $w draw } return $w } ########################################################################## proc xcommands::execute_window {w xlib jid node sessionid action cmd} { # Send requested data and wait for result set vars [list sessionid $sessionid action $action] if {$node != ""} { lappend vars node $node } set f [$w.fields getframe] ::xmpp::sendIQ $xlib set \ -query [::xmpp::xml::create command \ -xmlns $::NS(commands) \ -attrs $vars \ -subelement [::xmpp::data::submitForm [data::get_fields $f]]] \ -command [list $cmd $w $xlib $jid $node $sessionid] \ -to $jid } ########################################################################## proc xcommands::pack_note {fr type note} { set mf $fr.msg if {[winfo exists $mf]} { destroy $mf } if {$note == ""} return switch -- $type { warn { set msg [::msgcat::mc "Warning:"] } error { set msg [::msgcat::mc "Error:"] } default { set msg [::msgcat::mc "Info:"] } } Message $mf -text "$msg $note" -aspect 50000 -width 0 pack $mf } ########################################################################## proc xcommands::set_default_button {bbox actions execute} { set default -1 foreach action $actions { switch -- $action { prev { $bbox itemconfigure 0 -state normal if {$default == -1} { set default 0 } } next { $bbox itemconfigure 1 -state normal set default 1 } complete { $bbox itemconfigure 2 -state normal if {$default == -1 || $default == 0} { set default 2 } } } } if {$default != -1} { $bbox configure -default $default } else { $bbox itemconfigure 1 -state normal $bbox configure -default 1 } switch -- $execute { prev { $bbox itemconfigure 0 -state normal $bbox configure -default 0 } next { $bbox itemconfigure 1 -state normal $bbox configure -default 1 } complete { $bbox itemconfigure 2 -state normal $bbox configure -default 2 } } } ########################################################################## proc xcommands::next_result {w xlib jid node sessionid res child} { variable winid set f [$w.fields getframe] foreach cw [winfo children $f] { destroy $cw } data::cleanup $f if {[string equal $res error]} { incr winid set w .xcommands_err$winid if {[winfo exists $w]} { destroy $w } MessageDlg $w -aspect 50000 -icon error \ -message [format \ [::msgcat::mc "Error executing command: %s"] \ [error_to_string $child]] \ -type user -buttons ok -default 0 -cancel 0 return } # TODO ::xmpp::xml::split $child tag xmlns attrs cdata subels set node [::xmpp::xml::getAttr $attrs node] set sessionid [::xmpp::xml::getAttr $attrs sessionid] set status [::xmpp::xml::getAttr $attrs status] destroy $w draw_window $xlib $jid $node $sessionid $status $subels } ########################################################################## proc xcommands::complete_result {w xlib jid node sessionid res child} { variable winid if {[string equal $res err]} { incr winid set w .xcommands_err$winid if {[winfo exists $w]} { destroy $w } MessageDlg $w -aspect 50000 -icon error \ -message [format \ [::msgcat::mc "Error completing command: %s"] \ [error_to_string $child]] \ -type user -buttons ok -default 0 -cancel 0 return } # TODO ::xmpp::xml::split $child tag xmlns attrs cdata subels set node [::xmpp::xml::getAttr $attrs node] set sessionid [::xmpp::xml::getAttr $attrs sessionid] set status [::xmpp::xml::getAttr $attrs status] switch -- $status { executing - completed { } canceled - default { return } } lassign [find_note $subels] type note lassign [find_actions $subels] actions execute # Only jabber:x:data payloads are supported lassign [::xmpp::data::findForm $subels] type form set xdata [::xmpp::data::parseForm $form] set f [$w.fields getframe] foreach cw [winfo children $f] { destroy $cw } data::cleanup $f set nf $w.note pack_note $nf $type $note set focus [data::fill_fields_x $f $xdata] destroy $w draw_window $xlib $jid $node $sessionid $status $subels } ########################################################################## proc xcommands::cancel_window {w xlib jid node sessionid} { # Send cancelling stanza and ignore reply or error set vars [list sessionid $sessionid action cancel] if {$node != ""} { lappend vars node $node } ::xmpp::sendIQ $xlib set \ -query [::xmpp::xml::create command \ -xmlns $::NS(commands) \ -attrs $vars] \ -command [namespace code cancel_result] \ -to $jid close_window $w } proc xcommands::cancel_result {args} {} ########################################################################## proc xcommands::close_window {w} { set f [$w.fields getframe] data::cleanup $f destroy $w } ########################################################################## proc xcommands::find_actions {xmldata} { set actions {} set execute next foreach child $xmldata { ::xmpp::xml::split $child tag xmlns attrs cdata subels if {$tag == "actions"} { if {[::xmpp::xml::isAttr $attrs execute]} { set execute [::xmpp::xml::getAttr $attrs execute] } foreach subel $subels { ::xmpp::xml::split $subel stag sxmlns sattrs scdata ssubels switch -- $stag { prev - next - complete { lappend actions $stag } } } if {$execute ni $actions} { set execute next } } } return [list $actions $execute] } ########################################################################## proc xcommands::find_note {xmldata} { set note "" set type info foreach child $xmldata { ::xmpp::xml::split $child tag xmlns attrs cdata subels if {$tag == "note"} { set note [string trim $cdata] set type [::xmpp::xml::getAttr $attrs type] switch -- $type { info - warn - error { } default { set type info } } } } return [list $type $note] } ########################################################################## proc xcommands::register_namespace {} { disco::browser::register_feature_handler $::NS(commands) \ [namespace current]::execute -node 1 \ -desc [list automation [::msgcat::mc "Execute command"]] disco::register_featured_node $::NS(commands) $::NS(commands) \ [::msgcat::mc "Commands"] } hook::add postload_hook [namespace current]::xcommands::register_namespace ########################################################################## proc xcommands::add_menu_item {m xlib jid} { set mm [menu $m.commands -tearoff 0] $m add cascade -label [::msgcat::mc "Commands"] \ -menu $mm \ -state disabled disco::request_items $xlib $jid \ -node $::NS(commands) \ -cache yes \ -command [namespace code [list recv_commands $m $xlib $jid $mm]] } proc xcommands::recv_commands {m xlib jid mm status items} { if {![string equal $status ok]} return if {![winfo exists $m] || ![winfo exists $mm]} return set q 0 foreach item $items { set jid [::xmpp::xml::getAttr $item jid] if {[string equal $jid ""]} continue set node [::xmpp::xml::getAttr $item node] if {[string equal $node ""]} continue set name [::xmpp::xml::getAttr $item name] if {[string equal $name ""]} { set name $node } $mm add command -label $name \ -command [namespace code [list execute $xlib $jid $node]] set q 1 } if {$q} { $m entryconfigure [::msgcat::mc "Commands"] -state normal } } hook::add chat_create_user_menu_hook [namespace current]::xcommands::add_menu_item 43.5 hook::add chat_create_conference_menu_hook [namespace current]::xcommands::add_menu_item 43.5 hook::add roster_create_groupchat_user_menu_hook [namespace current]::xcommands::add_menu_item 43.5 hook::add roster_conference_popup_menu_hook [namespace current]::xcommands::add_menu_item 43.5 hook::add roster_service_popup_menu_hook [namespace current]::xcommands::add_menu_item 43.5 hook::add roster_jid_popup_menu_hook [namespace current]::xcommands::add_menu_item 43.5 hook::add message_dialog_menu_hook [namespace current]::xcommands::add_menu_item 43.5 hook::add search_popup_menu_hook [namespace current]::xcommands::add_menu_item 43.5 # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/iq000075500000000000000000000000001477701321300140645ustar00nobodynobodytkabber/plugins/iq/browse.tcl000064400000000000000000000014271477701321300161540ustar00nobodynobody# browse.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # replies to the obsolete Jabber browser protocol (XEP-0011) requests. proc iq_browse_reply {xlib from child args} { set restags {} foreach ns [::xmpp::iq::registered $xlib] { lappend restags [::xmpp::xml::create ns -cdata $ns] } set res [::xmpp::xml::create query \ -xmlns jabber:iq:browse \ -attrs {category user \ type client \ name Tkabber} \ -subelements $restags] return [list result $res] } ::xmpp::iq::register get * jabber:iq:browse \ [namespace current]::iq_browse_reply # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/iq/last.tcl000064400000000000000000000022001477701321300156040ustar00nobodynobody# last.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin # which replies to the jabber:iq:last (XEP-0012) requests. custom::defvar options(reply_iq_last) 1 \ [::msgcat::mc "Reply to idle time (jabber:iq:last) requests."] \ -group IQ -type boolean proc iq_last {xlib from child args} { global userstatus statusdesc textstatus variable options if {$options(reply_iq_last) && ![catch {tk inactive} ms] && $ms >= 0} { set seconds [expr {$ms/1000}] set status $statusdesc($userstatus) if {$textstatus eq ""} { set status "$statusdesc($userstatus)" } else { set status "$textstatus ($statusdesc($userstatus))" } return [list result [::xmpp::xml::create query \ -xmlns jabber:iq:last \ -attrs [list seconds $seconds] \ -cdata $status]] } else { return [list error cancel service-unavailable] } } ::xmpp::iq::register get query jabber:iq:last [namespace current]::iq_last # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/iq/ping.tcl000064400000000000000000000052511477701321300156070ustar00nobodynobody# ping.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin # which implements XMPP Ping (XEP-0199) support. package require xmpp::ping namespace eval ping { custom::defvar options(ping) 1 \ [::msgcat::mc "Ping server using XMPP ping requests."] \ -group IQ \ -type options \ -values [list 0 [::msgcat::mc "No"] \ 1 [::msgcat::mc "Only TCP based connections"] \ 2 [::msgcat::mc "Both TCP based and HTTP based connections"]] \ -command [namespace code start_all] custom::defvar options(timeout) 30 \ [::msgcat::mc "Reconnect to server if it does not reply (with result\ or with error) to XMPP ping request in\ specified time interval (in seconds)."] \ -group IQ \ -type integer \ -command [namespace code start_all] custom::defvar options(pong) 0 \ [::msgcat::mc "Reply to XMPP ping requests."] \ -group IQ \ -type boolean variable sequence ::xmpp::ping::register -command [namespace code reply] hook::add connected_hook [namespace code start] } proc ping::reply {xlib from args} { variable options if {$options(pong)} { return [list result {}] } else { return [list error cancel service-unavailable] } } proc ping::start_all {args} { foreach xlib [connections] { start $xlib } } proc ping::start {xlib} { variable options variable sequence global xmppTransport after cancel [namespace code [list start $xlib]] if {$options(ping) == 0 || ($options(timeout) <= 0)} return if {$options(ping) < 2 && [info exists xmppTransport($xlib)] && \ ($xmppTransport($xlib) == "bosh" || $xmppTransport($xlib) == "poll")} return if {![info exists sequence($xlib)]} { set sequence($xlib) 0 } ::xmpp::ping::ping $xlib \ -timeout [expr {$options(timeout)*1000}] \ -command [namespace code [list result $xlib [incr sequence($xlib)]]] } proc ping::result {xlib seq status xml} { variable options variable sequence if {$options(ping) == 0 || ($options(timeout) <= 0)} return if {$options(ping) < 2 && [info exists xmppTransport($xlib)] && \ ($xmppTransport($xlib) == "bosh" || $xmppTransport($xlib) == "poll")} return if {$xlib ni [connections]} return if {$status eq "abort"} return if {$seq < $sequence($xlib)} return if {$status eq "timeout"} { ::xmpp::EndOfFile $xlib return } after [expr {$options(timeout)*1000}] [namespace code [list start $xlib]] } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/iq/time.tcl000064400000000000000000000022771477701321300156150ustar00nobodynobody# time.tcl -- # # This file is a part of the Tkabber XMPP client. It provides the # replies to the jabber:iq:time (XEP-0090) queries. custom::defvar options(reply_iq_time) 1 \ [::msgcat::mc "Reply to current time (jabber:iq:time) requests."] \ -group IQ -type boolean proc iq_time {xlib from child args} { variable options if {!$options(reply_iq_time)} { return {error cancel service-unavailable} } set curtime [clock seconds] set restags \ [list [::xmpp::xml::create utc \ -cdata [clock format $curtime \ -format "%Y%m%dT%T" -gmt true]] \ [::xmpp::xml::create tz \ -cdata [timezone $curtime]] \ [::xmpp::xml::create display \ -cdata [displaytime $curtime]]] set res [::xmpp::xml::create query \ -xmlns jabber:iq:time \ -subelements $restags] list result $res } proc timezone {time} { clock format $time -format %Z } proc displaytime {time} { clock format $time } ::xmpp::iq::register get query jabber:iq:time [namespace current]::iq_time # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/iq/time2.tcl000064400000000000000000000023371477701321300156740ustar00nobodynobody# time2.tcl -- # # This file is a part of the Tkabber XMPP client. It provides the # replies to the Entity Time (XEP-0202) queries. custom::defvar options(reply_xmpp_time) 1 \ [::msgcat::mc "Reply to entity time (urn:xmpp:time) requests."] \ -group IQ -type boolean proc xmpp_time {xlib from child args} { variable options if {!$options(reply_xmpp_time)} { return {error cancel service-unavailable} } set curtime [clock seconds] set restags \ [list [::xmpp::xml::create utc \ -cdata [clock format $curtime \ -format "%Y-%m-%dT%TZ" -gmt true]] \ [::xmpp::xml::create tzo \ -cdata [timezone_offset $curtime]]] set res [::xmpp::xml::create time \ -xmlns urn:xmpp:time \ -subelements $restags] return [list result $res] } proc timezone_offset {curtime} { # Doesn't work with Tcl 8.4 on MS Windows set tz [clock format $curtime -format %z] regsub {[+-]0000} $tz {Z} tz1 regsub {(\d\d)(\d\d)} $tz1 {\1:\2} tz2 return $tz2 } ::xmpp::iq::register get time urn:xmpp:time [namespace current]::xmpp_time # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/iq/version.tcl000064400000000000000000000151301477701321300163340ustar00nobodynobody# version.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # replies to Software Version (XEP-0092) protocol requests. custom::defvar options(reply_iq_version) 1 \ [::msgcat::mc "Reply to version (jabber:iq:version) requests."] \ -group IQ -type boolean custom::defvar options(reply_iq_os_version) 1 \ [::msgcat::mc "Include operating system info into a reply to version\ (jabber:iq:version) requests."] \ -group IQ -type boolean proc try_linux_version {distr file flag} { global linux_distribution if {![file exists $file]} { return } if {![file readable $file]} { set linux_distribution $distr return } set fd [open $file r] set content [read $fd] close $fd set last [string first "\n" $content] if {$last < 0} { set last end } else { set last [expr {$last - 1}] } set line [string range $content 0 $last] switch -- $flag { file { set linux_distribution $line } append { set linux_distribution "$distr $line" } } } # NOTE: lsb_release on Debian Etch is known to dump some complaints to # stderr is some LSB modules are not available, so we rely only on the # existence of lsb_release and its the return code. proc get_lsb_info {} { if {[catch {exec lsb_release -a 2>/dev/null} info]} { return {} } foreach line [split $info \n] { foreach {key val} [split $line :] { set fields([string tolower $key]) [string trim $val] } } set out "" foreach key {description release codename} { if {[info exists fields($key)]} { append out "$fields($key) " } } return [string trim $out] } proc guess_linux_distribution {} { global linux_distribution if {[info exists linux_distribution] && $linux_distribution != {}} { return $linux_distribution } # First, let's see if we're on a LSB-compatible system: set linux_distribution [get_lsb_info] if {$linux_distribution != {}} { return $linux_distribution } foreach {distr file flag} { \ "SuSE Linux" /etc/SuSE-release file \ "Debian GNU/Linux" /etc/debian_version append \ "ASPLinux" /etc/asplinux-release file \ "Alt Linux" /etc/altlinux-release file \ "PLD Linux" /etc/pld-release file \ "Gentoo Linux" /etc/gentoo-release file \ "Mandrake Linux" /etc/mandrake-release file \ "RedHat Linux" /etc/redhat-release file \ "Conectiva Linux" /etc/conectiva-release file \ "Slackware Linux" /etc/slackware-version append \ "Arch Linux" /etc/arch-release file} { try_linux_version $distr $file $flag if {[info exists linux_distribution] && $linux_distribution != {}} { return $linux_distribution } } set linux_distribution Linux return $linux_distribution } proc guess_windows_version {} { global tcl_platform switch -- $tcl_platform(os) { "Win32s" { return {Windows 3.1} } "Windows 95" { switch -- $tcl_platform(osVersion) { 4.0 { return {Windows 95} } 4.10 { return {Windows 98} } 4.90 { return {Windows ME} } default { return [list $tcl_platform(os) $tcl_platform(osVersion)] } } } "Windows NT" { switch -- $tcl_platform(osVersion) { 5.0 { return {Windows 2000} } 5.1 { return {Windows XP} } 5.2 { return {Windows 2003} } 6.0 { return {Windows Vista} } 6.1 { return {Windows 7} } 6.2 { return {Windows 8} } 6.3 { return {Windows 8.1} } 10.0 { return {Windows 10} } default { return [list $tcl_platform(os) $tcl_platform(osVersion)] } } } default { return [list $tcl_platform(os) $tcl_platform(osVersion)] } } } proc iq_version {xlib from child args} { global tkabber_version toolkit_version tcl_platform variable options if {!$options(reply_iq_version)} { return {error cancel service-unavailable} } set restags [list [::xmpp::xml::create name \ -cdata Tkabber] \ [::xmpp::xml::create version \ -cdata "$tkabber_version ($toolkit_version)"]] if {$options(reply_iq_os_version)} { switch -glob -- $tcl_platform(os) { Linux { set os "[guess_linux_distribution] $tcl_platform(osVersion)" } Win* { set os [join [guess_windows_version]] } default { set os "$tcl_platform(os) $tcl_platform(osVersion)" } } lappend restags [::xmpp::xml::create os -cdata $os] } set res [::xmpp::xml::create query \ -xmlns jabber:iq:version \ -subelements $restags] return [list result $res] } ::xmpp::iq::register get query jabber:iq:version \ [namespace current]::iq_version proc disco_extra_version {xlib from lang} { global tkabber_version toolkit_version tcl_platform variable options if {!$options(reply_iq_version)} { return {} } set fields \ [list field [list FORM_TYPE hidden "" {urn:xmpp:dataforms:softwareinfo}] \ field [list software "" "" {Tkabber}] \ field [list software_version "" "" \ [list "$tkabber_version ($toolkit_version)"]]] if {$options(reply_iq_os_version)} { switch -glob -- $tcl_platform(os) { Linux { set os [guess_linux_distribution] set os_version $tcl_platform(osVersion) } Win* { lassign [guess_windows_version] os os_version } default { set os $tcl_platform(os) set os_version $tcl_platform(osVersion) } } lappend fields field [list os "" "" [list $os]] \ field [list os_version "" "" [list $os_version]] } return $fields } hook::add postload_hook \ [list disco::register_extra [namespace current]::disco_extra_version] # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/pep000075500000000000000000000000001477701321300142375ustar00nobodynobodytkabber/plugins/pep/user_activity.tcl000064400000000000000000000615141477701321300177230ustar00nobodynobody# user_activity.tcl -- # # Implementation of XEP-0107 "User activity" package require xmpp::pep namespace eval activity { variable node http://jabber.org/protocol/activity variable substatus variable activity variable options custom::defvar options(auto-subscribe) 0 \ [::msgcat::mc "Auto-subscribe to other's user activity notifications."] \ -command [namespace current]::register_in_disco \ -group PEP -type boolean variable m2d variable d2m array set m2d [list \ doing_chores [::msgcat::mc "doing chores"] \ buying_groceries [::msgcat::mc "buying groceries"] \ cleaning [::msgcat::mc "cleaning"] \ cooking [::msgcat::mc "cooking"] \ doing_maintenance [::msgcat::mc "doing maintenance"] \ doing_the_dishes [::msgcat::mc "doing the dishes"] \ doing_the_laundry [::msgcat::mc "doing the laundry"] \ gardening [::msgcat::mc "gardening"] \ running_an_errand [::msgcat::mc "running an errand"] \ walking_the_dog [::msgcat::mc "walking the dog"] \ drinking [::msgcat::mc "drinking"] \ having_a_beer [::msgcat::mc "having a beer"] \ having_coffee [::msgcat::mc "having coffee"] \ having_tea [::msgcat::mc "having tea"] \ eating [::msgcat::mc "eating"] \ having_a_snack [::msgcat::mc "having a snack"] \ having_breakfast [::msgcat::mc "having breakfast"] \ having_dinner [::msgcat::mc "having dinner"] \ having_lunch [::msgcat::mc "having lunch"] \ exercising [::msgcat::mc "exercising"] \ cycling [::msgcat::mc "cycling"] \ hiking [::msgcat::mc "hiking"] \ jogging [::msgcat::mc "jogging"] \ playing_sports [::msgcat::mc "playing sports"] \ running [::msgcat::mc "running"] \ skiing [::msgcat::mc "skiing"] \ swimming [::msgcat::mc "swimming"] \ working_out [::msgcat::mc "working out"] \ grooming [::msgcat::mc "grooming"] \ at_the_spa [::msgcat::mc "at the spa"] \ brushing_teeth [::msgcat::mc "brushing teeth"] \ getting_a_haircut [::msgcat::mc "getting a haircut"] \ shaving [::msgcat::mc "shaving"] \ taking_a_bath [::msgcat::mc "taking a bath"] \ taking_a_shower [::msgcat::mc "taking a shower"] \ having_appointment [::msgcat::mc "having appointment"] \ inactive [::msgcat::mc "inactive"] \ day_off [::msgcat::mc "day off"] \ hanging_out [::msgcat::mc "hanging out"] \ on_vacation [::msgcat::mc "on vacation"] \ scheduled_holiday [::msgcat::mc "scheduled holiday"] \ sleeping [::msgcat::mc "sleeping"] \ relaxing [::msgcat::mc "relaxing"] \ gaming [::msgcat::mc "gaming"] \ going_out [::msgcat::mc "going out"] \ partying [::msgcat::mc "partying"] \ reading [::msgcat::mc "reading"] \ rehearsing [::msgcat::mc "rehearsing"] \ shopping [::msgcat::mc "shopping"] \ socializing [::msgcat::mc "socializing"] \ sunbathing [::msgcat::mc "sunbathing"] \ watching_tv [::msgcat::mc "watching tv"] \ watching_a_movie [::msgcat::mc "watching a movie"] \ talking [::msgcat::mc "talking"] \ in_real_life [::msgcat::mc "in real life"] \ on_the_phone [::msgcat::mc "on the phone"] \ on_video_phone [::msgcat::mc "on video phone"] \ traveling [::msgcat::mc "traveling"] \ commuting [::msgcat::mc "commuting"] \ cycling [::msgcat::mc "cycling"] \ driving [::msgcat::mc "driving"] \ in_a_car [::msgcat::mc "in a car"] \ on_a_bus [::msgcat::mc "on a bus"] \ on_a_plane [::msgcat::mc "on a plane"] \ on_a_train [::msgcat::mc "on a train"] \ on_a_trip [::msgcat::mc "on a trip"] \ walking [::msgcat::mc "walking"] \ working [::msgcat::mc "working"] \ coding [::msgcat::mc "coding"] \ in_a_meeting [::msgcat::mc "in a meeting"] \ studying [::msgcat::mc "studying"] \ writing [::msgcat::mc "writing"] \ ] variable m foreach m [array names m2d] { set d2m($m2d($m)) $m } variable subtypes array set subtypes [list \ doing_chores \ {buying_groceries cleaning cooking doing_maintenance doing_the_dishes doing_the_laundry gardening running_an_errand walking_the_dog} \ drinking \ {having_a_beer having_coffee having_tea} \ eating \ {having_a_snack having_breakfast having_dinner having_lunch} \ exercising \ {cycling hiking jogging playing_sports running skiing swimming working_out} \ grooming \ {at_the_spa brushing_teeth getting_a_haircut shaving taking_a_bath taking_a_shower} \ having_appointment {} \ inactive \ {day_off hanging_out on_vacation scheduled_holiday sleeping} \ relaxing \ {gaming going_out partying reading rehearsing shopping socializing sunbathing watching_tv watching_a_movie} \ talking \ {in_real_life on_the_phone on_video_phone} \ traveling \ {commuting cycling driving in_a_car on_a_bus on_a_plane on_a_train on_a_trip walking} \ working \ {coding in_a_meeting studying writing} \ ] pubsub::register_event_notification_handler $node \ [namespace current]::process_activity_notification hook::add user_activity_notification_hook \ [namespace current]::notify_via_status_message hook::add finload_hook \ [namespace current]::on_init 60 hook::add connected_hook \ [namespace current]::on_connect_disconnect hook::add disconnected_hook \ [namespace current]::on_connect_disconnect hook::add roster_jid_popup_menu_hook \ [namespace current]::add_roster_pep_menu_item hook::add roster_user_popup_info_hook \ [namespace current]::provide_roster_popup_info hook::add userinfo_hook \ [namespace current]::provide_userinfo disco::register_feature $node } proc activity::register_in_disco {args} { variable options variable node if {$options(auto-subscribe)} { disco::register_feature $node+notify } else { disco::unregister_feature $node+notify } } proc activity::add_roster_pep_menu_item {m xlib jid} { set rjid [roster::find_jid $xlib $jid] if {$rjid == ""} { set rjid [::xmpp::jid::stripResource $jid] } set pm [pep::get_roster_menu_pep_submenu $m $xlib $rjid] set mm [menu $pm.activity -tearoff no] $pm add cascade -menu $mm \ -label [::msgcat::mc "User activity"] $mm add command \ -label [::msgcat::mc "Subscribe"] \ -command [list [namespace current]::subscribe $xlib $rjid] $mm add command \ -label [::msgcat::mc "Unsubscribe"] \ -command [list [namespace current]::unsubscribe $xlib $rjid] hook::run roster_pep_user_activity_menu_hook $mm $xlib $rjid } proc activity::subscribe {xlib jid args} { variable node variable substatus set to [::xmpp::jid::stripResource $jid] set cmd [linsert $args 0 [namespace current]::subscribe_result $xlib $to] ::xmpp::pep::subscribe $xlib $to $node -command $cmd set substatus($xlib,$to) sent-subscribe } proc activity::unsubscribe {xlib jid args} { variable node variable substatus set to [::xmpp::jid::stripResource $jid] set cmd [linsert $args 0 [namespace current]::unsubscribe_result $xlib $to] ::xmpp::pep::unsubscribe $xlib $to $node -command $cmd set substatus($xlib,$to) sent-unsubscribe } # Err may be one of: ok, error and abort proc activity::subscribe_result {xlib jid res child args} { variable substatus set cmd "" foreach {opt val} $args { switch -- $opt { -command { set cmd $val } default { return -code error "unknown option: $opt" } } } switch -- $res { ok { set substatus($xlib,$jid) from } error { set substatus($xlib,$jid) error } default { return } } if {$cmd != ""} { lappend cmd $jid $res $child eval $cmd } } proc activity::unsubscribe_result {xlib jid res child args} { variable substatus variable activity set cmd "" foreach {opt val} $args { switch -- $opt { -command { set cmd $val } default { return -code error "unknown option: $opt" } } } if {[string equal $res ok]} { set substatus($xlib,$jid) none array unset activity *,$jid } if {$cmd != ""} { lappend cmd $jid $res $child eval $cmd } } proc activity::provide_roster_popup_info {var xlib user} { variable substatus variable activity variable m2d upvar 0 $var info set jid [::xmpp::jid::stripResource $user] if {[info exists activity(activity,$xlib,$jid)]} { set m $activity(activity,$xlib,$jid) if {[info exists m2d($m)]} { set status $m2d($m) } else { set status $m debugmsg pubsub "Failed to found description for user activity \"$m\"\ -- discrepancies with XEP-0108?" } set m $activity(subactivity,$xlib,$jid) if {[info exists m2d($m)]} { append status [format " (%s)" $m2d($m)] } elseif {$m != ""} { append status [format " (%s)" $m] debugmsg pubsub "Failed to found description for user subactivity \"$m\"\ -- discrepancies with XEP-0108?" } if {[info exists activity(text,$xlib,$jid)] && $activity(text,$xlib,$jid) != ""} { append status ": " $activity(text,$xlib,$jid) } append info [::msgcat::mc "\n\tActivity: %s" $status] } elseif {[info exists substatus($xlib,$jid)]} { append info [::msgcat::mc "\n\tUser activity subscription: %s" \ $substatus($xlib,$jid)] } else { return } } proc activity::process_activity_notification {xlib jid items} { variable node variable activity set newactivity "" set newsubactivity "" set newtext "" set retract false set parsed false foreach item $items { ::xmpp::xml::split $item tag xmlns attrs cdata subels switch -- $tag { retract { set retract true } default { foreach iactivity $subels { ::xmpp::xml::split $iactivity stag sxmlns sattrs scdata ssubels if {![string equal $stag activity]} continue if {![string equal $sxmlns $node]} continue set parsed true foreach i $ssubels { ::xmpp::xml::split $i sstag ssxmlns ssattrs sscdata sssubels switch -- $sstag { text { set newtext $sscdata } default { set newactivity $sstag foreach i2 $sssubels { ::xmpp::xml::split $i2 s3tag s3xmlns s3attrs s3cdata s3subels set newsubactivity $s3tag } } } } } } } } if {$parsed} { set activity(activity,$xlib,$jid) $newactivity set activity(subactivity,$xlib,$jid) $newsubactivity set activity(text,$xlib,$jid) $newtext hook::run user_activity_notification_hook \ $xlib $jid $newactivity $newsubactivity $newtext } elseif {$retract} { catch {unset activity(activity,$xlib,$jid)} catch {unset activity(subactivity,$xlib,$jid)} catch {unset activity(text,$xlib,$jid)} hook::run user_activity_notification_hook $xlib $jid "" "" "" } } proc activity::notify_via_status_message {xlib jid activity subactivity text} { variable m2d set contact [::roster::itemconfig $xlib $jid -name] if {$contact == ""} { set contact $jid } if {$activity == ""} { set msg [::msgcat::mc "%s's activity is unset" $contact] } elseif {[info exists m2d($activity)]} { set msg [::msgcat::mc "%s's activity changed to %s" $contact $m2d($activity)] if {$text != ""} { append msg ": $text" } } else { set msg [::msgcat::mc "%s's activity changed to %s" $contact $activity] if {$text != ""} { append msg ": $text" } } set_status $msg } proc activity::publish {xlib activity subactivity args} { variable node set text "" set callback "" foreach {opt val} $args { switch -- $opt { -reason { set text $val } -command { set callback $val } } } if {$subactivity == ""} { set content [list [::xmpp::xml::create $activity]] } else { set content [list [::xmpp::xml::create $activity \ -subelement [::xmpp::xml::create \ $subactivity]]] } if {$text != ""} { lappend content [::xmpp::xml::create text -cdata $text] } set cmd [list ::xmpp::pep::publishItem $xlib $node activity \ -payload [list [::xmpp::xml::create activity \ -xmlns $node \ -subelements $content]]] if {$callback != ""} { lappend cmd -command $callback } eval $cmd } proc activity::unpublish {xlib args} { variable node set callback "" foreach {opt val} $args { switch -- $opt { -command { set callback $val } } } set cmd [list ::xmpp::pep::deleteItem $xlib $node activity \ -notify true] if {$callback != ""} { lappend cmd -command $callback } eval $cmd } proc activity::on_init {} { set m [pep::get_main_menu_pep_submenu] set mm [menu $m.activity -tearoff $::ifacetk::options(show_tearoffs)] $m add cascade -menu $mm \ -label [::msgcat::mc "User activity"] $mm add command -label [::msgcat::mc "Publish user activity..."] \ -state disabled \ -command [namespace current]::show_publish_dialog $mm add command -label [::msgcat::mc "Unpublish user activity"] \ -state disabled \ -command [namespace current]::show_unpublish_dialog $mm add checkbutton -label [::msgcat::mc "Auto-subscribe to other's user activity"] \ -variable [namespace current]::options(auto-subscribe) } proc activity::on_connect_disconnect {args} { set mm [pep::get_main_menu_pep_submenu].activity set idx [expr {$::ifacetk::options(show_tearoffs) ? 1 : 0}] switch -- [llength [connections]] { 0 { $mm entryconfigure $idx -state disabled $mm entryconfigure [incr idx] \ -label [::msgcat::mc "Unpublish user activity"] \ -state disabled } 1 { $mm entryconfigure $idx -state normal $mm entryconfigure [incr idx] \ -label [::msgcat::mc "Unpublish user activity"] \ -state normal } default { $mm entryconfigure $idx -state normal $mm entryconfigure [incr idx] \ -label [::msgcat::mc "Unpublish user activity..."] \ -state normal } } } proc activity::show_publish_dialog {} { variable d2m variable activityvalue "" variable subactivityvalue "" variable activityreason "" variable myjid set w .user_activity if {[winfo exists $w]} { destroy $w } set xlibs [connections] if {[llength $xlibs] == 0} { NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "Publishing is only possible\ while being online"] return } Dialog $w -title [::msgcat::mc "User activity"] \ -modal none -anchor e -default 0 -cancel 1 -parent . $w add -text [::msgcat::mc "Publish"] \ -command [list [namespace current]::do_publish $w] $w add -text [::msgcat::mc "Cancel"] -command [list destroy $w] set f [$w getframe] set connjids [list [::msgcat::mc "All"]] foreach xlib $xlibs { lappend connjids [connection_jid $xlib] } set myjid [lindex $connjids 0] Label $f.ccap -text [::msgcat::mc "Use connection:"] Combobox $f.conn -editable false \ -values $connjids \ -textvariable [namespace current]::myjid Label $f.acap -text [::msgcat::mc "Activity:"] Combobox $f.activity -editable false \ -values [lsort [major_activities]] \ -textvariable [namespace current]::activityvalue \ -modifycmd [list [namespace current]::update_combobox $f.sactivity] Label $f.sacap -text [::msgcat::mc "Subactivity:"] Combobox $f.sactivity -editable false \ -values {} \ -textvariable [namespace current]::subactivityvalue Label $f.rcap -text [::msgcat::mc "Reason:"] Entry $f.reason -textvariable [namespace current]::activityreason update_combobox $f.sactivity if {[llength $connjids] > 1} { grid $f.ccap -row 0 -column 0 -sticky e grid $f.conn -row 0 -column 1 -sticky ew } grid $f.acap -row 1 -column 0 -sticky e grid $f.activity -row 1 -column 1 -sticky ew grid $f.sacap -row 2 -column 0 -sticky e grid $f.sactivity -row 2 -column 1 -sticky ew grid $f.rcap -row 3 -column 0 -sticky e grid $f.reason -row 3 -column 1 -sticky ew grid columnconfigure $f 1 -weight 1 $w draw } proc activity::major_activities {} { variable m2d variable subtypes set res {} foreach activity [array names subtypes] { lappend res $m2d($activity) } return $res } proc activity::update_combobox {combo} { variable m2d variable d2m variable subtypes variable activityvalue variable subactivityvalue set subactivityvalue "" set res [list ""] if {[info exists d2m($activityvalue)] && \ [info exists subtypes($d2m($activityvalue))]} { foreach activity $subtypes($d2m($activityvalue)) { lappend res $m2d($activity) } } $combo configure -values $res } proc activity::do_publish {w} { variable d2m variable activityvalue variable subactivityvalue variable activityreason variable myjid if {$activityvalue == ""} { NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "Cannot publish empty activity"] return } if {$subactivityvalue == ""} { set sub "" } else { set sub $d2m($subactivityvalue) } foreach xlib [connections] { if {[string equal $myjid [connection_jid $xlib]] || \ [string equal $myjid [::msgcat::mc "All"]]} { publish $xlib $d2m($activityvalue) $sub \ -reason $activityreason \ -command [namespace current]::publish_result break } } unset activityvalue subactivityvalue activityreason myjid destroy $w } # $res is one of: ok, error, abort proc activity::publish_result {res child} { switch -- $res { error { set error [error_to_string $child] } default { return } } NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "User activity publishing failed: %s" $error] } proc activity::show_unpublish_dialog {} { variable myjid set w .user_activity if {[winfo exists $w]} { destroy $w } set xlibs [connections] if {[llength $xlibs] == 0} { NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "Unpublishing is only possible\ while being online"] return } Dialog $w -title [::msgcat::mc "User activity"] \ -modal none -anchor e -default 0 -cancel 1 -parent . $w add -text [::msgcat::mc "Unpublish"] \ -command [list [namespace current]::do_unpublish $w] $w add -text [::msgcat::mc "Cancel"] -command [list destroy $w] set f [$w getframe] set connjids [list [::msgcat::mc "All"]] foreach xlib $xlibs { lappend connjids [connection_jid $xlib] } set myjid [lindex $connjids 0] Label $f.ccap -text [::msgcat::mc "Use connection:"] Combobox $f.conn -editable false \ -values $connjids \ -textvariable [namespace current]::myjid if {[llength $connjids] > 1} { grid $f.ccap -row 0 -column 0 -sticky e grid $f.conn -row 0 -column 1 -sticky ew } grid columnconfigure $f 1 -weight 1 if {[llength $xlibs] == 1} { do_unpublish $w } else { $w draw } } proc activity::do_unpublish {w} { variable myjid foreach xlib [connections] { if {[string equal $myjid [connection_jid $xlib]] || \ [string equal $myjid [::msgcat::mc "All"]]} { unpublish $xlib \ -command [namespace current]::unpublish_result break } } unset myjid destroy $w } # $res is one of: ok, error, abort proc activity::unpublish_result {res child} { switch -- $res { error { if {[lindex [error_type_condition $child] 1] == "item-not-found"} { return } set error [error_to_string $child] } default { return } } NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "User activity unpublishing failed: %s" $error] } proc activity::provide_userinfo {notebook xlib jid editable} { variable activity variable m2d variable ::userinfo::userinfo if {$editable} return set barejid [::xmpp::jid::stripResource $jid] if {![info exists activity(activity,$xlib,$barejid)]} return if {[string equal $activity(activity,$xlib,$barejid) ""]} return if {[info exists m2d($activity(activity,$xlib,$barejid))]} { set userinfo(activity,$jid) $m2d($activity(activity,$xlib,$barejid)) } else { set userinfo(activity,$jid) $activity(activity,$xlib,$barejid) } if {[info exists m2d($activity(subactivity,$xlib,$barejid))]} { set userinfo(subactivity,$jid) $m2d($activity(subactivity,$xlib,$barejid)) } else { set userinfo(subactivity,$jid) $activity(subactivity,$xlib,$barejid) } if {[info exists activity(text,$xlib,$barejid)]} { set userinfo(activityreason,$jid) $activity(text,$xlib,$barejid) } else { set userinfo(activityreason,$jid) "" } set f [pep::get_userinfo_dialog_pep_frame $notebook] set mf [userinfo::pack_frame $f.activity [::msgcat::mc "User activity"]] userinfo::pack_entry $jid $mf 0 activity [::msgcat::mc "Activity"]: userinfo::pack_entry $jid $mf 1 subactivity [::msgcat::mc "Subactivity"]: userinfo::pack_entry $jid $mf 2 activityreason [::msgcat::mc "Reason"]: } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/pep/user_avatar.tcl000064400000000000000000000542271477701321300173500ustar00nobodynobody# user_avatar.tcl -- # # Implementation of XEP-0084 "User Avatar" if {[catch {package require Img}]} { return } package require sha1 package require base64 package require xmpp::pep namespace eval avatar { variable data_node urn:xmpp:avatar:data variable metadata_node urn:xmpp:avatar:metadata variable substatus variable options custom::defvar options(auto-subscribe) 0 \ [::msgcat::mc "Auto-subscribe to other's user avatar notifications."] \ -command [namespace current]::register_in_disco \ -group PEP -type boolean pubsub::register_event_notification_handler $metadata_node \ [namespace current]::process_avatar_notification hook::add user_avatar_pep_notification_hook \ [namespace current]::notify_via_status_message hook::add finload_hook \ [namespace current]::on_init 60 hook::add connected_hook \ [namespace current]::on_connect_disconnect hook::add disconnected_hook \ [namespace current]::on_connect_disconnect hook::add roster_jid_popup_menu_hook \ [namespace current]::add_roster_pep_menu_item hook::add userinfo_hook \ [namespace current]::provide_userinfo variable cache_dir [file join $::configdir avatar_cache] if {![file isdirectory $cache_dir]} { file mkdir $cache_dir } variable fields {} disco::register_feature $data_node disco::register_feature $metadata_node } proc avatar::register_in_disco {args} { variable options variable metadata_node if {$options(auto-subscribe)} { disco::register_feature $metadata_node+notify } else { disco::unregister_feature $metadata_node+notify } } proc avatar::add_roster_pep_menu_item {m xlib jid} { set rjid [roster::find_jid $xlib $jid] if {$rjid == ""} { set rjid [::xmpp::jid::stripResource $jid] } set pm [pep::get_roster_menu_pep_submenu $m $xlib $rjid] set mm [menu $pm.avatar -tearoff no] $pm add cascade -menu $mm \ -label [::msgcat::mc "User avatar"] $mm add command \ -label [::msgcat::mc "Subscribe"] \ -command [list [namespace current]::subscribe $xlib $rjid] $mm add command \ -label [::msgcat::mc "Unsubscribe"] \ -command [list [namespace current]::unsubscribe $xlib $rjid] hook::run roster_pep_user_avatar_menu_hook $mm $xlib $rjid } proc avatar::subscribe {xlib jid args} { variable metadata_node variable substatus set to [::xmpp::jid::stripResource $jid] set cmd [linsert $args 0 [namespace current]::subscribe_result $xlib $to] ::xmpp::pep::subscribe $xlib $to $metadata_node -command $cmd set substatus($xlib,$to) sent-subscribe } proc avatar::unsubscribe {xlib jid args} { variable metadata_node variable substatus set to [::xmpp::jid::stripResource $jid] set cmd [linsert $args 0 [namespace current]::unsubscribe_result $xlib $to] ::xmpp::pep::unsubscribe $xlib $to $metadata_node -command $cmd set substatus($xlib,$to) sent-unsubscribe } # Err may be one of: ok, error and abort proc avatar::subscribe_result {xlib jid res child args} { variable substatus set cmd "" foreach {opt val} $args { switch -- $opt { -command { set cmd $val } default { return -code error "unknown option: $opt" } } } switch -- $res { ok { set substatus($xlib,$jid) from } error { set substatus($xlib,$jid) error } default { return } } if {$cmd != ""} { lappend cmd $jid $res $child eval $cmd } } proc avatar::unsubscribe_result {xlib jid res child args} { variable substatus variable avatar variable fields set cmd "" foreach {opt val} $args { switch -- $opt { -command { set cmd $val } default { return -code error "unknown option: $opt" } } } if {[string equal $res ok]} { set substatus($xlib,$jid) none foreach f $fields { catch {unset avatar($f,$xlib,$jid)} } } if {$cmd != ""} { lappend cmd $jid $res $child eval $cmd } } proc avatar::process_avatar_notification {xlib jid items} { variable metadata_node variable avatar variable fields foreach f $fields { set $f "" } set retract false set parsed false foreach item $items { ::xmpp::xml::split $item tag xmlns attrs cdata subels switch -- $tag { retract { set retract true } default { foreach iavatar $subels { ::xmpp::xml::split $iavatar stag sxmlns sattrs scdata ssubels if {![string equal $stag avatar]} continue if {![string equal $sxmlns $metadata_node]} continue set parsed true foreach i $ssubels { ::xmpp::xml::split $i sstag ssxmlns ssattrs sscdata sssubels if {$sstag in $fields} { set $sstag $sscdata } } } } } } if {$parsed} { foreach f $fields { set avatar($f,$xlib,$jid) [set $f] } hook::run user_avatar_pep_notification_hook $xlib $jid 1 } elseif {$retract} { foreach f $fields { catch {unset avatar($f,$xlib,$jid)} } hook::run user_avatar_pep_notification_hook $xlib $jid 0 } } proc avatar::notify_via_status_message {xlib jid set} { set contact [::roster::itemconfig $xlib $jid -name] if {$contact == ""} { set contact $jid } if {!$set} { set msg [::msgcat::mc "%s's avatar is unset" $contact] } else { set msg [::msgcat::mc "%s's avatar is set" $contact] } set_status $msg } proc avatar::publish_data {xlib image args} { variable data_node variable cache_dir set callbacks {} foreach {opt val} $args { switch -- $opt { -command { set callbacks [list $val] } } } set data [$image data -format png] # Calculate SHA-1 hash (for new filename and item id) set hash [sha1::sha1 $data] set fd [open [file join $cache_dir $hash.png] wb] puts -nonewline $fd $data close $fd set cmd [list ::xmpp::pep::publishItem $xlib $data_node $hash \ -payload [list [::xmpp::xml::create data \ -xmlns $data_node \ -cdata [base64::encode $data]]]] if {[llength $callbacks] > 0} { lappend cmd -command [linsert [lindex $callbacks 0] end $hash] } eval $cmd return $hash } proc avatar::publish_metadata {xlib id args} { variable metadata_node variable cache_dir set callbacks {} foreach {opt val} $args { switch -- $opt { -command { set callbacks [list $val] } } } set filename [file join $cache_dir $id.png] if {![file exists $filename]} { return -code error "File $filename doesn't exist" } set size [file size $filename] set cmd [list ::xmpp::pep::publishItem $xlib $metadata_node $id \ -payload [list [::xmpp::xml::create metadata \ -xmlns $metadata_node \ -subelement [::xmpp::xml::create info \ -attrs [list bytes $size \ id $id \ type image/png]]]]] if {[llength $callbacks] > 0} { lappend cmd -command [lindex $callbacks 0] } eval $cmd } proc avatar::disable_metadata {xlib args} { variable metadata_node set callbacks {} foreach {opt val} $args { switch -- $opt { -command { set callbacks [list $val] } } } set cmd [list ::xmpp::pep::publishItem $xlib $metadata_node stop \ -payload [list [::xmpp::xml::create metadata \ -xmlns $metadata_node]]] if {[llength $callbacks] > 0} { lappend cmd -command [lindex $callbacks 0] } eval $cmd } proc avatar::unpublish_data {xlib id args} { variable data_node set callbacks {} foreach {opt val} $args { switch -- $opt { -command { set callbacks [list $val] } } } set cmd [list ::xmpp::pep::deleteItem $xlib $data_node $id \ -notify false] if {[llength $callbacks] > 0} { lappend cmd -command [lindex $callbacks 0] } eval $cmd } proc avatar::unpublish_metadata {xlib id args} { variable metadata_node set callbacks {} foreach {opt val} $args { switch -- $opt { -command { set callbacks [list $val] } } } set cmd [list ::xmpp::pep::deleteItem $xlib $metadata_node $id \ -notify true] if {[llength $callbacks] > 0} { lappend cmd -command [lindex $callbacks 0] } eval $cmd } proc avatar::on_init {} { set m [pep::get_main_menu_pep_submenu] set mm [menu $m.avatar -tearoff $::ifacetk::options(show_tearoffs)] $m add cascade -menu $mm \ -label [::msgcat::mc "User avatar"] $mm add command -label [::msgcat::mc "Upload or publish user avatar..."] \ -state disabled \ -command [namespace current]::show_upload_dialog $mm add command -label [::msgcat::mc "Unpublish user avatar..."] \ -state disabled \ -command [namespace current]::show_unpublish_dialog $mm add checkbutton -label [::msgcat::mc "Auto-subscribe to other's user avatar"] \ -variable [namespace current]::options(auto-subscribe) } proc avatar::on_connect_disconnect {args} { set mm [pep::get_main_menu_pep_submenu].avatar set idx [expr {$::ifacetk::options(show_tearoffs)? 1 : 0}] switch -- [llength [connections]] { 0 { $mm entryconfigure $idx -state disabled $mm entryconfigure [incr idx] -state disabled } default { $mm entryconfigure $idx -state normal $mm entryconfigure [incr idx] -state normal } } } proc avatar::show_upload_dialog {} { variable myjid set w .user_avatar if {[winfo exists $w]} { destroy $w } set xlibs [connections] if {[llength $xlibs] == 0} { NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "Publishing is only possible\ while being online"] return } Dialog $w -title [::msgcat::mc "User avatar"] \ -modal none -anchor e -default 0 -cancel 1 set f [$w getframe] $w add -text [::msgcat::mc "Upload and publish"] \ -command [list [namespace current]::do_upload $w $f \ [namespace current]::publish_result] $w add -text [::msgcat::mc "Upload"] \ -command [list [namespace current]::do_upload $w $f \ [namespace current]::upload_result] $w add -text [::msgcat::mc "Cancel"] -command [list destroy $w] set connjids [list [::msgcat::mc "All"]] foreach xlib $xlibs { lappend connjids [connection_jid $xlib] } set myjid [lindex $connjids 0] Label $f.ccap -text [::msgcat::mc "Use connection:"] Combobox $f.conn -editable false \ -values $connjids \ -textvariable [namespace current]::myjid if {[llength $connjids] > 2} { grid $f.ccap -row 0 -column 0 -sticky e grid $f.conn -row 0 -column 1 -sticky ew } set preview [create_preview $f] set options [create_options $f] set loptions [Label $f.ldir -text [::msgcat::mc "Directory:"]] set list [create_listbox $f] grid $loptions -row 1 -column 0 -sticky e grid $options -row 1 -column 1 -columnspan 2 -sticky w grid $list -row 2 -column 0 -columnspan 2 -sticky nswe grid $preview -row 2 -column 2 grid columnconfigure $f 1 -weight 1 grid columnconfigure $f 2 -minsize [winfo pixels $f 4c] grid rowconfigure $f 2 -minsize [winfo pixels $f 4c] -weight 1 $w draw } proc avatar::do_upload {w f command} { variable myjid set img avatar:img:$f if {[catch {image height $img}]} { destroy $w NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "User avatar image is not selected"] return } foreach xlib [connections] { if {[string equal $myjid [connection_jid $xlib]] || \ [string equal $myjid [::msgcat::mc "All"]]} { publish_data $xlib $img -command [list $command $xlib $img] break } } unset myjid destroy $w } # $res is one of: ok, error, abort proc avatar::publish_result {xlib img hash res child} { switch -- $res { error { set error [error_to_string $child] } default { publish_metadata $xlib $hash \ -command [namespace current]::publish2_result return } } NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "User avatar uploading failed: %s" $error] } # $res is one of: ok, error, abort proc avatar::publish2_result {res child} { switch -- $res { error { set error [error_to_string $child] } default { return } } NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "User avatar publishing failed: %s" $error] } # $res is one of: ok, error, abort proc avatar::upload_result {xlib img hash res child} { switch -- $res { error { set error [error_to_string $child] } default { return } } NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "User avatar uploading failed: %s" $error] } proc avatar::show_disabled_dialog {} { variable myjid set w .user_avatar if {[winfo exists $w]} { destroy $w } set xlibs [connections] if {[llength $xlibs] == 0} { NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "Disabling avatar is only possible\ while being online"] return } Dialog $w -title [::msgcat::mc "User avatar"] \ -modal none -anchor e -default 0 -cancel 1 $w add -text [::msgcat::mc "Disable"] \ -command [list [namespace current]::do_disable $w] $w add -text [::msgcat::mc "Cancel"] -command [list destroy $w] set f [$w getframe] set connjids [list [::msgcat::mc "All"]] foreach xlib $xlibs { lappend connjids [connection_jid $xlib] } set myjid [lindex $connjids 0] Label $f.ccap -text [::msgcat::mc "Use connection:"] Combobox $f.conn -editable false \ -values $connjids \ -textvariable [namespace current]::myjid if {[llength $connjids] > 2} { grid $f.ccap -row 0 -column 0 -sticky e grid $f.conn -row 0 -column 1 -sticky ew } grid columnconfigure $f 1 -weight 1 if {[llength $xlibs] == 1} { do_disable $w } else { $w draw } } proc avatar::do_disable {w} { variable myjid foreach xlib [connections] { if {[string equal $myjid [connection_jid $xlib]] || \ [string equal $myjid [::msgcat::mc "All"]]} { disable_metadata $xlib \ -command [namespace current]::disable_result break } } unset myjid destroy $w } # $res is one of: ok, error, abort proc avatar::disable_result {res child} { switch -- $res { error { if {[lindex [error_type_condition $child] 1] == "item-not-found"} { return } set error [error_to_string $child] } default { return } } NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "Disabling user avatar failed: %s" $error] } proc avatar::provide_userinfo {notebook xlib jid editable} { variable avatar variable m2d variable ::userinfo::userinfo variable fields variable labels if {$editable} return set barejid [::xmpp::jid::stripResource $jid] if {![info exists avatar(alt,$xlib,$barejid)]} return foreach ff $fields { set userinfo(avatar$ff,$jid) $avatar($ff,$xlib,$barejid) } set f [pep::get_userinfo_dialog_pep_frame $notebook] set mf [userinfo::pack_frame $f.avatar [::msgcat::mc "User avatar"]] set row 0 foreach ff $fields { userinfo::pack_entry $jid $mf $row avatar$ff $labels($ff) incr row } } proc avatar::create_options {path} { variable dirmenu if {![info exists dir($path)]} { set dir($path) [pwd] } set dirmenu($path) \ [tk_optionMenu $path.dir [namespace current]::dir($path) $dir($path)] return $path.dir } proc avatar::change_dir {path list1 list2 args} { variable dir variable dirmenu $dirmenu($path) delete 0 end set volumes [file volumes] set dir($path) [file normalize $dir($path)] set dirlist [file split $dir($path)] set d [lindex $dirlist 0] foreach v $volumes { $dirmenu($path) add command -label $v \ -command [list set [namespace current]::dir($path) $v] if {$v eq $d} { foreach p [lrange $dirlist 1 end] { set d [file join $d $p] $dirmenu($path) add command -label $d \ -command [list set [namespace current]::dir($path) $d] } } } fill_listbox $path $list1 $list2 } proc avatar::create_preview {path} { return [Frame $path.preview] } proc avatar::create_listbox {path} { variable dir set f [Frame $path.f] set sw1 [ScrolledWindow $path.sw1 -scrollbar vertical \ -auto none] set list1 [Listbox $sw1.dirs] $sw1 setwidget $list1 set sw2 [ScrolledWindow $path.sw2 -scrollbar vertical \ -auto none] set list2 [Listbox $sw2.images] $sw2 setwidget $list2 grid $sw1 -row 0 -column 0 -in $f -sticky nswe grid $sw2 -row 0 -column 1 -in $f -sticky nswe grid columnconfigure $f 0 -weight 1 grid columnconfigure $f 1 -weight 1 grid rowconfigure $f 0 -weight 1 change_dir $path $list1 $list2 trace add variable [namespace current]::dir($path) write \ [list [namespace current]::change_dir $path $list1 $list2] bind $list1 [double% [list trace remove variable [namespace current]::dir($path) write \ [list [namespace current]::change_dir $path $list1 $list2]]] bind $list1 <> [double% [list [namespace current]::select_dir $path $list1]] bind $list2 <> [double% [list [namespace current]::select_image $path $list2]] return $f } proc avatar::fill_listbox {path list1 list2} { variable dir set directory $dir($path) $list1 delete 0 end $list2 delete 0 end $list1 insert end .. foreach f [lsort -dictionary [glob -nocomplain \ -tails \ -directory $directory \ -types {d} \ *]] { $list1 insert end $f } foreach f [lsort -dictionary [glob -nocomplain \ -tails \ -directory $directory \ -types {f l} \ *.gif *.png *.jpg *.jpeg \ *.bmp *.pcx]] { $list2 insert end $f } } proc avatar::select_dir {path list} { variable dir set selected [$list curselection] if {[llength $selected] == 0} return $list selection clear 0 end set name [$list get [lindex $selected 0]] set dir($path) [file join $dir($path) $name] } proc avatar::select_image {path list} { set selected [$list curselection] if {[llength $selected] == 0} return set name [$list get [lindex $selected 0]] after idle [list [namespace current]::preview $path $name] } proc avatar::preview {path name} { variable dir set directory $dir($path) set tmp avatar:tmp:$path set img avatar:img:$path set preview avatar:preview:$path set l $path.preview.img catch { destroy $l } catch { image delete $img } catch { image delete $tmp } if {[catch { image create photo $tmp -file [file join $directory $name] }]} { return } image create photo $img $img blank image create photo $preview $preview blank set args {} if {[set w [image width $tmp]] > 128} { set x1 [expr {($w - 128)/2}] set x2 [expr {$x1 + 128}] } else { set x1 0 set x2 $w } if {[set h [image height $tmp]] > 128} { set y1 [expr {($h - 128)/2}] set y2 [expr {$y1 + 128}] } else { set y1 0 set y2 $h } $img copy $tmp -from $x1 $y1 $x2 $y2 $preview copy $tmp -from $x1 $y1 $x2 $y2 -zoom $::icons_scale $::icons_scale image delete $tmp Label $l -image $preview -borderwidth 0 pack $l } # vim:ts=8:sw=4:sts=4:et tkabber/plugins/pep/user_location.tcl000064400000000000000000000410531477701321300176730ustar00nobodynobody# user_location.tcl -- # # Implementation of XEP-0080 "User Location" package require xmpp::pep namespace eval geoloc { variable node http://jabber.org/protocol/geoloc variable substatus variable geoloc custom::defvar options(auto-subscribe) 0 \ [::msgcat::mc "Auto-subscribe to other's user location notifications."] \ -command [namespace current]::register_in_disco \ -group PEP -type boolean pubsub::register_event_notification_handler $node \ [namespace current]::process_geoloc_notification hook::add user_geoloc_notification_hook \ [namespace current]::notify_via_status_message hook::add finload_hook \ [namespace current]::on_init 60 hook::add connected_hook \ [namespace current]::on_connect_disconnect hook::add disconnected_hook \ [namespace current]::on_connect_disconnect hook::add roster_jid_popup_menu_hook \ [namespace current]::add_roster_pep_menu_item hook::add roster_user_popup_info_hook \ [namespace current]::provide_roster_popup_info hook::add userinfo_hook \ [namespace current]::provide_userinfo disco::register_feature $node variable fields [list alt area bearing building country datum \ description error floor lat locality lon \ postalcode region room speed street text \ timestamp uri] variable labels array set labels [list alt [::msgcat::mc "Altitude:"] \ area [::msgcat::mc "Area:"] \ bearing [::msgcat::mc "Bearing:"] \ building [::msgcat::mc "Building:"] \ country [::msgcat::mc "Country:"] \ datum [::msgcat::mc "GPS datum:"] \ description [::msgcat::mc "Description:"] \ error [::msgcat::mc "Horizontal GPS error:"] \ floor [::msgcat::mc "Floor:"] \ lat [::msgcat::mc "Latitude:"] \ locality [::msgcat::mc "Locality:"] \ lon [::msgcat::mc "Longitude:"] \ postalcode [::msgcat::mc "Postal code:"] \ region [::msgcat::mc "Region:"] \ room [::msgcat::mc "Room:"] \ speed [::msgcat::mc "Speed:"] \ street [::msgcat::mc "Street:"] \ text [::msgcat::mc "Text:"] \ timestamp [::msgcat::mc "Timestamp:"] \ uri [::msgcat::mc "URI:"]] } proc geoloc::register_in_disco {args} { variable options variable node if {$options(auto-subscribe)} { disco::register_feature $node+notify } else { disco::unregister_feature $node+notify } } proc geoloc::add_roster_pep_menu_item {m xlib jid} { set rjid [roster::find_jid $xlib $jid] if {$rjid == ""} { set rjid [::xmpp::jid::stripResource $jid] } set pm [pep::get_roster_menu_pep_submenu $m $xlib $rjid] set mm [menu $pm.geoloc -tearoff no] $pm add cascade -menu $mm \ -label [::msgcat::mc "User location"] $mm add command \ -label [::msgcat::mc "Subscribe"] \ -command [list [namespace current]::subscribe $xlib $rjid] $mm add command \ -label [::msgcat::mc "Unsubscribe"] \ -command [list [namespace current]::unsubscribe $xlib $rjid] hook::run roster_pep_user_geoloc_menu_hook $mm $xlib $rjid } proc geoloc::subscribe {xlib jid args} { variable node variable substatus set to [::xmpp::jid::stripResource $jid] set cmd [linsert $args 0 [namespace current]::subscribe_result $xlib $to] ::xmpp::pep::subscribe $xlib $to $node -command $cmd set substatus($xlib,$to) sent-subscribe } proc geoloc::unsubscribe {xlib jid args} { variable node variable substatus set to [::xmpp::jid::stripResource $jid] set cmd [linsert $args 0 [namespace current]::unsubscribe_result $xlib $to] ::xmpp::pep::unsubscribe $xlib $to $node -command $cmd set substatus($xlib,$to) sent-unsubscribe } # Err may be one of: ok, error and abort proc geoloc::subscribe_result {xlib jid res child args} { variable substatus set cmd "" foreach {opt val} $args { switch -- $opt { -command { set cmd $val } default { return -code error "unknown option: $opt" } } } switch -- $res { ok { set substatus($xlib,$jid) from } error { set substatus($xlib,$jid) error } default { return } } if {$cmd != ""} { lappend cmd $jid $res $child eval $cmd } } proc geoloc::unsubscribe_result {xlib jid res child args} { variable substatus variable geoloc variable fields set cmd "" foreach {opt val} $args { switch -- $opt { -command { set cmd $val } default { return -code error "unknown option: $opt" } } } if {[string equal $res ok]} { set substatus($xlib,$jid) none foreach f $fields { catch {unset geoloc($f,$xlib,$jid)} } } if {$cmd != ""} { lappend cmd $jid $res $child eval $cmd } } proc geoloc::provide_roster_popup_info {var xlib user} { variable substatus variable geoloc upvar 0 $var info set jid [::xmpp::jid::stripResource $user] if {[info exists geoloc(title,$xlib,$jid)]} { append info [::msgcat::mc "\n\tLocation: %s : %s" \ $geoloc(lat,$xlib,$jid) \ $geoloc(lon,$xlib,$jid)] } elseif {[info exists substatus($xlib,$jid)]} { append info [::msgcat::mc "\n\tUser location subscription: %s" \ $substatus($xlib,$jid)] } else { return } } proc geoloc::process_geoloc_notification {xlib jid items} { variable node variable geoloc variable fields foreach f $fields { set $f "" } set retract false set parsed false foreach item $items { ::xmpp::xml::split $item tag xmlns attrs cdata subels switch -- $tag { retract { set retract true } default { foreach igeoloc $subels { ::xmpp::xml::split $igeoloc stag sxmlns sattrs scdata ssubels if {![string equal $stag geoloc]} continue if {![string equal $sxmlns $node]} continue set parsed true foreach i $ssubels { ::xmpp::xml::split $i sstag ssxmlns ssattrs sscdata sssubels if {$sstag in $fields} { set $sstag $sscdata } } } } } } if {$parsed} { foreach f $fields { set geoloc($f,$xlib,$jid) [set $f] } hook::run user_geoloc_notification_hook $xlib $jid $lat $lon } elseif {$retract} { foreach f $fields { catch {unset geoloc($f,$xlib,$jid)} } hook::run user_geoloc_notification_hook $xlib $jid "" "" } } proc geoloc::notify_via_status_message {xlib jid lat lon} { set contact [::roster::itemconfig $xlib $jid -name] if {$contact == ""} { set contact $jid } if {$lat == "" && $lon == ""} { set msg [::msgcat::mc "%s's location is unset" $contact] } else { set msg [::msgcat::mc "%s's location changed to %s : %s" \ $contact $lat $lon] } set_status $msg } proc geoloc::publish {xlib args} { variable node variable fields foreach f $fields { set $f "" } set callback "" foreach {opt val} $args { switch -- $opt { -command { set callback $val } default { set opt [string trimleft $opt -] if {$opt in $fields} { set $opt $val } } } } set content {} foreach f $fields { if {[set $f] != ""} { lappend content [::xmpp::xml::create $f -cdata [set $f]] } } set cmd [list ::xmpp::pep::publishItem $xlib $node geoloc \ -payload [list [::xmpp::xml::create geoloc \ -xmlns $node \ -subelements $content]]] if {$callback != ""} { lappend cmd -command $callback } eval $cmd } proc geoloc::unpublish {xlib args} { variable node set callback "" foreach {opt val} $args { switch -- $opt { -command { set callback $val } } } set cmd [list ::xmpp::pep::deleteItem $xlib $node geoloc \ -notify true] if {$callback != ""} { lappend cmd -command $callback } eval $cmd } proc geoloc::on_init {} { set m [pep::get_main_menu_pep_submenu] set mm [menu $m.geoloc -tearoff $::ifacetk::options(show_tearoffs)] $m add cascade -menu $mm \ -label [::msgcat::mc "User location"] $mm add command -label [::msgcat::mc "Publish user location..."] \ -state disabled \ -command [namespace current]::show_publish_dialog $mm add command -label [::msgcat::mc "Unpublish user location"] \ -state disabled \ -command [namespace current]::show_unpublish_dialog $mm add checkbutton -label [::msgcat::mc "Auto-subscribe to other's user location"] \ -variable [namespace current]::options(auto-subscribe) } proc geoloc::on_connect_disconnect {args} { set mm [pep::get_main_menu_pep_submenu].geoloc set idx [expr {$::ifacetk::options(show_tearoffs) ? 1 : 0}] switch -- [llength [connections]] { 0 { $mm entryconfigure $idx -state disabled $mm entryconfigure [incr idx] \ -label [::msgcat::mc "Unpublish user location"] \ -state disabled } 1 { $mm entryconfigure $idx -state normal $mm entryconfigure [incr idx] \ -label [::msgcat::mc "Unpublish user location"] \ -state normal } default { $mm entryconfigure $idx -state normal $mm entryconfigure [incr idx] \ -label [::msgcat::mc "Unpublish user location..."] \ -state normal } } } proc geoloc::show_publish_dialog {} { variable fields variable labels variable myjid foreach ff $fields { variable geoloc$ff "" } set w .user_geoloc if {[winfo exists $w]} { destroy $w } set xlibs [connections] if {[llength $xlibs] == 0} { NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "Publishing is only possible\ while being online"] return } Dialog $w -title [::msgcat::mc "User location"] \ -modal none -anchor e -default 0 -cancel 1 -parent . $w add -text [::msgcat::mc "Publish"] \ -command [list [namespace current]::do_publish $w] $w add -text [::msgcat::mc "Cancel"] -command [list destroy $w] set f [$w getframe] set connjids [list [::msgcat::mc "All"]] foreach xlib $xlibs { lappend connjids [connection_jid $xlib] } set myjid [lindex $connjids 0] Label $f.ccap -text [::msgcat::mc "Use connection:"] Combobox $f.conn -editable false \ -values $connjids \ -textvariable [namespace current]::myjid if {[llength $connjids] > 1} { grid $f.ccap -row 0 -column 0 -sticky e grid $f.conn -row 0 -column 1 -sticky ew } set row 1 foreach ff $fields { Label $f.l$ff -text $labels($ff) Entry $f.$ff -textvariable [namespace current]::geoloc$ff grid $f.l$ff -row $row -column 0 -sticky e grid $f.$ff -row $row -column 1 -sticky ew incr row } grid columnconfigure $f 1 -weight 1 $w draw } proc geoloc::do_publish {w} { variable fields variable myjid foreach ff $fields { variable geoloc$ff } set args {} foreach ff $fields { lappend args -$ff [set geoloc$ff] } foreach xlib [connections] { if {[string equal $myjid [connection_jid $xlib]] || \ [string equal $myjid [::msgcat::mc "All"]]} { eval [list publish $xlib \ -command [namespace current]::publish_result] \ $args break } } foreach ff $fields { unset geoloc$ff } unset myjid destroy $w } # $res is one of: ok, err, abort proc geoloc::publish_result {res child} { switch -- $res { error { set error [error_to_string $child] } default { return } } NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "User location publishing failed: %s" $error] } proc geoloc::show_unpublish_dialog {} { variable myjid set w .user_geoloc if {[winfo exists $w]} { destroy $w } set xlibs [connections] if {[llength $xlibs] == 0} { NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "Unpublishing is only possible\ while being online"] return } Dialog $w -title [::msgcat::mc "User location"] \ -modal none -anchor e -default 0 -cancel 1 -parent . $w add -text [::msgcat::mc "Unpublish"] \ -command [list [namespace current]::do_unpublish $w] $w add -text [::msgcat::mc "Cancel"] -command [list destroy $w] set f [$w getframe] set connjids [list [::msgcat::mc "All"]] foreach xlib $xlibs { lappend connjids [connection_jid $xlib] } set myjid [lindex $connjids 0] Label $f.ccap -text [::msgcat::mc "Use connection:"] Combobox $f.conn -editable false \ -values $connjids \ -textvariable [namespace current]::myjid if {[llength $connjids] > 1} { grid $f.ccap -row 0 -column 0 -sticky e grid $f.conn -row 0 -column 1 -sticky ew } grid columnconfigure $f 1 -weight 1 if {[llength $xlibs] == 1} { do_unpublish $w } else { $w draw } } proc geoloc::do_unpublish {w} { variable myjid foreach xlib [connections] { if {[string equal $myjid [connection_jid $xlib]] || \ [string equal $myjid [::msgcat::mc "All"]]} { unpublish $xlib \ -command [namespace current]::unpublish_result break } } unset myjid destroy $w } # $res is one of: ok, error, abort proc geoloc::unpublish_result {res child} { switch -- $res { error { if {[lindex [error_type_condition $child] 1] == "item-not-found"} { return } set error [error_to_string $child] } default { return } } NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "User location unpublishing failed: %s" $error] } proc geoloc::provide_userinfo {notebook xlib jid editable} { variable geoloc variable m2d variable ::userinfo::userinfo variable fields variable labels if {$editable} return set barejid [::xmpp::jid::stripResource $jid] if {![info exists geoloc(alt,$xlib,$barejid)]} return foreach ff $fields { set userinfo(geoloc$ff,$jid) $geoloc($ff,$xlib,$barejid) } set f [pep::get_userinfo_dialog_pep_frame $notebook] set mf [userinfo::pack_frame $f.geoloc [::msgcat::mc "User location"]] set row 0 foreach ff $fields { userinfo::pack_entry $jid $mf $row geoloc$ff $labels($ff) incr row } } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/pep/user_mood.tcl000064400000000000000000000457761477701321300170410ustar00nobodynobody# user_mood.tcl -- # # Implementation of XEP-0107 "User mood" # Based on Version 1.1 (2007-06-04). package require xmpp::pep namespace eval mood { variable node http://jabber.org/protocol/mood variable substatus variable mood variable options custom::defvar options(auto-subscribe) 0 \ [::msgcat::mc "Auto-subscribe to other's user mood notifications."] \ -command [namespace current]::register_in_disco \ -group PEP -type boolean variable m2d variable d2m array set m2d [list \ afraid [::msgcat::mc "afraid"] \ amazed [::msgcat::mc "amazed"] \ angry [::msgcat::mc "angry"] \ annoyed [::msgcat::mc "annoyed"] \ anxious [::msgcat::mc "anxious"] \ aroused [::msgcat::mc "aroused"] \ ashamed [::msgcat::mc "ashamed"] \ bored [::msgcat::mc "bored"] \ brave [::msgcat::mc "brave"] \ calm [::msgcat::mc "calm"] \ cold [::msgcat::mc "cold"] \ confused [::msgcat::mc "confused"] \ contented [::msgcat::mc "contented"] \ cranky [::msgcat::mc "cranky"] \ curious [::msgcat::mc "curious"] \ depressed [::msgcat::mc "depressed"] \ disappointed [::msgcat::mc "disappointed"] \ disgusted [::msgcat::mc "disgusted"] \ distracted [::msgcat::mc "distracted"] \ embarrassed [::msgcat::mc "embarrassed"] \ excited [::msgcat::mc "excited"] \ flirtatious [::msgcat::mc "flirtatious"] \ frustrated [::msgcat::mc "frustrated"] \ grumpy [::msgcat::mc "grumpy"] \ guilty [::msgcat::mc "guilty"] \ happy [::msgcat::mc "happy"] \ hot [::msgcat::mc "hot"] \ humbled [::msgcat::mc "humbled"] \ humiliated [::msgcat::mc "humiliated"] \ hungry [::msgcat::mc "hungry"] \ hurt [::msgcat::mc "hurt"] \ impressed [::msgcat::mc "impressed"] \ in_awe [::msgcat::mc "in_awe"] \ in_love [::msgcat::mc "in_love"] \ indignant [::msgcat::mc "indignant"] \ interested [::msgcat::mc "interested"] \ intoxicated [::msgcat::mc "intoxicated"] \ invincible [::msgcat::mc "invincible"] \ jealous [::msgcat::mc "jealous"] \ lonely [::msgcat::mc "lonely"] \ mean [::msgcat::mc "mean"] \ moody [::msgcat::mc "moody"] \ nervous [::msgcat::mc "nervous"] \ neutral [::msgcat::mc "neutral"] \ offended [::msgcat::mc "offended"] \ playful [::msgcat::mc "playful"] \ proud [::msgcat::mc "proud"] \ relieved [::msgcat::mc "relieved"] \ remorseful [::msgcat::mc "remorseful"] \ restless [::msgcat::mc "restless"] \ sad [::msgcat::mc "sad"] \ sarcastic [::msgcat::mc "sarcastic"] \ serious [::msgcat::mc "serious"] \ shocked [::msgcat::mc "shocked"] \ shy [::msgcat::mc "shy"] \ sick [::msgcat::mc "sick"] \ sleepy [::msgcat::mc "sleepy"] \ stressed [::msgcat::mc "stressed"] \ surprised [::msgcat::mc "surprised"] \ thirsty [::msgcat::mc "thirsty"] \ worried [::msgcat::mc "worried"] \ ] variable m foreach m [array names m2d] { set d2m($m2d($m)) $m } pubsub::register_event_notification_handler $node \ [namespace current]::process_mood_notification hook::add user_mood_notification_hook \ [namespace current]::notify_via_status_message hook::add finload_hook \ [namespace current]::on_init 60 hook::add connected_hook \ [namespace current]::on_connect_disconnect hook::add disconnected_hook \ [namespace current]::on_connect_disconnect hook::add roster_jid_popup_menu_hook \ [namespace current]::add_roster_pep_menu_item hook::add roster_user_popup_info_hook \ [namespace current]::provide_roster_popup_info hook::add userinfo_hook \ [namespace current]::provide_userinfo disco::register_feature $node } proc mood::register_in_disco {args} { variable options variable node if {$options(auto-subscribe)} { disco::register_feature $node+notify } else { disco::unregister_feature $node+notify } } proc mood::add_roster_pep_menu_item {m xlib jid} { set rjid [roster::find_jid $xlib $jid] if {$rjid == ""} { set rjid [::xmpp::jid::stripResource $jid] } set pm [pep::get_roster_menu_pep_submenu $m $xlib $rjid] set mm [menu $pm.mood -tearoff no] $pm add cascade -menu $mm \ -label [::msgcat::mc "User mood"] $mm add command \ -label [::msgcat::mc "Subscribe"] \ -command [list [namespace current]::subscribe $xlib $rjid] $mm add command \ -label [::msgcat::mc "Unsubscribe"] \ -command [list [namespace current]::unsubscribe $xlib $rjid] hook::run roster_pep_user_mood_menu_hook $mm $xlib $rjid } proc mood::subscribe {xlib jid args} { variable node variable substatus set to [::xmpp::jid::stripResource $jid] set cmd [linsert $args 0 [namespace current]::subscribe_result $xlib $to] ::xmpp::pep::subscribe $xlib $to $node -command $cmd set substatus($xlib,$to) sent-subscribe } proc mood::unsubscribe {xlib jid args} { variable node variable substatus set to [::xmpp::jid::stripResource $jid] set cmd [linsert $args 0 [namespace current]::unsubscribe_result $xlib $to] ::xmpp::pep::unsubscribe $xlib $to $node -command $cmd set substatus($xlib,$to) sent-unsubscribe } # Err may be one of: ok, error and abort proc mood::subscribe_result {xlib jid res child args} { variable substatus set cmd "" foreach {opt val} $args { switch -- $opt { -command { set cmd $val } default { return -code error "unknown option: $opt" } } } switch -- $res { ok { set substatus($xlib,$jid) from } error { set substatus($xlib,$jid) error } default { return } } if {$cmd != ""} { lappend cmd $jid $res $child eval $cmd } } proc mood::unsubscribe_result {xlib jid res child args} { variable substatus variable mood set cmd "" foreach {opt val} $args { switch -- $opt { -command { set cmd $val } default { return -code error "unknown option: $opt" } } } if {[string equal $res ok]} { set substatus($xlib,$jid) none catch {unset mood(mood,$xlib,$jid)} catch {unset mood(text,$xlib,$jid)} } if {$cmd != ""} { lappend cmd $jid $res $child eval $cmd } } proc mood::provide_roster_popup_info {var xlib user} { variable substatus variable mood variable m2d upvar 0 $var info set jid [::xmpp::jid::stripResource $user] if {[info exists mood(mood,$xlib,$jid)]} { set m $mood(mood,$xlib,$jid) if {[info exists m2d($m)]} { set status $m2d($m) } else { set status $m debugmsg pubsub "Failed to found description for user mood \"$m\"\ -- discrepancies with XEP-0107?" } if {[info exists mood(text,$xlib,$jid)] && $mood(text,$xlib,$jid) != ""} { append status ": " $mood(text,$xlib,$jid) } append info [::msgcat::mc "\n\tMood: %s" $status] } elseif {[info exists substatus($xlib,$jid)]} { append info [::msgcat::mc "\n\tUser mood subscription: %s" \ $substatus($xlib,$jid)] } else { return } } proc mood::process_mood_notification {xlib jid items} { variable node variable mood set newmood "" set newtext "" set retract false set parsed false foreach item $items { ::xmpp::xml::split $item tag xmlns attrs cdata subels switch -- $tag { retract { set retract true } default { foreach imood $subels { ::xmpp::xml::split $imood stag sxmlns sattrs scdata ssubels if {![string equal $stag mood]} continue if {![string equal $sxmlns $node]} continue set parsed true foreach i $ssubels { ::xmpp::xml::split $i sstag ssxmlns ssattrs sscdata sssubels switch -- $sstag { text { set newtext $sscdata } default { set newmood $sstag } } } } } } } if {$parsed} { set mood(mood,$xlib,$jid) $newmood set mood(text,$xlib,$jid) $newtext hook::run user_mood_notification_hook $xlib $jid $newmood $newtext } elseif {$retract} { catch {unset mood(mood,$xlib,$jid)} catch {unset mood(text,$xlib,$jid)} hook::run user_mood_notification_hook $xlib $jid "" "" } } proc mood::notify_via_status_message {xlib jid mood text} { variable m2d set contact [::roster::itemconfig $xlib $jid -name] if {$contact == ""} { set contact $jid } if {$mood == ""} { set msg [::msgcat::mc "%s's mood is unset" $contact] } elseif {[info exists m2d($mood)]} { set msg [::msgcat::mc "%s's mood changed to %s" $contact $m2d($mood)] if {$text != ""} { append msg ": $text" } } else { set msg [::msgcat::mc "%s's mood changed to %s" $contact $mood] if {$text != ""} { append msg ": $text" } } set_status $msg } proc mood::publish {xlib mood args} { variable node set text "" set callback "" foreach {opt val} $args { switch -- $opt { -reason { set text $val } -command { set callback $val } } } set content [list [::xmpp::xml::create $mood]] if {$text != ""} { lappend content [::xmpp::xml::create text -cdata $text] } set cmd [list ::xmpp::pep::publishItem $xlib $node mood \ -payload [list [::xmpp::xml::create mood \ -xmlns $node \ -subelements $content]]] if {$callback != ""} { lappend cmd -command $callback } eval $cmd } proc mood::unpublish {xlib args} { variable node set callback "" foreach {opt val} $args { switch -- $opt { -command { set callback $val } } } set cmd [list ::xmpp::pep::deleteItem $xlib $node mood \ -notify true] if {$callback != ""} { lappend cmd -command $callback } eval $cmd } proc mood::on_init {} { set m [pep::get_main_menu_pep_submenu] set mm [menu $m.mood -tearoff $::ifacetk::options(show_tearoffs)] $m add cascade -menu $mm \ -label [::msgcat::mc "User mood"] $mm add command -label [::msgcat::mc "Publish user mood..."] \ -state disabled \ -command [namespace current]::show_publish_dialog $mm add command -label [::msgcat::mc "Unpublish user mood"] \ -state disabled \ -command [namespace current]::show_unpublish_dialog $mm add checkbutton -label [::msgcat::mc "Auto-subscribe to other's user mood"] \ -variable [namespace current]::options(auto-subscribe) } proc mood::on_connect_disconnect {args} { set mm [pep::get_main_menu_pep_submenu].mood set idx [expr {$::ifacetk::options(show_tearoffs) ? 1 : 0}] switch -- [llength [connections]] { 0 { $mm entryconfigure $idx -state disabled $mm entryconfigure [incr idx] \ -label [::msgcat::mc "Unpublish user mood"] \ -state disabled } 1 { $mm entryconfigure $idx -state normal $mm entryconfigure [incr idx] \ -label [::msgcat::mc "Unpublish user mood"] \ -state normal } default { $mm entryconfigure $idx -state normal $mm entryconfigure [incr idx] \ -label [::msgcat::mc "Unpublish user mood..."] \ -state normal } } } proc mood::show_publish_dialog {} { variable d2m variable moodvalue "" variable moodreason "" variable myjid set w .user_mood if {[winfo exists $w]} { destroy $w } set xlibs [connections] if {[llength $xlibs] == 0} { NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "Publishing is only possible\ while being online"] return } Dialog $w -title [::msgcat::mc "User mood"] \ -modal none -anchor e -default 0 -cancel 1 -parent . $w add -text [::msgcat::mc "Publish"] \ -command [list [namespace current]::do_publish $w] $w add -text [::msgcat::mc "Cancel"] -command [list destroy $w] set f [$w getframe] set connjids [list [::msgcat::mc "All"]] foreach xlib $xlibs { lappend connjids [connection_jid $xlib] } set myjid [lindex $connjids 0] Label $f.ccap -text [::msgcat::mc "Use connection:"] Combobox $f.conn -editable false \ -values $connjids \ -textvariable [namespace current]::myjid Label $f.mcap -text [::msgcat::mc "Mood:"] Combobox $f.mood -editable false \ -values [lsort [array names d2m]] \ -textvariable [namespace current]::moodvalue Label $f.rcap -text [::msgcat::mc "Reason:"] Entry $f.reason -textvariable [namespace current]::moodreason if {[llength $connjids] > 1} { grid $f.ccap -row 0 -column 0 -sticky e grid $f.conn -row 0 -column 1 -sticky ew } grid $f.mcap -row 1 -column 0 -sticky e grid $f.mood -row 1 -column 1 -sticky ew grid $f.rcap -row 2 -column 0 -sticky e grid $f.reason -row 2 -column 1 -sticky ew grid columnconfigure $f 1 -weight 1 $w draw } proc mood::do_publish {w} { variable d2m variable moodvalue variable moodreason variable myjid if {$moodvalue == ""} { NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "Cannot publish empty mood"] return } foreach xlib [connections] { if {[string equal $myjid [connection_jid $xlib]] || \ [string equal $myjid [::msgcat::mc "All"]]} { publish $xlib $d2m($moodvalue) \ -reason $moodreason \ -command [namespace current]::publish_result break } } unset moodvalue moodreason myjid destroy $w } # $res is one of: ok, error, abort proc mood::publish_result {res child} { switch -- $res { error { set error [error_to_string $child] } default { return } } NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "User mood publishing failed: %s" $error] } proc mood::show_unpublish_dialog {} { variable myjid set w .user_mood if {[winfo exists $w]} { destroy $w } set xlibs [connections] if {[llength $xlibs] == 0} { NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "Unpublishing is only possible\ while being online"] return } Dialog $w -title [::msgcat::mc "User mood"] \ -modal none -anchor e -default 0 -cancel 1 -parent . $w add -text [::msgcat::mc "Unpublish"] \ -command [list [namespace current]::do_unpublish $w] $w add -text [::msgcat::mc "Cancel"] -command [list destroy $w] set f [$w getframe] set connjids [list [::msgcat::mc "All"]] foreach xlib $xlibs { lappend connjids [connection_jid $xlib] } set myjid [lindex $connjids 0] Label $f.ccap -text [::msgcat::mc "Use connection:"] Combobox $f.conn -editable false \ -values $connjids \ -textvariable [namespace current]::myjid if {[llength $connjids] > 1} { grid $f.ccap -row 0 -column 0 -sticky e grid $f.conn -row 0 -column 1 -sticky ew } grid columnconfigure $f 1 -weight 1 if {[llength $xlibs] == 1} { do_unpublish $w } else { $w draw } } proc mood::do_unpublish {w} { variable myjid foreach xlib [connections] { if {[string equal $myjid [connection_jid $xlib]] || \ [string equal $myjid [::msgcat::mc "All"]]} { unpublish $xlib \ -command [namespace current]::unpublish_result break } } unset myjid destroy $w } # $res is one of: ok, error, abort proc mood::unpublish_result {res child} { switch -- $res { error { if {[lindex [error_type_condition $child] 1] == "item-not-found"} { return } set error [error_to_string $child] } default { return } } NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "User mood unpublishing failed: %s" $error] } proc mood::provide_userinfo {notebook xlib jid editable} { variable mood variable m2d variable ::userinfo::userinfo if {$editable} return set barejid [::xmpp::jid::stripResource $jid] if {![info exists mood(mood,$xlib,$barejid)]} return if {[string equal $mood(mood,$xlib,$barejid) ""]} return if {[info exists m2d($mood(mood,$xlib,$barejid))]} { set userinfo(mood,$jid) $m2d($mood(mood,$xlib,$barejid)) } else { set userinfo(mood,$jid) $mood(mood,$xlib,$barejid) } if {[info exists mood(text,$xlib,$barejid)]} { set userinfo(moodreason,$jid) $mood(text,$xlib,$barejid) } else { set userinfo(moodreason,$jid) "" } set f [pep::get_userinfo_dialog_pep_frame $notebook] set mf [userinfo::pack_frame $f.mood [::msgcat::mc "User mood"]] userinfo::pack_entry $jid $mf 0 mood [::msgcat::mc "Mood"]: userinfo::pack_entry $jid $mf 1 moodreason [::msgcat::mc "Reason"]: } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/pep/user_tune.tcl000064400000000000000000000500721477701321300170370ustar00nobodynobody# user_tune.tcl -- # # Implementation of XEP-0118 "User Tune" package require xmpp::pep namespace eval tune { variable node http://jabber.org/protocol/tune variable substatus variable tune custom::defvar options(auto-subscribe) 0 \ [::msgcat::mc "Auto-subscribe to other's user tune notifications."] \ -command [namespace current]::register_in_disco \ -group PEP -type boolean pubsub::register_event_notification_handler $node \ [namespace current]::process_tune_notification hook::add user_tune_notification_hook \ [namespace current]::notify_via_status_message hook::add finload_hook \ [namespace current]::on_init 60 hook::add connected_hook \ [namespace current]::on_connect_disconnect hook::add disconnected_hook \ [namespace current]::on_connect_disconnect hook::add roster_jid_popup_menu_hook \ [namespace current]::add_roster_pep_menu_item hook::add roster_user_popup_info_hook \ [namespace current]::provide_roster_popup_info hook::add userinfo_hook \ [namespace current]::provide_userinfo disco::register_feature $node } proc tune::get {xlib jid what {default ""}} { variable tune upvar 0 tune($what,$xlib,$jid) v if {[info exists v]} { return $v } else { return $default } } proc tune::get_all {xlib jid arrayVar} { variable tune upvar 1 $arrayVar a foreach tag {artist length source title track uri rating} { if {[info exists tune($tag,$xlib,$jid)]} { set a($tag) $tune($tag,$xlib,$jid) } } } proc tune::register_in_disco {args} { variable options variable node if {$options(auto-subscribe)} { disco::register_feature $node+notify } else { disco::unregister_feature $node+notify } } proc tune::add_roster_pep_menu_item {m xlib jid} { set rjid [roster::find_jid $xlib $jid] if {$rjid == ""} { set rjid [::xmpp::jid::stripResource $jid] } set pm [pep::get_roster_menu_pep_submenu $m $xlib $rjid] set mm [menu $pm.tune -tearoff no] $pm add cascade -menu $mm \ -label [::msgcat::mc "User tune"] $mm add command \ -label [::msgcat::mc "Subscribe"] \ -command [list [namespace current]::subscribe $xlib $rjid] $mm add command \ -label [::msgcat::mc "Unsubscribe"] \ -command [list [namespace current]::unsubscribe $xlib $rjid] hook::run roster_pep_user_tune_menu_hook $mm $xlib $rjid } proc tune::subscribe {xlib jid args} { variable node variable substatus set to [::xmpp::jid::stripResource $jid] set cmd [linsert $args 0 [namespace current]::subscribe_result $xlib $to] ::xmpp::pep::subscribe $xlib $to $node -command $cmd set substatus($xlib,$to) sent-subscribe } proc tune::unsubscribe {xlib jid args} { variable node variable substatus set to [::xmpp::jid::stripResource $jid] set cmd [linsert $args 0 [namespace current]::unsubscribe_result $xlib $to] ::xmpp::pep::unsubscribe $xlib $to $node -command $cmd set substatus($xlib,$to) sent-unsubscribe } # Err may be one of: ok, error and abort proc tune::subscribe_result {xlib jid res child args} { variable substatus set cmd "" foreach {opt val} $args { switch -- $opt { -command { set cmd $val } default { return -code error "unknown option: $opt" } } } switch -- $res { ok { set substatus($xlib,$jid) from } error { set substatus($xlib,$jid) error } default { return } } if {$cmd != ""} { lappend cmd $jid $res $child eval $cmd } } proc tune::unsubscribe_result {xlib jid res child args} { variable substatus variable tune set cmd "" foreach {opt val} $args { switch -- $opt { -command { set cmd $val } default { return -code error "unknown option: $opt" } } } if {[string equal $res ok]} { set substatus($xlib,$jid) none forget_user_tune $xlib $jid } if {$cmd != ""} { lappend cmd $jid $res $child eval $cmd } } proc tune::provide_roster_popup_info {var xlib user} { variable substatus variable tune upvar 0 $var info set jid [::xmpp::jid::stripResource $user] if {[info exists tune(available,$xlib,$jid)]} { append info [::msgcat::mc "\n\tTune: %s - %s" \ [get $xlib $jid artist ?] \ [get $xlib $jid title ?]] } elseif {[info exists substatus($xlib,$jid)]} { append info [::msgcat::mc "\n\tUser tune subscription: %s" \ $substatus($xlib,$jid)] } else { return } } proc tune::process_tune_notification {xlib jid items} { variable node variable tune set retract 0 set parsed 0 set nelems 0 foreach item $items { ::xmpp::xml::split $item tag xmlns attrs cdata subels switch -- $tag { retract { set retract true } default { foreach itune $subels { ::xmpp::xml::split $itune stag sxmlns sattrs scdata ssubels if {![string equal $stag tune]} continue if {![string equal $sxmlns $node]} continue set parsed true foreach i $ssubels { ::xmpp::xml::split $i sstag ssxmlns ssattrs sscdata sssubels switch -- $sstag { artist - length - source - title - track - uri - rating { set $sstag $sscdata incr nelems } } } } } } } if {$parsed} { if {$nelems > 0} { foreach tag {artist length source title track uri rating} { if {[info exists $tag]} { set tune($tag,$xlib,$jid) [set $tag] } else { catch {unset tune($tag,$xlib,$jid)} } } set tune(available,$xlib,$jid) "" hook::run user_tune_notification_hook $xlib $jid published } else { # "stop" command forget_user_tune $xlib $jid hook::run user_tune_notification_hook $xlib $jid stopped } } elseif {$retract} { forget_user_tune $xlib $jid hook::run user_tune_notification_hook $xlib $jid retracted } } proc tune::forget_user_tune {xlib jid} { variable tune foreach tag {artist length source title track uri rating} { catch {unset tune($tag,$xlib,$jid)} } catch {unset tune(available,$xlib,$jid)} } proc tune::notify_via_status_message {xlib jid event} { variable tune set contact [::roster::itemconfig $xlib $jid -name] if {$contact == ""} { set contact $jid } switch -- $event { published { set msg [::msgcat::mc "%s's tune changed to %s - %s" \ $contact \ [get $xlib $jid artist ?] \ [get $xlib $jid title ?]] } retracted { set msg [::msgcat::mc "%s's tune is unset" $contact] } stopped { set msg [::msgcat::mc "%s's tune has stopped playing" $contact] } } set_status $msg } proc tune::publish {xlib args} { variable node set seen 0 set stop 0 set callback "" while {[llength $args] > 0} { set opt [lpop args] switch -- $opt { -artist - -title - -track - -length - -source - -uri - -rating { set [string trimleft $opt -] [lpop args] incr seen } -stop { set stop 1 } -command { set callback [lpop args] } default { return -code error "Bad option \"$opt\":\ must be one of -artist, -title, -track, -length,\ -source, -uri, -rating, -stop or -command" } } } if {$stop} { if {$seen > 0} { return -code error "-stop cannot be combined with options\ other than -command" } set content [list] } else { set content [list] foreach tag {artist length source title track uri rating} { if {[info exists $tag] && [set $tag] != ""} { lappend content [::xmpp::xml::create $tag \ -cdata [set $tag]] } } } set cmd [list ::xmpp::pep::publishItem $xlib $node tune \ -payload [list [::xmpp::xml::create tune \ -xmlns $node \ -subelements $content]]] if {$callback != ""} { lappend cmd -command $callback } eval $cmd } proc tune::unpublish {xlib args} { variable node set callback "" foreach {opt val} $args { switch -- $opt { -command { set callback $val } } } set cmd [list ::xmpp::pep::deleteItem $xlib $node tune \ -notify true] if {$callback != ""} { lappend cmd -command $callback } eval $cmd } proc tune::on_init {} { set m [pep::get_main_menu_pep_submenu] set mm [menu $m.tune -tearoff $::ifacetk::options(show_tearoffs)] $m add cascade -menu $mm \ -label [::msgcat::mc "User tune"] $mm add command -label [::msgcat::mc "Publish user tune..."] \ -state disabled \ -command [namespace current]::show_publish_dialog $mm add command -label [::msgcat::mc "Unpublish user tune"] \ -state disabled \ -command [namespace current]::show_unpublish_dialog $mm add checkbutton -label [::msgcat::mc "Auto-subscribe to other's user tune"] \ -variable [namespace current]::options(auto-subscribe) } proc tune::on_connect_disconnect {args} { set mm [pep::get_main_menu_pep_submenu].tune set idx [expr {$::ifacetk::options(show_tearoffs) ? 1 : 0}] switch -- [llength [connections]] { 0 { $mm entryconfigure $idx -state disabled $mm entryconfigure [incr idx] \ -label [::msgcat::mc "Unpublish user tune"] \ -state disabled } 1 { $mm entryconfigure $idx -state normal $mm entryconfigure [incr idx] \ -label [::msgcat::mc "Unpublish user tune"] \ -state normal } default { $mm entryconfigure $idx -state normal $mm entryconfigure [incr idx] \ -label [::msgcat::mc "Unpublish user tune..."] \ -state normal } } } proc tune::show_publish_dialog {} { variable tuneartist "" variable tunetitle "" variable tunetrack "" variable tunelength "" variable tunesource "" variable tuneuri "" variable tunerating 1 variable tunestop 0 variable myjid set w .user_tune if {[winfo exists $w]} { destroy $w } set xlibs [connections] if {[llength $xlibs] == 0} { NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "Publishing is only possible\ while being online"] return } Dialog $w -title [::msgcat::mc "User tune"] \ -modal none -anchor e -default 0 -cancel 1 -parent . $w add -text [::msgcat::mc "Publish"] \ -command [list [namespace current]::do_publish $w] $w add -text [::msgcat::mc "Cancel"] -command [list destroy $w] set f [$w getframe] set connjids [list [::msgcat::mc "All"]] foreach xlib $xlibs { lappend connjids [connection_jid $xlib] } set myjid [lindex $connjids 0] Label $f.ccap -text [::msgcat::mc "Use connection:"] Combobox $f.conn -editable false \ -values $connjids \ -textvariable [namespace current]::myjid Label $f.lartist -text [::msgcat::mc "Artist:"] Entry $f.artist -textvariable [namespace current]::tuneartist Label $f.ltitle -text [::msgcat::mc "Title:"] Entry $f.title -textvariable [namespace current]::tunetitle Label $f.ltrack -text [::msgcat::mc "Track:"] Entry $f.track -textvariable [namespace current]::tunetrack Label $f.llength -text [::msgcat::mc "Length:"] Entry $f.length -textvariable [namespace current]::tunelength Label $f.lsource -text [::msgcat::mc "Source:"] Entry $f.source -textvariable [namespace current]::tunesource Label $f.luri -text [::msgcat::mc "URI:"] Entry $f.uri -textvariable [namespace current]::tuneuri Label $f.lrating -text [::msgcat::mc "Rating:"] Spinbox $f.rating 1 10 1 [namespace current]::tunerating \ -validate all -validatecommand [namespace code {validate_rating %P}] set tunerating "" ;# otherwise spinbox forces it to be 1 Checkbutton $f.stop \ -variable [namespace current]::tunestop \ -text [::msgcat::mc "Publish \"playback stopped\" instead"] \ -command [list [namespace current]::adjust_publish_controls $f] if {[llength $connjids] > 1} { grid $f.ccap -row 0 -column 0 -sticky e grid $f.conn -row 0 -column 1 -sticky ew } grid $f.lartist $f.artist grid $f.ltitle $f.title grid $f.ltrack $f.track grid $f.llength $f.length grid $f.lsource $f.source grid $f.luri $f.uri grid $f.lrating $f.rating grid $f.stop - -sticky w grid $f.lartist $f.ltitle $f.ltrack $f.llength \ $f.lsource $f.luri $f.lrating -sticky e grid $f.artist $f.title $f.track $f.length \ $f.source $f.uri $f.rating -sticky ew grid columnconfigure $f 1 -weight 1 bind $f [list [namespace current]::cleanup_publish_dialog] $w draw } proc tune::validate_rating {newvalue} { expr {$newvalue == "" || ([string is integer $newvalue] && 1 <= $newvalue && $newvalue <= 10)} } proc tune::adjust_publish_controls {f} { variable tunestop if {$tunestop} { set state disabled } else { set state normal } foreach control [list \ $f.lartist $f.artist \ $f.ltitle $f.title \ $f.ltrack $f.track \ $f.llength $f.length \ $f.lsource $f.source \ $f.luri $f.uri \ $f.lrating $f.rating] { $control configure -state $state } } proc tune::do_publish {w} { variable tuneartist variable tunetitle variable tunetrack variable tunelength variable tunesource variable tuneuri variable tunerating variable tunestop variable myjid foreach xlib [connections] { if {[string equal $myjid [connection_jid $xlib]] || \ [string equal $myjid [::msgcat::mc "All"]]} { if {$tunestop} { publish $xlib \ -stop \ -command [namespace current]::publish_result } else { publish $xlib \ -artist $tuneartist \ -title $tunetitle \ -track $tunetrack \ -length $tunelength \ -source $tunesource \ -uri $tuneuri \ -rating $tunerating \ -command [namespace current]::publish_result } break } } destroy $w } proc tune::cleanup_publish_dialog {} { variable tuneartist variable tunetitle variable tunetrack variable tunelength variable tunesource variable tuneuri variable tunerating variable tunestop variable myjid foreach v [info vars] { unset $v } } # $res is one of: ok, error, abort proc tune::publish_result {res child} { switch -- $res { error { set error [error_to_string $child] } default { return } } NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "User tune publishing failed: %s" $error] } proc tune::show_unpublish_dialog {} { variable myjid set w .user_tune if {[winfo exists $w]} { destroy $w } set xlibs [connections] if {[llength $xlibs] == 0} { NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "Unpublishing is only possible\ while being online"] return } Dialog $w -title [::msgcat::mc "User tune"] \ -modal none -anchor e -default 0 -cancel 1 -parent . $w add -text [::msgcat::mc "Unpublish"] \ -command [list [namespace current]::do_unpublish $w] $w add -text [::msgcat::mc "Cancel"] -command [list destroy $w] set f [$w getframe] set connjids [list [::msgcat::mc "All"]] foreach xlib $xlibs { lappend connjids [connection_jid $xlib] } set myjid [lindex $connjids 0] Label $f.ccap -text [::msgcat::mc "Use connection:"] Combobox $f.conn -editable false \ -values $connjids \ -textvariable [namespace current]::myjid if {[llength $connjids] > 1} { grid $f.ccap -row 0 -column 0 -sticky e grid $f.conn -row 0 -column 1 -sticky ew } grid columnconfigure $f 1 -weight 1 if {[llength $xlibs] == 1} { do_unpublish $w } else { $w draw } } proc tune::do_unpublish {w} { variable myjid foreach xlib [connections] { if {[string equal $myjid [connection_jid $xlib]] || \ [string equal $myjid [::msgcat::mc "All"]]} { unpublish $xlib \ -command [namespace current]::unpublish_result break } } unset myjid destroy $w } # $res is one of: ok, error, abort proc tune::unpublish_result {res child} { switch -- $res { error { if {[lindex [error_type_condition $child] 1] == "item-not-found"} { return } set error [error_to_string $child] } default { return } } NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "User tune unpublishing failed: %s" $error] } proc tune::provide_userinfo {notebook xlib jid editable} { variable tune variable m2d variable ::userinfo::userinfo if {$editable} return set barejid [::xmpp::jid::stripResource $jid] if {![info exists tune(available,$xlib,$barejid)]} return foreach tag {artist length source title track uri rating} { if {[info exists tune($tag,$xlib,$barejid)]} { set userinfo(tune$tag,$jid) $tune($tag,$xlib,$barejid) } else { set userinfo(tune$tag,$jid) "" } } set f [pep::get_userinfo_dialog_pep_frame $notebook] set mf [userinfo::pack_frame $f.tune [::msgcat::mc "User tune"]] userinfo::pack_entry $jid $mf 0 tuneartist [::msgcat::mc "Artist:"] userinfo::pack_entry $jid $mf 1 tunetitle [::msgcat::mc "Title:"] userinfo::pack_entry $jid $mf 2 tunetrack [::msgcat::mc "Track:"] userinfo::pack_entry $jid $mf 3 tunelength [::msgcat::mc "Length:"] userinfo::pack_entry $jid $mf 4 tunesource [::msgcat::mc "Source:"] userinfo::pack_entry $jid $mf 5 tuneuri [::msgcat::mc "URI:"] userinfo::pack_entry $jid $mf 6 tunerating [::msgcat::mc "Rating:"] } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/richtext000075500000000000000000000000001477701321300153055ustar00nobodynobodytkabber/plugins/richtext/chatlog.tcl000064400000000000000000000045571477701321300175240ustar00nobodynobody# chatlog.tcl -- # # This is a (pretty much eclectic) framework to support various highlights # in chat messages. It registers a rich text entity "chatlog" and provides # for configuring a text widget to be ready to display highlights. # On the other hand, detection of such highlights is done elsewhere -- in the # already existing bits of code (that is, handling /me messages, server messages, # MUC subjects, etc). There are plans to eventually move such code to # this "chatlog" plugin. # # NOTE that "real" configurable chat highlights are handled by the # highlights.tcl rich text plugin. namespace eval chatlog {} # This proc provides for reconfiguration of the chatlog tags. # It is intended to be used for post-configuration of the rich text # widgets when creating them to server as chat log windows, # since chatlog windows allow the customization of these parameters # via the Tk option database. proc chatlog::config {w args} { foreach {opt val} $args { switch -- $opt { -theyforeground { $w tag configure they -foreground $val } -meforeground { $w tag configure me -foreground $val } -serverlabelforeground { $w tag configure server_lab -foreground $val } -serverforeground { $w tag configure server -foreground $val } -infoforeground { $w tag configure info -foreground $val } -errforeground { $w tag configure err -foreground $val } -highlightforeground { $w tag configure highlight -foreground $val } default { return -code error "[namespace current]::config:\ Unknown option: $opt" } } } } proc chatlog::configure_richtext_widget {w} { # TODO do we need to provide some defaults? $w tag configure they $w tag configure me $w tag configure server_lab $w tag configure server $w tag configure info $w tag configure err } namespace eval chatlog { ::richtext::register_entity chatlog \ -configurator [namespace current]::configure_richtext_widget ::richtext::entity_state chatlog 1 } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/richtext/emoticons.tcl000064400000000000000000000422311477701321300200720ustar00nobodynobody# emoticons.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin # which enables rendering emoticons in chatlog windows by eliding # out their textual representation and putting images instead. catch {package require vfs::zip} namespace eval emoticons { variable themes variable emoticons ;# mapping from text mnemonics to images variable images ;# reference counts of images variable txtdefaults ;# default textual representation variable lasttext "" variable lastX variable lastY variable faces_regexp "" variable options custom::defgroup Emoticons \ [::msgcat::mc "Handling of \"emoticons\".\ Emoticons (also known as \"smileys\")\ are small pictures resembling a human face\ used to represent user's emotion. They are\ typed in as special mnemonics like :)\ or can be inserted using menu."]\ -group {Rich Text} \ -group Chat custom::defvar options(show_emoticons) 1 \ [::msgcat::mc "Show images for emoticons."] \ -type boolean -group Emoticons \ -command [namespace current]::toggle_emoticons set options(no_theme) [::msgcat::mc "None"] custom::defvar options(theme) "" \ [::msgcat::mc "Tkabber emoticons theme. To make new theme visible\ for Tkabber put it to some subdirectory of %s." \ [file join $::configdir emoticons]] \ -group Emoticons -type options \ -values [list "" $options(no_theme)] \ -command [namespace current]::on_theme_changed custom::defvar options(match_whole_word) 1 \ [::msgcat::mc "Use only whole words for emoticons."] \ -group Emoticons -type boolean \ -command [namespace current]::on_regex_mode_changed custom::defvar options(handle_lol) 0 \ [::msgcat::mc "Handle ROTFL/LOL smileys -- those like :))) --\ by \"consuming\" all that parens and rendering the\ whole word with appropriate icon."] \ -group Emoticons -type boolean \ -command [namespace current]::on_regex_mode_changed # The [enable_subsystem] proc called by postload_hook # completes initialization, if needed. } proc emoticons::add {face image} { variable options variable emoticons variable images variable faces_regexp if {$face == ""} { return -code error "Empty emoticon mnemonic for image \"$image\"" } if {![info exists images($image)]} { set images($image) 0 } if {[info exists emoticons($face)]} { incr images($emoticons($face)) -1 } set emoticons($face) $image incr images($image) if {$faces_regexp != ""} { append faces_regexp | } append faces_regexp [re_escape $face] if {$options(handle_lol)} { append faces_regexp + } } proc emoticons::get {word} { variable emoticons if {[info exists emoticons($word)]} { return $emoticons($word) } else { return "" } } proc emoticons::put {txt word} { variable emoticons if {[info exists emoticons($word)]} { $txt image create end -image $emoticons($word) $txt tag add emoticon_image "end-2char" } } # Clears all arrays related to emoticons # and sets logical reference counts of images to zero. # NOTE that it does not actually frees unused images. # Call [sweep] or [load_dir] (which calls [sweep]) after # calling [clear]. proc emoticons::clean {} { variable images variable emoticons variable txtdefaults variable faces_regexp # Prepare for loading: array unset emoticons * array unset txtdefaults * set faces_regexp "" # Set refcount to 0 on all images: foreach iname [array names images] { set images($iname) 0 } } # Sweeps out orphaned (not used anymore) physical images (i.e. those # with logical refcounts less or equal than 0. # NOTE that images which are still physically in use (by Tk) are not # deleted in 8.4+. proc emoticons::sweep {} { variable images variable txtdefaults foreach iname [array names images] { if {$images($iname) < 1} { # Work around Tcl 8.3 which lacks [image inuse] (always kill in this case): if {[catch {image inuse $iname} keep]} { set keep 0 } if {! $keep} { delete_image $iname unset images($iname) if {[info exists txtdefaults($iname)]} { unset txtdefaults($iname) } } } } } # For backward compatibility: namespace eval ::emoteicons {} proc ::emoteicons::load_dir {dir} \ [list eval [list [namespace current]::emoticons::load_dir] \$dir] # Loads a new set of emoticons, adding them to the existing set, # replacing any existing emoticons with the same mnemonics: proc emoticons::load_dir {dir} { variable images variable faces_regexp if {$dir != ""} { set icondef_path [file join $dir icondef.xml] if {![file isfile $icondef_path]} { ### TODO: some error messages return } set f [open $icondef_path] set icondef [read $f] close $f set faces_regexp "" ::xmpp::xml::parseData $icondef [namespace code [list parse_icondef $dir]] } # Sweep out orphaned images: sweep } proc emoticons::parse_icondef {dir xmldata} { ::xmpp::xml::split $xmldata tag xmlns attrs cdata subels if {$tag != "icondef"} { # TODO: error message return } foreach subel $subels { parse_item $dir $subel } } proc emoticons::parse_item {dir item} { ::xmpp::xml::split $item tag xmlns attrs cdata subels switch -- $tag { name {} version {} description {} author {} creation {} meta {} icon { parse_icon $dir $subels } } } proc emoticons::parse_icon {dir items} { variable txtdefaults variable images set faces {} set txtdefault "" set graphic "" foreach item $items { ::xmpp::xml::split $item tag xmlns attrs cdata subels switch -- $tag { text { if {$cdata == ""} continue ;# skip empty element lappend faces $cdata if {$txtdefault == "" || \ [::xmpp::xml::getAttr $attrs default] == "true"} { set txtdefault $cdata } } object { switch -glob -- [::xmpp::xml::getAttr $attrs mime] { image/* {set graphic $cdata} } } graphic { # For compatibility with older versions of icondef.xml switch -glob -- [::xmpp::xml::getAttr $attrs type] { image/* {set graphic $cdata} } } sound {} } } #debugmsg emoticons "E: $graphic; $txts" if {$graphic == "" || [llength $faces] == 0} return # Work around absence of default face: if {$txtdefault == ""} { set txtdefault [lindex $faces 0] } set iname [imagename $txtdefault] # TODO what if more than one face match existing images? foreach face $faces { set icon [imagename $face] if {[info exists images($icon)]} { set iname $icon break } } create_image $iname -file [file join $dir $graphic] set images($iname) 0 ;# Initial refcount is zero since it'll bumped by successive [add]s: foreach face $faces { add $face $iname } set txtdefaults($iname) $txtdefault } # Constructs a name for the emoticon image from its mnemonic. # Since [image] creates a command with the name of the image, we # add our namespace as a prefix. proc emoticons::imagename {mnemonic} { return [namespace current]::emoticon_$mnemonic } proc emoticons::create_image {name args} { ::create_image $name {*}$args } proc emoticons::delete_image {name} { image delete $name } proc emoticons::show_menu {iw} { variable txtdefaults set imgs [array names txtdefaults] if {[llength $imgs] == 0} return set m .emoticonsmenu if {[winfo exists $m]} { destroy $m } menu $m -tearoff 0 set rows [expr {floor(sqrt([llength $imgs]))}] set row 0 foreach img $imgs { if {$row >= $rows} { $m add command -image $img -columnbreak 1 \ -label $txtdefaults($img) \ -command [list [namespace current]::insert $iw \ $txtdefaults($img)] set row 1 } else { $m add command -image $img \ -label $txtdefaults($img) \ -command [list [namespace current]::insert $iw \ $txtdefaults($img)] incr row } } bind $m \ [list [namespace current]::balloon %W enter %X %Y %x %y] bind $m \ [list [namespace current]::balloon %W motion %X %Y %x %y] bind $m \ [list [namespace current]::balloon %W leave %X %Y %x %y] tk_popup $m [winfo pointerx .] [winfo pointery .] } # trying to get motion events in a menu is problematic... proc emoticons::balloon {w action X Y x y} { variable lasttext variable lastX variable lastY if {[set index [$w index @$x,$y]] eq "none"} { if {$lasttext ne ""} { balloon::default_balloon $w:$lasttext leave $lastX $lastY } return } set text [$w entrycget $index -label] switch -- $action { motion { if {$text ne $lasttext} { if {$lasttext ne ""} { balloon::default_balloon $w:$lasttext leave $lastX $lastY } balloon::default_balloon $w:$text enter [set lastX $X] \ [set lastY $Y] \ -text [set lasttext $text] } } leave { set lasttext "" } } balloon::default_balloon $w:$text $action $X $Y -text $text } proc emoticons::insert {iw text} { set p "" switch -- [$iw get "insert - 1 chars"] { "" - " " - "\n" {} default { if {[$iw index "insert -1 chars"] ne "1.0"} { set p " " } } } $iw insert insert "$p$text " } event add <> event add <> if {$::tcl_platform(platform) == "windows"} { # workaround for shortcuts in russian keyboard layout event add <> } proc emoticons::setup_bindings {chatid type} { set iw [chat::input_win $chatid] bind $iw <> \ [list [namespace current]::show_menu %W] bind $iw <> +break } proc emoticons::process_emoticons {atLevel accName} { variable options variable faces_regexp upvar #$atLevel $accName chunks set out {} foreach {s type tags} $chunks { if {$type != "text"} { # pass through lappend out $s $type $tags continue } set ix 0 if {$faces_regexp != ""} { if {$options(match_whole_word)} { set regexp (?:^|\\s)($faces_regexp)(?=\\s|\$) } else { set regexp ($faces_regexp) } foreach {ign inds} [regexp -all -inline -indices -- $regexp $s] { lassign $inds fs fe if {$fs - $ix > 0} { # dump chunk before emoticon: lappend out [string range $s $ix [expr {$fs - 1}]] $type $tags } # dump emoticon: lappend out [string range $s $fs $fe] emoticon $tags set ix [expr {$fe + 1}] } } if {[string length $s] - $ix > 0} { # dump chunk after emoticon: lappend out [string range $s $ix end] $type $tags } } set chunks $out } proc emoticons::render_emoticon {w type word tags} { variable options if {$options(handle_lol)} { set word [string_collapseright $word] } if {[get $word] != {}} { $w insert end $word emoticon put $w $word } else { $w insert end $word } } # TODO good candidate to go outside: proc emoticons::re_escape {s} { return [string map {\\ \\\\ * \\* . \\. [ \\[ ] \\] \{ \\{ \} \\} ( \\( ) \\) | \\| ? \\? $ \\$ ^ \\^ + \\+} $s] } proc emoticons::configure_richtext_widget {w} { variable options if {$options(show_emoticons)} { $w tag configure emoticon -elide 1 $w tag configure emoticon_image -elide 0 } else { $w tag configure emoticon -elide 0 $w tag configure emoticon_image -elide 1 } } proc emoticons::toggle_emoticons {args} { foreach w [::richtext::textlist] { configure_richtext_widget $w } } proc emoticons::enumerate_available_themes {} { set dirs [concat \ [glob -nocomplain -directory [fullpath emoticons] *] \ [glob -nocomplain -directory [file join $::configdir emoticons] *]] foreach dir $dirs { enumerate_theme [namespace current]::themes $dir } } proc emoticons::enumerate_theme {varName dir} { set icondef_path [file join $dir icondef.xml] if {[file isfile $icondef_path]} { set thdir $dir } elseif {![catch {::vfs::zip::Mount $dir $dir} mount_fd] && \ [llength [glob -nocomplain $dir/*/icondef.xml]] > 0} { set icondef_path [lindex [glob -nocomplain $dir/*/icondef.xml] 0] set thdir [file dirname $icondef_path] } else { return } if {![catch {open $icondef_path} f]} { set icondef [read $f] close $f } else { catch {::vfs::zip::Unmount $mount_fd $dir} return } ::xmpp::xml::parseData $icondef \ [namespace code [list get_theme_name $varName $thdir]] } proc emoticons::get_theme_name {varName dir xmldata} { upvar #0 $varName themes ::xmpp::xml::split $xmldata tag xmlns attrs cdata subels if {$tag == "name"} { set themes($cdata) $dir return 1 } foreach subel $subels { if {[get_theme_name $varName $dir $subel]} { return 1 } } return 0 } # Gets called when options(theme) changes proc emoticons::on_theme_changed {args} { variable options clean load_dir $options(theme) } proc emoticons::find_themes {} { variable options variable themes set values {} array unset themes * enumerate_available_themes set theme_names [lsort [array names themes]] set idx [lsearch -exact $theme_names Default] if {$idx > 0} { set theme_names [linsert [lreplace $theme_names $idx $idx] 0 Default] } foreach theme $theme_names { lappend values $themes($theme) $theme } set values [linsert $values 0 "" $options(no_theme)] set idx [lsearch -exact $theme_names $options(theme)] if {$idx >= 0} { set theme [lindex $theme_names $idx] } else { set idx [lsearch -exact $theme_names Default] if {$idx >= 0} { set theme [lindex $theme_names [expr {$idx - 1}]] } else { set theme "" } } custom::configvar [namespace current]::options(theme) -values $values } proc emoticons::enable_subsystem {} { find_themes on_theme_changed ::richtext::entity_state emoticon 1 } proc emoticons::disable_subsystem {} { ::richtext::entity_state emoticon 0 } proc emoticons::on_regex_mode_changed {args} { rebuild_faces_regex } proc emoticons::rebuild_faces_regex {} { variable options variable emoticons variable faces_regexp set faces_regexp "" foreach face [array names emoticons] { if {$faces_regexp != ""} { append faces_regexp | } append faces_regexp [re_escape $face] if {$options(handle_lol)} { append faces_regexp + } } } # Returns a string with its rightmost repeated characters collapsed into one. # TODO good candidate to go into utils.tcl proc emoticons::string_collapseright {s} { set c [string index $s end] set s [string trimright $s $c] append s $c return $s } namespace eval emoticons { ::hook::add postload_hook [namespace current]::enable_subsystem 40 ::hook::add open_chat_post_hook [namespace current]::setup_bindings ::richtext::register_entity emoticon \ -configurator [namespace current]::configure_richtext_widget \ -parser [namespace current]::process_emoticons \ -renderer [namespace current]::render_emoticon \ -parser-priority 70 } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/richtext/highlight.tcl000064400000000000000000000107161477701321300200440ustar00nobodynobody# highlight.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin # which highlights certain words (e.g. the user's nickname) in chatlog # windows. namespace eval highlight { custom::defgroup Highlight [::msgcat::mc "Groupchat message highlighting plugin options."] \ -group Chat \ -group {Rich Text} custom::defvar options(enable_highlighting) 1 \ [::msgcat::mc "Enable highlighting plugin."] \ -type boolean -group Highlight \ -command [namespace current]::on_state_changed custom::defvar options(highlight_nick) 1 \ [::msgcat::mc "Highlight current nickname in messages."] \ -type boolean -group Highlight custom::defvar options(highlight_substrings) {} \ [::msgcat::mc "Substrings to highlight in messages."] \ -type string -group Highlight custom::defvar options(highlight_whole_words) 1 \ [::msgcat::mc "Highlight only whole words in messages."] \ -type boolean -group Highlight } proc highlight::configure_richtext_widget {w} { # TODO some defaults may be? $w tag configure highlight } proc highlight::process_highlights {atLevel accVar} { upvar #$atLevel $accVar chunks variable options set subs [split $options(highlight_substrings) " "] if {$options(highlight_nick) && [::richtext::property_exists mynick]} { lappend subs [::richtext::property_get mynick] } set out {} foreach {s type tags} $chunks { if {$type != "text"} { # pass through lappend out $s $type $tags continue } set ts 0 foreach {ms me} [spot_highlights $s $subs] { # Write out text before current highlight, if any: if {$ts < $ms} { lappend out [string range $s $ts [expr {$ms - 1}]] $type $tags } # Write out current highlight: lappend out [string range $s $ms $me] highlight $tags set ts [expr {$me + 1}] } # Write out text after the last highlight, if any: if {[string length $s] - $ts > 0} { lappend out [string range $s $ts end] $type $tags } } set chunks $out } proc highlight::spot_highlights {s subs} { variable options set words [textutil::splitx $s {([\t \r\n]+)}] set ind_end 0 set stop_ind [string length $s] set ranges {} set found 1 while {$found && $ind_end < $stop_ind} { set found 0 set ind $ind_end foreach str $subs { set len [string length $str] if {$len > 0 && [set match [string first $str $s $ind]] >= 0} { if {!$options(highlight_whole_words) || \ (![string is wordchar -strict [string index $s [expr {$match - 1}]]] && \ ![string is wordchar -strict [string index $s [expr {$match + $len}]]])} { if {!$found} { set found 1 set ind_start $match set ind_end [expr {$match + $len}] } elseif {$match < $ind_start} { set ind_start $match set ind_end [expr {$match + $len}] } } } } if {$found} { lappend ranges $ind_start [expr {$ind_end - 1}] } } return $ranges } proc highlight::render_highlight {w type piece tags} { $w insert end $piece [lfuse $type $tags] } # The following procedure reports highlighting inside URLs too proc highlight::check_highlighted_message {vpersonal nick body} { variable options upvar 2 $vpersonal personal set subs [split $options(highlight_substrings) " "] if {$options(highlight_nick)} { lappend subs $nick } if {[llength [spot_highlights $body $subs]] > 0} { set personal 1 } } hook::add check_personal_message_hook \ [namespace current]::highlight::check_highlighted_message proc highlight::on_state_changed {args} { variable options ::richtext::entity_state highlight $options(enable_highlighting) } namespace eval highlight { ::richtext::register_entity highlight \ -configurator [namespace current]::configure_richtext_widget \ -parser [namespace current]::process_highlights \ -renderer [namespace current]::render_highlight \ -parser-priority 60 on_state_changed } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/richtext/stylecodes.tcl000064400000000000000000000142461477701321300202550ustar00nobodynobody# stylecodes.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # converts wiki-like formatting codes (*bold*, /italic/, _underlined_, # -struck through-) into respective font changes in richtext windows. namespace eval stylecodes { variable options custom::defgroup Stylecodes \ [::msgcat::mc "Handling of \"stylecodes\".\ Stylecodes are (groups of) special formatting symbols\ used to emphasize parts of the text by setting them\ with boldface, italics or underlined styles,\ or as combinations of these."] \ -group {Rich Text} \ -group Chat custom::defvar options(emphasize) 1 \ [::msgcat::mc "Emphasize stylecoded messages using different fonts."] \ -type boolean -group Stylecodes \ -command [namespace current]::update_config custom::defvar options(hide_markup) 1 \ [::msgcat::mc "Hide characters comprising stylecode markup."] \ -type boolean -group Stylecodes \ -command [namespace current]::update_config } proc stylecodes::process_stylecodes {atLevel accName} { upvar #$atLevel $accName chunks set out {} foreach {s type tags} $chunks { if {$type != "text"} { # pass through lappend out $s $type $tags continue } foreach elem [scan_stylecodes $s $type $tags {* / _ -}] { lappend out $elem } } set chunks $out } proc stylecodes::scan_stylecodes {what type tags stylecodes} { set len [string length $what] set out {} set si 0 for {set ix 0} {$ix < $len} {incr ix} { set startOK true set sc [spot_highlight $what $stylecodes ix startOK] if {$sc == {}} continue lassign $sc ls le ms me rs re pat if {$ls - $si > 0} { # dump the text before opening stylecode block: lappend out [string range $what $si [expr {$ls - 1}]] $type $tags } set sctags [stylecodes->tags $pat] # dump opening stylecode block: lappend out [string range $what $ls $le] stylecode [lfuse $tags $sctags] # dump highlighted text: lappend out [string range $what $ms $me] $type [lfuse $tags $sctags] # dump closing stylecode block: lappend out [string range $what $rs $re] stylecode [lfuse $tags $sctags] set si $ix } if {[string length $what] - $si > 0} { lappend out [string range $what $si end] $type $tags } return $out } proc stylecodes::spot_highlight {what stylecodes ixVar startOKVar} { upvar 1 $ixVar ix $startOKVar startOK set ls $ix set pattern {} while {[eat_stylecode $what $ix stylecodes pattern startOK]} { incr ix } set startOK false if {$ix == $ls} return if {[is_scbreak [string index $what $ix]]} return ;# stylecode break after stylecode # found opening stylecode block. # create pattern for ending stylecode block and seek for it: set pat [join $pattern ""] set rs [string first $pat $what $ix] if {$rs == -1} { return {} } # found closing stylecode block. if {$rs - $ix == 0} { return {} } ;# empty highlight if {[is_scbreak [string index $what [expr {$rs - 1}]]]} { # stylecode break before return } if {[string first \n [string range $what $ix $rs]] != -1} { # intervening newline return {} } set patlen [string length $pat] if {![is_scbreak [string index $what [expr {$rs + $patlen}]]]} { # no proper break after closing stylecode block return {} } set le [expr {$ls + $patlen - 1}] set ms [expr {$ls + $patlen}] set me [expr {$rs - 1}] set re [expr {$rs + $patlen - 1}] # skip past the closing stylecode block set ix [expr {$re + 1}] return [list $ls $le \ $ms $me \ $rs $re \ $pat] } proc stylecodes::eat_stylecode {what at scodesVar patVar startOKVar} { upvar 1 $scodesVar scodes $patVar pat $startOKVar startOK set ix 0 set c [string index $what $at] foreach sc $scodes { if {$c == $sc} { if {!$startOK} { return false } set scodes [lreplace $scodes $ix $ix] set pat [linsert $pat 0 $c] return true } incr ix } set startOK [is_scbreak $c] return false } proc stylecodes::is_scbreak {c} { expr {[string is space $c] || [string is punct $c]} } proc stylecodes::stylecodes->tags {pattern} { set out {} array set tags {* bold / italic _ underlined - overstricken} foreach sc [split $pattern ""] { lappend out $tags($sc) } return $out } proc stylecodes::render_stylecode {w type piece tags} { $w insert end $piece \ [richtext::fixup_tags [concat $type $tags] {{bold italic}}] } proc stylecodes::configure_richtext_widget {w} { variable options if {$options(emphasize)} { $w tag configure stylecode -elide $options(hide_markup) $w tag configure bold -font $::ChatBoldFont $w tag configure italic -font $::ChatItalicFont $w tag configure bold_italic -font $::ChatBoldItalicFont $w tag configure underlined -underline 1 $w tag configure overstricken -overstrike 1 } else { $w tag configure stylecode -elide 0 $w tag configure bold -font $::ChatFont $w tag configure italic -font $::ChatFont $w tag configure bold_italic -font $::ChatFont $w tag configure underlined -underline 0 $w tag configure overstricken -overstrike 0 } } proc stylecodes::update_config {args} { foreach w [::richtext::textlist] { configure_richtext_widget $w } } namespace eval stylecodes { ::richtext::register_entity stylecode \ -configurator [namespace current]::configure_richtext_widget \ -parser [namespace current]::process_stylecodes \ -renderer [namespace current]::render_stylecode \ -parser-priority 80 ::richtext::entity_state stylecode 1 } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/richtext/urls.tcl000064400000000000000000000277661477701321300170770ustar00nobodynobody# urls.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # renders URLs in richtext widgets. if {$::darktheme} { option add *urlforeground cornflowerblue widgetDefault option add *urlactiveforeground skyblue widgetDefault option add *urlcursor hand2 widgetDefault } else { option add *urlforeground dodgerblue4 widgetDefault option add *urlactiveforeground dodgerblue3 widgetDefault option add *urlcursor hand2 widgetDefault } namespace eval urls { variable options variable urlid 0 # TODO add user:pass@ match # TODO sync TLDs with https://data.iana.org/TLD/tlds-alpha-by-domain.txt variable url_regexp { (^|\s) ([^\w\d]*) ( (?: (?: ftp|https?)://[-\w]+(\.\w[-\w]*)* | (?: \w[-\w]* \. )+ (?: com | edu | biz | gov | in(?:t|fo) | mil | net | org | name | aero | arpa | coop | museum | pro | travel | asia | cat | jobs | mobi | tel | xn-- (?: 0zwm56d | 11b5bs3a9aj6g | 80akhbyknj4f | 9t4b11yi5a | deba0ad | fiqs8s | fiqz9s | fzc2c9e2c | g6w251d | hgbk6aj7f53bba | hlcj6aya9esc7a | j6w193g | jxalpdlp | kgbechtv | kprw13d | kpry57d | mgbaam7a8h | mgbayh7gpa | mgberp4a5d4ar | o3cw4h | p1ai | pgbs0dh | wgbh1c | xkc2al3hye2a | ygbi2ammx | zckzah ) | \u6d4b\u8bd5 | \u092a\u0930\u0940\u0915\u094d\u0937\u093e | \u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u0435 | \ud14c\uc2a4\ud2b8 | \u05d8\u05e2\u05e1\u05d8 | \u4e2d\u56fd | \u4e2d\u570b | \u0dbd\u0d82\u0d9a\u0dcf | \u6e2c\u8a66 | \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc | \u0baa\u0bb0\u0bbf\u0b9f\u0bcd\u0b9a\u0bc8 | \u9999\u6e2f | \u03b4\u03bf\u03ba\u03b9\u03bc\u03ae | \u0625\u062e\u062a\u0628\u0627\u0631 | \u53f0\u6e7e | \u53f0\u7063 | \u0627\u0645\u0627\u0631\u0627\u062a | \u0627\u0644\u0627\u0631\u062f\u0646 | \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 | \u0e44\u0e17\u0e22 | \u0440\u0444 | \u062a\u0648\u0646\u0633 | \u0645\u0635\u0631 | \u0b87\u0bb2\u0b99\u0bcd\u0b95\u0bc8 | \u0641\u0644\u0633\u0637\u064a\u0646 | \u30c6\u30b9\u30c8 | [a-z][a-z] ) ) (?: : \d+ )? (?: (?: / [^.,?!:;"'<>()\[\]{}\s\x7F-\x9F]* (?: \([^.,?!:;"'<>()\[\]{}\s\x7F-\x9F]*\) )? [^.,?!:;"'<>()\[\]{}\s\x7F-\x9F]* )? (?: [.,?!:;]+ [^.,?!:;"'<>()\[\]{}\s\x7F-\x9F]+ )* )? ) ([^\w\d]*) (\s|$) } } proc urls::process_urls {atLevel accName} { upvar #$atLevel $accName chunks set out {} foreach {s type tags} $chunks { if {$type != "text"} { # pass through lappend out $s $type $tags continue } set ix 0; set us 0; set ue 0 while {[spot_url $s $ix us ue]} { if {$us - $ix > 0} { # dump chunk before URL: lappend out [string range $s $ix [expr {$us - 1}]] $type $tags } set title [string range $s $us $ue] set url [make_url $title] lappend out $url url $tags ::richtext::property_update url:title,$url $title set ix [expr {$ue + 1}] } if {[string length $s] - $ix > 0} { # dump chunk after URL: lappend out [string range $s $ix end] $type $tags } } set chunks $out } proc urls::spot_url {what at startVar endVar} { variable url_regexp set matched [regexp -expanded -nocase -indices \ -start $at -- $url_regexp $what -> _ _ bounds] if {!$matched} { return false } upvar 1 $startVar us $endVar ue lassign $bounds us ue return true } proc urls::make_url {title} { if {[regexp -nocase {^(ftp|https?)://} $title]} { return $title } if {[regexp -nocase {^ftp} $title]} { return "ftp://$title" } return "http://$title" } proc urls::encode_url {url} { set utf8_url [encoding convertto utf-8 $url] set len [string length $utf8_url] set encoded_url "" for {set i 0} {$i < $len} {incr i} { binary scan $utf8_url @${i}c sym set sym [expr {$sym & 0xFF}] if {$sym >= 128 || $sym <= 32} { append encoded_url [format "%%%02X" $sym] } else { append encoded_url [binary format c $sym] } } return $encoded_url } # Renders a rich text chunk of type "url" in the rich text widget. # # Accepts several trailing options: # -title TITLE -- allows to "hide" the actual URL # and display its title instead; # other options are passed to [config_url], see below. # # An URL is physically represented by pieces of text between tags: # # [actual URL] title or URL # # That is: # * The "url" tag is always present and it covers all the URL text; # * The "href_N" tag (whth auto-generated integer part N) is also # always pesent. It contains also the URL itself, if the URL title # is not specified, or that URL title; # * The "uri" tag is present only if the URL title was specified, and # then this tag denotes the actuall hidden URL and it then appears # earlier in the text that the related "href_N" tag. proc urls::render_url {w type url tags args} { variable options variable urlid set privtag href_$urlid $w tag configure $privtag -foreground $options(foreground) -underline 1 set url_start [$w index {end - 1 char}] set title [url_get_title $url $args] if {$title != {}} { set uri_tag [list [list uri $url]] set url $title set show_hints true } else { set uri_tag [list] set show_hints false } $w insert end $url [lfuse $tags [list $privtag] $uri_tag] $w tag add $type $url_start {end - 1 char} $w tag bind $privtag \ [double% [list ::richtext::highlighttext \ $w $privtag $options(activeforeground) $options(cursor)]] $w tag bind $privtag \ [double% [list ::richtext::highlighttext \ $w $privtag $options(foreground) [lindex [$w configure -cursor] 3]]] if {$show_hints} { $w tag bind $privtag \ +[list [namespace current]::balloon [double% $w] [double% $privtag] enter %x %y %X %Y] $w tag bind $privtag \ +[list [namespace current]::balloon [double% $w] [double% $privtag] motion %x %y %X %Y] $w tag bind $privtag \ +[list [namespace current]::balloon [double% $w] [double% $privtag] leave %x %y %X %Y] } # Default URL action: config_url $w $privtag \ -command [list [namespace current]::browse_url %W %x %y] eval {config_url $w $privtag} $args incr urlid return $privtag ;# to allow further configuration of this tag } proc urls::balloon {w tag action x y X Y} { switch -- $action { enter { ::balloon::default_balloon $w:$tag enter $X $Y -text [get_url $w $x $y] } motion { ::balloon::default_balloon $w:$tag motion $X $Y -text [get_url $w $x $y] } leave { ::balloon::default_balloon $w:$tag leave $X $Y } } } # Tries to find the title for the URL $url either in the $options # (which are usually those passed to [render_url] or among the # properties of the message being processed. proc urls::url_get_title {url options} { array set opts $options if {[info exists opts(-title)]} { set title $opts(-title) } elseif {[::richtext::property_exists url:title,$url]} { set title [::richtext::property_get url:title,$url] } else { set title "" } return $title } # Configures a URL $tag rendered in a text widget $w. # This tag is either a metatag "url" or some other tag # returned by the [render_url] proc. # $args should be a list of option/value pairs. # Supported options: # -command: invoke this command when the URL is clicked with LMB; # replaces any existing command bound to the URL. # -add-command: same as -command, but preserves the existing command. # any number of commands can be assotiated with a URL this way. proc urls::config_url {w tag args} { foreach {key val} $args { switch -- $key { -command { $w tag bind $tag $val } -add-command { $w tag bind $tag +$val } } } } # Passes a URL containing the $x,$y point in the text widget $w # to the system-dependent browser program. # The URL undergoes W3C-urlencoding first, to be ASCII-clean. proc urls::browse_url {w x y} { browseurl [encode_url [get_url $w $x $y]] } # Returns a URL containing the $x,$y point in the text widget $w: proc urls::get_url {w x y} { set tags [$w tag names "@$x,$y"] set idx [lsearch $tags href_*] if {$idx < 0} return set idx1 [lsearch $tags uri*] if {$idx1 >= 0} { return [lindex [lindex $tags $idx1] 1] } else { lassign [$w tag prevrange url "@$x,$y"] a b return [$w get $a $b] } } # Copies an URL under $x,$y in $w into CLIPBOARD: proc urls::copy_url {w x y} { clipboard clear -displayof $w clipboard append -displayof $w [get_url $w $x $y] } proc urls::add_chat_win_popup_menu {m chatwin X Y x y} { set tags [$chatwin tag names "@$x,$y"] set idx [lsearch $tags href_*] if {$idx >= 0} { $m add command -label [::msgcat::mc "Copy URL to clipboard"] \ -command [list [namespace current]::copy_url $chatwin $x $y] } } hook::add chat_win_popup_menu_hook \ [namespace current]::urls::add_chat_win_popup_menu 10 proc urls::configure_richtext_widget {w} { variable options set options(foreground) [option get $w urlforeground Text] set options(activeforeground) [option get $w urlactiveforeground Text] set options(cursor) [option get $w urlcursor Text] # "uri" -- tag for "hidden" URLs (presented as their alt. text): $w tag configure uri -elide 1 } namespace eval urls { ::richtext::register_entity url \ -configurator [namespace current]::configure_richtext_widget \ -parser [namespace current]::process_urls \ -renderer [namespace current]::render_url \ -parser-priority 50 ::richtext::entity_state url 1 } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/roster000075500000000000000000000000001477701321300147715ustar00nobodynobodytkabber/plugins/roster/annotations.tcl000064400000000000000000000231121477701321300201100ustar00nobodynobody# annotations.tcl -- # # Annotations (XEP-0145) support package require xmpp::roster::annotations namespace eval annotations { # variable to store roster notes variable notes array set notes {} } proc annotations::free_notes {xlib} { variable notes array unset notes $xlib,* } hook::add disconnected_hook [namespace current]::annotations::free_notes proc annotations::request_notes {xlib} { ::xmpp::roster::annotations::retrieve $xlib \ -command [list [namespace current]::process_notes $xlib] } hook::add connected_hook [namespace current]::annotations::request_notes proc annotations::process_notes {xlib status noteslist} { variable notes if {$status != "ok"} return free_notes $xlib foreach note $noteslist { create_note $xlib $note } } proc annotations::create_note {xlib note args} { variable notes set merge 0 foreach {opt val} $args { switch -- $opt { -merge { set merge $val } default { return -code error "Bad option \"$opt\":\ must be -merge" } } } array set n $note set jid $n(jid) if {!$merge || [more_recent $xlib $n(jid) $n(cdate) $n(mdate)]} { set notes($xlib,jid,$jid) $n(jid) set notes($xlib,cdate,$jid) $n(cdate) set notes($xlib,mdate,$jid) $n(mdate) set notes($xlib,note,$jid) $n(note) return 1 } else { return 0 } } proc annotations::more_recent {xlib jid cdate mdate} { variable notes if {![info exists notes($xlib,jid,$jid)]} { return 1 } elseif {[info exists notes($xlib,mdate,$jid)]} { return [expr {$mdate > $notes($xlib,mdate,$jid)}] } elseif {[info exists notes($xlib,cdate,$jid)]} { return [expr {$cdate > $notes($xlib,cdate,$jid)}] } else { return 1 } } proc annotations::cleanup_and_store_notes {xlib args} { variable notes set roster_jids {} foreach rjid [roster::get_jids $xlib] { lappend roster_jids [::xmpp::jid::stripResource $rjid] } foreach idx [array names notes $xlib,jid,*] { set jid $notes($idx) if {$jid ni $roster_jids || \ ![info exists notes($xlib,note,$jid)] || \ $notes($xlib,note,$jid) == ""} { catch { unset notes($xlib,jid,$jid) } catch { unset notes($xlib,cdate,$jid) } catch { unset notes($xlib,mdate,$jid) } catch { unset notes($xlib,note,$jid) } } } eval [list store_notes $xlib] $args } proc annotations::serialize_notes {xlib} { variable notes set notelist {} foreach idx [array names notes $xlib,jid,*] { set jid $notes($idx) if {![info exists notes($xlib,note,$jid)] || \ $notes($xlib,note,$jid) == ""} continue lappend notelist [list jid $jid \ cdate $notes($xlib,cdate,$jid) \ mdate $notes($xlib,mdate,$jid) \ note $notes($xlib,note,$jid)] } return $notelist } proc annotations::store_notes {xlib args} { set command [list [namespace current]::store_notes_result $xlib] foreach {opt val} $args { switch -- $opt { -command { set command $val } default { return -code error "Bad option \"$opt\":\ must be -command" } } } ::xmpp::roster::annotations::store $xlib [serialize_notes $xlib] \ -command $command } proc annotations::store_notes_result {xlib res child} { if {$res == "ok"} return if {[winfo exists .store_notes_error]} { destroy .store_notes_error } MessageDlg .store_notes_error -aspect 50000 -icon error \ -message [::msgcat::mc "Storing roster notes failed: %s" \ [error_to_string $child]] \ -type user -buttons ok -default 0 -cancel 0 } proc annotations::add_user_popup_info {infovar xlib jid} { variable notes upvar 0 $infovar info set bjid [::xmpp::jid::stripResource $jid] lassign [::roster::get_category_and_subtype $xlib $bjid] category subtype if {![::xmpp::jid::equal $bjid $jid] && $category ne "user"} { return } if {[info exists notes($xlib,note,$bjid)] && \ $notes($xlib,note,$bjid) != ""} { append info "\n\tNote:\t" append info [string map [list "\n" "\n\t\t"] "$notes($xlib,note,$bjid)"] if {0} { if {[info exists notes($xlib,cdate,$bjid)]} { append info [format "\n\tNote created: %s" \ [clock format $notes($xlib,cdate,$bjid) \ -format "%Y-%m-%d %T" -gmt false]] } if {[info exists notes($xlib,mdate,$bjid)]} { append info [format "\n\tNote modified: %s" \ [clock format $notes($xlib,mdate,$bjid) \ -format "%Y-%m-%d %T" -gmt false]] } } } } hook::add roster_user_popup_info_hook \ [namespace current]::annotations::add_user_popup_info 80 proc annotations::show_dialog {xlib jid} { variable notes set jid [::xmpp::jid::stripResource $jid] set allowed_name [jid_to_tag $jid] set w .note_edit_[psuffix $xlib]_$allowed_name if {[winfo exists $w]} { destroy $w } Dialog $w -title [::msgcat::mc "Edit roster notes for %s" $jid] \ -modal none -anchor e \ -default 0 -cancel 1 $w add -text [::msgcat::mc "Store"] \ -command [list [namespace current]::commit_changes $w $xlib $jid] $w add -text [::msgcat::mc "Cancel"] -command [list destroy $w] set f [$w getframe] if {[info exists notes($xlib,cdate,$jid)]} { Label $f.cdate -text [::msgcat::mc "Created: %s" \ [clock format $notes($xlib,cdate,$jid) \ -format "%Y-%m-%d %T" -gmt false]] pack $f.cdate -side top -anchor w } if {[info exists notes($xlib,mdate,$jid)]} { Label $f.mdate -text [::msgcat::mc "Modified: %s" \ [clock format $notes($xlib,mdate,$jid) \ -format "%Y-%m-%d %T" -gmt false]] pack $f.mdate -side top -anchor w } ScrolledWindow $f.sw pack $f.sw -side top -expand yes -fill both textUndoable $f.note -width 50 -height 5 -wrap word if {[info exists notes($xlib,note,$jid)]} { $f.note insert 0.0 $notes($xlib,note,$jid) } $f.sw setwidget $f.note bind [Wrapped $f.note] "[double% $w] invoke default break" bind $w { } bind $w "[double% $w] invoke default break" $w draw $f.note } proc annotations::commit_changes {w xlib jid} { variable notes set text [$w getframe].note set date [clock seconds] set notes($xlib,jid,$jid) $jid if {![info exists notes($xlib,cdate,$jid)]} { set notes($xlib,cdate,$jid) $date } set notes($xlib,mdate,$jid) $date set notes($xlib,note,$jid) [$text get 0.0 "end -1 char"] cleanup_and_store_notes $xlib destroy $w } proc annotations::prefs_user_menu {m xlib jid} { set rjid [roster::find_jid $xlib $jid] if {$rjid == ""} { set state disabled } else { set state normal } $m add command -label [::msgcat::mc "Edit item notes..."] \ -command [list [namespace current]::show_dialog $xlib $rjid] \ -state $state } hook::add chat_create_user_menu_hook \ [namespace current]::annotations::prefs_user_menu 76 hook::add roster_conference_popup_menu_hook \ [namespace current]::annotations::prefs_user_menu 76 hook::add roster_service_popup_menu_hook \ [namespace current]::annotations::prefs_user_menu 76 hook::add roster_jid_popup_menu_hook \ [namespace current]::annotations::prefs_user_menu 76 proc annotations::note_page {tab xlib jid editable} { variable notes if {$editable} return set bjid [::xmpp::jid::stripResource $jid] lassign [::roster::get_category_and_subtype $xlib $bjid] category subtype if {![::xmpp::jid::equal $bjid $jid] && $category ne "user"} { return } if {![info exists notes($xlib,note,$bjid)] || \ $notes($xlib,note,$bjid) == ""} { return } set notestab [$tab insert end notes -text [::msgcat::mc "Notes"]] set n [userinfo::pack_frame $notestab.notes [::msgcat::mc "Roster Notes"]] if {[info exists notes($xlib,cdate,$bjid)]} { Label $n.cdate -text [::msgcat::mc "Created: %s" \ [clock format $notes($xlib,cdate,$bjid) \ -format "%Y-%m-%d %T" -gmt false]] pack $n.cdate -side top -anchor w } if {[info exists notes($xlib,mdate,$bjid)]} { Label $n.mdate -text [::msgcat::mc "Modified: %s" \ [clock format $notes($xlib,mdate,$bjid) \ -format "%Y-%m-%d %T" -gmt false]] pack $n.mdate -side top -anchor w } set sw [ScrolledWindow $n.sw -scrollbar vertical] Text $n.text -height 12 -wrap word $sw setwidget $n.text $n.text insert 0.0 $notes($xlib,note,$bjid) $n.text configure -state disabled pack $sw -side top -fill both -expand yes pack $n -fill both -expand yes } hook::add userinfo_hook [namespace current]::annotations::note_page 40 # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/roster/backup.tcl000064400000000000000000000245331477701321300170300ustar00nobodynobody# backup.tcl -- # # Export/import of the roster items using an XML file. # This code provides basic framework for handling roster backup # files and it's able to serialize/deserialize regular roster contacts. # Hooks provided to facilitate implementations of storing/restoring # other kinds of data logically pertaining to the roster # such as conference bookmarks, annotations, etc. namespace eval rosterbackup { set ::NS(rosterbackup) http://tkabber.jabber.ru/contactlist hook::add connected_hook \ [namespace current]::setup_import_export_menus hook::add disconnected_hook \ [namespace current]::setup_import_export_menus hook::add finload_hook \ [namespace current]::setup_import_export_menus hook::add serialize_roster_hook \ [namespace current]::serialize_roster_contacts hook::add deserialize_roster_hook \ [namespace current]::deserialize_roster_contacts } ############################################################################### proc rosterbackup::setup_import_export_menus {args} { set rmenu [.mainframe getmenu roster] set elabel2 [::msgcat::mc "Export roster"] set ilabel2 [::msgcat::mc "Import roster"] set elabel1 $elabel2... set ilabel1 $ilabel2... catch {$rmenu delete $elabel1} catch {$rmenu delete $ilabel1} catch {$rmenu delete $elabel2} catch {$rmenu delete $ilabel2} set index [$rmenu index [::msgcat::mc "Add group by regexp on JIDs..."]] set emenu .export_roster set imenu .import_roster if {[winfo exists $emenu]} { destroy $emenu } if {[winfo exists $imenu]} { destroy $imenu } switch -- [llength [connections]] { 0 { $rmenu insert $index command -label $ilabel1 -state disabled $rmenu insert $index command -label $elabel1 -state disabled } 1 { set xlib [lindex [connections] 0] $rmenu insert $index command -label $ilabel1 -state normal \ -command [namespace code [list import_from_file $xlib]] $rmenu insert $index command -label $elabel1 -state normal \ -command [namespace code [list export_to_file $xlib]] } default { menu $emenu -tearoff $::ifacetk::options(show_tearoffs) menu $imenu -tearoff $::ifacetk::options(show_tearoffs) $rmenu insert $index cascade -label $ilabel2 -state normal \ -menu $imenu $rmenu insert $index cascade -label $elabel2 -state normal \ -menu $emenu foreach xlib [connections] { set jid [connection_jid $xlib] $emenu add command -label [::msgcat::mc "Export roster for %s..." $jid] \ -command [namespace code [list export_to_file $xlib]] $imenu add command -label [::msgcat::mc "Import roster for %s..." $jid] \ -command [namespace code [list import_from_file $xlib]] } } } } ############################################################################### proc rosterbackup::export_to_file {xlib} { set filename [tk_getSaveFile \ -initialdir $::configdir \ -initialfile [connection_user $xlib]-roster.xml \ -filetypes [list \ [list [::msgcat::mc "Roster files"] \ .xml] \ [list [::msgcat::mc "All files"] *]]] if {$filename == ""} return set fd [open $filename w] fconfigure $fd -encoding utf-8 puts $fd {} puts $fd [serialize_roster $xlib] close $fd } ############################################################################### proc rosterbackup::serialize_roster {xlib} { global NS set subtags [list] hook::run serialize_roster_hook $xlib #[info level] subtags ::xmpp::xml::toTabbedText [::xmpp::xml::create contactlist \ -xmlns $NS(rosterbackup) \ -subelements $subtags] } ############################################################################### proc rosterbackup::serialize_roster_contacts {xlib level varName} { upvar $level $varName subtags set items [list] foreach jid [::roster::get_jids $xlib] { set category [::roster::itemconfig $xlib $jid -category] switch -- $category { user - gateway { lappend items [::roster::item_to_xml $xlib $jid] } } } lappend subtags [::xmpp::xml::create roster \ -xmlns jabber:iq:roster \ -subelements $items] } ############################################################################### proc rosterbackup::import_from_file {xlib} { set filename [tk_getOpenFile \ -initialdir $::configdir \ -initialfile [connection_user $xlib]-roster.xml \ -filetypes [list \ [list [::msgcat::mc "Roster files"] \ .xml] \ [list [::msgcat::mc "All files"] *]]] if {$filename == ""} return set fd [open $filename r] fconfigure $fd -encoding utf-8 set xml [string trimleft [read $fd] [format %c 0xFEFF]] ;# strip BOM, if any close $fd deserialize_roster $xlib $xml } ############################################################################### proc rosterbackup::deserialize_roster {xlib data} { hook::run roster_deserializing_hook $xlib ::xmpp::xml::parseData $data [namespace code [list parse_roster_xml $xlib]] hook::run roster_deserialized_hook $xlib } ############################################################################### proc rosterbackup::parse_roster_xml {xlib data} { global NS ::xmpp::xml::split $data tag xmlns attrs cdata subels if {![string equal $tag contactlist]} { return -code error "Bad root element \"$tag\": must be contactlist" } if {![string equal $xmlns $NS(rosterbackup)]} { return -code error "Bad root element namespace \"$xmlns\":\ must be \"$NS(rosterbackup)\"" } set tuples [list] hook::run deserialize_roster_hook $xlib $subels #[info level] tuples if {[llength $tuples] > 0} { set scripts [list] foreach tuple [lsort -integer -index 0 $tuples] { lappend scripts [lindex $tuple 1] } [namespace current]::run_deserialization_scripts $scripts } } ############################################################################### proc rosterbackup::run_deserialization_scripts {scripts} { if {[llength $scripts] == 0} return uplevel #0 [linsert [lindex $scripts 0] end \ [list [lindex [info level 0] 0] [lrange $scripts 1 end]]] } ############################################################################### proc rosterbackup::deserialize_roster_contacts {xlib data level varName} { global NS upvar $level $varName handlers array set existing {} foreach jid [::roster::get_jids $xlib] { set existing($jid) {} } upvar 0 sent($xlib,jids) jids set jids [list] set subtags [list] foreach item $data { ::xmpp::xml::split $item tag xmlns attrs cdata subels if {![string equal $tag roster]} continue if {![string equal $xmlns jabber:iq:roster]} { return -code error "Bad roster element namespace \"$xmlns\":\ must be \"jabber:iq:roster\"" } foreach subel $subels { set jid [get_item_jid $subel] if {![info exists existing($jid)]} { lappend jids $jid lappend subtags $subel } } } if {[llength $subtags] > 0} { lappend handlers [list 50 [namespace code [list \ send_contacts $xlib $subtags]]] } lappend handlers [list 1000 [namespace code [list \ show_restore_completion_dialog $xlib]]] } ############################################################################### proc rosterbackup::get_item_jid {data} { ::xmpp::xml::split $data tag xmlns attrs cdata subels ::xmpp::xml::getAttr $attrs jid } ############################################################################### proc rosterbackup::send_contacts {xlib contacts continuation} { global NS set contact [lindex $contacts 0] ::xmpp::sendIQ $xlib set \ -query [::xmpp::xml::create query \ -xmlns jabber:iq:roster \ -subelement $contact] \ -command [namespace code [list process_send_result $xlib \ [lrange $contacts 1 end] \ [get_item_jid $contact] \ $continuation]] } ############################################################################### proc rosterbackup::process_send_result {xlib contacts jid continuation result xmldata} { switch -- $result { ok { if {[llength $contacts] > 0} { send_contacts $xlib $contacts $continuation } else { eval $continuation } } default { # TODO check whether do we need to handle TIMEOUT specially NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "Error importing roster contact %s: %s" \ $jid [error_to_string $xmldata]] } } } ############################################################################### proc rosterbackup::show_restore_completion_dialog {xlib continuation} { NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon info \ -title [::msgcat::mc "Information"] \ -message [::msgcat::mc "Roster import for %s is completed" \ [connection_bare_jid $xlib]] eval $continuation } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/roster/bkup_annotations.tcl000064400000000000000000000057161477701321300211430ustar00nobodynobody# bkup_annotations.tcl -- # # Support for backup/restore of "annotations" (XEP-0145) # for roster items. # # Depends on: annotations.tcl, backup.tcl namespace eval annobackup { # Should probably go after the roster contacts, so we set prio to 60: hook::add serialize_roster_hook \ [namespace current]::serialize_annotations 60 hook::add deserialize_roster_hook \ [namespace current]::deserialize_annotations 60 } ############################################################################### proc annobackup::serialize_annotations {xlib level varName} { upvar $level $varName subtags global NS set xmldata [::xmpp::roster::annotations::serialize \ [::plugins::annotations::serialize_notes $xlib]] lappend subtags [::xmpp::xml::create privstorage \ -xmlns jabber:iq:private \ -subelement $xmldata] } ############################################################################### proc annobackup::deserialize_annotations {xlib data level varName} { global NS upvar $level $varName handlers set notes [list] foreach item $data { ::xmpp::xml::split $item tag xmlns attrs cdata subels if {![string equal $tag privstorage]} continue if {![string equal $xmlns jabber:iq:private]} { return -code error "Bad roster element namespace \"$xmlns\":\ must be \"jabber:iq:private\"" } set notes [concat $notes \ [::xmpp::roster::annotations::deserialize $subels]] } if {[llength $notes] > 0} { lappend handlers [list 60 [namespace code [list \ send_notes $xlib $notes]]] } } ############################################################################### proc annobackup::send_notes {xlib notes continuation} { set updated 0 foreach item $notes { set added [::plugins::annotations::create_note \ $xlib $item -merge yes] set updated [expr {$updated || $added}] } if {$updated} { ::plugins::annotations::cleanup_and_store_notes $xlib \ -command [namespace code [list process_sending_result $continuation]] } else { eval $continuation } } ############################################################################### proc annobackup::process_sending_result {continuation result xmldata} { switch -- $result { ok { eval $continuation } default { # TODO check whether do we need to handle TIMEOUT specially NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "Error restoring annotations: %s" \ [error_to_string $xmldata]] } } } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/roster/bkup_conferences.tcl000064400000000000000000000076221477701321300210760ustar00nobodynobody# bkup_conferences.tcl -- # # Support for backup/restore of "roster bookmarks" to MUC rooms # (XEP-0048, v1.0) # # Depends on: # conferences.tcl, backup.tcl namespace eval mucbackup { # Should probably go after the roster contacts, so we set prio to 70: hook::add serialize_roster_hook \ [namespace current]::serialize_muc_bookmarks 70 hook::add deserialize_roster_hook \ [namespace current]::deserialize_muc_bookmarks 70 } ############################################################################### proc mucbackup::serialize_muc_bookmarks {xlib level varName} { upvar $level $varName subtags global NS lassign [::plugins::conferences::serialize_bookmarks $xlib] \ bookmarks groupstag lappend subtags [::xmpp::xml::create privstorage \ -xmlns jabber:iq:private \ -subelement \ [::xmpp::roster::bookmarks::serialize \ $bookmarks]] lappend subtags [::xmpp::xml::create privstorage \ -xmlns jabber:iq:private \ -subelement $groupstag] } ############################################################################### proc mucbackup::deserialize_muc_bookmarks {xlib data level varName} { global NS upvar $level $varName handlers set bookmarks [list] set bmgroups [list] foreach item $data { ::xmpp::xml::split $item tag xmlns attrs cdata subels if {![string equal $tag privstorage]} continue if {![string equal $xmlns $NS(private)]} { return -code error "Bad roster element namespace \"$xmlns\":\ must be \"$NS(private)\"" } set bookmarks [concat $bookmarks \ [::xmpp::roster::bookmarks::deserialize $subels]] foreach storage $subels { ::xmpp::xml::split $storage stag sxmlns sattrs scdata ssubels if {![string equal $stag storage] || \ ![string equal $sxmlns tkabber:bookmarks:groups]} continue set bmgroups [concat $bmgroups $ssubels] } } if {[llength $bookmarks] > 0 || [llength $bmgroups] > 0} { lappend handlers [list 70 [namespace code [list \ merge_muc_bookmarks $xlib $bookmarks $bmgroups]]] } } ############################################################################### proc mucbackup::merge_muc_bookmarks {xlib bookmarks bmgroups continuation} { variable updated 0 foreach item $bookmarks { set added [::plugins::conferences::create_muc_bookmark \ $xlib $item -merge yes] set updated [expr {$updated || $added}] } foreach item $bmgroups { set added [::plugins::conferences::create_muc_bmgroup \ $xlib $item -merge yes] set updated [expr {$updated || $added}] } if {$updated} { ::plugins::conferences::store_bookmarks $xlib \ -command [namespace code [list process_merging_result $continuation]] ::plugins::conferences::push_bookmarks_to_roster $xlib } else { eval $continuation } } ############################################################################### proc mucbackup::process_merging_result {continuation result xmldata} { switch -- $result { ok { eval $continuation } default { # TODO check whether TIMEOUT should be processed separately NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "Error restoring conference bookmarks: %s" \ [error_to_string $xmldata]] } } } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/roster/bkup_metacontacts.tcl000064400000000000000000000057331477701321300212720ustar00nobodynobody# bkup_metacontacts.tcl -- # # Support for backup/restore of metacontacts (XEP-0209) # for roster items. namespace eval metabackup { # Should probably go after the roster contacts, so we set prio to 60: hook::add serialize_roster_hook \ [namespace current]::serialize_metacontacts 60 hook::add deserialize_roster_hook \ [namespace current]::deserialize_metacontacts 60 } ############################################################################### proc metabackup::serialize_metacontacts {xlib level varName} { upvar $level $varName subtags global NS set xmldata [::xmpp::roster::metacontacts::serialize \ [::plugins::metacontacts::serialize_contacts $xlib]] lappend subtags [::xmpp::xml::create privstorage \ -xmlns jabber:iq:private \ -subelement $xmldata] } ############################################################################### proc metabackup::deserialize_metacontacts {xlib data level varName} { global NS upvar $level $varName handlers set contacts [list] foreach item $data { ::xmpp::xml::split $item tag xmlns attrs cdata subels if {![string equal $tag privstorage]} continue if {![string equal $xmlns jabber:iq:private]} { return -code error "Bad roster element namespace \"$xmlns\":\ must be \"jabber:iq:private\"" } set contacts [concat $contacts \ [::xmpp::roster::metacontacts::deserialize $subels]] } if {[llength $contacts] > 0} { lappend handlers [list 60 [namespace code [list \ send_contacts $xlib $contacts]]] } } ############################################################################### proc metabackup::send_contacts {xlib contacts continuation} { set updated 0 foreach {tag jids} $contacts { set added [::plugins::metacontacts::create_contact \ $xlib $tag $jids -merge yes] set updated [expr {$updated || $added}] } if {$updated} { ::plugins::metacontacts::store_contacts $xlib \ -command [namespace code [list process_sending_result $continuation]] } else { eval $continuation } } ############################################################################### proc metabackup::process_sending_result {continuation result xmldata} { switch -- $result { ok { eval $continuation } default { # TODO check whether do we need to handle TIMEOUT specially NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "Error restoring metacontacts: %s" \ [error_to_string $xmldata]] } } } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/roster/cache_categories.tcl000064400000000000000000000054331477701321300210310ustar00nobodynobody# cache_categories.tcl # # This file is a part of the Tkabber XMPP client. It's a plugin which # implements caching servers' categories and type (using service # discovery, XEP-0030). It's useful for displaying transports and # their contacts in roster. namespace eval cache_categories { # {server1 {category1 type1} server2 {category2 type2}} custom::defvar category_and_subtype_list {} \ [::msgcat::mc "Cached service categories and types (from disco#info)."] \ -type string -group Hidden variable requested_categories } ############################################################################## proc cache_categories::fill_cached_categories_and_subtypes {xlib} { variable category_and_subtype_list variable requested_categories catch { array set tmp $category_and_subtype_list } set requested_categories($xlib) [array names tmp] foreach jid [array names tmp] { lassign $tmp($jid) category subtype roster::override_category_and_subtype $xlib $jid \ $category $subtype } } hook::add connected_hook \ [namespace current]::cache_categories::fill_cached_categories_and_subtypes 5 ############################################################################## proc cache_categories::free_cached_categories_and_subtypes {xlib} { variable category_and_subtype_list variable requested_categories catch { unset requested_categories($xlib) } } hook::add disconnected_hook \ [namespace current]::cache_categories::free_cached_categories_and_subtypes ############################################################################## proc cache_categories::request_category_and_subtype {xlib jid} { variable category_and_subtype_list variable requested_categories set server [::xmpp::jid::server $jid] if {$server in $requested_categories($xlib)} { return } lappend requested_categories($xlib) $server ::disco::request_info $xlib $server \ -cache yes \ -command [namespace code [list parse_requested_categories \ $xlib $server]] } ############################################################################## proc cache_categories::parse_requested_categories \ {xlib server status identities features extras} { variable category_and_subtype_list if {$status != "ok"} return foreach identity $identities { set category [::xmpp::xml::getAttr $identity category] set type [::xmpp::xml::getAttr $identity type] roster::override_category_and_subtype $xlib $server $category $type lappend category_and_subtype_list $server [list $category $type] ::redraw_roster break } } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/roster/conferenceinfo.tcl000064400000000000000000000142521477701321300205430ustar00nobodynobody# conferenceinfo.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # periodically requests the participants lists for the conference in # roster to show them in the conference popup info balloon. namespace eval conferenceinfo { custom::defgroup ConferenceInfo \ [::msgcat::mc "Options for Conference Info module, that allows you\ to see list of participants in roster popup,\ regardless of whether you are currently joined\ with the conference."] \ -group Plugins \ -tag "Conference Info" custom::defvar options(autoask) 0 \ [::msgcat::mc "Use this module"] -group ConferenceInfo -type boolean \ -command [namespace current]::ask custom::defvar options(interval) 2 \ [::msgcat::mc "Interval (in minutes) between requests of participants list."] \ -type integer -group ConferenceInfo custom::defvar options(err_interval) 60 \ [::msgcat::mc "Interval (in minutes) after error reply on request of participants list."] \ -type integer -group ConferenceInfo } # TODO: xlib proc conferenceinfo::add_user_popup_info {infovar xlib jid} { variable data variable options upvar 0 $infovar info if {!$options(autoask)} return if {[chat::is_opened [chat::chatid $xlib $jid]]} return if {![info exists data(error_browse,$jid)] || \ ![info exists data(error_disco,$jid)]} return if {$data(error_disco,$jid) != "" && $data(error_browse,$jid) != ""} { if {$data(error_browse_code,$jid) != "feature-not-implemented" && \ $data(error_browse_code,$jid) != "service-unavailable"} { set errstr $data(error_browse,$jid) } else { set errstr $data(error_disco,$jid) } append info [::msgcat::mc "\n\tCan't browse: %s" $errstr] } else { if {$data(error_browse,$jid) == ""} { set mech browse } else { set mech disco } if {$data(users_$mech,$jid) != {}} { append info \ [::msgcat::mc "\nRoom participants at %s:" \ [clock format $data(time_$mech,$jid) -format %R]] foreach name $data(users_$mech,$jid) { append info "\n\t$name" } } else { append info \ [::msgcat::mc "\nRoom is empty at %s" \ [clock format $data(time_$mech,$jid) -format %R]] } } } hook::add roster_user_popup_info_hook \ [namespace current]::conferenceinfo::add_user_popup_info proc conferenceinfo::ask {args} { variable options variable data if {!$options(autoask)} return foreach xlib [connections] { if {[catch { set ::roster::roster(jids,$xlib) } jids]} { continue } foreach jid $jids { lassign [roster::get_category_and_subtype $xlib $jid] \ category type if {$category == "conference" && [::xmpp::jid::node $jid] != "" && \ ![chat::is_opened [chat::chatid $xlib $jid]]} { set sec [clock seconds] if {![info exists data(error_browse,$jid)] || \ $data(error_browse,$jid) == "" || \ $sec - $data(time_browse,$jid) >= $options(err_interval) * 60} { ::xmpp::sendIQ $xlib get \ -query [::xmpp::xml::create query \ -xmlns jabber:iq:browse] \ -to $jid \ -command [list [namespace current]::receive $jid browse] } if {![info exists data(error_disco,$jid)] || \ $data(error_disco,$jid) == "" || \ $sec - $data(time_disco,$jid) >= $options(err_interval) * 60} { ::disco::request_items $xlib $jid \ -command [list [namespace current]::receive $jid disco] } } } } after cancel [list [namespace current]::ask] after [expr {$options(interval) * 60 * 1000}] [list [namespace current]::ask] } proc conferenceinfo::receive {jid mech status xml} { variable options variable data set data(error_$mech,$jid) "" set data(error_${mech}_code,$jid) "" set data(time_$mech,$jid) [clock seconds] set data(users_$mech,$jid) {} if {$status != "ok"} { set data(error_${mech}_code,$jid) [lindex [error_type_condition $xml] 1] set data(error_$mech,$jid) [error_to_string $xml] return } switch -- $mech { browse { ::xmpp::xml::split $xml tag xmlns attrs cdata subels foreach item $subels { ::xmpp::xml::split $item stag sxmlns sattrs scdata ssubels set category [::xmpp::xml::getAttr $sattrs category] set name [::xmpp::xml::getAttr $sattrs name] if {$stag == "user" || ($stag == "item" && $category == "user")} { if {$name != ""} { lappend data(users_browse,$jid) $name } } } } disco { foreach item $xml { set name [::xmpp::xml::getAttr $item name] set node [::xmpp::xml::getAttr $item node] if {$name != "" && $node == ""} { lappend data(users_disco,$jid) $name } } } } set data(users_$mech,$jid) [lsort -dictionary $data(users_$mech,$jid)] } proc conferenceinfo::stop {args} { if {[llength [connections]] == 0} { after cancel [list [namespace current]::ask] } } hook::add roster_end_hook [namespace current]::conferenceinfo::ask hook::add disconnected_hook [namespace current]::conferenceinfo::stop proc conferenceinfo::setup_menu {} { set m [.mainframe getmenu roster] $m add checkbutton \ -label [::msgcat::mc "Periodically browse roster conferences"] \ -variable [namespace current]::options(autoask) } hook::add finload_hook [namespace current]::conferenceinfo::setup_menu # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/roster/conferences.tcl000064400000000000000000000721321477701321300200530ustar00nobodynobody# conferences.tcl -- # # Bookmarks (XEP-0048) support (conference bookmarks in roster) # # In addition to XEP-0048, Tkabber stores roster groups using # proprietory namespace tkabber:bookmarks:groups inside # jabber:iq:private storage (XEP-0049) # # tkabber:bookmarks:groups description: # # setting: # # # # # Conferences # jabber.ru # # # # # # getting: # # # # # # package require xmpp::roster::bookmarks namespace eval conferences { # variable to store roster conference bookmarks variable bookmarks array set bookmarks {} set ::NS(tkabber:groups) "tkabber:bookmarks:groups" custom::defvar options(ignore_autojoin) 0 \ [::msgcat::mc "Ignore autojoin option and do not automatically join\ conference rooms on login."] \ -type boolean -group Chat custom::defvar options(roster_group) [::msgcat::mc "Conferences"] \ [::msgcat::mc "Default group for conferences in roster."] \ -type string -group Hidden } ############################################################################### # # Free bookmarks on disconnect # proc conferences::free_bookmarks {xlib} { variable bookmarks array unset bookmarks $xlib,* } hook::add disconnected_hook [namespace current]::conferences::free_bookmarks ############################################################################### # # Retrieve bookmarks on connect # proc conferences::request_bookmarks {xlib} { variable bookmarks variable responds set responds($xlib) 0 array unset bookmarks $xlib,* set bookmarks($xlib) {} ::xmpp::roster::bookmarks::retrieve $xlib \ -command [list [namespace current]::process_bookmarks $xlib] ::xmpp::private::retrieve $xlib [list [::xmpp::xml::create storage \ -xmlns $::NS(tkabber:groups)]] \ -command [list [namespace current]::process_groups $xlib] } hook::add connected_hook [namespace current]::conferences::request_bookmarks 20 proc conferences::process_bookmarks {xlib status bmlist} { variable bookmarks variable responds global NS if {$status != "ok"} return incr responds($xlib) foreach bookmark $bmlist { create_muc_bookmark $xlib $bookmark } if {$responds($xlib) < 2} return push_bookmarks_to_roster $xlib after idle [list [namespace current]::autojoin_groups $xlib] } proc conferences::process_groups {xlib status xmlList} { variable bookmarks variable responds global NS if {$status != "ok"} return incr responds($xlib) foreach xml $xmlList { ::xmpp::xml::split $xml tag xmlns attrs cdata subels if {$xmlns == $NS(tkabber:groups)} { foreach bookmark $subels { create_muc_bmgroup $xlib $bookmark } } } if {$responds($xlib) < 2} return push_bookmarks_to_roster $xlib after idle [list [namespace current]::autojoin_groups $xlib] } proc conferences::create_muc_bookmark {xlib bookmark args} { variable bookmarks set merge 0 foreach {opt val} $args { switch -- $opt { -merge { set merge $val } default { return -code error "Bad option \"$opt\": must be -merge" } } } array set n $bookmark set jid [::xmpp::jid::normalize $n(jid)] if {$merge && [info exists bookmarks($xlib,jid,$jid)]} { return 0 } else { if {$jid ni $bookmarks($xlib)} { lappend bookmarks($xlib) $jid } set bookmarks($xlib,jid,$jid) $jid set bookmarks($xlib,name,$jid) "" set bookmarks($xlib,nick,$jid) "" set bookmarks($xlib,password,$jid) "" set bookmarks($xlib,autojoin,$jid) 0 if {[info exists n(name)]} { set bookmarks($xlib,name,$jid) $n(name) } if {[info exists n(nick)]} { set bookmarks($xlib,nick,$jid) $n(nick) } if {[info exists n(password)]} { set bookmarks($xlib,password,$jid) $n(password) } if {[info exists n(autojoin)]} { set bookmarks($xlib,autojoin,$jid) $n(autojoin) } if {![info exists bookmarks($xlib,groups,$jid)]} { set bookmarks($xlib,groups,$jid) {} set bookmarks($xlib,hasgroups,$jid) 0 } else { set bookmarks($xlib,hasgroups,$jid) 1 } return 1 } } proc conferences::create_muc_bmgroup {xlib xmldata args} { variable bookmarks set merge 0 foreach {opt val} $args { switch -- $opt { -merge { set merge $val } default { return -code error "Bad option \"$opt\":\ must be -merge" } } } ::xmpp::xml::split $xmldata tag xmlns attrs cdata subels if {![string equal $tag conference]} return set jid [::xmpp::jid::normalize [::xmpp::xml::getAttr $attrs jid]] set groups [list] foreach subel $subels { ::xmpp::xml::split $subel stag sxmlns sattrs scdata ssubels if {[string equal $stag group]} { lappend groups $scdata } } if {$merge && [info exists bookmarks($xlib,jid,$jid)] && $bookmarks($xlib,hasgroups,$jid)} { return 0 } else { set bookmarks($xlib,groups,$jid) $groups set bookmarks($xlib,hasgroups,$jid) 1 return 1 } } proc conferences::push_bookmarks_to_roster {xlib} { variable bookmarks foreach idx [array names bookmarks $xlib,jid,*] { set jid $bookmarks($idx) client:roster_push $xlib $jid \ -name $bookmarks($xlib,name,$jid) \ -groups $bookmarks($xlib,groups,$jid) \ -subscription bookmark roster::override_category_and_subtype $xlib $jid conference "" } } ############################################################################### # # Store bookmarks # proc conferences::serialize_bookmarks {xlib} { variable bookmarks set bookmarklist {} set grouplist {} foreach jid $bookmarks($xlib) { set name $bookmarks($xlib,name,$jid) set autojoin $bookmarks($xlib,autojoin,$jid) set vars [list jid $jid name $name autojoin $autojoin] if {$bookmarks($xlib,nick,$jid) != ""} { lappend vars nick $bookmarks($xlib,nick,$jid) } if {$bookmarks($xlib,password,$jid) != ""} { lappend vars password $bookmarks($xlib,password,$jid) } lappend bookmarklist $vars set vars [list jid $jid] set groups {} foreach group $bookmarks($xlib,groups,$jid) { lappend groups [::xmpp::xml::create group \ -cdata $group] } lappend grouplist [::xmpp::xml::create conference \ -attrs $vars \ -subelements $groups] } return [list $bookmarklist \ [::xmpp::xml::create storage \ -xmlns $::NS(tkabber:groups) \ -subelements $grouplist]] } proc conferences::store_bookmarks {xlib args} { set command [list [namespace current]::store_bookmarks_result $xlib] foreach {opt val} $args { switch -- $opt { -command { set command $val } default { return -code error "Bad option \"$opt\":\ must be -command" } } } lassign [serialize_bookmarks $xlib] bookmarks groups ::xmpp::roster::bookmarks::store $xlib $bookmarks -command $command ::xmpp::private::store $xlib [list $groups] -command $command } proc conferences::store_bookmarks_result {xlib res child} { if {$res == "ok"} return if {[winfo exists .store_bookmarks_error]} { return } MessageDlg .store_bookmarks_error -aspect 50000 -icon error \ -message [::msgcat::mc "Storing conferences failed: %s" \ [error_to_string $child]] \ -type user -buttons ok -default 0 -cancel 0 } ############################################################################### # # Menu item for conference window # proc conferences::add_conference_menu_item {m xlib jid} { set chatid [chat::chatid $xlib $jid] if {[info exists ::muc::muc_password($chatid)]} { set password $::muc::muc_password($chatid) } else { set password "" } $m add command -label [::msgcat::mc "Add conference to roster..."] \ -command [list [namespace current]::add_conference_dialog $xlib \ -group [::xmpp::jid::node $jid] \ -server [::xmpp::jid::server $jid] \ -password $password] } hook::add chat_create_conference_menu_hook \ [namespace current]::conferences::add_conference_menu_item 35 ############################################################################### # # Add conference to roster dialog # proc conferences::add_conference_dialog {xlib args} { variable options variable gra_group variable gra_server variable gra_nick variable gra_password variable gra_autojoin variable gra_xlib if {[llength [connections]] == 0} return set gw .addgroup catch { destroy $gw } if {$xlib == ""} { set xlib [lindex [connections] 0] } set gra_server conference.[connection_server $xlib] set gra_group "" set gra_password "" set gra_autojoin 0 catch { unset gra_nick } foreach {key val} $args { switch -- $key { -group { set gra_group $val } -server { set gra_server $val } -nick { set gra_nick $val } -password { set gra_password $val } -autojoin { set gra_autojoin $val } } } if {![info exists gra_nick]} { set gra_nick [get_group_nick $xlib [::xmpp::jid::jid $gra_group $gra_server]] } set gra_xlib [connection_jid $xlib] Dialog $gw -title [::msgcat::mc "Add Conference to Roster"] -anchor e \ -default 0 -cancel 1 -modal none set gf [$gw getframe] grid columnconfigure $gf 0 -weight 0 grid columnconfigure $gf 1 -weight 1 Label $gf.lgroup -text [::msgcat::mc "Conference:"] Entry $gf.group -textvariable [namespace current]::gra_group Label $gf.lserver -text [::msgcat::mc "Server:"] Entry $gf.server -textvariable [namespace current]::gra_server Label $gf.lnick -text [::msgcat::mc "Nick:"] Entry $gf.nick -textvariable [namespace current]::gra_nick Label $gf.lpassword -text [::msgcat::mc "Password:"] Entry $gf.password -show * -textvariable [namespace current]::gra_password Checkbutton $gf.autojoin -text [::msgcat::mc "Automatically join conference upon connect"] \ -variable [namespace current]::gra_autojoin Label $gf.lrostergroup -text [::msgcat::mc "Roster group:"] Combobox $gf.rostergroup -textvariable [namespace current]::options(roster_group) \ -values [get_groups $xlib] grid $gf.lgroup -row 0 -column 0 -sticky e grid $gf.group -row 0 -column 1 -sticky ew grid $gf.lserver -row 1 -column 0 -sticky e grid $gf.server -row 1 -column 1 -sticky ew grid $gf.lnick -row 2 -column 0 -sticky e grid $gf.nick -row 2 -column 1 -sticky ew grid $gf.lpassword -row 3 -column 0 -sticky e grid $gf.password -row 3 -column 1 -sticky ew grid $gf.autojoin -row 4 -column 0 -sticky w -columnspan 2 grid $gf.lrostergroup -row 5 -column 0 -sticky e grid $gf.rostergroup -row 5 -column 1 -sticky ew if {[llength [connections]] > 1} { foreach c [connections] { lappend connections [connection_jid $c] } Label $gf.lconnection -text [::msgcat::mc "Connection:"] Combobox $gf.connection -textvariable [namespace current]::gra_xlib \ -values $connections -editable 0 \ -modifycmd [list [namespace current]::change_groups \ $gf.rostergroup] grid $gf.lconnection -row 6 -column 0 -sticky e grid $gf.connection -row 6 -column 1 -sticky ew } $gw add -text [::msgcat::mc "Add"] -command [list [namespace current]::add_conference $gw] $gw add -text [::msgcat::mc "Cancel"] -command [list destroy $gw] $gw draw $gf.group } proc conferences::change_groups {combo args} { variable gra_xlib foreach xlib [connections] { if {[connection_jid $xlib] == $gra_xlib} { $combo configure -values [get_groups $xlib] return } } } proc conferences::get_groups {xlib} { return [roster::get_groups $xlib \ -nested $::ifacetk::roster::options(nested) \ -delimiter $::ifacetk::roster::options(nested_delimiter) \ -undefined 0] } proc conferences::add_conference {gw} { variable options variable bookmarks variable gra_group variable gra_server variable gra_nick variable gra_password variable gra_autojoin variable gra_xlib destroy $gw set jid [::xmpp::jid::normalize ${gra_group}@$gra_server] if {$options(roster_group) == ""} { set groups {} } else { set groups [list $options(roster_group)] } foreach c [connections] { if {[connection_jid $c] == $gra_xlib} { set xlib $c } } if {![info exists xlib]} { # Disconnect while dialog is opened return } if {[info exists bookmarks($xlib,jid,$jid)]} { update_bookmark $xlib $jid -name $gra_group -nick $gra_nick \ -password $gra_password -autojoin $gra_autojoin \ -groups $groups } else { add_bookmark $xlib $jid -name $gra_group -nick $gra_nick \ -password $gra_password -autojoin $gra_autojoin \ -groups $groups } } ############################################################################### # # Add bookmark to roster # proc conferences::add_bookmark {xlib jid args} { variable bookmarks if {[info exists bookmarks($xlib,jid,$jid)]} return foreach {key val} $args { switch -- $key { -name { set name $val } -nick { set nick $val } -password { set password $val } -autojoin { set autojoin $val } -groups { set groups $val } } } if {![info exists name]} { set name [::xmpp::jid::node $jid] } if {![info exists nick]} { set nick [get_group_nick $xlib $jid] } if {![info exists password]} { set password "" } if {![info exists autojoin]} { set autojoin 0 } if {![info exists groups]} { set groups {} } if {$jid ni $bookmarks($xlib)} { lappend bookmarks($xlib) $jid } set bookmarks($xlib,jid,$jid) $jid set bookmarks($xlib,name,$jid) $name set bookmarks($xlib,nick,$jid) $nick set bookmarks($xlib,password,$jid) $password set bookmarks($xlib,autojoin,$jid) $autojoin set bookmarks($xlib,groups,$jid) $groups set bookmarks($xlib,hasgroups,$jid) 1 # TODO should we remove $jid from the roster if it is here? client:roster_push $xlib $jid \ -name $name \ -groups $groups \ -subscription bookmark roster::override_category_and_subtype $xlib $jid conference "" store_bookmarks $xlib } ############################################################################### # # Update bookmark in roster # proc conferences::update_bookmark {xlib jid args} { variable bookmarks set store 0 foreach {key val} $args { switch -- $key { -name { set name $val } -nick { set nick $val } -password { set password $val } -autojoin { set autojoin $val } -groups { set groups $val } } } if {[info exists name] && $name != $bookmarks($xlib,name,$jid)} { set bookmarks($xlib,name,$jid) $name set store 1 } if {[info exists nick] && $nick != $bookmarks($xlib,nick,$jid)} { set bookmarks($xlib,nick,$jid) $nick set store 1 } if {[info exists password] && $password != $bookmarks($xlib,password,$jid)} { set bookmarks($xlib,password,$jid) $password set store 1 } if {[info exists autojoin] && $autojoin != $bookmarks($xlib,autojoin,$jid)} { set bookmarks($xlib,autojoin,$jid) $autojoin set store 1 } if {[info exists groups] && [lsort $groups] != [lsort $bookmarks($xlib,groups,$jid)]} { set bookmarks($xlib,groups,$jid) $groups set store 1 } if {$store} { client:roster_push $xlib $jid \ -name $bookmarks($xlib,name,$jid) \ -groups $bookmarks($xlib,groups,$jid) \ -subscription bookmark roster::override_category_and_subtype $xlib $jid conference "" store_bookmarks $xlib } } ############################################################################### # # Add or update item in roster # proc conferences::send_bookmark {xlib jid} { if {[roster::itemconfig $xlib $jid -subsc] != "bookmark"} return set groups [roster::itemconfig $xlib $jid -group] add_bookmark $xlib $jid -groups $groups update_bookmark $xlib $jid -groups $groups return stop } hook::add roster_send_item_hook [namespace current]::conferences::send_bookmark ############################################################################### # # Remove bookmark from roster # proc conferences::remove_bookmark {xlib jid} { variable bookmarks if {[roster::itemconfig $xlib $jid -subsc] != "bookmark"} return if {![info exists bookmarks($xlib,jid,$jid)]} return client:roster_push $xlib $jid \ -name $bookmarks($xlib,name,$jid) \ -groups $bookmarks($xlib,groups,$jid) \ -subscription remove if {[set idx [lsearch -exact $bookmarks($xlib) $jid]] >= 0} { set bookmarks($xlib) [lreplace $bookmarks($xlib) $idx $idx] } catch { unset bookmarks($xlib,jid,$jid) } catch { unset bookmarks($xlib,name,$jid) } catch { unset bookmarks($xlib,nick,$jid) } catch { unset bookmarks($xlib,password,$jid) } catch { unset bookmarks($xlib,autojoin,$jid) } catch { unset bookmarks($xlib,groups,$jid) } catch { unset bookmarks($xlib,hasgroups,$jid) } store_bookmarks $xlib return stop } hook::add roster_remove_item_hook \ [namespace current]::conferences::remove_bookmark ############################################################################### # # Rename group in roster bookmarks # proc conferences::rename_group {xlib name new_name} { variable bookmarks set store 0 foreach idx [array names bookmarks $xlib,jid,*] { set jid $bookmarks($idx) set groups $bookmarks($xlib,groups,$jid) if {$name in $groups || \ ($name == $::roster::undef_group_name && $groups == {})} { set idx [lsearch -exact $groups $name] if {$new_name != ""} { set groups [lreplace $groups $idx $idx $new_name] } else { set groups [lreplace $groups $idx $idx] } set groups [lsort -unique $groups] client:roster_push $xlib $jid \ -name $bookmarks($xlib,name,$jid) \ -groups $groups \ -subscription bookmark roster::override_category_and_subtype $xlib $jid conference "" set bookmarks($xlib,groups,$jid) $groups set store 1 } } if {$store} { store_bookmarks $xlib } } hook::add roster_rename_group_hook \ [namespace current]::conferences::rename_group ############################################################################### # # Remove group name from roster bookmarks # proc conferences::remove_bookmarks_group {xlib name} { variable bookmarks set store 0 foreach idx [array names bookmarks $xlib,jid,*] { set jid $bookmarks($idx) set groups $bookmarks($xlib,groups,$jid) if {$name in $groups || \ (($name == $::roster::undef_group_name) && ($groups == {}))} { client:roster_push $xlib $jid \ -name $bookmarks($xlib,name,$jid) \ -groups $groups \ -subscription remove if {[set idx [lsearch -exact $bookmarks($xlib) $jid]] >= 0} { set bookmarks($xlib) [lreplace $bookmarks($xlib) $idx $idx] } catch { unset bookmarks($xlib,jid,$jid) } catch { unset bookmarks($xlib,name,$jid) } catch { unset bookmarks($xlib,nick,$jid) } catch { unset bookmarks($xlib,password,$jid) } catch { unset bookmarks($xlib,autojoin,$jid) } catch { unset bookmarks($xlib,groups,$jid) } catch { unset bookmarks($xlib,hasgroups,$jid) } set store 1 } } if {$store} { store_bookmarks $xlib } } hook::add roster_remove_users_group_hook \ [namespace current]::conferences::remove_bookmarks_group ############################################################################### # # Join group on roster item doubleclick # proc conferences::join_group {xlib jid} { variable bookmarks set args {} if {$bookmarks($xlib,nick,$jid) != ""} { set nick $bookmarks($xlib,nick,$jid) } else { set nick [get_group_nick $xlib $jid] } if {$bookmarks($xlib,password,$jid) != ""} { set password $bookmarks($xlib,password,$jid) } else { set password "" } muc::join_group_raise $xlib $jid $nick $password } ############################################################################### # # Join group during autojoin # proc conferences::autojoin_group {xlib jid} { variable bookmarks if {$bookmarks($xlib,nick,$jid) != ""} { set nick $bookmarks($xlib,nick,$jid) } else { set nick [get_group_nick $xlib $jid] } if {$bookmarks($xlib,password,$jid) != ""} { set password $bookmarks($xlib,password,$jid) } else { set password "" } after idle [list muc::join_group $xlib $jid $nick $password] } ############################################################################### # # Autojoin groups # proc conferences::autojoin_groups {xlib} { variable options variable bookmarks if {$options(ignore_autojoin)} return foreach idx [array names bookmarks $xlib,jid,*] { set jid $bookmarks($idx) set chatid [chat::chatid $xlib $jid] if {$bookmarks($xlib,autojoin,$jid) && ![chat::is_opened $chatid]} { autojoin_group $xlib $jid } } } ############################################################################### # # "Join" item in roster conference popup menu # proc conferences::popup_menu {m xlib jid} { variable bookmarks set args {} if {[roster::itemconfig $xlib $jid -subsc] == "bookmark"} { if {$bookmarks($xlib,nick,$jid) != ""} { lappend args -nick $bookmarks($xlib,nick,$jid) } if {$bookmarks($xlib,password,$jid) != ""} { lappend args -password $bookmarks($xlib,password,$jid) } } $m add command -label [::msgcat::mc "Join..."] \ -command [list eval [list join_group_dialog $xlib \ -server [::xmpp::jid::server $jid] \ -group [::xmpp::jid::node $jid]] \ $args] # TODO: Check for real MUC? Move to muc.tcl? ::add_muc_menu_items $m $xlib $jid } hook::add roster_conference_popup_menu_hook \ [namespace current]::conferences::popup_menu 20 ############################################################################### # # Roster doubleclick # proc conferences::roster_doubleclick {xlib jid category subtype} { switch -- $category { conference { if {[roster::itemconfig $xlib $jid -subsc] == "bookmark"} { join_group $xlib $jid } else { muc::join_group_raise $xlib $jid [get_group_nick $xlib $jid] } return stop } } } hook::add roster_jid_doubleclick \ [namespace current]::conferences::roster_doubleclick ############################################################################### # # Main menu setup # proc conferences::main_menu {} { set m [.mainframe getmenu services] $m insert 2 command -label [::msgcat::mc "Add conference to roster..."] \ -command [list [namespace current]::add_conference_dialog ""] } hook::add finload_hook [namespace current]::conferences::main_menu ############################################################################### # # Edit roster item # proc conferences::edit_item_setup {f xlib jid} { variable egra_name variable egra_nick variable egra_password variable egra_autojoin variable bookmarks if {[roster::itemconfig $xlib $jid -subsc] != "bookmark"} return set tf [Labelframe $f.prop \ -text [::msgcat::mc "Edit properties for %s" $jid] \ -padding {2m 2m}] set slaves [pack slaves $f] if {$slaves == ""} { pack $tf -side top -expand yes -fill both -pady 1m } else { pack $tf -side top -expand yes -fill both -pady 1m -before [lindex $slaves 0] } set g $tf set egra_name $bookmarks($xlib,name,$jid) set egra_autojoin [string is true -strict $bookmarks($xlib,autojoin,$jid)] if {[info exists bookmarks($xlib,nick,$jid)]} { set egra_nick $bookmarks($xlib,nick,$jid) } else { set egra_nick "" } if {[info exists bookmarks($xlib,password,$jid)]} { set egra_password $bookmarks($xlib,password,$jid) } else { set egra_password "" } Label $g.lname -text [string trim [::msgcat::mc "Name: "]] Entry $g.name -textvariable [namespace current]::egra_name Label $g.lnick -text [::msgcat::mc "Nick:"] Entry $g.nick -textvariable [namespace current]::egra_nick Label $g.lpassword -text [::msgcat::mc "Password:"] Entry $g.password -show * -textvariable [namespace current]::egra_password Checkbutton $g.autojoin \ -text [::msgcat::mc "Automatically join conference upon connect"] \ -variable [namespace current]::egra_autojoin grid columnconfigure $g 0 -weight 0 grid columnconfigure $g 1 -weight 1 grid $g.lname -row 0 -column 0 -sticky e grid $g.name -row 0 -column 1 -sticky ew grid $g.lnick -row 1 -column 0 -sticky e grid $g.nick -row 1 -column 1 -sticky ew grid $g.lpassword -row 2 -column 0 -sticky e grid $g.password -row 2 -column 1 -sticky ew grid $g.autojoin -row 3 -column 0 -sticky w -columnspan 2 return stop } hook::add roster_itemedit_setup_hook \ [namespace current]::conferences::edit_item_setup proc conferences::commit_bookmark_changes {xlib jid groups} { variable egra_name variable egra_nick variable egra_password variable egra_autojoin if {[roster::itemconfig $xlib $jid -subsc] != "bookmark"} return plugins::conferences::update_bookmark $xlib $jid \ -name $egra_name -nick $egra_nick -password $egra_password \ -autojoin $egra_autojoin -groups $groups return stop } hook::add roster_itemedit_commit_hook \ [namespace current]::conferences::commit_bookmark_changes ############################################################################### proc conferences::disco_node_menu_setup {m bw tnode data parentdata} { lassign $data type xlib jid node lassign $parentdata ptype pxlib pjid pnode switch -- $type { item - item2 { set identities [::disco::browser::get_identities $bw $tnode] if {[llength $identities] == 0} { set identities [::disco::browser::get_parent_identities $bw $tnode] } # JID with resource is not a room JID if {[::xmpp::jid::resource $jid] != ""} return foreach id $identities { if {[::xmpp::xml::getAttr $id category] == "conference"} { $m add command -label [::msgcat::mc "Add conference to roster..."] \ -command [list [namespace current]::add_conference_dialog $xlib \ -group [::xmpp::jid::node $jid] \ -server [::xmpp::jid::server $jid]] break } } } } } hook::add disco_node_menu_hook \ [namespace current]::conferences::disco_node_menu_setup 50 # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/roster/fetch_nicknames.tcl000064400000000000000000000056331477701321300207040ustar00nobodynobody# fetch_nicknames.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # fetches roster item nickname(s) from vCard and set roster label(s). namespace eval fetch_nickname {} proc fetch_nickname::service_request {xlib service} { foreach jid [::roster::get_jids $xlib] { if {[::xmpp::jid::server $jid] eq [::xmpp::jid::server $service]} { user_request $xlib $jid } } } proc fetch_nickname::request_group_nicks {xlib group args} { foreach jid [eval [list ::roster::get_group_jids $xlib $group] $args] { if {[string equal [::roster::itemconfig $xlib $jid -category] user]} { user_request $xlib $jid } } } proc fetch_nickname::user_request {xlib jid} { ::xmpp::sendIQ $xlib get \ -query [::xmpp::xml::create vCard -xmlns vcard-temp] \ -to $jid \ -command [list [namespace current]::parse_result $xlib $jid] } proc fetch_nickname::parse_result {xlib jid status xml} { if {$status ne "ok"} return ::xmpp::xml::split $xml tag xmlns attrs cdata subels foreach item $subels { userinfo::parse_vcard_item $jid $item } if {[info exists ::userinfo::userinfo(nickname,$jid)] && \ ![string equal $::userinfo::userinfo(nickname,$jid) ""]} { roster::itemconfig $xlib $jid \ -name $::userinfo::userinfo(nickname,$jid) roster::send_item $xlib $jid } } proc fetch_nickname::extend_user_menu {m xlib jid} { set rjid [roster::find_jid $xlib $jid] if {$rjid == ""} { set state disabled } else { set state normal } $m add command -label [::msgcat::mc "Fetch nickname"] \ -command [list [namespace current]::user_request $xlib $rjid] \ -state $state } hook::add chat_create_user_menu_hook \ [namespace current]::fetch_nickname::extend_user_menu 73 hook::add roster_jid_popup_menu_hook \ [namespace current]::fetch_nickname::extend_user_menu 73 proc fetch_nickname::extend_service_menu {m xlib jid} { set rjid [roster::find_jid $xlib $jid] if {$rjid == ""} { set state disabled } else { set state normal } $m add command -label [::msgcat::mc "Fetch user nicknames"] \ -command [list [namespace current]::service_request $xlib $rjid] \ -state $state } hook::add roster_service_popup_menu_hook \ [namespace current]::fetch_nickname::extend_service_menu 73 proc fetch_nickname::extend_group_menu {m xlib name} { $m add command \ -label [::msgcat::mc "Fetch nicknames of all users in group"] \ -command [list [namespace current]::request_group_nicks $xlib $name \ -nested $::ifacetk::roster::options(nested) \ -delimiter $::ifacetk::roster::options(nested_delimiter)] } hook::add roster_group_popup_menu_hook \ [namespace current]::fetch_nickname::extend_group_menu # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/roster/itemedit.tcl000064400000000000000000000147561477701321300173750ustar00nobodynobody# itemedit.tcl -- # # This file is a part of the Tkabber XMPP client. It implements user # interface for editing roster items properties (nickname, groups). namespace eval ::itemedit {} proc ::itemedit::show_dialog {xlib jid} { set allowed_name [jid_to_tag $jid] set w .gredit_[psuffix $xlib]_$allowed_name if {[winfo exists $w]} { destroy $w } Dialog $w -title [::msgcat::mc "Edit properties for %s" $jid] \ -anchor e \ -default 0 \ -cancel 1 set f [$w getframe] hook::run roster_itemedit_setup_hook $f $xlib $jid set g [Labelframe $f.gr -text [::msgcat::mc "Edit groups for %s" $jid] \ -padding {2m 2m}] pack $f.gr -side top -expand yes -fill both -pady 1m set ga [Frame $g.available] pack $ga -side left -expand yes -fill both Label $ga.title -text [::msgcat::mc "Available groups"] pack $ga.title -side top -anchor w Frame $ga.gr Label $ga.gr.lab -text [::msgcat::mc "Group:"] set gae [Entry $ga.gr.oup] pack $ga.gr.lab -side left pack $ga.gr.oup -side left -fill x -expand yes pack $ga.gr -side top -fill x set gasw [ScrolledWindow $ga.grouplist_sw] set gal [Listbox $ga.grouplist] $gasw setwidget $gal pack $gasw -side top -expand yes -fill both set gc [Frame $g.current] pack $gc -side right -expand yes -fill both Label $gc.title -text [::msgcat::mc "Current groups"] pack $gc.title -side top -anchor w set gcsw [ScrolledWindow $gc.grouplist_sw] set gcl [Listbox $gc.grouplist] $gcsw setwidget $gcl pack $gcsw -side top -expand yes -fill both Frame $g.buttons Button $g.buttons.add -text [::msgcat::mc "Add ->"] \ -command "itemedit::add_group $gcl \[$ga.gr.oup get\]" Button $g.buttons.remove -text [::msgcat::mc "<- Remove"] \ -command [list itemedit::remove_current_group $gcl] pack $g.buttons.add $g.buttons.remove -side top -fill x -anchor c pack $g.buttons -side left $w add -text [::msgcat::mc "OK"] \ -command [list [namespace current]::commit_changes $gcl $xlib $jid] $w add -text [::msgcat::mc "Cancel"] -command [list destroy $w] foreach group [roster::get_groups $xlib \ -nested $::ifacetk::roster::options(nested) \ -delimiter $::ifacetk::roster::options(nested_delimiter)] { $gal insert end $group } foreach group [roster::itemconfig $xlib $jid -group] { $gcl insert end $group } bindtags $gal [list [winfo class $gal] $gal [winfo toplevel $gal] all] bind $gal <1> [list itemedit::select_available_group %W [double% $gae]] $w draw } proc ::itemedit::edit_item_setup_fallback {f xlib jid} { variable gra_name set tf [Labelframe $f.name -text [::msgcat::mc "Edit nickname for %s" $jid] \ -padding {2m 2m}] set slaves [pack slaves $f] if {$slaves == ""} { pack $tf -side top -expand yes -fill both -pady 1m } else { pack $tf -side top -expand yes -fill both -pady 1m -before [lindex $slaves 0] } set g $tf Label $g.lname -text [::msgcat::mc "Nickname:"] set gn [Entry $g.name -textvariable [namespace current]::gra_name] set name [roster::itemconfig $xlib $jid -name] if {$name == ""} { if {[info exists ::userinfo::userinfo(nickname,$jid)] && \ $::userinfo::userinfo(nickname,$jid) ne ""} { set name $::userinfo::userinfo(nickname,$jid) } else { set name [::xmpp::jid::node $jid] ::xmpp::sendIQ $xlib get \ -query [::xmpp::xml::create vCard -xmlns vcard-temp] \ -to [::xmpp::jid::stripResource [get_jid_of_user $xlib $jid]] \ -command [list [namespace current]::fetch_nickname $gn $name $jid] } } $g.name delete 0 end $g.name insert 0 $name pack $g.lname -side left pack $g.name -side left -expand yes -fill x } hook::add roster_itemedit_setup_hook \ ::itemedit::edit_item_setup_fallback 100 proc ::itemedit::prefs_user_menu {m xlib jid} { set rjid [roster::find_jid $xlib $jid] if {$rjid == ""} { set state disabled } else { set state normal } $m add command -label [::msgcat::mc "Edit item..."] \ -command [list [namespace current]::show_dialog $xlib $rjid] \ -state $state } hook::add chat_create_user_menu_hook \ ::itemedit::prefs_user_menu 74 hook::add roster_conference_popup_menu_hook \ ::itemedit::prefs_user_menu 74 hook::add roster_service_popup_menu_hook \ ::itemedit::prefs_user_menu 74 hook::add roster_jid_popup_menu_hook \ ::itemedit::prefs_user_menu 74 proc ::itemedit::add_group {grlist group} { set group [string trim $group] if {$group ne ""} { set groups [$grlist get 0 end] lappend groups $group set groups [lsort -unique $groups] $grlist delete 0 end eval $grlist insert end $groups } } proc ::itemedit::select_available_group {grlist grentry} { if {[llength [$grlist curselection]] > 0} { set group [$grlist get [$grlist curselection]] $grentry delete 0 end $grentry insert 0 $group } } proc ::itemedit::remove_current_group {grlist} { if {[llength [$grlist curselection]] > 0} { $grlist delete [$grlist curselection] } } proc ::itemedit::commit_changes {grlist xlib jid} { hook::run roster_itemedit_commit_hook $xlib $jid [$grlist get 0 end] destroy [winfo toplevel $grlist] } proc ::itemedit::commit_changes_fallback {xlib jid groups} { variable gra_name if {![info exists gra_name]} return roster::itemconfig $xlib $jid \ -name $gra_name \ -group $groups roster::send_item $xlib $jid } hook::add roster_itemedit_commit_hook \ ::itemedit::commit_changes_fallback 100 proc ::itemedit::fetch_nickname {name_entry name jid res child} { if {![winfo exists $name_entry] || ![string equal $res ok]} { return } ::xmpp::xml::split $child tag xmlns attrs cdata subels foreach item $subels { userinfo::parse_vcard_item $jid $item } if {[info exists ::userinfo::userinfo(nickname,$jid)] && \ $::userinfo::userinfo(nickname,$jid) ne "" && \ [winfo exists $name_entry] && \ [$name_entry get] ne $name} { $name_entry delete 0 end $name_entry insert 0 $::userinfo::userinfo(nickname,$jid) } } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/roster/metacontacts.tcl000064400000000000000000000306441477701321300202500ustar00nobodynobody# metacontacts.tcl -- # # Storing metacontacts (XEP-0209) support package require xmpp::roster::metacontacts namespace eval metacontacts { # variable to store roster contacts variable contacts array set contacts {} hook::add disconnected_hook [namespace current]::free_contacts hook::add connected_hook [namespace current]::request_contacts hook::add roster_jid_popup_menu_hook [namespace current]::roster_menu 72 } proc metacontacts::free_contacts {xlib} { variable contacts array unset contacts $xlib,* } proc metacontacts::request_contacts {xlib} { variable contacts array unset contacts $xlib,* set contacts($xlib,tags) {} ::xmpp::roster::metacontacts::retrieve $xlib \ -command [namespace code [list process_contacts $xlib]] } proc metacontacts::process_contacts {xlib status contactslist} { variable contacts if {$status != "ok"} return foreach {tag jids} $contactslist { create_contact $xlib $tag $jids } } proc metacontacts::create_contact {xlib tag jids args} { variable contacts set merge 0 foreach {opt val} $args { switch -- $opt { -merge { set merge $val } default { return -code error "Bad option \"$opt\":\ must be -merge" } } } if {!$merge || ![info exists contacts($xlib,jids,$tag)]} { lappend contacts($xlib,tags) $tag set contacts($xlib,tags) [lsort -unique $contacts($xlib,tags)] set contacts($xlib,jids,$tag) $jids foreach idx [array names contacts $xlib,tag,*] { if {[set idx1 [lsearch -exact $contacts($idx) $tag]] >= 0} { set contacts($idx) [lreplace $contacts($idx) $idx1 $idx1] if {[llength $contacts($idx)] == 0} { unset contacts($idx) } } } foreach jid $jids { lappend contacts($xlib,tag,$jid) $tag set contacts($xlib,tag,$jid) [lsort -unique $contacts($xlib,tag,$jid)] } return 1 } else { return 0 } } proc metacontacts::get_all_tags {xlib} { variable contacts if {[info exists contacts($xlib,tags)]} { return $contacts($xlib,tags) } else { return {} } } proc metacontacts::get_tags {xlib jid} { variable contacts if {[info exists contacts($xlib,tag,$jid)]} { return $contacts($xlib,tag,$jid) } else { return {} } } proc metacontacts::get_jids {xlib tag} { variable contacts if {[info exists contacts($xlib,jids,$tag)]} { return $contacts($xlib,jids,$tag) } else { return {} } } proc metacontacts::cleanup_and_store_contacts {xlib args} { variable contacts set roster_jids [roster::get_jids $xlib] foreach idx [array names contacts $xlib,jids,*] { set tag [string range $idx [string length $xlib,jids,] end] set jids {} foreach jid $contacts($idx) { if {$jid ni $roster_jids} { catch { unset contacts($xlib,tag,$jid) } } else { lappend jids $jid } } set contacts($idx) $jids } eval [list store_contacts $xlib] $args } proc metacontacts::serialize_contacts {xlib} { variable contacts set contactlist {} foreach idx [array names contacts $xlib,jids,*] { set tag [string range $idx [string length $xlib,jids,] end] lappend contactlist $tag $contacts($idx) } return $contactlist } proc metacontacts::store_contacts {xlib args} { set command [namespace code [list store_contacts_result $xlib]] foreach {opt val} $args { switch -- $opt { -command { set command $val } default { return -code error "Bad option \"$opt\":\ must be -command" } } } ::xmpp::roster::metacontacts::store $xlib [serialize_contacts $xlib] \ -command $command } proc metacontacts::store_contacts_result {xlib status xml} { if {$status == "ok"} return if {[winfo exists .store_contacts_error]} { destroy .store_contacts_error } MessageDlg .store_contacts_error -aspect 50000 -icon error \ -message [::msgcat::mc "Storing roster metacontacts failed: %s" \ [error_to_string $xml]] \ -type user -buttons ok -default 0 -cancel 0 } proc metacontacts::edit {xlib tag {jid ""}} { variable contacts if {$tag == ""} { # New metacontact for {set i 0} {1} {incr i} { if {$i ni $contacts($xlib,tags)} { set tag $i break } } } set w .metacontact if {[winfo exists $w]} { destroy $w } Dialog $w -title [::msgcat::mc "Edit Metacontact"] \ -modal none \ -anchor e \ -default 0 \ -cancel 1 $w add -text [::msgcat::mc "Store"] \ -command [namespace code [list edit_enddialog $w $xlib $tag]] $w add -text [::msgcat::mc "Cancel"] \ -command [list destroy $w] set f [$w getframe] set tools [Frame $f.tools] pack $tools -side bottom -fill x set sw [ScrolledWindow $w.sw] set lf [Listbox $w.fields] pack $sw -side top -expand yes -fill both -in $f -pady 1m -padx 1m $sw setwidget $lf bind $lf <> [namespace code [list select_and_popup_menu %W [double% $xlib] %x %y]] bind $lf [namespace code [list move_selected %W [double% $xlib] -1]] bind $lf [namespace code [list move_selected %W [double% $xlib] 1]] set addentry [Entry $tools.addentry] set additem [Button $tools.additem \ -text [::msgcat::mc "Add JID"] \ -command \ [namespace code [list add_jid_entry $lf $xlib $addentry]]] pack $additem -side right -padx 1m pack $addentry -side left -padx 1m -fill x -expand yes bind $addentry [list $additem invoke] bind $addentry +break bind $additem [list $additem invoke] bind $additem +break lower $lf $additem lower $sw lower $f if {[info exists contacts($xlib,jids,$tag)]} { eval {$lf insert end} $contacts($xlib,jids,$tag) } elseif {$jid != ""} { $lf insert end $jid } fix_dialog_title $lf $xlib focus $lf DropSite::register $lf -dropcmd [namespace code [list dropcmd $xlib]] \ -droptypes {JID} DragSite::register $lf -draginitcmd [namespace code [list draginitcmd $xlib]] $w draw } proc metacontacts::move_selected {f xlib shift} { set index [$f index active] set item [$f get $index] $f delete $index $f insert [expr {$index + $shift}] $item $f activate $index fix_dialog_title $f $xlib } proc metacontacts::fix_dialog_title {f xlib} { set w [winfo toplevel $f] if {[$f size] > 0} { set jid [$f get 0] $w configure -title [::msgcat::mc "Edit %s's Metacontact" \ [::roster::get_label $xlib $jid]] } else { $w configure -title [::msgcat::mc "Edit Metacontact"] } } proc metacontacts::edit_enddialog {w xlib tag} { variable contacts $w itemconfigure 0 -state disabled set jids [$w.fields get 0 end] destroy $w create_contact $xlib $tag $jids store_contacts $xlib redraw_roster } proc metacontacts::dropcmd {xlib target source X Y op type data} { set x [expr {$X - [winfo rootx $target]}] set y [expr {$Y - [winfo rooty $target]}] set bbox [$target bbox @$x,$y] if {$y > [lindex $bbox 1] + [lindex $bbox 3]} { set index end } else { set index [$target index @$x,$y] } add_jid $target $xlib [lindex $data 1] $index } proc metacontacts::draginitcmd {xlib target X Y top} { set x [expr {$X - [winfo rootx $target]}] set y [expr {$Y - [winfo rooty $target]}] set bbox [$target bbox @$x,$y] if {$y > [lindex $bbox 1] + [lindex $bbox 3]} { return {} } else { set jid [$target get [$target index @$x,$y]] set data [list $xlib $jid \ [::roster::itemconfig $xlib $jid -category] \ [::roster::itemconfig $xlib $jid -subtype] \ [::roster::itemconfig $xlib $jid -name] {} \ {}] return [list JID {move} $data] } } proc metacontacts::select_and_popup_menu {f xlib x y} { set index [$f index @$x,$y] $f selection clear 0 end $f selection set $index if {[winfo exists [set m .metacontact_popupmenu]]} { destroy $m } menu $m -tearoff 0 $m add command -label [::msgcat::mc "Remove from metacontact"] \ -command [namespace code [list delete_jid $f $xlib $index]] tk_popup $m [winfo pointerx .] [winfo pointery .] } proc metacontacts::add_jid_entry {f xlib entry} { set item [$entry get] $entry delete 0 end add_jid $f $xlib $item } proc metacontacts::add_jid {f xlib item {index end}} { set values [$f get 0 end] if {[set idx [lsearch -exact $values $item]] >= 0} { set values [lreplace $values $idx $idx] } set values [linsert $values $index $item] set index [lsearch -exact $values $item] $f delete 0 end eval [list $f insert end] $values $f selection set $index fix_dialog_title $f $xlib } proc metacontacts::delete_jid {f xlib index} { $f delete $index fix_dialog_title $f $xlib } proc metacontacts::confirm_delete {xlib tag} { variable contacts set w .metacontact_delete if {[winfo exists $w]} { destroy $w } if {![info exists contacts($xlib,jids,$tag)] || \ [llength $contacts($xlib,jids,$tag)] == 0} { set message [::msgcat::mc "Are you sure to delete metacontact?"] } else { set jid [lindex $contacts($xlib,jids,$tag) 0] set message [::msgcat::mc "Are you sure to delete %s's metacontact?" \ [::roster::get_label $xlib $jid]] } set res [MessageDlg .metacontact_delete \ -aspect 50000 \ -icon warning \ -type user \ -buttons {yes no} \ -default 1 \ -cancel 1 \ -message $message] if {$res == 0} { if {[set idx [lsearch -exact $contacts($xlib,tags) $tag]] >= 0} { set contacts($xlib,tags) [lreplace $contacts($xlib,tags) $idx $idx] unset contacts($xlib,jids,$tag) foreach idx [array names contacts $xlib,tag,*] { if {[set idx1 [lsearch -exact $contacts($idx) $tag]] >= 0} { set contacts($idx) [lreplace $contacts($idx) $idx1 $idx1] if {[llength $contacts($idx)] == 0} { unset contacts($idx) } } } } store_contacts $xlib redraw_roster } } proc metacontacts::roster_menu {m xlib jid} { variable contacts set rjid [roster::find_jid $xlib $jid] if {$rjid == "" || !$::ifacetk::roster::options(enable_metacontacts)} { set tag "" set state disabled set state1 disabled set state2 disabled } else { set state normal if {[info exists contacts($xlib,tag,$rjid)]} { set tag [lindex $contacts($xlib,tag,$rjid) 0] set state1 disabled set state2 normal set rjid "" ; # It doesn't make sense to split this menu entry } else { set tag "" set state1 normal set state2 disabled } } set mm [menu $m.metacontact -tearoff 0] $mm add command -label [::msgcat::mc "Create metacontact"] \ -state $state1 \ -command [namespace code [list edit $xlib "" $rjid]] $mm add command -label [::msgcat::mc "Edit metacontact"] \ -state $state2 \ -command [namespace code [list edit $xlib $tag]] $mm add command -label [::msgcat::mc "Delete metacontact"] \ -state $state2 \ -command [namespace code [list confirm_delete $xlib $tag]] $m add cascade -label [::msgcat::mc "Metacontact"] \ -state $state \ -menu $mm } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/roster/rosterx.tcl000064400000000000000000000204451477701321300172670ustar00nobodynobody# rosterx.tcl -- # # Roster Item Exchange Support (XEP-0093 and XEP-0144) namespace eval rosterx {} ############################################################################### proc rosterx::process_x {rowvar bodyvar f x xlib from id type replyP} { upvar 2 $rowvar row upvar 2 $bodyvar body set rosterx 0 foreach xa $x { ::xmpp::xml::split $xa tag xmlns attrs cdata subels switch -- $xmlns \ $::NS(rosterx) { set rosterx 1 foreach subel $subels { process_x_rosterx $f $subel $row $xlib $from incr row } } \ $::NS(xroster) { if {$rosterx} break foreach subel $subels { process_x_xroster $f $subel $row $xlib $from incr row } } } return } hook::add message_process_x_hook [namespace current]::rosterx::process_x 60 ::xmpp::iq::register set x $::NS(rosterx) \ [namespace current]::rosterx::process_x_iq ############################################################################### proc rosterx::process_x_iq {xlib from stanza args} { set choices {} set balloons {} global recv_uc variable dlg ::xmpp::xml::split $stanza tag xmlns attrs cdata subels foreach c $subels { lassign [process_item $c] jid name groups desc if {[::roster::find_jid $xlib $jid] eq ""} { lappend choices [list $jid $name $groups] $desc } } if {[llength $choices] == 0} { return {result ""} } set d .dlg[incr dlg] CbDialog $d [::msgcat::mc "Attached user:"] \ [list "Ok" \ [list [namespace current]::process_item_selection $d $xlib $from] \ [::msgcat::mc "Cancel"] [list destroy $d]] \ recv_uc $choices $balloons return {result ""} } ############################################################################### proc rosterx::process_item_selection {d xlib from} { global recv_uc foreach uc [array names recv_uc] { if {$recv_uc($uc)} { set jid [lindex $uc 0] set name [lindex $uc 1] set groups [lindex $uc 2] [namespace current]::process_user $xlib $jid $name \ "$from asked me to add you to my roster." $groups } } destroy $d } ############################################################################### proc rosterx::process_item {item} { ::xmpp::xml::split $item tag xmlns attrs cdata subels set jid [::xmpp::xml::getAttr $attrs jid] set name [::xmpp::xml::getAttr $attrs name] set action [::xmpp::xml::getAttr $attrs action] if {$jid == ""} return if {$action != "add"} return if {$name != ""} { set desc "$name ($jid)" } else { set desc $jid } set groups [list] foreach group $subels { ::xmpp::xml::split $group gtag gxmlns gattrs gcdata gsubels lappend groups $gcdata } return [list $jid $name $groups $desc] } ############################################################################### proc rosterx::process_x_rosterx {f x row xlib from} { ::xmpp::xml::split $x tag xmlns attrs cdata subels set jid [::xmpp::xml::getAttr $attrs jid] set name [::xmpp::xml::getAttr $attrs name] set action [::xmpp::xml::getAttr $attrs action] if {$jid == ""} return if {$name != ""} { set desc "$name ($jid)" } else { set desc $jid } Label $f.luser$row -text [::msgcat::mc "Attached user:"] set cb [Button $f.user$row -text $desc \ -command [list [namespace current]::process_user $xlib $jid \ $name "$from asked me to add you to my roster."]] grid $f.luser$row -row $row -column 0 -sticky e grid $f.user$row -row $row -column 1 -sticky ew } ############################################################################### proc rosterx::process_x_xroster {f x row xlib from} { ::xmpp::xml::split $x tag xmlns attrs cdata subels set jid [::xmpp::xml::getAttr $attrs jid] set name [::xmpp::xml::getAttr $attrs name] if {$jid == ""} return if {$name != ""} { set desc "$name ($jid)" } else { set desc $jid } Label $f.luser$row -text [::msgcat::mc "Attached user:"] set cb [Button $f.user$row -text $desc \ -command [list [namespace current]::process_user $xlib $jid \ $name "$from asked me to add you to my roster."]] grid $f.luser$row -row $row -column 0 -sticky e grid $f.user$row -row $row -column 1 -sticky ew } ############################################################################### proc rosterx::process_user {xlib jid name body {groups {}}} { ::xmpp::sendPresence $xlib -to $jid \ -type subscribe \ -status $body set vars [list -jid $jid] if {$name != ""} { lappend vars -name $name } ::xmpp::roster::send $::roster::roster(token,$xlib) {*}$vars -groups $groups } ############################################################################### proc rosterx::send_users_dialog {xlib user} { global send_uc set jid [get_jid_of_user $xlib $user] if {$jid eq ""} { set jid $user } set gw .contacts catch { destroy $gw } if {[catch { set nick [roster::get_label $xlib $user] }]} { if {[catch { set nick [chat::get_nick $xlib \ $user groupchat] }]} { set nick $user } } set choices {} set balloons {} foreach c [connections] { foreach choice [roster::get_jids $c] { if {[roster::itemconfig $c $choice -isuser]} { lappend choices [list $c $choice] [roster::get_label $c $choice] lappend balloons [list $c $choice] $choice } } } if {[llength $choices] == 0} { MessageDlg ${gw}_err -aspect 50000 -icon info \ -message [::msgcat::mc "No users in roster..."] -type user \ -buttons ok -default 0 -cancel 0 return } CbDialog $gw [::msgcat::mc "Send contacts to %s" $nick] \ [list [::msgcat::mc "Send"] \ [list [namespace current]::send_users $gw $xlib $jid] \ [::msgcat::mc "Cancel"] \ [list destroy $gw]] \ send_uc $choices $balloons } ############################################################################### proc rosterx::add_menu_item {m xlib jid} { $m add command \ -label [::msgcat::mc "Send users..."] \ -command [list [namespace current]::send_users_dialog $xlib $jid] } hook::add roster_create_groupchat_user_menu_hook \ [namespace current]::rosterx::add_menu_item 45 hook::add chat_create_user_menu_hook \ [namespace current]::rosterx::add_menu_item 45 hook::add roster_jid_popup_menu_hook \ [namespace current]::rosterx::add_menu_item 45 hook::add message_dialog_menu_hook \ [namespace current]::rosterx::add_menu_item 45 hook::add search_popup_menu_hook \ [namespace current]::rosterx::add_menu_item 45 ############################################################################### proc rosterx::send_users {gw xlib jid} { global send_uc set sf [$gw getframe].sw.sf set choices {} foreach uc [array names send_uc] { if {$send_uc($uc)} { lappend choices $uc } } destroy $gw set subtags {} set body [::msgcat::mc "Contact Information"] foreach choice $choices { lassign $choice con uc lappend subtags [roster::item_to_xml $con $uc] set nick [roster::get_label $con $uc] append body "\n$nick - xmpp:$uc" } message::send_msg $xlib $jid -type normal -body $body \ -xlist [list \ [::xmpp::xml::create x \ -xmlns $::NS(rosterx) \ -subelements $subtags] \ [::xmpp::xml::create x \ -xmlns $::NS(xroster) \ -subelements $subtags]] } ############################################################################### disco::register_feature $::NS(rosterx) # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/search000075500000000000000000000000001477701321300147205ustar00nobodynobodytkabber/plugins/search/browser.tcl000064400000000000000000000017731477701321300171760ustar00nobodynobody# browser.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # implements search panel for browser trees (like a service discovery # browser). namespace eval search {} namespace eval search::browser { hook::add open_browser_post_hook [namespace current]::setup_panel hook::add open_disco_post_hook [namespace current]::setup_panel } proc search::browser::open_panel {sw sf} { pack $sf -side bottom -anchor w -fill x -before $sw } proc search::browser::close_panel {tw sf} { pack forget $sf focus $tw } proc search::browser::setup_panel {w sw tw} { set sf [plugins::search::spanel $w.search \ -searchcommand [list [namespace parent]::bwtree::do_search $tw] \ -closecommand [list [namespace current]::close_panel $tw]] if {[winfo exists $tw.c]} { set tw $tw.c } bind $tw <> \ [double% [list [namespace current]::open_panel $sw $sf]] } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/search/chat.tcl000064400000000000000000000022241477701321300164220ustar00nobodynobody# chat.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # implements search panel setup in chat windows. namespace eval search {} namespace eval search::chat { hook::add open_chat_post_hook [namespace current]::setup_panel } proc search::chat::open_panel {chatw sf} { pack $sf -side bottom -anchor w -fill x -before [winfo parent $chatw].csw update idletasks $chatw see end } proc search::chat::close_panel {chatid sf} { set chatw [chat::chat_win $chatid] $chatw tag remove search_highlight 0.0 end pack forget $sf focus [chat::input_win $chatid] } proc search::chat::setup_panel {chatid type} { set chatw [chat::chat_win $chatid] $chatw mark set sel_start end $chatw mark set sel_end 0.0 set sf [plugins::search::spanel [winfo parent $chatw].search \ -searchcommand [list [namespace parent]::do_text_search $chatw] \ -closecommand [list [namespace current]::close_panel $chatid]] bind [chat::input_win $chatid] <> \ [double% [list [namespace current]::open_panel $chatw $sf]] } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/search/custom.tcl000064400000000000000000000020251477701321300170140ustar00nobodynobody# custom.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # adds a search panel into the Customize tab or window. namespace eval search {} namespace eval search::custom { hook::add open_custom_post_hook [namespace current]::setup_panel } proc search::custom::open_panel {w sf} { pack $sf -side bottom -anchor w -fill x -before $w.sw update idletasks $w.fields see end } proc search::custom::close_panel {w sf} { $w.fields tag remove search_highlight 0.0 end pack forget $sf focus $w.fields } proc search::custom::setup_panel {w} { set fields $w.fields $fields mark set sel_start end $fields mark set sel_end 0.0 set sf [plugins::search::spanel $w.search \ -searchcommand [list [namespace parent]::do_text_search $fields] \ -closecommand [list [namespace current]::close_panel $w]] bind $fields <> \ [double% [list [namespace current]::open_panel $w $sf]] } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/search/headlines.tcl000064400000000000000000000170301477701321300174400ustar00nobodynobody# headlines.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # implements search through the received headlines (their subjects and # bodies). namespace eval headlines::search {} proc headlines::search::open_panel {w dw sf} { pack $sf -side bottom -anchor w -fill x -before $dw.sw update idletasks $w.body see end } ############################################################################# proc headlines::search::close_panel {w tw sf} { $w.body tag remove search_highlight 0.0 end pack forget $sf focus $tw } ############################################################################# proc headlines::search::setup_panel {w tw uw dw} { set body $w.body $body mark set sel_start end $body mark set sel_end 0.0 set sf [plugins::search::spanel $w.search \ -searchcommand [list [namespace current]::do_search $w $tw $uw $dw] \ -closecommand [list [namespace current]::close_panel $w $tw]] if {[winfo exists $tw.c]} { set tw $tw.c } foreach ww [list $tw $w.body $dw.date.ts $dw.from.jid $dw.subject.subj] { bind $ww <> \ [double% [list [namespace current]::open_panel $w $dw $sf]] } } hook::add open_headlines_post_hook \ [namespace current]::headlines::search::setup_panel ############################################################################# proc headlines::search::do_search {hw tw uw dw pattern dir} { if {![string length $pattern]} { return 0 } if {$dir == "up"} { set start_node [lindex [$tw selection] 0] set node [search_up $hw $tw $uw $dw $start_node $pattern] } else { set start_node [lindex [$tw selection] end] set node [search_down $hw $tw $uw $dw $start_node $pattern] } if {$node != ""} { return 1 } else { return 0 } } ########################################################################## proc headlines::search::search_up {hw tw uw dw node pattern} { set body $hw.body set subj $dw.subject.subj # Try to search in current article if {[search_in_article_up $body $subj $pattern]} { return $node } set n [plugins::search::bwtree::prev_node $tw $node] while {1} { if {($n != {}) && \ ![catch {array set props [$tw item $n -values]}] && \ [info exists props(type)] && \ $props(type) == "article"} { set subjtext [string map [list "\n" " "] $props(text)] set bodytext "$props(body)\n\n[::msgcat::mc {Read on...}]" if {[plugins::search::match $pattern $subjtext] || \ [plugins::search::match $pattern $bodytext]} { plugins::search::bwtree::search_hilite $tw $n if {[search_in_article_up $body $subj $pattern]} { return $n } } } if {$n == $node} break set n [plugins::search::bwtree::prev_node $tw $n] } return "" } ############################################################################# proc headlines::search::search_in_article_up {body subj pattern} { catch { set bfirst [$body index search_highlight.first] set blast [$body index search_highlight.last] } catch { set sfirst [$subj index search_highlight.first] set slast [$subj index search_highlight.last] } if {![info exists sfirst]} { # Try to find pattern in article body plugins::search::do_text_search $body $pattern up if {![catch { set bfirst1 [$body index search_highlight.first] set blast1 [$body index search_highlight.last] }]} { if {![info exists bfirst]} { return 1 } if {[$body compare $bfirst1 < $bfirst] || \ ([$body compare $bfirst1 == $bfirst] && [$body compare $blast1 < $blast])} { return 1 } $body tag remove search_highlight 0.0 end } $subj mark set sel_start end $subj mark set sel_end 0.0 } # Then try to find pattern in the subject plugins::search::do_text_search $subj $pattern up if {![catch { set sfirst1 [$subj index search_highlight.first] set slast1 [$subj index search_highlight.last] }]} { if {![info exists sfirst]} { return 1 } if {[$subj compare $sfirst1 < $sfirst] || \ ([$subj compare $sfirst1 == $sfirst] && [$subj compare $slast1 < $slast])} { return 1 } $subj tag remove search_highlight 0.0 end } return 0 } ############################################################################# proc headlines::search::search_down {hw tw uw dw node pattern} { set body $hw.body set subj $dw.subject.subj # Try to search in current article if {[search_in_article_down $body $subj $pattern]} { return $node } set n [plugins::search::bwtree::next_node $tw $node] while {1} { if {($n != {}) && \ ![catch {array set props [$tw item $n -values]}] && \ [info exists props(type)] && \ $props(type) == "article"} { set subjtext [string map [list "\n" " "] $props(text)] set bodytext "$props(body)\n\n[::msgcat::mc {Read on...}]" if {[plugins::search::match $pattern $subjtext] || \ [plugins::search::match $pattern $bodytext]} { plugins::search::bwtree::search_hilite $tw $n if {[search_in_article_down $body $subj $pattern]} { return $n } } } if {$n == $node} break set n [plugins::search::bwtree::next_node $tw $n] } return "" } ############################################################################# proc headlines::search::search_in_article_down {body subj pattern} { catch { set bfirst [$body index search_highlight.first] set blast [$body index search_highlight.last] } catch { set sfirst [$subj index search_highlight.first] set slast [$subj index search_highlight.last] } if {![info exists bfirst]} { # Try to find pattern in article subject plugins::search::do_text_search $subj $pattern down if {![catch { set sfirst1 [$subj index search_highlight.first] set slast1 [$subj index search_highlight.last] }]} { if {![info exists sfirst]} { return 1 } if {[$subj compare $sfirst1 > $sfirst] || \ ([$subj compare $sfirst1 == $sfirst] && [$subj compare $slast1 > $slast])} { return 1 } $subj tag remove search_highlight 0.0 end } $body mark set sel_start end $body mark set sel_end 0.0 } # Then try to find pattern in the body plugins::search::do_text_search $body $pattern down if {![catch { set bfirst1 [$body index search_highlight.first] set blast1 [$body index search_highlight.last] }]} { if {![info exists bfirst]} { return 1 } if {[$body compare $bfirst1 > $bfirst] || \ ([$body compare $bfirst1 == $bfirst] && [$body compare $blast1 > $blast])} { return 1 } $body tag remove search_highlight 0.0 end } return 0 } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/search/logger.tcl000064400000000000000000000017471477701321300167730ustar00nobodynobody# logger.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # adds a search panel to the chat history windows. namespace eval search {} namespace eval search::logger { hook::add open_log_post_hook [namespace current]::setup_panel } proc search::logger::open_panel {w tw sf} { pack $sf -side bottom -anchor w -fill x -before $w.sw update idletasks $tw see end } proc search::logger::close_panel {tw sf} { $tw tag remove search_highlight 0.0 end pack forget $sf } proc search::logger::setup_panel {xlib jid w} { set tw $w.log $tw mark set sel_start end $tw mark set sel_end 0.0 set sf [plugins::search::spanel $w.search \ -searchcommand [list [namespace parent]::do_text_search $tw] \ -closecommand [list [namespace current]::close_panel $tw]] bind $w <> \ [double% [list [namespace current]::open_panel $w $tw $sf]] } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/search/muclists.tcl000064400000000000000000000017261477701321300173540ustar00nobodynobody# muclists.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which adds # a serach panel to the MUC lists (admin list, ban list etc.). namespace eval search::muclists {} proc search::muclists::open_panel {w sw swl sf} { pack $sf -side bottom -anchor w -fill x -before $sw update idletasks $swl show end } proc search::muclists::close_panel {w sw swl sf} { $swl sel clear 0 end pack forget $sf $w setfocus 0 } proc search::muclists::setup_panel {w sw swl} { set sf [plugins::search::spanel $w.search \ -searchcommand [list [namespace parent]::mclistbox::do_search $swl] \ -closecommand [list [namespace current]::close_panel $w $sw $swl]] bind $w <> \ [double% [list [namespace current]::open_panel $w $sw $swl $sf]] } hook::add open_muc_list_post_hook \ [namespace current]::search::muclists::setup_panel # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/search/rawxml.tcl000064400000000000000000000020361477701321300170160ustar00nobodynobody# rawxml.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # implements search panel setup in raw XML window. namespace eval search {} namespace eval search::rawxml { hook::add open_rawxml_post_hook [namespace current]::setup_panel } proc search::rawxml::open_panel {w sf} { pack $sf -side bottom -anchor w -fill x -before $w.sw update idletasks $w.dump see end } proc search::rawxml::close_panel {w sf} { $w.dump tag remove search_highlight 0.0 end pack forget $sf focus $w.input } proc search::rawxml::setup_panel {w} { set dump $w.dump $dump mark set sel_start end $dump mark set sel_end 0.0 set sf [plugins::search::spanel [winfo parent $dump].search \ -searchcommand [list [namespace parent]::do_text_search $dump] \ -closecommand [list [namespace current]::close_panel $w]] bind [Wrapped $w.input] <> \ [double% [list [namespace current]::open_panel $w $sf]] } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/search/search.tcl000064400000000000000000000310211477701321300167450ustar00nobodynobody# search.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # implements searching in various widgets. if {$::darktheme} { option add *highlightSearchBackground PaleGreen4 widgetDefaul } else { option add *highlightSearchBackground PaleGreen1 widgetDefaul } ########################################################################## namespace eval search { custom::defgroup Plugins [::msgcat::mc "Plugins options."] \ -group Tkabber custom::defgroup Search \ [::msgcat::mc "Search in Tkabber windows options."] \ -group Plugins custom::defvar options(case) 0 \ [::msgcat::mc "Match case while searching in chat, log or disco windows."] \ -type boolean -group Search custom::defvar options(mode) substring \ [::msgcat::mc "Specifies search mode while searching in chat, log or\ disco windows. \"substring\" searches exact substring,\ \"glob\" uses glob style matching, \"regexp\" allows\ to match regular expression."] \ -type options \ -values [list substring substring glob glob regexp regexp] \ -group Search event add <> } ########################################################################## proc search::valid_input {val} { variable options expr {$options(mode) ne "regexp" || ![catch {regexp -- $val {}}]} } proc search::validate_entry {w val} { if {![catch {Widget::theme}] && [Widget::theme]} { set style TEntry if {[string match *notfound* [$w configure -style]]} { set style notfound.$style } if {![valid_input $val]} { set style invalid.$style } $w configure -style $style } else { if {[valid_input $val]} { $w configure -foreground [option get $w foreground Entry] } else { $w configure -foreground [option get $w errorForeground Entry] } } return 1 } ########################################################################## # Search in text widget proc search::glob2regexp {pattern} { string map {\\* \\* \\? \\? \\[ \\[ * .* ? . [^] \\^ [^ [\\^ [! [^ | \\| + \\+ ( \\( ) \\) $ \\$ . \\. \" \\"} $pattern } proc search::do_text_search {txt pattern dir} { variable options if {![string length $pattern]} { return 0 } if {$dir == "up"} { set search_from sel_start set search_to 0.0 set search_dir -backwards } else { set search_from "sel_start +1char" set search_to end set search_dir -forwards } if {$options(case)} { set case "" } else { set case -nocase } switch -- $options(mode) { regexp { set exact -regexp } glob { set exact -regexp set pattern [glob2regexp $pattern] } default { set exact -exact } } if {[catch { eval [list $txt] search $search_dir $case $exact -- \ [list $pattern $search_from] } index]} { set index {} } if {![string length $index]} { return 0 } else { $txt tag remove search_highlight 0.0 end if {$exact == "-regexp"} { set line [$txt get $index "$index lineend"] eval regexp $case -- [list $pattern $line] match $txt tag add search_highlight $index "$index + [string length $match] chars" if {[string length $match] == 0} { set nohighlight 1 } else { set nohighlight 0 } } else { $txt tag add search_highlight $index "$index + [string length $pattern] chars" if {[string length $pattern] == 0} { set nohighlight 1 } else { set nohighlight 0 } } if {!$nohighlight} { $txt tag configure search_highlight -background \ [option get $txt highlightSearchBackground Text] $txt mark set sel_start search_highlight.first $txt mark set sel_end search_highlight.last $txt see $index return 1 } } } ########################################################################## # Search in MyTree widget # Searches $where for $what using global searching options. # Returns: 1 if found, 0 otherwise. proc search::match {what where} { variable options if {$options(mode) == "substring"} { regsub -all {([*?\[\]\\])} $what {\\\1} what } if {$options(case)} { set case "" } else { set case -nocase } switch -- $options(mode) { substring - glob { return [eval string match $case [list *$what* $where]] } regexp { if {[catch {eval regexp $case -- [list $what $where]} res]} { return 0 } else { return $res } } exact { return [eval string equal $case [list $what $where]] } } return 0 } ########################################################################## ########################################################################## namespace eval search::bwtree {} ########################################################################## # Find "next" tree node # proc search::bwtree::next_node {t node} { if {[set child [lindex [$t children $node] 0]] != ""} { return $child } else { while {$node != ""} { set parent [$t parent $node] set siblings [$t children $parent] set idx [lsearch -exact $siblings $node] if {$idx < 0} { # This should not happen return $parent } set next_sibling [lindex $siblings [expr {$idx + 1}]] if {$next_sibling != ""} { return $next_sibling } set node $parent } return {} } } ########################################################################## # Find "previous" tree node # proc search::bwtree::prev_node {t node} { if {$node != ""} { set parent [$t parent $node] set siblings [$t children $parent] set idx [lsearch -exact $siblings $node] if {$idx < 0} { # This should not happen return $parent } set prev_sibling [lindex $siblings [expr {$idx - 1}]] if {$prev_sibling == ""} { return $parent } else { return [go_down $t $prev_sibling] } } else { return [go_down $t $node] } } proc search::bwtree::go_down {t node} { while {[set child [lindex [$t children $node] end]] != ""} { set node $child } return $node } ########################################################################## proc search::bwtree::search_node {t next_node node what} { set n $node while {[set n [$next_node $t $n]] != $node} { if {$n != {} && \ [[namespace parent]::match $what [$t item $n -text]]} { return $n } } if {$n != {} && \ [[namespace parent]::match $what [$t item $n -text]]} { return $n } return "" } ########################################################################## proc search::bwtree::do_search {tw pattern dir} { if {![string length $pattern]} { return 0 } if {$dir == "up"} { set start_node [lindex [$tw selection] 0] set node [search_node $tw \ [namespace current]::prev_node \ $start_node \ $pattern] } else { set start_node [lindex [$tw selection] end] set node [search_node $tw \ [namespace current]::next_node \ $start_node \ $pattern] } if {$node != ""} { search_hilite $tw $node return 1 } else { return 0 } } ########################################################################## proc search::bwtree::search_hilite {t node} { tree_openpath $t $node $t selection set [list $node] event generate $t <> $t see $node } proc search::bwtree::tree_openpath {t node} { variable state set node [$t parent $node] while {$node != {}} { $t item $node -open 1 set node [$t parent $node] } } ########################################################################## ########################################################################## # Support for searching in listbox widgets for Tkabber. namespace eval search::listbox {} ########################################################################## proc search::listbox::do_search {w pattern dir} { set selection_first 0 set selection_last [$w index end] for {set i 0} {$i < [$w index end]} {incr i} { if {[$w selection includes $i]} { if {$selection_first == 0} { set selection_first $i } set selection_last $i } } if {[string equal $dir down]} { set step 1 set start1 [incr selection_last] set end1 [$w index end] set cond1 {$i <= $end1} set start2 0 set end2 $selection_last set cond2 {$i < $end2} } else { set step -1 set start1 [incr selection_first -1] set end1 0 set cond1 {$i >= $end1} set start2 [$w index end] set end2 $selection_first set cond2 {$i > $end2} } set found 0 for {set i $start1} $cond1 {incr i $step} { if {[[namespace parent]::match $pattern [$w get $i]]} { set found 1 break } } if {!$found} { for {set i $start2} $cond2 {incr i $step} { if {[[namespace parent]::match $pattern [$w get $i]]} { set found 1 break } } } if {$found} { hilite $w $i } return $found } ########################################################################## proc search::listbox::hilite {w index} { $w selection clear 0 end $w selection set $index $w see $index } ########################################################################## ########################################################################## # Support for searching in mclistbox widgets for Tkabber. namespace eval search::mclistbox {} ########################################################################## proc search::mclistbox::do_search {w pattern dir} { set selection_first 0 set selection_last [$w size] for {set i 0} {$i < [$w size]} {incr i} { if {[$w sel includes $i]} { if {$selection_first == 0} { set selection_first $i } set selection_last $i } } if {[string equal $dir down]} { set step 1 set start1 [incr selection_last] set end1 [$w size] set cond1 {$i <= $end1} set start2 0 set end2 $selection_last set cond2 {$i < $end2} } else { set step -1 set start1 [incr selection_first -1] set end1 0 set cond1 {$i >= $end1} set start2 [$w size] set end2 $selection_first set cond2 {$i > $end2} } set found 0 for {set i $start1} $cond1 {incr i $step} { foreach item [$w get $i] { if {[[namespace parent]::match $pattern $item]} { set found 1 break } } if {$found} break } if {!$found} { for {set i $start2} $cond2 {incr i $step} { foreach item [$w get $i] { if {[[namespace parent]::match $pattern $item]} { set found 1 break } } if {$found} break } } if {$found} { hilite $w $i } return $found } ########################################################################## proc search::mclistbox::hilite {w index} { $w sel clear 0 end $w sel set $index $w show $index event generate $w <> } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/search/spanel.tcl000064400000000000000000000151031477701321300167650ustar00nobodynobody# spanel.tcl -- # # Generic horizontal search panel. if {$::darktheme} { option add *noMatchesBackground HotPink4 widgetDefault } else { option add *noMatchesBackground pink widgetDefault } namespace eval search {} # TODO (?) require searchcmd to return a list: # [search_result wrapped_around] # and signalize wrap-around condition to the user # # Recognized options: # -searchcommand # -opencommand # -closecommand # -allowclose # -twoway # -defaultdirection # proc search::spanel {w args} { set opencmd "" set closecmd "" set stopcmd "" set canclose 1 set twoway 1 set defbutton 0 set async 0 foreach {key val} $args { switch -- $key { -searchcommand { set searchcmd $val } -opencommand { set opencmd $val } -closecommand { set closecmd $val } -allowclose { set canclose $val } -twoway { set twoway $val } -defaultdirection { switch -- $val { up { set defbutton 0 } down { set defbutton 1 } default { error "Invaild default search direcrion: $val" } } } -stopcommand { set async 1 set stopcmd $val } default { error "invalid option: $key" } } } if {![info exists searchcmd]} { error "missing mandatory option: -searchcommand" } Frame $w set sentry [Entry $w.sentry \ -validate all \ -validatecommand [namespace code {validate_entry %W %P}]] pack $sentry -padx 1m -side left if {![catch {Widget::theme}] && [Widget::theme]} { if {[ttk::style configure notfound.TEntry -fieldbackground] eq ""} { set bg [option get $w noMatchesBackground Entry] set fg [option get $w errorForeground Entry] ttk::style configure notfound.TEntry -fieldbackground $bg ttk::style configure invalid.TEntry -foreground $fg ttk::style configure invalid.notfound.TEntry -fieldbackground $bg ttk::style configure invalid.notfound.TEntry -foreground $fg } set bg "" } else { set bg [lindex [$sentry configure -background] 4] } bind $w [namespace code [list spanel_open [double% $w] \ [double% $opencmd]]] set sbox [ButtonBox $w.sbox -spacing 0] if {$twoway} { set lbl [::msgcat::mc "Search up"] } else { set lbl [::msgcat::mc "Search"] } $sbox add -text $lbl \ -command [namespace code [list spanel_search $w $async \ $searchcmd up $bg]] if {$twoway} { $sbox add -text [::msgcat::mc "Search down"] \ -command [namespace code [list spanel_search $w $async \ $searchcmd down $bg]] } pack $sbox -side left -padx 1m set xbox [ButtonBox $w.xbox -spacing 0] $xbox add -text [::msgcat::mc "Cancel"] \ -command [namespace code [list spanel_cancel $w $stopcmd]] if {$async} { bind $sentry [namespace code [list spanel_cancel \ [double% $w] \ [double% $stopcmd]]] pack $xbox -side left -padx 1m } set cbox [ButtonBox $w.cbox -spacing 0] $cbox add -text [::msgcat::mc "Close"] \ -command [namespace code [list spanel_close $w $closecmd]] if {$canclose} { pack $cbox -side right -padx 1m } bind $sentry [double% [list $sbox invoke $defbutton]] bind $sentry +break ;# prevent forwarding upstream bind $sentry [double% [list $sbox invoke [expr {!$defbutton}]]] bind $sentry +break ;# prevent forwarding upstream if {$canclose} { bind $sentry [double% [list $cbox invoke 0]] bind $sentry +break ;# prevent forwarding upstream } spanel_state $w inactive set w } # In async mode, the result of eval'ing of $searchcmd # is treated specially: # * true ("found") means the client code has started the search process; # * false ("not found") means it refused to search for some reason. proc search::spanel_search {w async searchcmd dir dbg} { set sentry $w.sentry spanel_state $w active set cmd $searchcmd lappend cmd [$sentry get] $dir if {$async} { lappend cmd -completioncommand [list \ [namespace current]::spanel_on_completed $w $dbg] } set failed [catch { eval $cmd } found] if {$failed} { spanel_state $w inactive return -code error $found } if {$async && $found} return spanel_state $w inactive spanel_signalize_result $w $dbg $found } proc search::spanel_state {w state} { set sentry $w.sentry set sbox $w.sbox set xbox $w.xbox set cbox $w.cbox if {[string equal $state active]} { set a disabled set b normal } else { set a normal set b disabled } $sentry configure -state $a $sbox configure -state $a $xbox configure -state $b $cbox configure -state $a } proc search::spanel_signalize_result {w dbg found} { set sentry $w.sentry if {![catch {Widget::theme}] && [Widget::theme]} { set style TEntry if {!$found} { set style notfound.$style } if {![valid_input [$sentry get]]} { set style invalid.$style } $sentry configure -style $style } else { if {$found} { set bg $dbg } else { set bg [option get $sentry noMatchesBackground Entry] if {$bg == ""} { set bg $dbg } } $sentry configure -background $bg } focus $sentry } proc search::spanel_open {w opencmd} { if {$opencmd != ""} { eval $opencmd [list $w] } focus $w.sentry } proc search::spanel_close {w closecmd} { if {$closecmd != ""} { eval $closecmd [list $w] } } proc search::spanel_cancel {w stopcmd} { if {$stopcmd != ""} { eval $stopcmd [list $w] } } proc search::spanel_on_completed {w dbg found} { spanel_state $w inactive spanel_signalize_result $w $dbg $found } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/si000075500000000000000000000000001477701321300140665ustar00nobodynobodytkabber/plugins/si/ibb.tcl000064400000000000000000000156211477701321300154120ustar00nobodynobody# ibb.tcl -- # # In-Band Bytestreams (XEP-0047) transport for SI namespace eval ibb {} set ::NS(ibb) http://jabber.org/protocol/ibb ############################################################################### proc ibb::connect {stream chunk_size command} { upvar #0 $stream state set_status [::msgcat::mc "Opening IBB connection"] ::xmpp::sendIQ $state(xlib) set \ -query [::xmpp::xml::create open \ -xmlns $::NS(ibb) \ -attrs [list sid $state(id) \ block-size $chunk_size]] \ -to $state(jid) \ -command [list [namespace current]::recv_connect_response \ $stream $command] } proc ibb::recv_connect_response {stream command status xml} { upvar #0 $stream state if {$status != "ok"} { uplevel #0 $command [list [list 0 [error_to_string $xml]]] return } set state(seq) 0 uplevel #0 $command 1 } ############################################################################### package require base64 proc ibb::send_data {stream data command} { upvar #0 $stream state ::xmpp::sendMessage $state(xlib) $state(jid) \ -xlist [list [::xmpp::xml::create data \ -xmlns $::NS(ibb) \ -attrs [list sid $state(id) \ seq $state(seq)] \ -cdata [base64::encode $data]]] set state(seq) [expr {($state(seq) + 1) % 65536}] after 2000 [list uplevel #0 $command 1] } ############################################################################### proc ibb::close {stream} { upvar #0 $stream state ::xmpp::sendIQ $state(xlib) set \ -query [::xmpp::xml::create close \ -xmlns $::NS(ibb) \ -attrs [list sid $state(id)]] \ -to $state(jid) } ############################################################################### proc ibb::iq_set_handler {xlib from xml args} { ::xmpp::xml::split $xml tag xmlns attrs cdata subels set lang [::xmpp::xml::getAttr $args -lang en] set id [::xmpp::xml::getAttr $attrs sid] if {[catch {si::in $xlib $from $id} stream]} { return [list error modify bad-request \ -text [::trans::trans $lang \ "Stream ID has not been negotiated"]] } upvar #0 $stream state switch -- $tag { open { set state(block-size) [::xmpp::xml::getAttr $attrs block-size] set state(seq) 0 } close { si::closed $stream } data { set seq [::xmpp::xml::getAttr $attrs seq] if {$seq != $state(seq)} { si::closed $stream return [list error modify bad-request \ -text [::trans::trans $lang \ "Unexpected packet sequence number"]] } else { set state(seq) [expr {($state(seq) + 1) % 65536}] } set data $cdata if {[catch {set decoded [base64::decode $data]}]} { debugmsg si "IBB: WRONG DATA" si::closed $stream return [list error modify bad-request \ -text [::trans::trans $lang \ "Cannot decode received data"]] } else { debugmsg si "IBB: RECV DATA [list $data]" if {![si::recv_data $stream $decoded]} { si::closed $stream return [list error cancel not-allowed \ -text [::trans::trans $lang \ "File transfer is aborted"]] } } } default { return [list error modify bad-request] } } return [list result ""] } ::xmpp::iq::register set * $::NS(ibb) [namespace current]::ibb::iq_set_handler ############################################################################### proc ibb::return_error {xlib jid id error} { if {$id == ""} return ::xmpp::sendMessage $xlib $jid \ -type error \ -id $id \ -error [eval ::xmpp::stanzaerror::error $error] } ############################################################################### proc ibb::message_handler {xlib from mid type is_subject subject body \ err thread priority x} { if {$type == "error"} return foreach item $x { ::xmpp::xml::split $item tag xmlns attrs cdata subels if {[string equal $xmlns $::NS(ibb)]} { set id [::xmpp::xml::getAttr $attrs sid] if {[catch {si::in $xlib $from $id} stream]} { # Unknown Stream ID return_error $xlib $from $mid \ [list modify bad-request \ -text [::trans::trans \ "Stream ID has not been negotiated"]] return stop } upvar #0 $stream state set seq [::xmpp::xml::getAttr $attrs seq] if {$seq != $state(seq)} { # Incorrect sequence number si::closed $stream return_error $xlib $from $mid \ [list modify bad-request \ -text [::trans::trans \ "Unexpected packet sequence number"]] return stop } set state(seq) [expr {($state(seq) + 1) % 65536}] set data $cdata if {[catch {set decoded [base64::decode $data]}]} { debugmsg si "IBB: WRONG DATA" si::closed $stream return_error $xlib $from $mid \ [list modify bad-request \ -text [::trans::trans \ "Cannot decode received data"]] } else { debugmsg si "IBB: RECV DATA [list $data]" if {![si::recv_data $stream $decoded]} { si::closed $stream return_error $xlib $from $mid \ [list cancel not-allowed \ -text [::trans::trans \ "File transfer is aborted"]] } } return stop } } } hook::add process_message_hook [namespace current]::ibb::message_handler 50 ############################################################################### si::register_transport $::NS(ibb) $::NS(ibb) 75 enabled \ [namespace current]::ibb::connect \ [namespace current]::ibb::send_data \ [namespace current]::ibb::close # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/si/iqibb.tcl000064400000000000000000000111251477701321300157370ustar00nobodynobody# iqibb.tcl -- # # IQ-based In-Band Bytestreams (XEP is to be submitted) transport for SI namespace eval iqibb {} set ::NS(iqibb) http://jabber.org/protocol/iqibb ############################################################################### proc iqibb::connect {stream chunk_size command} { upvar #0 $stream state set_status [::msgcat::mc "Opening IQ-IBB connection"] ::xmpp::sendIQ $state(xlib) set \ -query [::xmpp::xml::create open \ -xmlns $::NS(iqibb) \ -attrs [list sid $state(id) \ block-size $chunk_size]] \ -to $state(jid) \ -command [list [namespace current]::recv_connect_response \ $stream $command] } proc iqibb::recv_connect_response {stream command status xml} { upvar #0 $stream state if {$status != "ok"} { uplevel #0 $command [list [list 0 [error_to_string $xml]]] return } set state(seq) 0 uplevel #0 $command 1 } ############################################################################### package require base64 proc iqibb::send_data {stream data command} { upvar #0 $stream state ::xmpp::sendIQ $state(xlib) set \ -query [::xmpp::xml::create data \ -xmlns $::NS(iqibb) \ -attrs [list sid $state(id) \ seq $state(seq)] \ -cdata [base64::encode $data]] \ -to $state(jid) \ -command [list [namespace current]::send_data_ack $stream $command] set state(seq) [expr {($state(seq) + 1) % 65536}] } proc iqibb::send_data_ack {stream command status xml} { if {$status != "ok"} { uplevel #0 $command [list [list 0 [error_to_string $xml]]] } else { uplevel #0 $command 1 } } ############################################################################### proc iqibb::close {stream} { upvar #0 $stream state ::xmpp::sendIQ $state(xlib) set \ -query [::xmpp::xml::create close \ -xmlns $::NS(iqibb) \ -attrs [list sid $state(id)]] \ -to $state(jid) } ############################################################################### proc iqibb::iq_set_handler {xlib from query args} { ::xmpp::xml::split $query tag xmlns attrs cdata subels set lang [::xmpp::xml::getAttr $args -lang en] set id [::xmpp::xml::getAttr $attrs sid] if {[catch {si::in $xlib $from $id} stream]} { return [list error modify bad-request \ -text [::trans::trans $lang \ "Stream ID has not been negotiated"]] } upvar #0 $stream state switch -- $tag { open { set state(block-size) [::xmpp::xml::getAttr $attrs block-size] set state(seq) 0 } close { si::closed $stream } data { set seq [::xmpp::xml::getAttr $attrs seq] if {$seq != $state(seq)} { si::closed $stream return [list error modify bad-request \ -text [::trans::trans $lang \ "Unexpected packet sequence number"]] } else { set state(seq) [expr {($state(seq) + 1) % 65536}] } set data $cdata if {[catch {set decoded [base64::decode $data]}]} { debugmsg si "IQIBB: WRONG DATA" si::closed $stream return [list error modify bad-request \ -text [::trans::trans $lang \ "Cannot decode received data"]] } else { debugmsg si "IQIBB: RECV DATA [list $data]" if {![si::recv_data $stream $decoded]} { si::closed $stream return [list error cancel not-allowed \ -text [::trans::trans $lang \ "File transfer is aborted"]] } } } } return [list result ""] } ::xmpp::iq::register set * $::NS(iqibb) \ [namespace current]::iqibb::iq_set_handler ############################################################################### si::register_transport $::NS(iqibb) $::NS(iqibb) 70 enabled \ [namespace current]::iqibb::connect \ [namespace current]::iqibb::send_data \ [namespace current]::iqibb::close # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/si/socks5.tcl000064400000000000000000000454601477701321300160710ustar00nobodynobody# socks5.tcl -- # # SOCKS5 Bytestreams (XEP-0065) transport for SI namespace eval socks5 {} namespace eval socks5::target {} namespace eval socks5::initiator { custom::defvar options(enable_mediated_connection) 1 \ [::msgcat::mc "Use mediated SOCKS5 connection if proxy is available."] \ -group {Stream Initiation} -type boolean custom::defvar options(proxy_servers) "" \ [::msgcat::mc "List of proxy servers for SOCKS5 bytestreams (all\ available servers will be tried for mediated connection)."] \ -group {Stream Initiation} -type string } set ::NS(bytestreams) http://jabber.org/protocol/bytestreams ############################################################################### proc socks5::target::sock_connect {stream iqid hosts lang} { upvar #0 $stream state if {![info exists state(id)] || [llength $hosts] == 0} { sock_finish $stream $iqid $lang error "" return } set tail [lassign $hosts host] lassign $host addr port streamhost debugmsg si "CONNECTING TO $addr:$port..." set token [::pconnect::socket $addr $port \ -proxyfilter ::proxy::proxyfilter \ -command [namespace code [list sock_writable \ $stream $iqid $lang \ $streamhost $tail]]] return } proc socks5::target::sock_writable {stream iqid lang streamhost hosts status sock} { upvar #0 $stream state if {$status != "ok"} { sock_connect $stream $iqid $hosts $lang return } fconfigure $sock -translation binary -blocking no if {![info exists state(id)]} { ::close $sock sock_finish $stream $iqid $lang error "" return } if {[catch {fconfigure $sock -peername}]} { ::close $sock sock_connect $stream $iqid $hosts $lang return } puts -nonewline $sock "\x05\x01\x00" if {[catch {flush $sock}]} { ::close $sock sock_connect $stream $iqid $hosts $lang return } set state(sock) $sock fileevent $sock readable \ [namespace code [list wait_for_method $sock $stream $iqid \ $lang $streamhost $hosts]] return } proc socks5::target::sock_finish {stream iqid lang status streamhost} { upvar #0 $stream state if {$status == "ok"} { debugmsg si "SUCCEDED ($streamhost)" ::xmpp::sendIQ $state(xlib) result \ -query [::xmpp::xml::create query \ -xmlns $::NS(bytestreams) \ -subelement [::xmpp::xml::create streamhost-used \ -attrs [list jid \ $streamhost]]] \ -id $iqid \ -to $state(jid) } else { debugmsg si "FAILED" ::xmpp::sendIQ $state(xlib) error \ -error [::xmpp::stanzaerror::error cancel item-not-found \ -text [::trans::trans \ $lang \ "Cannot connect to any\ of the streamhosts"]] \ -id $iqid \ -to $state(jid) } return } ############################################################################### proc socks5::target::wait_for_method {sock stream iqid lang streamhost hosts} { upvar #0 $stream state if {![info exists state(id)]} { ::close $sock sock_finish $stream $iqid $lang error "" return } if {[catch {set data [read $sock]}]} { ::close $sock sock_connect $stream $iqid $hosts $lang return } if {[eof $sock]} { ::close $sock sock_connect $stream $iqid $hosts $lang return } binary scan $data cc ver method if {$ver != 5 || $method != 0} { ::close $sock sock_connect $stream $iqid $hosts $lang return } set myjid [encoding convertto utf-8 \ [::xmpp::jid::normalize [my_jid $state(xlib) $state(jid)]]] set hisjid [encoding convertto utf-8 [::xmpp::jid::normalize $state(jid)]] set hash [::sha1::sha1 $state(id)$hisjid$myjid] set len [binary format c [string length $hash]] puts -nonewline $sock "\x05\x01\x00\x03$len$hash\x00\x00" flush $sock fileevent $sock readable \ [list [namespace current]::wait_for_reply $sock $stream $iqid \ $lang $streamhost $hosts] } proc socks5::target::wait_for_reply {sock stream iqid lang streamhost hosts} { upvar #0 $stream state if {![info exists state(id)]} { ::close $sock sock_finish $stream $iqid $lang error "" return } if {[catch {set data [read $sock]}]} { ::close $sock sock_connect $stream $iqid $hosts $lang return } if {[eof $sock]} { ::close $sock sock_connect $stream $iqid $hosts $lang return } binary scan $data cc ver rep if {$ver != 5 || $rep != 0} { ::close $sock sock_connect $stream $iqid $hosts $lang return } fileevent $sock readable \ [list [namespace parent]::readable $stream $sock] sock_finish $stream $iqid $lang ok $streamhost } ############################################################################### proc socks5::target::send_data {stream data} { upvar #0 $stream state puts -nonewline $state(sock) $data flush $state(sock) return 1 } ############################################################################### proc socks5::target::close {stream} { upvar #0 $stream state ::close $state(sock) } ############################################################################### ############################################################################### proc socks5::initiator::connect {stream chunk_size command} { variable options variable hash_sid upvar #0 $stream state set_status [::msgcat::mc "Opening SOCKS5 listening socket"] set servsock [socket -server [list [namespace current]::accept $stream] 0] set state(servsock) $servsock lassign [fconfigure $servsock -sockname] addr hostname port set ip [::xmpp::ip $state(xlib)] set myjid [encoding convertto utf-8 \ [::xmpp::jid::normalize [my_jid $state(xlib) $state(jid)]]] set hisjid [encoding convertto utf-8 [::xmpp::jid::normalize $state(jid)]] set hash [::sha1::sha1 $state(id)$myjid$hisjid] set hash_sid($hash) $state(id) set streamhosts [list [::xmpp::xml::create streamhost \ -attrs [list jid [my_jid $state(xlib) $state(jid)] \ host $ip \ port $port]]] if {!$options(enable_mediated_connection)} { request $stream $streamhosts $command } else { set proxies [split $options(proxy_servers)] set proxies1 {} foreach p $proxies { if {$p != ""} { lappend proxies1 $p } } request_proxy $stream $streamhosts $proxies1 $command } } ############################################################################### proc socks5::initiator::request_proxy \ {stream streamhosts proxies command} { upvar #0 $stream state if {[llength $proxies] == 0} { request $stream $streamhosts $command } else { ::xmpp::sendIQ $state(xlib) get \ -query [::xmpp::xml::create query \ -xmlns $::NS(bytestreams)] \ -to [lindex $proxies 0] \ -command [list [namespace current]::recv_request_proxy_response \ $stream $streamhosts [lrange $proxies 1 end] \ $command] } } proc socks5::initiator::recv_request_proxy_response \ {stream streamhosts proxies command res child} { upvar #0 $stream state if {![info exists state(id)]} { return } if {$res == "abort"} { uplevel #0 $command [list [list 0 [::msgcat::mc "Aborted"]]] return } if {$res != "ok"} { request_proxy $stream $streamhosts $proxies $command return } ::xmpp::xml::split $child tag xmlns attrs cdata subels foreach subel $subels { ::xmpp::xml::split $subel stag sxmlns sattrs scdata ssubels if {$stag == "streamhost"} { lappend streamhosts $subel } } request_proxy $stream $streamhosts $proxies $command } ############################################################################### proc socks5::initiator::request {stream streamhosts command} { upvar #0 $stream state ::xmpp::sendIQ $state(xlib) set \ -query [::xmpp::xml::create query \ -xmlns $::NS(bytestreams) \ -attrs [list sid $state(id)] \ -subelements $streamhosts] \ -to $state(jid) \ -command [list [namespace current]::recv_request_response \ $stream $streamhosts $command] } proc socks5::initiator::recv_request_response \ {stream streamhosts command res child} { upvar #0 $stream state if {![info exists state(id)]} { return } if {$res != "ok"} { uplevel #0 $command [list [list 0 [error_to_string $child]]] return } ::xmpp::xml::split $child tag xmlns attrs cdata subels ::xmpp::xml::split [lindex $subels 0] stag sxmlns sattrs scdata ssubels if {$stag != "streamhost-used"} { uplevel #0 $command [list [list 0 [::msgcat::mc "Illegal result"]]] return } set jid [::xmpp::xml::getAttr $sattrs jid] set idx 0 foreach streamhost $streamhosts { ::xmpp::xml::split $streamhost sstag ssxmlns ssattrs sscdata sssubels if {[::xmpp::xml::getAttr $ssattrs jid] == $jid} { break } incr idx } if {$idx == 0} { # Target uses nonmediated connection uplevel #0 $command 1 } elseif {$idx == [llength $streamhosts]} { # Target has reported missing JID uplevel #0 $command [list [list 0 [::msgcat::mc "Illegal result"]]] } else { # TODO: zeroconf support set jid [::xmpp::xml::getAttr $ssattrs jid] set host [::xmpp::xml::getAttr $ssattrs host] set port [::xmpp::xml::getAttr $ssattrs port] # Target uses proxy, so closing server socket ::close $state(servsock) proxy_connect $stream $jid $host $port $command } } ############################################################################### proc socks5::initiator::proxy_connect {stream jid host port command} { upvar #0 $stream state debugmsg si "CONNECTING TO SOCKS5 PROXY $host:$port..." set token [::pconnect::socket $host $port \ -proxyfilter ::proxy::proxyfilter \ -command [namespace code [list sock_writable $stream $jid $command]]] return } proc socks5::initiator::sock_writable {stream jid command status sock} { upvar #0 $stream state if {$status != "ok"} { debugmsg si "CONNECTION FAILED" uplevel #0 $command [list [list 0 [::msgcat::mc \ "Cannot connect to proxy"]]] return } debugmsg si "CONNECTED" fconfigure $sock -translation binary -blocking no set state(sock) $sock puts -nonewline $sock "\x05\x01\x00" flush $sock fileevent $sock readable \ [list [namespace current]::proxy_wait_for_method $sock $stream $jid $command] return } proc socks5::initiator::sock_finish {sock stream jid command status} { upvar #0 $stream state if {$status != "ok"} { debugmsg si "SOCKS5 NEGOTIATION FAILED" ::close $sock uplevel #0 $command \ [list [list 0 [::msgcat::mc \ "Cannot negotiate proxy connection"]]] return } # Activate mediated connection ::xmpp::sendIQ $state(xlib) set \ -query [::xmpp::xml::create query \ -xmlns $::NS(bytestreams) \ -attrs [list sid $state(id)] \ -subelement [::xmpp::xml::create activate \ -cdata $state(jid)]] \ -to $jid \ -command [list [namespace current]::proxy_activate_response \ $stream $command] } ############################################################################### proc socks5::initiator::proxy_activate_response {stream command res child} { upvar #0 $stream state if {![info exists state(id)]} { return } if {$res != "ok"} { uplevel #0 $command [list [list 0 [error_to_string $child]]] return } uplevel #0 $command 1 } ############################################################################### proc socks5::initiator::proxy_wait_for_method {sock stream jid command} { upvar #0 $stream state if {![info exists state(id)]} { return } if {[catch {set data [read $sock]}]} { sock_finish $sock $stream $jid $command error return } if {[eof $sock]} { sock_finish $sock $stream $jid $command error return } binary scan $data cc ver method if {$ver != 5 || $method != 0} { sock_finish $sock $stream $jid $command error return } set myjid [encoding convertto utf-8 \ [::xmpp::jid::normalize [my_jid $state(xlib) $state(jid)]]] set hisjid [encoding convertto utf-8 [::xmpp::jid::normalize $state(jid)]] set hash [::sha1::sha1 $state(id)$myjid$hisjid] set len [binary format c [string length $hash]] puts -nonewline $sock "\x05\x01\x00\x03$len$hash\x00\x00" flush $sock fileevent $sock readable \ [list [namespace current]::proxy_wait_for_reply $sock $stream $jid $command] } proc socks5::initiator::proxy_wait_for_reply {sock stream jid command} { upvar #0 $stream state if {![info exists state(id)]} { return } if {[catch {set data [read $sock]}]} { sock_finish $sock $stream $jid $command error return } if {[eof $sock]} { sock_finish $sock $stream $jid $command error return } binary scan $data cc ver rep if {$ver != 5 || $rep != 0} { sock_finish $sock $stream $jid $command error return } sock_finish $sock $stream $jid $command ok return } ############################################################################### proc socks5::initiator::send_data {stream data command} { upvar #0 $stream state puts -nonewline $state(sock) $data flush $state(sock) after idle [list uplevel #0 $command 1] } ############################################################################### proc socks5::initiator::close {stream} { upvar #0 $stream state ::close $state(sock) catch {::close $state(servsock)} } ############################################################################### proc socks5::initiator::accept {stream sock addr port} { upvar #0 $stream state debugmsg si "CONNECT FROM $addr:$port" set state(sock) $sock fconfigure $sock -translation binary -blocking no fileevent $sock readable \ [list [namespace current]::wait_for_methods $sock $stream] } proc socks5::initiator::wait_for_methods {sock stream} { upvar #0 $stream state if {[catch {set data [read $sock]}]} { ::close $sock return } if {[eof $sock]} { ::close $sock return } binary scan $data ccc* ver nmethods methods if {$ver != 5 || 0 ni $methods} { puts -nonewline $sock "\x05\xff" ::close $sock return } puts -nonewline $sock "\x05\x00" flush $sock fileevent $sock readable \ [list [namespace current]::wait_for_request $sock $stream] } proc socks5::initiator::wait_for_request {sock stream} { variable hash_sid upvar #0 $stream state if {[catch {set data [read $sock]}]} { ::close $sock return } if {[eof $sock]} { ::close $sock return } binary scan $data ccccc ver cmd rsv atyp len if {$ver != 5 || $cmd != 1 || $atyp != 3} { set reply [string replace $data 1 1 \x07] puts -nonewline $sock $reply ::close $sock return } binary scan $data @5a${len} hash debugmsg si "RECV HASH: $hash" if {[info exists hash_sid($hash)] && \ [string equal $hash_sid($hash) $state(id)]} { set reply [string replace $data 1 1 \x00] puts -nonewline $sock $reply flush $sock fileevent $sock readable {} } else { set reply [string replace $data 1 1 \x02] puts -nonewline $sock $reply ::close $sock } } ############################################################################### proc socks5::readable {stream chan} { if {![eof $chan]} { set buf [read $chan 4096] si::recv_data $stream $buf } else { fileevent $chan readable {} si::closed $stream } } ############################################################################### proc socks5::iq_set_handler {xlib from child args} { ::xmpp::xml::split $child tag xmlns attrs cdata subels set iqid [::xmpp::xml::getAttr $args -id] set lang [::xmpp::xml::getAttr $args -lang en] if {$tag != "query"} { return [list error modify bad-request] } set id [::xmpp::xml::getAttr $attrs sid] if {[catch {si::in $xlib $from $id} stream]} { return [list error modify bad-request \ -text [::trans::trans $lang \ "Stream ID has not been negotiated"]] } set hosts {} foreach item $subels { ::xmpp::xml::split $item stag sxmlns sattrs scdata1 ssubels switch -- $stag { streamhost { lappend hosts [list [::xmpp::xml::getAttr $sattrs host] \ [::xmpp::xml::getAttr $sattrs port] \ [::xmpp::xml::getAttr $sattrs jid]] } } } debugmsg si [list $hosts] [namespace current]::target::sock_connect $stream $iqid $hosts $lang } ::xmpp::iq::register set * $::NS(bytestreams) \ [namespace current]::socks5::iq_set_handler si::register_transport $::NS(bytestreams) $::NS(bytestreams) 50 disabled \ [namespace current]::socks5::initiator::connect \ [namespace current]::socks5::initiator::send_data \ [namespace current]::socks5::initiator::close # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/unix000075500000000000000000000000001477701321300144365ustar00nobodynobodytkabber/plugins/unix/icon.tcl000064400000000000000000000033131477701321300161510ustar00nobodynobody# icon.tcl -- # # This file is a part of the Tkabber XMPP client. This plugin provides # titlebar icons support. ########################################################################## namespace eval icon { hook::add finload_hook [namespace current]::win_icons } ########################################################################## proc icon::win_icons {} { # Do not load static icon if a WindowMaker dock is used. if {[info exists ::wmaker_dock] && $::wmaker_dock} { return } wm iconphoto . roster/user/unavailable trace add variable ::curuserstatus write [namespace code update_icon] bind all +[namespace code { if {[string equal [winfo toplevel %W] %W]} { win_icon_setup %W } }] } ########################################################################## proc icon::win_icon_setup {w} { if {$w == "."} return switch -- [winfo class $w] { Chat { wm iconphoto $w roster/conference/available } JDisco { wm iconphoto $w roster/user/available } default { wm iconphoto $w roster/user/available } } } ########################################################################## proc icon::update_icon {name1 {name2 ""} {op ""}} { global curuserstatus wm iconphoto . roster/user/$curuserstatus } ########################################################################## proc icon::update_all_icons {} { catch { foreach w [concat . [winfo children .]] { win_icon_setup $w } update_icon curuserstatus } } hook::add set_theme_hook [namespace current]::icon::update_all_icons # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/unix/menu.tcl000064400000000000000000000227711477701321300161760ustar00nobodynobody# menu.tcl -- # # This file is a part of the Tkabber XMPP client. It overrides the # stock Tcl/Tk menues on UNIX and make them stay after button is up, # which is way more convenient. namespace eval :: { proc myMenuButtonDown {args} { global myMenuFlag myMenuMotion eval ::tk::MenuButtonDown $args set myMenuFlag 1 } proc myMenuInvoke {args} { global myMenuFlag myMenuMotion if {$myMenuFlag || $myMenuMotion} { eval ::tk::MenuInvoke $args } set myMenuFlag 0 set myMenuMotion 0 } proc myMenuMotion {args} { global myMenuFlag myMenuMotion eval ::tk::MenuMotion $args set myMenuMotion 1 } proc myMenuLeave {args} { global myMenuFlag myMenuMotion eval ::tk::MenuLeave $args set myMenuMotion 0 } bind Menu {myMenuLeave %W %X %Y %s} bind Menu {myMenuButtonDown %W} bind Menu {myMenuInvoke %W 1} bind Menu {myMenuMotion %W %x %y %s} set myMenuFlag 0 set myMenuMotion 0 # ::tk::MenuNextEntry -- # Activate the next higher or lower entry in the posted menu, # wrapping around at the ends. Disabled entries are skipped. # # Arguments: # menu - Menu window that received the keystroke. # count - 1 means go to the next lower entry, # -1 means go to the next higher entry. proc ::tk::MenuNextEntry {menu count} { global ::tk::Priv if {[string equal [$menu index last] "none"]} { return } set length [expr {[$menu index last]+1}] set quitAfter $length set active [$menu index active] if {[string equal $active "none"]} { set i 0 } else { set i [expr {$active + $count}] } while {1} { if {$quitAfter <= 0} { # We've tried every entry in the menu. Either there are # none, or they're all disabled. Just give up. return } while {$i < 0} { incr i $length } while {$i >= $length} { incr i -$length } if {[catch {$menu entrycget $i -state} state] == 0} { if {[string compare $state "disabled"]} { break } } if {$i == $active} { return } incr i $count incr quitAfter -1 } $menu activate $i ::tk::GenerateMenuSelect $menu if {[string equal [$menu type $i] "cascade"]} { set cascade [$menu entrycget $i -menu] if {[string equal [$menu cget -type] "menubar"] && [string compare $cascade ""]} { # Here we auto-post a cascade. This is necessary when # we traverse left/right in the menubar, but undesirable when # we traverse up/down in a menu. $menu postcascade $i ::tk::MenuFirstEntry $cascade } } } # ::tk::MenuNextMenu -- # This procedure is invoked to handle "left" and "right" traversal # motions in menus. It traverses to the next menu in a menu bar, # or into or out of a cascaded menu. # # Arguments: # menu - The menu that received the keyboard # event. # direction - Direction in which to move: "left" or "right" proc ::tk::MenuNextMenu {menu direction} { global ::tk::Priv # First handle traversals into and out of cascaded menus. if {[string equal $direction "right"]} { set count 1 set parent [winfo parent $menu] set class [winfo class $parent] if {[string equal [$menu type active] "cascade"]} { $menu postcascade active set m2 [$menu entrycget active -menu] if {[string compare $m2 ""]} { ::tk::MenuFirstEntry $m2 } return } else { set parent [winfo parent $menu] while {[string compare $parent "."]} { if {[string equal [winfo class $parent] "Menu"] \ && [string equal [$parent cget -type] "menubar"]} { tk_menuSetFocus $parent ::tk::MenuNextEntry $parent 1 return } set parent [winfo parent $parent] } } } else { set count -1 set m2 [winfo parent $menu] if {[string equal [winfo class $m2] "Menu"]} { if {[string compare [$m2 cget -type] "menubar"]} { $menu activate none ::tk::GenerateMenuSelect $menu tk_menuSetFocus $m2 # This code unposts any posted submenu in the parent. $m2 postcascade none #set tmp [$m2 index active] #$m2 activate none #$m2 activate $tmp return } } } # Can't traverse into or out of a cascaded menu. Go to the next # or previous menubutton, if that makes sense. set m2 [winfo parent $menu] if {[string equal [winfo class $m2] "Menu"]} { if {[string equal [$m2 cget -type] "menubar"]} { tk_menuSetFocus $m2 ::tk::MenuNextEntry $m2 -1 return } } set w $::tk::Priv(postedMb) if {[string equal $w ""]} { return } set buttons [winfo children [winfo parent $w]] set length [llength $buttons] set i [expr {[lsearch -exact $buttons $w] + $count}] while {1} { while {$i < 0} { incr i $length } while {$i >= $length} { incr i -$length } set mb [lindex $buttons $i] if {[string equal [winfo class $mb] "Menubutton"] \ && [string compare [$mb cget -state] "disabled"] \ && [string compare [$mb cget -menu] ""] \ && [string compare [[$mb cget -menu] index last] "none"]} { break } if {[string equal $mb $w]} { return } incr i $count } ::tk::MbPost $mb ::tk::MenuFirstEntry [$mb cget -menu] } # ::tk::MenuFirstEntry -- # Given a menu, this procedure finds the first entry that isn't # disabled or a tear-off or separator, and activates that entry. # However, if there is already an active entry in the menu (e.g., # because of a previous call to ::tk::PostOverPoint) then the active # entry isn't changed. This procedure also sets the input focus # to the menu. # # Arguments: # menu - Name of the menu window (possibly empty). proc ::tk::MenuFirstEntry menu { if {[string equal $menu ""]} { return } tk_menuSetFocus $menu if {[string compare [$menu index active] "none"]} { return } set last [$menu index last] if {[string equal $last "none"]} { return } for {set i 0} {$i <= $last} {incr i} { if {([catch {set state [$menu entrycget $i -state]}] == 0) \ && [string compare $state "disabled"]} { $menu activate $i ::tk::GenerateMenuSelect $menu # Only post the cascade if the current menu is a menubar; # otherwise, if the first entry of the cascade is a cascade, # we can get an annoying cascading effect resulting in a bunch of # menus getting posted (bug 676) if {[string equal [$menu type $i] "cascade"] && \ [string equal [$menu cget -type] "menubar"]} { set cascade [$menu entrycget $i -menu] if {[string compare $cascade ""]} { $menu postcascade $i ::tk::MenuFirstEntry $cascade } } return } } } # ::tk::MenuMotion -- # This procedure is called to handle mouse motion events for menus. # It does two things. First, it resets the active element in the # menu, if the mouse is over the menu. Second, if a mouse button # is down, it posts and unposts cascade entries to match the mouse # position. # # Arguments: # menu - The menu window. # x - The x position of the mouse. # y - The y position of the mouse. # state - Modifier state (tells whether buttons are down). proc ::tk::MenuMotion {menu x y state} { global ::tk::Priv if {[string equal $menu $::tk::Priv(window)]} { if {[string equal [$menu cget -type] "menubar"]} { if {[info exists ::tk::Priv(focus)] && \ [string compare $menu $::tk::Priv(focus)]} { $menu activate @$x,$y ::tk::GenerateMenuSelect $menu } } else { $menu activate @$x,$y ::tk::GenerateMenuSelect $menu } } #debugmsg plugins "MENU: $menu $::tk::Priv(activeMenu) $::tk::Priv(activeItem) $::tk::Priv(focus)" if {(![string equal [$menu cget -type] "menubar"]) || \ ([info exist ::tk::Priv(focus)] && ($::tk::Priv(focus) != "") && ($::tk::Priv(activeItem) != "none"))} { myMenuPostCascade $menu } } set myPriv(id) "" set myPriv(delay) 170 set myPriv(activeMenu) "" set myPriv(activeItem) "" proc myMenuPostCascade {menu} { global myPriv if {$myPriv(id) != ""} { if {($myPriv(activeMenu) == $menu) && ($myPriv(activeItem) == [$menu index active])} { return } else { after cancel $myPriv(id) } } if {[string equal [$menu cget -type] "menubar"]} { $menu postcascade active } else { set myPriv(activeMenu) $menu set myPriv(activeItem) [$menu index active] set myPriv(id) [after $myPriv(delay) "$menu postcascade active"] } } } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/unix/tktray.tcl000064400000000000000000000057261477701321300165510ustar00nobodynobody# tktray.tcl -- # # Another Freedesktop systray icon support. # Requires tktray (http://sw4me.com/wiki/Tktray) package if {[catch { package require tktray }]} return ########################################################################## namespace eval tktray { variable options custom::defvar options(enable) 1 \ [::msgcat::mc "Enable freedesktop system tray icon."] \ -group Systray -type boolean \ -command [namespace code enable_disable] variable s2p variable k variable v foreach {k v} [list available available \ away away \ chat chat \ dnd dnd \ xa xa \ unavailable unavailable \ invisible invisible \ blank blank \ message1 message-server \ message2 message \ message3 message-personal] { set s2p($k) docking/$v } } ########################################################################## proc tktray::enable_disable {args} { variable options set icon .tksi if {$options(enable) && ![winfo exists $icon]} { ifacetk::systray::create $icon \ -createcommand [namespace code create] \ -configurecommand [namespace code configure] \ -destroycommand [namespace code destroy] \ -locationcommand [namespace code location] } elseif {!$options(enable) && [winfo exists $icon]} { ifacetk::systray::destroy $icon } } hook::add finload_hook [namespace current]::tktray::enable_disable ########################################################################## proc tktray::create {icon} { variable s2p tktray::icon $icon -image $s2p(unavailable) -class TkabberIcon update idletasks set m [ifacetk::systray::popupmenu $icon.menu] bind $icon ifacetk::systray::restore bind $icon <> ifacetk::systray::withdraw bind $icon <> [list tk_popup [double% $m] %X %Y] balloon::setup $icon -command [list ifacetk::systray::balloon $icon] } ########################################################################## proc tktray::configure {icon status} { variable s2p if {$icon ne "" && [winfo exists $icon]} { $icon configure -image $s2p($status) } } ########################################################################## proc tktray::destroy {icon} { if {$icon ne "" && [winfo exists $icon]} { ::destroy $icon } } ########################################################################## proc tktray::location {icon} { if {$icon ne "" && [winfo exists $icon]} { return [lrange [$icon bbox] 0 1] } else { return {0 0} } } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/unix/wmdock.tcl000064400000000000000000000076431477701321300165170ustar00nobodynobody# wmdock.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin # which implements basic WindowMaker icon. if {![info exists ::wmaker_dock] || !$::wmaker_dock} { return } namespace eval ::wmdock { variable save_status unavailable variable balloon_msg "" variable msgs 0 variable msgsc array set msgsc {} variable msg_afterid "" } proc ::wmdock::change_status {status} { variable save_status variable msgs variable balloon_msg if {![winfo exists .icon]} return set save_status $status set balloon_msg $status .icon.c itemconfigure text -text [concat $msgs "msgs"] .icon.c itemconfigure icon -image roster/user/$status } proc ::wmdock::msg_recv {chatid from type body x} { variable msg_afterid variable balloon_msg variable msgs variable msgsc variable icon if {![winfo exists .icon]} return if {[chat::is_our_jid $chatid $from] || $type ne "chat"} { return } foreach xelem $x { ::xmpp::xml:split $xelem tag xmlns attrs cdata subels # Don't count message if this 'empty' tag is present. It indicates # messages history in chat window. if {[string equal $tag ""] && [string equal $xmlns tkabber:x:nolog]} { return } } set cw [chat::winid $chatid] set page [string range [win_id tab $cw] 1 end] if {$::usetabbar && $page != [.nb raise]} { if {![info exists msgsc($chatid)]} { set msgsc($chatid) 0 } incr msgsc($chatid) 1 incr msgs 1 } # set balloon_msg [concat "Message from" [roster::get_label $from] ] set balloon_msg [::msgcat::mc "Message from %s" $from] after cancel $msg_afterid .icon.c itemconfigure icon -image docking/message .icon.c itemconfigure text -text [::msgcat::mc "%s msgs" $msgs] set msg_afterid [after 5000 ::wmdock::clear_msg_status] } proc ::wmdock::msg_read {path chatid} { variable msgs variable msgsc if {![winfo exists .icon]} return if {[info exists msgsc($chatid)]} { set msgs [expr $msgs - $msgsc($chatid)] unset msgsc($chatid) } .icon.c itemconfigure text -text [::msgcat::mc "%s msgs" $msgs] } proc ::wmdock::presence_recv {who status} { variable msg_afterid variable balloon_msg variable icon if {![winfo exists .icon]} return set balloon_msg [::msgcat::mc "%s is %s" $who $status] after cancel $msg_afterid .icon.c itemconfigure icon -image browser/user set msg_afterid [after 10000 ::wmdock::clear_msg_status] } proc ::wmdock::clear_msg_status {} { variable save_status variable balloon_msg if {![winfo exists .icon]} return set balloon_msg $save_status .icon.c itemconfigure icon -image roster/user/$save_status } proc ::wmdock::showhide {} { if {[wm state .] == "withdrawn"} { wm deiconify . wm state . normal } else { wm withdraw . } } proc ::wmdock::balloon {} { variable balloon_msg return [list .icon $balloon_msg] } proc ::wmdock::create_dock {} { variable balloon_msg if {[wm iconwindow .] eq ""} { toplevel .icon -class TkabberIcon wm iconwindow . .icon } wm command . [file join [pwd] $::argv0] canvas .icon.c -background black -width 52 -height 52 -relief sunken .icon.c create image 26 26 -anchor s \ -image roster/user/unavailable -tag icon .icon.c create text 26 52 -anchor s -text "no" -fill white -tag text pack .icon.c bind .icon <> ::wmdock::showhide balloon::setup .icon -command [list ::wmdock::balloon] } hook::add postload_hook ::wmdock::create_dock 80 hook::add change_our_presence_post_hook ::wmdock::change_status 15 hook::add draw_message_hook ::wmdock::msg_recv 70 hook::add on_change_user_presence_hook ::wmdock::presence_recv 15 hook::add raise_chat_tab_hook ::wmdock::msg_read 15 # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/windows000075500000000000000000000000001477701321300151455ustar00nobodynobodytkabber/plugins/windows/console.tcl000064400000000000000000000020001477701321300173620ustar00nobodynobody# console.tcl -- # This file is a part of the Tkabber XMPP client. It's a plugin which # adds a console menu item into the services->debug submenu under # MS Windows. namespace eval console { variable showConsole 0 hook::add finload_hook [namespace current]::add_console_menu console eval { bind . { consoleinterp eval {set ::plugins::console::showConsole 1} } bind . { consoleinterp eval {set ::plugins::console::showConsole 0} } } } proc console::add_console_menu {} { set menu [.mainframe getmenu debug] $menu add checkbutton -label [::msgcat::mc "Show console"] \ -command [namespace current]::show_console \ -variable [namespace current]::showConsole show_console } proc console::show_console {} { variable showConsole if {$showConsole} { console show } else { console hide } } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/windows/mousewheel.tcl000064400000000000000000000025331477701321300201100ustar00nobodynobody# mousewheel.tcl -- # # This file is a part of the Tkabber XMPP client. It's a plugin which # makes widgets in Windows receive mousewheel events even in unfocused # state. It also converts the mousewheel events into button events # which aloows one to bind them identically on all platforms. namespace eval mousewheel {} proc mousewheel::convert_to_button {modifier d x y} { switch -- $modifier { shift { set scroll_up <> set scroll_down <> } default { set scroll_up <> set scroll_down <> } } if {$d < 0} { for {set i 0} {$i > $d} {incr i -120} { event generate [winfo containing $x $y] $scroll_down } } else { for {set i 0} {$i < $d} {incr i 120} { event generate [winfo containing $x $y] $scroll_up } } } bind Text " " bind ListBox " " bind Text " " bind ListBox " " bind all \ [list [namespace current]::mousewheel::convert_to_button none %D %X %Y] bind all +break bind all \ [list [namespace current]::mousewheel::convert_to_button shift %D %X %Y] bind all +break # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/plugins/windows/taskbar.tcl000064400000000000000000000135631477701321300173670ustar00nobodynobody# taskbar.tcl -- # # MS Windows taskbar and tray icon support. # Requires Winico package # (http://tktable.sourceforge.net/winico/winico.html) if {[catch { package require Winico }]} return ########################################################################## namespace eval taskbar { variable s2p array set s2p [list blank 0 \ available 1 \ away 2 \ chat 3 \ dnd 4 \ xa 5 \ unavailable 6 \ invisible 7 \ browser 8 \ group 9 \ browser32 10 \ group32 11 \ available32 12 \ message1 13 \ message2 14 \ message3 15] variable options custom::defvar options(enable) 1 \ [::msgcat::mc "Enable windows tray icon."] \ -group Systray -type boolean \ -command [namespace code enable_disable] } ########################################################################## # # Systray icons # ########################################################################## proc taskbar::set_current_theme {} { variable icon variable s2p global curuserstatus set newicon [winico createfrom [pixmaps::get_filename docking/tkabber]] if {[info exists icon]} { set oldicon $icon set icon $newicon # Change taskbar icon: winico taskbar add $newicon # TODO ideally there should be a call to [enable_disable] # instead but the latter relies on the existence of some # windows (i.e. it's called from finload_hook) while this # proc is called for the first time earlier in the loading # sequence... configure .tray $curuserstatus # Change icons of all mapped toplevels: foreach w [wm stackorder .] { win_icon_setup $w } winico delete $oldicon } else { set icon $newicon } } hook::add set_theme_hook [namespace current]::taskbar::set_current_theme ########################################################################## proc taskbar::enable_disable {args} { variable options set m .tray if {$options(enable) && ![winfo exists $m]} { ifacetk::systray::create $m \ -createcommand [namespace code create] \ -configurecommand [namespace code configure] \ -destroycommand [namespace code destroy] } elseif {!$options(enable) && [winfo exists $m]} { ifacetk::systray::destroy $m } } hook::add finload_hook [namespace current]::taskbar::enable_disable ########################################################################## proc taskbar::create {m} { variable icon variable s2p set m [ifacetk::systray::popupmenu .tray] winico taskbar add $icon -pos $s2p(unavailable) \ -callback [namespace code [list callback $m %m %x %y]] \ -text [ifacetk::systray::balloon_text] } ########################################################################## proc taskbar::configure {m status} { variable icon variable s2p if {[info exists icon] && $icon ne ""} { winico taskbar modify $icon -pos $s2p($status) \ -text [ifacetk::systray::balloon_text] } } ########################################################################## proc taskbar::destroy {m} { variable icon if {[info exists icon] && $icon ne ""} { winico taskbar delete $icon ::destroy $m } } ########################################################################## proc taskbar::callback {m event x y} { switch -- $event { WM_LBUTTONUP { ifacetk::systray::restore } WM_MBUTTONUP { ifacetk::systray::withdraw } WM_RBUTTONUP { $m post $x $y } } } ########################################################################## # # Window & taskbar icons # ########################################################################## proc taskbar::win_icons {} { variable icon variable s2p winico setwindow . $icon small $s2p(unavailable) winico setwindow . $icon big $s2p(available32) trace add variable ::curuserstatus write [namespace code update] bind all +[namespace code { if {[string equal [winfo toplevel %W] %W]} { win_icon_setup %W } }] } hook::add finload_hook [namespace current]::taskbar::win_icons ########################################################################## proc taskbar::win_icon_setup {w} { variable icon variable s2p global curuserstatus if {$icon eq ""} return # Special case for the main window (which is also the roster # window in windowed UI mode) -- it shows the current # user status in its window icon: if {[string equal $w .]} { winico setwindow $w $icon small $s2p($curuserstatus) winico setwindow $w $icon big $s2p(available32) return } switch -- [winfo class $w] { Chat { winico setwindow $w $icon small $s2p(group) winico setwindow $w $icon big $s2p(group32) } JDisco { winico setwindow $w $icon small $s2p(browser) winico setwindow $w $icon big $s2p(browser32) } default { winico setwindow $w $icon small $s2p(available) winico setwindow $w $icon big $s2p(available32) } } } ########################################################################## proc taskbar::update {name1 {name2 ""} {op ""}} { global curuserstatus variable icon variable s2p winico setwindow . $icon small $s2p($curuserstatus) } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/presence.tcl000064400000000000000000000513301477701321300143630ustar00nobodynobody# presence.tcl -- # # This file is a part of the Tkabber XMPP client. It implements # general routines for working with presence (receiving presence, # sending presence). array set long_statusdesc [list \ available [::msgcat::mc "is available"] \ chat [::msgcat::mc "is free to chat"] \ away [::msgcat::mc "is away"] \ xa [::msgcat::mc "is extended away"] \ dnd [::msgcat::mc "doesn't want to be disturbed"] \ invisible [::msgcat::mc "is invisible"] \ unavailable [::msgcat::mc "is unavailable"]] proc get_long_status_desc {status} { set ::long_statusdesc($status) } ############################################################################### proc client:presence {xlib from type x args} { global presence global processed_presence debugmsg presence "PRESENCE: $from; $type; $x; $args" set from [::xmpp::jid::normalize $from] switch -- $type { error - unavailable { catch { unset presence(type,$xlib,$from) } catch { unset presence(status,$xlib,$from) } catch { unset presence(priority,$xlib,$from) } catch { unset presence(show,$xlib,$from) } catch { unset presence(x,$xlib,$from) } catch { unset presence(error,$xlib,$from) } set user [::xmpp::jid::stripResource $from] if {[info exists presence(user_jids,$xlib,$user)]} { set idx [lsearch -exact $presence(user_jids,$xlib,$user) $from] set presence(user_jids,$xlib,$user) \ [lreplace $presence(user_jids,$xlib,$user) $idx $idx] } cache_preferred_jid_on_unavailable $xlib $from $user cache_user_status $xlib $user foreach {attr val} $args { switch -- $attr { -status { set presence(status,$xlib,$from) $val if {[get_user_status $xlib $user] == "unavailable"} { set presence(status,$xlib,$user) $val } } -error { set presence(error,$xlib,$from) $val } -lang { set presence(lang,$xlib,$from) $val } } } debugmsg presence "$xlib $from unavailable" } subscribe {} subscribed {} unsubscribe {} unsubscribed {} probe {} default { set type available set presence(type,$xlib,$from) available set presence(status,$xlib,$from) "" set presence(priority,$xlib,$from) 0 set presence(show,$xlib,$from) available set presence(x,$xlib,$from) $x catch { unset presence(error,$xlib,$from) } foreach {attr val} $args { switch -- $attr { -status {set presence(status,$xlib,$from) $val} -priority {set presence(priority,$xlib,$from) $val} -show {set presence(show,$xlib,$from) $val} -lang {set presence(lang,$xlib,$from) $val} } } set presence(show,$xlib,$from) \ [normalize_show $presence(show,$xlib,$from)] set user [::xmpp::jid::stripResource $from] if {![info exists presence(user_jids,$xlib,$user)] || \ $from ni $presence(user_jids,$xlib,$user)} { lappend presence(user_jids,$xlib,$user) $from } cache_preferred_jid_on_available $xlib $from $user cache_user_status $xlib $user } } eval {hook::run client_presence_hook $xlib $from $type $x} $args } ############################################################################### proc get_jids_of_user {xlib user} { global presence if {[info exists presence(user_jids,$xlib,$user)]} { return $presence(user_jids,$xlib,$user) } elseif {[::xmpp::jid::resource $user] ne ""} { if {[info exists presence(type,$xlib,$user)]} { return [list $user] } } return {} } proc get_jid_of_user {xlib user} { global presence if {[info exists presence(preferred_jid,$xlib,$user)]} { return $presence(preferred_jid,$xlib,$user) } else { return $user } } proc cache_preferred_jid_on_available {xlib jid user} { global presence set pri $presence(priority,$xlib,$jid) if {![info exists presence(maxpriority,$xlib,$user)]} { cache_preferred_jid $xlib $user return } elseif {$presence(preferred_jid,$xlib,$user) == $jid && \ $pri < $presence(maxpriority,$xlib,$user)} { unset presence(preferred_jid,$xlib,$user) unset presence(maxpriority,$xlib,$user) cache_preferred_jid $xlib $user return } else { set maxpri $presence(maxpriority,$xlib,$user) if {$pri > $maxpri} { set presence(maxpriority,$xlib,$user) $pri set presence(preferred_jid,$xlib,$user) $jid } } } proc cache_preferred_jid_on_unavailable {xlib jid user} { global presence if {![info exists presence(maxpriority,$xlib,$user)]} { cache_preferred_jid $xlib $user return } if {$presence(preferred_jid,$xlib,$user) == $jid} { unset presence(preferred_jid,$xlib,$user) unset presence(maxpriority,$xlib,$user) cache_preferred_jid $xlib $user } } proc cache_preferred_jid {xlib user} { global presence set jids [get_jids_of_user $xlib $user] if {$jids != {}} { set rjid [lindex $jids 0] set pri $presence(priority,$xlib,$rjid) foreach jid $jids { if {$presence(priority,$xlib,$jid) > $pri} { set pri $presence(priority,$xlib,$jid) set rjid $jid } } set presence(maxpriority,$xlib,$user) $pri set presence(preferred_jid,$xlib,$user) $rjid } } proc get_jid_status {xlib jid} { global presence set j $jid if {[info exists presence(show,$xlib,$j)]} { return $presence(show,$xlib,$j) } else { return unavailable } } proc get_jid_presence_info {param xlib jid} { global presence if {[info exists presence($param,$xlib,$jid)]} { return $presence($param,$xlib,$jid) } else { return "" } } proc get_user_status {xlib user} { global presence if {[info exists presence(cachedstatus,$xlib,$user)]} { return $presence(cachedstatus,$xlib,$user) } elseif {[info exists presence(show,$xlib,$user)]} { return $presence(show,$xlib,$user) } else { return unavailable } } proc cache_user_status {xlib user} { global presence set jid [get_jid_of_user $xlib $user] if {[info exists presence(show,$xlib,$jid)]} { set presence(cachedstatus,$xlib,$user) $presence(show,$xlib,$jid) } else { set presence(cachedstatus,$xlib,$user) unavailable } } proc get_user_status_desc {xlib user} { global presence set jid [get_jid_of_user $xlib $user] if {[info exists presence(error,$xlib,$jid)]} { return [::xmpp::stanzaerror::message $presence(error,$xlib,$jid)] } elseif {[info exists presence(status,$xlib,$jid)]} { return $presence(status,$xlib,$jid) } else { return "" } } array set status_priority { unavailable 1 xa 2 away 3 dnd 4 available 5 chat 6 } proc compare_status {s1 s2} { global status_priority set p1 $status_priority($s1) set p2 $status_priority($s2) if {$p1 > $p2} { return 1 } elseif {$p1 == $p2} { return 0 } else { return -1 } } proc max_status {s1 s2} { global status_priority set p1 $status_priority($s1) set p2 $status_priority($s2) if {$p1 >= $p2} { return $s1 } else { return $s2 } } ############################################################################### set curpriority 0 set curuserstatus unavailable set curtextstatus "" custom::defvar userpriority 0 [::msgcat::mc "Stored user priority."] \ -type integer -group Hidden custom::defvar userstatus available [::msgcat::mc "Stored user status."] \ -type string -group Hidden custom::defvar textstatus "" [::msgcat::mc "Stored user text status."] \ -type string -group Hidden set userstatusdesc [::msgcat::mc "Not logged in"] set statusdesc(available) [::msgcat::mc "Available"] set statusdesc(chat) [::msgcat::mc "Free to chat"] set statusdesc(away) [::msgcat::mc "Away"] set statusdesc(xa) [::msgcat::mc "Extended away"] set statusdesc(dnd) [::msgcat::mc "Do not disturb"] set statusdesc(invisible) [::msgcat::mc "Invisible"] set statusdesc(unavailable) [::msgcat::mc "Unavailable"] ############################################################################### proc change_priority_dialog {} { global tmppriority global userpriority set tmppriority $userpriority set w .change_priority if {[winfo exists $w]} { focus -force $w return } Dialog $w -title [::msgcat::mc "Change Presence Priority"] \ -modal none \ -anchor e \ -default 0 \ -cancel 1 $w add -text [::msgcat::mc "OK"] \ -command [list do_change_priority $w] $w add -text [::msgcat::mc "Cancel"] -command [list destroy $w] set f [$w getframe] Label $f.lpriority -text [::msgcat::mc "Priority:"] Spinbox $f.priority -1000 1000 1 tmppriority grid $f.lpriority -row 0 -column 0 -sticky e grid $f.priority -row 0 -column 1 -sticky ew grid columnconfigure $f 0 -weight 1 grid columnconfigure $f 1 -weight 1 $w draw } ############################################################################### proc do_change_priority {w} { global userstatus global tmppriority global userpriority destroy $w if {$userpriority ne $tmppriority} { set userpriority $tmppriority set userstatus $userstatus } } ############################################################################### trace add variable userstatus write change_our_presence trace add variable logoutuserstatus write change_our_presence ############################################################################### proc change_our_presence {name1 name2 op} { global userstatus logoutuserstatus curuserstatus global textstatus logouttextstatus curtextstatus global userpriority logoutpriority curpriority global statusdesc userstatusdesc switch -- $name1 { logoutuserstatus { set newstatus $logoutuserstatus set newtextstatus $logouttextstatus set newpriority $logoutpriority } default { if {[llength [connections]] == 0} return set newstatus $userstatus set newtextstatus $textstatus set newpriority $userpriority } } if {$newstatus eq $curuserstatus && \ $newtextstatus eq $curtextstatus && \ $newpriority eq $curpriority} { return } if {$newstatus ni [array names statusdesc]} { error [::msgcat::mc "Invalid userstatus value %s" $newstatus] } set userstatusdesc $statusdesc($newstatus) set status $newtextstatus foreach xlib [connections] { send_presence $xlib $newstatus \ -status $status \ -priority $newpriority } foreach chatid [lfilter chat::is_groupchat [chat::opened]] { set xlib [chat::get_xlib $chatid] set group [chat::get_jid $chatid] set nick [get_our_groupchat_nick $chatid] if {$newstatus == "invisible"} { set newst available } else { set newst $newstatus } send_presence $xlib $newst \ -to $group/$nick \ -status $status \ -priority $userpriority } set curuserstatus $newstatus set curtextstatus $newtextstatus set curpriority $newpriority hook::run change_our_presence_post_hook $newstatus } ############################################################################### proc send_first_presence {xlib} { global userstatus curuserstatus statusdesc userstatusdesc global textstatus curtextstatus global userpriority curpriority global loginconf if {$userstatus ni [array names statusdesc]} { error [::msgcat::mc "Invalid userstatus value %s" $userstatus] } set userstatusdesc $statusdesc($userstatus) set status $textstatus set curuserstatus $userstatus set curtextstatus $textstatus set curpriority [set userpriority $loginconf(priority)] send_presence $xlib $userstatus \ -status $status \ -priority $userpriority hook::run change_our_presence_post_hook $userstatus } hook::add connected_hook [namespace current]::send_first_presence 15 ############################################################################### proc send_custom_presence {xlib jid status args} { global userpriority global statusdesc set type jid set stat "" foreach {key val} $args { switch -- $key { -type { set type $val } -status { set stat $val } } } switch -- $type { group { set to $jid/[get_our_groupchat_nick [chat::chatid $xlib $jid]] } default { set to $jid } } eval {send_presence $xlib $status} $args \ {-to $to -status $stat -priority $userpriority} } ############################################################################### proc send_presence {xlib status args} { set newargs [eval [list presence_args $xlib $status] $args] eval [list ::xmpp::sendPresence $xlib] $newargs } ############################################################################### proc presence_args {xlib status args} { switch -- $status { available { set newargs {} } unavailable { set newargs [list -type $status] } default { set newargs [list -show $status] } } set xlist {} set to "" set stat "" foreach {opt val} $args { switch -- $opt { -id { lappend newargs -id $val } -to { set to $val lappend newargs -to $val } -priority { lappend newargs -priority $val } -xlist { set xlist $val } -status { set stat $val } } } hook::run rewrite_presence_status_hook stat $xlib if {$stat != ""} { lappend newargs -status $stat } hook::run presence_xlist_hook xlist $xlib $stat lappend newargs -xlist $xlist debugmsg presence "$newargs" return $newargs } ############################################################################### proc normalize_show {show} { set res $show switch -- $show { away {} chat {} dnd {} xa {} unavailable {} default {set res available} } return $res } ############################################################################### proc add_presence_to_popup_info {infovar xlib jid} { upvar 0 $infovar info set bjid [::xmpp::jid::stripResource $jid] if {[chat::is_groupchat [chat::chatid $xlib $bjid]]} return set priority [get_jid_presence_info priority $xlib $jid] if {$priority != ""} { append info "\n\t[::msgcat::mc {Priority:}] $priority" } } hook::add roster_user_popup_info_hook add_presence_to_popup_info 20 ############################################################################### proc clear_presence_info {xlib} { global curuserstatus global userstatusdesc global presence array unset presence type,$xlib,* array unset presence status,$xlib,* array unset presence priority,$xlib,* array unset presence show,$xlib,* array unset presence error,$xlib,* array unset presence x,$xlib,* array unset presence user_jids,$xlib,* array unset presence preferred_jid,$xlib,* array unset presence cachedstatus,$xlib,* array unset presence maxpriority,$xlib,* if {[connections] == {}} { set_status "Disconnected" set curuserstatus unavailable set userstatusdesc [::msgcat::mc "Not logged in"] hook::run change_our_presence_post_hook unavailable } } hook::add disconnected_hook clear_presence_info ############################################################################### proc custom_presence_menu {m xlib jid} { set chatid [chat::chatid $xlib $jid] set chatid1 [chat::chatid $xlib [::xmpp::jid::removeResource $jid]] if {![chat::is_groupchat $chatid] && [chat::is_groupchat $chatid1]} { return } if {[chat::is_groupchat $chatid]} { set jid [::xmpp::jid::replaceResource $jid \ [get_our_groupchat_nick $chatid]] } set mm [menu $m.custom_presence -tearoff 0] $mm add command -label [::msgcat::mc "Available"] \ -command [list send_custom_presence $xlib $jid available] $mm add command -label [::msgcat::mc "Free to chat"] \ -command [list send_custom_presence $xlib $jid chat] $mm add command -label [::msgcat::mc "Away"] \ -command [list send_custom_presence $xlib $jid away] $mm add command -label [::msgcat::mc "Extended away"] \ -command [list send_custom_presence $xlib $jid xa] $mm add command -label [::msgcat::mc "Do not disturb"] \ -command [list send_custom_presence $xlib $jid dnd] $mm add command -label [::msgcat::mc "Unavailable"] \ -command [list send_custom_presence $xlib $jid unavailable] $m add cascade -label [::msgcat::mc "Send custom presence"] \ -menu $mm } hook::add chat_create_user_menu_hook custom_presence_menu 43 hook::add roster_jid_popup_menu_hook custom_presence_menu 43 hook::add roster_service_popup_menu_hook custom_presence_menu 43 hook::add chat_create_conference_menu_hook custom_presence_menu 43 ############################################################################### proc service_login {xlib jid} { global userstatus curtextstatus set newargs {} if {$curtextstatus != ""} { lappend newargs -status $curtextstatus } switch -- $userstatus { available { set command [list ::xmpp::sendPresence $xlib -to $jid] } invisible { set command [list ::xmpp::sendPresence $xlib -to $jid \ -type $userstatus] } default { set command [list ::xmpp::sendPresence $xlib -to $jid \ -show $userstatus] } } eval $command $newargs } proc service_logout {xlib jid} { global curtextstatus set newargs {} if {$curtextstatus != ""} { lappend newargs -status $curtextstatus } set command [list ::xmpp::sendPresence $xlib -to $jid -type unavailable] eval $command $newargs } proc service_login_logout_menu_item {m xlib jid} { # TODO $m add command -label [::msgcat::mc "Log in"] \ -command [list service_login $xlib $jid] $m add command -label [::msgcat::mc "Log out"] \ -command [list service_logout $xlib $jid] } hook::add roster_service_popup_menu_hook service_login_logout_menu_item 20 ############################################################################### proc systray_presence_menu_item {m} { set mp [menu $m.presence -title [::msgcat::mc "Presence"] \ -tearoff $::ifacetk::options(show_tearoffs)] $mp add command -label [::msgcat::mc "Available"] \ -command {set userstatus available} $mp add command -label [::msgcat::mc "Free to chat"] \ -command {set userstatus chat} $mp add command -label [::msgcat::mc "Away"] \ -command {set userstatus away} $mp add command -label [::msgcat::mc "Extended away"] \ -command {set userstatus xa} $mp add command -label [::msgcat::mc "Do not disturb"] \ -command {set userstatus dnd} $mp add separator $mp add command -label [::msgcat::mc "Change priority..."] \ -command change_priority_dialog $m add cascade -label [::msgcat::mc "Presence"] -menu $mp } hook::add systray_menu_hook systray_presence_menu_item 40 # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/privacy.tcl000064400000000000000000001232151477701321300142360ustar00nobodynobody# privacy.tcl -- # # Privacy lists support (XEP-0016) package require xmpp::privacy namespace eval privacy { variable options variable req_messages variable send_messages variable edit_messages variable menu_messages array set req_messages \ [list ignore [::msgcat::mc "Requesting ignore list: %s"] \ invisible [::msgcat::mc "Requesting invisible list: %s"] \ visible [::msgcat::mc "Requesting visible list: %s"] \ conference [::msgcat::mc "Requesting conference list: %s"]] array set send_messages \ [list ignore [::msgcat::mc "Sending ignore list: %s"] \ invisible [::msgcat::mc "Sending invisible list: %s"] \ visible [::msgcat::mc "Sending visible list: %s"] \ conference [::msgcat::mc "Sending conference list: %s"] \ subscription [::msgcat::mc "Changing accept messages from\ roster only: %s"]] array set edit_messages \ [list ignore [::msgcat::mc "Edit ignore list"] \ invisible [::msgcat::mc "Edit invisible list"] \ visible [::msgcat::mc "Edit visible list"] \ conference [::msgcat::mc "Edit conference list"]] array set menu_messages \ [list ignore [::msgcat::mc "Ignore list"] \ invisible [::msgcat::mc "Invisible list"] \ visible [::msgcat::mc "Visible list"]] variable accept_from_roster 0 custom::defgroup Privacy \ [::msgcat::mc "Blocking communication (XMPP privacy lists) options."] \ -group Tkabber custom::defvar options(activate_at_startup) 1 \ [::msgcat::mc "Activate visible/invisible/ignore/conference lists\ before sending initial presence."] \ -type boolean -group Privacy } ############################################################################### # # Manual rules editing block # proc privacy::request_lists {xlib} { if {$xlib == ""} { set xlib [first_supported] } if {$xlib == ""} return ::xmpp::privacy::requestLists $xlib \ -command [namespace code [list open_dialog $xlib]] } proc privacy::on_destroy_dialog {} { variable data catch { array unset data } } proc privacy::open_dialog {xlib res child} { if {[string equal $res error]} { MessageDlg .privacy_err -aspect 50000 -icon error \ -message [::msgcat::mc "Requesting privacy rules: %s" \ [error_to_string $child]] \ -type user -buttons ok -default 0 -cancel 0 return } set w .privacy if {[winfo exists $w]} { destroy $w } Dialog $w -title [::msgcat::mc "Privacy lists"] \ -modal none -anchor e \ -default 0 -cancel 1 set f [$w getframe] bind $f [namespace code on_destroy_dialog] $w add -text [::msgcat::mc "Send"] \ -command [namespace code [list send_lists $xlib $w]] $w add -text [::msgcat::mc "Cancel"] -command [list destroy $w] set f [$w getframe] set hf [Frame $w.hf] pack $hf -side bottom set tools [Frame $f.tools] pack $tools -side bottom -fill x -padx 1m set sw [ScrolledWindow $w.sw -scrollbar vertical] set sf [ScrollableFrame $w.fields -constrainedwidth yes] pack $sw -side bottom -expand yes -fill both -in $f -pady 1m -padx 1m set lf [$sf getframe] $sw setwidget $sf set addlist [Button $tools.addlist \ -text [::msgcat::mc "Add list"] \ -command [namespace code [list add_list \ $xlib $tools $lf ""]]] pack $addlist -side right -padx 1m set default [Radiobutton $tools.default \ -text [::msgcat::mc "No default list"] \ -variable [namespace current]::data(default) \ -value "\u0000"] pack $default -side left -padx 1m set active [Radiobutton $tools.active \ -text [::msgcat::mc "No active list"] \ -variable [namespace current]::data(active) \ -value "\u0000"] pack $active -side left -padx 1m fill_lists $xlib $hf $lf $child $w draw } proc privacy::fill_lists {xlib hf f items} { variable data grid [Label $f.n -text [::msgcat::mc "List name"] -width 20] \ -row 0 -column 0 -sticky we -padx 1m grid [Label $f.d -text [::msgcat::mc "Default"]] \ -row 0 -column 1 -sticky we -padx 1m grid [Label $f.a -text [::msgcat::mc "Active"]] \ -row 0 -column 2 -sticky we -padx 1m grid columnconfigure $f 0 -weight 1 grid columnconfigure $f 1 -weight 1 grid columnconfigure $f 2 -weight 1 grid columnconfigure $f 3 -weight 1 grid columnconfigure $f 4 -weight 1 array set tmp $items if {[info exists tmp(default)]} { set data(default) $tmp(default) } else { set data(default) "\u0000" } if {[info exists tmp(active)]} { set data(active) $tmp(active) } else { set data(active) "\u0000" } set data(nlists) 0 foreach name $tmp(items) { add_list $xlib $hf $f $name } } proc privacy::remove_list {lf ln} { variable data destroy $lf.name$ln destroy $lf.active$ln destroy $lf.default$ln destroy $lf.edit$ln destroy $lf.remove$ln set data(nitems,$ln) 0 set data(newname,$ln) "" } proc privacy::on_change_list_name {lf i args} { variable data set name $data(newname,$i) if {$data(default) == $data(name,$i)} { set data(default) $name } if {$data(active) == $data(name,$i)} { set data(active) $name } if {[winfo exists $lf.default$i] && [winfo exists $lf.active$i]} { $lf.default$i configure -value $name $lf.active$i configure -value $name } if {$name != ""} { set data(name,$i) $name } } proc privacy::add_list {xlib hf lf name} { variable data set i $data(nlists) if {$name == ""} { set name "list$i" send_new_list $xlib $name } set data(name,$i) $name set data(newname,$i) $name trace add variable [namespace current]::data(newname,$i) write \ [list [namespace current]::on_change_list_name $lf $i] set lname [Label $lf.name$i \ -text $name \ -textvariable [namespace current]::data(name,$i)] set default [Radiobutton $lf.default$i \ -variable [namespace current]::data(default) \ -value $name] set active [Radiobutton $lf.active$i \ -variable [namespace current]::data(active) \ -value $name] set remove [Button $lf.remove$i \ -text [::msgcat::mc "Remove list"] \ -command [list [namespace current]::remove_list $lf $i]] set edit [Button $lf.edit$i \ -text [::msgcat::mc "Edit list"] \ -command [list [namespace current]::edit_list $xlib $lf $i]] set row [expr {$i + 1}] grid $lname -row $row -column 0 -stick w -padx 1m grid $default -row $row -column 1 -stick we -padx 1m grid $active -row $row -column 2 -stick we -padx 1m grid $edit -row $row -column 3 -stick we -padx 1m grid $remove -row $row -column 4 -stick we -padx 1m update idletasks $hf configure \ -width [expr {[winfo reqwidth $lf] + [winfo pixels $lf 1c]}] incr data(nlists) } proc privacy::edit_list {xlib lf ln} { variable data set name $data(name,$ln) ::xmpp::privacy::requestItems $xlib $name \ -command [namespace code [list edit_list_dialog $xlib $ln $name]] } proc privacy::edit_list_dialog {xlib ln name res child} { if {[string equal $res error]} { MessageDlg .privacy_list_err -aspect 50000 -icon error \ -message [::msgcat::mc "Requesting privacy list: %s" \ [error_to_string $child]] \ -type user -buttons ok -default 0 -cancel 0 set child {} } set w .privacy_list if {[winfo exists $w]} { destroy $w } Dialog $w -title [::msgcat::mc "Edit privacy list"] \ -anchor e \ -default 0 -cancel 1 $w add -text [::msgcat::mc "Send"] \ -command [namespace code [list send_list $xlib $ln $w]] $w add -text [::msgcat::mc "Cancel"] -command [list destroy $w] set f [$w getframe] set tools [Frame $f.tools] pack $tools -side bottom -fill x set hf [Frame $w.hf] pack $hf -side bottom set sw [ScrolledWindow $w.sw -scrollbar vertical] set sf [ScrollableFrame $w.fields -constrainedwidth yes] set lf [$sf getframe] pack $sw -side top -expand yes -fill both -in $f -pady 1m $sw setwidget $sf set additem [Button $tools.aditem \ -text [::msgcat::mc "Add item"] \ -command \ [namespace code [list add_item \ $lf.items "none" "" "allow" 1 1 1 1]]] pack $additem -side right -padx 1m fill_edit_list $lf $name $child update idletasks $hf configure \ -width [expr {[winfo reqwidth $lf] + [winfo pixels $lf 1c]}] $w draw } proc privacy::fill_edit_list {fr name items} { variable data set data(listname) $name set data(listnewname) $name set fname [Frame $fr.name] pack $fname -side top -fill x Label $fname.lname -text [string trimright [::msgcat::mc "Name: "]] Entry $fname.name \ -textvariable [namespace current]::data(listnewname) pack $fname.lname -side left -anchor w pack $fname.name -side left -fill x -expand yes set f [Frame $fr.items] pack $f -side top -fill both -expand yes Label $f.ltype -text [::msgcat::mc "Type"] Label $f.lvalue -text [::msgcat::mc "Value"] Label $f.laction -text [::msgcat::mc "Action"] Label $f.lmessage -text [::msgcat::mc "Message"] Label $f.lpresencein -text [::msgcat::mc "Presence-in"] Label $f.lpresenceout -text [::msgcat::mc "Presence-out"] Label $f.liq -text [::msgcat::mc "IQ"] grid $f.ltype -row 0 -column 0 -sticky we -padx 0.5m grid $f.lvalue -row 0 -column 1 -sticky we -padx 0.5m grid $f.laction -row 0 -column 2 -sticky we -padx 0.5m grid $f.lmessage -row 0 -column 3 -sticky we -padx 0.5m grid $f.lpresencein -row 0 -column 4 -sticky we -padx 0.5m grid $f.lpresenceout -row 0 -column 5 -sticky we -padx 0.5m grid $f.liq -row 0 -column 6 -sticky we -padx 0.5m grid columnconfig $f 1 -weight 1 set data(listnitems) 0 foreach item $items { set type [::xmpp::xml::getAttr $item type] if {$type == ""} { set type none } set value [::xmpp::xml::getAttr $item value] set action [::xmpp::xml::getAttr $item action] set stanzas [::xmpp::xml::getAttr $item stanzas] if {[llength $stanzas] == 0} { array set tmp [list message 1 presence-in 1 presence-out 1 iq 1] } else { array set tmp [list message 0 presence-in 0 presence-out 0 iq 0] foreach tag $stanzas { set tmp($tag) 1 } } add_item $f $type $value $action \ $tmp(message) $tmp(presence-in) $tmp(presence-out) $tmp(iq) } } proc privacy::add_item \ {f type value action message presencein presenceout iq} { variable data set i $data(listnitems) Entry $f.value$i \ -textvariable [namespace current]::data(value,$i) Combobox $f.type$i \ -values {none jid group subscription} \ -editable no \ -width 12 \ -textvariable [namespace current]::data(type,$i) Combobox $f.action$i \ -values {allow deny} \ -editable no \ -width 5 \ -textvariable [namespace current]::data(action,$i) Checkbutton $f.message$i \ -variable [namespace current]::data(message,$i) \ -command [list [namespace current]::update_checkbuttons $i] Checkbutton $f.presencein$i \ -variable [namespace current]::data(presencein,$i) \ -command [list [namespace current]::update_checkbuttons $i] Checkbutton $f.presenceout$i \ -variable [namespace current]::data(presenceout,$i) \ -command [list [namespace current]::update_checkbuttons $i] Checkbutton $f.iq$i \ -variable [namespace current]::data(iq,$i) \ -command [list [namespace current]::update_checkbuttons $i] Button $f.moveup$i -text [::msgcat::mc "Up"] \ -command [list [namespace current]::move_item_up $f $i] Button $f.movedown$i -text [::msgcat::mc "Down"] \ -command [list [namespace current]::move_item_down $f $i] Button $f.remove$i -text [::msgcat::mc "Remove"] \ -command [list [namespace current]::remove_item $f $i] set data(type,$i) $type set data(value,$i) $value set data(action,$i) $action set data(message,$i) $message set data(presencein,$i) $presencein set data(presenceout,$i) $presenceout set data(iq,$i) $iq set row [expr {$i + 1}] grid $f.type$i -row $row -column 0 -sticky ew -padx 0.5m grid $f.value$i -row $row -column 1 -sticky ew -padx 0.5m grid $f.action$i -row $row -column 2 -sticky ew -padx 0.5m grid $f.message$i -row $row -column 3 -sticky ew -padx 0.5m grid $f.presencein$i -row $row -column 4 -sticky ew -padx 0.5m grid $f.presenceout$i -row $row -column 5 -sticky ew -padx 0.5m grid $f.iq$i -row $row -column 6 -sticky ew -padx 0.5m grid $f.moveup$i -row $row -column 7 -sticky ew -padx 0.5m grid $f.movedown$i -row $row -column 8 -sticky ew -padx 0.5m grid $f.remove$i -row $row -column 9 -sticky ew -padx 0.5m incr data(listnitems) update_button_states $f } proc privacy::update_checkbuttons {i} { variable data if {!$data(message,$i) && !$data(presencein,$i) && \ !$data(presenceout,$i) && !$data(iq,$i)} { set data(message,$i) 1 set data(presencein,$i) 1 set data(presenceout,$i) 1 set data(iq,$i) 1 } } proc privacy::update_button_states {f} { variable data set numrows 0 set row 0 for {set i 0} {$i < $data(listnitems)} {incr i} { if {$data(type,$i) != "remove"} { $f.remove$i configure -state normal incr numrows set row $i } } if {$numrows == 1} { $f.remove$row configure -state disabled } } proc privacy::move_item_up {f i} { variable data set j $i incr j -1 while {$j >= 0 && $data(type,$j) == "remove"} { incr j -1 } if {$j >= 0} { switch_items $f $i $j } } proc privacy::move_item_down {f i} { variable data set j $i incr j 1 while {$j < $data(listnitems) && $data(type,$j) == "remove"} { incr j 1 } if {$j < $data(listnitems)} { switch_items $f $i $j } } proc privacy::switch_items {f i j} { variable data set type $data(type,$i) set value $data(value,$i) set action $data(action,$i) set message $data(message,$i) set presencein $data(presencein,$i) set presenceout $data(presenceout,$i) set iq $data(iq,$i) set data(type,$i) $data(type,$j) set data(value,$i) $data(value,$j) set data(action,$i) $data(action,$j) set data(message,$i) $data(message,$j) set data(presencein,$i) $data(presencein,$j) set data(presenceout,$i) $data(presenceout,$j) set data(iq,$i) $data(iq,$j) set data(type,$j) $type set data(value,$j) $value set data(action,$j) $action set data(message,$j) $message set data(presencein,$j) $presencein set data(presenceout,$j) $presenceout set data(iq,$j) $iq } proc privacy::remove_item {f i} { variable data destroy $f.type$i destroy $f.value$i destroy $f.action$i destroy $f.message$i destroy $f.presencein$i destroy $f.presenceout$i destroy $f.iq$i destroy $f.moveup$i destroy $f.movedown$i destroy $f.remove$i set data(type,$i) remove set data(value,$i) "" set data(action,$i) allow update_button_states $f } proc privacy::send_new_list {xlib name} { ::xmpp::privacy::sendItems $xlib $name {{action allow}} -command # } proc privacy::send_list {xlib ln w} { variable data set name $data(listnewname) ::xmpp::privacy::sendItems $xlib $name [list_items] -command # if {$name != $data(listname)} { if {$data(default) == $data(listname)} { send_default_or_active_list $xlib $name default -command # } ::xmpp::privacy::sendItems $xlib $data(listname) {} -command # set data(newname,$ln) $name } destroy $w } proc privacy::send_lists {xlib w} { variable data for {set i 0} {$i < $data(nlists)} {incr i} { if {$data(newname,$i) == ""} { ::xmpp::privacy::sendItems $xlib $data(name,$i) {} -command # } } send_default_or_active_list $xlib $data(active) active -command # send_default_or_active_list $xlib $data(default) default -command # destroy $w } proc privacy::list_items {} { variable data set items {} for {set i 0} {$i < $data(listnitems)} {incr i} { if {$data(type,$i) == "remove"} continue set vars [list action $data(action,$i)] if {$data(type,$i) != "none"} { lappend vars type $data(type,$i) value $data(value,$i) } set stanzas {} if {$data(message,$i)} { lappend stanzas message } if {$data(presencein,$i)} { lappend stanzas presence-in } if {$data(presenceout,$i)} { lappend stanzas presence-out } if {$data(iq,$i)} { lappend stanzas iq } if {[llength $stanzas] == 4} { set stanzas {} } lappend vars stanzas $stanzas lappend items $vars } return $items } ############################################################################### proc privacy::send_default_or_active_list {xlib name tag args} { set newargs {} foreach {opt val} $args { switch -- $opt { -command { lappend newargs -command $val } } } if {$name != "\u0000"} { lappend newargs -name $name } switch -- $tag { default { return [eval [list ::xmpp::privacy::setDefault $xlib] $newargs] } active { return [eval [list ::xmpp::privacy::setActive $xlib] $newargs] } } } ############################################################################### # # Visible, invisible, ignore, conference list block # proc privacy::edit_special_list {xlib name args} { if {$xlib == ""} { set xlib [first_supported] } if {$xlib == ""} return ::xmpp::privacy::requestItems $xlib $name-list \ -command [namespace code [list edit_special_list_dialog $xlib $name]] } proc privacy::edit_special_list_dialog {xlib name res child} { variable req_messages variable edit_messages if {[string equal $res error]} { if {[error_type_condition $child] != {cancel item-not-found}} { MessageDlg .privacy_list_err -aspect 50000 -icon error \ -message [format $req_messages($name) \ [error_to_string $child]] \ -type user -buttons ok -default 0 -cancel 0 return } set child {} } set w .privacy_list if {[winfo exists $w]} { destroy $w } Dialog $w -title $edit_messages($name) \ -modal none -anchor e \ -default 0 -cancel 1 $w add -text [::msgcat::mc "Send"] \ -command [list [namespace current]::edit_special_list_enddialog \ $xlib $w $name] $w add -text [::msgcat::mc "Cancel"] -command [list destroy $w] set f [$w getframe] set tools [Frame $f.tools] pack $tools -side bottom -fill x set sw [ScrolledWindow $w.sw] set lf [Listbox $w.fields] pack $sw -side top -expand yes -fill both -in $f -pady 1m -padx 1m $sw setwidget $lf bind $lf <> \ [list [namespace current]::select_and_popup_menu %W %x %y] set addentry [Entry $tools.addentry] set additem [Button $tools.additem \ -text [::msgcat::mc "Add JID"] \ -command \ [list [namespace current]::add_special_jid_entry $lf \ $addentry]] pack $additem -side right -padx 1m pack $addentry -side left -padx 1m -fill x -expand yes fill_edit_special_list $lf $name $child #update idletasks #$tools configure -width [winfo reqwidth $lf] DropSite::register $lf -dropcmd [list [namespace current]::dropcmd] \ -droptypes {JID} $w draw } proc privacy::edit_special_list_enddialog {xlib w name} { $w itemconfigure 0 -state disabled send_special_list $xlib $name [$w.fields get 0 end] destroy $w } proc privacy::send_special_list {xlib name items} { variable special_list variable cboxes if {![is_supported $xlib]} { return } if {![info exists special_list($xlib,$name)]} { set special_list($xlib,$name) {} } set newitems {} foreach jid $items { if {$jid ni $special_list($xlib,$name)} { lappend newitems $jid } } set olditems {} foreach jid $special_list($xlib,$name) { if {$jid ni $items} { lappend olditems $jid } } switch -- $name { ignore { set stanzas {} set action deny foreach jid $newitems { send_custom_presence $xlib $jid unavailable } set postitems $olditems } invisible { set stanzas {presence-out iq} set action deny foreach jid $newitems { send_custom_presence $xlib $jid unavailable } set postitems $olditems } visible { # TODO: invisibility set stanzas {} set action allow set postitems $newitems } conference { set stanzas {} set action allow set postitems {} } } set items1 {} foreach item $items { lappend items1 [list type jid \ value $item \ action $action \ stanzas $stanzas] } # We have to use synchronous mode because all privacy lists should be # updated before sending next stanzas set status \ [catch {::xmpp::privacy::sendItems $xlib "$name-list" $items1} msg] update_tkabber_lists $xlib $name $items $postitems $status $msg } # subscription-list is responsible for blocking all messages # not from the roster. proc privacy::send_subscription_list {xlib} { variable accept_from_roster_only if {![is_supported $xlib]} { return } if {$accept_from_roster_only} { set items [list [list type subscription \ value none \ action deny]] } else { set items {} } # If items aren't empty, we'll never send unavailable presence to # all users to whom directed presence was sent. Bug? # We have to use synchronous mode because all privacy lists should be # updated before sending next stanzas set status \ [catch {::xmpp::privacy::sendItems $xlib "subscription-list" $items} \ msg] update_tkabber_lists $xlib subscription $items {} $status $msg } proc privacy::on_accept_from_roster_only_change {xlib} { if {$xlib == ""} { set xlib [first_supported] } if {$xlib == ""} return send_subscription_list $xlib } proc privacy::update_tkabber_lists {xlib name items postitems status msg} { global userstatus textstatus statusdesc variable send_messages variable special_list variable cboxes if {$status == 3} { # break return } switch -- $name { subscription { # Subscription list doesn't contain JIDs } default { # Workaround for servers without privacy list support/push if {$status == 0} { # ok set special_list($xlib,$name) $items } array unset cboxes $xlib,$name,* foreach jid $special_list($xlib,$name) { set cboxes($xlib,$name,$jid) 1 } } } if {$status == 1} { # error MessageDlg .privacy_list_err -aspect 50000 -icon error \ -message [format $send_messages($name) [error_to_string $msg]] \ -type user -buttons ok -default 0 -cancel 0 return } switch -- $name { ignore - conference - subscription { # Some inefficiency here. We load three lists twice. join_lists $xlib "i-am-visible-list" \ {ignore-list invisible-list conference-list subscription-list} \ {allow {} {}} -command # join_lists $xlib "i-am-invisible-list" \ {ignore-list visible-list conference-list subscription-list} \ {deny {} {presence-out iq}} -command # } invisible { join_lists $xlib "i-am-visible-list" \ {ignore-list invisible-list conference-list subscription-list} \ {allow {} {}} -command # } visible { join_lists $xlib "i-am-invisible-list" \ {ignore-list visible-list conference-list subscription-list} \ {deny {} {presence-out iq}} -command # } } # ejabberd behaves correctly and applies privacy lists before # routing any subsequent packet, so we haven't to wait for iq reply # before sending presence. What about other servers? if {$userstatus == "invisible"} { set status available } else { set status $userstatus } set tstatus $textstatus foreach jid $postitems { send_presence $xlib $status -to $jid -status $tstatus } } proc privacy::join_lists {xlib name lists fallbacks args} { set items {} # Appending myself to the list to make sure we can communicate # between own resources lappend items [list type jid \ value [connection_bare_jid $xlib] \ action allow] foreach ln $lists { set status [catch {::xmpp::privacy::requestItems $xlib $ln} ritems] if {$status == 3} { # abort return } if {$status == 0} { # !ok set items [concat $items $ritems] } } foreach {action vars stanzas} $fallbacks { lappend items [concat [list action $action stanzas $stanzas] $vars] } eval { ::xmpp::privacy::sendItems $xlib $name $items } $args } proc privacy::dropcmd {target source X Y op type data} { add_special_jid $target [lindex $data 1] } proc privacy::select_and_popup_menu {f x y} { set index [$f index @$x,$y] $f selection clear 0 end $f selection set $index if {[winfo exists [set m .privacy_list_popupmenu]]} { destroy $m } menu $m -tearoff 0 $m add command -label [::msgcat::mc "Remove from list"] \ -command [list $f delete $index] tk_popup $m [winfo pointerx .] [winfo pointery .] } proc privacy::fill_edit_special_list {fr name items} { set values {} foreach item $items { set type [::xmpp::xml::getAttr $item type] if {$type != "jid"} continue lappend values [::xmpp::xml::getAttr $item value] } eval [list $fr insert end] [lsort -dictionary -unique $values] } proc privacy::add_special_jid_entry {f entry} { set item [$entry get] $entry delete 0 end add_special_jid $f $item } proc privacy::add_special_jid {f item} { set values [$f get 0 end] lappend values $item set values [lsort -dictionary -unique $values] set index [lsearch -exact $values $item] $f delete 0 end eval [list $f insert end] $values $f selection set $index } ############################################################################### # # During connect try to activate "i-am-visible-list" privacy list # If it's not found then create and activate it # If activation or creation fails then terminate connect with error message # proc privacy::activate_privacy_list {depth xlib} { variable options set_status [::msgcat::mc "Waiting for activating privacy list"] debugmsg privacy "requested privacy list activation" set status \ [catch {send_default_or_active_list $xlib "i-am-visible-list" active} \ msg] debugmsg privacy "setting i-am-visible-list as default: $status $msg" switch -- $status { 0 { # ok set_status [::msgcat::mc "Privacy list is activated"] set_supported $xlib } 1 { # error switch -- [lindex [error_type_condition $msg] 1] { feature-not-implemented { # Privacy lists aren't implemented # Give up set_status \ [::msgcat::mc "Privacy lists are not implemented"] } service-unavailable - recipient-unavailable { # Privacy lists are unavailable # Give up set_status \ [::msgcat::mc "Privacy lists are unavailable"] } item-not-found { if {$depth >= 1} { # After successfully (!) created list it # mustn't be possible # TODO: error message return } # There's no required privacy list # Create it set_status \ [::msgcat::mc "Creating default privacy list"] set status1 \ [catch {join_lists $xlib "i-am-visible-list" \ {ignore-list invisible-list conference-list subscription-list} \ {allow {} {}}} msg1] debugmsg privacy \ "joining i-am-visible-list: $status1 $msg1" switch -- $status1 { 0 { # ok # Activate newly created list set_supported $xlib return [activate_privacy_list [expr {$depth + 1}] \ $xlib] } 1 { # error # Disconnect with error message set_status \ [::msgcat::mc "Privacy list is not created"] NonmodalMessageDlg \ .privacy_list_error[psuffix $xlib] \ -aspect 50000 -icon error \ -title [::msgcat::mc "Privacy lists error"] \ -message \ [::msgcat::mc \ "Creating default privacy list failed:\ %s\n\nTry to reconnect. If problem\ persists, you may want to disable\ privacy list activation at start" \ [error_to_string $msg1]] logout $xlib # Break connected_hook return stop } default { # abort set_status \ [::msgcat::mc "Privacy list is not created"] # Break connected_hook return stop } } } default { # Something wrong # Disconnect with error message set_status \ [::msgcat::mc "Privacy list is not activated"] NonmodalMessageDlg .privacy_list_error[psuffix $xlib] \ -aspect 50000 -icon error \ -title [::msgcat::mc "Privacy lists error"] \ -message \ [::msgcat::mc \ "Activating privacy list failed:\ %s\n\nTry to reconnect. If problem\ persists, you may want to disable privacy\ list activation at start" \ [error_to_string $msg]] logout $xlib # Break connected_hook return stop } } } default { # abort set_status [::msgcat::mc "Privacy list is not activated"] # Break connected_hook return stop } } } ########################################################################## proc privacy::activate_privacy_list_at_startup {xlib} { variable options if {$options(activate_at_startup)} { activate_privacy_list 0 $xlib } } hook::add connected_hook \ [namespace current]::privacy::activate_privacy_list_at_startup 1 ########################################################################## proc privacy::is_supported {xlib} { variable supported expr {[info exists supported($xlib)] && $supported($xlib)} } proc privacy::set_supported {xlib} { variable supported set supported($xlib) 1 } proc privacy::clear_supported {xlib} { variable supported array unset supported $xlib } hook::add disconnected_hook [namespace current]::privacy::clear_supported ############################################################################### proc privacy::create_menu {m xlib jid} { variable menu_messages variable special_list variable cboxes set rjid [roster::find_jid $xlib $jid] if {$rjid == ""} { set rjid [::xmpp::jid::stripResource $jid] } if {![is_supported $xlib] || \ [chat::is_groupchat [chat::chatid $xlib $rjid]]} { set state disabled } else { set state normal } set mm [menu $m.privacy_menu -tearoff 0] foreach name {invisible ignore} { if {![info exists special_list($xlib,$name)]} { set special_list($xlib,$name) {} } if {$rjid in $special_list($xlib,$name)} { set cboxes($xlib,$name,$rjid) 1 } $mm add checkbutton -label $menu_messages($name) \ -variable [namespace current]::cboxes($xlib,$name,$rjid) \ -command [list [namespace current]::update_special_list \ $xlib $name $rjid] } $m add cascade -label [::msgcat::mc "Privacy rules"] \ -menu $mm \ -state $state } hook::add chat_create_user_menu_hook \ [namespace current]::privacy::create_menu 79 hook::add roster_service_popup_menu_hook \ [namespace current]::privacy::create_menu 79 hook::add roster_jid_popup_menu_hook \ [namespace current]::privacy::create_menu 79 ############################################################################### proc privacy::update_special_list {xlib name jid} { variable cboxes if {[info exists cboxes($xlib,$name,$jid)] && $cboxes($xlib,$name,$jid)} { add_to_special_list $xlib $name $jid } else { remove_from_special_list $xlib $name $jid } } ############################################################################### proc privacy::add_to_special_list {xlib name jid} { variable special_list if {![info exists special_list($xlib,$name)]} { set special_list($xlib,$name) {} } if {$jid ni $special_list($xlib,$name)} { send_special_list $xlib $name \ [linsert $special_list($xlib,$name) 0 $jid] } } ############################################################################### proc privacy::remove_from_special_list {xlib name jid} { variable special_list if {![info exists special_list($xlib,$name)]} { set special_list($xlib,$name) {} } set idx [lsearch -exact $special_list($xlib,$name) $jid] if {$idx >= 0} { send_special_list $xlib $name \ [lreplace $special_list($xlib,$name) $idx $idx] } } ############################################################################### proc privacy::process_push {xlib from name args} { switch -- $name { invisible-list { reload_special_list $xlib invisible } visible-list { reload_special_list $xlib visible } ignore-list { reload_special_list $xlib ignore } conference-list { reload_special_list $xlib conference } subscription-list { reload_subscription_list $xlib } } return {result {}} } ::xmpp::privacy::register -command [namespace current]::privacy::process_push ############################################################################### proc privacy::clear_list_vars {xlib} { variable special_list variable cboxes array unset special_list $xlib,* array unset cboxes $xlib,* } hook::add disconnected_hook [namespace current]::privacy::clear_list_vars ############################################################################### # Conference list should be loaded before any join group attempt is made proc privacy::get_conference_list {xlib} { set status \ [catch {::xmpp::privacy::requestItems $xlib conference-list} msg] if {($status == 0) || \ ($status == 1 && \ [lindex [error_type_condition $msg] 1] == "item-not-found")} { set_supported $xlib } switch -- $status { 0 { set res ok } 1 { set res error } default { set res abort } } store_special_list $xlib conference $res $msg } hook::add connected_hook [namespace current]::privacy::get_conference_list 2 ############################################################################### proc privacy::get_list_vars {xlib} { foreach name {invisible visible ignore} { reload_special_list $xlib $name } reload_subscription_list $xlib } hook::add connected_hook [namespace current]::privacy::get_list_vars ############################################################################### proc privacy::reload_special_list {xlib name} { ::xmpp::privacy::requestItems $xlib $name-list \ -command [namespace code [list store_special_list $xlib $name]] } proc privacy::store_special_list {xlib name res child} { variable special_list variable cboxes set special_list($xlib,$name) {} array unset cboxes $xlib,$name,* if {$res != "ok"} return foreach item $child { if {[::xmpp::xml::getAttr $item type] == "jid" && \ [set jid [::xmpp::xml::getAttr $item value]] != ""} { lappend special_list($xlib,$name) $jid set cboxes($xlib,$name,$jid) 1 } } } ############################################################################### proc privacy::reload_subscription_list {xlib} { ::xmpp::privacy::requestItems $xlib subscription-list \ -command [list [namespace current]::store_subscription_list $xlib] } proc privacy::store_subscription_list {xlib res child} { variable accept_from_roster_only set accept_from_roster_only 0 if {$res != "ok"} return foreach item $child { if {[::xmpp::xml::getAttr $item type] == "subscription" && \ [::xmpp::xml::getAttr $item value] == "none" && \ [::xmpp::xml::getAttr $item action] == "deny"} { set accept_from_roster_only 1 } } } ############################################################################### proc privacy::first_supported {} { foreach xlib [connections] { if {[is_supported $xlib]} { return $xlib } } return "" } ############################################################################### proc privacy::enable_menu {xlib} { if {[first_supported] == ""} return set m [.mainframe getmenu privacy] if {$::ifacetk::options(show_tearoffs)} { set start 1 } else { set start 0 } for {set i $start} {$i <= [$m index end]} {incr i} { catch {$m entryconfigure $i -state normal} } } proc privacy::disable_menu {xlib} { if {[first_supported] != ""} return set m [.mainframe getmenu privacy] if {$::ifacetk::options(show_tearoffs)} { set start 1 } else { set start 0 } for {set i $start} {$i <= [$m index end]} {incr i} { catch {$m entryconfigure $i -state disabled} } $m entryconfigure [$m index [::msgcat::mc "Activate lists at startup"]] \ -state normal } hook::add connected_hook [namespace current]::privacy::enable_menu hook::add disconnected_hook [namespace current]::privacy::disable_menu hook::add finload_hook [list [namespace current]::privacy::disable_menu {}] # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/proxy.tcl000064400000000000000000000522501477701321300137420ustar00nobodynobody# proxy.tcl -- # # This file is a part of the Tkabber XMPP client. It implements proxy # profiles infrasrtucture and user interface. package require pconnect::socks4 package require pconnect::socks5 package require pconnect::https package require http 2 ::http::config -proxyhost "" -proxyport "" -proxyfilter "" namespace eval proxy {} proc proxy::serialize_profile {proxyconfvar} { upvar #0 $proxyconfvar proxyconf set tproxies {} set hproxies {} foreach {key varlist} [array get proxyconf] { switch -- $key { tunnel - http {} default { continue } } foreach varname $proxyconf($key) { upvar #0 $varname p if {![info exists p(type)] || $p(type) ni {http https socks4 socks5}} { continue } set proxy [list type $p(type)] if {[info exists p(host)]} { lappend proxy host $p(host) } else { continue } if {[info exists p(port)]} { lappend proxy port $p(port) } else { continue } if {[info exists p(username)]} { lappend proxy username $p(username) } if {[info exists p(password)]} { lappend proxy password $p(password) } if {[info exists p(match)]} { lappend proxy match $p(match) } if {[info exists p(exclude)]} { lappend proxy exclude $p(exclude) } switch -- $key { tunnel { lappend tproxies $proxy } http { lappend hproxies $proxy } } } } if {[llength $tproxies] > 0 || [llength $hproxies] > 0} { # There are proxies defined in the config file return [list tunnels $tproxies http $hproxies] } else { return {tunnels {} http {}} } } namespace eval proxy { variable proxylist [serialize_profile ::proxyconf] custom::defvar proxylist {tunnels {} http {}} \ [::msgcat::mc "Serialized array of proxy servers to connect via."] \ -type string -group Hidden } # http package doesn't work with HTTPS URLs through proxy, so workaround this: if {![catch {package require tls}]} { # proxy::tlssocket -- # # Arguments: # ?options? host port # # Bugs: # Doesn't work with -async proc proxy::tlssocket {args} { set host [lindex $args end-1] set port [lindex $args end] set opts {-ssl2 0 -ssl3 0 -tls1 1} if {![catch ::tls::ciphers tls1.1]} { lappend opts -tls1.1 1 } if {![catch ::tls::ciphers tls1.2]} { lappend opts -tls1.2 1 } # Find tunnelling proxy if {![catch {proxyfilter $host $port} answer] && $answer != {}} { return [::tls::import {*}$opts \ [::pconnect::socket $host $port \ -proxyfilter [namespace current]::proxyfilter]] } else { return [::tls::socket {*}$opts {*}$args] } } ::http::register https 443 [namespace current]::proxy::tlssocket } # ::http::geturl -- # # A wrapper around http::geturl which adds proxy authorization header # if necessary. rename ::http::geturl ::http::geturl:orig proc ::http::geturl {url args} { # Save and remove proxy settings set savedProxyHost [::http::config -proxyhost] set savedProxyPort [::http::config -proxyport] set savedProxyFilter [::http::config -proxyfilter] ::http::config -proxyhost "" -proxyport "" -proxyfilter "" # URLmatcher is borrowed from http package. set URLmatcher {(?x) # this is _expanded_ syntax ^ (?: (\w+) : ) ? # (?: // (?: ( [^@/\#?]+ # ) @ )? ( [^/:\#?]+ ) # (?: : (\d+) )? # )? ( / [^\#?]* (?: \? [^\#?]* )?)? # (including query) (?: \# (.*) )? # $ } set auth {} if {[regexp -- $URLmatcher $url -> \ proto user host port srvurl]} { if {$proto != "https"} { ::http::config -proxyfilter ::proxy::proxyfilter if {![catch {proxyfilter $host} answer]} { lassign $answer phost pport pusername ppassword if {$pusername ne "" || $ppassword ne ""} { set auth [list Proxy-Authorization \ "Basic [base64::encode \ [encoding convertto \ $pusername:$ppassword]]"] } } } } set newArgs {} set q 0 foreach {key val} $args { switch -- $key { -headers { lappend newArgs $key [concat $val $auth] set q 1 } default { lappend newArgs $key $val } } } if {!$q} { lappend newArgs -headers $auth } set res [::http::geturl:orig $url {*}$newArgs] ::http::config -proxyhost $savedProxyHost \ -proxyport $savedProxyPort \ -proxyfilter $savedProxyFilter return $res } proc proxy::open {} { variable proxylist set w .proxy if {[winfo exists $w]} { destroy $w } Dialog $w -title [::msgcat::mc "Manage proxy servers"] \ -anchor e \ -default 0 \ -cancel 1 \ -modal none $w add -text [::msgcat::mc "Save"] \ -command [namespace code [list save_proxies $w]] $w add -text [::msgcat::mc "Cancel"] -command [list destroy $w] set hf [Frame $w.hf] pack $hf -side bottom set f [$w getframe] set nb [Notebook $f.nb] set tunnels_page \ [$nb insert end tunnels_page -text [::msgcat::mc "Tunnel proxies"]] set http_page \ [$nb insert end http_page -text [::msgcat::mc "HTTP proxies"]] set n 1 while {[info exists ::proxyconf$n]} {incr n} incr n -1 if {$n} { Menubutton $f.profiles -text [::msgcat::mc "Profiles"] \ -menu $f.profiles.menu set m [menu $f.profiles.menu -tearoff 0] $m add command -label [::msgcat::mc "Default empty profile"] \ -command [list [namespace current]::update_proxy_entries $hf $nb \ $tunnels_page $http_page default] $m add command -label [::msgcat::mc "Profile from config file"] \ -command [list [namespace current]::update_proxy_entries $hf $nb \ $tunnels_page $http_page config] $m add command -label [::msgcat::mc "Currently active profile"] \ -command [list [namespace current]::update_proxy_entries $hf $nb \ $tunnels_page $http_page current] for {set i 1} {$i <= $n} {incr i} { if {[info exists ::proxyconf${i}(profile)]} { set lab [set ::proxyconf${i}(profile)] } else { set lab "[::msgcat::mc Profile] $i" } if {$i <= 10} { set j [expr {$i % 10}] $m add command -label $lab -accelerator "$::tk_modify-$j" \ -command [list [namespace current]::update_proxy_entries \ $hf $nb $tunnels_page $http_page $i] bind $w \ [list [namespace current]::update_proxy_entries \ [double% $hf] [double% $nb] [double% $tunnels_page] \ [double% $http_page] $i] } else { $m add command -label $lab \ -command [list [namespace current]::update_proxy_entries \ $hf $nb $tunnels_page $http_page $i] } } grid $f.profiles -row 0 -column 0 -sticky ne } grid $nb -row 1 -column 0 -sticky nswe grid columnconfigure $f 0 -weight 1 grid rowconfigure $f 0 -weight 1 fill_pages $hf $nb $tunnels_page $http_page $proxylist $nb raise tunnels_page $w draw } proc proxy::update_proxy_entries {hf nb tunnels_page http_page i} { variable proxylist switch -- $i { default { fill_pages $hf $nb $tunnels_page $http_page {tunnels {} http {}} } config { fill_pages $hf $nb $tunnels_page $http_page \ [serialize_profile ::proxyconf] } current { fill_pages $hf $nb $tunnels_page $http_page $proxylist } default { fill_pages $hf $nb $tunnels_page $http_page \ [serialize_profile ::proxyconf$i] } } } proc proxy::fill_pages {hf nb tunnels_page http_page proxies} { set w1 [customize_frame $tunnels_page tunnels $proxies] set w2 [customize_frame $http_page http $proxies] catch {$nb compute_size} update idletasks if {$w1 > $w2} { $hf configure \ -width [expr {$w1 + [winfo pixels $nb 1c]}] } elseif {$w2 > 0} { $hf configure \ -width [expr {$w2 + [winfo pixels $nb 1c]}] } } proc proxy::customize_frame {frame type proxies} { variable data switch -- $type { tunnels { set add_type https } http { set add_type http } default { return -code error } } array set Proxy $proxies set q 0 foreach path [winfo children $frame] { destroy $path set q 1 } set tools [Frame $frame.tools] pack $tools -side bottom -fill x set sw [ScrolledWindow $frame.sw -scrollbar vertical] set sf [ScrollableFrame $frame.fields -constrainedwidth yes] pack $sw -side bottom -expand yes -fill both $sw setwidget $sf set f [$sf getframe] bindscroll $f $sf bind $f [namespace code [list cleanup $f $type]] set add [Button $tools.add \ -text [::msgcat::mc "Add proxy"] \ -command [namespace code \ [list add_proxy $sf $f $type $add_type "" "" "" "" * \ "localhost* 127.0.0.* 172.* 192.168.* 10.*"]]] pack $add -side right -pady 2m set data($type,counter) 0 if {!$q} { add_proxy $sf $f $type remove "" "" "" "" "" "" } if {[info exists Proxy($type)]} { foreach proxy $Proxy($type) { array unset Args array set Args $proxy set add_args {} foreach idx {type host port username password match exclude} { if {[info exists Args($idx)]} { lappend add_args $Args($idx) } else { lappend add_args "" } } add_proxy $sf $f $type {*}$add_args } } if {!$q} { update idletasks set w [winfo reqwidth $f] remove_proxy $f $type 1 } else { set w 0 } return $w } proc proxy::cleanup {f type} { variable data array unset data $type,* } proc proxy::save_proxies {w} { variable data variable proxylist foreach type {tunnels http} { set proxies($type) {} for {set i 1} {$i <= $data($type,counter)} {incr i} { if {$data($type,type,$i) == "remove"} continue if {$data($type,type,$i) ni {http https socks4 socks5}} { continue } lappend proxies($type) [list type $data($type,type,$i) \ host $data($type,host,$i) \ port $data($type,port,$i) \ username $data($type,username,$i) \ password $data($type,password,$i) \ match $data($type,match,$i) \ exclude $data($type,exclude,$i)] } } destroy $w set proxylist [list tunnels $proxies(tunnels) http $proxies(http)] } proc proxy::add_proxy \ {sf f type ptype host port username password match exclude} { variable data switch -- $type { tunnels { if {$ptype ni {remove https socks4 socks5}} return } http { if {$ptype ni {remove http}} return } default { return } } set i [incr data($type,counter)] set data($type,type,$i) $ptype set data($type,host,$i) $host set data($type,port,$i) $port set data($type,username,$i) $username set data($type,password,$i) $password set data($type,match,$i) $match set data($type,exclude,$i) $exclude set erow [lindex [grid size $f] 1] set ff [Labelframe $f.p$i -padding {2m 2m}] grid $ff -row $erow -column 0 -rowspan 3 -sticky nwes -padx 1m -pady 1m bindscroll $ff $sf set row 0 Label $ff.lproxy$i -text [::msgcat::mc "Proxy type:"] grid $ff.lproxy$i -row $row -column 0 -sticky e bindscroll $ff.lproxy$i $sf Frame $ff.proxy$i grid $ff.proxy$i -row $row -column 1 -columnspan 3 -sticky w set col 0 if {$type == "tunnels"} { Radiobutton $ff.proxy$i.https -text [::msgcat::mc "HTTPS"] \ -variable [namespace current]::data($type,type,$i) \ -value https grid $ff.proxy$i.https -row 0 -column [incr col] -sticky w bindscroll $ff.proxy$i.https $sf Radiobutton $ff.proxy$i.socks4 -text [::msgcat::mc "SOCKS4a"] \ -variable [namespace current]::data($type,type,$i) \ -value socks4 grid $ff.proxy$i.socks4 -row 0 -column [incr col] -sticky w bindscroll $ff.proxy$i.socks4 $sf Radiobutton $ff.proxy$i.socks5 -text [::msgcat::mc "SOCKS5"] \ -variable [namespace current]::data($type,type,$i) \ -value socks5 grid $ff.proxy$i.socks5 -row 0 -column [incr col] -sticky w bindscroll $ff.proxy$i.socks5 $sf } else { Label $ff.proxy$i.https -text [::msgcat::mc "HTTP"] grid $ff.proxy$i.https -row 0 -column [incr col] -sticky w bindscroll $ff.proxy$i.https $sf } incr row Label $ff.lhost$i -text [::msgcat::mc "Host:"] Entry $ff.host$i -textvariable [namespace current]::data($type,host,$i) Label $ff.lport$i -text [::msgcat::mc "Port:"] Spinbox $ff.port$i 0 65535 1 [namespace current]::data($type,port,$i) grid $ff.lhost$i -row $row -column 0 -sticky e grid $ff.host$i -row $row -column 1 -sticky ew grid $ff.lport$i -row $row -column 2 -sticky e grid $ff.port$i -row $row -column 3 -sticky ew incr row Label $ff.lusername$i -text [::msgcat::mc "Username:"] Entry $ff.username$i \ -textvariable [namespace current]::data($type,username,$i) Label $ff.lpassword$i -text [::msgcat::mc "Password:"] Entry $ff.password$i -show * \ -textvariable [namespace current]::data($type,password,$i) grid $ff.lusername$i -row $row -column 0 -sticky e grid $ff.username$i -row $row -column 1 -sticky ew grid $ff.lpassword$i -row $row -column 2 -sticky e grid $ff.password$i -row $row -column 3 -sticky ew incr row Label $ff.lmatch$i -text [::msgcat::mc "Match:"] Entry $ff.match$i \ -textvariable [namespace current]::data($type,match,$i) grid $ff.lmatch$i -row $row -column 0 -sticky e grid $ff.match$i -row $row -column 1 -columnspan 3 -sticky ew incr row Label $ff.lexclude$i -text [::msgcat::mc "Exclude:"] Entry $ff.exclude$i \ -textvariable [namespace current]::data($type,exclude,$i) grid $ff.lexclude$i -row $row -column 0 -sticky e grid $ff.exclude$i -row $row -column 1 -columnspan 3 -sticky ew grid columnconfigure $ff 1 -weight 3 grid columnconfigure $ff 2 -weight 1 grid columnconfigure $ff 3 -weight 3 Button $f.moveup$i -text [::msgcat::mc "Move up"] \ -command [namespace code [list move_proxy_up $f $type $i]] Button $f.movedown$i -text [::msgcat::mc "Move down"] \ -command [namespace code [list move_proxy_down $f $type $i]] Button $f.remove$i -text [::msgcat::mc "Remove"] \ -command [namespace code [list remove_proxy $f $type $i]] grid $f.moveup$i -row $erow -column 1 -sticky ews -padx 1m grid $f.movedown$i -row [expr {$erow+1}] -column 1 -sticky ewns -padx 1m grid $f.remove$i -row [expr {$erow+2}] -column 1 -sticky ewn -padx 1m bindscroll $f.moveup$i $sf bindscroll $f.movedown$i $sf bindscroll $f.remove$i $sf grid rowconfigure $f $erow -weight 1 grid rowconfigure $f [expr {$erow+2}] -weight 1 grid columnconfigure $f 0 -weight 1 foreach path [winfo children $ff] { bindscroll $path $sf } } proc proxy::remove_proxy {f type i} { variable data destroy $f.p$i destroy $f.moveup$i destroy $f.movedown$i destroy $f.remove$i set data($type,type,$i) remove } proc proxy::move_proxy_up {f type i} { variable data set j $i incr j -1 while {$j > 0 && $data($type,type,$j) == "remove"} { incr j -1 } if {$j > 0} { switch_proxies $f $type $i $j } } proc proxy::move_proxy_down {f type i} { variable data set j $i incr j 1 while {$j <= $data($type,counter) && $data($type,type,$j) == "remove"} { incr j 1 } if {$j <= $data($type,counter)} { switch_proxies $f $type $i $j } } proc proxy::switch_proxies {f type i j} { variable data set ptype $data($type,type,$i) set host $data($type,host,$i) set port $data($type,port,$i) set username $data($type,username,$i) set password $data($type,password,$i) set match $data($type,match,$i) set exclude $data($type,exclude,$i) set data($type,type,$i) $data($type,type,$j) set data($type,host,$i) $data($type,host,$j) set data($type,port,$i) $data($type,port,$j) set data($type,username,$i) $data($type,username,$j) set data($type,password,$i) $data($type,password,$j) set data($type,match,$i) $data($type,match,$j) set data($type,exclude,$i) $data($type,exclude,$j) set data($type,type,$j) $ptype set data($type,host,$j) $host set data($type,port,$j) $port set data($type,username,$j) $username set data($type,password,$j) $password set data($type,match,$j) $match set data($type,exclude,$j) $exclude } proc proxy::proxyfilter {host {port -1}} { variable proxylist array set Proxy $proxylist if {$port < 0} { # HTTP proxy set plist $Proxy(http) } else { # Tunnel proxy set plist $Proxy(tunnels) } foreach proxy $plist { array unset Args array set Args $proxy if {$Args(type) ni {http https socks4 socks5}} { continue } if {![info exists Args(host)] || [string length $Args(host)] == 0} { continue } if {![info exists Args(port)] || ![string is integer -strict $Args(port)] || $Args(port) < 0 || $Args(port) >= 65536} { continue } set m 0 if {[info exists Args(match)]} { foreach pattern [split $Args(match)] { if {[string match -nocase $pattern $host]} { set m 1 break } } } set x 0 if {[info exists Args(exclude)]} { foreach pattern [split $Args(exclude)] { if {[string match -nocase $pattern $host]} { set x 1 break } } } if {$m && !$x} { if {$port < 0} { set res [list $Args(host) $Args(port)] } else { set res [list $Args(type) $Args(host) $Args(port)] } if {[info exists Args(username)] && [info exists Args(password)]} { lappend res $Args(username) $Args(password) } return $res } } return {} } proc proxy::set_profile {profile} { variable proxylist set i 1 while {[info exists ::proxyconf$i]} { if {[info exists ::proxyconf${i}(profile)] && [set ::proxyconf${i}(profile)] eq $profile} { set proxylist [serialize_profile proxyconf$i] return $profile } incr i } return -code error "Can't find proxy profile $profile" } proc proxy::register_remote_command {} { if {[llength [info procs ::plugins::comm::register_command]] > 0} { ::plugins::comm::register_command set-proxy-profile \ [namespace current]::set_profile "profile" } } hook::add postload_hook proxy::register_remote_command # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/pubsub.tcl000064400000000000000000000545111477701321300140630ustar00nobodynobody# pubsub.tcl -- # # Publish-Subscribe Support (XEP-0060) # Personal Eventing via Pubsub Support (XEP-0163) package require xmpp::pubsub ########################################################################## # # Publish-subscribe XEP-0060 # namespace eval pubsub { variable m2a variable a2m variable aff_list [list [::msgcat::mc "Owner"] owner \ [::msgcat::mc "Publisher"] publisher \ [::msgcat::mc "None"] none \ [::msgcat::mc "Outcast"] outcast] variable m variable a foreach {m a} $aff_list { set m2a($m) $a set a2m($a) $m } variable m2s variable s2m variable subsc_list [list [::msgcat::mc "None"] none \ [::msgcat::mc "Pending"] pending \ [::msgcat::mc "Unconfigured"] unconfigured \ [::msgcat::mc "Subscribed"] subscribed] variable s foreach {m s} $subsc_list { set m2s($m) $s set s2m($s) $m } } ########################################################################## # # Configure subscription options (6.3) # proc pubsub::requestSubscriptionOptions {xlib service node args} { debugmsg pubsub [info level 0] set commands {} set newArgs {} foreach {key val} $args { switch -- $key { -command { set commands [list $val] } default { lappend newArgs $key $val } } } eval {::xmpp::pubsub::requestSubscriptionOptions $xlib $service $node} \ $newArgs \ {-command [namespace code [list SubscriptionOptionsResult \ $xlib $service $commands]]} } proc pubsub::SubscriptionOptionsResult {xlib service commands status res} { debugmsg pubsub [info level 0] if {![string equal $status ok]} { if {[llength $commands] > 0} { eval [lindex $commands 0] [list $status $res] } return } lassign $res attrs form set node [::xmpp::xml::getAttr $attrs node] set jid [::xmpp::xml::getAttr $attrs jid] set subid [::xmpp::xml::getAttr $attrs subid] data::draw_window [list $form] \ [namespace code [list SendSubscriptionOptions $xlib $service $node $jid $subid $commands]] } # TODO: $commands proc pubsub::SendSubscriptionOptions \ {xlib service node jid subid commands w restags} { debugmsg pubsub [info level 0] destroy $w.error.msg $w.bbox itemconfigure 0 -state disabled ::xmpp::pubsub::sendSubscriptionOptions $xlib $service $node $restags \ -jid $jid -subid $subid -resource $resource \ -command [list data::test_error_res $w] } proc pubsub::requestSubscriptions {xlib service node args} { debugmsg pubsub [info level 0] set commands {} set newArgs {} foreach {key val} $args { switch -- $key { -command { set commands [list $val] } default { lappend newArgs $key $val } } } eval {::xmpp::pubsub::requestSubscriptions $xlib $service $node} $newArgs \ {-command [namespace code [list RequestSubscriptionsResult \ $xlib $service $commands]]} } proc pubsub::RequestSubscriptionsResult {xlib service commands status items} { debugmsg pubsub [info level 0] if {![string equal $status ok]} { if {[llength $commands] > 0} { eval [lindex $commands 0] [list $status $items] } return } set w .pubsub_subscriptions if {[winfo exists $w]} { destroy $w } Dialog $w -title [::msgcat::mc "Subscriptions to pubsub nodes at %s" \ $service] \ -modal none -anchor e -default 0 -cancel 0 $w add -text [::msgcat::mc "Close"] -command [list destroy $w] set wf [$w getframe] set sw [ScrolledWindow $wf.sw -scrollbar vertical] set sf [ScrollableFrame $w.fields -constrainedwidth yes] set f [$sf getframe] $sw setwidget $sf set row 1 foreach item $items { set node [::xmpp::xml::getAttr $item node] set jid [::xmpp::xml::getAttr $item jid] set subscription [::xmpp::xml::getAttr $item subscription] set subid [::xmpp::xml::getAttr $item subid] Label $f.node$row -text $node Label $f.jid$row -text $jid Label $f.subscription -text $subscription Label $f.subid -text $subid grid $f.node$row -row $row -column 0 grid $f.jid$row -row $row -column 1 grid $f.subscription$row -row $row -column 2 grid $f.subid$row -row $row -column 3 set command [list requestSubscriptionOptions $xlib $service $node \ -jid $jid -command [namespace code test_error]] if {[::xmpp::xml::isAttr $item subid]} { lappend command -subid $subid } Button $f.edit$row -text [::msgcat::mc "Edit"] \ -command [namespace code $command] grid $f.edit$row -row $row -column 4 } } ########################################################################## # # Owner use cases (8) # ########################################################################## # # Configure pubsub node "node" at service "service" (8.2) # node must not be empty # proc pubsub::configureNode {xlib service node args} { debugmsg pubsub [info level 0] set commands {} set newArgs {} foreach {key val} $args { switch -- $key { -command { set commands [list $val] } default { lappend newArgs $key $val } } } eval {::xmpp::pubsub::configureNode $xlib $service $node} $newArgs \ {-command [namespace code [list ConfigureNodeResult \ $xlib $service $commands]]} } proc pubsub::ConfigureNodeResult {xlib service commands status res} { debugmsg pubsub [info level 0] if {![string equal $status ok]} { if {[llength $commands] > 0} { eval [lindex $commands 0] [list $status $res] } return } lassign $res node form data::draw_window [list $form] \ [namespace code [list SendConfigureNode \ $xlib $service $node $commands]] } proc pubsub::SendConfigureNode {xlib service node commands w restags} { debugmsg pubsub [info level 0] destroy $w.error.msg $w.bbox itemconfigure 0 -state disabled ::xmpp::pubsub::sendConfigureNode $xlib $service $node $restags \ -command [list data::test_error_res $w] } ########################################################################## # # Request default configuration options (8.3) # proc pubsub::requestDefaultConfig {xlib service args} { variable ns debugmsg pubsub [info level 0] set commands {} set newArgs {} foreach {key val} $args { switch -- $key { -command { set commands [list $val] } default { lappend newArgs $key $val } } } eval {::xmpp::pubsub::requestDefaultConfig $xlib $service} $newArgs \ {-command [namespace code [list RequestDefaultConfigResult \ $xlib $service $commands]]} } proc pubsub::RequestDefaultConfigResult {xlib service commands status form} { debugmsg pubsub [info level 0] if {![string equal $status ok]} { if {[llength $commands] > 0} { eval [lindex $commands 0] [list $status $form] } return } # TODO: Don't send the form data::draw_window [list $form] \ [namespace code [list SendRequestResults \ $xlib $service $commands]] } proc pubsub::SendRequestResults {xlib service commands w restags} { debugmsg pubsub [info level 0] destroy $w.error.msg } ########################################################################## # # Request all pending subscription requests (8.6.1) # proc pubsub::request_pending_subscription {xlib service} { debugmsg pubsub [info level 0] # Let xcommands.tcl do the job xcommands::execute $xlib $service $::xmpp::pubsub::ns(get-pending) } ########################################################################## # # Modifying entity affiliations # node must not be empty # TODO # proc pubsub::request_entities {xlib service node args} { debugmsg pubsub [info level 0] set command "" foreach {key val} $args { switch -- $key { -command { set command $val } } } if {$node == ""} { return -code error "pubsub::request_entities error: Node is empty" } ::xmpp::sendIQ $xlib set \ -query [::xmpp::xml::create pubsub \ -xmlns $::NS(pubsub) \ -subelement [::xmpp::xml::create entities \ -attrs [list node $node]]] \ -to $service \ -command [list [namespace current]::receive_entities \ $xlib $service $command] } proc pubsub::receive_entities {xlib service command res child} { variable winid debugmsg pubsub [info level 0] if {$res != "ok"} { if {$command != ""} { eval $command [list $res $child] } } ::xmpp::xml::split $child tag xmlns attrs cdata subels foreach subel $subels { ::xmpp::xml::split $subel stag sxmlns sattrs scdata ssubels if {$stag == "entities"} { set node [::xmpp::xml::getAttr $sattrs node] set entities $ssubels break } } if {![info exists winid]} { set winid 0 } else { incr winid } set w .pubsub_entities$winid if {[winfo exists $w]} { destroy $w } Dialog $w -title [::msgcat::mc "Edit entities affiliations: %s" $node] \ -modal none -anchor e -default 0 -cancel 1 set wf [$w getframe] set sw [ScrolledWindow $wf.sw -scrollbar vertical] set sf [ScrollableFrame $w.fields -constrainedwidth yes] set f [$sf getframe] $sw setwidget $sf fill_list $sf $f $entities list_add_item $sf $f $w add -text [::msgcat::mc "Send"] \ -command [list [namespace current]::send_entities \ $xlib $service $node $w $f] $w add -text [::msgcat::mc "Cancel"] -command [list destroy $w] bind $f \ [list [namespace current]::cleanup_entities %W] Button $w.add -text [::msgcat::mc "Add"] \ -command [list [namespace current]::list_add_item $sf $f] pack $w.add -side bottom -anchor e -in $wf -padx 1m -pady 1m pack $sw -side top -expand yes -fill both bindscroll $f $sf set hf [Frame $w.hf] pack $hf -side top set vf [Frame $w.vf] pack $vf -side left update idletasks $hf configure -width [expr {[winfo reqwidth $f] + [winfo pixels $f 1c]}] set h [winfo reqheight $f] set sh [winfo screenheight $w] if {$h > $sh - [winfo pixels $f 5c]} { set h [expr {$sh - [winfo pixels $f 5c]}] } $vf configure -height $h $w draw } proc pubsub::fill_list {sf f entities} { variable a2m variable s2m variable listdata variable origlistdata debugmsg pubsub [info level 0] grid columnconfigure $f 0 -weight 1 grid columnconfigure $f 1 -weight 1 grid columnconfigure $f 2 -weight 1 grid columnconfigure $f 3 -weight 1 Label $f.ljid -text [::msgcat::mc "Jabber ID"] grid $f.ljid -row 0 -column 0 -sticky we -padx 1m bindscroll $f.ljid $sf Label $f.lsubid -text [::msgcat::mc "SubID"] grid $f.lsubid -row 0 -column 1 -sticky we -padx 1m bindscroll $f.lsubid $sf Label $f.laffiliation -text [::msgcat::mc "Affiliation"] grid $f.laffiliation -row 0 -column 2 -sticky we -padx 1m bindscroll $f.laffiliation $sf Label $f.lsubscription -text [::msgcat::mc "Subscription"] grid $f.lsubscription -row 0 -column 3 -sticky we -padx 1m bindscroll $f.lsubscription $sf set row 1 set entities2 {} foreach entity $entities { ::xmpp::xml::split $entity tag xmlns attrs cdata subels switch -- $tag { entity { set jid [::xmpp::xml::getAttr $attrs jid] set subid [::xmpp::xml::getAttr $attrs subid] set affiliation [::xmpp::xml::getAttr $attrs affiliation] set subscription [::xmpp::xml::getAttr $attrs subscription] lappend entities2 [list $jid $subid $affiliation $subscription] } } } foreach entity [lsort -dictionary -index 0 $entities2] { lassign $item jid subid affiliation subscription Label $f.jid$row -text $jid \ -textvariable [namespace current]::listdata($f,jid,$row) grid $f.jid$row -row $row -column 0 -sticky w -padx 1m bindscroll $f.jid$row $sf Label $f.subid$row -text $subid \ -textvariable [namespace current]::listdata($f,subid,$row) grid $f.subid$row -row $row -column 1 -sticky w -padx 1m bindscroll $f.subid$row $sf Combobox $f.affiliation$row -text $a2m($affiliation) \ -values [list $a2m(owner) \ $a2m(publisher) \ $a2m(none) \ $a2m(outcast)] \ -editable no \ -width 9 \ -textvariable [namespace current]::listdata($f,affiliation,$row) grid $f.affiliation$row -row $row -column 2 -sticky we -padx 1m bindscroll $f.affiliation$row $sf Combobox $f.subscription$row -text $s2m($subscription) \ -values [list $s2m(none) \ $s2m(pending) \ $s2m(unconfigured) \ $s2m(subscribed)] \ -editable no \ -width 12 \ -textvariable [namespace current]::listdata($f,subscription,$row) grid $f.subscription$row -row $row -column 3 -sticky we -padx 1m bindscroll $f.subscription$row $sf incr row } set listdata($f,rows) $row array set origlistdata [array get listdata $f,*] } proc pubsub::list_add_item {sf f} { variable a2m variable s2m variable listdata debugmsg pubsub [info level 0] set row $listdata($f,rows) Entry $f.jid$row \ -textvariable [namespace current]::listdata($f,jid,$row) grid $f.jid$row -row $row -column 0 -sticky we -padx 1m bindscroll $f.jid$row $sf Entry $f.subid$row \ -textvariable [namespace current]::listdata($f,subid,$row) grid $f.subid$row -row $row -column 1 -sticky we -padx 1m bindscroll $f.subid$row $sf Combobox $f.affiliation$row \ -values [list $a2m(owner) \ $a2m(publisher) \ $a2m(none) \ $a2m(outcast)] \ -editable no \ -width 9 \ -textvariable [namespace current]::listdata($f,affiliation,$row) $f.affiliation$row set $a2m(none) grid $f.affiliation$row -row $row -column 2 -sticky we -padx 1m bindscroll $f.affiliation$row $sf Combobox $f.subscription$row \ -values [list $s2m(none) \ $s2m(pending) \ $s2m(unconfigured) \ $s2m(subscribed)] \ -editable no \ -width 12 \ -textvariable [namespace current]::listdata($f,subscription,$row) $f.subscription$row set $s2m(none) grid $f.subscription$row -row $row -column 3 -sticky we -padx 1m bindscroll $f.subscription$row $sf incr listdata($f,rows) } proc pubsub::send_entities {xlib service node w f} { variable origlistdata variable listdata debugmsg pubsub [info level 0] set entities {} for {set i 1} {$i < $origlistdata($f,rows)} {incr i} { set vars {} if {$listdata($f,affiliation,$i) != $origlistdata($f,affiliation,$i)} { lappend vars affiliation $listdata($f,affiliation,$i) } if {$listdata($f,subscription,$i) ne $origlistdata($f,subscription,$i)} { lappend vars subscription $listdata($f,subscription,$i) } if {$vars != {} && $origlistdata($f,jid,$i) != ""} { lappend vars jid $origlistdata($f,jid,$i) lappend entities [::xmpp::xml::create entity \ -attrs $vars] } } for {} {$i < $listdata($f,rows)} {incr i} { set vars1 {} set vars2 {} set vars3 {} if {$listdata($f,affiliation,$i) != ""} { lappend vars1 affiliation $listdata($f,affiliation,$i) } if {$listdata($f,subscription,$i) != ""} { lappend vars1 subscription $listdata($f,subscription,$i) } if {$listdata($f,jid,$i) != ""} { lappend vars2 jid $listdata($f,jid,$i) } if {$listdata($f,subid,$i) != ""} { lappend vars3 subid $listdata($f,subid,$i) } if {$vars1 != {} && $vars2 != {} && $vars3 != {}} { lappend entities [::xmpp::xml::create item \ -attrs $vars2 \ -attrs $vars3 \ -attrs $vars1] } } set xlib [chat::get_xlib $chatid] set group [chat::get_jid $chatid] if {$entities != {}} { ::xmpp::sendIQ $xlib set \ -query [::xmpp::xml::create pubsub \ -xmlns $::NS(pubsub) \ -subelement [::xmpp::xml::create entities \ -attrs [list node $node] \ -subelements $entities]] \ -to $service # TODO error checking } destroy $w } proc pubsub::cleanup_entities {f} { variable listdata variable origlistdata debugmsg pubsub [info level 0] array unset listdata $f,* array unset origlistdata $f,* } ########################################################################## # # Framework for handling of Pubsub event notifications. proc pubsub::register_event_notification_handler {xmlns h} { variable handler variable supported_ns set handler($xmlns) $h set supported_ns [array names handler] } proc pubsub::process_event_notification \ {xlib from mid type is_subject subject body \ err thread priority x} { if {[string equal $type error]} return variable handler set res "" foreach event $x { ::xmpp::xml::split $event tag xmlns attrs cdata subels if {![string equal $tag event]} continue if {![string equal $xmlns $::xmpp::pubsub::ns(event)]} continue foreach item $subels { ::xmpp::xml::split $item stag sxmlns sattrs scdata ssubels if {![string equal $stag items]} continue set node [::xmpp::xml::getAttr $sattrs node] if {![info exists handler($node)]} continue set res stop eval $handler($node) [list $xlib $from $ssubels] } } return $res } hook::add process_message_hook pubsub::process_event_notification ########################################################################## proc pubsub::disco_node_menu_setup {m bw tnode data parentdata} { lassign $data type xlib jid node lassign $parentdata ptype pxlib pjid pnode if {$pjid != $jid} return switch -- $type { item - item2 { set identities [disco::browser::get_identities $bw $tnode] if {[llength $identities] == 0} { set identities \ [disco::browser::get_parent_identities $bw $tnode] } foreach id $identities { if {[::xmpp::xml::getAttr $id category] == "pubsub"} { $m add command \ -label [::msgcat::mc "Request default configuration"] \ -command [namespace code [list requestDefaultConfig \ $xlib $jid \ -command [namespace code test_error]]] $m add command \ -label [::msgcat::mc "Retrieve subscriptions"] \ -command [namespace code [list requestSubscriptions \ $xlib $jid $node \ -command [namespace code test_error]]] if {$node == ""} { set state disabled } else { set state normal } $m add command -label [::msgcat::mc "Configure node"] \ -command [namespace code [list configureNode \ $xlib $jid $node \ -command [namespace code test_error]]] \ -state $state $m add command -label [::msgcat::mc "Subscribe"] \ -command [list ::xmpp::pubsub::subscribe \ $xlib $jid $node \ -command [namespace code test_result]] \ -state $state $m add command -label [::msgcat::mc "Unsubscribe"] \ -command [list ::xmpp::pubsub::unsubscribe \ $xlib $jid $node \ -command [namespace code test_result]] \ -state $state return } } } } } hook::add disco_node_menu_hook pubsub::disco_node_menu_setup 60 proc pubsub::test_error {status xml} { if {[string equal $status ok]} { return } NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "Pubsub request failed: %s" \ [error_to_string $xml]] } proc pubsub::test_result {status xml} { if {[string equal $status ok]} { NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon warning \ -title [::msgcat::mc "Success"] \ -message [::msgcat::mc "Pubsub request succeeded"] } else { NonmodalMessageDlg [epath] \ -aspect 50000 \ -icon error \ -title [::msgcat::mc "Error"] \ -message [::msgcat::mc "Pubsub request failed: %s" \ [error_to_string $xml]] } } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/register.tcl000064400000000000000000000237601477701321300144110ustar00nobodynobody# register.tcl -- # # This file is a part of the Tkabber XMPP client. It implements user # interface for registering protocol (XEP-0077). package require xmpp::register namespace eval register {} proc register::open {xlib jid args} { variable winid if {![info exists winid]} { set winid 0 } set commands {} foreach {key val} $args { switch -- $key { -command { set commands [list $val] } } } set w .register[incr winid] Toplevel $w wm group $w . set title [::msgcat::mc "Register in %s" $jid] wm title $w $title wm iconname $w $title wm transient $w . if {$::tcl_platform(platform) == "macintosh"} { catch { unsupported1 style $w floating sideTitlebar } } elseif {$::aquaP} { ::tk::unsupported::MacWindowStyle style $w floating {closeBox} } wm resizable $w 0 0 set hf [Frame $w.error] set vf [Frame $w.vf] set sw [ScrolledWindow $w.sw] set sf [ScrollableFrame $w.fields -constrainedwidth yes] set f [$sf getframe] $sf configure -height 10 $sw setwidget $sf bindscroll $f $sf set bbox [ButtonBox $w.bbox -spacing 0 -padx 2m -default 0] $bbox add -text [::msgcat::mc "Register"] \ -command [namespace code [list Register $w $f $xlib $jid \ $commands false]] \ -state disabled $bbox add -text [::msgcat::mc "Unregister"] \ -command [namespace code [list Unregister $w $xlib $jid $commands]] \ -state disabled $bbox add -text [::msgcat::mc "Cancel"] \ -command [namespace code [list Cancel $w $commands]] bind $w "ButtonBox::invoke [double% $bbox] default" bind $w "ButtonBox::invoke [double% $bbox] 2" pack $bbox -padx 2m -pady 2m -anchor e -side bottom pack [Frame $w.sep -height 0] -side bottom pack $hf -side top pack $vf -side left -pady 2m pack $sw -side top -expand yes -fill both -padx 2m -pady 2m bind $f [list data::cleanup %W] wm withdraw $w ::xmpp::register::request $xlib $jid \ -command [namespace code [list RecvFields $w $f $xlib $jid $commands]] } proc register::Cancel {w commands} { destroy $w if {[llength $commands] > 0} { uplevel #0 [lindex $commands 0] [list abort {}] } } proc register::RecvFields {w f xlib jid commands status fields args} { debugmsg register "$status $fields" if {![winfo exists $w]} { # User may have already destroyed this window return } switch -- $status { error { destroy $w MessageDlg ${w}_err -aspect 50000 -icon error \ -message [::msgcat::mc "Registration: %s" \ [error_to_string $fields]] \ -type user -buttons ok -default 0 -cancel 0 if {[llength $commands] > 0} { uplevel #0 [lindex $commands 0] [list $status $fields] } } ok { foreach {key val} $args { switch -- $key { -old { $w.bbox itemconfigure 0 \ -command [namespace code [list Register $w $f \ $xlib $jid \ $commands $val]] } } } set focus [data::fill_fields_x $f $fields] $w.bbox itemconfigure 0 -state normal if {![::xmpp::jid::equal $jid [connection_server $xlib]]} { $w.bbox itemconfigure 1 -state normal } update idletasks $w.error configure \ -width [expr {[winfo reqwidth $f] + [winfo pixels $f 1c]}] set h [winfo reqheight $f] set sh [winfo screenheight $w] if {$h > $sh - [winfo pixels $f 5c]} { set h [expr {$sh - [winfo pixels $f 5c]}] } $w.vf configure -height $h wm deiconify $w if {$focus != ""} { focus $focus } } default { destroy $w } } } proc register::Register {w f xlib jid commands old} { variable data destroy $w.error.msg $w.bbox itemconfigure 0 -state disabled $w.bbox itemconfigure 1 -state disabled set fields [data::get_fields $f] ::xmpp::register::submit $xlib $jid $fields \ -command [namespace code [list RecvResult $w $xlib $jid $commands]] \ -old $old } proc register::Unregister {w xlib jid commands} { variable data destroy $w.error.msg $w.bbox itemconfigure 0 -state disabled $w.bbox itemconfigure 1 -state disabled ::xmpp::register::remove $xlib $jid \ -command [namespace code [list RecvResult $w $xlib $jid $commands]] } proc register::password {xlib} { variable winid if {![info exists winid]} { set winid 0 } set w .register[incr winid] Toplevel $w wm group $w . set title \ [::msgcat::mc "Change Password for %s" [connection_bare_jid $xlib]] wm title $w $title wm iconname $w $title wm transient $w . if {$::tcl_platform(platform) == "macintosh"} { catch { unsupported1 style $w floating sideTitlebar } } elseif {$::aquaP} { ::tk::unsupported::MacWindowStyle style $w floating {closeBox} } wm resizable $w 0 0 set hf [Frame $w.error] set vf [Frame $w.vf] set sw [ScrolledWindow $w.sw] set sf [ScrollableFrame $w.fields -constrainedwidth yes] set f [$sf getframe] $sf configure -height 10 $sw setwidget $sf bindscroll $f $sf set bbox [ButtonBox $w.bbox -spacing 0 -padx 2m -default 0] $bbox add -text [::msgcat::mc "Submit"] \ -command [namespace code [list Password $w $f $xlib]] $bbox add -text [::msgcat::mc "Cancel"] -command [list destroy $w] bind $w "ButtonBox::invoke [double% $bbox] default" bind $w "ButtonBox::invoke [double% $bbox] 1" pack $bbox -padx 2m -pady 2m -anchor e -side bottom pack [Frame $w.sep -height 0] -side bottom pack $hf -side top pack $vf -side left -pady 2m pack $sw -side top -expand yes -fill both -padx 2m -pady 2m bind $f [list data::cleanup %W] set fields \ [list instructions [::msgcat::mc "Enter the new password for %s" \ [connection_bare_jid $xlib]] \ field [list username hidden "" "" false \ {} [list [connection_user $xlib]] {}] \ field [list password text-private \ [::msgcat::mc "New password:"] "" false \ {} {} {}]] wm withdraw $w RecvFields $w $f $xlib "" {} ok $fields } proc register::Password {w f xlib} { variable data if {![winfo exists $w]} { # User may have already destroyed this window return } destroy $w.error.msg $w.bbox itemconfigure 0 -state disabled set username [connection_user $xlib] set password "" foreach {var values} [data::get_fields $f] { switch -- $var { username { set username [lindex $values 0] } password { set password [lindex $values 0] } } } ::xmpp::register::password $xlib $username $password \ -command [namespace code [list RecvResult $w $xlib "" {}]] } proc register::RecvResult {w xlib jid commands status xml} { variable data debugmsg register "$status $xml" if {![winfo exists $w]} { # User may have already destroyed this window return } switch -- $status { ok { set result [::msgcat::mc "Registration is successful!"] Label $w.result -text $result pack $w.result -expand yes -fill both -after $w.sw -anchor nw \ -padx 1c -pady 1c pack forget $w.sw destroy $w.bbox set bbox [ButtonBox $w.bbox -spacing 0 -padx 2m -default 0] $bbox add -text [::msgcat::mc "Close"] -command [list destroy $w] bind $w "ButtonBox::invoke [double% $bbox] default" bind $w "ButtonBox::invoke [double% $bbox] 0" pack $bbox -padx 2m -pady 2m -anchor e -side bottom -before $w.sep if {[llength $commands] > 0} { uplevel #0 [lindex $commands 0] [list $status $xml] } } continue { set f [$sf getframe] foreach ch [winfo children $f] { destroy $f } data::cleanup $f destroy $w.bbox set bbox [ButtonBox $w.bbox -spacing 0 -padx 2m -default 0] $bbox add -text [::msgcat::mc "Submit"] \ -command [namespace code [list Register $w $f $xlib \ $jid false]] $bbox add -text [::msgcat::mc "Cancel"] -command [list destroy $w] bind $w "ButtonBox::invoke [double% $bbox] default" bind $w "ButtonBox::invoke [double% $bbox] 1" pack $bbox -padx 2m -pady 2m -anchor e -side bottom -before $w.sep RecvFields $w $f $xlib $jid $commands ok $xml } default { $w.bbox itemconfigure 0 -state normal if {$jid != [connection_server $xlib]} { $w.bbox itemconfigure 1 -state normal } set m [Message $w.error.msg \ -aspect 50000 \ -text [error_to_string $xml] \ -pady 2m] $m configure -foreground [option get $m errorForeground Message] pack $m } } } hook::add postload_hook \ [list disco::browser::register_feature_handler jabber:iq:register \ register::open \ -desc [list * [::msgcat::mc "Register"]]] # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/richtext.tcl000064400000000000000000000267421477701321300144220ustar00nobodynobody# richtext.tcl -- # # "Rich text" facility for Tk Text widgets -- allows to: # * Register parsers and renderers for particular patterns in plain # text messages -- "entities"; # * Parse plain text messages with registered parsers (in order of # their priorities); # * Render the resulting chunks of text with the appropriate renderers; # * Get back the original text from PRIMARY and CLIPBOARD selections # acquired from such Text widget. # # This scheme supports URL highlighting, emoticons and such. namespace eval richtext { variable registered variable entities variable state variable texts {} # free-form properties for processing of current message variable msgprops custom::defgroup {Rich Text} \ [::msgcat::mc "Settings of rich text facility which is used\ to render chat messages and logs."] \ -group Plugins } proc richtext::register_entity {type args} { variable registered variable entities lappend registered $type set entities($type,priority) 80 foreach {opt val} $args { switch -glob -- $opt { -configurator { set entities($type,configurator) $val } -parser { set entities($type,parser) $val } -reconstructor { set entities($type,reconstructor) $val } -renderer { set entities($type,renderer) $val } -parser-priority { set entities($type,priority) $val } default { return -code error "[namespace current]::register_entity:\ Unknown option $opt" } } } } proc richtext::unregister_entity {type} { variable registered variable entities lexclude registered $type array unset entities $type,* } proc richtext::entity_state {type {val ""}} { variable entities if {$val == ""} { set entities($type,enabled) } else { set entities($type,enabled) $val } } # Configures a text widget so that the "::richtext::render_message" proc # can be used on it. # Accepts an optional parameter "-using ?list_of_entities?"; when specified, # the text widget is configured to support only the specified entities, # otherwise it's configured to support all registered entities. If the list # is empty, this is *almost* a no-op: render_message can be called on such # widget, but it won't trigger any special processing of the passed text. # NOTE that currently this proc can be safely called only once per widget # since it essentially has a "constructor" semantics (though it requires # an already created text widget). proc richtext::config {w args} { variable registered variable entities variable state variable texts lappend texts $w # By default, configure for all registered entities: set using $registered # Parse options: foreach {opt val} $args { switch -- $opt { -using { set using $val } default { return -code error "[namespace current]::config:\ Unknown option: $opt" } } } # Run configurators for requested entities: foreach type $using { if {[info exists entities($type,configurator)]} { $entities($type,configurator) $w } } # Save enabled entities in the widget state, sorted by the # parsing priority: set state($w,types) [lsort -command compare_entity_prios $using] # Register a kind of "destructor" to clean up state: bind $w \ +[list [namespace current]::richtext_on_destroy [double% $w]] } # Cleans up state of richtext widgets: proc richtext::richtext_on_destroy {w} { variable state variable texts lexclude texts $w array unset state $w,* } proc richtext::textlist {} { variable texts return $texts } proc richtext::compare_entity_prios {a b} { variable entities expr {$entities($a,priority) - $entities($b,priority)} } # Configure a text widget to be ready for enriched text: proc richtext::richtext {args} { set w [eval Text $args] config $w install_selection_handlers $w $w configure -state disabled -font $::ChatFont } # TODO get rid of "deftag" proc richtext::render_message {w body deftag {nonewline ""}} { variable entities variable state variable msgprops # Parse the message text with rich text entity parsers: set chunks [list $body text $deftag] foreach type $state($w,types) { if {$entities($type,enabled) && [info exists entities($type,parser)]} { eval [linsert $entities($type,parser) end [info level] chunks] } } # Render the parsed pieces with entity renderers: foreach {piece type tags} $chunks { #puts "(draw) piece: $piece; type: $type; tags: $tags" if {![info exists entities($type,renderer)]} { # Fallback debugmsg richtext "Got piece with unknown type $type" set type text } $entities($type,renderer) $w $type $piece $tags } if {$nonewline != "-nonewline"} { $w insert end \n } # Get rid of the current message properties array unset msgprops * } proc richtext::fixup_tags {tags tgroups} { foreach t $tags { set thash($t) 0 } foreach tg $tgroups { glue_tags thash $tg } return [array names thash] } proc richtext::glue_tags {arrayName tags} { upvar 1 $arrayName thash foreach t $tags { if {![info exists thash($t)]} return } foreach t $tags { unset thash($t) } set t [join $tags _] set thash($t) 0 } # Selection handlers are "wrapped" by Tk so that they cannot fail # due to errors since they are silenced. # So this proc is kind of "error-enabled selection handler" -- it will # raise any error occured in the selection handler. proc richtext::chk_reconstruct_text {w first last} { if {[catch [list reconstruct_text $w $first $last] out]} { after idle [list error $out] return } else { return $out } } # Parses the contents of Text widget $w from $first to $last # and returns reconstructed "plain text". # It's main purpose is to return the "original" text that was # submitted to that Text widget and then undergone # "rich text" processing. proc richtext::reconstruct_text {w first last} { variable state #puts "in [info level 0]" if {[catch {$w dump -text -tag $first $last} dump]} { #puts "dump failed: $dump" return {} } set dump [concat {start {} {}} $dump {end {} {}}] #puts "ready to parse: $dump" foreach {what val where} $dump { #puts "what: $what; val: $val; where $where" switch -- $what { start { set out "" set in nowhere set chunk "" set tags {} set ignore false } tagon { if {[lsearch $state($w,types) $val] >= 0} { if {$in != "tag"} { write_chunk_out out chunk $tags } lappend tags $val set in tag } elseif {$val == "transient"} { set ignore true } } tagoff { if {[lsearch $state($w,types) $val] >= 0} { if {$in != "tag"} { write_chunk_out out chunk $tags } lexclude tags $val set in tag } elseif {$val == "transient"} { set ignore false } } text { if {$ignore} continue append chunk $val set in text } image { set chunk $val set in image } end { if {$ignore} continue if {$in != "tag"} { write_chunk_out out chunk $tags } } } } #puts "parsed sel: $out" return $out } proc richtext::write_chunk_out {outVar chunkVar t} { upvar 1 $outVar out $chunkVar chunk variable entities if {[string length $chunk] == 0} return if {[llength $t] > 1} { #puts stderr "chunk $chunk belongs to several rich text entities: $t" } if {[info exists entities($t,reconstructor)]} { append out [$entities($t,reconstructor) $t $chunk] } else { append out $chunk } set chunk "" } # Used to handle PRIMARY selection requests on "rich text" widgets proc richtext::get_selection {w off max} { return [string range \ [chk_reconstruct_text $w sel.first sel.last] \ $off [expr {$off + $max}]] } # Used to subvert tk_textCopy on "rich text" widgets proc richtext::text_copy {w} { set data [chk_reconstruct_text $w sel.first sel.last] clipboard clear -displayof $w clipboard append -displayof $w $data } # Used to subvert tk_textCut on "rich text" widgets proc richtext::text_cut {w} { set data [chk_reconstruct_text $w sel.first sel.last] clipboard clear -displayof $w clipboard append -displayof $w $data $w delete sel.first sel.last } # Installs selection handlers on a text widget. # 1) There's only need to support PRIMARY selection of type STRING # since all other types are only used in application-private protocols # (except UTF8_STRING, which is used by UTF-8-enabled software); # 2) Tk automagically handles UTF8_STRING if the handler for STRING # is installed; # 3) (2) is not exactly true, see Tk bug #1571737, we work around it here. proc richtext::install_selection_handlers {w} { # Handlers for PRIMARY selection: selection handle -type UTF8_STRING $w {} selection handle -type STRING $w \ [list [namespace current]::get_selection $w] # Handlers of CLIPBOARD selections # (subvert tk_textCopy and tk_textCut) bind $w <> [list [namespace current]::text_copy [double% $w]] bind $w <> [list [namespace current]::text_cut [double% $w]] } proc richtext::render_text {w type piece tags} { $w insert end $piece [fixup_tags $tags {{bold italic}}] } proc richtext::highlighttext {w tag color cursor} { $w configure -cursor $cursor $w tag configure $tag -foreground $color } # Message properties may be added before [::richtext::render_message] # is called and are intended to be used by rich text plugins whatever # they wish to use them. # Message properties are automatically killed when message rendering # process is over. # Assotiates "message property" $name and assigns value $val to it: proc richtext::property_add {name value} { variable msgprops if {[info exists msgprops($name)]} { return -code error "[namespace current]::property_add:\ Attempted to overwrite message property: $name" } set msgprops($name) $value } # Unlike _add, allows stomping on existing property value: proc richtext::property_update {name value} { variable msgprops set msgprops($name) $value } proc richtext::property_get {name} { variable msgprops set msgprops($name) } proc richtext::property_exists {name} { variable msgprops info exists msgprops($name) } # Register the most basic renderer for type "text": richtext::register_entity text -renderer richtext::render_text richtext::entity_state text 1 # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/roster.tcl000064400000000000000000000532331477701321300141010ustar00nobodynobody# roster.tcl -- # # This file is a part of the Tkabber XMPP client. It implements routines # working with rosters. package require xmpp::roster 0.2 package require xmpp::register namespace eval roster { variable undef_group_name [::msgcat::mc "Undefined"] variable chats_group_name [::msgcat::mc "Active Chats"] variable own_resources_group_name [::msgcat::mc "My Resources"] custom::defgroup Roster [::msgcat::mc "Roster options."] -group Tkabber custom::defvar cache_roster_offline 0 \ [::msgcat::mc "Cache roster items offline and use roster versioning\ if supported by a server."] \ -type boolean -group Roster \ custom::defvar offline_roster_cache {} "Offline cache for XEP-0237" \ -group Hidden } proc roster::process_item {xlib jid name groups subsc ask} { variable roster variable undef_group_name variable chats_group_name variable own_resources_group_name debugmsg roster "ROSTER_ITEM: $xlib; $jid; $name; $groups; $subsc; $ask" set jid [::xmpp::jid::normalize $jid] if {$subsc != "remove"} { if {$jid ni $roster(jids,$xlib)} { lappend roster(jids,$xlib) $jid } set groups [lsort -unique $groups] foreach group [list "" $undef_group_name $chats_group_name \ $own_resources_group_name] { set ind [lsearch -exact $groups $group] if {$ind >= 0} { set groups [lreplace $groups $ind $ind] } } set roster(group,$xlib,$jid) $groups set roster(name,$xlib,$jid) $name set roster(subsc,$xlib,$jid) $subsc set roster(ask,$xlib,$jid) $ask catch {unset roster(cached_category_and_subtype,$xlib,$jid)} get_category_and_subtype $xlib $jid } else { set idx [lsearch -exact $roster(jids,$xlib) $jid] set roster(jids,$xlib) [lreplace $roster(jids,$xlib) $idx $idx] catch {unset roster(group,$xlib,$jid)} catch {unset roster(name,$xlib,$jid)} catch {unset roster(subsc,$xlib,$jid)} catch {unset roster(ask,$xlib,$jid)} catch {unset roster(cached_category_and_subtype,$xlib,$jid)} } } hook::add roster_push_hook [namespace current]::roster::process_item proc client:roster_push {xlib njid args} { set jid $njid set name "" set subsc none set ask "" set groups {} foreach {key val} $args { switch -- $key { -jid {set jid $val} -name {set name $val} -subscription {set subsc $val} -ask {set ask $val} -groups {set groups $val} } } hook::run roster_push_hook $xlib $jid $name $groups $subsc $ask ::redraw_roster } proc client:roster_cmd {xlib status xml} { debugmsg roster "ROSTER_CMD: $status" if {[string equal $status ok]} { hook::run roster_end_hook $xlib ::redraw_roster } } proc roster::request_roster {xlib} { variable cache_roster_offline variable offline_roster_cache variable roster set args {} if {$cache_roster_offline} { debugmsg roster "We use the roster cache now..." array set tmp $offline_roster_cache set bjid [::xmpp::jid::normalize [connection_bare_jid $xlib]] if {[info exists tmp($bjid)]} { lassign $tmp($bjid) version cache set args [list -version $version -cache $cache] } } set roster(jids,$xlib) {} set roster(token,$xlib) \ [eval [list ::xmpp::roster::new $xlib \ -itemcommand [list client:roster_push $xlib]] $args] ::xmpp::roster::get $roster(token,$xlib) \ -command [list client:roster_cmd $xlib] } hook::add connected_hook [namespace current]::roster::request_roster 10 proc roster::clean {xlib} { variable cache_roster_offline variable offline_roster_cache variable roster if {[info exists roster(token,$xlib)]} { lassign [::xmpp::roster::free $roster(token,$xlib)] version cache if {$cache_roster_offline} { debugmsg roster "We caching the roster now..." array set tmp $offline_roster_cache set bjid [::xmpp::jid::normalize [connection_bare_jid $xlib]] set tmp($bjid) [list $version $cache] set offline_roster_cache [array get tmp] } } array unset roster token,$xlib array unset roster jids,$xlib array unset roster group,$xlib,* array unset roster name,$xlib,* array unset roster subsc,$xlib,* array unset roster ask,$xlib,* array unset roster subtype,$xlib,* array unset roster cached_category_and_subtype,$xlib,* array unset roster overridden_category_and_subtype,$xlib,* ::redraw_roster } hook::add disconnected_hook [namespace current]::roster::clean proc roster::get_group_jids {xlib group args} { variable roster variable undef_group_name if {![info exists roster(jids,$xlib)]} { return {} } set nested 0 set delim "::" foreach {opt val} $args { switch -- $opt { -nested { set nested $val } -delimiter { set delim $val } } } set jids {} if {$group eq $undef_group_name} { foreach jid $roster(jids,$xlib) { if {[llength [::roster::itemconfig $xlib $jid -group]] == 0} { lappend jids $jid } } } else { foreach jid $roster(jids,$xlib) { foreach jgroup [::roster::itemconfig $xlib $jid -group] { if {($nested && [string first "$group$delim" "$jgroup$delim"] == 0) || $group eq $jgroup} { lappend jids $jid break } } } } return $jids } proc roster::get_jids {xlib} { variable roster if {[info exists roster(jids,$xlib)]} { return [lsort -dictionary $roster(jids,$xlib)] } else { return {} } } proc roster::get_groups {xlib args} { variable roster variable undef_group_name if {![info exists roster(jids,$xlib)]} { return {} } set nested 0 set delimiter "::" set undefined 0 set groups {} foreach {opt val} $args { switch -- $opt { -nested { set nested $val } -delimiter { set delimiter $val } -raw { if {$val} { foreach jid $roster(jids,$xlib) { set groups [concat $groups $roster(group,$xlib,$jid)] } return [lsort -unique $groups] } } -undefined { set undefined $val } } } set empty 0 foreach jid $roster(jids,$xlib) { set jid_groups [::roster::itemconfig $xlib $jid -group] if {[llength $jid_groups] > 0} { foreach group $jid_groups { if {$nested} { set sgroup [msplit $group $delimiter] } else { set sgroup [list $group] } set deep [llength $sgroup] for {set i 0} {$i < $deep} {incr i} { set sgr [lrange $sgroup 0 $i] lappend groups [join $sgr "\u0000"] } } } else { set empty 1 } } set res {} foreach sgroup [lsort -unique -dictionary $groups] { lappend res [join [split $sgroup "\u0000"] $delimiter] } if {$empty && $undefined} { lappend res $undef_group_name } return $res } proc roster::itemconfig {xlib jid args} { variable roster if {[llength $args] == 1} { lassign $args attr switch -- $attr { -group {set param group} -name {set param name} -subsc {set param subsc} -ask {set param ask} -category { return [lindex [get_category_and_subtype $xlib $jid] 0] } -subtype { return [lindex [get_category_and_subtype $xlib $jid] 1] } -isuser { return [string equal \ [lindex [get_category_and_subtype $xlib $jid] 0] \ user] } default { return -code error "Bad option \"$attr\":\ must be one of: -group, -name, -subsc, -ask,\ -category, -subtype or -isuser" } } if {[info exists roster($param,$xlib,$jid)]} { return $roster($param,$xlib,$jid) } else { return "" } } else { foreach {attr val} $args { switch -- $attr { -group {set param group} -name {set param name} -subsc {set param subsc} -ask {set param ask} -category { override_category $xlib $jid $val continue } -subtype { override_subtype $xlib $jid $val continue } default {return -code error "Illegal option"} } set roster($param,$xlib,$jid) $val } } } # Returns true if $jid is allowed to receive our presence information, # false otherwise. proc roster::is_trusted {xlib jid} { set rjid [find_jid $xlib $jid] if {$rjid == ""} { return 0 } set subsc [itemconfig $xlib $rjid -subsc] if {[::xmpp::jid::removeResource $jid] == [connection_bare_jid $xlib]} { return 1 } elseif {$subsc == "both" || $subsc == "from"} { return 1 } else { return 0 } } proc roster::on_change_jid_presence {xlib jid type x args} { variable roster switch -- $type { error - unavailable - available {} default { return } } set rjid [find_jid $xlib $jid] debugmsg roster "$jid $rjid" if {$rjid != ""} { lassign [get_category_and_subtype $xlib $rjid] category subtype if {$category == "user"} { set status [get_user_status $xlib $rjid] set label [get_label $xlib $rjid] if {![catch {set desc [::get_long_status_desc $status]}]} { set_status [format "%s $desc" $label] } hook::run on_change_user_presence_hook $label $status } } ::redraw_roster } hook::add client_presence_hook roster::on_change_jid_presence 60 proc roster::find_jid {xlib jid} { variable roster if {![info exists roster(jids,$xlib)]} { return "" } if {$jid in $roster(jids,$xlib)} { return $jid } lassign [get_category_and_subtype $xlib $jid] category subtype if {$category eq "user"} { set rjid [::xmpp::jid::removeResource $jid] if {$rjid in $roster(jids,$xlib)} { lassign [get_category_and_subtype $xlib $rjid] rcategory rsubtype switch -- $rcategory { user - conference { return $rjid } default { return "" } } } } return "" } proc roster::get_label {xlib jid} { set name [itemconfig $xlib $jid -name] if {[string equal $name ""]} { return $jid } else { return $name } } proc roster::override_category_and_subtype {xlib jid category subtype} { variable roster set roster(overridden_category_and_subtype,$xlib,$jid) \ [list $category $subtype] } proc roster::override_category {xlib jid category} { variable roster if {![info exists roster(overridden_category_and_subtype,$xlib,$jid)]} { lassign [get_category_and_subtype $xlib $jid] category1 subtype set roster(overridden_category_and_subtype,$xlib,$jid) \ [list $category $subtype] } else { set roster(overridden_category_and_subtype,$xlib,$jid) \ [list $category \ [lindex \ $roster(overridden_category_and_subtype,$xlib,$jid) 1]] } } proc roster::override_subtype {xlib jid subtype} { variable roster if {![info exists roster(overridden_category_and_subtype,$xlib,$jid)]} { lassign [get_category_and_subtype $xlib $jid] category subtype1 set roster(overridden_category_and_subtype,$xlib,$jid) \ [list $category $subtype] } else { set roster(overridden_category_and_subtype,$xlib,$jid) \ [list [lindex \ $roster(overridden_category_and_subtype,$xlib,$jid) 0] \ $subtype] } } proc roster::get_category_and_subtype {xlib jid} { variable roster if {[info exists roster(overridden_category_and_subtype,$xlib,$jid)]} { return $roster(overridden_category_and_subtype,$xlib,$jid) } set server [::xmpp::jid::server $jid] if {[info exists roster(overridden_category_and_subtype,$xlib,$server)]} { catch { unset roster(cached_category_and_subtype,$xlib,$jid) } set cs [heuristically_get_category_and_subtype $xlib $jid] set roster(overridden_category_and_subtype,$xlib,$jid) $cs return $cs } if {[info exists roster(cached_category_and_subtype,$xlib,$jid)]} { return $roster(cached_category_and_subtype,$xlib,$jid) } catch {plugins::cache_categories::request_category_and_subtype $xlib $jid} set cs [heuristically_get_category_and_subtype $xlib $jid] set roster(cached_category_and_subtype,$xlib,$jid) $cs return $cs } proc roster::heuristically_get_category_and_subtype {xlib jid} { variable roster ::xmpp::jid::split $jid node server resource if {$node == "" && $resource == ""} { set updomain [lindex [split $server .] 0] set category service switch -- $updomain { aim - conference - icq - irc - jabber - jud - msn - mrim - pager - rss - serverlist - sms - smtp - yahoo { set subtype $updomain } gg { set subtype gadu-gadu } pogoda - weather { set subtype x-weather } default { set subtype "" } } return [list $category $subtype] } if {$node == ""} { return [get_category_and_subtype $xlib $server] } if {[::xmpp::jid::resource $jid] == ""} { lassign [get_category_and_subtype $xlib $server] scategory ssubtype switch -glob -- $scategory/$ssubtype { conference/irc { if {[string first "%" $node] >= 0} { set category conference set subtype irc } else { set category user set subtype "" } } conference/* { set category conference set subtype "" } default { set category user set subtype "" } } return [list $category $subtype] } return {user client} } ############################################################################### proc roster::item_to_xml {xlib jid} { variable roster variable undef_group_name variable chats_group_name variable own_resources_group_name set grtags {} foreach group $roster(group,$xlib,$jid) { if {$group ne "" && \ $group ne $undef_group_name && \ $group ne $chats_group_name && \ $group ne $own_resources_group_name} { lappend grtags [::xmpp::xml::create group -cdata $group] } } set vars [list jid $jid] if {$roster(name,$xlib,$jid) != ""} { lappend vars name $roster(name,$xlib,$jid) } return [::xmpp::xml::create item -attrs $vars -subelements $grtags] } proc roster::item_to_options {xlib jid} { variable roster variable undef_group_name variable chats_group_name variable own_resources_group_name set groups {} foreach group $roster(group,$xlib,$jid) { if {$group ne "" && \ $group ne $undef_group_name && \ $group ne $chats_group_name && \ $group ne $own_resources_group_name} { lappend groups $group } } set opts [list -jid $jid] if {$roster(name,$xlib,$jid) != ""} { lappend opts -name $roster(name,$xlib,$jid) } lappend opts -groups $groups return $opts } ############################################################################### proc roster::send_item {xlib jid} { hook::run roster_send_item_hook $xlib $jid } proc roster::send_item_fallback {xlib jid} { variable roster ::xmpp::roster::send $roster(token,$xlib) {*}[item_to_options $xlib $jid] } hook::add roster_send_item_hook roster::send_item_fallback 100 ############################################################################### proc roster::remove_item {xlib jid} { hook::run roster_remove_item_hook $xlib $jid } proc roster::remove_item_fallback {xlib jid} { variable roster ::xmpp::roster::send $roster(token,$xlib) -jid $jid -subscription remove ::xmpp::sendPresence $xlib -to $jid -type unsubscribe ::xmpp::sendPresence $xlib -to $jid -type unsubscribed lassign [get_category_and_subtype $xlib $jid] category subtype if {(($category == "service") || \ ($category == "server") || \ ($category == "gateway")) && \ [string compare -nocase [::xmpp::jid::removeResource $jid] \ [connection_server $xlib]]} { ::xmpp::register::remove $xlib $jid } } hook::add roster_remove_item_hook roster::remove_item_fallback 100 ############################################################################### proc roster::send_rename_group {xlib name new_name} { variable roster variable undef_group_name if {[string equal $new_name $name]} return hook::run roster_rename_group_hook $xlib $name $new_name set items {} foreach jid $roster(jids,$xlib) { switch -- [itemconfig $xlib $jid -subsc] { none - from - to - both { } default { continue } } if {$name in $roster(group,$xlib,$jid) || \ ($name == $undef_group_name && \ $roster(group,$xlib,$jid) == {})} { set idx [lsearch -exact $roster(group,$xlib,$jid) $name] if {$new_name != ""} { set roster(group,$xlib,$jid) \ [lreplace $roster(group,$xlib,$jid) $idx $idx $new_name] } else { set roster(group,$xlib,$jid) \ [lreplace $roster(group,$xlib,$jid) $idx $idx] } set roster(group,$xlib,$jid) \ [lsort -unique $roster(group,$xlib,$jid)] lappend items [item_to_options $xlib $jid] } } foreach item $items { ::xmpp::roster::send $roster(token,$xlib) {*}$item } } ############################################################################### proc roster::send_remove_users_group {xlib name} { variable roster variable undef_group_name hook::run roster_remove_users_group_hook $xlib $name foreach jid $roster(jids,$xlib) { switch -- [itemconfig $xlib $jid -subsc] { none - from - to - both { } default { continue } } set groups $roster(group,$xlib,$jid) if {$name in $groups || \ (($name == $undef_group_name) && ($groups == {}))} { remove_item $xlib $jid } } } ############################################################################### proc roster::resubscribe_group {xlib name} { variable roster variable undef_group_name foreach jid $roster(jids,$xlib) { if {$name in $roster(group,$xlib,$jid) || \ ($name == $undef_group_name && \ $roster(group,$xlib,$jid) == {})} { lassign [get_category_and_subtype $xlib $jid] category type if {$category == "user"} { ::xmpp::sendPresence $xlib -to $jid -type subscribe } } } } ############################################################################### proc roster::send_custom_presence_group {xlib name status} { variable roster variable undef_group_name foreach jid $roster(jids,$xlib) { if {$name in $roster(group,$xlib,$jid) || \ ($name == $undef_group_name && \ $roster(group,$xlib,$jid) == {})} { lassign [get_category_and_subtype $xlib $jid] category type if {$category == "user"} { send_custom_presence $xlib $jid $status } } } } ############################################################################### proc roster::add_group_by_jid_regexp {name regexp} { variable roster # TODO: xlib if {$name == ""} return foreach xlib [connections] { set items {} foreach jid $roster(jids,$xlib) { if {[regexp -- $regexp $jid]} { lappend roster(group,$xlib,$jid) $name set roster(group,$xlib,$jid) \ [lsort -unique $roster(group,$xlib,$jid)] lappend items [item_to_options $xlib $jid] } } foreach item $items { ::xmpp::roster::send $roster(token,$xlib) {*}$item } } } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/search.tcl000064400000000000000000000273651477701321300140370ustar00nobodynobody# search.tcl -- # # This file is a part of the Tkabber XMPP client. It implements user # interface part for the Jabber Search protocol (XEP-0055). package require xmpp::search namespace eval search { variable show_all 0 create_image search/sort/upArrow -data { R0lGODlhDgAOAJEAANnZ2YCAgPz8/P///yH5BAEAAAAALAAAAAAOAA4AAAImhI+ py+1LIsJHiBAh+BgmiEAJQITgW6DgUQIAECH4JN8IPqYuNxUAOw==} create_image search/sort/downArrow -data { R0lGODlhDgAOAJEAANnZ2YCAgPz8/P///yH5BAEAAAAALAAAAAAOAA4AAAInhI+ py+1I4ocQ/IgDEYIPgYJICUCE4F+YIBolEoKPEJKZmVJK6ZACADs=} create_image search/sort/noArrow -height 14 -width 14 } proc search::open {xlib jid args} { variable winid if {![info exists winid]} { set winid 0 } set sw .search[incr winid] Toplevel $sw -cursor watch wm group $sw . set title [::msgcat::mc "Search in %s" $jid] wm title $sw $title wm iconname $sw $title wm transient $sw . if {$::tcl_platform(platform) == "macintosh"} { catch { unsupported1 style $sw floating sideTitlebar } } elseif {$::aquaP} { ::tk::unsupported::MacWindowStyle style $sw floating {closeBox} } wm resizable $sw 0 0 wm withdraw $sw ButtonBox $sw.bbox -spacing 0 -padx 2m -default 0 $sw.bbox add -text [::msgcat::mc "OK"] \ -command [namespace code [list Search $sw $xlib $jid false]] \ -state disabled $sw.bbox add -text [::msgcat::mc "Cancel"] \ -command [list destroy $sw] pack $sw.bbox -padx 2m -pady 2m -anchor e -side bottom bind $sw [list ButtonBox::invoke [double% $sw.bbox] default] bind $sw [list ButtonBox::invoke [double% $sw.bbox] 1] Frame $sw.fields -class Search pack $sw.fields -expand yes -fill both -anchor nw -padx 2m -pady 2m bind $sw.fields [list data::cleanup %W] ::xmpp::search::request $xlib $jid \ -command [namespace code [list RecvFields $sw $xlib $jid]] } proc search::RecvFields {sw xlib jid status fields args} { debugmsg search "$status $fields" if {![string equal $status ok]} { destroy $sw MessageDlg ${sw}err -aspect 50000 \ -icon error \ -message [::msgcat::mc "Search: %s" \ [error_to_string $fields]] \ -type user \ -buttons ok \ -default 0 \ -cancel 0 return } foreach {key val} $args { switch -- $key { -old { $sw.bbox itemconfigure 0 \ -command [namespace code [list Search $sw $xlib \ $jid $val]] } } } set focus [data::fill_fields_x $sw.fields $fields] $sw configure -cursor {} $sw.bbox itemconfigure 0 -state normal if {$focus != ""} { focus $focus } update idletasks BWidget::place $sw 0 0 center wm deiconify $sw } proc search::Search {sw xlib jid old} { variable data $sw configure -cursor watch $sw.bbox itemconfigure 0 -state disabled set resfields [data::get_fields $sw.fields] ::xmpp::search::submit $xlib $jid $resfields \ -command [namespace code [list RecvItems $sw $xlib $jid $old]] \ -old $old } proc search::RecvItems {sw xlib jid old status items} { debugmsg search "$status $items" if {![winfo exists $sw]} { return } if {![string equal $status ok]} { $sw configure -cursor {} $sw.bbox itemconfigure 0 -text [::msgcat::mc "Try again"] \ -command [namespace code [list SearchAgain "" $sw $jid $xlib \ $old errormsg]] \ -state normal $sw.bbox itemconfigure 1 -text [::msgcat::mc "Close"] if {[winfo exists $sw.errormsg]} { destroy $sw.errormsg } Message $sw.errormsg -aspect 50000 \ -text [::msgcat::mc "An error occurred when searching\ in %s\n\n%s" \ $jid [error_to_string $items]] pack $sw.errormsg -expand yes -fill both -after $sw.fields \ -anchor nw -padx 1c -pady 1c pack forget $sw.fields return } wm withdraw $sw set rw [Toplevel ${sw}results] wm group $rw . set title [::msgcat::mc "Search in %s" $jid] wm title $rw $title wm iconname $rw $title wm withdraw $rw ButtonBox $rw.bbox -spacing 0 -padx 2m -default 0 $rw.bbox add -text [::msgcat::mc "Search again"] \ -command [namespace code [list SearchAgain $rw $sw $jid \ $xlib $old]] $rw.bbox add -text [::msgcat::mc "Close"] \ -command "destroy [list $rw] destroy [list $sw]" pack $rw.bbox -padx 2m -pady 2m -anchor e -side bottom bind $rw [list ButtonBox::invoke [double% $rw.bbox] default] bind $rw [list ButtonBox::invoke [double% $rw.bbox] 1] set sww [ScrolledWindow $rw.items] set l $sww.listbox ::mclistbox::mclistbox $l \ -width 90 \ -height 16 pack $sww -expand yes -fill both -anchor nw -padx 2m -pady 2m $sww setwidget $l bind $l <> \ [namespace code [list SelectAndPopupMenu [double% $xlib] \ [double% $l] %x %y]] bindscroll $sww $l set rows [FillMclistbox $rw $jid $l $items] if {$rows <= 0} { pack forget $sww Message $rw.errormsg -aspect 50000 \ -text [::msgcat::mc "Search in %s: No matching items found" $jid] pack $rw.errormsg -expand yes -fill both -anchor nw -padx 1c -pady 1c } elseif {$rows <= 12} { $l configure -height [expr {$rows - ($rows % 4) + 4}] } BWidget::place $rw 0 0 center wm deiconify $rw } proc search::FillMclistbox {sw jid w items} { variable show_all set width(0) [expr {[string length [::msgcat::mc #]] + 3}] set name(0) N $w column add N -label [::msgcat::mc #] -width $width(0) set row 0 set col 1 foreach {tag item} $items { switch -- $tag { title { if {$item != ""} { wm title $sw $item wm iconname $sw $item } } reported { set reported {} foreach {var label} $item { lappend reported $var set label_name($var) $label } } } } foreach {tag item} $items { switch -- $tag { item { foreach {var values} $item { foreach value $values { if {![string equal $value ""]} { if {$show_all || ![info exists reported] || \ $var in $reported} { if {![info exists fieldcol($var)]} { set fieldcol($var) $col if {[info exists label_name($var)]} { set l $label_name($var) } else { set l $var } set width($col) \ [expr {[string length $l] + 5}] set name($col) $var $w column add $var \ -label $l \ -width $width($col) \ -image search/sort/noArrow \ -command \ [namespace code [list Sort \ $w $var]] set lasttag $var incr col } set data($fieldcol($var),$row) $value debugmsg search "$var $value" } } } } set data(0,$row) [expr {$row + 1}] incr row } } } FinalizeMclistbox $w $row $col name data width } proc search::FinalizeMclistbox {w row col n d wi} { upvar $n name upvar $d data upvar $wi width $w column add lastcol -label "" -width 0 $w configure -fillcolumn lastcol for {set j 0} {$j < $row} {incr j} { set datalist {} for {set i 0} {$i < $col} {incr i} { if {[info exists data($i,$j)]} { set wd [string length $data($i,$j)] if {$wd > $width($i)} { set width($i) $wd } lappend datalist $data($i,$j) } else { lappend datalist "" } } lappend datalist "" $w insert end $datalist } for {set i 0} {$i < $col} {incr i} { $w column configure $name($i) -width [expr {$width($i) + 2}] } return $row } proc search::Sort {l tag} { set image [$l column cget $tag -image] if {$image eq ""} return set data [$l get 0 end] set index [lsearch -exact [$l column names] $tag] if {$image eq "search/sort/downArrow"} { set result [lsort -decreasing -dictionary -index $index $data] $l column configure $tag -image search/sort/upArrow } else { set result [lsort -dictionary -index $index $data] $l column configure $tag -image search/sort/downArrow } foreach t [$l column names] { if {$t ne $tag && [$l column cget $t -image] ne ""} { $l column configure $t -image search/sort/noArrow } } set i 0 foreach row $result { lset result $i 0 [incr i] } $l delete 0 end eval $l insert end $result } proc search::SearchAgain {rw sw jid xlib old {delwidget ""}} { catch {destroy $rw} $sw configure -cursor {} if {![string equal $delwidget ""]} { pack $sw.fields -expand yes -fill both -after $sw.$delwidget \ -anchor nw -padx 2m -pady 2m pack forget $sw.$delwidget $sw.bbox itemconfigure 0 -text [::msgcat::mc "OK"] \ -command [namespace code [list Search $sw $xlib $jid $old]] \ -state normal $sw.bbox itemconfigure 1 -text [::msgcat::mc "Cancel"] } else { $sw.bbox itemconfigure 0 -state normal wm deiconify $sw } } proc search::SelectAndPopupMenu {xlib w x y} { set index [$w find $x $y] if {$index < 0} return $w sel clear 0 end $w sel set $index set col [lsearch -exact [$w column names] jid] if {$col < 0} return set jid [lindex [$w get $index] $col] if {[winfo exists [set m .searchpopupmenu]]} { destroy $m } menu $m -tearoff 0 hook::run search_popup_menu_hook $m $xlib $jid tk_popup $m [winfo pointerx .] [winfo pointery .] } proc search::AddSeparator {m xlib jid} { $m add separator } hook::add search_popup_menu_hook \ [namespace current]::search::AddSeparator 40 hook::add search_popup_menu_hook \ [namespace current]::search::AddSeparator 50 hook::add postload_hook \ [list disco::browser::register_feature_handler jabber:iq:search \ [namespace current]::search::open \ -desc [list * [::msgcat::mc "Search"]]] # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/si.tcl000064400000000000000000000306001477701321300131670ustar00nobodynobody# si.tcl -- # # Stream Initiation (XEP-0095) implementation namespace eval si { variable transport set transport(list) {} } set ::NS(si) http://jabber.org/protocol/si ############################################################################### ############################################################################### proc si::newout {xlib jid} { variable streams set id [rand 1000000000] while {[info exists streams(out,$xlib,$jid,$id)]} { set id [rand 1000000000] } set streamid 0 set stream [namespace current]::0 while {[info exists $stream]} { set stream [namespace current]::[incr streamid] } upvar #0 $stream state set state(xlib) $xlib set state(jid) $jid set state(id) $id set streams(out,$xlib,$jid,$id) $stream return $stream } proc si::freeout {stream} { variable streams upvar #0 $stream state catch { set xlib $state(xlib) set jid $state(jid) set id $state(id) unset state unset streams(out,$xlib,$jid,$id) } } ############################################################################### proc si::newin {xlib jid id} { variable streams if {[info exists streams(in,$xlib,$jid,$id)]} { return -code error } set streamid 0 set stream [namespace current]::0 while {[info exists $stream]} { set stream [namespace current]::[incr streamid] } upvar #0 $stream state set state(xlib) $xlib set state(jid) $jid set state(id) $id set streams(in,$xlib,$jid,$id) $stream return $stream } proc si::in {xlib jid id} { variable streams return $streams(in,$xlib,$jid,$id) } proc si::freein {stream} { variable streams upvar #0 $stream state catch { set xlib $state(xlib) set jid $state(jid) set id $state(id) unset state unset streams(in,$xlib,$jid,$id) } } ############################################################################### ############################################################################### proc si::connect {stream chunk_size mimetype profile profile_el command} { variable transport upvar #0 $stream state set trans [lsort -unique -index 1 $transport(list)] set options {} foreach t $trans { set name [lindex $t 0] if {![info exists transport(allowed,$name)] || \ $transport(allowed,$name)} { lappend options "" $transport(oppos,$name) } } set fields [::xmpp::data::formField field \ -var stream-method \ -type list-single \ -options $options] set feature \ [::xmpp::xml::create feature \ -xmlns http://jabber.org/protocol/feature-neg \ -subelement [::xmpp::data::form $fields]] set_status [::msgcat::mc "Opening SI connection"] ::xmpp::sendIQ $state(xlib) set \ -query [::xmpp::xml::create si \ -xmlns $::NS(si) \ -attrs [list id $state(id) \ mime-type $mimetype \ profile $profile] \ -subelement $profile_el \ -subelement $feature] \ -to $state(jid) \ -command [list si::connect_response $stream $chunk_size \ $profile $command] } ############################################################################### proc si::connect_response {stream chunk_size profile command status xml} { variable transport upvar #0 $stream state if {![info exists state(id)]} { # TODO: It would be good to send some error message to a receiver # (but it is not supported by the protocol). uplevel #0 $command \ [list [list 0 [::msgcat::mc "File transfer aborted"]]] return } if {$status != "ok"} { uplevel #0 $command [list [list 0 [error_to_string $xml]]] return } ::xmpp::xml::split $xml tag xmlns attrs cdata subels set trans [lsort -unique -index 1 $transport(list)] set options {} foreach t $trans { set name [lindex $t 0] if {![info exists transport(allowed,$name)] || \ $transport(allowed,$name)} { lappend options $transport(oppos,$name) } } set opts {} foreach item $subels { ::xmpp::xml::split $item stag sxmlns sattrs scdata ssubels if {[string equal $sxmlns $profile]} { # TODO } elseif {[string equal $sxmlns \ http://jabber.org/protocol/feature-neg]} { set opts [parse_negotiation_res $item] } } if {[llength $opts] == 1 && [lindex $opts 0] in $options} { set name [lindex $opts 0] set state(transport) $name eval $transport(connect,$name) [list $stream $chunk_size $command] return } uplevel #0 $command \ [list [list 0 [::msgcat::mc "Stream method negotiation failed"]]] } ############################################################################### proc si::send_data {stream data command} { variable transport upvar #0 $stream state eval $transport(send,$state(transport)) [list $stream $data $command] } ############################################################################### proc si::close {stream} { variable transport upvar #0 $stream state eval $transport(close,$state(transport)) [list $stream] set_status [::msgcat::mc "SI connection closed"] } ############################################################################### ############################################################################### proc si::set_readable_handler {stream handler} { upvar #0 $stream state set state(readable_handler) $handler } proc si::set_closed_handler {stream handler} { upvar #0 $stream state set state(closed_handler) $handler } ############################################################################### proc si::recv_data {stream data} { upvar #0 $stream state debugmsg si "RECV_DATA [list $state(id) $data]" append state(data) $data eval $state(readable_handler) [list $stream] } ############################################################################### proc si::read_data {stream} { upvar #0 $stream state set data $state(data) set state(data) {} return $data } ############################################################################### proc si::closed {stream} { upvar #0 $stream state if {[info exists state(closed_handler)]} { eval $state(closed_handler) [list $stream] } } ############################################################################### proc si::parse_negotiation {xml} { ::xmpp::xml::split $xml tag xmlns attrs cdata subels lassign [::xmpp::data::findForm $subels] type form set fields [::xmpp::data::parseForm $form] foreach {tag field} $fields { switch -- $tag { field { lassign $field \ var type label desc required options values media if {[string equal $var stream-method]} { set soptions {} foreach {olabel ovalue} $options { lappend soptions $ovalue } return $soptions } } } } return {} } proc si::parse_negotiation_res {xml} { ::xmpp::xml::split $xml tag xmlns attrs cdata subels lassign [::xmpp::data::findForm $subels] type form set fields [::xmpp::data::parseSubmit $form] foreach {tag field} $fields { switch -- $tag { field { lassign $field var type label values if {[string equal $var stream-method]} { return $values } } } } return {} } ############################################################################### proc si::set_handler {xlib from xml args} { variable profiledata variable transport ::xmpp::xml::split $xml tag xmlns attrs cdata subels set iqid [::xmpp::xml::getAttr $args -id] set id [::xmpp::xml::getAttr $attrs id] set mimetype [::xmpp::xml::getAttr $attrs mime-type] set profile [::xmpp::xml::getAttr $attrs profile] set stream {} set profile_res {} set lang [::xmpp::xml::getAttr $args -lang en] if {[info exists profiledata($profile)]} { foreach item $subels { ::xmpp::xml::split $item stag sxmlns sattrs scdata ssubels if {[string equal $sxmlns $profile]} { return [$profiledata($profile) \ $xlib $from $lang $id $mimetype $item \ [namespace code [list set_handler_cont $xlib \ $from $iqid $lang $id \ $subels]]] } } } else { # bad-profile return [list error modify bad-request] } } proc si::set_handler_cont {xlib from iqid lang id subels status xml} { variable transport if {$status == "error"} { ::xmpp::sendIQ $xlib error \ -error $xml \ -to $from \ -id $iqid return } foreach item $subels { ::xmpp::xml::split $item tag xmlns attrs cdata subels if {[string equal $xmlns http://jabber.org/protocol/feature-neg]} { set options [parse_negotiation $item] set trans [lsort -unique -index 1 $transport(list)] set myoptions {} foreach t $trans { set name [lindex $t 0] if {![info exists transport(allowed,$name)] || \ $transport(allowed,$name)} { lappend myoptions $transport(oppos,$name) } } foreach opt $options { if {$opt in $myoptions} { set stream $opt break } } } } if {![info exists stream]} { ::xmpp::sendIQ $xlib error \ -error [::xmpp::stanzaerror::error modify bad-request] \ -to $from \ -id $iqid return } set res_elements {} if {$xml != {}} { lappend res_elements $xml } set fields [list stream-method [list $opt]] lappend res_elements \ [::xmpp::xml::create feature \ -xmlns http://jabber.org/protocol/feature-neg \ -subelement [::xmpp::data::submitForm $fields]] set res [::xmpp::xml::create si \ -xmlns $::NS(si) \ -subelements $res_elements] ::xmpp::sendIQ $xlib result \ -query $res \ -to $from \ -id $iqid } ::xmpp::iq::register set * $::NS(si) si::set_handler ############################################################################### ############################################################################### proc si::register_transport {name oppos prio default connect send close} { variable transport lappend transport(list) [list $name $prio] set transport(oppos,$name) $oppos set transport(connect,$name) $connect set transport(send,$name) $send set transport(close,$name) $close if {$default == "enabled"} { set transport(default,$name) 1 } else { set transport(default,$name) 0 } } ############################################################################### proc si::register_profile {profile handler} { variable profiledata set profiledata($profile) $handler } ############################################################################### proc si::setup_customize {} { variable transport set trans [lsort -unique -index 1 $transport(list)] foreach t $trans { lassign $t name prio custom::defvar transport(allowed,$name) $transport(default,$name) \ [::msgcat::mc "Enable SI transport %s." $name] \ -type boolean -group {Stream Initiation} } } hook::add postload_hook si::setup_customize ############################################################################### namespace eval si { plugins::load [file join plugins si] -uplevel 1 } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/sounds000075500000000000000000000000001477701321300133055ustar00nobodynobodytkabber/sounds/default000075500000000000000000000000001477701321300147315ustar00nobodynobodytkabber/sounds/default/chat_my_message.wav000064400000000000000000000110141477701321300206540ustar00nobodynobodyRIFFWAVEfmt +"Vdataà ÿÐÿÊ„ñÿ1Và†ÿµÿ5óäœòþ†ýŸ™Ëø[æ¶û$ øDù ˆ_Ê*ô>üV íßþÚ˜ç¢âí ¼ñÎð3hûZäÿ=ö!ê`!âûêöàÒ÷¦áì¨ùÐçú8ùþ „ÜèÞù«º¦þvû|ïÔø~÷è"ó ž6zj÷ÊjÀÿ6|2ë@ù¬ùÄíèû¼*ýJ‹ Ìú©ùVÿ‚ȆBWüÂëêïØNý¦ùÜÿ*ÿÄúâ=+ ~s4ÌÔïÎêÌöÚû>òʸø¢þü6 œJÿpú÷Xý⢽ú€ù¬øiù¯å 3 ’£Ð÷F÷ü4ü(û þúýÒúîPˆûÀ ÅJ êû|÷œû¸ù¿úpÌTûþ þ•ûDž¶Zþ" ÿüéýnüÎöqöÎù’ø=ý¼ ÈØ ØÎÿþ¬ý•ú~ü$þÊøŒøbýlûBü¼¶•6­ÿ@FþÔÿº8xüBû¼øþ÷ÝüAuÞüP‚ç:ìZTüµúúúÃö ø$º2ÔiÔÐÕ‚ý6ÿ‡Àþ„ÿòÿÍýÚûhü¦üÖýêìÿšÔÀB:þÚþ;ûÄöÜøJúû"ÿ’gš¦¸õJ˜’XýôúÐø€øúúþúW%â²<–3ÀýÔùÚû›ûyú&þÒÿMýžþÈTètˆ¼ ÿßùkùúÕù`þð«•žÿÝrø“ÿ<üšý"ÿHýNý]r¬ý4þþHüj¾)j_ý]ÿàüúLýðû|ùãýtXþ"8žœÎÜý þˆü¶ú°ýèÿnýQýçþšý þàbðÎ<Mº|þŒý¶þ ýrûüû%û*ûæþÒh°ý*Àãþ:ý÷ý ü’ú±üýËý?$8Þ¤ÿ§ÿÿþîÿ„6ÿÿVÿ>þëüçüvýŒþÛÿ‚¢Äéê‚@€ÿÀþrþíüÐûøüTýæýîÿy†Ð­¤ ‚8ÿ˜ÿXÿðý©ý¼ýLþ<ÿðþ[þŒÿ³)ÞË §vþJýÜýÿ¦þàÿd'‡°ª­ÿãÎÒFKþÿrÿÐÿ¼þ ¦ñîõ´ù>z Ü€ö,ô0ÿ2^ùîè¼vçÿÛþSþ&ù¼×üføG6Z i¬÷Äü6tÿ€ü»ø4ö¢| Ô¾ÿ}ðxû®sý öùf÷ê÷ K oGÿâ¸î húðùûý2Ì^Jÿ>Dý~þF\$øðø w*H{xýûpýbûdúgýIÂN°|4~ÿÓìîj$ 8ÿ:ÿFh ^ÿìýPÿú¸´ý„ó\ù!P“2tÔ¥þ@ûŸ÷.ø.N ŠPû û™þc „ æþZö'ýš¦ÿûÔû¯~Ènýúòü+† *h¼þsg^¼ü¬÷øþΆÿFþa ¹ ð4ÿ¾üþþ<ýúÒø&úlý&DtõûP¬…~üúð|ÿ ò°õdüú Æ:ù¨œ÷žvÚNú õ^^ù‚úþþ¾ b÷ZrÈgÿ1öPþvÚýÎùÝû øÉšüËÿ2Lÿ4Vû¦ýÎÿ„ýHÜÊBÿWý¼Ê°8þ“úîõþµ÷Fùòˆ%ý€ûÔ÷Ûè¢I,ðú0üúJû,û ĤÓÐØ.ÇBù"ùüÐÃû¡øzýÊúÕ„Ö|†Ìýìû!ýàû³û<ÿJº^º ò¢ÿ\þ:(pýÚúV@ÿ®ú¯ý:`j‘¸„þ¤üÎýþ`ü|ý¥ôL’®nñ\þëúˆüpý&ý~üÅü¯xýïãÓ¬þ+üŽúÞû×ü˜ýoj¨{¬¨C@ÿ×üjü–ýßþÿ}þ”ÿô)RÒˆÿi¶4ÿÜý©ÿbÿòýÄÿÖÿ2ÿÿ |ê¶407nþ?þ!ýnûürýyÿ©¢¶´ ˜gDúûNúLý¾ý^ýÿrÎðF¦þ‚üôþ/ÿ,üÑý>:Þ˜ðjÿþÄþJþøýòþ½ÿþDÓ,³XpËÿ‹þTÿŠ"ÿBghÿÚÿHèÊ_Qfÿþkþwý¦ýÿo¢< þ`ÿ¶ýÐü\ü ü]üVý|(2XÖ>0ÿ¥ÿ"þòû¥ü®þWÿØÿÆhJn6.ÿ ý ðMýVþNŒ2ÿdþ‚°³èþNÿ´nÔïÿÿÄÿ‚BŸþPÿ xØ0DÿiþpþÚÿæý ü`.ÃÆá„Œ’ýývýCýôýzÿDÿ¤ÄÉϾóþ‘þ‚ýaýäýÚýþ4´D88€Ôhÿ*ÿŒþ|þ–ÿ&$ÿ¾þÙÿ¨úýÿ6l2øû’Âþ¶ÿÌÿDÿ:þÂþ„ÿ³Oöz}R*4þÄþþ3ÿ\ˆDðW8aþ´ýÌþ/ÿÿÐþþ\ÿ¸ˆ±A¿¬þÿ£ýªüôü>ý’ÿXNLNžB"þDþxþtþŽþ þâþbªZ Ú~Ÿé‚äþ4ÿ_(þþ þøý ÿhÂÿz禮ÿ¤þúÿüÿŠþôþ^ÿÕjÑ¢Jñpâ­ ‘ìú” †PE÷âþÄ  ùƒãÿõÜþ\ ÈÜA` ð\òþ¿ðDîTŠõžóÞðþ¦ ¦Z8d ùoñX÷âüÊPø‹öu$¯ Šžý"ý˜ÿPúØõšóúúMû^þlì ì ’þ”ùoÿ•þƒûðüdù¯ôþüÛì:¨ ­‘ –`íÿõæÃú‚dÿdú üòý"¸fâÿY¨øðñì:úŠ"‹œ œªþÜN püþ´ýsÿø`ëÈíW÷¶r Ê ô2‚κøÖñÊø&ü]ü\øºöDÿ:ÞÞ ¸¬,q¼ýüôäò÷ýRøÖ÷(ÿL jšÎäþêûÍùÜôâî†ò¢ýEüÇ®Ž ¼†zû-öÀø0þRüÊ÷`öDýžZà¨ Ô zŠýTõdòõ ùÔüÐþDþ < ê6ýâú.ø¾ö\÷{ùHÿÀwÐÿx¸&ü4ÈýlùÈ÷zøøîø¢þ³²œ> .ÀsýŽøÈóAò¦öü|ÿ¶ÖhDhý ûøùHùSøfùäüy2ã¤À]ÿFû#øFøøø{üo'fT>žQÿ¥ü û®øÄø*úoûuÿ¤<oþȳ¸üÿÈý<ûYùeúˆúù6üÖUÀ €|}¸ÿÚü:÷Òó6öRûþ8Ú ¢ºÎü ùyúŽûXøÂø¼ý1”t8î<ÿHûŠúoüVúxø\úŠþØô¼ÖÿfÑÈþúÏ÷Îùäûlü^þ:ú< H9ÛþÁýý)û.úâûüžýëÿ$صó´‘\ÿüüù&øHøžù¬ü­’~(¦˜³ÿPü€ú¦ùªù ûþÿ÷x˜P¬®ƒÿÅýÂüürúûTý\þR8D®n0ÿþaûäù×úÎûhüvþè´ë„q¾áÿîý2üÉûdû-ü®ýþÿ=ÔŽÀ,ýôýãúøE÷Dúxÿ^ ì¤Ï¨EL@8üTúGû;û^ûþ³jÇœ’®Ä¸ÿ¡þ?ûÐø.úîû\þ¹ÚºD:Yüÿèþ„þªü¼ú¯ûúúŒýa]¥HKf8ý|ýæùyû<ùôªö*Ć è>ð¤d û²týˆúJöäòâŽòük î ãø´øÿ{¹TúžæF÷Zü,ð=šÿ nóÂöâôùøŽ¥0ü2óšøÐ¼ ¼á±5ûÖóªôæ Jf÷pí·÷ˆÖ  tv×·ø¢òüðëóÑþŒ’ -€6 n¼û÷qøRù1Æ €ÿ@ùŠü]Qùàøüô– <Ħý8úô&÷×úÈþD  Ü ÿõ øXûòüÞpü¼ýb"ÿ¶’ùW…>þ±þ¢übüÿ8þÂûÀýúÚú(æ° Æ;‚¬þ€û÷øZ÷îøÖøtþ†Ü Q  v:ùøt÷Ûùjª‚còžü~ûðûÿý„¤TIªgý5üâúzùxüÿzÒÿ†Nûýdúüùvü‚ýzþGÿÂÚüþNf9ºÙþîüÀü^üØüÆýÂþ£sš òî @Füþù¾ûÜù,ú0ý¼ŸQ Œtÿ¢ú÷`øVùSüZÿà2öþwþþªþ¯¼Hÿ›ÿ:ýfùú²þ´ÎŽ5€EHüÄùøúvü°¶üIÎà(°ÿxºœÿeý$ûLúÎüžÿÎÿHq6|²,¸¦þFþ—þ¿û@þÙþ.¶»ö|zÿ(ýcü‡úÙûHþ Œf±žþÀýÒüöü\þþ'i8þüüOü|üNü¬Þjò&ÿû¬úKû—ú£ý{"Þ…öö|eÿQÿcÄÿ*ÿþnýïû€ýzÿÊ¿,LÇ2þÈý1üýNý˜þÿ¤ÂÀ²®ÿÿeÿhÿþPýkþ@J‚^à¤ÿ(üŽü5$âÒ;~üôúÿû9ÿ¡àî‹›þÝü~üóý\Øòpmÿyý¾þúÿô=È;ÿÐüÉûóûnþ ¶¦!ä.¾þ¥þ}ÓÿÔþÊþvþ€þ~ÿÐLš,*”ÿÖýwü¤ü þ†ÿ8ŠÜ4Lÿæþ)x€ö”ÿ·ýXþzÿ,`HjÇQòÿJÿNÿrÿžÿÏÿ Þÿf˜dd¤ WÎh.Úþ¾ýþõþ“ÿFµŒÿŽþœþUÿ<Y&*nÿ&ÿ>žÖ×JDD'ÿ„þdþ¦þlÿ|êl þidrÿ<ÿõÿòÿPíÞðÿ¶ÿfÿnÿªÿŠÃÿ&Ø’oÿÀþÿ€ÿ’ÿ%¤âuúÿ*†jLZ$°ÿKÿyÿ¶ÿ­ÿ´ÿœ@}héÿ‰ÿkÿ”ÿ¶ÿtkabber/sounds/default/chat_their_message.wav000064400000000000000000000326461477701321300213600ustar00nobodynobodyRIFFž5WAVEfmt "VD¬dataz5&wüFŽœöößöëNÿ¨ñœþLJîR¬Fé;¼€ËÄí'lê=š1éý¹íCõÌþpú[àê'T„$ˆ!îÔùéÚTúø$!þ×€éîÀê• f JëùhóÄî+(W:ò ºzæü ÖÐö6”߬øÌ÷šÌPÚ,| .„=¬)ñäÞÿžê¾4r31êDÛµÐËNõ¨ þòìHýäì¨þ-=%µLÆûÚD´çí«ýæ/ÿ\ûôÒDÛ}Ê oßöñŸ¡Ûxþz@´ 0¤hߎØ4Ò"\3ôöþãf'å>åÜVç¤õP*êÿr [ÆÊý9CR Y+vníÇô2Šóæ )ÊÌš¸Dæ0ÙM 'ÈíXè =× i4wS æ1ˆ€ìÒÒöâãØÐá’ (ÞØè1’Ü*ë L ':g:DñüõfÓŽÿ† ¿² ŽÙ&æè[ÆÀõE4ÎíºíëM ŽÐ³Îù dù ç¸ÿN&ÌRßüT uä¢äŸþØð†ÝÓ]òW5(I0ô`ÿª ÖçPùø'ÿ­ ¦ðöÑØ ûÄÊó”ìý£ëøT “õ ®*ºè'Â(²ê²ðTÿ€÷ö;îͯÏ%ãVâË88þ±ðtúZ7ptVúôŒë¸îãðíûü€ð4Ðí¸|îR"5 „ì,bÈì~÷Ê"Æ@èká^èéÀòÖ•¯üVïÐÓ\&'àDFô(öè„ÞþðrRÿ[ü&äêÕb:ñ˜ ¾ý°áî¸îìí *-¦,ÒrèüA²‚,4tøöùŒâ;ÙÉðjé ïª 0û±ÜéB{vì'«™Ð5û é|Ç gÿýÞ{Íáªæcìî´ , –ùpû4ýÑ":;ï#Èûýîsç¸ä,÷ÄÿóHø–ûãë„ð öíO )„T²{gòÆùôýRjHÆÜׇõ5*„2ü+òÈ÷œáÄì›" ð ZÄò â[õ nL G³ÿ°ùJìê¬ ú¶ù;þpÜÙãøì÷¶>&ÀDˆj÷„¢ª!@-¾ ãµæß×[ÛÜÂùî,ÿôßëVþÿ2,À$T ÐÿÃùŠù[ÿÄõ ú ¾ãÎÇÎà@õº· ‘ úíùF.HŽìÂã¤ÜæñðøSý JòÔã´üð´þJD´ûpíòøÐ¾ŠÞú’÷RðÚï0Ñ$dé¤ÜPêÀâÜõÊ,yýJû\ø(´ a÷)4]ÿþãý:õê¦ý7"æôòœÞsÒY÷¢!ê!Ö:»þB÷Á$€Ž ÈýÙìºÓ}È5ò¿ôõó„¾ï.îl ‰Ôø"¿ þñšó´üPÿ\ýÖü¸Ôî¯Ø*êùþïÀð)V˜óéŒûö ¶|>~üëˆðô÷øý§þت>á®îPžøRøç 8®ø¸ü–’÷VèÝý¨Z#â©ùº÷xøðÌ„Îô”ìàê›Ø4ÛH‚ÀMúüæüÌ~Z"ÞùO˜ Žü­íèKõÊÿFðfëùõÜç¹Þ$÷1½ v*¬Ê&óŒvæ¤æÒà¦àtçVúÖ÷¬ø¤ -ûéþx*ÀÎiÈÿÆøDëþx ˆ0ÿÐìýá6ó²ü1ßÕ púý>ôVîúÿÀèªôöñxöûux£0Þöø_ïìNø†ü*ö¬îæùJi neV¼òéö$– ˜Ÿê4ÛvÛãdõPý6ÿ® ² ýlþÔ a6 5¾2øöcùûè‰åÚõØ÷ õŒðÉãDêœþ º4$ê7 æôìÞõ(âæ2äAïV öûöºúûrÿš2ÿ jâ²Êsùäö<ûŠF3ªÖ ÷ãääóöÿÖöv}ïë]ëTüù –  HþŒû‰Vèr‰óÿè?øèõ°ëñÚõ´ûZõò“þô u"–¯D€ÿ­ü–ÿz ìüå¯ÝØÛÁä`ý¬ f<$|M œFÜZxögòÜîJñùöóàï~øâ÷yî4òºþÕ ªö\ü÷¬< Ú # ª÷:ñzîJñ ýÔ²ú î÷‡üþS6Ôóþ•ûðühšøúÞöùªøÊ÷6)/ôììélö°|›CÎ $ ‚ ¨6|tþfôî„è+æöü¸íaò"õþÉûÂÒßÎúkð&þ¹ÿ´öî\ì…æØàóò„‰e6yüF©šo ÿ ô¤öÔó¤ñìøˆ#èøtê2÷„ÐÿÿpVÝÎöLúÄœ tiîðõHŒ^2¬ÿró|ó›ù¾òô(žçüú À ”žB, ( *šñ¬íˆ÷töþúì¤ç@ñÐî<ïÜŽBH3®˜jJÿ<ø@ûÅó–í¨é¨émñ`óbù~çüæôb|#?†dä µø¶ù9ÿúšÿ~DïãŒè ô¾$þáLˆ ­ú W n á õ6üÎ÷øÊˆ’ÿÈôZó…ö€þ êÎùaùjûKý¾Y¦ÖˆˆØ¶ú>N|øæòFïžò‡óÞðVö¢û™ÿ‰’T´X Z’T çšúó€ô`ñ•óvù|ô¢évåHîÉ” ® ÒZ °œ‚ þ ‘Ïôý îéòñKò[îŒóøúú ”Ñ¢šÄv'nýžý~þÓþ¸ÿ ùô¹öFó^ò@Ý Ô…ý£ûbpB`ÿ>¹Èüý„Ý lþ~®ý¾ôWõ¦÷©÷ü0¥þ ÷¼ñbþÚBÍ _†`ˆ úiü¾õ2èhé\ñõc÷»ù†8 à L& æžy Hü8ôðö¼õ¨ðÔòò˜î8ñ¸óÆö ÿº ö`. Ba ^ ï "¦þøüQû*öTó@ïøîdù¹ý üŽýÂRûä o ü üØúù6ÇjÒúšøVüxýVþLþáý>þýô÷Èöxùxÿ¢Ppø¨î ¼ îŒn * nû>ópñ¢òöô^øêõêò>ùXþ€þI V¢ž  à×l2þÎñúî*ðtï"ì4ì÷ÿLÿŸ ) — ÆÈ¬8  üŽïàòûõHõÌõjô¤ò–ñöê— òèÚH Uä†2 s+ÿ4°÷bó ýüþ@÷€öý{Bøoüîäþ†Ì=ÿ†.;ÿ¡ pýöûhþ—ü$üÌýšüõ[ïv÷þÜ÷oøU„ ¢äÔ /* ® $Ø´ûpü~þõøê¤ëôô(øzóöÂýý=tœ²R¶æùü9Ý´÷¾ñ-ñ^íPì“ò~ú”ûùd– ü …{ ”¼k 6¹²üê÷ûøúzòÐòúûBý÷þõÈü¹é@ûìtÿDwòøÿéúT¤úžûŒüÿÿL¤ü„øzú ýfýù÷Ã÷‘ë ÿó Jl È Î ÇLXðûÊöåùÓùFöôñbïôò÷-ýh Ù ÐŽJ Þ ¶ î hTüøØñÝñÎóéïÈîó^ùBÿ”ÿÀ vŠ#Ðoê–Å:ýäöúöf÷—ñüïÌó¢ö`ü20²äØ„m ïVˆ$þ¤ûˆûXü>þqü¦÷LúÿQýûqüøÿnÜÓþÖÿ¼h Þ³zø$l–‚üàøö÷ôìóûøÚúsù ù}ý < ‚& õ ô ò • bÌÿàû5ühúò¤îÌòôòôðŽó`ù²€ð   S ´0– þòˆÿøú(ôpñAò‹ðoñDöN÷¦ø´ÿ V  žÚ† [X Âþ>ÿüö¦ò$õœú<ú¦øfý?ÈÐxÎ9fV|ÿ.TÅÒýÆþ@ÎûýÔüòúú{ü ü^ù¦ú¿üœþ0ÿbæ˜ l ÁÜ¢¾÷*ˆû=öÆö¶öóòÄó~öŽûý¯þ@º ° Šª M  H @_ÿ÷öÁöpó½ðrïŽðö|ú|þ¾vè Ôî c  Ò öŠú]øNøÄöèöÊõ~ò ôwù~þXçôe  ääÃT\JîþÌüÜüOvÿ7ø.÷ ýêÐýü`ýÐýXþBó\þ+w ¸{( \ ]®¾¨ÚÿƒÿªùHôêó³÷8ûøºõýÌÝ(f  î  6 +Ù(ˆøDïêïÞóõPôô†÷¼úÿ$’ J ä ”ÈH ŽÞ¤JûþôöôóÝñfõ\öóóˆõZýê' 7( & œ @ªØýÎüÉû÷c÷–ýÂûêô´õZû{¶ÀäÌ® 9îÿ|ù¯ÿjd:…üNþÉý¼ûèýþ’ùöõ7÷]þ ÅÿþýDbú r † N\D€ûÂýzü<õYñ¦ñ{ôÂøëúüœþhXj! D Ø f ˆ´ÿzùpóâòò…ðÊô€ùàù²ùü̘ º@ ÷ *, ÂN¦û~ø^øôõóäõäøŠø$úþü­ÿb&s5„ Ný”þÙûKüþ°þ¥þ`ü\úqüýEû0þý@þ]üNýöœÒÊZö &Üs’$íÿýtügú8öÑõ]÷S÷ŽùíþÞ/Pj Ò ^ "â,Ðþ†øó#ócóRñ¶óøùÞý®ÿ<& Ô °¢@ (^½ê–ùøóÕò óªó÷•ùÞ÷úÁÿè‚þ K æ."†¦jAü÷6öøøzüˆûý÷Qú²þ´þ‚ÿ£¼ ?&†:Úboü¹þB,‹Üü€ú~úFú€ýJÿþúXøíùÜûšý¢ÿ.¤xÚŸ¡, ‹ Õ<XüÎúSütú;óˆð¢ó„ö¢ù0ý.–æb” F<Ø ºÜý6ý‚þ üÒõ~ð,ïðÛô;ûºýpþ\R˜ ¢ * "h *$—ÿNýNùÂôÞòœóøðüÐû¯øªúþÿ¨_ Ì ³žj ÝŠ2ý`ù^øxûžÿàû¢úJûKýh.ÿŸýØþø4°ø¢b¾ö—ý.ú“ø ùØü’ý<øÇóøô•úÔ øtøÆš á | ö‡,û:÷"øø÷ó›ðøò:÷õüFà0¾ Þî¬ ïNDýÒû'üÒùjôÜñ†ñÚò7ùÊ— f ¼ Z  @¼‚ýÒùì÷ùlùùü<Èþü~üCRœýŒüTò ÞÿÕþþTþ”ÔÔÿ¼ýüŠù¤ùtü²þsýúÔû6n®t´„ô Î oÛýÎûDú¶÷bøúâø–õóóõÊü ¬ Åö° Þ ÆåÿÔû$ø6÷ëõ{óSóHõ©÷’ú¸þË:þ<š 4}J s…ý±ûaýÿTü ö ôjôyõ2ùÈþ¹¦JÖÈÊ! Bè¸ÿöL'ÿ‚ûAú„ûý<ÿ†ÿ¦üÎú¸û›ý 7ƒþSÿ’ü"ÿ"D · Öý¨ÿüÒp‚üøùÖ÷–÷ùðù8ûÈüæý$$ Å”5X Æ 8˜|ùöFö2ù¾ú~÷tô®ô`ö"û`P¶ \ ²²æ" Î ‘êÿöùC÷$÷W÷zõ–ôüõøDü P¦­D¬ Þ . 4 ©xýÖú½ûµýnÿžýŒøFô„ôÄú‚d©,*°ìµ¯ˆ‰ÿ€þÈÈ.ÿ1ý>þÊÕþ¸ûäùù7üŒ'£þüxüùþ0ÌR = ³$nP\ò¤¶ùªóôæ÷æøù@ûŽýžÿĦîa†³ v ªÁÄgüÛõÎóÞöìùRùi÷œõxô|ø.^ > 5 Œ¾O<`œòúû%øÞõœõˆ÷ÜùÖù`øÀú„Bޏj^RÀ zÙ ýUüýýÐþ$ôHþùöõÄøÿì“Ê<ý!úÈüRL^ȾøJRšÖÿÌü ûHùÈö4÷,ü!vÿÒü½ûþvà ¤ ¤÷´N¡$Díúãóðò9ö&úÄýÿEÿâŠz @ Ð  ì  –3û¨öõNö¶ø2ù(øq÷löÊ÷Ýþø“ @ Œ~ˆóÜ`ɰýXù÷÷3øCú”üÅüúûBýˆÿ4z°›?Àÿ¬ûsý~’^—íû¹øùmývZÌäü£øø÷äû5d~Ë´ 8”´ +õÚ–ý9ù÷œö ÷>ù üÕý¤ýŠü¢ýJ\Ìš ðÞÿßÿŽj´‡û-õ–ðòðòôyùrý\ÃZØŠb Ý à N är¤ü¸÷àôøõ@úäüXûãøPø úÁþv Ÿ ìpBÁk(§ú÷ÎøüTþÊÿÞÿœþuþhÿÄÿÄÿ+`š’b^v½ý¾ýŸõ%û>ùü€¨ºÿøúÄö¢õXø þôjj²ž•þÒ H °Ž2ÿbý úìö=õNõì÷„ûQýLýäü\þ£D Í ?úýúþá øý÷ºðôï”ôpú8ÿœ™«O $ âöˆäÿýJú^øô÷Dú’ýLþDü`ùø¿ü¾Ú! Ðzþˆþ`H¾f“ÿVúø¸ûBÒÔþnüøûOütýcþ¹þThÆÄU¤òªìЍFýŠù¡ù0ýfpûºôÇòÎöZýäáòÖèB²Œ ¼ÄýÄù ø÷ýõœõÁ÷éúâü.þ°þ¼þzÓ” ËŒªýùüÎÿ¸FÿžùÎóêð¾ò ùú ¢R¶ˆ¤ÌëÞåö¦ÿlü­ùúüû,ýþÿÂþ'üÀù”ûüʶ0@ûVú'ÿøPìý¬ú8ü‚ƒâéýäùø2úý3þÂý,ÿK¾Ô( ä êøýüú@ú@ûýÐþü¸õâñ ôbú@  ÐÏ’Ë> J t2þÏøhöØõúõ÷ZùfûüVýÔÿ0Y$¡ ¾ ìHü@ûžþìxWûDö¬ó~ô ùNû¥–ÿŽR0° PÒþÝý`ürü^þ&þ¼/ÿŒüDúû°þ¨l6’ûžùæüÜV é y&ý¶ýÚG,Š”üø.õÄõƒùýÖþŽÿúÿÆ6@¦ŠÝ  > ŽÎþŽùÿ÷­ùþûœü_úêõ¶ò0ô$ú$F  ®jPl  Dýøsõ˜õ÷ øEúNü„ýºý‰þ|R¸Æ œ Ò ª/ý£ûÈýŠä¢ÿjùÜô†õ€ú¸LÅb\þ®üGþ ž0ž„þžý!ÿÏ×ÞÿUýÍúµùÈû˜ÿ¾Ħý½ú:úúüÈ Ö ª ·òÿdþ R v8üö¹ó¸ô6ø&ü¤þšÿÖÿ&94 „ ´ †ù6Aû8ø¤ø÷úŠüÅûBø]ôHô®ù<x 4 ¢ Å`î š,¼þHøÊô˜õOù’ü©ý¶ýþ®þ”ÿ½~öxèñ"]ÿBüìûþ!2&þXùª÷Ðúì5ìý ùÀúÿ[8fž¸þªýÿ6@X@¯´ÿZý¾û¶úçúŒü˜þ.ÿ&ýúù>üš. y  ‹äëÿFã,.þŠö®ñòºöFü¡ÿ`Ïÿ¾ÿ—³œ V ªÄ§þ+ûlùpùèúìû>û ù†ööRù)0ª ìªÆN² ¤ÖÿÒùzö6öáøPýy’€þÎüTý>ÿdѼ7q<²ÿŠü#üWÿªDwÌÿ¼ûŒù%û˜ÿÊÂÀ”üè÷Üö@ûÿ˜­øÿ9ÿ¸ù+ör¸®ÿHûÅøäøeúûòû^üÞûVúSúnýë x € ÖƒjÿꦔŸlý…ödñþð2õûÐÿj,Vä]ö < õ „æý²úôøùûýƒü¼ù¡÷5øRûcê Z ÃÝxþ˜ÿdÏ5¹(ú÷øKûlÿ ðйý”ü<ýÿÈ ºˆšÿVþ\ýpýØÿñ¶Rfÿ’ûÈûÿ?^®ÿžúlöìôö÷„þL:¢³òÿ$Bª ¨  (àþöúKø¿÷ÊøúÜú&ûÜú'úûîþNB œ  |Êÿÿ*jþ÷žññ‹õîûÐ+#XV2° ö 1 ,:TüÔúÊú*ûHü²ýþŠüIúŒù ûîÿüD„,ÿýüþo|¾0þÒùfùÌüÆ}Êpüúpú_üâþ·¢Ðþ›ý#þp¬ÝŠºâö`ýþûLýÖÿÞ8þéøLôJóüö¿ýRé]xúÉ| \ J Â.ýXø•ö÷}øÒùlúoúkúÆú<ü’ÿ¢ü 4   üXœFÿIØ¥ZþÎøÓó%ò)õ®ûèu<‘Fÿ®È¼ ~¾@vüÀú“ûÔýÂÿÑþ7ýºûòúü ÿÊ<à«mýìú_üõA·ïû@ý+ü†þâЬü3øU÷éùnýŒÿœÿšþ¢ýUýŽþšZ¤f „ ŸHþ@ýÔý–þ•þ£ü†øZôòòØõRüXÄD´6BŽ ç åØbýð÷ªõ€öÎøûòû6û_úîú\ýËR  Ô4HÿÖýÿ^¾þú,ö:õº÷öü¼ùvHþþpx*þ‰û?û×üZÿÖøìŽÿ\ýhüLý‘ÿɨt©þœûªùdúgþ´ ž$‚ÿrþ”†X^Äüú÷äõ*÷²úþ,ÿìýpüyü³þ¾  ð À Ö´þ¤üý þäý‘ûÏ÷xôžópöJü© Xœj€Pƒ ÁŒ,ýøúõ-÷¼ùæûüüÕüØû4ûxü/¶ÿL n“öÿþøþÂüýœø÷Rù þšÈ»HäüüþŸÖÄ^$ÿüMüÿX€ðR}ëý^ü üTýRÿ€RÿFü®ù+ùû ÿô‰&ñÇÐ<úÜŽœû|ö‚ôÉõù²üšþjþ¢ý¶ýdÿ Òv  ¾ ö-Þþ¾üQüµüŒü&û†øµõ¢ô÷Ùü>F*°9¶~e‹Ðýføãõe÷ûþôþHþ-ý§ü{ýRhmnÊÿ~ýwýÿîó¢ÿŠüÆú°ûîþÕúÝíÿ˜ûÓùzûÝþöZVÀÿ…ýý'äÒîoþ¤üWüÔübý‚ý«ü´úÊø†ø¤úÿH2@ Ÿù2&‰7Êüiöfó>ôö÷>üìþ0ÿdþþ}ó Þ Ê •ÌýDüXüØü€üûùw÷D÷2ù_ý³ÌòLdvÖèçÛ•þfú4øùNüÜÿ¬Ûtþ”ü–ü™þ¡øŒa”þ.ý’ýØÿÆ„,kÿÈýþÌÿùÛfüýþùˆ÷LøðûEøüIàÿ.¡<ür <øXþû úáúðûÓû•úðøò÷´ø–û&2 u D fèR=†û–ö²ó"ôh÷¦ûÿþ>œÿáþîÿF’š  êò˜~ýHü±ü²ýþæü™únø2øxúHþJ+ÜbÈÚÿðÿÛ<K¡Êÿ ü|ú¸û»þ´6m³ÿÌü|ûYüÔþjb€þcü8üðýÒ0\–êèÿÿ¼B^òÿÞûøö´öÃùüý‡Úý8†Op Ñ þ8yþûˆù¼ùÌú,û6úŒøy÷Vø©û¾Ü& æ Àˆ(Ü¢,Žûüöfôõ®øíüíÿà ,€> ã‚þØûžû ýþÿŽþ@ý ûêúLürÿÜÞ:4ÿ8ýdý9ÿ^Ê­ºûý|ü¢ýïLÆŽ Zý<ûLû²üRþ5ÿ¼þæüòúÆú0ý4<ÐVæ']&*ÿ0ûîö“ôFõ øýÞ²®D½nÎ À ¦0þ`úôøjù•úûcú+ùønùøû(¸˜ ïLPÒX:àü`ùðöÇörù ýݵDÿæþ<ç€{W¤UÿÉüYü'þ³bxÿxýcüãü·þÇÊ `ýHû^ûÜý$fßÌ"®ŸÄƾ€ý”ù¦øú üFý<ýbü£û$ü„þGD=  f8]ÖžˆÿJýúâöõtõ5øxüÀˆ!’P( w –¬ÚþÎú¸øÅø@ú¼ûæû¾ú¸ùZúüüÔ¯zN¬RÔ˜ÂýîúzùÖùÅûšþ,Vº £þžþDµ4˜LÆþKý}ý@ÿÊΖ5Jþáýÿ˜Ðÿrý5ûú^únü™ÿ˜Nf¾ªT¦î—†ýÛùÅ÷Ü÷ ù¤û¤ütüíûzü ÿLœ\ Î 1 L3ôºÿàþÊü¸ùÈöjõföuùfýžæöÈÿ‡{ó†þÚú1ù•ù(ûÚüÂý‚ý‰üü^ýx„Áê<&vÿ¸‚þ€üü`þÈ~¬Hÿ<ýü>ýðþÔÄdÿ'þÁþ:b² Pn·ÿþÑý\þÀþðý¬û ùÆ÷Ùøðûàÿ\‡8èc;¨jôR°üÁø·öÄö^øŠú?üýFýÙý¥ÿü,Š d l ä…Pfÿ,ÿ±þEýíúyøþöh÷÷ùìý ´ Š;¸ê»ÿ—üÚúNû`ýyÿ>Šÿ(þý#ý¥þ*‚äýTýØþ_;Žœ*ºÿ†ßÀYn‚ýËú›ù`úJü4þxÿöÿÞÿ¿ÿƒ¬®J$ š"f÷ý7ý@ýýòû(ú#ø÷á÷æú4ÿZìfÄàk™ä öý@ùèöŸö!ø€ú‚üeý˜ý5þúÿÆì¤ pXÎLÿrþÌþ$ÿSþ>üÿùôø¢ù´ûþb*bt\ô‡ª|ЉÿßýýWýßþè4Þ,6þ,ý²ýWÿÈê®ÿâý|ü@ü£ýV$°ŒR°F ®\ÿªü$ú|øhøìù:üFþzÿõÿ`‰¾dx$ <vþ@üëûüpûãùø÷øûÿ¸rÌÐ h`Št¢8ý.úRøã÷ºøzúü'þÄþÜþ€ÿPúpжY|ÿ”þ¸þTÿ„ÿšþÈü0ûõú\ü¥þ¸¼¯ÙÿrÿœÿXk:Ôÿ,ÿ†ÿ´Ú~çþøüüoü¼ýµþqþ*ý ü2üþýܸ^6~PüÄpþ ûFùø ø@ù9û„ý¨ÿDA&䯢è^þäûøúâúàúrú˜ùìøgù¤û?ÿèbFhÊNÌÄÐýŒûêùˆùtúüÐý*ÿòÿ<YÎêj€íz~þôýÁþöÿ ]nÿhþøýlþˆÿ°0ªSÿìýBýŽýmþbÿ7ìd”Ô€‚@òB²ÿ=ý¬û.û€ûülü8üÚû*üÑýÀŒX¢P6u¦k¨ÿvýûùê÷î÷*ùFû®ýÚÿš0&þÄ,Šu:áý„ûªúòúoûjûöú¼ú`ûý´ÿм–øöwMöšÿ&þýjü:ü§üÀý*ÿ@œI»ÿ‚ÿîÿКÐF. ÿ£þrÿ%¬3¼–ÿHÿ¢ÿòÿœÿ˜þFýü|û¾ûðü²þj¹žAÃ2Чj¦¢ÿ¿ülúvùÌù¾ú’ûüHü ýÈþr_Äð 2¼ÎØRÿ:ýûOùŒøØø÷ù®ûÎýÔü°Pú„¦¤lòþåüÎûÐû‹ü-ýýüLü&ýúþ¸Z3z)8xŽ$:?ÿ·þ¶þûþVÿ¦ÿÓÿ¹ÿDÿŠþÕý ý8þPÿ6p.òÿ8"ŠØeÞxÌ|ÿäþÆþwþtýüãú£ú\ûÈüŒþPÞ"š×îÔEVCÿý'ûðùÂùvúûŠü8ýäý&ÿCÉ̦O$¦K=U=ÿÒý<üÜú2ú†ú²û.ýþÎÿÌ.Vkn2l jÿ&þ“ý¦ýþþºþ~þ"þ&þØþ!$D¨ÿ¿ÿTñBDÚ²°ÁÇ¢6ÿ¥þÛý?ýÞüèüwýpþgÿbÚÈ(z’>¢1ÿRþœý¾ü­û¾úpúûü‘þnäÜL.–¯ˆ?ÿKýû|ú>ú¼ú¬û¾üÆý¾þÉÿ,즲žŠºÜ4^ÿ:þýü¶ûêû¤üµýÚþÚÿ¢;¸=4ܦ4cjÿÀþºþ;ÿÉÿêÿ†ÿâþtþ}þîþzÿÏÿ¼ÿRÿèþðþšÿª¥'6øz·Úÿÿþ*ýPüÎûàû‡üýåþ£N#î þ¢ýìüü@û¢ú¤úlûÜü®þŒ0pHÑæ6˜)Ñþzý(üû¬ú#ûJü¢ýÂþ›ÿcZ|”B=z6äìÿlÿ$ÿ¼þ þ^ý ý~ýHþÿ©ÿT¤àæ¾…_Xgz{^0&cØ(ø0+ÿjþ6þ^þuþ@þâý½ýþÿ@wfî#%ÞUOêÿ|þZý•üü˜ûuûàû÷ü†þ vwL³ö¢œjþ4ý~üü”û4û>ûüŒýbÿ8 ª JAÔÿ|þ£ýýüXü~ü&ý;þ`ÿ;³uˆŒþUÞÿ¸ÿ²ÿœÿfÿÿãþðþHÿ²ÿéÿÆÿkÿ"ÿ#ÿ^ÿÿŽÿ~ÿ¨ÿ$Ðf¸ÎÇÀ²xòÿöý/ýãüüü2ý[ý”ý*þFÿÁ46°Ê¸†(ìxÿþÖü ü¯û§ûßû_ü>ýþ)¼äé$:ì²²þ¢ýðü‚üAü2üfüöüóý@ÿ™¤B’Êû¤ÖÒèÿHÿßþ…þ+þèýÜýþ†þÿšÿñÿ8h¸ *ú¤u‘ÕùÕzæÿÏÿ®ÿdÿ÷þ‚þ,þþ<þžþÿpÿÒÿZð˜Ò£?ÙpÖôÿàþÛýý¼ü¶üõü^ýðý±þ¨ÿÎÿú…”Uû‰ÝÒ„ÿ8þBý¾ü™üªüÞüFýöýìþ?;Ý ×ŽXP:ÿbþìýÀý®ý¥ý½ýþÄþ’ÿQà6c~’š‚2«´ÿšÿ­ÿ±ÿ‚ÿ<ÿÿ*ÿnÿ¦ÿ®ÿŽÿmÿlÿ“ÿÒÿP}£Ü(všu¤Jýÿ”ÿöþCþ½ý˜ýÎý;þ±þ&ÿ­ÿT ö§ –ôM¬úÿÿþ?ýÄüÀüý–ý,þåþÐÿÞÞ¤4 ¨!tœ›ÿŠþ¥ý#ýýXý«ýùý_þ ÿûÿ×LgHÌrù]®ÿÿ‘þ`þlþŽþªþËþ ÿ~ÿa„€„¨ÚðÖ–Y;Hh€l"»ÿeÿAÿFÿJÿÿÏþ“þ¦þÿÿy×@ªûø  ˆèÿFÿ þøýhý ýHýÐý†þ3ÿÅÿb( Ø>$¤ë&e¨ÿèþ!þkýéüÈüý½ýŠþRÿܰbÂÂv ‘Kpÿ˜þôý¦ý°ýûýbþÆþÿwÿøÿ£P½Ào¸’p,Ðÿtÿ?ÿ4ÿIÿlÿŒÿ¦ÿ¶ÿÄÿÒÿÜÿØÿ¾ÿ ÿ›ÿÈÿTh_h¤HEëb×ÿnÿ)ÿôþ»þtþ0þþTþæþ¨ÿcô`¾H6Ô@˜òÿDÿþæýhý8ýdýâýŽþHÿòÿŠÃdÔÔXвxÿùþnþèýŠýxý¾ýDþôþ®ÿTÞP¨àæ²Tä{œÿÿ¦þrþþâþ8ÿoÿˆÿ ÿÕÿ(†ÇÕ¨^"8`fBöÿüÿ êÿºÿ‰ÿaÿ<ÿÿ ÿÿ@ÿÿîÿR¤Þ2d‰{p´ÿ!ÿÈþ˜þrþCþ þ,þzþÿÐÿ–:¬êêšn¼ÿÿŽþþÅý«ýÜýSþïþˆÿ‰zå*&Ó>öÿŒÿEÿÿ±þbþ:þVþ¶þ7ÿ¸ÿ#v¸é öÊŽLÆÿˆÿbÿZÿsÿ”ÿ¢ÿ“ÿuÿnÿ“ÿÔÿ4-0j¬×Ú´}O0ðÿ®ÿ^ÿÿîþÞþäþÿDÿ ÿ n½õ!F`b<â[Àÿ7ÿÞþºþ°þªþžþ¤þÜþPÿìÿŠY|‚nJÂXÞÿ`ÿ÷þ°þ‹þ‰þ­þöþ[ÿÂÿ\˜ØOP¹Pöÿ¾ÿ ÿŒÿpÿHÿ"ÿÿ@ÿ‹ÿÝÿ8@FSclnl`N2þÿôÿ÷ÿüÿøÿèÿÆÿšÿxÿlÿ†ÿ±ÿÔÿÞÿØÿÝÿMØèÔªxM(ÿÿÉÿ‚ÿ6ÿûþäþòþÿ^ÿ¨ÿþÿRÒô  ü®<Äÿ\ÿÿøþñþöþþþ ÿ.ÿxÿêÿjÔ òØ´~4àÿŒÿBÿÿúþÿ,ÿ`ÿšÿÔÿ6]~¡¾Æ¬p&îÿÖÿÕÿÖÿÊÿ¬ÿŽÿ€ÿˆÿªÿØÿûÿÿÿîÿêÿüÿ8EHDBA<60)öÿÄÿ’ÿlÿ\ÿfÿ|ÿšÿ´ÿÆÿÜÿAŒÌäÒ¢mCöÿ¾ÿ}ÿ?ÿÿþþ ÿ<ÿ}ÿÅÿCz©ÎÞÝ̤j¾ÿoÿ<ÿ,ÿ2ÿ>ÿJÿZÿ|ÿ³ÿÿÿP–¼¿¦„hR:Øÿ ÿvÿdÿgÿyÿ•ÿµÿ×ÿòÿ (8DKF8èÿâÿêÿüÿûÿäÿÐÿÌÿÚÿëÿòÿéÿÕÿÃÿºÿÆÿÞÿþÿ(.2<GNH6ûÿÕÿ®ÿŒÿ{ÿzÿ‰ÿŸÿ²ÿÆÿàÿ1`†˜rF"êÿÌÿ¤ÿzÿ\ÿWÿiÿŽÿ¸ÿäÿ ,J_ryvfF!öÿÌÿªÿ’ÿ‹ÿÿžÿªÿµÿÅÿÞÿ(FRM>, îÿØÿÄÿ½ÿÀÿÐÿÝÿæÿìÿïÿóÿøÿüÿ ÿÿ  üÿîÿâÿàÿàÿâÿÜÿÒÿÌÿÊÿØÿêÿþÿ #%&& îÿÚÿÊÿÂÿ¸ÿµÿ½ÿÌÿ×ÿäÿûÿ(42,( úÿêÿÖÿÊÿÈÿÈÿÎÿØÿâÿïÿøÿýÿ øÿîÿèÿàÿâÿêÿðÿïÿèÿèÿìÿôÿóÿöÿúÿþÿòÿíÿðÿôÿúÿþÿþÿýÿôÿîÿîÿôÿòÿîÿóÿòÿòÿôÿùÿøÿtkabber/sounds/default/connected.wav000064400000000000000000000565541477701321300175100ustar00nobodynobodyRIFFd]WAVEfmt +"Vdata@]Ìÿÿ¸ÿÆÿÏÿÔÿåÿèÿøÿâÿöÿU ·ÂÖ⺟®t¼ÿªÿ€ÿÿøþðþúþÿGÿ›ÿ ÿnÿÿœþRþ6þ:þ.þþšþ\ÿ·ÿ‚ÿ.ÿhÿòÿ˪vN9Üÿžÿ®ÿ¼ÿÆÿ¶ÿªÿÚÿ|„ ¿ÿ˜ÿœÿ„ÿ’ÿôÿ.kŒ¨äì§Ž‹˜ÔäÊ”DpºÜ ^ŽjÿDÿïÿÌ&ì)Žÿ~þŽü–úZù$ù[ùXùÏùûÌü”þûÿ.†h²2T„¨àòÒ™‘byxøÿ-–ö\êV‡·Í’FæµHé¬>oÉÆ…>öþŠýåüæü4ü¬ú’ø<ö’óáïZíXî>ôdýÝ à:0þ ý~þ¾°¯Ê{˜þr’¶¢ÿ0þrþÿäþDýbûdú×ú1üxýšÿTϼ¤ä°ÂñFv°R âÿ.ü,øÝóÙïíRìpí„ïñ(óÀódóôâ÷‡þdC ¬ < , â Æ2¦þ¶þ»ÿ úVÐY^‚öˆÿJþÖýþ¤ýpüfûœûÓüþLlÿýýÜü¢üþàþ¼ } Û Á |  â ; LŠ<ý¶÷ßñŠìèŽä^ãöäè¬ëÀî?ò´øî_@ Z"~NȽ ê6">"à˜þçûúÀùêù³ù˜ùÕù#ú?û ýFÿîÀÓ`.d¼¼’:r¾ÿ†ÿFƒBV¨ ¤  V öê=ÿøˆïâæ1àNÝJßDåîr÷„ÿ,àœUîPp°6 < ×  ã  ü Ìk^t1ÿ0ü«ù÷ ôòòñPôcøÆü|” †‰ÜØ](ú@ ° Ø ± ¬uêrö · úýÂóé¦ÝuÒÈÊ Ë™ÔåÞ÷ô”2zf {.Æì 2 ½ f t }è:Hüøkô|ò8ó‚õÌ÷”øø¾ø:üþ° ä~± Úþ{|ñ¥Dÿ<ý ûhúpüWŠh ¦Çn‰ ÍXü.ò9çÞwÙ6ÛŠâ ì÷-* ¬ T ÒêüþølùôýäË „ðªn,¤ ç *r–šÿVüJø³ò­ì2é”êŽðæ÷`ýtœ`@à0Q¯¸] ë ) ò ó 8 Ò ¤ Ì À § ê„úúñrèRÞFÖ$Ó2ÖŽÞúéöt„ Ö¼Nz ¿ Ú { 8 œ D0À¦þTû~ù¹øÞø*úüaýÊü$ù³ôFóŒö\þô>ðѨ B¥þ9ûúÚù‚ù‹øøúxþª &ªäx ¢.ý>óœèüßìÛ|ÝÆâ>é®ð¸øsÿ˜Tãý¾û„ýÂâ~ .4pow&  2 jä¸ÿú´ó¼ëLæŠæFì„óùÛüD¾—³F4HŒ F r Ì  ÒGP  T êþÿÆù¾ñ´çŽÜîÔ²ÔœÛåëìÍò–ù6 ~æ|” X  hÆ\˜Òýúùö²ó¡ô½øsýDÿpü<÷šô´÷ªÿe´à{Ë TçýDýÄýbýBûêøVøÇùýˆ Ä×ÎŠÉ DtýNôøëKç|çMêìDì>ë:ìÌð˜öŠú©üØþdzœ îe^\ðK2ö ˜ ø r¨Þþ1útórë‘æÁç®í¤ôöù þ¬ ±¹)ØäŽ × f ä › ^ô >   t •8@þÚ÷&ï~åÞ†Ü1âtëvóŽ÷±÷÷|ùnÿú 蘦~âG ¤<»cü:ø2ö–ööøwüÜÿ*€þFù¼õf÷þI…dí ¤Êþfý{üû<ù<÷±örùèþ6ø "ëb L À¾üjôÔíþëî†ðÂïhëRæ åPéðG÷HüüÿHt Î ¹4ßvâ  ’¾|ÂþÏùvóî-ìÜîqô?ù,ûû@ü†þ¾j¢´n ‹ ’ Œ V h Þ  , ê ¬ .\Þèÿ*úBò„è+ßVÛâßNê{ôàùFùøôÄñ¶óZû,*ÑÂ}<ž r öËJ¾ÿ0ü¢ø[öVõ~öpù‚üfý¡û®øøþæ xä¾ ÄÚ–ÿ¬þjþ¿ýŠürú&ø0÷Dù•ýXh ö <¦6$R ú^ü²õò$óÖõ†÷ö$ñzé¢â•ßâ4ê/õþÿšøF-Œ¨¾Â„p Ó ;iêÿ„úôÖíXë¥ì®ñx÷Xûèüîý¶þ’z[´n Ä  Ä ž à  Y û z HDîÚÿXüCöRî¨æ&änéŒóÍûRÿ(þtøâð´ìŽïÃøÐ¢.À(˜ A <¶Rý\ùˆölöyøÆû$þ þTûÊù üòb ©Î ( ªføÿúþ²þëý0üüù¸÷àö$øðû^Š `îÝH Ü ÂŒýH÷ õN÷dú½ûÚøòzé©áöÜkÞBçŒóïþùÄ ÆF?+˜þ\[¸ Ò Ú ôß/ýŠöâðHîÆïnôúÔýÊþ#ýÒûøûòý½ B " Ê j ä *  Ð + -ÕˆÌiáý´ø òJêÃä^å¸ìªöŠþĦÿòøñúë|ìØó 4 {>nH° * ÁCÿ ü"ùñöáöø³úÅûû~ù*úTþÊê ½¸j, ˆ4êÿ‡ÿ6xJÿ.ýìú@ù¤ø´ù8ýVÞ ¾ Š ž n žÍšýúúúþø`#û¼òéàZÚ·Ú¦áÜíÀû\>žš#|4ùå . š €®hýìö~ð í„î¥óBùüúüüœû~ütþXÕ{ ¨ È [ Ú Š ø  ÁtØ–¿ÿ6ü¼÷Mò`ìÁèvêÉñ­ûD®–:ûLò‘ë êzï¦úÁÁê.ìÅ t $n¥þDüÚù¢÷Öö øAú²ûŒû†ú0û$ÿ¬Î {b­ è%'ÿuþÿœÿëþ<ý÷úºø6÷h÷÷ùôþÇn ò ’ À à äÀ@þû´ú6ýŠï…ÿQù´ðòæfÞªÚðÝçdó÷ÿZ , ˆ¤‚ôì Ë V ¬ ÜxÈü¹ö­ñð€ò€÷îûöýqý¶ûUúú©ü|<š  ˜ ) O € ä T –—}p²4Bþ~úˆõâï³ê†è—ëxóêüß¾²\üÂôwîJìðàø¾ zn 0½ ü üýyû8ù„÷âö½÷xùjúVú–ú ý <& ‚ô™ 6 $d¤ÿæÿÈ  äýUû~ùÕøÚùÔü\Å – <  I¦ÿý®üvþ:¢¢þööbí@ähÝŠÛMàDê^ö¾ šæ¬˜¦ ’ 3 ² y ¼¬ºþæøCó^ðøñNöûðýØýàû|ú¦úmüTÿ2 _ p 9 ª ë • ^ y$éa ÿxû÷Jò6î¦ëªì\òû"9Ä2ùêñí?îˆôgþL<,Üê ?˜ý$û6ù÷$÷Ã÷ñøIúÌútúûˆÿ;‚ ü ·  ÊèæÿöÿÿwýBûÆø ÷÷bùiýHÖÐ @ îÒ´]ìýýþÚqÄÿŸ÷¶îÆæ@áçß¶ãìØö» z¯øöþ x º n f ®"¿`ý|øUô¨ò°ôùåü(þâüšú*ù‚ùæûªÿ<û Þ ½ ¡ ¾ZÄæPâýšùõªð/í0ìËîèôÿüöB>QDúÒóðxð6õúü4ª ¦Å“  ¶ý"û°ù†øøZøÖø~ù&úFûÅý8ªô À . ì Œ ˆfPlþ,üúùVø<øsú¼þ²Œ— œ ÞµÈþýHýnÿ5"2ºüJõ‘íÊæ’âFâWæ%î@øú8 à¨6ñ â * Z " ¡o<ûøö‹ôüôã÷ˆû þDþ‚ülú†ùƒúwý€œ¢ I Ø  aàƒ,¢ÞŽu°ÿEüý÷Ióï”ìFí±ñüø@¾ ú¨ýûðõAòpòzöâüÄ  æ  yõ]ÿtûªø¸öÁõÄõ¤ödøRúü þ( ö n y ž†ô‚éÿ~ÿxþ¼ü±úžøR÷±÷úrþc<üf£òþiüõû²ýÜ"¶Šþ¼øœò íHé7è}êÝïz÷†" PA „  ÆúÅbÖý:úÆ÷÷~ø0ûœý¾þ(þIü:úùàùàüù¦ þ „ ÀÚ˜9š¦r¶>ÿóû¬÷<óüïïöðjõ“ûÈëÌRnÿÿùÑõNôïõbúx¡h Æ ¾ É ‚šxªü˜ù\÷Eö9ö&÷òøJûöýȬtª K Œ *zØni»ü‚þpü*ú-øI÷þ÷vú:þørc&2\ŒÿÆÿdU!:Nþ‰û3ø®ôÆñ3ð‚ðÔò3÷5ý_DO d Þ T ”î|S,ÌBÖþÉý"ýðüãüsü–ûlúuùKùdúúütØ`††Ç^<*êk¿œëÿÄýðú¼÷îôAóó¸ô;øÎüÚì`¶ÓzÿúþƒÿÑhÝÒ+Ø×@çÿÖüˆù®ö×ôbôÃõêøý N–»ø×vðfÓ .0ÓÿTþZü"úHø=÷6÷®øžûAÿžìÖZê]CÔˆh0þøûÂù»÷öEõ³õW÷&úþp4Àà „ ül(Xåÿ¬ÿµÿÊÿµÿŒÿFÿxþýCûÞùTùýùãû˜þnÜ’E?iÊp8Ö‹=öÿSþZü"úü÷böÆõyösøNûWþØ€6¦4*”À²<Jß ÿìü·úÜøä÷.ø¼ù=ü:ÿ :—$Œújâ^àlû‚ÕÆÿPþ~üœú ù‚øùáúƒýný¸tV•hæôÿAÿÁþjþ.þþÓýQýbüûÞùùù>úVü ÿñ‚R*\*²$³tÿtþ¾ýWýPý ýþ‚þºþÀþ¨þþ±þ.ÿüÿ&òr¥ƒ7C;0:ÿhþÐý{ýQý0ýøü²ürüNünüäüœýxþiÿ`Bú|ÇÊ€tÎ,’ÿÿÀþ}þ:þêý’ýFýý(ý”ýVþNÿfŽª¢bÖê”î çÐÿàþ0þºýlý;ý(ý0ýVý§ý0þçþªÿd–N|z6Ä0|´ÿæþ)þšý<ýýäüæüý^ýÕý~þLÿ ê¬PÐ$>¶"q¦Øÿ ÿ—þOþ;þLþhþþÆþÿPÿ¦ÿ  ”ï8x¨º‘7¼V€ÿ²þ þ”ýNý ýÿüöüýaýØývþ*ÿÛÿ€ |Ò#Û† xÙÿBÿÂþZþ þÐý¨ý¢ýÑý>þâþ°ÿ–p(³ ;7¥%”ðD˜ÿúþzþþâýËýÒýþýRþÒþqÿÄO­Ô̦f±Iâÿxÿÿ”þ%þÌýŒýnýqý˜ýäýRþÞþ~ÿ$ÆTºëêÈ’Lþ«^Öÿ“ÿPÿÿíþØþ×þêþÿRÿ¨ÿˆúUŽ Œd4Úµ“h,Úÿtÿÿ¢þIþþØýÆýÕý þlþóþÿ.³;<!÷Șd,ëÿ¢ÿSÿ ÿÐþ¢þþlþgþ|þ´þÿšÿ8ÔX·îóРe Îq œÿ0ÿÎþzþ8þþþ#þmþáþvÿ¸8ЬŸf¤2ÈÿlÿÿàþªþþfþVþTþ^þxþ¨þóþZÿÚÿjûvÈæÐŠ$¶Möÿ²ÿ„ÿbÿHÿ8ÿ0ÿ2ÿ<ÿNÿeÿ†ÿ²ÿòÿF­k™œv-ÐnÆÿ‹ÿ\ÿ1ÿÿâþÈþ¾þ¾þÄþÐþäþÿ:ÿ„ÿàÿD¤ìôÀ†Jæÿ¼ÿ–ÿrÿPÿ5ÿ"ÿÿÿ$ÿ8ÿZÿ’ÿäÿJ¼(¹ÌºˆBî˜F÷ÿ®ÿkÿ2ÿÿîþäþëþÿ&ÿZÿ˜ÿáÿ3†Ð!ô¶jÎÿŽÿZÿ.ÿ ÿîþÜþÔþÜþñþÿ2ÿZÿŒÿÊÿf´ø&6(þÄ„JôÿÓÿ´ÿœÿŒÿ†ÿ‹ÿ™ÿ¬ÿÀÿÔÿíÿ:s®ãþبq=âÿµÿ†ÿYÿ2ÿÿ ÿÿÿÿ1ÿNÿzÿ¶ÿüÿD†µÌȬ„T$øÿÐÿªÿ†ÿjÿVÿPÿVÿgÿÿ›ÿºÿàÿIŒÎ,8, ݦj2ýÿÌÿ ÿ{ÿbÿVÿYÿhÿ|ÿ”ÿ®ÿÎÿòÿKxžµ·¢zHÜÿ«ÿ‚ÿbÿHÿ7ÿ0ÿ4ÿDÿ^ÿÿ¡ÿÂÿäÿ0^бËÓÆ¨€R(ãÿÊÿµÿ¥ÿžÿ¤ÿ¸ÿÓÿñÿ $8I\p„–žšˆjG$çÿËÿ°ÿ–ÿ€ÿtÿpÿyÿŒÿ¤ÿ¼ÿÎÿÜÿéÿøÿ "4?B>5( üÿìÿÜÿÊÿºÿ²ÿ²ÿºÿÉÿÛÿìÿúÿ 4Ol„–šŒw\>ùÿÙÿ¾ÿ¬ÿ¤ÿ«ÿ¼ÿÐÿäÿòÿþÿ )<Qaf^K1öÿÚÿºÿ™ÿ}ÿjÿaÿgÿ€ÿ¨ÿÒÿúÿ5IZlz‚†~gF%Þÿºÿœÿ„ÿrÿjÿsÿ–ÿÝÿE°(-öÊœn?äÿ²ÿ†ÿeÿNÿ@ÿ<ÿFÿ\ÿ€ÿ¸ÿ[´.6 ð¬^Úÿªÿ€ÿ]ÿAÿ.ÿ*ÿ3ÿFÿ^ÿ~ÿ¤ÿÑÿ P ì*OV@Ö”Sæÿ»ÿ˜ÿÿuÿrÿxÿ†ÿ™ÿªÿ¾ÿÝÿ J’Ù.4ð¶z=Ïÿ£ÿ€ÿdÿRÿHÿHÿOÿ^ÿnÿ~ÿ”ÿ¼ÿôÿ:„Èõâ¶„T(Üÿ¼ÿŸÿˆÿxÿrÿoÿpÿzÿÿ²ÿáÿ^¢à$Ú«zM ôÿÆÿœÿyÿbÿXÿWÿZÿcÿsÿŒÿ°ÿÞÿZ”¾ÖÙ̱‰X(úÿÏÿ¤ÿ|ÿ\ÿFÿ<ÿ:ÿ@ÿNÿhÿŠÿ´ÿäÿ_ÌçìáȤzLðÿÆÿŸÿÿjÿaÿcÿoÿ€ÿ”ÿ®ÿÏÿøÿ([ˆª½Áµ›vJôÿÌÿ¨ÿˆÿqÿcÿ`ÿeÿoÿ~ÿÿ¦ÿÀÿâÿ0Vt†‡zaB$ ïÿÖÿ¿ÿ¬ÿœÿ•ÿ–ÿžÿªÿºÿÊÿÚÿîÿ ?\s€vaG*öÿÞÿÈÿµÿ¨ÿ¢ÿ¤ÿ¬ÿ¹ÿÇÿÔÿâÿðÿ.FYddXD( ñÿØÿÂÿ®ÿžÿ•ÿ”ÿšÿ¦ÿ¶ÿÇÿØÿéÿúÿ$<VjtsgR8ëÿÖÿÄÿµÿ¬ÿªÿ®ÿ·ÿÄÿÓÿâÿðÿÿÿ$:QdprhW?$ ñÿÙÿÄÿ±ÿ¤ÿœÿ›ÿ ÿªÿ·ÿÅÿÔÿäÿ÷ÿ %>SbgaR=$ øÿãÿÐÿÀÿ´ÿ­ÿ¬ÿ°ÿ¸ÿÄÿÒÿàÿïÿ,DXeicVB.óÿâÿÒÿÃÿºÿ¶ÿ¸ÿ¿ÿËÿØÿäÿñÿþÿ0@JLG:*ôÿæÿÙÿÌÿÂÿ¼ÿ¹ÿ¼ÿÄÿÐÿÜÿéÿõÿ.<GJE:, þÿòÿèÿÞÿÖÿÐÿÎÿÐÿ×ÿáÿíÿøÿ&2>FHC8(øÿíÿâÿØÿÐÿÊÿÈÿÌÿÔÿßÿêÿôÿýÿ "-6:80$üÿñÿçÿÞÿÖÿÑÿÐÿÔÿÜÿçÿòÿüÿ &2<BB<1#úÿîÿãÿÚÿÔÿÒÿÖÿÞÿêÿõÿÿÿ (0660&õÿéÿÝÿÔÿÍÿÌÿÐÿÚÿåÿòÿüÿ þÿþÿÿÿþÿýÿýÿüÿüÿüÿüÿüÿüÿþÿþÿýÿýÿþÿÿÿþÿýÿüÿýÿþÿüÿùÿøÿúÿýÿþÿÿÿþÿûÿúÿûÿþÿÿÿÿÿþÿüÿ÷ÿôÿòÿòÿóÿôÿôÿòÿðÿðÿòÿòÿòÿôÿõÿõÿôÿôÿóÿòÿôÿùÿüÿúÿöÿôÿòÿòÿ÷ÿüÿüÿúÿöÿòÿîÿïÿöÿþÿýÿúÿúÿ&*'#&.4,Óÿ‡ÿFÿ,ÿCÿÿöÿ^ ²›k6øÿèÿÕÿ¼ÿ¡ÿ‚ÿaÿAÿ&ÿÿÿLÿ¨ÿŠÜþì¶t7 ôÿóÿøÿüÿ BblJöÿˆÿ(ÿøþÿGÿ´ÿ*ÖøðÈ•d.îÿ¬ÿnÿ>ÿ&ÿ+ÿ=ÿNÿfÿŒÿ½ÿêÿ  &=XtŒ—…Z&òÿÒÿÊÿ×ÿêÿèÿàÿàÿêÿ27' 6><0"ÿÿâÿÂÿ°ÿºÿÐÿìÿ0<6þÿÜÿÊÿÆÿÅÿÈÿÔÿîÿ üÿÚÿ°ÿŒÿ~ÿ“ÿÂÿôÿ240NTF4 ÖÿÂÿÓÿòÿ8<".<6Áÿ—ÿ”ÿ¼ÿöÿJ‚z2Êÿ„ÿÿ°ÿðÿ0h{`-íÿÒÿàÿ&H ðÿ·ÿtÿNÿaÿŒÿžÿÄÿîÿáÿ¿ÿŠÿ²ÿôÿ(ýÿÕÿØÿÖÿ¸ÿÿdÿ ÿÿ(ÿLÿnÿhÿ™ÿÀÿÂÿÔÿLl¨èáÆ–Ž´­¤x-Öÿ¤ÿwÿKÿBÿ-ÿ@ÿuÿÿÑÿ&öÿ¶ÿxÿVÿLÿ€ÿ´ÿºÿºÿ¢ÿÈÿÔÿxÿ5ÿ¾þ.þEþuþ¯þÿ}ÿ¤úÜ»”z£Ê°r´ÿjÿ!ÿÿ@ÿTÿÿÿÿ:ÿÄÿ_“SÜê ôÞ•Åÿ ÿ¼þ‰þtþ þªþ”þhþ*þ‹þdÿ|¢’ÂçÀ¢b¶ÿ ÿ|þþðýÁýžýŽý:ýýbýþ×þÛÿ,8ÌÚ›jú‚|pN6ž"¥ÿÿ’þ:þSþÐþ_ÿ/<A3ȺJðŒ.Ⱦíÿ˜ÿÿrþNýü:û^ú®ùÈø+øœøÌù—û®ý(ZÙl§øV ep4Íúÿ8ÿßþšþHþXþ_ÿ´rlˆ<ôœDøèŽHðâL’L&ÞŠ^úÑ6ËþŸú÷Öó0ñþîþìíÁð_öÏü D‡üë9Ì;¬êy * ^ °ºöŠêŠÿDþhüËù÷£ôìò¿òêôÄø+þ‹ˆ–DÜ^`6n è ¨ ` ô r(Óþ†ûhøDõ4òCï2ìpé|ç$çÎéÎî¸ô»ûúZ š ~ ÖÊÅ«RÒÖhX`ª¦0ðÿ4{ÀxÔÿÏýLûõøÁ÷§øfûùþãt@„1¢ÿÒýÖüüúüQ¨h ì † @ F ¼¬þvúzödò^îEë<éÌçZç é}î;ömýüùOilþn * Œ PR h ˆ22’ØÀÏÿ#ý.ù˜ó®í®é~éÜí9õýýlš Ü 4 <»*’ú j ôÐ  "¡ü$õ ìåHá8ájã%æäè”íÀôªüxj —\r «BZéàÑÖÿCþVýJýþ>Iž[è:àþÁú÷4öòùÔÔ „ 8 žôú¾öHõhöÎøjüÕ¤ý m»*&' `¸üó¾èNßû×ðÕ¦Û6çqõWÜ 8 ôŽÒü®ùøúÐÿ¦» ÊÎ~A]‚P Ù ÛþFËþ†úzõ1ï è°ã`ãäèjò[ý~ 0™ „ æq^6^î ö <ÄhRptV ð¬÷ î`ädÛÕÒÒ4×ã`ô<j’*Äq2 ¢Éfþîè! þ°ü9þ&àÐÊlú¸ÚüùÔõœóXôùazm Þ õ"ŠúDô$ðdðNõ2ýþ; ¼²î<ž´’xBÖþróçÆÛ¢Ó‡ÏlÐÉ×EätòÔþ9 ´ l ” ì ê “ ‹ ¤ct|J: , T*:úôöíè¶ãDáÆâÐê˜÷¼Úûþœ Ä,>ýîƒn  ’ f Ë ‚  Ž:Nú~óÇí­è˜âßÛq×ÒÙ™ã—ñr ;ðj‚… †bƘN(ÖüþühúûúþÆ " 3“ÆþøˆñNîÐñBû´hûÊn ÕÿIùÛôÊòªò?ô$÷¶ûâ Z(¶ÆT PÿÞõÀévܚҶп×DäòNý®6w£ÿfüÍü –Û ¨Øz D ˆ Û Ý NÈlúòŒéžàŒÙÙáÈï‚× x10g¸èÁÛƒÚ 2 X‡T: ` ¨ Šðôþ±ùäôdðŽë*å*ÝÀÕ6ÓïØúæÆù² ,¢'R7 –Ø~±¦Œüÿÿrà 6º Ì öQûéõ‚ñ[ïæñDùÐAÌ ~ `ä#ùòÙïÑñu÷Nÿ¢šR±@ºæÔj I¹úsðhä Ø„ÏŽÎòÔà í”ù ˜ ­`p Å R è * ? îä,`Ê8 Æ’qÿpùòéèà!Û¼ÜHæLôêÜИ$ L Áˆ® æ j €  œtþûÒ÷²ôîðpìðçFäŽã€ætìÈó„û™ ƒrt.´ jÂ÷þPýûšøöö©÷çú.ê  Ê  >çþˆúøjùðûGÿ~ ~¢æÿ°û+÷†óÛñâò÷þã° ŒmrŽ ”tÖþ¢üãù®ö/óLïúëJê‹êÃì=ð^ôù þÝV, Ì Ôsù € áÚ˜ò¿ç– /ÿfûV÷kóLðjïoñ”õKûnŽî - ¸ 4 äù‚|nŸÜưvW¯ÿýÌúÞø$÷õþòVññ¬ò„õCùŒý•¼Ôªzð®À¼žÿÈþ‚þüþôÿ 9ZAó4jS“ÿ(ýÐûÑûæü€þxS`ÓxnþˆüDûû$üÚýýÿCˆ°v€ „ …· jüøôBñðgðNò,õyø±ûnþ¶t¡ˆJ²ä@š€(¬zŸŠDÿ+þTý\ü4ûúùsøvøDùûfýìjJ8T½rR¸†DíÿÂÿ­ÿ`ÿ¹þ½ý üªûûÂúoúú5ú°ú…ûØüHþ²ÿŒ¬:(znnv”ÿøþŒþFþþ(þþFÿ–0¾#eЈð\ÿþý¨üéü†ý.þÈþ,ÿ@ÿÿÿÿ/ÿtÿ 'ZL”d™ ªþ<üÞùÊ÷&ö8õNõGöæ÷þù‚üBÿ¦h¦VŽR¸Ä’.’‚(Þ80ÿþìüûû`ûjû&üpý ÿÔ ç¦Ö‹HÖZò¶&0"ÿtþ þfý„üèûàûüü˜ûpû7ü¶ý(ÿ*àd²õîhâ«{ÿnÿÛÿ‚úó LDz‚ûÿÿ†þ¨þÿÿÙþˆþWþSþ˜þ!ÿ¨ÿ8âŸø ,n‚å“þþ8þˆý²ü¡ûlúyùBùáù:ûOýºÿ£’ ÷VÄÜ®˜n2é€Ârÿƒý–û1úRùðø4ù úDûæüÿ&?Ž|š²”Ì#¨öúþ6ýüxû†ûüðü0þ´ÿ"¶×Q˜Û42ÿ¸ýgü¢ûKû,ûDûÐûVüµüïüÙü„ü‹ü,ýGþšÿVôgÆöŒf*⺄0”þ³ü4ûúJù¢ø²øÞùüÌþÄR6"D³Ê²Í=И¸ü0öVvf9ÿ¬ýÊû±ù øxöàôôóÇóôêöìù0ýÓÿ¡Pìàüÿž òFNÍþrtÑô–•¦þzû–øÈöâöúø ûLþñ“O»è(†,¼È : `Þ–âü&ùtõ òîŠéæ§äUæ<ì˜õ˜ÿÛÈ 3 ¢ ùâÜ ¯Ç „  â œ Ls‡d6ÿ‹üÑù”öØò6îÂëŠíŒóBüö¾ ´ ³ $ Ê @ 2£Ú¬SrðÄÌ|Üþºüù>ô0ïüêÙçŽæÆçÌê×î0ó¬ùE ð^îý > ìôŠ@ÀöJxHý”ûìûÖþÂ"pH únµüýÿù°öˆôÇôFøWÿ~ª ë ‚ AÅ0ûÌöÎõ¨ø™ýŠZ™ê\XÚmþ€ùô ïÿëvëîšò[ö÷ìõôô˜õ‘øý¼¶ DÞa h š ´ „ - r v È šR>ø!þàú÷|òxîÄë$ê½êtïøÒ ´ ò[ ‚ Ô ú˜Ì*ûüü÷×òîµé…åÑá¬ßá·æTðdú¾”Å æ }³®ž@ s È.úÿ ÿùþÈÿbëÏ"¾`C²<üöüï?íšð8ùlœ ›QF  þ£û¬üæš¹ ï?í c *(ûCö8òâîpëæèùçléÞìêïGò^öfü <hÞÞ¶¹ å Þ+\ê ° Þ ¸  @ 2Á>üÝ÷]ó2î†ç<á ßSä ñOþR¾·m  . X Õ’ßû äˆÿ7ö½ìnäýÞdÝÈÞèá~æÐí?÷aþÈèÿ?Ó ô[žÌ F‘¥ÿLüúüøMù¨ûlÿgâÝ ˜ — 5 R 7ØßåþÂùÿòüì¦ëÁït÷Žÿý¨ Üü<ù<ùôýÀxÿ\ê@ €Êú<óìfæóâ"ã׿!í¥òoô¤ñ>îî¶òêúp˜ `ÄFþŒ Ê x È ± Ü T g ¨ Sïýú+ödò”îëŠè¶çëê°ò²ü8— J©¨ F Â é ’œ€¼P †þŒõ¶ë<â:Ú¹Õ!ÖìÚHâkê>ó±ú¨ÿà $0¨ÌŒ† š}ζÆxhþXü0ü¢þð¤ J a x ßx,þùÜòhî¾îõÅýaš™Üü4øÎôØõ‚û¨&Jâ%", â¬û(ñhçÂß~Û|ÛÔÞHäHé`ì4ïnóÖùWè× ( ":z   º @2n^ïù"  ›ŽÿYü‡ùföëò*ïVìxêÌèyèôìýöê¶ °ž“  Sî$ ‹ qx¤€² f$ý,öØðéëÀærâ­à,âÄåÖêFñýöLûúÿ–‡ €Ç(åî ¤öÿpüûPû0ýz2Œ @ §Ê ø ÎÙ¦€z2ÿÔùîó¶îðìÖï.ö®ü’\ÄüÒø<÷JøhýV5 @\úžLN èýòœçÀÞj؃՘ÕÉØt߀èXòžûŠÄ ‰¡r8\J   > æbüdS ¼ÓTÿúŽõwòïÏë"éÒçéîí´öÿö ¦ð< * S\~îý †´ø0¢ Nÿ(ûŒõÐðì<çiâ§ÞËÜRܪÞ6çÃô`\ðÔʼ ü‘ÿ·ÿ8ÿþþ`ÿŠRd \b~´ `Œ8¾IþŽúõÊïVìKî$õrý€IfþaùÐõîõhúmö ŒmÑ\ú(z´á®÷Bîxä¾ÛÆÕüÒ¸Ñ:ÓêÚÜæÊôt’ êÓìä¶ ¢  n š úZåsP ' ÈyjýøóZï¶íbí’íRí;î¾ñ¸øb °ðhO òÔm_…Z f ô ö Ñ ¢*VÀþTûönïçžÞrÙ[ØÜáåõV¶B ˆ Þÿ üùù;ùúèüÊþ— 0jšU Ž ¸^Âÿ`ýTúxõ`ðfî’ðÑõ5ü¯jÔþXúîöÿõxøäýj˜ ÔHÌ~Èšvàš R°ÿ öýëßÈÒ"ÊfÅÇ@Ñ4äú DrQ,h, ÄT  ¬(Ðçuˆ @ ÞTâüþö=ñ^ì&é8è€èñéÚîÌ÷«ž ¨1Nv Þ²ƒÜ6‚¸ © â Å ªà¶â ÿ¸þHýxú´ôhìæâÈÙïÒ’Ò<Û­ì->ì€H\þý½û:üHýÔþÐ"¬A ÌÞ\ ˆý\ùƒôAïÊëÜìÖòúúV}@VüÚ÷¼õ=÷`ü%î š88|ªà Ä<‹ø¾î äGÙÏ–ÆÜÈâ×”ímL³CF d ~Ö ö 7Rü ` ” ÈPŸtýú÷óLïAí¬ìåì³íŒðbö’þå? °á àà*úè,èâh^à2ŠXQš"ú,ï ãØÐÝÎ{×øèoþºÚþP˜ ÿ&þôùˆømùWüüÿ¢à. …JKè Ý ôÞÿ4û öÏðÚìnìæð¸ø¼ÿÞ€øü øõõ£øLÿzÉžXÖž™VájØ X$ûùð4叨fÌÂf¾ÆRÙýòX F–^œŠ Å»Ä @bnqð 0 h vÒn8þnùZôð<í¨ëëRë`îZõÿë ‚x ÎnFÌ«  å8€<Ø.ÞÐ>ü¬ó–èîÜëÒšÎ4Ô@äZú¼ÖpßÁübúíúý2ˆF6 ¶Ì>® € ( tJþ­ùÇô¦ï¯ìîàóšû:Z¨ÿžû†ø ÷ˆùvþOÜ ¸`DŒú#©î  .hüßòŽçÛ ÎäÃ,¿ÀįÕ#în’bÆ6Ä ¹Q@ ´ØúŠ2 ¼ ™¶4ÊŒü4ølôƒñ³ïÎî²îvï òÀ÷<ÞòíJÈ ÌLþÊíN€Ur:Øå ³¶Ò€¦ý~ôúèâÜ‚ÒXÎÒÔ·åâû×hÄå;þXùê÷Šùäü,ŠÝ à \ò( – r pTCþù~óNîìÀîRõzüˆ.üü ù¬ö"÷ŸúÝ%Ҟ㦲&ä@ø4 ;Ný§ôÅéRÝ8ÐpÄ¢¾­ÃÞÔîH¸ зfê äx ¶ »N&(Œ ¥*ð"Žý·ù'ö:ózñŠððŽï6ðôû×t >HÌ öô, 2SüÀ!R®úœx_ªÜöþgö#ëzßRÕöÏÂÓ©á&öY ‹ \îRŠºú6øbùÈür- ¾ ¶D! 2 ¼®Ðþoú˜õˆðLí îŒòìøðýŽÿAþœûåù.úÕü¦¯ nÞ®"Æ’Í(_( êÒûdó¿èŽÜÐ ÅÑ¿ûÄÜÕVî‚êà"ô* ¬ô? è 8€ôf ¥ 䶬ÿìûDøšõô–óvóó:òò\õüû$K ¶  v4¬œìõWLúÿ(ÜðÖnÖLÿJöë‚ßÖÕóСÔ*âŽöÖ ÷S‘^þÆ÷Põ2÷šûXè ×Äž3a Ì p ¹¼ÜÛÿûõðìöëÔïönûnýxüvú—ùÆúåý Õš àÈØÕ²"åjè× ã÷ü…ôê€ÞtÒÒÇ$ÂŒÅ8ÔmëΧœ‡ Ü5B™ ¼Çðæ  4KSEÿ@üHù¢öõ¤ôäô õ;ôóüó0ø.ÿÄ9 ~¦ › Ú ZÔ’¸ìŠè"@б`Eò¾þnö ìRáÅתҨÕüáÚôj2™ŽØxÿ$ù“öHøÊü9œ8 h’|l³ ¾ \JêÿlûQö ñøì@ì]ïäôúÈüsýAýýáþt&, ì µ2Fî–´ª¢u hÐúÀòäè·ÝøÑjÇ"‰ÆÖŸíù¾È–ˆ‹ ¤Ö< < ÆX & î1‡ýŠú$øÖötöÈö~÷\÷ õ°ó@ô†øÀÿ+#   ® 0vZpúaÔ~¼·ŒÊžÖÎÿÀö¬ìÛámØžÓ`ÖâôÝxÀŸÔpÚý¢öÎóöNû¢¢D þB› 6 ( 2  '6x6ü‘÷.ò'íDëíZñyöúbûÏû¾ü’þ&“5 à¬J@Í2|, zÒÔûhóXéÞ¬Ò·ÈÎÃöÇ‹Öêì¶×Àî Î6 ~=h ‚‰…þ ‚ ñUÿSü`ùÂö‘õöx÷æøùr÷MõGõø†þNå Û È f ² øRî(š²8p+.üA HMUÿÐöêìtâjÙæÔµ×ã~ôgɇì ~ýH÷Rõ0øôýa .Ú8šá „ t F f‚ÏTü3÷tñ‰ìë{í’òè÷ZûæüêýJÿ<¢^^ N ÚN9aþð ¦Å5ú8ò\èLÝÒ\ÈîÃÉËØ¤ï5âüÄŒI F¡ Å FìšÈ v>üºþÉûù÷Èöú÷Êù"ûûÌøàõJõwø þ  l È T ÚJò'žúhÿbÿr€ÑE ô à Jäÿ÷0í ãaÚ ÕÒ×JâóÖÕdñöýüXö%ô÷"ýÈŒ Š „.Æ œ b ¦2‚ÿŽûL÷VòÓíâëüìtðÝôŽø ûúüôþ6­b D h \V–€¾ò„ï ~ìúzò0è¸ÜžÑÐÈ ÅFËPÚ$ðÔ¾j°fÜb*0†Î ìØ¢ ߦnþþÔû(ù`÷*÷Hø´ùšúlújøÈõPõ”ø¾þ£Ö Ô î Ž „RTޮ͜äþHÿ^nø  C b N‘ÿˆö\ì~âøÙeÕÈ×Hâ ó¨J$&t nÊûöõþôù® âø¦j ÿ  B òtÙTü<÷Zñ?ìRêhìñuöÚúéý&X€Ÿt þ ® ˆµép„‡ ôº&ú\ò´èn݈ÒîÉæÆXÌÛÜðz*rn\–¯ ‚&× ní: T IPHõýbû”ù´ø)ù¸ú:üèü4üˆùö&öŠù`ÿüü   T ’Œ4ÿÿÿ Rÿþôÿ؆{ ¶vÓ +¦÷&î¼äÜíÖJØ4áðÈÈŠ` ®"üUöõÇøèÿd ¸œ7‚ B & ¾Œ‹»ÿoû–öñìêìðõkùÕüœÿ6_Ö‚† 8 Ä {ÒZ(kìò ævúØòGéÞ$ÓÖÊVÈÞÍ Ü¼ðÄ_–š²à <Âk röH Ž `÷˜býúúŽùHù¯ùâúLüÎü}ûœøõ>õFùÓÿ“K < b v ÆPÿÀþjÿ 8Šÿ´þ½ÿ¬â o» X¸÷Üí ä`Û&Ö×&àÍï\¥:À† ¦ÔúJõàôÔùÜ} ¸’Ô=v * ~ ¼ N âËõÿvûAö¼ðêëûéøëð.öûóþ¼è”š}Ö|  ¯ Þ„M”þ  ähú£ò.é|Þ ÔæË ÉÎ ÜëðòP±è2²Ü À&¬Œ (\ à ûhøü’úºùRúÊûxý¸þÃþÊüFùÐõ6õöøÔÿ Š d r ƒÐ`ÿ„þ³þìþÆþIþBþ[÷L ¨ð@* >CùÀï®åŠÜçÖÌ×Uà ïkHŒh DûøõöLûˆf n ®^qœ l Ø ~ @ ¼6ÿâúFöñð|ìëúì=ñ<ö¶úŒþð¬f¢ ˆ ù – ´`bÈrXb• >üôbê•ßùÔ¨ÌÖÉŠÏëÝFòj[ž©¤¹t ‡sî z– Ç Úäpïü¤úPúQûáüMþúþ"þVû^÷KôÐôÔùlvß ú : r \\þ0þÔþ4ÿÿ’þ–þ–Œ :R] ‘”ù>ðæEÜ¥ÕÀÕœÝìný¼  . ŽYûö÷ÌüZ* Xì¥Ñ  Ú ) ö ödNœýùô|îxêûé7íºò\ø4ýT‡PܧRó ° X 6ž Ææ—z Öþƒú óÄé€ß×ÕVΨ˰нÝìð€( ìÎ óàÔ â < - yÍÐ^ÿBüªú ûÆüöþ7 hþ*ûáö*ôZõîúÁ” C r í  Ëëýtüòüæý:þÑýFý2þ’(H ÝJh> ÍhúëñbèÖÞ8Ø®×tÞì„ü) ¸&R Túxöò÷IþŸˆüˆJ 3 0  4 ‚ 'ìý¸÷9ò:í$êbê.îÜó˜ùXþ Ú~Ñpäl0 ± * ,ض½ú´[ è$=ùòæéáqسѢϲÔÔàNòP€ø+t¨ ­~là U 2  v´¾~þ\ûÚùøúyý¹ÿÇ„ýù`õdóªõ‚ü ¤ ”Fl üBTþnü®ü›ýÐý’ýšýÿš j Ö¸R¬ ~`2ú©ñûçÞ×FÖ:Ýxê@ú®ä<<  ]ûÒ÷ÈùmáßB@o" j " X ðàPTrüæöðð‰ë´è½énîøôdûŒzªîÚÛu ^ 4 ´ SóÒ † ’´þøÚð×èZà‰ØÒÒÑèÖã†óÄHAÖÖÒ¼ Y'- – ¬ ´ÂžLý–ú*ú`ülÿ¶6bíü·øôôìó9÷lþƒì ‚  röÿÑü@ûûNûZûlû4ü¾þCN 8ÄYtt €àù6ñ¡çÞîØÙàßì2úÎÞ È BZúbøûrŠ *IK‡+± b »î¸#Ìt ûõ3ïwêdè2êŒïhöÉü†Àäw®ú:p Û G ç  ‚ ,<& > nmÿxøwðÎçbßkØÔÔ8ÚÈåóô þú ¦²b æƒÓ\\ ( Ôææ¨þ‘û‘ùèùŒüÂÿóâÿJü*øêô£ô~øœÿ3p l| ü ôØÿüˆú˜úôú^û2üþ8Œ² pæ2µ –˜ù]ñÆçÐÞLÙFÙßë˜ø} À ~’ ü)ûpþïR ¨ˆ–bF„ Ï N „Kd™ ‚úhôrîÖéè=ê/ð¶÷gþ2r˜uy õÊ b U   Ê < ž B ” 2B&ý<öïÙçá&Û;×&×\ÜÝæõùšÈÇX‚ Z1Úº¤ ; î>Hÿ‹ü&ûüîþîlÐ@BüÀ÷xô•ôüø<Hu 6 – bzþ0ûëùûù;ú—ú¦ûàýˆtÔ P”,nú ¢Þÿhù«ñ¿è9àÀÚ‚ÚXàHëNøvÆ t ¿"†ü7ûïýÔÆ e–ª À â Xlïí^ÿù~óœí=éþç³êÌð|ø‰ÿ¤¹Þ*~L}¸0¬ ì ~ † ¬ T ¾ z 8Zý´öïjèÆá-ܼØüØêݼç~õ8¶NÚ¾ Vݹ‡ ( òÿ¾,ý.ú9ùÖúFþâÉ;úût÷uôþô›ùªˆ *  fÆþsûúÖùú¼ú–ülÿúXP œD , µ²ÿxùxñRèØßCÚÙßê–÷å Ä ‡Äùý5ý@*¬ : œÆú 0 t ' „ÇÓ:ÿŠùIó"íŒèIç:êÀðäøbØ  ùÞŠÞy† h † ¡ < ÿ  È hDVûõ¯î„èÒâÞÛÛHß;èõ*Š.¯†® y:šøx  ÞÙ³¤ýlû3ûkýIŒj6üÍ÷´ô õ4ù¶ÿ( 8 Ø  ^ý:úÐøxøÈø úaüÊÿ:# ¯ ;ã ˆ AZ*úBò!éfà¬ÚGÚàëNøqx Ð ÿ+ý¼ü'7 f´“† »  Å>÷¾åŒþIù~ó©íénçê¥ð ù³ä ” ÿp˜rº¦{ ” ð  1 † c º ø@ûõøîkéZä¶ß^ÜøÛÙߣè®õ îæŽ´Ã$ Y¬ÖFDBîþ üŒú(ûôýðPrðx¾üÆ÷gô†ô‚øÀþ6ü ¼ ž fØþ‹úúøÌøxùFû(þª§$ h$|^µ –\»þúø¦ñéœàžÚzÙ—ÞVéWö?RŠsì,Z¾ý Cò¾úU Í J  B„è¼þ¬øÈòæìJèåæåé¡ð\ùÉç «  „žŒæÐÀ  : Ê † a ‡ JTÿ2ù‡óTî™éXåŸáÎÞ8Þá­éöÚ:Ã<’RëÒŽ Z¬fv€ÿ#ý1ü^ý˜teZ©ýYøõÏôøØýÌ ª ÌÀKÄüXùœ÷h÷”øû”þÅQØ Âº< Ž“¼ÿ–ùòxéOáµÛÅÚÜ߆ê€÷\: ÙPz…)Ö Ì–Õœ b ( Ô –Ð$˜têý°ø óVíÀè+çüé²ðxùzð l Ž ¦N¨\„Ú+  h ¦ ø ’ ªè—ÿŠù²óÙîÚê&çšãµàâß·â.êöõÌ.uÐì.ú~Hš†ðÿŠýøûü4þ" ŠŒ^ýÍøŽõùô¹÷Øü–L¢ * HòJýù—÷˜÷/ùhüÓrt æ Ô:XŒ ð aćþôø¬ñJé,ádÛþÙ`ÞIè±ôfÿºÆ&>Ž¡  Ì ð0>ô Š ø °þ;adý"ønò¬ì è¤æÀé ñZún ¦ Æ ˜ ©zDº ¬ þ Í ‚ h ° Bô²ýlø€óvïgìžéˆætãàáŽãÈéŽô„ Ld(ì¸î ¶žö_s»þåýˆþÔfÎ Ö1eøý’ùVö‹õ×÷NüDbª|Ê”8ü¼ø ÷t÷†ùÔü/J z òA¼¶ îÖóÿ<ú2óüêãâÝcÛl߯èZôÖþÄæ8 °‰ow¤ / Ð î Ô Â j Ö‰.ôŒjüõ÷óîí0ê—é#í3ôÖü¥ò D Þ › ÚæÚ¦½r/*ÊÔ€þôùàõ°òðVíêçZåTætëþôîË ÄQ­öP!ÜøÎÊÿþýVý þðÿ   N #ûý–ùÐö öÚ÷ ü@~|nL¢ûñ÷^öN÷`ú´þp¾ P ¼ô¦ € [ Ô^8ÿlúSôîì±å3àæÝhàðçHòüS}ú§„¢ä0 ª ß {  ¯ î ‰ üµ‘fJü¤÷ÌòIîë¾êîæôDý°¬ ¼ " ¾ì%÷&ᥜn°ýÛlþûž÷æô8óTñëíÚéÛædæàéÚñúüê äõ&ø$hŽ,ÿöþ.5œîÎs <€ôNþÞú ø÷ø6ûmÿ4noXÌÿÔûÄøq÷Vø6ûFÿüdb à ¡ ¥’Í I “i˜0ü–ö†ï`èÂâà°áäçDñÔúDä( Ð önÊ™ ü l – `  ƒ £†`àêÿŽü©ø3ôáïGí¦í,ño÷èþï Œ Ø ’ €¦¸–Ð|n-bÖ˜&ÿºûùj÷öõ òîÍêÚé´ìÖóºý[J4Lô ~6DMªÎ(ÿvþ÷þ° Q K ê|‹JÿÜû&ùî÷¥ø~ûÿ)à†ˆÿUûšø¬÷ØøúûtÇíú  Æ * â » ç½û‡Œüv÷ñdê¸äµáÊâ„èñ¾ù:Õ È š êÞ6‹¹ R r x O • ^é˜FZªÿ%üøòópð’îïHòøøþ Ì ‚ ¶³=À2ÿEèdöº8âÀPþ.ü‚úcù{øœö`ó‚ï&ì‚êì¶ñxú€€ <’ îÍÚªÿ¶ÿëÿºÿ@ÿ6ÿ¼ÈˆŒcÐÿü—ù8ø®øûVþ’ã…´ÿGüùšøú(ýï””À É * J À dN¸²üÔ÷,òìÎç.å—å¦é¾ðù´I\  IþÖœ“Zº¼‚òí¸ú”ÿ‰üùŽõÈòñlò„õpúñÿÃö$ ˜öH2Ø3Ð>Fì`£ ¶(÷>ÿ®ýºü(üvûÎùæö=óÁïÞíÝîvóôú%Ê c  ¥ øøÑDÿÿ0ÿôþ¨þÿ\@F VˮڟGÅýtûöùàùZûÇýX(‰Z×þïûÈù@ùÀúºýGv¶. – â Ì B !ÄÜlý^ù­ôrïHêâæÅæ_êîð×ø‰Š ü cÔ[J:Òãz„W<6hOÿ¾ü¦ù†öþóÊòmóö‚ú\ÿ𓨖RéÜNvønwæ.¤k&V"Äþ¬ýýšüÏû&ú~÷óóðªíî4ó>úvdã ” ì ® HÈþnþ`þtþÐþÐÿž®’ö¾ÄÎ^¬¢rÿ2ý9ûàùµùúúý8ÿèhŒ|þ<üÖúôú¸üˆÿÊ–H ‡ôU U ÂJ.µæÿ­ü¼ødôõïÒë é é6ìò ù=¸Ô– nо\H ²HÄQ¤šìùþ“üÏùQ÷¶õfõdöÏø4üÀÿx¾ÆÞÄÄ2=šÝ~¬Í"æ¡tÿDÿaÿ2ÿ¨þœý”ûºø_õ?ò®ðèñöæû Md þ H ðÿ~ýùü$ý×ýÌþ(Þ®D`öÂðê¶P~jþü\û/ûÞûýxþvÿ³ÿÐþ>ýëûUûßû¢ýJîÅæxÚnàÆ òf,–ÿ§üDùxõ\ñºíÅëì ðVõ û¬F×? *Ò®Edh4¶j£Ô΂Áþ§üŠú øf÷*÷øþùªüªÿnƒ–Šf¢î Çà˜p´lÿ)ÿÿðþŽþŽý¿ûù õ¨ò|ñó4÷¡ü>¾ ìÖ `wÿþVþfþ¤þ^ÿœ$âxƒàŒ´z€®ÿãýDüûÂúKûüþHÿšÿêþÔýîü±üpý ÿh›.üM ôîT/Î2þTû0ø¼ô;ñpîCí{îòb÷Xý¸X²D Âôæj"¬ÊqÚB–ÔðÆbÿÚý*ü`úþø‚øÜøðùÂûþŒ¶BîÆ6ˆÞZ(BT­Mí[Ÿÿðþ|þZþiþpþLþ´ý<üÆùôöÞô’ô‘önúÿ~º Gw~þ¦ýQýjý þ(ÿ”%ž²BHÖ/t„Gäÿ†þDýNüòûSüBýJþëþÒþ þý}üžü|ýÿ,/æ|ó6Bî$üh^þ¤ûýøöóñ˜ð*òŒõúþþ1äÎBþÙLS¾\ì'ð`®zžv5ÿìýŠü*û%úÄùúûXüþôÿÐ0ÔÞš<ÄQ&Fb=ãx ƒÄÿóþyþ‚þÊþæþþ¢ý üæù¨÷ö,ö ø|ûaÿîmt ˆy†,ÿ‚þ^þœþ>ÿ@x´Ð«újžºÀ›TÿþýwüDü¬ü’ýŽþ*ÿ&ÿ þþÈýþÿj`FÃZŒŽ9l(ˆ£ÿ„ý8ûÄø6öàólòtò"ô:÷Lûœÿ>€;Ⱦ·^ê\v0¸4¬A<ÿÚýübû­ú©úDûTü½ýhÿ$ž‚¹x ”½ ÀÒ¢>Îd¤ÿLÿÿ>ÿƒÿ‚ÿøþæýnü´úù"øzøLú&ýDð¢t [Øÿ¾þþÞýþÖþõÿD‚‚,l4ª€ÔóáÿÅþÙýMý*ýpý þ¬þòþ¶þ(þ¨ýŒýþÿlÐî¦ Hv˜¤wåÞ|àÿþ üàù³÷Êõœô¬ô/öèø[üçÿרBè2¸¯ôV¤º“<À/“á ÿþ(ý`üåûÔû*üÓüÄýøþT•{ãä°g˜˜‰AÔv*ãÿ¨ÿ’ÿ²ÿòÿíÿ6ÿ þŽüôú†ùÇø.ùÈú*ýÂÿŽ$Æ·`"4ÿ¤þ~þÖþ§ÿÀàÔ‰ö¾Z®ü &ÿ<þý8ý=ýœý1þÂþ ÿäþ†þPþ†þ$ÿ 0ÿh޲äàN_uÿ¢ýÌû úføþö,öZö°÷úàüÉÿ?à~>ŠÕhPu¬Üöê²Yðp¿àÿòþþRýÈüü³ü0ýðý×þÕÿÚÀV„d"Ü—Z2Æt&îÿÆÿ®ÿ²ÿàÿ(T-šÿ¨þ€ýJü<û§úæúüèýáÿ®·Ç—}ÿ²þJþFþ¨þmÿzŠ_ê5D®@Øb¼æÿ ÿ^þùýÜýþ[þµþÞþÆþŒþrþ®þHÿ Ñb§·ÀÞ!¶ÎÿnþêüRûÈùxø³÷×÷ù*û¾ýMa¦³XìÔú/VfTÄ\åR¬ÿ ÿ„þþÖý´ýÃýþbþ×þhÿÐqÔò⼆Gîˇ&Îÿžÿ›ÿ¿ÿ hºÚïÿêþÀýœü¢ûûDû4ü¦ý8ÿ£* ”¾èÿPÿÿ'ÿ„ÿ,à|ÈÖ¼‚(¾RÛA…ÿÉþ8þçýÙýþDþþÌþèþíþ ÿbÿïÿ“4¼6:A[„¨¤R¬ȸÿþ0ýÚû˜ú˜ù ùcùlúüþ¤öÈNÕŒzŒ¥´¼¶–Rø˜2½ÿGÿêþ°þ’þˆþþ±þòþLÿ²ÿ$ P\Hè·˜‚d,àÿšÿ„ÿ¨ÿêÿ;”ØÜŠîÿ%ÿLþ~ý×ü€ü¤üOýVþqÿgrVØ(‡ÿÿúþÿzÿ ²K¶îüêÇœn<÷Œøÿ\ÿâþ‘þfþ^þyþ§þÔþôþÿ>ÿ’ÿˆó@jpa`‚ºäêÀZºìÿÿþüüü3ûÆúðúÃûý¸þ>v4j/¿V !<LRH&ê Pþÿ²ÿrÿ@ÿ%ÿÿÿÿ ÿ6ÿ\ÿ”ÿâÿ@˜Ø÷øçϵ›Z Úÿ¨ÿ¤ÿÎÿb¯ÞÖŒ aÿ­þüýcýýýˆýJþ/ÿ ¸ Øfüÿ¸ÿ¢ÿ·ÿöÿYÈ(e„tT*Ô™DØÿfÿ ÿÑþµþ³þÉþôþ(ÿUÿ{ÿ¬ÿôÿF’Ðø BhlFüŒöÿBÿ€þÄýý“üLügüöüåýÿ àe•x2ïÊÅÐ×ÖÒȰŠ`4Ôÿ­ÿ’ÿ†ÿˆÿÿÿ–ÿ¡ÿ²ÿÌÿöÿ,_‚Ž‹lXB,ñÿÒÿÀÿÈÿîÿMr‰‚V¢ÿ8ÿÐþuþ<þ?þ„þøþ~ÿùÿTˆ‰Y Æÿžÿ˜ÿ±ÿåÿ,z¼âèàÑÀ®Ÿ‘zRÐÿ‘ÿbÿBÿ0ÿ.ÿ:ÿSÿnÿŒÿ³ÿéÿ#Tx‹ŽŒ‘¢¿ÔÑ´„Dõÿ–ÿ.ÿÄþ^þþÔýÜý,þ¸þbÿ„Ôôè™xz~~~xfH&éÿ×ÿÎÿÌÿÐÿØÿÛÿ×ÿÑÿÌÿÌÿÖÿéÿ"<LQNF8&îÿÞÿØÿâÿûÿ<T`Z>Ðÿ’ÿVÿ$ÿÿþþÿPÿ–ÿÞÿCRG(íÿèÿöÿ2Tp~~xnd\RE2üÿÚÿ¼ÿ¦ÿ˜ÿ’ÿ•ÿŸÿ®ÿÂÿØÿðÿ $8DIIHJLT[^WG0ñÿÊÿžÿtÿNÿ2ÿ&ÿ0ÿTÿŠÿÇÿ.JWTI;0*('(**&þÿöÿòÿðÿôÿøÿúÿúÿøÿöÿõÿöÿûÿ ÿÿüÿùÿøÿúÿ øÿîÿæÿßÿÛÿÜÿàÿéÿôÿýÿþÿüÿüÿþÿtkabber/sounds/default/disconnected.wav000064400000000000000000000425141477701321300201770ustar00nobodynobodyRIFFDEWAVEfmt +"Vdata E©637  Ü}zÿÿÀþ¸þßþòþõþüþâþæþOÿ‚ÐëÜ&=¶È|{ÜŒÆ%ó‚…Ýü³¶Þð:²ÐðšE&â·ÅÓþJý üøø&õÊñ˜í4ê2ìô’üôsÕ  Ö6H¶f ¶Ê¼" eÿpþîý˜ýÆüÆûýú^ú¶ùÄùŽûˆþ¹RZ@„@"‡ý‘û4ú`ùŒùNúòú–û~üaýHþXÿN2ÊøVYæ””õ¬ŒÈýzù õöñ(ð)ïÐï@óˆøþX0ü™ó@ï¾ö͵ê ` )á>ÿ&üüÎýÿÿ¤ÿobDjÿÀýîýJþûý/þXÿÞÿâÿ_nÊÈʽT ,6@J†k´ýPúÔ÷9÷÷ ö2ôÒò`ó‚ôüôö|ø]úJüyÊt  ä  E –ú6ÞZCS)"ý°ùƒõTò+òõú6ØÜ ” À < š¨îbÝšæÔþÚ rœÅR z*øÑñ¸î¬ímì¨ëTî4ôðúXöÇâ4  u G  ÙÔZ&¹V¦¢ž¼ÚP`k4ÿàýÜüþè¶UºÿMý°ùöYôgôšõ5÷|ùü-ýòüúý¼RäÄ$ÆÄ\ à+6Ž ò b -DÔüT÷úñ°ì^è‚æbç:ê0íÖîêâáýçOún Â(¼ ž êü„üzþtOÚ7ú<PÿBþ•ý¸ý×þ_¤d/äoï8á8ýèøõ¦ñ˜ðCòÐóõ'÷ZúZþ®ÄV“®²ÚÎý¼øªôNòóv÷JýþTb¯“A¤æ÷$" o Ž 4 $ªPþ¾øõpóÉòNóòô<ö~÷ãùãü 8ëHœ öŒ‰hý¬ùÁ÷€ö0õ£ó òÜñºôìúøP‰ Ø Ü *|˜¨bhfÉdXSp³ xÈÿÿRþlýÒüêüNýlþ÷àÅŒ¿>jìëêþöúÁöØòìïÐî\ð$ôøÒútý€/ªæúJ^˜`dv  ç á ä ‘ * Ný õšëá×ÍÔbß›ð$š ¹@,¹újìä¼ç ñzû²8Ð œ ¢ê ä Íüö‘úýHúîø.úüòü›üðúzø,÷ÌöŒõ¬õâù•Ξ ž¬®aÿÕüvû ú–ùºû>ÿ ¡›þöû¤ùzø`øÚøËú<þFIE;Íì×~4ížÔPDØ~.xìÔhdúøòØíë”ééé@í óˆú:Ä $ l ×ýD÷mðOë­ê©ðÄúXæ ŽâŒb Î ´Ìt:&øÿœþ¼ý„ýjýýgüÖüéþšä&ŒPÞsÿœþ\þ½þÐÿÁc¬¼ÌµPèÖüWø¦ôøòbóœöÜûOЈTZ#,ýVú¢øù(ûÎý`Žèߨ ö t ú R  ` šý·=eJÄ@ýNù®õFòJðñô+øü¼ýýTú¿öNôóóZõZùiþŠŒ,6È‘| ÄðþPøïJåKÝBàŒíÆúÃÑ GH’ ÊÝ>´ŠWâÔ4ÿœüxù\ö°ôGôXôkô0ôõ0ø¶ûÄþŽWÅŒm 9 *ÖjŽpÿyü{úúuûÊýÚÿÜ}´ä¦ÿhþ"þpþÿ`;ÞtâÀ ^¶ t‹mø%ïbæ—ß„Ý^â\ì’÷4Jk Œ 8 Z ëç£|þ¨ý¼þº¾QH †¢®(þ²û'ù‚õüñŽð>ò>öŽú þ.àZž † ¨ º ‚ Æ  ^ûö8óžóíöWûŒÿÌÊ6Žu ¾ ÿhÿ*ú>Pþªû,ûCýf¨lTÆ(¾SÿôþÛÿb•jdD ú  ¿ ,M Œ br-üNø`ö†õ¶ô®óbòññØò õ÷Fü‹Çí ¸qýÿïÝÝ)ÏÄÒŠé´Ò~ÛëXÇ" &•þmüBýmþÍþ ÿ¦Àh²e¢°ïþ–øôñjìåèlèÚë`òËú~0 " ù î ˆ 䊓a:HLýÖûÅüTÿ:>Âþ þsýü"úÒøQù·ûèþ Žbd^Úª&ÿ˜ûàù<úŠû:ý&ÿš´…ªT—ýøIñ$ë/è>é0î"öãþe  † ÀÆH±ÿˆüúd÷cö¿û¼€PêÐüjú.úû‘ü¿þA‘˜ºa¸£Êÿ.üòøføzûðÿÆà¶€lþ’ûÄùœùJûþÑ-Ž îŽð>P¨ÿDþÿŠˆ>FÈNfzÿZÿ^&ŸZbþÎú øúötùdÿPA L½ ~G` $ @øhëUÜhÉ ·R´tÆûãÎk| ¬#!°ZÌ ~0üõõ@ö‘ Íl~C… …$þðô'îDêÊçƒæXè6îxö­þ>”ø¥0 90`Û #ý<ý$ÿªÞ8®ÿµÿ®ÿ´þGý_ü•ü”ýÐÿ|¤Ñ €Ž0ÿßûvøbõ>òïBìÌê"ì•ð’÷xÿJŸž`€ Þ:–,x ª·ÿPøzñ¾ë÷çØçìÐóLü„·„ÎMlYHþ”üäúhøöÊô˜õùÃþ›öþ ü®ú—ú˜û<ýèþ(œ$ÿþþ0ÿŒh° W˜M¼(øü„äËDTÿ3üìø€ö÷3ûæƒÂÊX»ýÜùfõñßîñÈö·ýVÀ œ  Ê × S*é7ýh÷êìêܸׄåÖø¶byÀ­Z)~Âþ‹ö<ð‚íŒî—óˆûO "Ö Æì5÷¸í‚æDâÔäÞïÉþ> œ\‡ iËÆ\®þ þôü¼÷†òºó4ü@Þ p n ›ÊÔ¥R |r">¸™LôUÿóüâø‚ôGñ9ðˆò™ö(úºüþuý¾úçöôóDôÊøÊÿð  R ö ¯póœÑªTH>X椢zEˆý²÷:òÓì”è/çkéïŠõ"úŠü¨üñú>ùù‹û¨ÿ'¾sÿˆûDøpùjþ’\ð­ôÜ¢šÿòü\ü8þ,³TdBÍ@®Æ9ìýü¯ùpö¼ó‘óªõÛ÷pøô÷2ù„ý/š¤ ºê  bPü”÷ˆò[ëLàNÕ‹Ó«âÈùÊ œÍ‚›Ä +q(´þ$ü•üQ\ o õ ß dL—ú.ó:ëRäòáÕãÒçªî.÷ ÿ˜•  ÎNêâ s ýBúYù úþÄÀBNyý¤øÝø ü–þ: ¦?€úˆ Œ¨ šÚ¦ÿ¨ü6øÑôêô(øTü2Þ jdDˆ¦ÿ8ÿ¢ÿöÿ’ÿ¬ýdú–÷š÷"û Ê >Œúþaý†üwýòÿp®àW¨èȰ´v?cq.ü únûgþÎFa‰|þ£øòïìå£ßÈà¼èÊóiý"ìî î = ² 2 (`·¾îÿ¤ýzücý7,À Xª®¯þ­üQûÊúlúŠùm÷Jô òŽò6öûäÿeÄ T3jG Nü÷¤ñéRÚ‰ÒvÝ„ôªšId€ªÆ <1¤~ÿ ÿ<iÖÿÿÚýZû<÷”ò>ï*îÎîïÁïWòÈøØ1® 6Ý’¤8F Î k šG‚K¥é=ü8÷ óTð*ïŠðÀôØú˜a ‚ 2zûùú.ûüÐ[  Äþ‘øàóÖðFð¤òø:ÿª½$Nb ª w Æ \  µ yÝ\ªèþxüèøþôÖò¶ô ú@ÿÊ$Å>Ç72¹ð tî´ëûnõ<ð¹î–ñ÷@ýÑ„“üb’þvüFü]ý ÿôé8&ÌChêœâÏ êšúÈóïcîšðžõšûæ·žŠïO"ÿÐû®÷öñÀìþé$ìõy® îD¥h ‡rû-òìÎê¯ê^äT×’Ò¼ãvü- ½¬©4ÖÍ °ÊDÄbŠ­‚îÀ ‹üù÷òšìç-ãçãÐè‹î4ó¾÷šýz (Þž : r   Cä+þœÿÜþÞþ†ÿ8åë<“* f  È õ Î`ÿøXïzæÿÞËÚ2Û¨à‡éRóÚüP<  ŒtÖÿbÿÒlH «k F ëîäÿ¼þ\ÿÚ£;&-ÿ€þDþmþõýü²úùù&ü¸ Lf Ö‹°ú~ôbñÌòˆö¼úÜþŸ"'þòûEûüIÿ ¤¸ ‡"ª…ÁÌ®#"ýPûÌýf’™ÎýmÜ„löý øÃñìëYé ëÀï:÷f¤ ôÜû 䤥ü^öqífßÜÌlÅ*Ó¬æâölÔtƒR¾ ¾î6ó$»Z0Ä*<vÿªù¸ó îé è%ìó¯úaÖjâ 0 ¾RþHüaýʆxΦhÿ”þ<þªþÂÿÉÿ§þšýÀýZÿY¡@œtpT8X®ÿ`ýú¶õ¯ñèðnõ‚ûªÿ¦]ÿvþ ÿbÔÿûüPùVöhõúöÉú£ÿfþè q Ô ªOÿSýbüuûÎûþXá@"©ÿÐþÒþþÐýbýDþŒÿøýBøfñnîœñ´ù.Nœ  À Ž £´þVü{ûdüþÉ~[k\0ÈŽ, j Ï  ®J°‹ÜÒý“úòö‹óöòJöøûèÖ»1þnù<õrôœølÈ*F ß Ë"NÔÿ þ4û×õ¬é5ÙüÓ#ãØøÄf ]ª‘ @^ÿÆûZýåÄF*š¶°Žÿ<ÿ„ÿšÿ*þ0ú.ô€îàì†ð÷¼ý>ÑcŠÆßnP<ºäÒZxý²ú úfùÕöŠó\óð÷ìþŒJTôíº*µ.U"Џ„šý-ûèøìõ ò=îQíBñª÷9þ*üŒnà²þZý†ûòøØ÷~ú‚ÿOTâOÕ²Kò: & FfZþóúôöNòmîŠíLð«õü ~.4›ûøóò”ôLøbûZü„û$úHúƒü¦ÿI:j^Ø2©þPbòŽ Û   V  Ì,žÿÑý·üÞûÚú|ùˆ÷èô¤ð#êÌãã2ë|øž FdôÊ +öêe¾þtúfóEèÀزԬä„úZ ĘYF–Ò n öD~ú£Öváþ¸ûÆûØýÿâûôêˆâ¾ßÝãLìö ÿúB @ À ¾®ª>pƒ6+®1‹²pΫÿÜþhþÔý¼üNúüöªö;ûD‚ ‚ , „x´…ÿAü¢øÂóïnîªòùøªþ-6®±FþþÁþ’ÿ&CR ¼¼ÎKÿ=ýæúF÷ÆóÐóBøþ?æÞ&ÅùŠøÿjÿÿœÿ8ˆÞŽéþšû5ú¯ýböÉ rEýzõ¦íJèxætèœíÞóöø–û‚ý(ó” Ž ^ ÜòU ˆ > . ä6xâþ"ÿ¼ýêüFü&û0ùâõ¥ñDî´îéóTû,JT ê F¤üXûðþN8 ö z âòÿðöÁì@âZÜþâÊò«e ö¦& Ææî.¶4ø:têRþLøºð³éÔåÎåþéRòªûÛr¦WþÇPd zÉžÑ 7ÞÿBú²ö\ô–òKòô;÷6ûÞþ¬’|Ærj.hDýÇø±ô#ô2÷|úÈúNù2ú<þ¸ÙZ y†)ü$ørö÷²ùžýæôX Ð  à Œ ® ˜£(ö£6ÿâýLü˜ùÌõ’ñ„ïò÷ýµÿˆývûxùßöÈólñKñ¾õšý¾² x”† âLÌÿ<üÿù ùYù˜ú@üæý†ÿ4¬2’þÅÿ\ýœþüâ ‚  °fÜüjùn÷S÷Œø úÆú°ú¬ù0÷$órî>ëJí*ô”üL&b 4 ¼ ä<°ä| e J ¯ TçýÞøŠ÷ùôøœôNí[å¢âðéxöJ© ì†æ N ô  Cb–±ýßùrõ¶ññàô–ûfËà2j£úŠôrï*ìÇíLõÚÿ ®ªgŽÁ õîµn)Põ¸•,WJ¶7æôÆô´ûäôØî¨ìéíÐï†ðNï ð&öÐþž´¨„òÿ’þþ´ý‡þ*A< F Ê Q ^  ÷°Çjƒ–þHþ ÿÿíýXü½úØø‚öó†ížæ*âZãNëòö ËŽÜrw ~ â~çÿ¬þ^þhþTþôý’ý¹ýHþ¨þ¢þšþÿüÿ&VvœP4ŠÉf¾ÿUûm÷œ÷kûŠÿ}ÖOþ®úÆöôòÕòù"ðHLæÜûäõò-òÜõ üiÀ 𠸌‚ð õ ¸­d`2þ®ùðóÀìTä4Þ—Ý$ãüíÀøÕh¬ ð â Û DÚûô¸ï$ñø¦ÄF {²d ƒ–ËüYú4ú°úû&ü…ýNþŽþÏþÿ‚þhþf ­>üxz ^ÿÕü¬ûû\úôùÐùØùðùjùô÷Šõ®ò²ð%ò.ø´ ‘>e& ¦ÎÐýÛû0ú¾øù¶üäÏI^Âôý2ý¡ýÿ,¶ Nhn}‚ÿýúOøÚörõóÖïÈìbíþò¸ú¸†\DžÿÖû ümÒC Š ø å  X°ˆôPØ®ÿÿ@ÿ¸ÿ4õü&,²‘€*ÏRrn!ýþøðó¨íTæ ßÜ€á­î>ýè*µ" 3øýl6 Ðš~Øc¿" Ì l È‚ F Û¶ ûàólíç¤àjÛzتØ\Þ›çïòòäòôñŠóóù› î vDç > dí2d#¦üÎÊÿ.þÞüVüÞülþºº@PÀ cý<þ¤X”˜öý*ú(öOñ$ì„çÑäºçð®úý Ê °e ô ?\V<ž îÉ•¢[¼þ"üÆø*ö²öMûÆðN ê Æ o  ˆ~ÈÞÆ»ýù8óvíRë¢îîô¤ú’ü!üZûsúáùÈúýÎÿ`°§õ ì@ýfø²÷þþ€D__E ‚r^œý»û|ûÜûlüýþwÿÜ58§þ„üYù*õvðïõ¦ýÐì ¤ ÄÔÙþ¿ùgõSô‡øËÿ. W v2¤ù´¤ÖöD˜TįŽïJ*|¤ÿœüÈøõMð»é áxØÓ´ØÇåXñ<ú6A8hG| ùäüV÷(õæölû»#<f k è úVäà5:ÿ×þ"þdüú6úîü¶Z4 f üÅþÎù¨òÔéoã*á¾ä€íÞöóý¨@ê R  ò¦zG¬Ò\•ò-˜!XdØ.*ÿO®„>öü úv÷Óôò8ñôvújÿ,nüH÷òòîáñ4ùLä€ \ z l½ÿ<þþ:ÿLf²êÎ YV:î‚¶¶2öû0úaú&ú´ø}÷ ÷æøJû³ýèþ´þæü ùôîî íšñËùp ˜ ÄÚRÊ áœ,vH¶ÿ+ÿþ¤üÏûªûnû^úxù¼ûváe ö  þ ÆÆšô üœ Öûöjï=èJãÒãˆè>íï„ï"ñ\ó6ö0û”$ä ¸ : äø`Ûv­hLœ$£ ^   {¦ÿ´þsþSþZþœÿªÂZ®ý+ù óàëøåUæÆìôôû—ÿL;´üùÎø°ûtÿ`^Øk\.Š<r" . ºÞ>~cQàˆÿeþÆýþ²þüþÿáþ¨ý¨ûPù„ö ò¬í‘è%æ…ètïôù×Ç Q  ,òã¦J:¨j‚}ùšHHºŠs0ð: ÇÐ Úÿšýöú,÷àòð ð,ðÀî_íŽïêõøý» î <D× ~ ! öá:ãýü—ú*ú~ûtþ_YZ î ñ è´Ò[ÿWú÷ ødû|ýìýÉþÿM1äüCûZùjõ/ñºðnöãþœX r Tâ ýbõYîgêëiðbùŒ éÒž Ä < }DJ¶ÿ<ü¶úFü€ÿ—ÔÆ6YÊöýXûTù ø÷øõ0õXôVòqðñp÷t œÀ»¯ ™&ýÔþ…þþÿÈoRÿÞúíôJðvïÔñHõùŠþ ´h  V ¨ÔüËþÝüŠû úúùöãñ'ëZå‚å<î1û¶B ª Ï ´ H<vûø°ö÷zù¢ýÛà‡Ò Nüˆ6°r6’(–šEZ(´¸*Úþ û’õØîŒééPîŸõÈûVÿöÿŸþVü(ûbü"ÿRZF $ a © Ú>šIƒ!ûÏÄÖ~‡T°;†Þ~ÿƒûðöŠòûí!éVäFáãäëäù4p˜Fðá D´Üý6úWöèòXðòïFòøõûDÿ‚|½æQ m  œc:Ð HŠûfõ}ñpðúï îGë.ê¤íjõQþOv îœ Ù 5D†òüÔ¨]üÐŽ(|Èÿ>ÿ^ÿµÖ2vþ2üúùŠûüþFDªx‘ÿñûø¯óZðWðô|úÔÿ:¦Rþxûªú*üØþB¶‚¨%vì²Øþ4ûx÷»ôèòôøæûÿ&š/Ì{Þÿƒÿ1ÿ¶þ¢ý ü•ùXöøórõøúj£Ú Ú p *ýÿù€øWøÚùìü2®Ž°ÿFþKþ’,Îb º„hF(fþýLü6üýDþRÿÂÿhÿúý-û÷BòUïñp÷ÿæV ²¨ ì ] â| Ðÿè‚&ÑþTùŠòÄëÌçìçFêdðjøhÿ|D +pæ Ä›þlüîýÓM!æÿú–óïXïŠóFølü¯ÿöªÿ!ýü<þivþ Z Jê¤Ù ¬ ‹è½Žÿ ÿnÿ”ÿEÿþÂý>ýý|ýVþbÿ"â.PŒ²¨Üü\÷!ðè´âÇãüê7õnÿbî ü c ~œ^ ”˜²ª$ ö û ‘ J´ ª * ØyVþâ÷òîìPéÐèNëêïÄõ'û·þ‡Zþ¨úš÷Îõ²ô$ó ñVðÂótú.z² dX~ "°:<þFý+ýˆýÐýëýBþäþ¬ÿ¶G¥2 æ , >ü:ÿÌûtødõŽó–óŒõÈø?üêþhµ§ÿãüâø—ôòàóÄø°þT†È ³ šÐNÎT:àt¢ì È  ³ à ¤-ú(òoé ã&á„ätì õLüAÍXh x G ÞÏ×jþDøò¨î˜ï¬ónùuÿáÖŸ } V ¨uöÔù:µTñArRQÞ°þ.ürû*û°úXú>ûxýÉÿ^šý$r˜S<þÂøÊóÜñºôŒú‰†ñ( ( êeT‰|þbügúäøQø‚ù`üÌÿ,^ £ $ ¼ ‚ Búl þ¨üÐûXû%û(ûIûü‚ý°þ:ÿLÿºþèü¢ùjõ`òjóÚøµÿhöÞ CKeúŸô„ñQòöû~_¸ þ # Ô:¤=2Ffÿæüûàù|ùxúÞû‚ý¬ÿ¢¢¸FTôÿ.þ—ûå÷fóáîÄëìSðÂõnûŸ6 Ñ M Ö]„,³G± ¼ÿÏÿA’„¦ ¸ ” $ 4þð¦FþÖûùeõvñXî„ììŽìÞìjë‚çþäçÂî+ú˜Ÿl  íÄl û á  þB$Ò^ÃüÿütøæõFô<ôõø˜û}ÿ5 hé4ülø ö·ößúáÿŒ‚ýüÞö òðòûöÊûqn"Hú8tÜç \ É – ŒyÚ®IYÿ1ÿÄþ–ý"ü‹ú4ùÞøÜùFü¦ÿ¶ÖÁ°h·–þ2ùFóóíÂê,ëµï€öŽý’Àñ n • í%²ªmV½jʈ  Ù R ª F¹úâó¸ïaí¤ì*î¨ñdövûòÿLRÀ\2ÿšû*÷cñìÌê‚îlõýýnÑ { ˜ 2 Vô>.¾ø0 ìþ¢üÚúfúû›ü®þGû§NÿÄýüüJý’þ8ö¿†Z( J 4 < iÚdþH÷„ïRéþæ’èªë}ïŠóL÷û6þM©þÚýFý_þó¶Æ_ t $ø ` 1XÄëþQüÈúlúæú@üyþð\CB@Œ4Ôüß÷Zò¦ì6èç&êüðŽù_` G F ß"þCýíþ/2 ƒ ¢ z £í…/¨·°ý1üüËûFûøúŸû@ý ÿZ#N¦ÇH殚ˆâüƒøéóñøðšóÈ÷ÎüFf À DOìÒu“\*ž@Ñ"Ú2HˆþdýEýÞýâþ` ü˜šÐ‘ëÕúnõÐðîàîæò©÷rûíýÝþ~þnýtüüjüÐý”ÿH"†<0Ò*JòÜþý‚û¬údú”úQû üVþÎÿ–³26ÿþ-ý¾üÃü›üPûù"÷÷øù,ÿX°n â } ˜®>ÿ'û’÷Xô’ñ2ð>ð{ñjôDøüú¨ýîMÒ,šÖç`õ»ºÿÿPÿ¡î È£ÿÌú.öòåî¤îõñê÷xþ»æ À 7 Ü X ²dËZ纆†ù~€2<TþZû¦ø2ö0õÞõp÷®ùFü¾þ&ܸ¬¬>6D.ŸVæúÚõˆñKïäï´óàùöx¾î:I8bàÄnb8HZÚ  ÿ>ýíû˜û_üfýþŸþ]ÿIŒ$òÕІ֣Édÿ6ü¼ødõ˜ò¾ñÈóøý22 hÐjÈŒºXRø~fÞnh(Ff¤cü#÷XòRî@ì-í ðøõ.üü˜£ ¼ :®ÒýÜøbóZïí®îžó!ûÞ´Ü , 06y ÂÐÿ xØ[|0XüÎ÷óbï î±î–ïôñôõ‹úñ½ ì C 1 Ê ¶ —Å„øýúö¾ó€ôÂ÷Hû+þòÿÊÿæýÜûtú´ùÆùÇú¤ühÿQè&ÀP ú ÍÁlŠYÿ„þ þGþÐþ ä¸üÚʹ(Ø–ÿ4ûÅöeòîîíbì íBïôò¸÷„ü¨NšFnFðf,ØŒ Þ  ~ ž–Juý ûÌùbù†ù úZû’ýg=³Â¶  ˆ  à ’Nnþúù õ(ò|ïèíSî¶ðžô‚ù‰þ„º¯IN>"ÖŸ¢™v<K[–¡.Ñÿœÿÿ–ÿÆ¢âI¤¯›:ÞÊzUbý–ø{ò ì³æ4ã-ã-ç*îÌö.ÿŒ‰ d z  ,ÑlÂ7) H X 2 J´_èEöþZý<û\øPôÕïëõçØæŽéˆîŒôæûòc‡ Ä  —¶ÿqûàøÏølúªüšÿ‚Z©ž rÞþÀý¹ý±þìÿ*ÈʪŒÊf—*DþDüŽúJùŠøèøˆú®üäþærmª8 ˜ý¡úê÷÷î÷šú>þÖÇ„m®­1þ|û¶ù@ùú.üeÿœ0!"Ü~uxfý.úTø$÷âöÞø×ü,`ßÜj,¤5á„þþü˜û˜ùZ÷>õô^ôöõù”ýŽ<• %  ¼ ¿d_6b;ª·T;ÿvþþàý–ýlýdýzý¦ýÓýþhþÿvìNZ$°ÆÝ š¢þsûøªôtòòêô>ù»þ¡… ¶ æ Ô  ð – tH`û÷ƒóiñÌñ ôr÷=û‚þàs8"N‚@´Á8úJ³Bþ*øÎñìlç˜åŽæwégï(÷’þ÷  ¶ W V Rá ˆHqbÿ þý)üpûMûuûøûÀü•ýjþÊÿ¢ò9òž;ñŽaÿ«ûø¾ô7ò‰ñòòîõ®ù¦ýøÌ>Ìòݨÿ¾þvþÎþ¾ÿ„Hfž›g}ý*óýXù*öøóžóFõšø4ý Z` Ö ä ± ´2ä9þþú²ø|÷"÷Œ÷ø®ø®ùÕúÃü¨þðÿÿèýýöý…þÿÔÿ0, žb¶ÌdEï§ ‚.ð¾¼ÔèÿÐþeO]ZDþÎûòøèõ¢òVïÆìì£íÌñ‡÷¬ý¹äSð$DÂN„¦^Æ]·‘Ä: ³+.ï–Øý”úzøèödöø¯ûöÿÔ(âbE¶¬ü÷øøõšó}ñTð…ñ¼óvõÆööö”õ#ô‡ó"õ&úujñ +  Î ” Jè ˜v¹†\ÊA ÿfþ’ý ý8ýoý$ý[üIûTúvù–øP÷°õtô‚ôƒöŽù.ü_þâÿ^"ÖÿÖÿ2¼-¬6¨E¦û <PQˆ±Z€ô^§x¡¼l’6qþûj÷ óïìLêÐê’í`òhø2þ!”D`ÀÒðÍÿÞâ6²r¨Ê‹ÿxþ*þ°ýfý’ýzþàÿDW6SÚF–Èrê4ùÿpý4ûžù‡øt÷öàôãô§öú"þ ¿Tt ,þþþ>(Z~nÔŠ Uÿõþ”þjþ‚þÿ:ÊDÙæ¸ ^ ˆ ó ²ö ˜þüøióêí^éçKçê'ï|öuþ¨Œ 2äÂG × y षý9û>ø³õÀó³òøò&ôDõööøšûºýhÿºæ$N4 u þ @ ; ª A ÞI¦þ4ú˜ö_ó‰ðÐîÈîñåôùøæüZ3€@ÿ–¸÷® P3þlü8ûyúüùÄùíùŒúŒû üšý¶þöÿ@ åÄRÂõ¶(¶ÂÇþæüêúRùjø.øù$ûýJþþŠüxúeø÷u÷Œùgücÿ::îˆ`Ìu–ÿTþ–üDû[ûúüYÿªðd ÂÄh£2¼ùáJÿJýkûýùZùÜùmû|ý˜ÿäN®âÝæÿTÿ ÿ8ÿžÿhÄ!Š®–Mø–ƒéqÌZÌD‚[Dz oþý’ûúŽøj÷¾ö ÷»ø¬û2ÿ@Jþ§ûùN÷œ÷Îù3ý/¢Ž<  †¨‘ÆF÷9’`ÿýðú¦ø.ö”ô¤ô†önùüþ> ƒ¶ÆÿDýPûúlùíøÖøÔù üëþý“(PÿÉýÀüCüBüÂüpýbþ²ÿ@²äꜢî¤"”Tÿ²þ•þŠþjþþÿDÿ$ÿ¢þ¼ýtüæú.ùh÷£õ(ôæó>õ¸÷ ûÿöñF ¬ Z ¬¾¯GçB7ý ù\öôDó2ôœöúùæýÖ–¦ì¸ÝþjýÊüªý­ÿœ$Üðýeú ÷RôÞñ(ðöïêñ‚õŠùÆýîÂÿ( > z 4 † \ ¾°]r$æþþ^ý+ýnýîý^þ»þEÿüÿØìæ‚æä¬Ã‡ÿ#ý.ûÎùÚøxø¢ø4ùäù^ú8úŽù8ùãùlü. ”Ù ò S ˜ ~ Ô ð Ü€TȽ þ³ú’÷áôÆóÀôC÷°ú2þ-4HÏîøP>Ú½Òîx¬rðêÊÿývùìõ8óâð˜îÎìíúï¶ô…úš]  î B ¼ ® ,¶„ÒØÿ±ÿ*¬á¹frÿOþ ýèû û¨ú¤úûàû!ýøþ ˜ŽÖRòí¢ÿüüêùìöšôó|ònóâõwùxýxÞP|tuøH»±<©vÝÁ¢NtÄÿ ýPùšõxò7ðšïèðæóVøƒý:Ú,( ðv²ý*ùÛõzôõùWýD+jm°˜<½jÿ°þÂþFÿÒÿ4®I®:œ×ìÀ.=sôÿ™ÿ<ÿäþ ÿ¤ÿþÿF´Bˆ^ŒÉÿéþ.þ|ýºüü‡ûÌúúÞùØúôürÿP#*]ؘ†Ä¶©HÿðþÿPÿÐÿŠF/0w“©RŽÊÿ¼üôùÔ÷{ö¦ö ø”ûÿoûVi~(Ò¶Ú?Þÿˆÿ6þàû`úKújûðýzy¸=‰àùÿ<ýDú°÷„õÿó‘óRôúõŠø¥üÔ_Ñ; /µt6üúZ3­TØÝ‰2–®·ÿÉþØýý@üfûcúWùhø¤÷÷^ø?ú¯üÜþr@8h,ÿåýÜüü®ûòûýNþDÿ&Q„‚¢½m 9˜BÍRÖy¶¬ÿ…üÆøõRódòóÕô2÷“ù^ûküý®ýèý`ýnýÓýþ^þ7ÿhÕ6úVÿjý€üÈû¨úÌùú€û ýGþdÿªe<ÎóþD u  Õ  îÒN?üØþ ýbû®ùBø÷äõ6õbõöL÷vù üjþ„6ŽÝü(°ÿšÿøAš£é{ô‰šòbà0|\¨. l + L – DHÅÿfû÷òòlðð‚ñ<ôš÷ªúýqþpþ7ýûCøö2õ’öøù™ýæ„ý¤ˆÞlcøâvNç&ZøõÇ+W´ÿ"ÿþ°ü*û¸ù°ø*øHø¼ø<ùú8üŒÿgè q´ÉV«þ ýïûûXú[ùZø½÷®÷«øû!þ ^,­ÚáÔÔ4"vþ¬H²|–<®ÿ þ¡ürû¡ú’úgûÂüRþÎV@&dŸÿü¡ø õòüï§ï8ñ*ô¬÷XûÓþšl~àºèAàÍ:ßÛÜ Î ›XJèþ#ý°ûÐúû*ü@ý÷ý\þ®þ5ÿx¨ô\ÌðÎuv(uþÖü|ûÂúÐú†ûÇüpþ(Öœ¾¦r>äVœÐ%’ÿîþJþþVþdÿª¹<bu‚¦BrÖeÿ¾©vø2ötâõPüÿ ý®ù¯öNô«òøñ„ò|ôÄ÷ üˆÌÊ“k«¦˜ÅWJ&í@š˜ jqSÕÿÌÿÎÿ¢ÿ,ÿ©þCþõýþzþVÿž$ÊPuûîd^Ý÷õÿ þ8ü°úfù{øÞ÷¢÷‚÷ÿö€õ2ôõØöZùëüúTžö4´ÔÈ}&nÔ(Žÿêþþ@ý‡ü4üü2üÐüîý1ÿ< è·1|Í  $ì+„¼þîþìüÜú!ø*õæòdñ¾ð¢ñ,ôÜ÷üV·ù;è-Vÿõþ>%ñÒ‹˜ÿ ÿþ¸ý.ýpý*þ½þÿiÿ ábæ|ó ªë¤äþ8ý´û½úˆúû ü6ýxþ¢ÿž‡2œè@ŽÆ¬LÀdàbêÿ®ÿßÿnlª¶l ¼e>·£œ¤°¬Ö>9 t $ Ýõxüøòó–ðBïbð¤óeøCý8 ¹,–zRGhëž$Ìÿ!@„xþŒÂ»£¼ÿ&ÿÄþ|þhþ•þòþ€ÿF@e{W×ç}Øûòô<Ùÿ ÿFÿÜþTþ×ýJýÆü,üvûû´ûÒüþHÿ dv1¢ÿÿ®þXþ¾ýÜüý³þ¨Nf·V¯8’>,?Žð&ìÜêìü+V¬úxâβvÐØtÿ5ý_ú”÷2õšóeó¨ôîöÈùÐüªÿÀÂõxxl<~¯¤Ê–Ì Æþ@ýüûDû~û™üÔýÖþ¤ÿz«å»(% ðœ>*Èÿfþ5ýdüøûØûúûCü²ü`ý,þÿòîäª0tv„ºØöF5à¯(`sV÷u¸Æ5ôتB½$.Ö,fv2ŒÿŒýû‚øãö2öyöÔ÷úÎü¬ÿ7"\ââ’XÞ¤¬²MÃjìZÞ, ÿþÊýþýzþÿ˜ÿ,¼(zÉ"ƒüm¤¬„"„£¦Œÿxþ†ýÈü"ü…ûéúxú˜ú–û:ýhÿbâ¶õ¾Xì¡Sÿª<Ó”]™ÔÿÌþ’ýTüOû|úðù¨ùúTû>ý<ÿî<CðP\"àÀ–q^.É‚v?¶êÜÿ™þÞü²ú®ø6÷zöÔövø&ûqþ¨=þ¼8ÈTæàÿ>ÿIÿ ª¢þÿõþþ¬ýýJýAýÄýœþmÿüÿpëŠNìO{ÐTÐê÷6F66Jÿ†þþÞýÍýØýÿýFþ¿þnÿCÚ’\8´1pÜÿlÿ ÿ(ÿ~ÿñÿc¸ì'*m æ˜JÇ8–ˆþ[&ÿâûòøKö¼ôêôhöàøèûÂþ2lCÌ1ªa(¨+L¼ø@º&BôFl²žÿFÿÿþþJÿÐÿv@>WZBùLhh^`ŽÿàþQþ¸ýýMü®ûû>ü§ýeÿÆš!à†.ïâ ZÆ,q¦ÀªnkÖTèÿ£ÿŽÿ´ÿ¤@×V¨¿… €؈:ôÿ¢ÿHÿBÿ’ÿÓÿ5'òÿZÿþvüÒúNùJøRø’ùîûòþôb Üêcš¢5fÆÿüþSÿt©^L„rˆÿòþ”þLþUþÀþÿf$¼^¶îÆ}J$âlÈ"|ØÿBÿÚþ¬þ½þÿŽÿöÿ8b‘Âò&[¦Œ×åÄ}tê~48Žî:rwT*"dÈLÜ\Äéæëò丆`ûL{BÒþ ý¤üÝûû&ü@ý†þÞÿ ¢ÝâÈž€‚®ä¼DjÞÿnÿúþ×þFÿ²+`fbj•§@¥Î¼x!´jÆ0¿ÿtÿÿ’þþÞýäýJþøþâÿÖ˜}¬–Z&æ¼~D( æŸLýÿÃÿ¢ÿ”ÿžÿÑÿ*‹è>†ÊrÃ6@1èÏžDÜœŠj ŒÜÿÆþ`ýüìúúúíú†ü–þХ⒨0Þâ gÿFÿÆÿ+PŒPXjl‰ÚB˜Èìd¬Ïàö'VnV¨2¶yÎÿÑÿøÿ6ˆä>€¨¤~X/ úø öæÚÔÎÞú!P{¤Ììòò8‡èWºðêÏÖæÞ¾µŒ×°n.ÿåýØügü¢ülý þôÿúв„&ºY/RB@t¤ÒPZ*ÎYò¸šžÆFÜ.ŠØ  Þ™Dè t`h|žÀÐȨh™2ÏÿxÿLÿHÿsÿÐÿLÅ4¦Pb^J(þË–_(ýääû&[¸Ðζ‘g<"":`Š­Ðú*8(׆ó3ÿyþæý ýÅýIþúþ¨ÿ^Ðsï Ä2J”€ÐX÷`g,ÔxÆ‚g†ÎnµK}”“‚eH-à¸c:(%0M|¦Êò öŠZ*õ͸´¿â:^‚ªß:E?2  <Wn†Šxddr€ Ÿƒ@Ì/•¸ÿ”ÿÄÿ6ÎnúXŒ˜x@дª¨¸Â¸ˆ=äÊ®¤Ú8Ú ðçÞÕÝø H`^>â´ŠhXYl†¨Îð2D@,êÅœh4éÜÝàëÿ1FLIB>CIVf„²ä %4>B6  ýöíêù$."÷¼dí~.0ŠÿtÖ4,Ëjè„C&Kž”ì üàÛæêÜÐÔæõôíô&/28=:,óÚÌÂÀÂÆÎÜë÷ÿ ÷êÜÆ¨ˆhM6".T€²êBZdffmz„Ž˜œ¢¤œŒ‡|T™.ÊtEP‹æR·:RUL:$  îßìü$$øÔ¹ªžŽ~«Æáø'9>2 øæØÒÒØãíôúþÿùôðîéãÙÐËÎÔÛäïúúìßÓÉÁÀÃËÔàîøþþúôìäÜ××ÚÜÞâéôüúݸ–{nt޶è:NVRF4á³»Òï ýìàÙÔÔÚåðú !"          tkabber/sounds/default/groupchat_my_message.wav000064400000000000000000000063441477701321300217430ustar00nobodynobodyRIFFÜ WAVEfmt +"Vdata¸ Le_:ó÷\ -™ÿÞpõHótÿ§†ütì¡ ®û²û- öüR™ ÛóúíÐù ¨ð* è±õ0. õÄìáïŽþÜì -\ªÒþŽüÿ7úJùk÷äôœ÷F6 vN ô5s>ýøúñýÉûÂý¾ÿÄ ¼ ñŸö‹ôÎÿò‚üVŒÿ·ÿx 4.þôûþ–Ë þÀþ0&ºàªøôøÖûHýAÿ` }ÿ¨Ôýlùù÷ú’ÿT©Ê vº³Dü`øòôE÷ÿÄ^¦ +‚þ2ødùºû¢û²ú'ýÄ ö¾b€‡ýÖþüèý?ûVüèà}ŒþÿþÿFÿèý¯þ¥ìLœúÿ“ÿ´ü>ülûòüf z¯ë¼ð 4üÓøÈøFùý4&ë`n ó5‘ý¸ûöú»ù[ø‘ù^þlŽèfâ˜æ/üðúøú€ùHûH’¡Sš4Böþ}þ½ý2ü¦ý¬ÿ·2ê´ÿtþÿùÿüöñE²ÿþ¸þmûðú~þ¢þ¾þŠèf!lÿOÿYü«ù û­ü¾ýÎ&/lÊx~<þ0útøtúÙüœÿŽÂœVB¾€ÿÈüÐûdûpû?ûòýj±Åæ^ìþJýºý#šÿê€zXzÕÞþ þ2þøÿûá8 öÿ5þüôûþaÿ|Ôöî5\þ3ûàûÂûnû‚þ¨Ð*÷,ræýåüýúÐùxþºa¦ê8èÿßþ€ü”ú7üþþ¾4µ$Ú’ÓmýPýìþtÿÿÿRÆîÊÿ2ÿ¾‰ÿ†þ´ÐÂìX>Žÿ^üèûºüfýMÿbqôR(|'þÎüæüæû¿üÐÿâ¸Crqˆþýðü{ü÷ûÖý6ÿ¨UÞ¶bï_Âþ˜üRüÕüˆýÿ¨þ[»¨1ŒÿPÿdþšþxþlÿçÿbÿž1WÀþ_ÿpÏd|Gÿ.ýný¬þøþÆþÖÿÊFd”z˜ìþþ|ýOûûrüOþU”äH˜Öÿ4ý`ûpü!ýþ¢ÿ$gЬ úŠÿ§ýêýöþhþZþjt„¨ÍZ z:þ¸ýÿõÿ«ÀÿÐÿ:òÿõ1ºª¨‡0FðÎáÄ á¬bûü @`ôìø.þZ9 çö¯á/õzþ ¸Ìî‚l 0Xþ-ï—ë¶ÉóPó8ò¸îrþ”tþ÷Îï4öžüЩ4úkøv :° l]ý*üÚ¬þºù¾õ˜ôHü €˜ûøþu  "ÿ)ùHþ8ýUúÒû@øØôýƒ¤ úB0 Ęû–öÎô õúûÅý<úlý~ LÞ:ì~üøêóˆòè÷#ÿÔ<0¤ ¢ Öýùõù´ûÑøžõz÷³ýbN ´ðÝÜòê&ûÚöÚø:úÀùÐûªücþ2Y Š Ä– ÃøÛôÖõdù¦ý.þµþoœJ ! :ŠBþOýöù®ö®óâòmÿö þž¸ùþ<¼2þ¾÷ý÷¢øÖô:ôÔ~V– 6Œf+úÌü´õOñOúDü4ÿ¶öR! —~äù ú„û¼þ›ûäúü»0bÿÛþ:jt`9ØþÎøZùlûp÷À÷õùöýê˜ } ñzZ¢pü®ô`òËôàüS5Ü^Ô¦qì,ý]ý*ýÃþü#ùPú~ÿæÄ r\·õÏí¿øSÈþB1Dá\¾_,ÿåÿ'œúüò¹ô²û°¿;UŠÏ|4ÿúþêýúù©õ¡ø(T¾  ŽÚÒú¼÷ÃóRôÎùÇùû g  µ N PYþYú˜÷óø„ø»öxüUHs2û%ý¾ùLú>û„÷´÷€þ Ü4Æ:h\ÿ ý>û†÷vø5ûÔüýüÿÞ”wXÐ,þEüŸúŽù¾ù”û’ýÓýk<T ´[þÕùdö´ô0÷¢úãF´ÒÙ " žNþ¨û¾ø¤øüøú‚ûÀþÜb¼‚©vRý ûØù]úçú¡ûêý*`P§2Ä‚ÿŒü¢ùÌ÷Tø%ûÊþñ^‡µÖ¯áÿÎübûDûÉùzúáý„‰É€Š\ލHÿHû(ù@ùNùúTþT\šEÆäæý¯û€ø’÷múý¦ÿnõÂÈã‡ÿðý>ýêúéùzú[ûÀþÑ8ÞR]è$¼ÿµý üÍù¶÷¨ù1û„ÿîô"˜‹þÀ!þ>ûçü úüú õ^ø‹ ÿÜ bèÖð1* ßùF,üvùõ¤ñF b¤Ž “úê÷¢û»üXïùùñºü„¸øØžl‘þ Y~èð ò^ú`XþËþjüòÃFý¬ýüLá´ýôIùèýhø*ûöþY¦ ¹q¡ÿüþºõÆòö8þ…ÄúÐ4š¹ÿ˜øL÷Øý[ˆýÄú*ÿ,¸ä²ÿþHô¹êûHöü¯ÿdû÷ÿŒ:¶ Z VüªïS÷ÈøÐ÷f ¦ HþŠÞõúôt°VC P øÕójö!üH¸üŠÿLðzÿ:ÿrþÊý¿ž ÞÍû=ö²ôŒ÷žú¸ÿŒì G¼ „<÷»õ(ö-ùàŠ’ºÿþ¨úiû]ÿ-²;:ühü,úùõú?þê` þ ¹Ôÿý¹ú$ùgú*ÿ®^D7ýBþ zÔìÊBÿ:ýdùhûþôþ"ÎVÕÿ‚bYýÞü(¨6øæüùRñÄûÚÝd  Èÿ”÷ô¡ùEú”þt¾­évT*úF÷à½6~“ýâû‚ùDù¿ýK¡ÿÒ^}ZÛýÊú´ü ùŠøvùâÚ¾¥üãùcb‘ìÿÀÿåý˜üºû¼üü¦¤l–ôþîý6ýB†èü°(ÿ`þìýtrþª À8Øü›ú³ùfø úýüïÿähCòþöûˆújûˆü ÿ3Ê" ÿ>ý3ûúŽÿvüRš^ˆþû¼ûülû‹þ”! ”d:”ÿ¦þýbýÑýÒÿ`Îÿ¦þ`þFýH»r>¾Rÿ@ýäûáüìûðý †ÿ¦¤9X¦ÌÿÔþúü£þBþVüéýÂ&Äì"tÿƒýmü™ý<ÿëòÈÿ¦ýˆýëþL wᚎþ†ü®ûVûAþø®^ª J0ÿFþ´þàþÖÿàÿŒÿÒÿ°ÿ–ÿ`îHÔV»—þÍüŒü‚ü'þÔ Dìúv¸ÿûÿ ÿþ†þþÔþ9ÿGÿÔj»¿/.ÒýbýpýZþî0Rªÿ_ýÚý?0 jžþðûúûVþ„™J½Õ‡ÿùþŠÿbVÊâ›ýÈúüìþRÔ:n®0þNüàûÍý +̦úÿßþ\ÿ1ÿ¾ÿš’‡"$äýòüžýþæþ´µr”Î)»ýÜüxþDÿ?‘¸ïgŒÿðþÿøˆçºÿÜý&þÛþxÿzβuôÿ.V ÿÿÕÿcÿÛþ(ÿÕÿñÿ”^Ô Jÿtkabber/sounds/default/groupchat_server_message.wav000064400000000000000000000114741477701321300226240ustar00nobodynobodyRIFF4WAVEfmt +"Vdataüÿþÿ÷ÿûÿòÿøÿïÿùÿìÿþÿçÿ'ÿ•þÅþ¿þêþÿGÿ}ÿ¸ÿìÿ1]±öIÀJ`l›¶ÌÇÆŽ‰_ÿ?ÿfÿ ÿ€þÿòþ3ÿçÿ‡ÿ¨ÿ@¬˜¬Ô÷Òå~ ¸ – „ { . \{ã¿ûüÉä^¬&욢ËIu0 ûètOÙ€½ÿûþàþ…þmýýýþýîÿãÐ È yÀ+4ѽÅï q®ýLúóöTóáï[íóê„é‚è•çúç8éµê4ì^îð¦ñ²òüòóÜòãòÕò òVð²î+íì§êéUècèéPêAì”ï0óÂö¹ú·þ¿—¼ \–ÙÙ<ˆ  ¾ ¨R`WþíüÂûÕúÉú&ûü·ýìÿAÅ3 e  Y³Û« û c  ¹Sn¹Rs^Žý× eæYÑ ] Š # 7 Ù ç  ¤µ<þ‰úŠömòaî…ê1çˆä×â–áÒà…à¦àVáfâüãæ$èbêÜìLï0ñ§òùó-õö“ö÷i÷È÷,øtøgø„øôø­ùªúãûaý®þÃÿÐ+ÐAfRb¨ÆuÿòýŸü{ûšú1ú2ú–ú?û5üý6ÿW¼'Ÿ3 z#÷ÐRN’îòâ.¯!è õÍ,™ Ò ù þ¾KÈ&þûù«öeôîñnï>í[ë²éhè‚ç󿑿Mæ/æQæÈæç‰è£éóêeìÖí/ïðÀñùò(ôsõÒöøGùŒúÝûýüôýïþõÿà“+½B±ôÓ¡E»)+Ì{¬ÿwÿoÿŠÿÛÿ’’±á7»d/  ï Í«fíFqc ÅÏš>»ïÛ’)¿F­æ Ý Û õ J®þ1ýÑûŸúù”øÉ÷(÷“ö.öûõêõÝõìõ2ö˜ö÷Z÷·÷ ø¨øCù½ùúeúžúÕúöúû*û[û’ûßûü)üüüüüüÉûzûû’úèù0ùŒøî÷A÷¥ö.öÈõjõ3õAõõÿõ‘ö]÷?ø:ùaúÙû}ýBÿßÊ»²Ÿ t Q1À‡R%ò¹kÞ!"å"D#.#£" ! ¬øádºë fÄÿIü ùö|óñ ïHí×ë«êÝégé0é<é„éÿé¶ê„ëmì{í¦îàï2ñuò°óüôNö¨÷öø(úOûeüMý(þ÷þ­ÿL¸æÙ¤DÇÿÿ0þLýTüDû#úÔøm÷öØôœópòZñ~ðÓï^ïFï ï`ðžñ\óoõÑ÷púEýAI> Ç )I s‚<¨Ó¡.ˆ´ÖR¤‡„í q  } Ú ý Û —+¥©­ÿµý¿ûÃùÓ÷öwôOóròýñíñ,ò¶ò~óxô±õ÷˜ø3úÇûQýÒþ3_X ‰É±E“‰:ªþÜüÊúø#ö¸ó]ñ ïÇì±êÃè-çÉå›äãüâ â«âÞâÀãßåÔæ è„é?ë0íïòÇô®÷«úžýá2¸= ª'ö­Õ¥!&#$µ$Ó$‚$±#U"x '†zVØQÊ ^äÛØýûŽø9ö‘ô8óøññ‘ðXð`ð®ðñ¾ñ^ò4óô õ.öK÷Žøú=û\üVývþÐÿ&j€”2’OÆŒW1½6½ÿôý!ýêûcùì÷çöOõYóµóïôœô õMö†ö~öö¤õªõíõ ö½õöýõ'ö›øwúü5ÿŒ•è Ï ì–Îâ  ú!O!Z"å ‰ßI¸ ¤Ìí C / á N .ßé†GÏœ|Ǭ W ‘”d½þ9ú¤öõ[óYñÖïTïÆî’ïð³ð×òõî÷5úÂüþþþPþ§ü;ú‘÷éôèñoíöç£â˜Ý ÙÔ9ÏÛË´É©ÈnÈÇÉ&ÍËÐÑÔ›Ù Þä’é.ðñö=ütŠ-:^³6rÿÁþWÿÎq­î ›}!}&+q/¤2Ÿ4I5'4Œ2Ä/(,`'" Ãâ §üŽÿZý¨û‹úNúÁú©ûèü7þÚÿ°ÓÐåùsþŽûºøÔõªòTï%ì&陿Úä ä‡ä)å/æbçÎèhêñë¸íuï“ðñ\òò†ñÍïÂíƒë¯è{å;âßÜjÙ¿ÖùÓðѳÐXÐÉÐ-ÒYÔ´ÖsÙèÜ=á åëépîåò÷«ú\þW×“Ü  ïóë—? ½!#a$¢%M& &Ÿ%m%"%@$º"æ ó¯!þµŒg\ ® j ˆð°ú»Ú * … è j£X¤ ,kM Z ú 7”ógÿý÷úåø«ö9ô®ñ3ïãì¥êQèæÌã‹áßfÜŸÙÒÖÔkÑ7ÏcͼËaʰÉzÉÉÊqË‹Í%Ð"Ó§Ö»ÚDßäéçíÛòø÷ ýׄ -ßtÀƒ!æ$(Ø*-Ã.0á0Ü00©.¾,v*ù'B%8"$ ûímò ¯ Ô R"9¼­Ý>ßÚ> Ô ‰ 1Št¿ kÖ>¬…R+g2‘-N gWýµ÷ˆò«íéƒäMàuÜÙ$Ö•Ó‹Ñ&Ð]ÏÏPÏØÏ¼ÐÒ Ô’ÖƒÙÉÜMàäÚç†ë)ïó÷òú þ.¨ã¼ P¼ôÆU‰3W9¿$@K_fSvð j Ñ $ ‡¥žf‰„N é Ùò!P_y §"X$—%p&ã&'à&S&Z%ü#T"f {«¢6€k í?_ü_÷>òöì†çâ¢Ü>×ÒCÍßÈÅ·Á/¿^½)¼ë»µ¼v¾ÁhÄ\ÈûÌ7ÒÃ×aÝÞâUèàíJórøKý‡y@ – ]¥t?üLb§×‚Û/  æ¯Uëýìû<úäøÖ÷÷Bö»õõ½õtöÆ÷ùÍûþº4O Ë~Šœb"?$þ%_'N(ù(F)õ(Ï'É% #øyRã85 4-#ûOö¥ñOíaéºåCâß6Ü—Ù)×ÀÔ°ÒüЋϚΠΓ͗Í+Î7ÏÑÐÈÒíÔ¥×îÚZÞâæå êŽî2óÃ÷*üVHg $.n%Iµq” S \h¨Üý5ûöøÖöåô:ó»ñ’ðð›ïïèïŽð”ñKóõ1ø†ûjÿ±+¶ QïlÔá"&Ï),@/˜1è2±3Q4‚44C3ô1@0#.d+($k­±Ÿ] ®µÿÊùÎóÑíÕçíáŒÜ°×.ÓýÎuËÎÈçÆáÅÅ?ÆâÇqÊòÍÍÑìÕ?Ú³ÞãTç›ëÇï˜óÕöÿùÐüÿb‘¡¸´ £ Ùªãwûž ¼ E o¹µý­ú·÷¼ôòÑï³íÜëÊêJêfêë?ìYî€ñåôcø^ü ú ß4¢!ø%®)-w0k3œ5"7b8 9,9¯8o7|5ù2ê/c,Î(%Ë ƒâÁ4ø hòoüî÷Ÿójï^ë†ç/äGá“ÞëÛÚÙæØ”ÙìÚIÜ4Þ®àãç}êâíºñ²õóø§û|þå$õzn*RýIúùöÄóÞð4îBì§êöèóç6çïæ„ç3èFéûêjì«íâîðeñëò—ôùõÊ÷ÓùÉû<þÀ;àÇ ûcÑòÁ6!{#Û%Ë'Ò)ž+Ç,i-Í-O-ê+Ó*)'Î$ì!.*’$¯³ ³ŽÄ_þYûëø¯ö.ô%òfð:ï î{ííìì±ëeëÖê3ëÙëÙëì™ìœì¼ì`íéíÑî ðñþñówô öˆ÷ùcú û¨ûÖûèûÚûtûâúfú«ù\øp÷nö°õõ‚ôòóÚóÑó&ôÛôIõâõ,÷6ø:ùÙúÄüÏþKB”œ X ! ,ÕU¢š>ì Ñ8u Šï«mM<]pÁ‹Ûº;Oqòõë e Ó  ü Ð K¯æÿËý°ûÂù5øÇö õÆóéòøñ˜ñ ñ¢ð[ð@ððð=ð‘ï%ïÑî~î%î%í,í6íSíTí3í×í£î€ï©ðBòìóÚõ¼÷ìø úû®ûèûùû`û¦úúÓø4÷·õ?ô†òñ)ññ±ñ®ò÷ótõÓ÷µùÈûVÿÖ¸ v ÓØta"Ò³mVËk@èóo~Ê+JÒeƒµApÙ(zµè ü ' < U ¤ bñjÞÑrøÿ¦þBý÷ûîúßùÉøÜ÷F÷äö˜ö[ö±õõ~ôbó,òoð‡îÕìíê#ééæÛäÌâá¿ßÞÞ¿ÞÈÞ-ß¾à9âãã¼åèpêí ðòþôj÷hùžû%ýŸþ¢ÿ°éâª6Ê®l“µÖ W ÚA‘…—8-ûINORè § e b Hõ¦œÎAŽ9 ­ B À M ³ § u ? \   p ôbëcëIŽþªü5û¶ù\øN÷òõõ8ô-óòñ±ïEîYíìÂêê‘èèççYæMåýäëäÁä^åÿåIæç"èšéëNì3îCðlòuôšöÇø³úðütþWêóeXV¼R¢Á]ûr, R V ¨ ® ÷ y • # E  J É p – ô )\”€Z  Þ b ² G ô ª  g Ä)ò´_8•ÿþéüyû&ú0ù/ø‚÷Ãöøõ|õâôSôõóió=ó½òsòTòéñÛñ“ñnñÇñËñäñòòóqó ôŠô$õÌõiö ÷÷WøÐø@ùâù0úúÒúùúoû¶ûüaüËübýþÏþƒÿ<<©U­ÔùÚû<>ŽÁGÞZÛw U Ì … ×  ? . - Ð W Ä  À õ>Iþ3„ã0íKv™bŠÿ6ÿˆþ}ýûüü‡ûÏúÇù-ùWøç÷–÷G÷÷ÉöÚö÷g÷…÷‹÷ß÷ø ø¦øêøâøáø>ùù;ù!ùÞø^ùRùÀùëùëùŽúÒú\ûÉûüÖü-ýÍý€þôþ¤ÿìÿ§"’JdádµEgÖÿ"=V°ÄÓÏÔÞíßÙ¿½¹±žyc`F8ݶ–]ç”gCáŸxT5é•R¿dãÿ‡ÿÿ¡þ?þåýoýóü”üYüü³ûMûñúÀú£úJúûùÉù¨ù¨ù©ù¨ùžù«ùçù6úwú™úÉúû‘ûòûükü²ü$ýŽýëý6þ{þìþKÿ¼ÿ ?‚Ì-X‡¢É :crˆ´Ü )Mafjgenƒlqm{†z`YcXP=)ñÒ¶ tC 羆K¿€G¹ÿtÿ9ÿõþÎþ{þ’þtkabber/sounds/default/groupchat_their_message.wav000064400000000000000000000175741477701321300224400ustar00nobodynobodyRIFFtWAVEfmt +"VdataPyÿÉþÿ©ÿvÿÿ7ÿÿ‰ÿžÿ·ÿ~ÿXÿìÿ¬\}ÿ-Ó—ˆ5lNÔm?á^ƒiQcm<-åÃê°Rà7>®ýÿºÿØÿ"ÿ(þ&þ>þ<ý¢ýTýIý†ýsü™üÏü™ûûhûðùÚøÛù{ùyùfùcù.ù¸ù¼úãúÒûòü ýÇýËþÚþ¶ÿhÿŒÿ3|ÿ»þþÑý”üÉû¼ú~úÒùÖùñù<ú6ú}úû°û‘üÌÿ¨¹Q,¯un ÍÌ # É §  à Ï K  c N Œ : ý  u¾¿±PgJbkÿGý ûêùùZùø7÷%ö‰ô´ó-ò òNóYòŽñƒòôŸôhôo÷BøùUûéüËÿʯßXëͤd»ÿüÁÒ6n*‡¥ó¶ZúüûPùN÷×ö§ô¨óòAï.íåêAë‹êìÝì°íðîUñ»ôšõ÷ìúíý \ % u’ñ§ør½yf®£?xÏKîÛ”˜ ï Øƒ6öÕþ!ýYûñøÄõÊô¥ñ³ï¬ì êÓéØêë êê/ìGîPïdðøò—öÄùÇýk» é u ç ½ë}|s Ï ¯B¿p¯üù®öõò7îë é3é³è›æ6å†çÊä®ã?â â@ã å¥çëìöð®ôØøøûÊÿ 3 ]Ž|È"Ì%î(K),J,‡*ì(¿'p%ž#¢ÔEm kÀæCþ^û2öØò’ðÍð_ï$î÷ïKðïîFîìëuëêÞê¹ëìì3îØîGïòªóÞöçö¾ø©ýc˜ –óúS—QÄkÔõrËVî Ì4b±ýÔ÷¨óañqíné€çäåûã¸á9áŠÞaÛƒÚnÙx×LØ»ÚòÜÞ:áµäEèìŸðiõLú1þhê C ‹V$'¿*0Ù2Ž1k1Ý0/:-(¸%‡"–ƒ#- ”TQüø°÷-ôïòIóuó*òÈïEðvîùêŸéöé§ìwëfë•ï’ð*ð?ðIóõ4õCù{û;ý¤mì Ä~F@*W½¤=×Ñ é ÙCýÖøpõNðjêçHã7á â^â¶áâPãÇãJá¦ßàùá!åìæ¥ç€ë³íüïëó!ö;ù„ýp­êy -Ö ­!à%Z*o*e)E(¯'g%’ ùÂ|)à ©ÿQû8ø÷÷Åöíöá÷ÊøÃùé÷2÷_õPóó‚òòÅïRð‘ñ_ñ³ï@ð’òuòbòxó.ö†ø,üÎÿ#Ë ¢LžŒyM:!“ÛEÙÝѧú”õæðbí?é­æåýâÆáZáˆÞõÛúÙÏØþؾØ#ÚcÛÕÞµàÿáuå3é8îñÆóæö£ûºæ2 @frm#ˆ&Ü)Ô*+á+.*Ï(ð%Z#J!a`sʱ’W ýgûµùØùüSüuûœúôùÙøÕööÿõËõQõáõúõžõ(öÆö"÷töñô öD÷®øÚû]þ*ýq %È0Û©ï ´ …º˜­ý>ú«öáñ¦íüê¯èFçØæJèxè@è`é}ê×ê€éêÚê÷ìÉî%ïãñíò‘ô€÷˜øûÛýcþÊþS.üÑ Õ îz–Cì’WÀ›#ÑIlÃ: :ëL<h`þrþ¥ýnýÂHbf„Ñò”˜£ÿ½þ©ürüÿûŒúùø8úÿøÓöDöýö+ùXú¦û|ÿò° ƒ ² ³î÷„§g @ k ñ:ĈýÃ÷¨ôíñîZëçé!é>ç½æ×æ´ä5ãµãëãûâ(äøä æoçxéßëëìð5õMöÕõ‹öÌú ÿX,Aì Ë$ÎÑ`‡À;¶¦(2 ½ á„`<¹þ þÿü*ý&lÃ3P,¿ª±S„`¸ò†Óþ±üIû~ûæüÔûuúÍûˆþ¤ëž»éB.Pžþ‰ývüEú¥÷þõ.õ`òçï.ïIîÙì7ìÂíËï­ð„óÛô´õÅö´÷÷÷CøKúéû¨üäüéýÑþAþŒþOð2þ„þeÿkÿÌþ¨ÿçïT^q r °a'Ì®º Îÿ0þ“ý’þ?þýOýbý?ýnýƒ7‚þ Ÿ £ Ø  õlÔÓ59¸¡øÿ½ýûÔù­ùìù ú¥úvüVÿ ØdGf©g ´ @€‡ûºŤÿŸþšûÿølöËó¸ñ6ð©ïŽîqîvï‚ïMð8ñoñ’ð/ñ;ò òüòõ?÷—øøÎú°ý±üšû ýþþA¹Ú1~ÙÌ ý û Z l 7 ñ }öoìN¥ExÃòÿ<ÿÏ‹¼ æ k|äÙ¨’Ió{N ÿ ÇÌ—ÿ›ý÷ü@û!øóöøþø»ùúû`û ûmûÂüêû·ú•ù;ø©÷Íö<öÃö}öJõ©ó©òZò—òhó†ô ö¢ù½úÅû¿ýtÿx¼_`/.mqB3Ý~èy>ƒþWý þ?þÿj°ªÔ¡•fÿký‘ûõú3ûsûûÝüþßý¹ýþRÿÃÿ°E–m q c 6[ H º Á  [Pà «Æƒ-€þôý¯ý"ýãû‚üâýøþêÿÍÇT*9é¸(}²ñƶþ„ýý‡ûkùf÷™õ#ôâòiò»òóDó®ôBö÷©õAö7ø6ù´ùãùûpüãü…ýOÿ…¿µ<2¼’˜9|b/GÐ"Ãè&ý&üüü¾ûMý"ÿjÿþSþ7ÿœÿš¿Z ’ à  ". <úwF : ”å[µý~û©ú¾÷ÌôÁóÕó ô&ôÔõ#÷]÷à÷£ù†úÉù÷÷üö¦ö\÷p÷Öö½÷TøR÷*ö-ö›÷›ø ùõúóü'þLÿøm k‰~©››ð¨ êYêÞ.5ÿƒýþûûü-ýÞþ¼ÿåÿ‚ˆÿ¥þÆýÇü ûgù½ùšú"ú…úGü¶ýƒýúýÊÿÖÒ[[žó¨ À i } å ²  ç ™[Ž@¯‹ùÿþ<üüJü,û(úÈúýÎýÍþº,_:òˆ×Wwÿfþ>þcý*ü¤úàøÌ÷löÄõ±õEö?ö|öò÷QùÝùßùÖúÁüvýÜü\ü¡üÏýDþ^ÿ …ƒ; Mýÿ •òª?‹ƒn݈ýJû®ûæü§üðü–þÿ´þaÿeˆÀ[‹[ … ú ÉÍDò¬E ~ d #ÌßÿìýÕúø}öAõó¤ðð)ðêïµñöó£õÝõäöƒùúðù.ù¿øyù"úºùyùŒù%ú¿úÊú_û…üUýTýéýUÿ'ŸoŸfÇK®EUøjJÕrYÿ‰þýÄüdüIý¼þûÿ¢__þ_º(þÆüý$ý`üLý ÿŽÿ ­¯òþ.¢“ÈÍU ^ Ì t y·dÄ[“ÿNþ+þÊü¥úkùôùjú¾ùÞùšûvüý¹þà«Ö«ûBÿ/%Üÿ ÿ0þ›üæúOúèùoøÅöîö ÷Ïö"÷–ø·ú$ûßû¼ý±þ˜þ8þdþµÿoôŒê8=%ÌW[þÿGîíLj=šòÿáýÕþTÿuÿAäu(\#2‚  N Ý ´èGÊ÷ ø %ì1fýUûùžö¼ô¿óÑñžïÐî/ïñîcï[ñÓóñôöiøÂúü€üRüÓûHüÆü%üÜûÜü(þ~þ*þÿ5àÿ¶£›Ÿ´°÷ëGk¬ª[ØœÓàfa¡Â¿À0n3‘J(¨s*­ÕN‰¿ÿ õ!éy*±ŠqOM¯ºÁÅg+híÿÊþëþ¨ý–ûPúˆù‰ø‹÷ø|ùûù‰ù¸ù[úaúBûjý¯ÿx‡©Þwª%‡É¡þkýýeü|úùÞøø(öõ!õ!õ"õAöBø@ùËù4ûýÿýyþ'ÿêÿ—+~ÎpÍ·ÖŽ,<ðÿ"W á¼ J ï{\gå›CØ2” º 3 ¶ Ÿ —  ( 5$ÜèVþœûqùƒ÷Võ°óêò òÐðXïmï¿ï²ï”ðQòWôUö@ø°úˆüuýÊýýúü€ý¤ý…ýÄý™þñþµþôþsÿ¡ÿÿÿ)ÿ›þTþFÿÀ¢ÓÙ¡rȗŧ†K`ÐßÓHÿFcs3fš$µÿ8¿z ¯Àaäæ»ÞëÞ=|ÿÛ¾±>™¡ÿ‹þäýOý¼ûÚùéø¸ø½ø<ùúõúûäúgûhûÅûýÿÀçFÍ/9»N<òþýÄülü=û²ù]øá÷÷-öHöDööLö÷þ÷”ø¸ùüûˆý“þ„ÿ:¼éú1£‹DpÿûKèËíÚ‚>¡oÍ—ÿò¯$j7`·y@ ¡ ¿    ó] v . _-+­­—þüû¾ùç÷ö‘ôÐó^óãòÏñiñ‡ñ†ñòñ+ó õ*÷?ùLû ýBþzÿ,àÿÿuÿ4ÿßþ½þwþûý±ýÈýþ8ý™üü%ü û¹û±üÆýTþ-ÿˆlw‹ÞÓ²(× ¦ª²+v€“]ÂVƒÕïæs¸ÞÎ7±ì=# aíã°p€:ŽÿˆÿŒÿÿÔÿ$nÿ…þþSýYü£ûXûZûüýlýaýLýÏýþÕýÜý†þhÿ‚d-ÌBwÓ°ÿêþ4þwýÓüøûÒú€ùÇøŽøøøá÷ƒ÷÷6÷Á÷pøJùßú‰ü¿ýÂþ}ÿÈÿ9äI$×xçF:9QhVŠƒ‹°D”'…Y9Wþj%ƒ¥'/Éâ—}_ÄdW)øußÒ *4ÿ ýÙúÎø=÷øõyõõŸôôó}ó¬óáó/ô õöW÷Þø€úüý‰þ)ŸB½ÿYÿáþnþdþþ˜ýý×üYüšû'ûÍúnúoú®úû¢ûjüˆý9þÿ?çXÐ è¥@®éƒ9~Q;±IÏKRm²qSí+Ë Uù°ëÔ›x”­<Šÿyÿ©ÿÆÿñÿ-¨ÅZ³ÿ&ÿãþ|þäýUý}ý7þŠþ˜þvþ¡þÿÿÚþÄþÂþUÿµúÚ9d£{ÿ»þ}þôý2ýNü^ûnú…ù ù”ø5ø<ø+øÎ÷¾÷øåø¨ùúÈûÄüáýòþ™ÿ˜¤§'g; øÃùm~…ÚÈ—ÿxþä=# 'Ƙ Xd°òß’ï0Ó‘4è¡ ª$•þýƒû:úüøeøû÷O÷’ö.öjöÓö÷o÷ð÷øyù–úÙûûü2þ|ÿ8?ãÿ£ÿYÿëþÃþ>þký‰üñû£û#û¸úÖúåú»ú¢úÅú>ûÈû¦üý(þÿ%š£’gk§Ò¥A™<© þkµò5! ¸ÃÖ­]‚$Ówj˜z£ò×c(4/‘ûZ¸ýÞG¦ÿÿ4ÿ«ÿÓÿ­ÿ©ÿ‰ÿEÿùþ¢þ[þPþÎþgÿ”ÿ–ÿÈÿ%3Áÿ ÿoþøýýèüéûûtúóùMù½ø¡ø²ø¢øø¢øÝøDùúûëûÞü$þ[ÿóÿU¤–^AnFõÿ¦ÿ\ÿšÿ'ph[·){à°ºÊ]6búDÒè !0'âXk°A¬Cù• Kw[ÿfþ¿ýýõû ûËúyúÚù{ùù úLúGúZúlú»úûuüLý þÂþÿÃÿÿ(ÿòþäþÈþIþ“ý÷ü[üËûHûû.û?û&û?û…û½ûüküý¼ýWþBÿ<ãjú6Íä;b©øKÏ?Y!ñ%Õ¶·K†Ì~Ã4ëÿkÿ)ÿ<ÿpÿ±ÿèÿ4W#õÿæÿäÿ(€æÂm8­ƒÎÓlÉÿZÿ6ÿýþÍþ²þvþiþ¶þÿGÿ>ÿEÿnÿuÿ5ÿÓþþXþFþ¸ýÔüøû8û³úGú9úúÀúËúéúîúèúû ûnü#ýîýèþ¥ÿõÿ4v‹q&ÿÿæÿµÿ–ÿYÿQÿÄÿ?obMuà†RÜdRG¹ðPÃä—j@þý²D¢ëeëh¿Ið®3”ÿÿ¶þþ(ý«ü‘üKüîûŸû¦ûÒûçûüüü•üJýçýaþËþ4ÿ’ÿÌÿ²ÿkÿÿýþÕþ6þ ý-ý©ü6ü×ûâûü!ü@ü}ü©üÎüîü<ý³ýHþ ÿõóCUD?„˜¤¤ïtœ|Jø¸ ¦n=GQøˆfXs·ÿJÿ*ÿ]ÿÄÿ:~˜‹]8‘ý9ÖëÂÂï×gQ×5Ðÿ¯ÿ„ÿEÿ"ÿ ÿæþèþÿ<ÿUÿGÿ.ÿ@ÿpÿwÿ\ÿLÿbÿ-ÿwþÈý:ý¼üaüNü‰ü£ü‹ü“ü¬ü¥ü”üÉüMýÀýþSþÚþqÿ¿ÿîÿ& ´ÿƒÿdÿ:ÿÿÿAÿœÿáÿ$Rl‰ÔmöNÄ”vå%|¼©T&аŽR«VÛD¿GÑ„1 £ÿÿÖþ±þKþÀýƒýeýýŸüzü~üŠüªüïü%ýAý’ýþoþÁþóþÿ=ÿdÿVÿÿ÷þÿêþeþáýqýéübü4ü\üŒü·üýTýgýzýÄý1þ§þÿ°ÿ`ûtÌ6G;?B0ô"M9ÐS=H:ýØöçâü×z0àÿ«ÿªÿÃÿëÿ þÿâÿÈÿÃÿc”Ì AjE ÚiÉÿ ÿgÿ3ÿÿúþîþÿÿþäþÒþ¿þ¼þîþ6ÿ\ÿTÿ^ÿ†ÿ]ÿñþ›þQþþÏýÈýÒý¹ý©ýÑýòýéýåýøýþ3þ<þVþ˜þìþ?ÿbÿ`ÿdÿMÿ3ÿ(ÿÿñþÔþäþ-ÿoÿ›ÿÔÿ?o½0 ÷oŠÕ3eaCÃx+Ñx$æº}!¬J!Àÿ{ÿnÿiÿKÿÿûþæþ¡þ_þ.þåýýsýkýqýuýýÀýëýþSþþÊþïþèþèþÿ<ÿCÿ.ÿ:ÿUÿ$ÿÀþWþîý›ýnýtý–ýµýêý<þvþþ¯þíþCÿŒÿ¾ÿ .œÔý ìàÕÄ¡ˆ€iK8æ¼®¯WS‰¾ÛæøûÈŠaF:- $÷ÿøÿ EMp³áêæû ã¿®‰MÄÿÿ_ÿIÿLÿGÿ=ÿ6ÿ,ÿ*ÿ'ÿÿ-ÿkÿ¥ÿ»ÿ»ÿÝÿñÿÈÿ¨ÿvÿ4ÿýþéþäþÓþÕþíþëþÏþ¶þ¦þ£þ¢þŸþ·þëþ'ÿUÿbÿuÿ‹ÿyÿ]ÿTÿHÿ0ÿÿ6ÿoÿ™ÿÄÿ.IxÌ6Ìs¿ÿ(RrhB ºe ½{2öТ\ ÕÿÄÿ«ÿxÿZÿ[ÿ`ÿ[ÿPÿQÿHÿÿüþáþ¼þ¡þ•þŒþ|þhþoþŒþªþÍþòþÿ9ÿEÿ)ÿÿ0ÿWÿeÿeÿ€ÿšÿÿQÿÿàþ¬þ þ²þÀþÎþÿþ@ÿgÿÿžÿÂÿñÿ&U‘å@u{‡Ÿš‰†}^1 æ½±¹ªŒƒ‰„mSQi‹¡¤ÀÃ¥ƒcAûÿåÿÍÿÍÿèÿóÿâÿØÿêÿ .?EHYpjM)úÿÅÿÿgÿPÿ?ÿ>ÿIÿKÿDÿ>ÿAÿMÿQÿNÿ^ÿŒÿ´ÿÃÿÐÿöÿ!&óÿÅÿ–ÿvÿcÿVÿOÿTÿWÿCÿ*ÿÿýþôþõþòþùþ ÿRÿnÿ~ÿ—ÿªÿšÿ‹ÿ“ÿ“ÿŒÿ”ÿ¬ÿÁÿÐÿîÿ <m£Ø :jªé*MhT)þÄ}<ƃV=ïÿÅÿ§ÿšÿ”ÿÿŽÿ–ÿÿžÿ•ÿÿˆÿÿ{ÿpÿ]ÿLÿ7ÿÿÿûþþþ ÿÿ-ÿ;ÿAÿHÿEÿ8ÿ2ÿFÿfÿwÿ|ÿŒÿ¡ÿžÿÿwÿQÿ0ÿ'ÿ7ÿAÿHÿnÿÿ¯ÿ¶ÿÅÿÜÿ÷ÿ:[‡ÀáãëþûêäÝÁœ‡rSM[YC.-2.*0CZgn{vcH*öÿèÿÞÿÜÿ×ÿÔÿÜÿÝÿÝÿèÿðÿíÿìÿùÿÿÿòÿéÿöÿüÿòÿëÿâÿÏÿ»ÿ«ÿœÿ‰ÿ|ÿ€ÿ„ÿ‰ÿ—ÿ¥ÿ¯ÿ¹ÿ½ÿ¼ÿ¼ÿÎÿêÿúÿ0/%ýÿáÿÑÿÂÿ²ÿ¯ÿ´ÿ³ÿ©ÿ˜ÿŒÿ‚ÿ{ÿzÿÿ’ÿ®ÿ½ÿ¾ÿÆÿÔÿÚÿÜÿãÿîÿñÿïÿôÿöÿóÿúÿ %<Qjƒ˜¦³ÆÞðü ý䯥„iQ=0%ðÿáÿÞÿÚÿÔÿÔÿÜÿáÿÜÿÙÿÞÿßÿàÿäÿæÿàÿÓÿÃÿ¯ÿÿ“ÿÿÿ–ÿÿ›ÿ–ÿ˜ÿ•ÿ‹ÿÿŸÿ°ÿ·ÿ¿ÿÐÿÚÿÙÿÕÿÏÿÆÿ¾ÿ»ÿ¼ÿ¼ÿÀÿÇÿÍÿÒÿÖÿÝÿæÿõÿ)6?DNY`caZOA6-'%$!!%%'(# ûÿøÿùÿúÿúÿûÿþÿþÿýÿüÿüÿûÿûÿûÿùÿùÿûÿûÿ÷ÿôÿòÿïÿëÿèÿçÿåÿåÿçÿêÿíÿïÿñÿóÿöÿøÿúÿýÿ ÿÿýÿüÿüÿûÿûÿûÿûÿûÿûÿûÿüÿüÿýÿþÿþÿÿÿÿÿtkabber/sounds/default/groupchat_their_message_to_me.wav000064400000000000000000000327001477701321300236070ustar00nobodynobodyRIFF¸5WAVEfmt "VD¬data”5À"ÁÈD® Zʤ‚ô\²˜0¨PøëNö1ö^Ýþ­ú\ï&NXFA’ètÓ(. úðá-âþîàÒ ÌŠIîÈfønôYò-lûµîr$ vóÄ4ù×”# èˆËžf¢ÿÔžõØ\ø•ðX.xêÅàó4Ä$Û`Ï&2kåWòÑê"õ¨ úyËßßüä@„Jì„ëö…üÛ6çF hØùpïöûµL/&ÅYñ>úTþÍÿüì¤ú¢ ^þ’é^öÆpö#ùN÷Ä ;"¨ç"DÎñKûfÜ2ù /ì8ò˜! bëðGðüüž˜Ñ¶ùâióº&ÚúðÖ&><àüüÁZ’$ûê °ú³÷.W ºÐþòÊõ"ç éÝþx4òc–0Å’î®ä0 ´ wô×ÚKj °Œ¶ûçò| í÷Rkökà+é5<$êê°Ì$ñœñ^û$uÿ&íWFòùöëÜ®ôqÞfäxrûû‚õáÝ+Lô?âüZ ö@ôeK8þžúhåêü p÷düÚîHö$$nÂèGéZö*ö÷òàùrï ßV>£ûtúõñK#[4â&óædûŸü0ûûù, KøÞ.ì€þá¸ýb)~Ìù×úññ¬óÛê|iôçÒø ¬ZÆñâí< "Fñòèÿ žŽÒçzõ×]ÿ¸êŠó ò }h ¬íüó¨ ¸ ìpà^ä>ñºþêKóú ¹èv†útÔ 2å5úTpüøÄò`ý¶ ÒùŽÛù, 4÷¢6 Ïã<üñí>  õù|÷œãDßhDÜúT÷&!=U– PúÿÞøuábðD :ýpðãÎþa»ïƒñix=5 êîª ‹ üé±î9fù*ïîz >&¬~ýðl ÓþªÞDæp¸ü~àúì„Æ6û„øö~ûã¡ô“ôL¦&:æ£þê fönë@ò¤ûj޳®÷:#›Ó÷Êì&îTõ-PùöãîôÉrøÀÓ÷I * Ú¨úPŠ®ÖöPóþ&r,ÿ$ê’ñõäïHøº÷_ùÛû]õ² ¼tíàéPìUø© `¶ïBù잢D T ²Õö:î¬Ú ôøìRëö õã*êâ Pÿ÷".ép †÷OL ½þqöÂçŠâ¿ Ù"øXó>ÿ„ ™ö |ýkó`ïgÄåIí©  üªëåÞùèƒú‚ûhýš®%ö&þÉ Büâè[÷`ý"ñ.ò£÷öò²QPÿŽù\ýfb¬õ&ìùÎÿ'ôTûU PwŠýPú‚’¾múçù 44Üù^ì\ö¦ø´ìªìwòxðžþ„ ¤ûÎõ4œ%Øîdí¸À|Âþ¢ðvö– ` 8¸Ò) ¬æìöÓ#µ¿ù¦õ0ú/¿ ³÷Ü®å¢ù.ùZûäÿ29а LŒ lÞïùOì¬étJíÚ÷Ì :>Áûb÷¼ûbâýµøû²H ­TìBî\|ñqê*üöl‚ð B k®ñü#þÜpôÂäëäù2cþüÅùˆþáþÙ4 }÷ óJýûü¸ˆ ë•øòJñ؆N'ö:úƒ ïɨœú½êðXçðEô.öÔ÷ðñáò6 `† ©öžö¡ýŠöEû°0ô–ýlü1­òÌîúÈvý–( T äûØê5æiòˆû°ò*í—ö/± < z ÊÐ Òp÷(ø™x þÐï¥ô¨øÐ÷œô,û²ú6öø8 $ íuŽûpý„Nï6äôóþÆù6¢âÉ:Z  W  ÆžñèÚöÃlôÛóòûÂþôýH-û¦ð~ÿèÞûä*¾ Ylô*øÆN¬øDîæô†mlþ𠹡þÎóìô õôJïšì“ö¸hÿ÷V÷"§ ¹úŒüž ˆ œ‚r ÿuûÅýgô²ï¼ü–ý3÷Þû$ ¥ø)äúrò„òû±ù›ì%î"þ„ûnê@ÎVé Uоý³úÂýýõùbøŽìæì˜÷ÐØþ8ÿh ƒ _ ºˆôÕï"ù_üßù ÷*ú@Ô “y ™j Ζýö´ûÚ j 2ô¬ì û>üfúðqé„õÆÀ5öÝB9Äûóè ï3óÕí&òŒü’ ˆä  f:ü¸ÿV÷VòpïÔöúìþlúrù–ô”øljý¯ü2 ô h ¸DüüÈôþó®öúö²óš‡¸ „ú›åþµü´úDôþïé÷ÿOúüü ( çü¢úÎ ŒRÓ ž @µýrý¤øÜí•è6ò&þvúpòŠ÷hºÞ† Dÿ@øûþÿ4ÿ¤úb÷Äü)&ýž & Ü+ÿ:ûhý< êL$ô¢ûz’ØöÈî.îbò>ôôõøný¤ f F\ žt ¢úJ÷tûLüÐüšÊþ’ýì‘ dj<Vþbü¸øfû~Pÿgúüfü,ûGúûûô'ò†ý¢˜ Ð]FÙ " À xþ—÷ô‘ðëð˜ûh"múpüè*ýÂý^Øûž÷Äùœü(X  5üZóžúr óûÒüFŸ f 2 €: k§²÷`í'ï÷ªö”ïôñàû} ÞÄÿ¢ 8ýZ÷¼þêùÐþ›i¬þzúZú¦, ¾Zý?¾ <ý&ñ¸òõ.ñŠðQô¡õpø4ˆ H ß tÖ Éÿlü4¶ÿ ¶ýýÜû×0oý.úÜø=÷˜ú§Þú›Œ¾ÿý…ÿýÝó‚î>òDú°þþ 6ðJ ] ž PÚúøõ¢õ*ú}þŽûÊ÷8ü.:*÷JômýÛzþÈû””óœþXýzÁþ|ó¬ð2ýxÔÒµ ò e Ö { FÿõtõŽõ§ðýî:õmýhOýû¼þžâ""ú+ýðù Ü !ó‹ÿ·ø4öú¸þ0ûý™ün? Ð Š ÐKþKú<òáî^ô*÷dôÐõÅüŸ\ „ ìÑòYÑÎêš)Üÿ˜k®úŠ÷ úÔ÷üò^÷ ÿ~öAlþ¸ù˜ô¾öÔúþ÷ ö,ý½² á à ò+TÐþšýÆÀ;û‡öú ÿŒøÂó˜õŒø ö÷nÿ`,  Î&Ð$‡þóóûåbP @  ºVýìûÌ„ü’ñïð÷¦òÿ¶úTøÇ÷àù·ÿ6Vûÿøð H > ä Àýäø(öÞö.ùøü"¸@þàxøûØ÷P÷²ö™ôHõ^ûgQ2ÿÎø‚|8ëàËþk ¼ ù oBhù„÷Ôôüïyñ‚ùü¦÷²ùÒš ² ?øÿðüÜúvû)úð÷½ü 7'Ø ¦AOÿxÿ£Ðfà¨ÊÔþÔø2ô„õ,õŠò<ñêñ‡ù(I „ ¾\L ô¬þšø»úßÿ9ÿØü(.\ ® ëJý(üƒêjü÷û0>þŸùÕû•ýú1÷æöLöh÷þ, r @>š `J ºóûÅôÑõŠøÎùàûŸÿ2ˆ¸K6þBýºþ¢ýù:÷ÞøþHæÆ üLûÙþÑnðZ³ 4 O R Œ @ ¸~÷èðÖð–õJøZõôQüÖºNìîjýŒù+ûÿðXx¿ÿt¡ÿÂÿìygÿÂ21|üç€û†öœõòôÚòúð>òÇ÷\þF#Q" Ì D €&üæý¾\lÿéýî"IÀ2ÆüÆú~úòú,ÿÈÜæÄÿ=Züý÷rùÐú"ö"òìõÄþÐ| øx £ ³ R X–ýµüïù!÷rúÔÿtUýnøœøàýÄ2þŸüÿjzwò¦þÎý‘ýìú˜÷ë÷~ÿš€ þ˜¬úuJýûü÷Gõ¾ò ó¾ùBÐüxü– ²ÿþ(r¬îæCÀö üy÷vù”ü›þÖ/²Z e fCþzúAô±ïÚñö÷.ûtûJü•þNJ 0 $|r%$®|D€ÿ:þÒÿ¬ÿÀú–öá÷Üùjúšý¾ã€ô"üÞúrý4ûsô˜ò|÷ý‚nIè ƒ µ Q `¥ÿn²¸Fþ>þÐýý€þçüøÁõ£ø ûÐøŽøuÿ " @$l¯üþéù®öù(ý}þH2@H N²ZIÃjýÿ÷¢õ÷ºú þÿÎüPûcúÞøVùÿýäŸî ·t ~ XÏüH÷ˆøtú_ûýhþàÿ.1î ¦¾üoöaõ¤ø³ùjùÎû:ÿøÿbÿ|Ò5t”Ör D œ^¬ÝÊbùDóÊôXøÑø|ø6ú˜ý¬lÃ$ζ$ý„ø¤ö¦ùÔþúvzP $ÈÿÔüsâ„àhÜþ.û¦øÎ÷Îøø&ó¦ïÔôêÿnèàüN€þbüÈú üÒôÚ¦Û¾>k\ÿhþbý´ü,ýªþgÿžýû_úxùêöêõø…ûÄÿãÚØ „ È † ,Fÿ<úP÷*ùEücþ¹rnÿ_ü)ýRþäþkþ•úîö"ú7t’ìþˆÿ0þ°úîù|þj_ F–(ø ’Œ @dúšõ(õÙõþöœø•ùÃú5ýÉÿ J¤Úþ4ú0ù¼ý\Òjvèʼ„ÿþ¸0¹–R ?"RÿHýêù ö§òñ`óÔøèüÇý  šüþ ÿpþ…]þåÿ@YBý¦úOúöü¢Þ§žüÕúaû:ûÌùò÷Àõõæøš”ú { ö ö2P,xÿÜüþùìøqü~¦˜Ôø ø^û)þÿWýü7þâ°‡zãÎÀû(÷"øxü›•HZŒ ¢ À 6zÿ“ýû(ùÜö’öÕøVü4ÿnÿþÜýXþRþïýOþó˜¨ëZœ^°ÿðúšù„ûFþEâˆlNNDÿbNú(ôFóˆõ´ø‹û1ü9ûhüv4ÔVÚÿFý@&È–ÀÀ•ÿŸþžÿÿüXùDø0ù€üÊÚÎTÿ›ý~ýü¿÷¸ôÛõû.@8ê: € vì‘k`ò¥ÿˆÿGÇöýjù ùFûü$ùºöÚøìý|f‚ìy€¯þºü¢ûæù¢øbûõ5x é Zº™0Þ>ý—ùLøÛùvý*îÿ"ý"ùzög÷æû°¥0¸RëD ô 8>ºûÒ÷ë÷rû ÿ`>ºÑT»»[ãüçú¾ùÊøÞùrüýJüýü”þVþþÖþø2æp ÎÛÞ~âý±øöL÷®ùú˜ûqÿÒGÞ ìþ¨ønõpø˜ÿ)¶hýÓýVxrŒàÞ¯ÿ²Æ– rÐ,ûIù^ûpüYùÛô ógõ0û c Ãv>ÆNyÿ,ü~ú´ü\r*o?éúÿ~ÿAÿœþ£þ,ø¼þ¨ú|÷Òöø‚ùºúfüÍ Ä È ’Ú š¡þ2þâüâú¶úÔý檔üîûrþ†þeüÚûžü§ý^ÿ4 ®ÿ/ûdøxø ý%j‚ù û § «×þ!ùm÷à÷·ø úRüÐýºüNûþýƒøÇ¢ü¼øNú€ÿ¬Þ.–¦˜ Èÿtþ¾þª~îf:½ ´þØûvøSõôõ@÷fú þhŒzi ÿ°ÿéí ƒ°ÿ¬—kùýzûZûÂýFÔÉ%®ÿúÜøŠû¤üÄùõFôØ÷zþ.§ Ú ¤ úÈ0ðbþÎù—úÄÿ"æÿûÆøÃùRüþKþæþôÿ*zB4žúD÷Ú÷DüøN¥Šv N ö6jÿýû}ùÆù‚ûeü}üý÷þoþ ü ûœü(ÿ Z³³?]gÀýÈù–ùÿüºN·]'G›‰Bý÷õQölùü7ýþü ü.ügÿ,j<Ðÿ!ý²þê Ô 8ˆ.ÿdþþZü~ù•øªûXœ(ê&þôþúþÞûlø›÷ÌøèúÊý*îݰtL66l¼8z€N’þÌûÚú0ûû”ù"ø^ù¦ýzHÖ6(ŠþÔý2þÕýüHú¶úáþTÊ M ¼°Jc¢V}wýbúáú þhèýŠø¼õq÷—ûTÿÀ)mb; &§2üLøäøâüˆ™ÿ–ÿ(e®}°,ÿDüû2ûfüíýþŸýüüþ_2ÿöüý2LÔzPp DÂþ­ûù øô÷lú:þ£Þ¨èÒV4ÿú¿ø^ûÈþ‡|Tÿ@þÖþ 1|tdÿàÿù è š¦éüQûøûLü†ú<÷áôÿõÈúÞâ-°öxìŸ ý´ûü¸ÿ\R¯LæÿÖþÆÿ9¥ ²ÿrÿSÀ̲þûpøÐ÷6ø«øêùÒü—Ë"v Æ ªMŸÿªÿ»þœüyû•ýÐVFŠý%ýhþ¤ÿ ¬ÿéþNþ>þ*ÿ)=Fûüö”÷æüŽ2.ã’ ~ $ò¸üàøÈ÷2úäý>ÿzýJûŠûþ2ªšzýøú&üoÿx ÌÔÉÿ&ÿòÿÖ—Jÿüý3þï÷ˆ¬.ªÿHý û»øÒöpöøû>þ.ÚFpîüúÀÿ¢ÿÓ­å±f_Âÿ^ÿ"ÿÌþàý–üèü°äêøªÿÓûû üAühú„÷jö±øýpú8ß Yó°5ÈÈüÂüJx0¨ÿ—û@ùù«ú^ýÞÿ ÿ&‡¬ïœÿHúÖ÷Bùgüÿº. äíTJp@ËýýüPýRýwüæûü.ýýIü€ûûøû<þÌl,×lÈŠÅ`ý ú.ú&ýÓ$oÛ``wŽ^ÿûØ÷D÷ªùý¬þý_úþùSý_ž?ÿ)þ¾øùâ\€þ¾ýxþÀþ)ý:úÂøzû‚€6þ&ÿnþúýäüûžùù¯úªü¢ÿþÉâÙ.оØ62TV7ÿáü‚ûTúYù"ùøù’ûÀý­ËÔÅŠˆþPþ þþwüjûŽü°ÿlF*®Ì·øºê&ýŒüþ°2 ý`ù ÷&÷öù@þÎXZ6 O”¼ÈÌüÎùãúæýH¨œÀHøܦýJûÔû”þŽÝÿjý»û2üÓý”þ¾ý®ü_ý>žÂ@Bï_Áý\û°ùªùŽûˆþ°ðqÈŸEnÿºüûœüèþœÜ äþ(þ´þƺŒ¾¸ÿš8 v ôþÈüüÚû`ûÖùÊ÷\÷WúóÿìŠÜúH²ôLÿªý¸ý>ÿÑìÊDXþªý¿ÿ‚Ð<ân@nÿNüàù)ø|÷”øûèý0ù5þüƒ,ƒ²Á~ÿÖýhý¶þ°Ä#…ÿoþEþ€þ4ÿ° |8ÿ§ÿ6æþÛúÒ÷FøòûN"%~8…÷ž6dwþÏú"ú ü€þrÿ"þü¤û´ýzÜ%ÿ‘ý¦ýçÿîVä)ÿÂý(þLÿxÿ?þZý^þ0ß"~@rZþý¦û•ù+øîø’û6þmÿ¢ÿ A®3ªË´æ‚ÆhvÿÿýÆýaþ¯þþŒýËþöpÔô4&þùüÉüüÂú ù6ùÚù(üþÿûCËZU܆c(æ€ÿPÿ Ær\ÿcüîù4ù–úý®jz ÐøÜŒÿºûhù¬ùÖû]þ_ÂÀÜ@Šþä”.ÿÿÿâþ:þdý°üOüêû^û&û–û¤ü&þWˆR@$8Þ”ýûðúLý>ÄœŸ¤.ôžÖJý‹úáù†ûõýœþ¶üHúüùlü–ÿ:îáÿ¾ÿxxNÀ.J>þlýBþ—þýºúúxüú²¨Œ¸ÿÅþþ„ý÷ü"üû‚úÒû¼þum²˜¤8 ç²ÈŒˆ“ý0û ùùTùXúü)þ†îtò¼ÿðþjþìý`ýçüDýôþ€ÎÂê²)}âœbÿ þ+ÿŒÿ–þ:üfùx÷Z÷RùôüçZŠËXšY`¤<þ©ûæûÜý´ÿм¾ Üò7$1šþ)ý¶ýŠÿÜ:þü‰ûäû:üoüæüåý‡ÿ¶!PʰIçwþžüûâú>üþaÿØÿË”¾åtÿDþëýRþ2ÿ2šàÿ^þ\ýÐý.ÿOª€°Ÿ ÕÝ0Dý(ü:üÒû\úîøùdûÿgîH­’hㆣÂDÿbþùþªüêý_ýÿ¾Wqþäîp,dÿHýôú×øÔ÷³ø/ûþþÿ,Ž|ïÎR¨ìV¤ÿÿÖþ<ÿ²ÿ°ÿIÿÔþpþ0þ˜þÖÿZPe´ÍXF™ÿzý©úðøVù–û¦þf.$Ö§s»áa»ÿ´üØû÷ünþµþ¼ýŠü-üýÅþ@´8ÿZÿèvÏnØþNýôü'ýcýžýêý¥þg0š4&†p:ÿ)þüÊúÛù7ú„ûýIþüþ„ÿEüP…öxh˜Ìd‚þêü{ü/ýþ<þŒþÅ%ÊŒJBþýübû¾úNúŽúüÎþÌ—zJ›@ºÒ  :eùÿ~þ`ü‚úðùIû þÀ5Rãí ~ÿ˜ü¼úoú„ûzýzÿÚ˜<8k1ë”ìËU"ÖÿJÿeþ(ýôûNûPû©ûüçüWþ`d³("ðZê¯ÿrý2üPü`ýÐþ6V.ÞxÞÌ p(ÿ&ýüoýƒþfþëü@ûÓúüìý5ÿŒÿºÿ„ôò@è¦jÖþÔýùýøýýÎû¹ûlý1¸ò–Z/ÿÒþÎþ~þ–ýtüâûnüäýtÿD+ÊÿøÿÄ[L|eRØ(þ&üfú}ù¼ùéú™ü†þ†2&:‘’ ÜÿÿZþÊý¤ýëýÁþ)žDÑìða6Ûµ€“Ìÿçþ³ý üúEøñ÷¬ùæü(¶ë¶ Îö‹®ÿ°ý,ýÖýîþØÿ8 ¾ÿÜÿ¾®ü^2ÿiÿ~ Fzþü>û¾úêú˜û·üþ–ÿF\ @zVf<8‘þYý›üVüŽü.ý þýþÞÿ|Ôç¬,ªÿ€ÿÌÿ6PÌÿÊþÀý$ý<ýëýÌþÿHTíá…$ÙþýZüÂûàúú>úÙûTþÕžò•â—ŽBÿøþÕÿŠ*øþþþ4ÿ↲*ä༂ÿæýÌûÊùÊø[ù8û‚ýnÿÄØñض÷<Àôÿ†ÿ’ÿ¶ÿ|ÿÔþ(þÞýþþ:ÿ6PW˜þÐü2ûBútúÚûþAúÞªZhnœ˜õþþñý>þ]þîý$ýžüÙüÐýþþÈÿ ޼eøpdÿ ý¤ülüºüPýþÿqM]äÚܬÿ’þpýaü¹û–ûÔûPüý3þBÿÜÿ`8jb»yÞ ë~ÿ þþüŽüžüýÞý0ÿþr̆ÿþ¶ü°ûûû^ûPüâý¾ÿ6ÎÂÖ…ŒB3f8 Tÿ‚þ`ýüûúèúüþPö4 »@R¸ÿšý²ûÔúEûœü)þtÿrFÁ#ì$9¨:”ÿˆþ1ýâûûÚúkûvüºý)ÿ»B|/IʬôóþEýtüƒüýáýâþXPîOjîxKÿÊþ¾þˆþÌý¸üÓûŽûôûÌüÐýÖþáÿZκẄ\ÿõýdý+ý×ü‰üÐüþÜÿ¡²ædsr²ÿVÿÿžþÌýý¾ü.ýþ¶þÿ:ÿ–ÿjÇ^®>øâ„rþêü›û¿úœúcûüüöþª»,@Ç5tÿÎþ-þêý#þÀþxÿùÿ(2bøðò’”^‘”RÿÏý6üÆúÎù»ùÑúØüÿÛð²v =‡(š?ÿ`þ þ€þ&ÿ”ÿ‹ÿQÿbÿ Êòàúúr6ÿŠýðûâú¦úAû€ü þˆÿêe®|bMx+ÿOþ¾ýVýýýjý$þ+ÿ'½Ò € ò9 w^ÿ:þjýýý8ý¤ýzþÉÿn$¹à<‡æßúÿjþýü2ûèúHûDü¥ýÿ`/}vo›ó&á òÿÿÆþÄþªþUþþIþ/ÿ¢PÕÀ·¾DÝ«ÿcþºüîú¼ùºùìúÈü²þE`¤%•¹T`3EÐÿ¸ÿ’ÿ ÿ0þbý*ý¿ýâþÆP©²Rw$lþ¢üCû¼ú.ûLü¸ý6ÿº4€jÒ¦èÌp†ÿ×þ`þ þ¹ýRýüüÿüŽýþ~ÿJî˜B²±./Âÿþºüü`üRýpþ|ÿ•æf¢"¦Z²(ÿ@þµý6ý¼ü]üQüÌüÇýæþ¶ÿ CÞü,ͪzG*ÿ>þ—ý4ýý>ý þŒÿuìÚ3PY@þþ±ý˜üðûÛûNüýþÿÑÿ„"Æz#‡‚r šhÿ0þ*ý€ü:üeüýdþ ªÎI(’¼¼šÿTþý3üüü¨ýëþÞxö‚œžøêòWâÿ"ÿêý„üxû,û²ûÚüRþÊÿ ڊ­Æþlýçü ýuýäýhþ9ÿf©¢¼"vßaÒÿüþäýØü6üüLü¤ü7ý6þ¢ÿ6¡ºo¥B4­†þnýÐü¬üúü¡ýŠþœÿ¼¾n¤N–¿µÿdÿÜþþBýØüþüý>þÏþZÿ*ŒìÚô&ÆFöÿÖþÄý«üÁû`ûãû@ý ÿžŠÒÎØîÈ6DHÿˆþ.þ>þŽþÜþôþèþÿ¢ÿ²Ü²$ÝNFØÿCþÓüÂû<ûJûøûýƒþòÿ<JP Š¿ëQÿ°þhþþõþ>ÿLÿLÿ“ÿ<²þô¶d„ÁÿŸþ6ýîûLû›ûµüþcÿrw Ö¶Â×Fªÿìþªþjþþ¨ý˜ý þêþæÿ·ŒxÈV²wšnÿgþÉý‡ýtýoý”ýþ6ÿÂkÅ…ž :Ö…ÿ6þýTü0ü’ü:ýîý£þmÿDö[wœ¶™$eŽÿÌþLþþ&þbþ¼þLÿ5€î@•Tåÿñþàý ü€ûûzû¼üRþ»ÿ¬4Œ¢,<˜|rêÿÐÿ´ÿ.ÿLþzý?ýÎýòþ:3È Dr^À|Êþ&ý ü´û üÊü§ý•þ¬ÿþbwîÈA ÿRµÿêþBþÎý„ýbýmý°ý:þÿâL\&¸þÿ«þ[ý†ü‚ü@ýZþjÿT:DNo@èÆÿÿ¶þ^þÈýý„ü¥üqý|þKÿ¶ÿþÿ‰|”SVZ 8ÿ¤þ=þÜýŽý”ý2þzÿ|&ŠötÒæÿ¼þ¤ýòüÈüýŽýþ‰þøþ„ÿD#ñ€Âδnææÿ¼þÖýZýIý‚ýöýªþ±ÿäô†wñ0m¬ÿôþ:þšý<ýPýâýÑþÊÿzÎþYù¢ð²ÿ8¥BÊÿþþèýéüfüœütýœþºÿ š„‡ØŽ*ÿ>þþ;þþÌþÿrÿ"ú¼**ØjôÉ\šÿ¯þæýtýSý_ý{ý¼ýRþLÿжŒöþ¼.``[ÿ~þøýßý-þ¾þ_ÿìÿlêf´¦5”»ÿœÿiÿúþ[þÒý¦ýìýzþ ÿÿøÿ¡Œ”a¥8< Hÿ¸þþmýý0ýþNÿl /ä\¦ÿÿ¸þÊþ ÿ:ÿ2ÿ ÿÿŽÿhTþGRM;ï<*ðþÙýýÅüßüPýüýÇþ©ÿœ|AµPÔÿVÿÿòþ"ÿfÿ’ÿ¢ÿ¸ÿüÿ~Ž»—?Ökìÿ<ÿTþdýÂüÀüjýrþ|ÿIí”Tõ,ÁÔ¹Øÿaÿ<ÿ&ÿòþ¡þlþþÿ¼ÿF|l^ŠöRF°Íÿüþ€þNþ:þ,þ6þ„þ5ÿ@mnÀ6šî)ÿFþµý˜ýØý=þ›þìþOÿÏÿYÊ ï”bÿÔþˆþˆþÊþ"ÿ‚ÿÀ®†è¨æö pÿÎþþlýöüúüŒý„þ„ÿ>šÈzõ4ü]¤&öÿàÿ›ÿÿbþþJþ ÿøÿ¿4iˆ¨®d§…ÿVþxý*ý\ýÔýQþÎþhÿ;3„†9؉<ÔC™ÿþþŠþHþ3þ<þ[þþÿÈÿœU»À„.Â*Vÿmþ¼ý†ýÞý‘þaÿ¸Rï|Æ›ü<¬ÿ_ÿ$ÿ¾þ&þ ýxýÔý†þ4ÿªÿñÿJäªMz2:xÿÿÊþ”þXþBþ”þhÿ‹–/;ê‡4ß\–ÿºþ þ¾ýÕý þlþ¥þÞþ:ÿÎÿŒHÒ ä™0Aÿ~þþþEþšþÿ°ÿv:Ââšrãÿjÿûþ‹þ.þþ8þ¾þnÿW„Ä<Ò>DâPÊbyÿÄþþ„ýýþÚþ¹ÿ^¿T¢¸`–¥ÿìþ¤þ¾þÿþ2ÿPÿ|ÿÚÿgr”s6úè¦bÿ¶þHþþþ-þPþ¥þBÿôœóüËwvØÿBÿÛþºþäþBÿ«ÿHˆÌ %ú <þÿâÿÇÿ†ÿÿ¨þfþpþºþ ÿ„ÿâÿMØjH¶ñ<Àÿjÿÿ³þdþdþÌþ|ÿ,𹤙ZøÿŒÿHÿBÿiÿŠÿ…ÿfÿ\ÿœÿ ÄDˆœšci¦ÿæþ\þþ)þjþÈþ1ÿªÿ1¶F,è¤pHÖÿ›ÿ~ÿŒÿ°ÿÐÿÞÿêÿH¤þ32þ²` ¨ÿ%ÿ’þ þþLþåþ’ÿ„ÞB¢ÔµB©"Ðÿ´ÿ°ÿžÿvÿFÿ<ÿkÿÆÿ!NL@T“Ð׈ÿ*ÿüþîþêþõþÿuÿ¼bËâ´e¸PÊÿBÿâþÃþÞþÿBÿeÿŒÿÂÿ Rˆ¤ª©¤™x6Öÿvÿ4ÿ&ÿJÿ‚ÿÃÿiâ^ª£JÄ:ÌÿrÿÿÁþzþhþšþ ÿ“ÿGd|®ö.1ó–Fêÿ¢ÿEÿÿ ÿ^ÿÜÿT¨ÏáîñÕïÿFÿ¼þ~þŽþÍþÿPÿšÿÿÿ‚þN`BêÉž` ¦ÿTÿ ÿÿÿÿ0ÿ_ÿ¶ÿ-¡îæ´y,ÉÿTÿìþ¸þÌþÿÿ_°ø?ot:ÎTöÿÀÿžÿpÿ$ÿÒþ¤þ¶þÿ`ÿ°ÿèÿhÌ.^BÜSÚÿˆÿ^ÿCÿ(ÿÿ2ÿŽÿ"º"=踌Nðÿ{ÿÿÐþÆþãþ ÿ.ÿHÿqÿ¸ÿ$šü0<4 þ¸G¾ÿBÿöþâþúþ,ÿmÿÀÿ#Œâ üº_»ÿÿHÿÿìþíþ"ÿ|ÿÔÿ<e£ô<Z<õN¼ÿaÿøþ¦þŒþ¾þ,ÿ²ÿ f”¸âôÔwøÿ†ÿFÿ>ÿZÿxÿÿ¢ÿÌÿjºæèж¨Ÿ~3ÈÿZÿÿáþÚþåþúþ(ÿwÿìÿhÕ# ÛT°ÿlÿIÿRÿ~ÿ½ÿòÿ>dŒ¨¥‚N!êÿÆÿŒÿJÿÿÿ ÿXÿ›ÿÞÿg¼JJ §?îÿ¸ÿŽÿ`ÿ:ÿ0ÿUÿ ÿúÿ@bbVNPRAÜÿ¬ÿ–ÿœÿ¨ÿªÿžÿ›ÿ´ÿôÿJ™ÐæêàÉT÷ÿ“ÿCÿÿÿ1ÿ^ÿ’ÿÇÿBy”‘uT:(úÿÜÿÈÿÄÿÎÿÜÿêÿóÿ!JzžªœtFâÿ¨ÿfÿ,ÿÿ&ÿbÿ²ÿúÿ2^ˆ¬ÆÁžd(üÿèÿæÿäÿØÿÄÿ¶ÿ¾ÿÞÿ"+,2F^fNÞÿ¨ÿ†ÿxÿxÿÿ–ÿºÿôÿ@‹Â×ʪ„^4Îÿ¤ÿÿ’ÿ£ÿ¶ÿÄÿÒÿâÿúÿ.@JKIB6øÿÐÿ®ÿ¢ÿªÿÄÿäÿ0`²¸œj2þÿÔÿ°ÿÿxÿnÿxÿ™ÿÆÿóÿ )8PhtiN1èÿÈÿ°ÿ¬ÿÀÿìÿD[debU9Ìÿ–ÿxÿvÿ‰ÿ¤ÿ¾ÿÙÿûÿ#Lkzvk\RF4ûÿÜÿÀÿ´ÿ°ÿ°ÿ¹ÿÆÿàÿ.O\XF0ñÿÌÿ¬ÿ˜ÿ˜ÿ°ÿÒÿüÿ >VhvznS0úÿëÿÞÿÇÿ­ÿ™ÿ–ÿ£ÿ¼ÿØÿîÿ;ZllT,âÿÐÿÅÿÁÿ¾ÿÅÿÝÿ3Vd`P@.ãÿÆÿ¬ÿ¤ÿ¦ÿ±ÿ¼ÿÄÿÎÿàÿüÿ#B\dd`TA#úÿÖÿ¸ÿ¬ÿ°ÿ¾ÿÔÿìÿ$:JJ<#îÿÝÿÎÿÁÿ¶ÿ´ÿ½ÿÐÿéÿþÿ,@VbbR;"ðÿ×ÿºÿ¦ÿ˜ÿ¢ÿºÿÞÿ(2;?9$èÿÔÿÌÿÏÿØÿÞÿæÿïÿþÿ)9?<62-&úÿÜÿÂÿ´ÿ¯ÿ°ÿ¸ÿÄÿØÿóÿ/BJE8(òÿàÿÖÿÔÿÜÿêÿøÿ &($üÿòÿæÿÖÿÊÿÃÿÆÿÐÿáÿóÿ'8DF<)ñÿèÿßÿÚÿÖÿÜÿèÿøÿüÿòÿëÿèÿèÿêÿèÿêÿîÿúÿ#)*("òÿäÿÜÿÚÿÞÿåÿèÿòÿ þÿöÿõÿôÿúÿüÿ÷ÿìÿîÿøÿÿÿøÿíÿäÿâÿèÿóÿÿÿ  þÿøÿòÿúÿùÿïÿøÿ úÿ üÿüÿôÿúÿüÿ÷ÿöÿöÿòÿtkabber/sounds/default/presence_available.wav000064400000000000000000000064001477701321300213330ustar00nobodynobodyRIFFø WAVEfmt +"VdataÔ üÿòÿìÿüÿ 06Ôÿ°ÿ¢ÿèÿCT5 ôÿäÿþÿôÿêÿÔÿüÿ&Ôñu¢ÿ5ÿˆÿT®Jäÿ+zÎÆT¨ÿÿ¬þ%ÿÏ·*xuÿÿ5ÿjÿøÿ\ÿáÿÌæ²l¤þ5ý•ýDÿ¦„:ÔÊÿTþ]þ“ϼ¸ÿ þƒþŽÿÚ6Ö¶ýDürýµÊœÚ ý]ŽÊÿþºý+ÿ^ÿïÿ¯æÞºf§ÿìþþ ýÇýºþp„ÊÚ·ÿÔýÖýJþ0ÿpÔÿ*îÿ½‚ÂX’‚ýý5ý´ýà„0²»þ•ýªýªýíÿÒêþêþÿúÿÑ’>êÿ€ýøû˜ýTÿ  a—Eÿ,þ$þŽÿ0ÿ"j‘¾þ™Pÿ#ýü+ýÿ¨îÖÈþ(dÿÀÿÿ¹üPü+ýƒÿ `¶æU,ÿÈûÄüUÿ#ÿbÚÜÿ¤ÿ*ÿºÿÈ–Üý„ûûBüÿš¤B…üýçû¥ü8ýšýÍFç"×^Zþþ,ýüý·þŽl¸´Cÿ‚ÿðÿÉþQþÿ|ÿ…ýJþþÿ&â(­ÿÊüüLü|ý44¨^þþìþ£z|þÜûvû`ü­04€Pÿ(ûûû”ý§>Qtøý”ýùÿÛý;ýèüÿ\.ÊÆÿþfýZüžJ*ÿTýüJRJ8]þäüäùfü&ÿȈêÿôþ4ü¾ÿLý€û@DÇ:ú>ú&þ‹qž48øõ˜öhhûªnx,û\û0ý“Úþ´ø¨ûøþÁ }þ´"¾ù«újÜöþêù<ýý« öúà –ô^ ï;ÿä È¿ûBþ6 ÿ$üÖö~üÎþYþçñ‚úÔd õ~ûÌûýý þÞÔ'E¬«Ðÿšüéü’üòþ¢ÿ§D’Bªÿ°üÂû>ûŠþÎ2Œ#X¬»þ„üÎûtü’üâÿgµGp‹V¿üXúûþÞàûrþÿþìý›ýZýàýÎþ0x9”2Pÿ€ýý8ühü®þ^ÑEü÷þþ\ýœû^ûlý¥þ¸Ð [þ~þpýEü1ûˆü6þÆh ÆoáþRûúûú@ýÚÿK\v 4þý ü"ü|ý-ÿÐÿ¾>¾qF2ÿýëüˆû>ûÿL`l‚|sü’ùiûý.ýHËpƽiÿ¢ý:úºúæýÞü–ÿd Ž÷îý üùQøý­8®’¶ÒþÆú@û§ûPü ÿÝ2Üü·âøÿðü§ûú÷ûpþd\I8ðfýÊù?úêù ühŠ4Æò¢lÿPü,úJûÜü,þjäàî”ÂþÄüCù.øû~ÿ(êL/þLû¦únûâû°þ&Wn7–"þcû†ú¢úDýÜpLfýzúªù^ù®úØÿ++ ʦOþ|ú¨ùüdþMýŠ?.Lÿ ýˆù4ù(ýÿ0ªÐо þ‹ú]û—útû¹ÿp€Ü{Ó’ºÿôû„ûDûôûÝý2²Hp|åý†ùVù ùwü÷3ã\k–‰þFúžøZûBýßþ7b$”D¦Òþ×ü ùÞùöü ÿ BÐ^pÿBüÌú€ùÈùÊýnP_¨}ý^ûYúEûŠüZÿPlËvœþ€úq÷Úö[ú®ÿ¤p†ø”IýÅ÷zø|û‚ûÑýâ|b0ìFüÿÄûîøxú(ülý¸t^¯•”þrý…û÷ölýþþr~°þúúþûPúÕú¦œá¾vºVù;ô2÷*ûÀübV ˜ }¹Žü6ú‰ø†ø,øRÿæœ ›Ñjýjú úJþ¦ýåüø\ÿºýÎè ]Äœùüò®úÿüž# c–ý‡üŸûûúïûDþÎýþžô € üùÖÿ¸8ý§ýÓøúøfðj ºpõ4öjûÔËöÌøvu0 Aÿ ÿiõíñR „9ÂüFýøÿ@6,þœ û²ïªîÊ¢ÿnÿÀÿ¢T<‹†ËÿŽÿÿÖþS˜(öÿ> Wþ°þhž¸xV¾ÿþõýþ>þHÿ"yz®ÿhÿsÿƒý†ý´þ¸ÀÐnÚ]þ´ý8ÿgrPÿàmÂÿñþ(ÿ "ÓÿÜÿÿ"ÿdÿ§ÿ#èÿš{ÌôþÛþ6ÿ´þ¥ÿ0<6â‰ÿêÿFÿ ý þ8ÿ@õüÜ|ðÿÜýGýmþ¤þžÿíÆnƒM‰ÿºýŠþTþCÿŽÿªßÄ>èÿè4þ¢<öÿ–ÿÃÿœÿIÿ0¤&*aÿ¸ÿÿQÿîþ–ÿ. Ìÿ¨(èýîüþÿÊþ¨ÿ@í6TJ\þúýñüCýVùnzPÁRÿŒþØý\þ ÿ ÊÔ,’4ÿ ˜ÿxÿµÿ’Àÿªÿ2ÿ"’Ò6°ÿ_ÿ¸ý2ý©ÿ >؆±¡þwýZýøþzÿ‚kÜ€,Çþ.ý„üjÿ®ÿä8"æþdýlýþþ¾ý,àL:’0…ÿŽÿJÿ  ´ÿ[ÿ!ÿtÿ¤ÿ™–\þàÎþHþáý@ý¸ÿî:ÞÞxˆþqübýîýâýÿx7qvî†þüýxýþX@ ÷·ýRýþ w朠 ÿfÿÀþR Øþ²ÿÇûþgþ@Z²ôdߢü¶ýôþÿýþéTÁX<Íÿ`ý8ü¢ýÆý$¾½Ÿ"tþžúOü0ÿÜÿTÝRRä@ÿôýZýsþdÿ\ÿÚÃìüÿ`ÿ? ÿ“ãþ3þ¹Àÿýmÿ`"’Ú=ÿþý±üØÿQJ Ë úDüÚûþýÿÿ¥;@ÃT&þøü¡ýXÿ7ÿÞAÖfHÿþfþüþéþ4ײèÿ_ÿH‚þ þò‘ÿ˜ÿ;zÿ¾þ® ðh޹ü©ý§þ¿ý ÿpìÇU8þþû ýæý³ýxÿpöÏ¿v/þ&ûü*ÿSþV{ `†Vþý¶þ4nèÿ·-ÿ ÿøþßlýþaNÿ!üÿj»Ì¾ÿÉþ’þRý2ýþÞLà ¾¥þúØùÿXÿ~ÿþÜ`Bdý2ù‚ü:ÿ+.c Vò]þ”ü@ý6ÿ7Ñþöý´ÒLÿû™ƒÿRÒ\ûkÿøBú€úiF+ÿîÑ ¸ýþÜûÑ÷Þlÿ6ùöš4´vûsó&IþÌv²þÈ”ÿÞüxû¬FªvþTÙ$´üøü€šÿ@þÞÿ4x\ûþf¦DþÓýäÑÉýú¢üËо4 :rû‘ùVþuý§úý®u]ú?üIóUü©nþ+ÿùTÞýû ñD÷²ÿjf- ýûåû‰hÝÿ (¬Jÿ˜üTþýÈý,0ÿn:1þ’úN°wþÞÿÒÿJ\ÃüÒúüþÞ[t‚Tkùüqþ“þ þÂþ| <úøüâþRüÔû¼ ^þêû¾tú \ÿjÿÉöN^ð\ø=ù–ͦȠ%ôF·ÿêþÚþÉÿ«£ÿtkabber/sounds/default/presence_unavailable.wav000064400000000000000000000242521477701321300217030ustar00nobodynobodyRIFF¢(WAVEfmt "VD¬data~(„ìŒEÐÿ|ÿ©õFÿ¾^:ÿ”ÿÀÿNÛÄÿ1þÿúË ÿ%”þ0þJxxÿ6ÿZÿÒÿ¦Xâÿšÿ”ãÌÿ*ÿüèÎþþþ*ø ÅÿÐþŒÿ ýb‹ÿ%ÿ•b]K@¸ÿ–ÿôÿth¬,¨ëÿnêtÿ€þ´þ¸ÿÍž¸ÿ´þ®,þ Rýÿt°ÛàõÀý®þý*1ÿýïÿîÀêÿ‚0¯ýèþªÿÉ&ª˜Ò˜Üü|ý$ÿùæMV@ÿ¢]ôþÈýkþ¥ÿúr›ÿ2DªÿÛþÿNÊf8ˆÿÈýªV{àÿÊþðþZy+ÿPÿnþþÙbRHÖþ&ý2þxšüÿ*ðþÈþVÎþËü€ÿ“ýÊþ° þ¾åüþ ÿ®k$ÿý>ý§þRBëP¤0üöW*ýÁüÃÿ Jÿ2ÿÞ¢'˜þ6æ¾þÆüÂÿ¾ÿŒÿ˜>ÿdÿ_æ½üÌýˆÿßû”¼rû.þ2§ÆYÿìŽþ<ü.û ÿŠR”ÿ+ÿ?êýŠü8„:úþ>˜þ&\Üÿ¤âJòø~õèüŽ„$ÿèþâЮþ.~´HûDÿàý,þ¸ÿ<úUÿŽ !FýØÿ|šþJý$¶ÿ^üW§~þ|þ*þ¼ý>’*HŽÿF$û¤ù¡þìT^¨û#ý£=­¼ýºþ•dÿéûÈþlý ðÌý³þdÂ&üJÿÚþ†ü¦ú&˜”üvÿLÆÉ24ìûRûþn(xü‘ü&–äFxýŸÿ$XjFÿDýŠÿpýëÿàK䵬ÿRûæü ÿ€ºÙþýzÿ$<…ªþ˜þžœö¶üMû$ýêLµv+¢ÈDÌÿr®þžýþüÆÿvÂÿxn ÑÿÐÿšûœüŒÿâýµþ‰Âýìà@׫þ°û\úûÎþ<ÿŒ4Gâzþþ­ýÅùˆý.ìüþ¾Ä¤ð þ¬ÿxÞû üNÿòûþBûhþV‚ýøüâw_ÿxþ&ÿ¡åÿ¢ÿl„ ý.þ•ìÿâû/ ¨`üðý±oÿ‹«Tý÷7ÏŒ’Šü´ÿ3ÿŠý`üìÿâŒ@ÿæþ˜-[ºøXù|ÿüÿ8öÿ£þv&l.°ÿÊýØý~ÿ‡þÝýîþ4ºþ¦þ þrÒ0ýPü6þ`ÿl–¤–BüþðÃ2üÒø,KŒþ‚ûÿ_ÕÐýRÀÿ<’ûÃú˜öhjý¾ÿt§{ÿaü þxœáýÍýåÿÿŒ¼8ÿNü4ÿôüÙ†œüÑþöÿþJ^ô·ûhûPN–ðûÆÿ1pt~üÊÿšàÿÇÿzÿ:\þÿ®›Íþ¢üÈþøý®ÊRþ™ÿV*²þLüW *üÚúN|:ŽþrÿlÙÿÉÜý&þ}’ì‚þØØjü"þzäzÿû†QðSZþ…·ÿ¾ý‚ÿãþˆÿ&‰èÿ£þ°ýÎÿÿ’ÿ%þý,TüûÊþÿýÞÇýþïþ€fzþ\¡Òþ¨w RZýèýä<þ ü°Þ¶{ûÈþxFúýHýšÿÀ'þ<ütVîþÇÿbNnþþêìtþ²ýPÿXŽŠþ*ýŒ‚þ7ÿvþ’®²˜ý ÎÿÊþŒÿsþH$³Bþ¦àÿ½ý–©ŒúÕÿs0ŽþoþqVëû^ÿÃhþlâÔÿnFþÔSþýúŠÿŒ›ØÿöüþÑìòþˆÅÿ|û ý^þŠÿyþøþ]þêþ.þQ”ÒòuLýcX(oþ®ýqÿV@ÿß‘Øþ þèªûkÿF8ÿþÿëÿ3Wÿ 4éýþœ;îþjþBý~x ý[þÌT³ýí:ýÐþzýTúÿŒþxÿÀÿz$[þ ¤Q–ý×ÿµàþe3ý­þ»¨žüÿÂjìÿ6ªÿhÿ–ÿ<àþ$’ýdÿ´ ¥þþ¤þÖ¬áÿ’ÿÿÞn²ý$þtˆº ÿ¦!éþææÿ8¶þþšþʦ±ޤýdIÿ‹þ¬þ>´Qÿ,Ô†[/ÿ’þîýØÿlÿ ÿØWŒÿÔ&V‚Rþ—ý|ÿVÿDÿîŽÂ ¤ÿyÿ.ÿäþtNÞÿºþîþ1LâPÿ¢ÿöâ¢þâþn.ŠãTþÛþGdÊþîtýÙ$¢u”ÿæýºþ6´À zÐþ›ÿc”ÿÿp®þ†þv$`þnÿö*4ÿ“ÿT,áÿ2Jÿþ€—lþvvÿ)ƒ‰þ^ÿŠ<Šÿ–ÿ VJÇÿÄzÿaÿtÿ¸ÿâþŒÿº>Œ¤þXDozÿ¸(¬þý@žÄšÿÖýÿ ÙþUþKÿdþeþ~\¼dÿÎÿ’[ÿÿÜͦþ›ÿæ´ª¹õý ÿÜŽ÷ÿþÿÿÿ.ÿ‹Üâþ#ÿ4b¼yŒÿèÿXV´ÿ÷ÿ^tŠþ°ÿÆsþSxüÿ,ÿäÊAÿ„ZÚÿTƒÿ0ÿÝl &Dþw£kÿÎ@ÿŽŠÿÿ`t_´IÊþäÿÉ–TÔ.ÿ®þŸœ’ªÿRÿœÿ`$[ÿñÿXõJ^ÿoþdÆÿ¾ÿ½ÿñ¨ØÿŸÿ>ÿ:ÿ·íÿ ª°ÿLÿXzqÖ6¼ÿÀÿ>îºFÿÜÿ{ýÿ¯BÎÿþÿJhý«ýºþ;¶¾ÿê‹ÊÿBTVè¬ ÿxÿœŒêÿüÿíÿæÿ(J\¾ÿßÿžÿ_ÿP*:ÿüÿ¨ë.ÿtÿ„“6Òÿ–ÿ²ÿÜD šœòÿ_DÙþBÿŽ›ÿþÿJò¤5sÿ0È*ÿ,ÿ»ÿ(¨IÿÓz¨ÿ7œjÿ?”œÙÿ±Nd!àÿÿÆŒ&æÿÄÿPT~¤ÿ º7òÿ˜ÿ˜ Lq€˜XŠ&ä<ãÿìB¬þ SvÁ9ÿ´ÿªRª"Xÿ¡².ÿvRh|ŽB´x^ô"Áÿ•ÿ%%vÏûÿ`ÿ½-È\½VÜðÿ€äÆbÿM`z(ÎÿÔ·ê2UMöÿ€ÿLŒxpBÆÿò,˜¬op`¬†ÿêþYžNŠö®Îab&ù?¿x©mºÿÐîù¥Œê¢\G'âÆ_œâÚ¤-dá†ô×]–‚Fè†hÿÒka“¦ÿ» ´äX x˜àT<ôÄ–žhŽÒàØ`º³™t©.ÆÂ„ZgèxzÞœXZ" 6nøU|䇂zd‰ÿÜ3 ®‰ °Ïg?¸"v¸íqØ&ó`8ÿÂþ†`œä‡jÿ ¦z¶ÿSeøÐ>ŠÖP8ÿÿ"‚ù’ÿØ~ êÊS‹Ž2µ8È þ„ükÿ™ÛÒó,jĘÿÛdV ˆßVFþÝýºŠgªþ½ý°„ÜÿN,¾Ä À db‚Îî"XÿeûÿÌÿòo¶¹¨þì‘´ý„2ÿðý‹¦Müúšý`Gÿpþp®TÿdüâøáÿÞüÿž¿pKþ¤ú„üþÿÞSã9þ"‚ PÿþÐý+@$üüÆ@’<ý&ü¹üÈýޱÿèüËATGÎýÐýJvÿÛûŒûìý²ýû+ÿÿpüÕ†bÿ[ù ýÊýÀùSûĘý¨üñû.ÿÉÿ°ý=c¤ýäü®þPÿuÿbû‚ý‰þìú\üÐÿ?ÿ§ûúåû®ÿZ 5üþüüQüÃÿëúš÷„ÿ,û<üYù8øèûÖûÒü6ÿ·þûŒû2ÀÿþöÝõaú¤ÿuqÎü2þ§üùü‰üôüöý¯û¬ú!ú„þ ÿþ,KþwürüÈûþ\ÿ«ûðùüÄþþàü÷ûûôù6ú˜ûØüDýû†ýPÿNûÔúfýZûDüðþnúHûù8ó?úˆ‰ûø²õŠ÷nšþMý6ùfø3øÜ÷ý9 ûù²ûèüŠþ¦ùÉôOú}þjÿ¹ýœ÷yú&þ¼ýþû þ‘—ü.÷úBö2ôœûSFü÷Ûõçö>üXRü˜øòù,÷ö û>ûdý`Öø$ôüöüºü û˜ù üÚüùåÿþè÷6ùuö¤õ6û™ÿüüVû½ùÊôdóxô0õ2ú„÷ûBŠîòüp÷âñ÷ný§øtùÝýöüø´øüø$÷^’þ–øœøÅùÍü@øøžù$øö$ú(ü¤÷çõòûhýšüNýŠÿýªúmþHü òNðùwûŠûÂú0û.øUù"ú–ù½û¡öõwùŽù³úÐÿâ\ý²ùû)ùù=üûø òlòÛùhøR÷áøúÒû:ú×*ªù÷)öUôXû¹ù òLùöþÒýÞþ"úìúôb0þBý¢üžûºöæüTýï’óBý˜ùšûú„ü×€ùrøÆüèöˆùLüøÿÌünò6ö–üûýøzôâôÎõþýÎÿ^ø*üX$úæôÄöjôöTøý2 ÷KïÆñaþFàòÌ÷2TùÓøïü4öøVwü.ù•ûÏ–ødöPõªöúý^;ûJúìü¦ýi#øÖõ\ý°û,úçCÔøùó†fýš,ûºôÅòªòæþIÿø þu9ú`õôžõÿØHäþù(útöàû¾~ü¨ûùÊñDðbóôLþß L ¬Sü7ýöåùöÿGþ¾ö©óý0ü.üææüùèû˜þý,øÈûîþ ÚšZø>ó`þOø~~íŽþøùZþ´ø&ú  ×>s1ðý@ôŽðô”ú¥ú½ýüúÈþD0øÇõlûÁný¯üàüØñòí¸ø¼ 'tÖõ.ÿ¸Öú€ý.õq÷2¦øÒùÈ8ŒûGü¢aÿšøÍ: üû\Bð¾óiêžð‰‡ÿ”ó&\ ÄÞjúçý^à4;ýðœóþõBù¬ (çíFü¦Äþ…ûðûXz eÈùí¶ÿùtú`úÄünþùžýJ›>±…Üü.ój÷ ,öÚýŠ}8ñûØüÜüÿXŒâÅÿâDÿpý¬ÿôúúèý½ ÿ‹ÿ} fÿ¤ýxú øLû¬þÆææC-Lvöûàö¶ø7ýZ dþþ¥ÿÿ¼ü øùþS¼¶öü¦*”jÿÜü™ÙÞýný’”‚ýš¸vÿ’ü RþDªûÅrVþ¡ÎiÄÿxû—b’ý þè¨dÿ’ÿRÿBˆBŽúý¼ùÆûl|ªÿýOþR¼R¦Kü´ý„þˆýÐÿ#¾Hþnx2ü qæý^ý(<ôÿX04Â"þþAþp°g$ý‰ûö:`Üÿ¤œÀĉþ²†ÿœbúýgˆ+–ûHþ<lÿÞþþþký4º½ÿ>rýˆþ!ÿàâèþ(ü™‘ý‚þ¢ÿéû¦eÿ Øþ"rþ!üd°dþêfýåœNþÚÂp:û"ýZ´0ÿ6î÷Äåûîÿ¬?ú£ý:ü\GSŸâölXºøæW¼úOþÐý‰½8þšü2f.úúj~þdήüVþÖ ¢êþÂÌ. #`*úáþÊIþ°(’ý÷ÿ®¦ü&ßIcÆý¸ü[”üz€•â¤NÎüÊý~­ûVöæ¬þÖ~®&– yÿùþ°PJÿ1ÆÒýz#ýÄÿá_½ÿªû@Ò²ÿ|´ÿtŒ¦‹•ÿG@ÿ†ÅòàþhPn”¶ÿ ¾µÿÂîýšÂ¾hRÇ:à×b|œ \’Àt&þ¦2Jÿ2dI¶þÿØ&& 3Ç<Àt ÿÔý Åæ<pXD`æèµˆ°<’`ê$JÊþ$É,ó0¦½x Yò\™¾ÿ® –5,ÿÍ_F¢þ$ö ÿ58Š/¤2´^ætÐ^ Ÿ$`Ÿݸötè·§Fâ’òXÁtî$ŸÞzÐÿÓ2×tæ¦ ˜Nÿ×ÿ(<3þè¿þ˜q®Ù¬¦JZ[„ú›¹'^J5åÌ&ÖÌŽFÃ0æ¼þäPpÿòþ2ôò ,>ÄbQj )¸Ž£/ôß>pž\Àœ´pfq¶Büj~=¶ÿµ^rö\¬ ™;´›t¦2P“: Dò$æ ¸V&ŸaÜü¿‰ÿàü¸Ùÿ̬–02bÎzÿVšp¬Úxtðúÿ` n&˜h ôtàÿÑÿ[]BÿJ‰òÿ,XL/:¾XF¬–ÓàLóÿ$¼¸ÿ=ÿ¾ÿxhÿ¾þÄÿEŸØ2ÿ ¼öÿŽÿ2ÿFAÿ|þ¸ÿ»ân4ÿfþèÿ!¥ÿrÿÍdÿ”ÿ‘JÿyþªÿjÒÿìÿ¦6ÿÿ†ÐŒÿàþ¾þ*ºüÿ˜þ¾`L®¼ÿ·Âåþÿ4¶ÿ€ÿ~ $ù%Á¦¼ÿ½þªþ¯ÿ¼nÿÿÂÿ¦<N¿ÿ8|Óÿ,ÿÿlÿî«þ+ÿóÿmtèrÂ:±ÿ ÿD4¨ÿâÿžþ¨þXS²Vÿ®Â;®§þ5ÿoäÿ¾þVþæÿ(¨Óÿâÿ ÕžoWêÿZþk¶&ÿÅþLÿêGgÿ]Þfÿ(ÒHaÿöþXÿ&ÿ$¼Ø÷ ¾@oÿ*&¢ÿ:ÿ þŒÿ´äôÿf¬—.Œ‡ºÿ~ÿÐÿäþöýœ}Îþéþæ¶Èx<RNþ´ýºÿhÍ/ÿ0éþøþ—ÿ``¸ÿ¦ÿüzlöþÖÿáÿZÀ øÿs*–fzþFþ\ÿÛÿ"¤þ:‚Ûÿ.ÂZð¥þËüDÔäþ4@Ñþ?ÿð0ÖFÿÆúrºþZÿ€ÿ¾þŸÿÐ6·þáþ¹”¼–úsÿ•ýÂþ)jØþ˜ÿ†òÿÝÿñ¼NQÈ‚ÿäýÿZÀþ/ÿà@±aLÁÔÿ<ö)þ€þšÿtÿ‰Åþnèd„ê>˜ÿ>þŠþ„ÿêÿÿ‚ÿ\@\¶±°e^.ÿ+<ÿ}þ ÿ ÿDnȧ,¢èvJÿtþ™ÿ±ÿrÿ†þpÿšÔƒÿ¢Ñþ øÈP.!$ýJü^ÿíà†6Üœÿ Í‚ÿPìÿ<Œüìþ.·ÿíÿ8˜~ÿšÿ¼ÄUÿêþžÌàþàÿûÿÿrþ~þòä+¨©þþþ¨þ*ªÿeütþÊÊYÿú¼=Zuÿš¼þ´þÖÿhÿ?ýêÿø´V ì­ä\ÿXý+þòÿÅþ2q¼âþ±ÿÓøn”="¬ýŽþþÜþ´ÿ4TNþò62~ÿ~ðiþÞü=DFÿ ÿЫ$þ`à“Ôfž@¢þ3ýúþ¢Þ¥ÒÿT>èÿ­þjýÖjôþ$ý’þx„Lþ$¼2dŠþRþˆ3ÒýÔø–ʸv.ÿÔýË6êþ8²ÿA$þ²þF'Û_^b4Cü·üñ\ÜBüwüéüHöÿ‚ªAPŽÿ ¦›ü‚ûøþ2è¼ÿ¶äîáéýKüì{4ÿªý¦ÿHý’þ_R@ÿ{œÒbü üvþ¤ÿÛ PûOÿNZrÿª‚êøþlýþùÿxVÿ ÿŒ¬€šêþ”Üþˆÿ’^þŠÿ/‚þÑþ&bîþ(ütÚýÿnRÿxþÿÊý+<ZÍv†þ2$&'þdü¨´DþÿÀý¤üñà|Zý$þbrZbüÒûvSxþŒðRRÿƒþÐìÿÿ>`ý{ÐR²ûû²øæÿ”„¼Œšê[ÒÿKýüZü§ÿüJLT¢ÿÆú2DìÿšÚpý(ûTýˆýBÊ~hjþŽþQþþû“’–ÿZûýÎíþý™šþ´†ÌÿüwýWûÖýv³ýýWÚ¼ÿ &ýXLü†ÿ° ÖŒ¼zþ¿ýâüfúÿÛ°_N:›üÌþî™ü˜ÿ8Š%2Eü(ÿtÔ û0ýßý5ýìÿQÿR€‰ûÿÂÏn‡üJü¶ýäü#sÿ4ùæþÂÿ¤ÿ"úÔúÀ†àþîüB"xâú ÷Æýðþ`þÌP'ý¿¸ÿZý &4ùÆûöý{ýÜýDþ aÿqþ¹ÿ&ʦ”$ŠÒü„ýöéþƒýø*'Xø2‘þ^ü¸ýºý>ÿÆþGý²Åsýžþ¢Xÿ¦ÂùþŽë$ÿ–ýoú¦û8ÿêû{ÿLüáýЬþøö2úÒX`þýûpüYþyúú×õ‚þèþúü©ü‹Ç)þ, úaüaÿ¬À€ýþþL¡ÿä÷¬p”ûÊøý]ÿdÊ`Ð`ýÆü+¤Hùòõ"üË $ûsýAÓûJýÜúvÿö^šü>ü®ýûÀýLþtýøo(GÿFü‘ýÄú~& ×ÂõºÿöZÿÂþ¶ü*ú.ÿ‚þ>øù;þ¾þÖ8¬äÿø`Wþôþ4üDúò÷û„Ø‚þHXþ ÿª\ý˜úðþ: @ý÷¸øfýÃ\ý¼üT"8üÿüöeõ’ú÷K Êû#ö°÷†ÓüµÞ÷vô°úº& ÿWþM r™öPÆYž Îÿzø‚ý_ÿEÿÆþHêƒñðÎb¸˜äÿ¬ò’õÓúà >ÿâóTó¨øúü ûÀúZFq–÷Búxÿ¿ùÊüœÜÃü°úÞù@²Lý–ü>Vfû oŸ´ºû2ùÌÎþvä “gý»ÿ*8 ú"þ&î(ÌKDùû‚ ´üüøÐüÈþ Dûrûšü¸ºÃÿü@‰úH÷¼ùLõâøHý–ÿ¯HÿŽþRÿfçýóZóÇý¶rp¾Øúü dýJ *Šÿ]žÇeû?ôdì $žlZ rü.Žø«8þìþ~ýÞýpý ÿ[9¿ú4ü¤úžþ®$tƒýÒüðô‘ô8@Yÿ¦÷>õbû‚›Dþpø@êrööê;þFƒÿ2ÿÀ"Ú±¾þ€üÿEÝ`÷4›ùqj#¥+Dü³Òþ\¿J²Úþ ÿÿ#X<ý2ù¢÷ ú¿(þcþðpù^ùËîþû6ý<^ýxø þRp8Oþüú<þÖÿVþÚì¦ÿɤ@²q=n0­ÿ‘ Ð~ûîÐ¾Š¿ üùLþÄÞÿ$èeÿdü¦ù/ýˆ–ÿ²þ ýýFþþeû)û*þ†ÿbûüáDòþöþ¤”ú}ÿ\üüöýX3yìâþhÐ…˜Êÿ.¦pùTLª€š&ú¤*êùZüF z·ý¼øšýßýõþäKþºþ¥ÿ*úâüÌÄüÈý¿ýÁû×ù¼÷íüNHúèùØþ×tW üf0þÈû±þŒÿdJJý`ýñýQ îÿŒŠÿæü|fœþ× Œ8ö¼ÿƒü8nÜù¦úÄÿïþÿðü!òèù€vUÍÿIþ÷Xõfõ6ùæE®ôHó¼ï J >Dý2zjó×ô^æûàÿ^ÃûÈr‘f¬$•ÿ6X‘ý£öîù®þª:)O<Ñ0+”Q¸ùNùÚ÷ê÷j¶Ø°þôùèœÈ‚§üÿ4ü'÷\ù)0ýAû÷ýêþFþÏû:ý â · „ú¬ü+ý ødúÀý6ö`ÿãšÀDƦL¯ûšü¶nÞÿxûHûkÒX,ì.! ~þý/ýÌÿŒþ†üaöÂû^p|Lþù°ÔÞÐÿÐþîûªóÄø¢óýÿÕ?ÿŒûÈýª þëú<ýÖüa ¢ø‘þþÿxÿþe ® u tŸý4ý~ùú6Ô½þT¶5Üijù÷XÿH:1ÕünøœäØú|þ@ˆúÿœÀýrÿõÿ>ûXý‰ü«û[&Åž?ô~øâ,ÞúÄýžpÿâÿFÿ¤ùÿmÄTzäÿ*ýÔþøù û¢4<ÎÈþžþþý:ÿÐþ7d>ÿvømþszÿ"~ÄT8ÿÐÿÖýäü®'ò²þ„þcþzcôû¡ÿŸÿ”þ²ûúü<Xÿ:¨¶.ûÿjzûûâ\ÿÇÿmýÌüÄ6v ¯´ùYùîü·ú”ùDÿtýþ¤„ñ–ôÇ,ÿüRû¦ý¦hø–ù>ýøöâ ÆÚЈ,ÿžýƒþÒú øôø–< < ìü¼ô‰ýºlÿÞšÿùœõûÐ Ô Eÿúû¤ù”ú…®àú~ûu\¡¦ýØømý¶~0ýtþÁD­ÿÄöÆó sÐuý,ú”ü>’,òvûVù ÿ¸ ¹€Pÿúü8ÿ ×ü¾úöþÛþÒü Èþ8ý<ëX.faü þ\Ð<öir>²ÿKùúõÿÄýÂþ þÁÿVÿbÿøí²ÔŒÿUt´ÿæþjÿÈÿ±öüòüÆ’°²ÿ;ÿdw†*DüüúÐÓþsÿpÿ)ÿÒýœ(Ký‡þºdTüÜÿ¦.‚øvÿWþ¤ÿaVâþB0º+Äÿ¼ÿFµÿR ÜR]ÿ”ÿŸ@:®ÿöÿT2´§ÿX‚.3ÿìÿŠÿ>ÿ€&1ÿR”ÒÿÂÿ[ÿ$ÿ.¶8žÿ®d|mÐÿÜÿÒÿrÿ>°r˜ºdÆvPÆÿV0¢—Ìÿ T|Êÿò|Xu$4Ò`„ÿ´ÿÂÿÿðÿŠV¥ÿ6ü—Üÿ·ÿÌÿ»ÿVÈÄÿ#ÿtkabber/sounds/default/sigh.wav000064400000000000000000007563721477701321300165050ustar00nobodynobodyRIFFòÜWAVEfmt D¬ˆXdataÎÜ’û¨ûšûžûšû™ûœûœûŸû û ûžûûœûû û¢ûŸû¯û›û´ûœû¨û¡û›ûªû•û©û—û ûû™û£û‘ûû’û™û˜ûšû˜ûœûšû›ûû•ûšû•û›û•û£û–û ûœû”ûšû“û›û•û–û™û”û›û”û“û—ûû•ûŽûû•ûˆûšûƒû˜ûˆûŽû‹û‹û‰û”ûˆû—ûˆû–û‘û‡û“ûƒû“û†û’û‰û‘û‹ûŽûˆûŒû‹ûˆû“û‡û’ûŠûû’ûˆûûŒûûû•ûûœûŠû û‹û˜ûûû•û”û“ûœûŽûû”û’û•û—û‘û›û“û•û–û–û•û˜û‘û™û–û›ûšûžû›û¡ûšû¡û“û¤ûû§ûû¡ûûžû’û—û•ûŽûû‹ûžûû—û’ûšûŽû˜û‰û“ûˆûûŒû…û“ûû“ûûŽû…ûŠûŠûˆûŠûŒûû‰ûŠû€û…ûŠû~û’û~û‘û€ûû…û‡û‹û†ûûŒûˆûŽû…ûûƒûŒû„ûŠûŠûˆûûû‹û…ûŠûŠû„ûŒûû“ûƒû‘ûˆûŠûûûŒûûûŽûŒû“û†û–ûŠûû‘ûûû—û‹ûšûŒûœûû û…û›ûŒû”û–û‘û˜û“û•û’û›ûû›û”ûšû˜û–û™û™û•û¡ûŽû û’ûŸû“û¡ûŒû¤û‰û¡û‹û“û”ûŒû›û…ûû‡û–ûûŠû•ûˆû•û‹û”û„ûŠû…ûŒû€ûûûûŠûûŠû“ûˆû’û‘ûˆû—ûŠû‘û‘ûûûûûûûûŒû‘ûŽû‘û†û‚û„û†ûƒûû€ûû‡û‰û†ûŠû…ûû‹ûû’û…û”û†ûû‡ûûû‰û‰ûû†ûŽû‡ûû„û‹ûƒûŠûyûûqû€ûzûû~û‚ûvûvûrûyûxû{û€ûxû~ûnû}ûxû‚ûuû†û‡û}ûûxû†ûxû‚û€ûŽû„û–ûŠûœûŒû”û‘ûû–û•û™û›ûšû û£û£û¥û ûªûû¤û’û•û†ûŠûŽû“ûŠûŽûyûˆûzûûrûhûAû9û1û=û5û1û,û,û/û:û?û6ûû)û#û)û;û8ûMûKûZûdûfûaûfûYûdûVûaûTû[ûRûHûRûBûOûOûOûNû6û*ûû+û,û>ûCûJûQûQûpûdû{ûmû}ûtûxûwûsû~ûuûŽûƒû˜ûû”ûûŒû–ûûšû•û¡û—ûžû”û¡ûžû¡û¨û£ûû­û‘û¤û›û˜û©û•û¬û›û®û¡û¬û¥û¥ûªû¤û°û§û¯û²ûªû´û¤û¨ûŸûŸû¥ûû©û©û©û¯ûžûªû¡û£û¨ûû«ûœû¡û£û™û¢û›û¡û¢û¡û£û¤ûû¡ûœûžûžûžû›û£ûžû¦û¥û¬û©û«û û§ûšû§û›û û©û™û¬û™û¡û–û¢û—ûžû¤û™û¦ûû›ûœû”ûû’ûŸûû¡û–û˜û›û’û•û‘û—û˜ûŽû¡ûû û•û“û˜ûŒû“û’û“û—û•û›ûû˜û”û›û‘û¥û’û¨û•û¦û—û©û—û¥û–û¦û›û¤ûœûªû¢û§û¦ûœû¥ûû û¤ûšû«û™û«û¢ûšû¨ûšû£û¡û£û£û¤û¡û¢û—û¤û’û¤ûžû¡û¨û¤û£û¨û›û©û”û¨û™ûû¥û•ûªû’û§û“û¤û›ûœû¡û›û¨û¢û¦û¥ûŸûšû¤û–ûªû–û§û™û ûœû™ûû™ûŸûŸûû¦û›û¨û§ûžû¦û—û¨û‘û­û—û«ûû©û˜ûžû›û”û¥û“û¤û›ûšû£û“û¡û•ûœûœû˜ûœû–û ûšûŸûŸû”û¤û“û¤û›ûŸû¥ûû«û˜û¤û“û û•û¦ûšû¤ûû£ûûû™ûûžûžû¥û û¢û¢ûžû£ûšûŸû¢ûû¢û£ûžû¥ûšû©û”û©û–û¥û¢ûšû±û•û³û˜û¦û˜û¢ûû ûŒûŸûû™ûŒûˆû‡û†û„û…ûû„ûûƒûûyû‚û|û}û†û{û‰û~ûŒûû‹û…û…û‰û†û†ûŒû„ûûˆû‚ûû|ûŽûzûŽûwûû{û‰ûûxûtûtû|ûzû‡ûyûûsû‘ûsû‰ûuûˆûsûˆûqû‡ûzû~û†ûvû‰ûvû‚û€ûû„û‚û„û„ûû|û…ûyû†û…ûƒû‹ûƒûŠû~û†ûû‹û…ûû„û—û‡û•ûŒûû‰ûû†û•ûˆû˜ûŠû—ûŽûûûûŽû’û‘ûû˜ûŒû”û‡ûû†û”ûˆûû’û…û˜û‚û‘û†û…ûŽûûŽû†û‰û‡ûûûŒû†û€ûŒûxûû‚ûˆû‹ûû‰û~û~û}û…û|û‰ûû€û„û}û}û„û}ûƒû†û}ûŠû{ûûsû|ûwûxûûyûû|û~û„û}û„û{û‚û{û‚ûyû}û…ûtû…ûsû|ûyûtû}ûsûû}ûzû…ûhûzûnûtûwûnûxûqûtûxûmûrûlûwûvû{ûûuû†ûxû‡û~û‚ûvû€ûtû{ûzûxû{ûsûnûiûlûqûlûxûjû{ûlûzûfûpûcûtûhûqûrûmûyûsûyûyûtûzûoûtûhûvûhûsûdûcû`ûYûhûTûoûVûlûXûfûLû[ûSûZû_ûbûdûgûiûkûmûtûiûyûdûpûhûpûgûtûeûfûcûZûoûXûxûZûxû\ûkûZûUûcûRûjûTûaûYûYû`ûZû\ûaûUûdûYû]ûdû[ûnû_ûlûdûjûhûiûlûlûnûlûnûbû_ûcû_ûgûaûsûfûsûoûhûtûcûxû_û‚û\ûƒûdûvûhûqûiûyûhûvûqûsûqûuûpûoûtûiûxûmûyûvûvûzûxûtûwûsûsûyûsûvûsûyûeûûcûrûgûhûfûnû_ûoûXûfûRû_û`ûXûjû]ûkûaûpûiûkûhûdûhûaûhûZûnûWûgûXûhûZûfû]ûgû`ûlûZûnûJûZûOûVûQûTûUûXûXû_û[ûaûUûcû\ûeû]û_û`û_û^ûfû\ûdûYûfûZûgû]ûiû_ûXûWûVûUû[ûXû`û_û\ûaûQûQû[ûKûgûTû_û`û\ûjûiûiûqûnûmûnûsûlûyûeûyûWûnû^ûcûhû[ûpû]ûpû]ûkûRûjûZûjûkûeûqûgûlûpûiûsûbûsû\ûuû`ûnûfûhûiûgûjûbûiûiûiûlûoûeû_û[ûWû^û`ûXûeûWû_û[ûaûWûfûTûdûRûcûZû]ûhûTûmûWûaûdûXûgûYûaûYûWûQûEûWû@û]ûSû]ûZûbûUûcûRû_ûZûXû^ûHûdû?ûeû?ûbûFû\ûQûTûSûWûYûZûdûQûdûYûYûfû]ûaûgû\ûcû^ûZû[ûWû]ûYû`ûaûZûcû[û]û`ûaû\ûiûVûpûWûkû`û^ûiû_ûiûjûkûoûkûqûhûlûdûhû\û_ûYûWû]ûSû[ûTûVûTûXû^ûXûlûXûjû`û_ûcûaû`ûhû_ûeûeûaûkûcûdûfû\ûjûZûjûYûhû\ûeû^ûbûVûdûVûcûbû_û_û]ûJûTûCûUûGûFûJû?ûFûGû>ûDû6ûIû4ûPû9ûEûEûFûGûTûKûIûIûFûKûOûJûMûIû@ûEû:ûFû=ûJûPûNûLûHûFû9ûIû9ûBû<ûDûCû;û8ûûûû!ûû"û÷úúúñú ûûû)û%û+ûû!ûû"û%û#û"ûòúÚúÐúÛúÛúõúéúêúÓúÈúäúáúÿúõúûÿúûûûûû"û(û#û/û"û6û û9û'û/û,û&û*û#ûûûû ûûûûûûûûûûûûûû÷úøúüúùúýúôúþúÞúíúàúöúàúûäúùúíúöúþúïúîúàúéúåúÚúïúÞúêúãúíú×úÎúÛúÖúíúãúöúçúþúçúûøúûû"ûû$û*û$û0û)û9û4û8û:û3û?û7û=û@û>û@ûFû3ûIû,ûDû4ûGû?ûJûCûFû?û4û7û+û:ûû7ûû ûúúÿúôúüúôúëúòúÞúÃúÜú£ú¾úºú¹úÇúÄúÅúÜúÐúôúÛúöúçúïúòúçúðúëúêúðúÝúÎúÔúÎúáúØúäúÝúåúßúøúåúüúìúûýú ûûûû ûûû#ûûûûûû#ûûûû ûû ûûûûû û"ûû ûûûû ûûûûû ûûû ûûûûûûûû ûûûûûûûûûûû ûûûûûû ûû&û û ûûûûûûûû û ûûûûûûûû ûûùúû û ûûûûûûûûúúúúùúûóúûøú ûýúûûû ûþú ûûûÿúûüúïúûíúûïúûðúûöúûñúúúëúÿúèúüúéúýúéúûúâúñúÜúðúÞúïúâúìúãúëúÝúâúÛúêúáúíúáúðúáúôúéúðúáúåúéúåúëúìúèúòúêúîúïúàúüúÝúûæúýúìúùúêúäúòúçúóúôúèúúúñúñúûëúõúòúòúôúóú÷úóúúú÷úìúôúêú÷úëúüúêúÿúéúÿúÝúóúßúõúëúñúòúíúùúíúýúöúéúùúãúüúàúûèúóúõúèúîúæúìúèúðúëúéúîúíúáúéúÜúíúãúæúëúãúéúæúÙúÖúÏúÑúÒúÙúÒúØúÞúÐúñúÏúãúÚú×úæúÑúæúØúÞúâúÑú×úÖúÚú×úáúÖúâúÝúÙúáúÊúÙúÆúÝúÍúàúÔúàú×úÙúÉúÏúÊúÓúÓúÛú×úÜúÞúæúçúðúùúõúøúóúöúôú÷úòúîúàúãúàúâúãúèúéúçúïúÚúäúÐúßúÝúÞúåúàúîúçúôúìúùúöúõúõúóúðúçúðúÚúåúÎú×úÛúÑúêúÑúöúÑúøúÖúçúÕúçúØúçúäúáúëúäúàúâúÞúåúáúêúâúçúåúçúÜúÛúÕúêúÚúéúÞúâúæúåúèúæúØúÝúÝúØúàúÛúáúÜúäúÕúÜúÑúÞúÓúÝúØúÛú×úßúÐúÒúÓúÖúáúØúàúÙúÚú×úÝúÌúØúµúÍúÁúÅúÑúÏúÒúÜúÊúÛúÎúÞúÔúãúÖúëúÓúïúÎúßúÕúäúßúáúéúÝúîúÞúàúÙúÎúÝúÑúâúÙúßúàúãúäúåúâúãúéúåúíúäúìúãúïúãúßúäúÙúÞúØúàúÛúáúàúÒúÓúÆúÏúÎúÖúÏúÙúÕúÍúÛúËúÍúØúÍúÜúÌúáúÎúäú×úàúÊúÝúÇúÐúÎúÉúÔúËúÊúÁúµú´ú±ú¿ú¶úÃúµúÄú´ú³ú¨ú§ú­úµú±ú·ú¸ú§úÃú°úÅú¯úÃú­ú·ú¶ú¸úÁú¹ú¿ú§ú±úœú®ú¨ú§ú§ú«ú«ú«ú¬ú¦úú±ú¡ú½ú­ú»ú°ú²ú°ú¦ú§ú¯ú ú¬ú¨úªú¦ú±ú§ú¤ú¤úšú§úžú«úšú¶úšú²ú ú¥ú™ú©ú¢ú¨ú¦ú±ú¥ú¯ú¥ú¥ú™ú«ú”úªú ú¦ú«ú²ú«ú úŸú”úžúšú–ú“úƒú€ú†úoú‚úoúú‚ú“ú‹ú¨úŒú¬ú’ú£úŽú¤úšú¢ú§úŸú£ú§ú¦ú™úžúúšú’ú–ú“úšú’úŠú‰ú†úƒúúú‹ú‰ú•ú…úžúƒú”ú|ú›ú~ú‹ú•ú…ú—úú”ú{ú‡útúú‚ú‡úƒú“ú‚ú}úvúqúwúyú„ú{úvú{úuú‡ú|úúyú‹úwúˆú’ú…ú”ú•úúú}ú‰ú~úúŠúˆúŸú{úú}úúzú€ú†ú‚úƒúˆú„ú{ú}ú€úŠúžúˆúŠú”ú„ú–ú–ú„údúgúTúcúnú_úsúdúxúfúpú_úeúQújúQúeúOúQúJúFúNúIú[úMúTú`úVúTúNúJúBúJú?úJúOúQú_úkúiúTúXúJúLúLúGúAú2ú-ú)ú2ú"ú!ú.ú"ú;ú)úNú2úEú,ú9úú8úú8ú!úú&ú úúú ú úúüùúùùýùúøùùù÷ùêùÿùæù÷ùíùóùùùíùüùæùñùëùêùõùæùôùìùòùéùàùàùæùÞùëùßùïùäùîùíùèùèùÝùëùåùëùïùåùôùåùîùæùêùçùåùçùãùäùãùßùâùÒùÕùÍùØùÕùÑùáùÑùßùÝùÖùÕùÖùÐù×ùÙùÕùáùÑùàùÐù×ùÒùÔùÕùÐùÓùÊùÎùÊùÂùÅùºùÅù½ùÆù¾ùÇùÄùÇùÅù¹ùºùµù·ù¶ù»ù²ùÂù±ùÉù°ùÃù·ù¶ùÈù°ùÊù·ù¿ù¿ù·ù¯ù²ù¦ù¸ù¤ù´ù¬ù­ù°ù©ù§ùžù§ùœù®ù£ù´ù§ù¶ù­ù©ù«ù¦ù¯ù¦ù¶ù¨ù²ùªù¦ù§ù—ù¡ùœùžùù›ù ùšù ù›ù—ù–ùœù•ù¢ù”ù ùšù—ùœù–ù›ù ùœù¨ù›ù¥ùœùœù¡ùŒùùvù|ùaùgù^ùbùOù[ù9ù9ù-ù ù7ù"ù4ù"ù2ù2ù5ù?ù?ùIùEùJùTùKù^ùNùRù4ù3ùù,ùùùòøùÄøâø±øºø¸ø¾øÍøÎø×øìøíøùùùù!ùù.ù*ù/ù3ù8ù4ù6ù9ù5ù=ù5ù<ù<ù8ùBù5ù@ù0ù<ù2ù<ù6ù=ùBù;ùAù>ù6ùAù9ù>ù;ù?ù=ù=ùFù4ù7ù)ù)ù,ù1ù1ù5ù5ù6ù4ù.ù.ù.ù/ù:ù.ù:ù,ù5ù(ù:ù$ù5ù,ù5ù-ù7ù0ù<ù6ù;ù6ù4ù7ù5ù2ù;ù4ù9ù;ù,ù4ù#ù5ù$ù4ù-ù0ù4ù,ù0ù$ù ù&ù&ù$ù,ù!ù+ù ù*ùù%ùù+ùù*ùù-ùù+ùùùùùùùùù ùùù ùùùù ù ù ùùùù ù ùùùùùÿøÿøýøùöøöøïøðøóøôøñøûøñøøøîøîøëøèøôøçøúøïøõøùøïøóøïøïøõøìøòøóøëøùøòøëøóøäøðøðøîøøøêøïøîøÜøåøÛø×øÞø×øÞøâøÜøèøÛøæøÔøëø×øÞøÛøÚøÔøÖøÎøËøÊø½øÉø¹øÃøÀøÁøÃøÂø»ø¸ø»ø¬ø¶ø¯ø±ø³ø²ø¨ø³ø—ø­øø«ø¡ø©ø¢ø¢ø£ø™ø¡ø‘ø›ø‘ø—øø“ø‹ø—øˆø’ø‡ø‰øŠø‹ø”ø„ø•ø‚ø‘ø€ø†ø|øƒø~ø}ø~ø€øxø„øuø|ø|øvøˆøsø‡øzø…ø}øørøŠøyø€ø…øzø‰ø~ø‹ø€ø†ø{ø‡ø}øŒø{øŽø‚ø‰ø‹ø}ø‹øuø‰ø|ø‚ø‰ø}ø‘øø†øøqøšøvø’ø…øŠøŠø†ø‰ø‚øø}ø~øvø€øtø€øtøxømøtødøxødørøkøjøløkøcøaø`øYøbøVøcøQøeøTø\øOøOøNøMøIøMøHøIøGø@øIø4ø@ø:ø5ø>ø3ø;ø2ø5ø+ø$ø"øø!øø!øøøøøøø ø ø øøøøÿ÷ù÷û÷ç÷õ÷è÷ô÷é÷õ÷ç÷ó÷è÷ê÷æ÷ç÷ç÷è÷à÷ë÷Ù÷í÷Ú÷ß÷Ì÷Õ÷Ç÷Ì÷Æ÷Ê÷¿÷Ë÷¿÷Ä÷¹÷¯÷²÷§÷¦÷£÷¡÷Ÿ÷¤÷÷£÷’÷š÷÷š÷§÷£÷¢÷Ÿ÷“÷Ž÷‘÷÷–÷÷•÷÷•÷—÷œ÷–÷™÷”÷–÷–÷š÷”÷÷’÷—÷÷”÷~÷–÷y÷‹÷|÷~÷~÷y÷{÷r÷f÷q÷c÷n÷^÷n÷]÷h÷c÷b÷Y÷Z÷X÷T÷\÷P÷[÷Q÷X÷F÷I÷;÷G÷5÷I÷7÷E÷8÷@÷.÷/÷÷1÷ ÷.÷)÷&÷-÷$÷1÷#÷*÷"÷!÷)÷÷*÷÷ ÷÷÷÷÷÷÷÷÷÷$÷÷)÷÷÷÷÷÷÷÷÷ ÷÷÷÷ ÷÷ ÷÷ ÷÷÷÷÷÷ ÷÷ ÷÷ ÷÷ ÷ýö÷ûö÷÷÷ ÷ûö÷øö÷ùöùöõöëöçöÜöçöáöæößöêöÉöÎö½öÁö¾ö¼öÄöÂöÅöÂöÊö¼öÎö¾öÅöÈö¾öÇöÁöºö¤ö”öœöšö¥ö§ö§ö©ö¡ö«ö ö—öšöŠö§öŒö ö“öšö‘ö¡ö—ö”ö—ö”ö“öšöŒö›ö‰ö—ö†öö†öööxö{öqö|öwöpömö[ödö\öjöbömöfökö^öYöUöPöWöQöXöYö\öUögöLö]öMö[öOöYöUöTöZöQöQöFö>öEöAöDöGöEöHöCöEö3öBö1öGö3öOö3öPö8ö>ö0ö2ö4ö?ö8ö>ö9ö<ö<öGö8ö8ö.ö2ö.ö1ö.ö-ö-ö#ö+öööööö ö#öö/öö ööööööö öö!öööñõêõêõéõëõàõÕõÓõËõÐõÍõÚõÔõàõÛõîõçõëõÙõÓõÈõÁõÑõÀõÔõ¸õ¸õªõ¨õ˜õŸõŽõõŠõõõõ†õzõyõmõjõjõlõhõ]õYõOõPõMõ?õDõ8õ8õGõ=õXõ=õFõ9õ.õ-õ'õ(õ!õõõõõõõõõõõõõõ%õ(õ!õ#õõõõ!õ,õ/õ$õ&õõõõõõõõõ õõþôõìôõôôõüôþôõõ õüô õ÷ô õõõõõõ õõõ õ õõ õõúôõöôüôôôêôóôçôìôëôéôïôêôôôáôïôãôïôâôðôæôçôìôÜôäôÓôÔôÛôÍôàôÎôÚôÔôÕôÕôÆô×ôÇôÖôÏôÍôÛôÈôÝôÏôÓôÊôËôÎôÈôÓôÊôÔôËôÑô¿ôËô¿ôÈôÍôÂôÒôÆôÍôÐôÀôÌô¹ôÅôºô¾ôÀô¶ôÂô´ô½ô°ô´ô±ô²ô´ô±ô®ô¶ô±ôµô¦ô«ô¡ô¯ô¢ô±ô¥ô¬ô«ô¦ôªô›ô¬ô™ô¯ô¢ô¯ô¬ô®ô¸ô¨ô²ô¨ô®ô³ô¬ôºôµô¼ô·ô»ô¬ô·ô°ô»ôÁôºôÅô¼ôºôÂô±ô¹ôºô±ôºô¯ô¶ô³ô¸ô°ô½ô£ôºô£ôºô¦ô¯ô©ô©ôªôŸô ô–ô˜ô–ô“ô“ô•ô’ô‹ô’ô|ô†ô€ô~ôô…ôyô‰ôyôƒôwôwômôwôjôzôbôwô_ônôaô_ôaôZô]ô]ôZô`ôaôVôjôGôcôQô[ôWô]ô`ô\ôhôQôbôSô^ôdô_ôjôhôjôqôrôjôqôgô}ôdô†ômôˆôxôˆôô‚ôô‚ôŠôˆôôŽôô•ô›ô—ô¢ô˜ô²ô£ôµô¸ô²ô¿ô«ôºô¦ô·ô°ô³ô¶ô±ô°ô±ô­ô£ô£ô•ôô}ô…ôvôxô}ôsôsônôfôqôjôkôvôgôuôdôlôYôbôUô^ô[ôTôWôSôJôVô?ôIô8ô?ô9ô8ô8ô0ô9ô%ô-ôô"ôôôôôôôüóôßóúóÓóåóÑóÏóËóÄóÀó¿ó²ó®ó¬ó¤ó§óœó£óóóšóóŒóŽó‰ó”ó…ó˜óˆó˜ó‡óó‚óó‰ó|ó’ó€óó~ó‡óyóuóuójóxódópócóeóaóhóWócóSóXó_ó\ó]ófóWójó[ógó_óeó]ócódóeógógóVó\óQó]ó[ó_ó[óeó[óió`ófó`ódógó_óoóbó{ónó|ópóqónósósóuóyóqó{órónójócónójóqórórózónóvóióqóqó{óvó‚óvó‡óyóŒóó‹óóóœóšó£ó¬ó­ó»ó³óÁóºóÆóÁóÍóÌóÛóÑóåóÖóÛóàóØóìóßóõóêóòóñóîóïóëóõóöóøóôûóô ô ôô ôôôôôô%ô(ô+ô-ô)ô0ô+ô;ô(ôCô.ô;ô<ô6ô4ô9ô,ôGô,ôRô5ôPô=ôMô7ôJô/ôIô4ôCô;ô<ô=ô6ô9ô1ô6ô5ô4ô9ô8ô7ôBô4ôEô1ôEô5ôKô3ôKô6ôIô@ôJô7ôBô6ôGô8ôNô?ôIôEôCô:ô<ô/ô;ô/ô3ô1ô%ô6ôô*ôô#ôô ô"ôô ô$ôô&ôô"ôô'ôô'ô0ô"ô=ô%ô:ô$ô9ô.ô7ô<ô;ôFôBôHôBôFôMôGô[ôOô[ô[ôYôeôZô`ôXô]ô]ôZôgôbôiônôgôiônôqô~ôƒôŒô’ô‘ôŸô—ô©ô˜ô³ôŸô¶ô¨ô½ô±ôÈô·ôÈô·ô¾ô¼ôÁô¿ôÆô¾ôÀô¹ô¶ô©ô°ôžô°ôžô¦ô£ô›ô£ô•ô˜ô‘ôô•ôôô–ôŠô•ôŠôôŠôsô‡ômô‚ôhôlôiôZô^ôHôRôDôHô?ô=ô=ô1ôAô,ô0ô(ôô&ôô!ôôô ô ôúóôêóùóØóíóÕóÞóÎóÏó¼ó¹ó³ó­ó­óŸó«ó˜óŸó“óó…ó…ó}óóóó…ó‘óˆóó‚óˆóŠóˆó‘ó€ó‘óó‘ó†óóyóó{ó‰óŒó‚ó›ó}óžóyó–óó‘ó†ó‰óó„ówóójókódókóhólóeógóbókóVóRó.ó,ó0ó&ó;óó&óó$óó#ó óóóóóó ó,ó%ó7ó1ó4ó=ó:ó=ó9ó1óóþòóèòäòãò×òàòÚòñòçòøòÍòÙòãòëò÷òóóó&ó)ó7ó4óBóCóLóQóKó[óOóRóVóVóZó`ójógópópóqó„óoóƒó{ó€óŠó‚ó”óóšóœó¥óšó«óŸó·ó±óºóÏó¼óãóÆóâóÏóèóÜóôóçóôñóôþó ôôôôÿó ôôô ôôôôôô ô ôôôôôô"ôôô!ôô%ô*ôô1ôô!ôôô ôô ôôôôôõóôîóýóëóõóëóìóëóæóêó×óßóÏóÕóÊóÊóÅó¹ó¼óªó©ó–óó‘ó™óŽó‘ó†óó~óˆóvótósónómócókóWóeóUóWóMóMóEóBóFóBóCó?ó@ó3ó1ó,ó%ó.óó(ó#ó!ó&óóó%óó3ó%ó9ó3óFó;óLó;óIóHóRóVóXóWóUó\óWó\óWóaóQógó]ópóoówópóuójó|ótóŠó„óŽó–ó’ó¤ó¤ó§ó²óºó½óÆóÑóÏóêóáóøóêóôõóôôôô%ôô/ôô/ôô2ô%ô6ô)ô:ô1ô4ô:ô%ô>ô(ô>ô5ô4ô<ô5ô7ô>ô/ô0ô,ô(ô/ô#ô0ô ô*ôô ô ôôôôôôô ôôüó ôôôôôôôô ôÿóøóô÷óþóôüóÿóôýó ôûóþóôýóô ôôô+ô)ô(ô1ô+ôAô:ôJôHôMôNôGôSô>ôVôIôUôSô`ôSôcô]ôaôeô^ôiôfôgôrôlôxôuôwôuôyô}ôƒô†ôôôŸô›ô¦ô ôªô¥ôºô°ôÇô»ôÍôÉôÏôÊôÍôÅôØôÈôÛôÓôÔôâôÕôâôÙôÜôâôàôáôåôâôêôéôøôÛôøôÑôýôÙôõ÷ôõõ õõõõõ5õ$õ8õ,õ'õ&õõõõõõöôõñôõíô÷ôäôåôäôàôçôÓôæôÓôÝôÛôÌôËôÆôÈôÀôÌô´ôÓô°ôÔô±ôÉô²ôÅô½ôÂôÂô¹ô¿ô¯ô²ôžô¢ô•ôô“ôƒôôô‡ôxôrôiônô`ôfô\ôVôSôDôAô.ô#ôôôôôòóôâóöóÝóæóÚóßóØóÔóÐóÎóÍóÅóÆó³ó¶óžó¢óŽóóóóóhóQóRóNó\óVófóRóióUónóZó`óaóTó`óVó]ó\ó]ójódómójóvóyó€ó‚óƒó‹óóŽóyó|ó‚ó€óˆó†óó…óóŒó‡óšó‰ó¥ó”óªóªó«óÂóºó¿óÃó¿óÄóÀóÁó¸óÈóµóÅó°ó¸óªó°ó­ó«ó§ó«óžó¦ó’ó—ó€ó‹óƒó†ó†ó‡óó…óó{óyózóuó~ó{óósó„ósóyóióróiótócóxógóyóoózómóvóxó~ó‰óó›ó„óŸóšóó§ó¥ó³ó®óÉó³ó×óÂóÜóÒó×óÞóâóåóóóìóôóóôïóÿóëóóóòóíóîóîóãóîóÛóàóÙóÙóÜóÛó×óàó×óÝóÚóËóÙóËóÚóÓóÕóÙóÕóÝóÝóåóßóõóñóôôô&ô.ô?ôLôQôSôiôXôzôpô‡ô‹ô™ô¢ô§ô¶ôÈôÕôõõ9õ5õ`õ[õvõiõŠõŽõœõ§õ´õ²õÇõ»õÏõÀõÙõÖõåõßõîõæõïõ÷õúõööööööö öö ö öøõüõöõööö ööööööýõöÿõöööö"ö'ö#ö$ö(ö#ö&ö'ö$öööçõöõöõøõööö öööööö"öö%ööööö öööööööööööþõúõ öñõ öëõöòõöõòõâõÖõàõÓõãõÍõáõÒõåõÇõÎõ§õ®õ¡õ§õ¥õ”õ™õŒõ—õ’õŠõ…õ‰õŒõ”õœõŸõ™õ¡õ–õžõ‘õõŸõ¨õ­õ´õ¸õ®õ£õ£õ õ¯õ»õ·õÈõÆõÍõÚõàõØõÛõäõæõïõôõñõùõ÷õööö öööööööö öö ö(öö'öö#ö)öö,ööö öööööö ööö÷õöúõöùõö÷õö÷õöõâõàõ×õàõßõÚõäõÜõÞõØõÖõÆõâõÎõÞõÙõÐõÙõÌõÌõ¶õ¶õ©õ·õ³õ²õÀõ«õÈõ²õÉõ¬õ·õ¶õºõ¹õ¹õ¼õ·õÄõ²õµõ¨õ¢õ¡õ¡õ®õŸõ»õ­õ´õ õžõžõ õ©õ¥õ§õõõšõ‘õ—õŒõŸõ˜õžõ¯õ®õ¿õ¹õ¼õ³õµõ´õºõÃõÃõÉõÐõÑõÈõÈõ¿õÏõÎõÒõÛõÙõÚõåõíõãõìõéõðõöõìõøõîõûõ÷õþõíõèõäõëõðõãõòõËõÉõ²õ¦õšõ“õ~õŽõ†õžõ–õšõ’õ•õõ®õ©õ©õ õ‘õ—õžõ¶õ¡õ²õšõ¬õ­õ¸õ»õ¿õ½õÆõ²õ¯õ¦õõ’õšõ‡õŸõ“õ„õpõ[õAõ5õEõõ#õ(õëôèôßô¾ôÄôÁôÅôôƒô]ôaônômômô]ôCô4ôGôSôYô`ôfô_ô`ôcôaôiôeôiôlôfô^ô\ôQôEô;ô:ô-ô(ôôôôýóôóáóåóÏóÐó¸ó·óªó«ó¦óžó–ó“ó•ó¡ó–óšóó›ó–ó›ó”ó‹ómórósómó|óqóxóuóyó_ónóbówópó‚ó~óˆóŒó£ó—ó°óªó½óÅóÕóßóÞóåóÈó×óÓóãóâóðóóóóóô ôô(ô!ô7ô=ô?ôPôUôeôeôwôwô}ôxô‹ôˆô”ô’ôœô¤ô£ôºô«ô¹ô©ôÁô¸ôàôÌôéôÙôÞôÒôÕôÂôÅô¿ô±ô­ô ô§ô§ô¤ô«ô¤ô©ô³ô³ô¸ô»ôÀô¿ô¾ô¶ô½ô¹ôÃô¿ôÆô¿ô»ô¸ô»ô–ô˜ôaôeô9ôBô/ô&ôôôô ôôôôô"ôô"ôÞóùóñóøóôô ôôô.ô ô?ôô5ôô%ô,ô!ô$ô&ô!ô8ô$ô5ô*ô7ô1ôAôCôSôaôiô{ôuô‰ô|ô–ô–ô¨ô¯ô½ôÉôÓôßôéô õ$õ=õZõhõ~õ‰õšõ¥õ õºõºõÑõÙõÞõîõúõýõöö+ö.ö;öBöMö^ö]öxöoö|ö}ö‚ö€öŒö~ö‘ö{öŠö}öŠö|ö†özö|özöyöö‚ö€öƒö‚ööö›ö¨ö´öÂöÌöÛöÜößößöïöìö÷÷ö÷ýö÷÷÷öö÷÷öööñöëößöàöÌöÍöÍö½ö¸öŸö™ö‡özöwöaöPöBö6öLö7öDö5ö7ö2ö,ö4ööößõÓõ¾õ¤õ›õ}õnõZõAõ'õõõôóôÑôÈôªô“ô‚ôbôSôGô-ô.ôôôôïóòóÝóÜóÏóÌóÐóÅóÏóËóËóÚóËóÒóÎóÍóÔóÔóØóÛóÜóãóîóáóöóïóûóô ôô'ô$ô4ô)ô4ô/ô5ô8ô+ô@ô&ô8ô,ô(ô(ôô!ô&ôô,ô'ô&ô(ô+ô!ô&ôô#ôôôôôôôôÿóûóÿóýóüóûóôûóôôôô"ô&ô6ô>ôPôVôeôhôpôƒô‹ô’ô¤ôªôÏôúô õ5õ(õ:õAõVõeõoõdõ]õaõoõjõzõmõõ‰õ–õ°õ²õ»õÃõºõ¹õ²õÆõÆõÑõÖõÞõæõßõóõàõâõéõèõúõðõÿõôõþõöö ö&ö(ö8ö'ö?ö4öCöFö@öWöLöQöSöOöXö[ödöiörösö}ö‰ö™ö©ö¿öÎöãöðö÷÷÷÷ ÷÷=÷.÷H÷F÷Q÷L÷O÷M÷O÷S÷F÷Y÷A÷U÷F÷I÷?÷E÷?÷G÷?÷@÷B÷8÷?÷1÷2÷!÷$÷÷÷÷÷÷÷÷ ÷÷þö÷÷÷÷ýöùöòöçöçöÜöÜöÕöØöÇöÓö¼öÌö±öÂö«ö°öªö§ö¨ö¬öŸö¬ö–ö¢ö”ö–öŠö‹ö„ö{ösövöeömöoöcöoöMöböEöSöFöIöFö3öAö-ö7öö-öö"öööùõÚõñõÜõðõÜõåõæõãõëõçõÑõÚõÌõÖõÍõÖõÈõØõÎõÃõ¼õ¢õ¡õªõ¢õ³õ‘õƒõrõ]õUõPõ4õ;õõõ õõùôòôáôéôÙôâôáô×ôâôÛôåôæôàôÛôÜôÕôÑôÌôÇôÁô¹ô³ô­ô–ô˜ô‰ô…ô{ôxôtôoôrôhô`ô_ôVô^ôZôcô\ôbô\ôfôVô]ô^ôYômôcôwôpô|ôxô}ôxôvô|ôjôxôbônôXôPôIô3ô<ô(ô5ô#ô-ô!ô)ô"ô"ô#ôô,ôô1ô%ô7ô5ôHôMôXô_ôhôlôyô‚ôƒô‘ô’ô«ôô¸ô¯ô¼ôÊôÛôýôõõ&õ'õ2õ:õQõ[õoõwõ‚õ•õ“õªõŸõªõ°õ»õÂõÅõÖõÇõàõÔõßõÛõëõéõôõöõöõöýõ öööööööööö"öö öïõêõäõèõàõÑõ¼õ¢õ”õ{õlõ\õIõBõ(õ/õõõõ õõôüôñôòôæôâôÝôËôÊô±ô¯ôšô”ô}ôuô_ôZôIôAô/ô"ô ôôðóýóÝóÞó¼ó¿ó˜ó™ówómó^óIóGó7ó4ó+ó#óóó óóóóóó óóóó"óó*ó"ó&ó,ó*ó,ó/ó!ó*ó"ó0ó.ó>óBóIóQóPóWóRó]ó]ógóeónónówóyózó€óŒó•ó­ó´óÁóÏóÔóáóèóíóïóöóùóýóôÿóôôôôôôþóôô ô ôôôô#ô+ô7ô8ôMôLô`ô_ônôqô{ô‰ôŽôžô­ôÈôìôõõõ%õ+õCõVõFõJõ5õ,õ(õ õ õõèôæôÖôÕô¿ôÀô¤ô§ô‘ô‰ôôvôtôqôhôiôdô_ôdôZô]ôeôYôrô`ôzômôwôvôsôvôvôqôoôjôkôdôlôUô\ôGôIô;ô@ô3ô>ô'ô=ôô-ôôôôôôôôôô ôô ô ôôôôôôôôôô!ô ô)ô#ô-ô*ô*ô1ô#ô'ôôôôôôôùóëóãóÔóÔóÎóÔóÌóÑóÎóÙóÖóâóÞóéóêóõóúóôôô ôôôôôô"ô.ô1ôAôBôMôGôQôVôZôfôcôlôrôoôônô|ôwô‡ô€ô•ô“ô¤ô©ô¸ôÀô¿ôÑôßôñôÿôõõ õõ õýôõîôõôâôéôßôåôåôëôçôòôøôõ#õ/õHõ]õiõxõõõŽõžõ õ¬õ³õ·õºõÂõÀõÄõÓõÏõâõßõæõéõèõ÷õñõþõúõÿõöúõ öÿõööööùõöóõöõõöö öööòõööõþõøõäõÊõ¶õ õ†õrõZõEõ6õ(õ õõõõüôÿôèôõæôøôìôðôóôóôøôïôïôèôæôéôÝôæôÚôÛôÖôÎôÊôÉôÇôÃôÇôÅôÏôÅôÌô½ôÄô´ôÅô¹ôÅôÀô»ô¼ô»ô±ôºô«ô¸ô³ô²ô»ô²ô¼ô¶ô·ô±ôªô«ô¥ô¯ô¡ô±ô¢ô«ô¢ô¨ô’ô§ô•ô¨ôœôªô¥ô²ô­ô·ô±ôºô»ôÃô»ôÇô¾ôÔôÌôæôÑôâô×ôàôÝôôôôôûôýôýôüô õ õ(õ5õQõ\õõ}õœõœõ¤õ·õ»õÒõËõæõØõíõðõ÷õþõö ö öö ö ööööööö"öö-ö"ö,ö,ö0ö=ö>öJö:öKö:öLö<öMöAö?ö@ö4ö?ö:ö-ö=ö)ö?ö&ö1ööööÿõö öö ööööö!öö+öö)öö%ö$ö"ö-ö!ö/ööööööööíõÛõÞõÙõãõãõßõÞõÅõ·õ¤õõõnõ^õLõ4õ'õõ õýô÷ôêôåôæôÓôÜôÌôÌôÁôÁô²ô·ô±ô«ô¯ôªô¯ô¥ô«ô©ô¡ô´ô·ôºôÛôÝôõõ8õWõOõeõ\õmõsõhõpõ[õRõOõ@õHõ3õbõQõqõoõzõqõtõnõ}õõõšõšõ˜õ¦õ õËõÆõÖõ™õ¤õcõ„õeõ—õƒõ™õ–õ€õxõsõwõ{õ“õuõ}õWõ(õõøôþôïôõõõõõàôûôÝôåôèôâôÓô×ôÄôÀôÁôÇôÆôËôÁô·ôžôŠôwôsô[ôbôMôJôLôHôKôBô_ô`ôôœô©ôô´ô¦ôÒôòôõ'õ5õRõ[õuõWõrõxõ•õŸõ½õ¾õËõ×õøõö%ö'öEö:öSöSö\öVö^öOö_ö_öjöröxö}öyöˆöwöö“ö˜ö¥ö£ö­ö³ö½öÎöÖöÈöÈö¿öÌöËöÜöãöÛöõöäö÷òö ÷óö÷ñö÷òöñöáöÖöÌöÞöñö÷÷,÷(÷R÷C÷s÷P÷U÷J÷H÷;÷:÷0÷3÷(÷-÷1÷÷÷èöÕöÀö«ö“öƒö<ööüõööööõõöõ÷õúõóõéõÔõÞõ×õÚõØõçõËõÙõÅõ½õ£õ¨õõzõeõKõPõAõ7õ+õ'õõ*õ(õ-õEõ õ?õ+õ?õ8õPõQõ`õkõ}õƒõ õ–õ¬õ¤õ¬õ¬õ½õ°õÆõÃõÑõÓõßõ×õÒõàõÕõãõÕõêõÛõíõãõÙõÆõÛõÈõäõØõáõÜõÛõéõÄõÙõÂõÐõÙõ×õáõÕõçõßõñõéõÔõàõÒõèõèõìõëõÛõáõÕõÜõØõÚõÄõÔõÌõÝõÄõÚõªõÉõ»õËõÉõ¯õÄõ±õÇõ õ­õ|õ‹õ‰õŒõ—õõŠõŒõ™õšõœõ«õõ²õ¦õŒõ’õ„õ’õ õˆõiõRõLõ4õUõTõPõCõ õõ°ôÑô›ô°ôŠôŒôbôeôOôEôLô)ô1ôôôôôôôô ôôôôöóÿó÷óýóêóôóìóßóàóÙó¾óÖóÅóÊóÊó¬óˆó–óšó±óÍóÞóèóÿóô2ô=ôLôFôLôMôPôWô`ô^ô^ôXô_ôXôbôjô[ôbôUôZôHôNô4ô2ô&ôôô ôôþóôôô÷óîóïóßóìóØóãóÍóÓóÃó¼óºó¼ó²óÆó±óÂóºó·ó¼ó¹ó³ó¶ó±ó³ó³ó¨ó±ó™ó¨óˆó–óoóuóSó\ó@óRóHóQóNóCóGóVóXóqó}óžóªóÇóâóØóõó ôLô€ô™ôÐôáôõ2õ^õaõ„õ§õÃõéõñõöö7öJöhö}ööŸö¬ö¯öÐö×öëöûö ÷÷÷#÷-÷:÷c÷Z÷t÷q÷[÷f÷{÷†÷Ž÷”÷•÷÷¦÷•÷˜÷…÷n÷a÷g÷J÷G÷?÷5÷÷÷÷ùöóöúöÙöØö”ö¥öö—ö{öŒöföQöHöKöLö=öHö1ö)öööÑõËõ¼õÅõÊõ¯õ õ–õõõ«õÍõÀõÜõÒõåõèõíõùõõõ ööööÿõúõöüõöôõÿõùõùõíõþõñõöêõàõÎõ´õ¶õ¬õžõõtõ„õpõ€õcõ`õTõVõnõcõeõ9õõõæôÏôÁô¬ôôˆô|ôbô]ôKô?ôJôOôNô`ôZôdôuô¢ô ô½ôÈôØôôôõõ.õ?õRõcõtõ]õqõsõõõ§õ¹õ¾õÒõãõóõûõö ööööööööñõúõÏõèõÜõñõÜõäõÉõËõ×õçõðõóõìõàõùõòõñõûõÅõ£õœõŸõõ‡õqõfõIõQõ5õ$õ+õõõõäôæôÊô°ô£ô’ô–ôkôyôSôQô9ô7ô ôôìóÞó»ó´ó¢óŽó„ófóRóEó+ó óóÚòÈò«ò¦òzòuòFò-òôñøñÒñÆñ·ñŸñ‚ñ~ñZñQñKñ8ñIñ0ñJñ%ñNñ<ñGñIñGñEñJñ^ñRñ]ñEñ`ñ_ñ}ññ‰ñƒññ—ñ¡ñ±ñ§ñ°ñ¤ññ‘ñŽñtñ{ñnñuñnñeñQñNñ0ñ<ñ)ñFñ3ñDñDñ8ñDñ<ñIñOñ]ñPñWñMñMñRñ\ñañWñlñuñ‹ñ£ñ¯ñÏñèñþñ)ò*òBòPògò‹òò²ò¹òÏòÓòÓòÕò¯ò«òšò€ò|ò`òEò@ò&òòò òòò!òò1ò@ò>òPòRòròòªò®òÕò×òùòðòóóóó$ó&ó4ó+ó5ó@óBó[óSóió`óaó`ódó\ó]óOóKó%ó6óóóèòØòÍò²òžò€òCò7òòòøñçñ×ñÒñ¼ñ½ñªñ¦ññŒññrñeñMñ<ñ)ñññÝðãðÌðÈð½ð¹ð¯ð±ð®ð¢ð­ð­ð½ðÄð×ðåðêðñûðñ ñ+ñ'ñ-ñ(ñ!ñ*ññ%ñññññ ñ-ñ&ñ4ñ;ñ=ñDñ@ñHñ\ñ^ñcñqñlñuñuñ‹ñqñ›ñƒñœññžñ¬ñ²ñ¦ñ©ñ«ñ›ññœññ–ññ¦ñ•ñ®ñ¢ñ·ñ´ñ¼ñÊñÒñÛñïñôñòò3òJòkòqò›ò±òËòßòëòãòÊòðòðòóó<ó9óUóeó…ó“ó¦ó´óÇóÐóãóöóôôLôDôrôpô”ô§ôµôÒôãô÷ô õ õõõ2õEõ\õfõdõWõIõ0õ)õõõõðôêôÈôÉô¨ô¢ôuôqô4ô"ôòóÏó¬ózó\óóóÀòºòpòRòòòáñ¼ñ­ñtñ`ñRñ:ñ$ññððåðÏð¯ð•ðmð<ð4ð$ððð$ðððððð ððð(ðð$ð,ð)ð2ð.ð&ð/ð'ð*ð*ð"ð-ð#ð;ð'ð=ð1ð.ð1ð+ð"ð%ð ððâïòïÖïüïòïðð,ðEðNðtðhð–ð”ð²ð¸ðÔðÕðîðïðññññ/ñ8ñSñeñ€ñ¥ñ»ñçñò7òYò†ò¨òÍòéò ó$ó<óOótó~ó¯ó±óâóðó ô2ô0ôVôXôsô}ô•ô˜ô¯ô±ôºôÂô½ôËôÃôÓôÌôÌôÎô¿ô¿ô±ô™ô“ôxôrôSôRô)ô3ôô ôùóðóïóæóåóÛóÖóÐóÀó¾ó›óŽódó_ó*ó&óõòÜòÁò’òƒòLòBòòòùñÙñÙñ»ñ¸ñŸññ}ñtñ_ñ^ñEñMñ3ñ>ñ+ñ3ñ"ñ)ñ)ñ$ñ0ñ'ñ/ñ:ñ5ñMñLñVñqñoñ’ññ²ñÆñÍñßñÛñîñèñþñûñòòùñÿñîñçñÕñÊñ³ñªñ”ññrñTñ?ñ#ñ ñúðèð×ðÊð¹ð¶ðªð±ð¦ð¨ð§ð§ð³ðµð¿ðÂðÂðÍðËðÈðÙðÔðéðâðïðþðîðññññññÿð"ñññññððùðÅðÉð¢ðŽðoððwðð‰ðwðð‚ðð–ð˜ð™ð–ð€ð[ðIððððð"ðþïøïðöï ððð ððð(ð2ð2ðUðHðoðuð•ð’ð«ð²ðÆðÑð×ðöðçðññ ñ2ñBñ^ñvñƒñ“ñ¦ñ¤ñ¥ñµñ¨ñ¥ñ²ñ¯ñ¹ñÂñ§ñ¦ñºñÃñçñõñòòPò@ò{òqò†òŒò“ò“ò’òò†òrò_òSò6ò5òòòîñÖñÉñ¬ññkñgñ[ñnñcñƒñsññ‰ññžñ˜ñ ñññ}ñqñjñ[ñUñGñBñ/ñ.ñ$ñ!ñ0ñ&ñ-ñ.ñ2ñ&ñ<ñ+ñ>ñ;ñ9ñIñ@ñCñ@ñ;ñ2ñ9ññ'ñþðñÞðáð¹ð¢ðgð`ðCð<ð1ð*ð!ððð ððýïðùïðîïõïíïéïñïåïëïèïçïðïíïöïñïÿïïïðíïýïûïõïðöïýïýïøïþïëï÷ïéïðìïðøïðÿïúïûïðïûïîïðñïðüï&ðð9ð)ðMðMð`ðeðqðwðzð†ðpð†ðfðxðjðhðfðað_ð[ðUðQðFðOðCðNðEðFð?ð9ð9ðð&ðøï ðêïíïàï×ïÑïÏï¼ïÈïÄïÓïæïëïð ð>ð7ðgðhð‹ðžð¹ðÐðêðññ6ñJñ[ñwñ|ñ¢ñ¤ñ²ñÈñ½ñÐñÓñÊñÕñÎñÒñ×ñÏñÜñÍñÙñÓñÔñÎñâñÓñññæñüñ òò,ò9òEòUòeòrò…ò“òžò²ò±ò½ò¶òÁò¼òÎòÃòÝòÄòãò¾òÜò´ò·òªò›ò™òòvò]òAò6òòòêñàñÉñºñªñŸñ‹ññnñZñTñCñ:ñ0ñ)ññ%ññññ ñññññññ ñ ñ÷ðöðçðèðÓðÜðÄðÄð¾ð¦ðŸðŒðwðuð_ðVðLð=ð1ð%ð ðð ðôïöïçïáïÕïÎï¾ï»ï£ïžï‡ïïsïuï_ïqï[ïhï\ï\ï_ïaïpïwï’ï”ï´ï»ïÓïßïñï ðð'ð4ð:ðIð>ðIð3ð.ð3ð.ð/ð7ð*ð?ð7ðRðOðeðoð…ð—ð¬ð¾ðÊðáðîðñññ#ñ.ñ4ñ8ñGñ?ñMñAñDñ>ñFñ@ñHñCñNñKñRñOñ\ñLñdñañdñkñeñbñfñ^ñ[ñOñ:ñ=ññññìðÖð·ððmðCððüïàï¿ïªïˆï~ïeïgïYïaï]ïiïpïïŠï£ïªïÂïÆïàïòïðð1ð=ðVðUðjðkðvððð¬ð¶ðÉðèðõðññ+ñCñ@ñbñXñqñtñtñ€ñvñ{ñ†ñ~ñŒññ~ñpñpñbñañQñKñIñKñBñSñGñOñJñNñ@ñ<ñ2ñ/ññññññõðïðîðçðìðéðíðëðêðëðáðçðÙðÜðÕðÏðÄð½ð©ð©ð‰ððdðWðJðBð9ð;ð'ð9ð ð4ð&ð&ð4ð%ð;ð7ðFðKðZð[ðkðeð„ð|ð“ðð•ð“ð‰ð‘ðwð|ðkðmðbðdðfð[ðkð\ðZðTðHðIð>ð7ð+ð,ðððþïðÝïéïËï¾ïªïŠïwïOïDïïïÕîÑî´î£îŽîî`î[î9î$îîôíøíÖíÌíÃí´í´í£í¤í—íí‘í•íŒí’í„í“íˆíí‹í¢íí¾íÄíÚíêíóíîîîî(î0î7îHîPî`îgî‚î€î¡îªîÇîÖîëî ïï/ï=ïRïhï‹ï«ïÍïèïð$ðEðSðeðnð|ð…ð”ð†ð“ðŽð¥ðŸð±ð²ð¹ð½ðÌðÍðêðàðññ#ñ7ñZñ`ñ†ñ›ñ®ñ¿ñÊñÒñËñÖñÊñÓñÎñÌñÏñÎñÆñÊñ¿ñ·ñ£ñ£ñ‹ñˆñtñsñcñZñ_ñLñPñEñLñIñ9ñ=ñ,ññ ñÿðÔðÐðªð§ð‰ð‰ðoðxðhðoðfðjðiðrð{ð…ð‡ðœðžð¤ð¶ðºðÎðÝðòðþðññ0ñ'ñ7ñ@ñ9ñTñMñ`ñmñsññ“ñ¡ñ¨ñ²ñÄñÅñÉñÞñÍñ×ñÓñÐñÀñ¸ñ²ñ¢ñ—ñ”ñxññ\ñbñHñ>ñ3ñ+ñ!ññññúðùðãðåðÓðÕðÔð×ðÜðéðùðþðññ4ñ9ñTñ[ñkñqñ}ñxñ|ñsñkñ_ñ`ñNñSñ>ñEñ=ñ<ñ:ñ<ñGñWñ`ñ}ñŠñªñºñßñêñ òò>òOòpòrò¢ò‰ò¹ò ò°ò«ò¯ò´ò»ò·òÀòºòÍòÂòÖò¼òÕòÁòÔòÈòÊò¿òºò¯ò£òŸòŠò”ò€òò€òrò{òtò~ò~òò˜ò­ò¹òÉòÝòæòóòùòõòñòìòãòÛòÙòÐòÓòÈòÇò¶ò¯ò¡ò¡ò‰òˆòiòWò7òòòñÎñ«ñ‚ñqñAñ7ñññæðàðÁðºð¦ð”ð’ðnðoðMðAð'ððñïÞï¾ï¨ïï}ïbïVïHï-ï*ïïïïïï*ïï=ï7ïCï[ïoïŽï ï½ïÓïîïðð(ð?ðKðbðhðyðƒð„ð—ð“ð ðœðð¥ð¡ð£ðœðœððˆð{ðhð`ðBð7ð$ð ðÿïäïÚï¶ï³ïïï`ïKï9ïïïïþî×îËîÉîÀîÎîÅîÔîÑîÞîíîëîïïïïïïïïïï×îÍî½î·î¹î¯î¶î›î¬î¦î²îºîÅîÝîæîïï8ïDïWïkï}ïïï¥ï¨ï¨ï·ï¸ïÌïÆïËïÒïÐïÛïÝïßïàïáïàïÞïÛïÚïÜï×ïÞï×ïÔïÒïÓïÁïÂï±ï®ï­ï™ï™ï‚ï~ï|ïhïoïGïGï(ïïïïïÿîïï ïïï!ï0ï6ï=ïAï<ïAï1ï/ï.ï'ï+ï$ï%ï(ïï*ïï.ï*ïAï>ïOïYïhï}ï’ïïÁïÑï÷ïð-ðJðbð~ð˜ð°ðÅðßðõðþð ññ2ñ$ñ0ñ/ñ.ñ,ñ$ñ"ñññ ññññýðüðððìðáðÜð×ðËðÅðºð®ðŸð”ð‡ð|ðoðjðZðQð?ð-ð*ðððððûïùïûïôïýïìïñïÝïâï×ïÖïÓïËïÎïÃï¿ï¾ï²ï»ï©ï±ï ï¡ïƒïŽïbïrïPï^ïKïPï?ïDï4ï8ï(ï,ïï"ïïïïï%ï1ï=ïGïQïVïQïTï@ï?ï1ï$ï&ïïïìîäîÐîÃî®î™îŠîsîfîPîBî:î3î,î/î(î3î0î4î,î*î%î%î îîîîî"î%î2î/î6î;î5î4î1î(î0îî+î%î(î,î!î(îîîî î÷íüíåíòíãíæíìíáíãíÔíÅíÓí¹íÂí¬í“íyíoí~ítí‡í‚í}íí†íší¥í í´í¥í¾í¦í¼í²íºí¸íºíÄí°í½í·í¨í±íœí¤í‘í™í”íŒíŒí…ííuísígígíhí_íeí^í[í`íjímíƒí„íŽíƒí‹í™íí§í¤í²í¶íÈíÆíÓíÐíÛíÞíÛíâíÞíàíèíîí÷íî%îJîpîîÀîßîïï:ïDï[ïeïï€ï˜ïšï°ï±ïÅïÐïÖïâïîïãïðïÓïÞï»ï¬ï›ïƒïïuïsï€ïyï˜ï˜ï¹ï¸ïÎïÛï×ïâïÙïÖïÐïÉïÇï®ï­ïšï’ïŒïŠïzïïnïtïqïcïjï}ïuï¡ï—ï»ï¿ïÆïÙïËïÀïÂï±ï«ï£ïœï¤ï›ï°ï»ïÏïâïððGðcðƒð£ð¾ðÎðäðìðîðìðàðÎð·ð™ðiðFððíïËï©ïŸï}ïvï_ï[ïAï8ïï ïøîêîâîÓîâîÜîïï<ïkïïÊïíïðMðkð ð¾ðçðñ=ñañ•ñ«ñÔñãñôñòôñûñéñêñßñâñÝñäñßñèñÕñÔñ¾ñºñ£ñ™ñ~ñrñVñIñ3ñññ÷ðæðßð¸ðºð–ðƒðvðMðSð0ðCð-ð4ð'ð*ðððóïáï¼ïªï|ïhï;ï%ïïðîÝîÈîºîªî¡îîŽîwîxîqîcîRîSî3î@î!î)îîîþíöíÚíÓíºí±í®í¯í£í«íší”í„í—í‹í¦í¢í°í±í¶í®íºíªí¢í‘í™í…íxíríPíBí!í.íííúìïìÞìÈì¿ì¹ì¯ì®ì°ì¯ì»ìÄìèìùì+íJíˆížíØíæíî!î2îPîcîoîˆîîŽî¨î¤î¨î½î§îºîî›îrîQî%î÷í×íªíˆítíKíJí4í=í/íBíBícíUívíníoíqípífí\íVíUíKíIíCí;í0í0í(íííííåìàìÊìÐì¹ìÉìÊìÎìàìóìí&í;ídí^íŠí}í“í”íœí¸í´íÓíàíïíî îîîî îîîíôíÅíÇíí˜íŠí|í€í‚íí–í«í´íÆíÃíÞí×íåíéíêíííËíÆí¢íŒíuíaíAí,í íüìõìÙìÓì±ìšìhì`ìOììþëÒëÇë®ë·ë¹ëÊëÙëåëïëòëíëøëõëìÂëÂë}ë~ëvëŽë¦ë¥ë¼ë»ë×ëÔëçëøëìì ìììì'ìûë(ìì2ì(ì5ì6ì=ìHìLìiìqì€ìuìqìeìlìdìsì[ìDìììì ì ìëëþëËëèëÁë±ë¬ë¡ëÇëÃëÞëêëçëììDìEìfìlìƒììµìÍìíìíí?íTí}í{í›íšíœí¤íí•íoímíQíFí0í"íííöìììðì×ìéìÚìèìñìøì í í í ííííûìüìììàìÏìÇìÁì¿ì¼ì«ì«ìœì¥ìœì³ì«ìÂì³ìÕìÖìòìíí%í-í4í>í7íAí@íDíIíJíPíRíMíXíKíIíOíCíTíCí[íJígíaíˆí’í²íØíðíîGînî›î·îÎîêîøîï.ïEïTï`ïrïtïï~ï‚ïïïœïžï¤ï³ï®ï»ï¹ï¯ï´ï£ï¦ïï{ïXïKï7ï#ïïï ï/ï:ï`ï}ï”ïºï½ïÍïÀïÊïï“ïfïAïïíî¸î–îcîBîîòíÄí­íƒííUí]í>íOíFíTíYídíqí}íxí†ílí{íuí{í‡íŠí™í›í­í¥íµí§í¯í¨íœí™ííƒí€ípíaíYíAíAí%íííþìçìôìáìîìðìíí.í@íTíUí\íYí@íEí"í&íííííàìôìÔìéìÎìËì½ì¸ì¥ì«ì¢ì¥ì¢ì®ì°ì¼ì¯ì»ì¨ì±ì©ìì£ìxì€ìwìqìwìwìrì}ìkì†ìTìlìYìiì]ìjì\ìkìiì€ìì£ì¶ìÊìòìõì2í5ímíwí¤í½íßíî"î_îkî¡îªîÓîÖîéîäîôî÷îûîýîûîüîüîûîï ï ï.ïNïfï†ïœïÇïÎï÷ïÿïð%ð'ð+ð%ðððøïÀï~ïgï5ïïäî¯îî7îîÞíÅíxí\í<í ííýìäìÙìºìÐìºìÆì¦ì¦ì†ìkì€ìgì|ìmì|ì~ìyì‚ì‚ììˆìŽì‚ì‰ìTìeìTì]ì^ìiìcìqìgì€ìvìŒì~ì„ì€ì|ìì|ìƒì~ìì’ì’ì™ì‡ìˆìì‚ì‡ìzìZì:ì7ìAìCìTìLìVìQìVìmìkì}ìnììyìœì„ì ìì”ìì¢ì“ì™ìì‰ìì€ì}ìzì„ìŒì‹ìŽìqì…ìhì}ìdìaìBìì%ì#ì!ì0ì8ì;ìWìeì‡ìšì¦ìÑìâìí/íYíxí¨íÁíãíþí î$î(î.î3î!î(îîîî îîîîî5î=îWîzî—îÕîýîHïqï§ïÚïõïð ð#ð$ððððüïÌï¿ï™ïïOï(ïýîÃîîiî:î"îöíôíÚíæíèíþíî+î)îHîCî`îBîZîCîPî]îbîîŒî§î«îÃî¶îÈîÀîÇî¿î¹îÄî¸îÆîÓîàîñîï+ïKïjï‘ï«ïÏïíïðð/ð6ðXðIð^ðEðMð)ð(ððñïçïÒïÉï¿ï¨ï«ï‹ïïhïmïTïXïnïvï§ïÅïð4ð}ð¥ðìðñ5ñFñañcñtñqñyñnñzñqñvñrñsñ^ñhñ@ñIññ"ñ ññ ñ+ñ,ñOñ^ññ„ñ’ñ—ñšñññwñVñCññïðÂðŠðað/ðóï¹ïjï"ïØîîoî7îîâí¿í—íƒílí^íCíJí%í,í íííí ííí íóìíãìÝìÛì½ìÈì³ì®ì¡ì‹ì„ìˆì{ì†ì‚ì|ì}ìsìvìRì_ìUì[ìjìdìqìeìmìuìlìŽìlì‚ìpìpìiìdìiìcìqìvì}ìŒì“ìžì®ìÁìËìâìçìììÿìí í"íDíEícífíˆí†í­íÀíäí î4îjîŒîÅîãîï0ïKïyïïÀïËïððGðrð’ðÀðÜðññ-ñ<ñKñ\ñWñeñfñnñ€ñ“ñžñ¹ñ¿ñÚñëñéñùñòò òòüñåñÂñ·ññ]ñ(ñüð¹ððXð0ðòïÊï“ïyïWïFï1ïïöîîîßîÔî·î«î‚îdîJî îöí¸í­ípíbííçìÑìºì¼ì§ì°ìì£ì„ì§ìœì°ìªì½ì¼ìÆìÉìÒì×ìÞìâìòìûì ííEíEíí|íºíºíåíóíîîî î÷íÐíÄíŽíí^í:í.íííFíWí’í´íâíîAîdîŒî¢îÁîÏîÛîìîßîáîÜîÓîÑî¸î£î‹î\îHîîîííçíçíîî2îSîzîžî¾îðîï:ïqïˆïÂïÞïð8ðeðð¥ðÌðÑðàðÙðÙðÄð¶ð¢ðð–ð‡ð—ð•ð•ð¢ðð©ð©ð¤ð©ð¨ð¨ð¯ðªð¹ð§ð±ð•ð…ðfðIð*ððñïÏïÂï²ï²ï¦ï­ï±ï´ï´ï®ï©ï ïšïšïï¦ï³ïÔïñïð3ðYð…ð˜ð¿ð´ðÎð·ðËðªð·ð¢ðð”ðsðsðeðbðað]ð_ð^ð[ðWðHð>ð1ð&ð)ðð#ð"ð-ð;ðYð]ðð›ðÎðñð ñ8ñeñdññyñ“ñ€ñ†ñññŠññ–ñ–ñ“ñŠñ„ñxñeñHñ2ññ÷ðßðÁð³ðð’ð{ðlðOð+ððÛï¬ïrï@ïýîÕîšîîHî8îîîØíÑí°í±í¡í—í¢íí¢íŒíží€í„íkíeíOíJí(í!í íôìííìöìÔìÓì·ì¹ì±ì¡ì™ìmìGìIì?ì@ìHì<ìKì;ìbìYì€ìŠìªì×ìæìí7í_í‚íí³íÂíÑíÐíÜíÑíÄíºíªí™í‰íjíhíRíNíRíEíLí1í+íííí÷ìâìÚìÅì¼ì¦ì¬ì—ìªì˜ì¦ì•ì ì›ì¤ì¬ì±ì½ì±ì´ì´ì¦ìµì˜ì¬ì’ìœìŒì™ìì¤ì¢ì¼ìÎìÛìÿì í í;í5íNíUí_íiítí‡íí¤íªíÀíÀíÓíÔíÒíÌíÂí»í¯í¯í¤í¼íÄí÷í î^îîÖîÿîGïdï—ï·ïÉïìï÷ï ðð,ð5ðJðNðiðcðnðcð_ðCð!ððËï¦ïpïNï.ïïï÷îùîøîïïïMïfï™ï¥ïðïðCðgð|ð“ð¢ðÇðÕðïðçðåðÜðÍð¥ð“ðað<ð ðäï³ïqïFïïùîÙîÆî¸î’îzîeîhîHîLî-îîîùíî î î!î'î4î5î;î:îBî;î@î@îKîNî`îzîîªîÒî÷îï:ïmï‹ï»ïçïð"ðð)ð:ð6ð:ð0ðððõïØï¹ï¦ï—ï¡ïŽï¤ïï“ïqïïrïpïiïfïlïoïƒïï§ï¯ïâïòï3ðJðð•ðÄðÛðññ8ñ/ñJñ3ñ(ñ ñìðÃð¢ð‚ð`ðQðFð\ðrð›ðÇðóð#ñQñqññ¦ñ¸ñÎñ×ñëñîñòòòòóñüñÏñÍñ›ñ‘ñnñ[ñIñ3ñ8ñ,ñ=ñFñRñXñ^ñWñFñ8ñññððÔðÐðÌð¿ðÓðÇðÔðÂðÁð®ð ðsð`ððýï³ï˜ïLï"ïëî½î•î|îiîhî^îlîeî}î‘î¯îÖîÛî÷îöîöîóîìîÚîÓîÅî·î¨î·î£î´î¬î«î”î…îZîNîîîàíÄí¸í¬í¥í«í¶íÍíØíåíèíëíÞíÖíÇí·í²í¡í¶í¬í­í®íí•ízíríRíEí-í0í7íYíxí½í÷í=î†î¿îï&ïlïrï¨ï°ïÑïâïüïðRðwð®ðÞðñ3ñOñwñŽñ°ñÉñèñüñò#ò.ò4ò8ò9ò*ò7ò%ò*ò ò-ò&ò1ò1ò0ò-ò-ò/ò;ò0òDò9òIòFòPòHòIòHò>ò3ò òòûñÛñãñÐñØñëñíñòò=òEòGòAò1ò*òòòúñòòAòSòƒòòò¡ò–ò€òcò8ò òåñÂñ ñˆñ{ñ‚ñ~ñ˜ñ˜ñ³ñ¹ñÉñÓñÑñáñëñÿñò&òEòPòpò€ò€ò‚òòjòcòQòFò?ò@ò@òSòXòqò‡ò›òµòÎòóòó<óOóŒó¤óïóôXôqô¨ô¢ôÀô´ô¿ô®ô½ôªô¼ô®ô·ô¯ô®ôžô‹ôxôXô?ô%ôôÿóøóúóôóýóüóûó ôðó ôîóøóîóúó÷óôô ô>ô7ôUôAôEô;ô?ô2ô;ô;ôOôaô‡ôµôÔôÛôêôÏôÏô©ô©ô‚ôqôZôYôKôXôTôVôGôHô$ôôÛó·óyóOóóúòâòÔòÏòÔòÒòÎòÖò·ò°òŒòfòMòòòåñ×ñÀñÌñ®ñ¿ñ±ñµñ±ñÆñËñêñþñ1òNòˆòœòÑòæòüòóýòøòÞòÑòÇò·ò¨ò«ò£ò–ò²òžò³ò¤ò«ò›òšò¡ò­òÁòÝòýò)óCóió|ózóvófóEó4óøòèòÂò§ò›ò‡ò‚òòˆò‹ò‰ò‹ò}òoò`òAòLò(òKò@ògòmòò—ò±ò²òÌòÌòæòãòôòïòóõò ó ó2ó5óPóHó\óYó^ódójó‚ósó•ó‘ó¨ó¢ó óó{óLó!óÚòŒò5ò÷ñºñ„ñSñ1ñññðÜðÎðÇðÇðÅðÐðÍðóðñ)ñWñnñ ñËñêñò'ò<òCòò"òÎñ¼ñoñ=ñ ñÒð©ð{ðSð5ðððùïìïíïìïèïîïíïïïôïðïðð%ð)ð<ðMðNð]ðYðTðCð:ðððåïÂï›ï„ïdïTï@ï:ï5ïNïTï‚ï™ïÏïîï"ðBðcððxðŽðlðgðAððéï¶ï…ï^ïIï$ï&ïïïïï,ï5ïIïiïvï­ïªïÞïÞïð ðð&ð/ðDðEðlðoðð­ð·ð×ðäðúðñ ññþðóðáðÎð½ð¦ð¦ð ðªð¯ðËðÛðññQñsñ£ñØñÿñ3òYòƒò§òÏòëòýò#óóCó4ó@óCó9óKóEó`ó_óó‘óÔóóó>ô^ô¡ôŸô½ôµôºô¸ô¢ô”ôoôZô/ô#ô÷óúóàóìóÔóÖóÈóµó´óœóžó†óóƒóŽó€ó…óóvó€ólóeóMó6ó$óóöòêòËòÊò´ò—ò‹òaòRò*òòòñÐñ³ñ‡ñpñOñAñ6ñ+ñ-ñ!ñ&ñ'ñ(ñ+ñ.ñ5ñ<ñ?ñKñ1ñJñ%ñ2ñññ ñññ-ñ_ññÏñòXò«òôò`ó¬ó ôXô©ôêô5õlõ¡õÈõööFöXönötööyö|ödöZöGöEö<ö;ö*ö.ö öûõÔõ·õ‹õaõ%õðô§ôsô+ôûó¯ó|ó8óóÅò¢ò\ò4òòñÊññfñIñ"ññëðÀð¤ðhð4ðóï¯ïXïïÆîîQî6îîîî*î3î[îuî î¶îÒîõî ï-ïKïkï™ïÁïóïð@ðHðlðkðdðZð>ð:ðððð ð ððð#ðð+ð&ðð ð ðð ðð ðþïðÿïûïáïÙïµï‘ï|ïOï8ïïï ïï ïïCï;ïTï]ïdïuï~ï˜ï£ïºïáïñïð3ðLðjðuð‚ðyðeðQð;ððùïÙï¾ï«ïïˆï…ïdïfïDï;ïïïï÷îóîðîðîöîõîïýîïï7ïFïjï‰ï½ïåï+ðXð¡ðÀð ññAñXñfñkñkñ[ñYñIñKñSñSñqñ{ññ°ñÆñÔñâñêñò òò7ò=òYòdòjòlòiòUòEòòøñÜñ­ñœñ~ñmñsñpñ{ñ—ñ˜ñ¥ñ¼ñ±ñ¿ñ³ñÂñ´ñÃñ½ñËñÆñâñâñùñøñÿñöñëñäñÈñÑñ½ñ¶ñµñŸññ†ñnñeñLñ>ñ ññëðÜð¿ð¯ð¨ð—ð“ð™ð“ð‘ðžð§ð¥ðÏðÙðÿðñ.ñeñsñ«ñÁñåñþñ)òGòò™òÍòõò%óJóvó¤óºóÕóæóçóïóñóêóöóæóêóëóõóôô0ô,ô4ô4ô1ô1ô1ô=ôGôdô~ô§ôÚôõ@õnõ£õÍõòõ ö8ö<öTöaöiötötö„ö…ö‰öŠöˆööö}övöXöRö6ö5öööööö÷õñõÝõÙõÐõ°õ¤õŒõõdõ]õ;õ3õõ(õ"õ9õ8õBõKõDõGõAõ2õõõáôÌô¶ôÂô¯ô×ôåôõBõmõšõÀõÜõöö7ö>öXö[öföYökö_öqösö€övönöcö_öSöPöJöBö4ö1ö/ö ö&ööö ö öööþõöö/ö-ö;ö&ööööûõÝõÌõ®õ˜õ†õõ\õ^õ7õ8õ õõÑô¼ô‚ôcô)ôúóËó§ówóXó&óóÑòÈòŸòŸò~òsò`òLòFò<òRòPòYòzòò¡ò¾òäòó7óWó‚ó“ó¸óÔóôôXôyô¤ôÌôíôõ'õLõcõ†õ•õ¹õ¿õÛõÛõöôõ ö ö4ö'ö5ö7ö4ö1ö-ö,ö(ö)öö$ö&ö#ö1ö+ö3ö6ö0ö1öBö8öQöQö]ödöaöiö]öXöWöJöAö0öööúõòõîõðõñõöõóõýõ÷õ öö%öö0ö.ö:ö6öFö?öFö?ö-ö%öòõÔõ­õ}õ]õ;õõõéôÑôÎô¼ôÙôáôõôïôñôãôïôõõ0õLõkõ›õÊõö1ödö„öšö°ö¶ö¿öÌöÄöÕöÐöèöñö÷÷÷<÷/÷E÷&÷%÷÷ïöáöÍöÊö¼öÀöÀöÀöÎöÉöÕöÅöÍö¯ö¶ö›ö¥ö—ö­ö ö°ö³ö«ö¦ö˜öjö6ööµõ€õCõ õæô°ô¯ô¨ôÃôéôøô(õ;õRõpõpõuõ‡õõ£õ·õÏõëõ öö=ö&ö;ö.ö/ö$ööúõäõºõ¾õõ©õµõ¾õÊõÐõÏõæõäõýõö%öBöQö€ö¡öÑöþö+÷H÷Y÷c÷p÷b÷]÷`÷K÷M÷R÷X÷\÷j÷„÷•÷°÷Ð÷Ø÷þ÷ô÷øøøø"ø øøøøò÷Ò÷½÷œ÷|÷Y÷;÷÷÷çöâöÉöÏöÎö¾öÇö«ö ö‰ööuöföDö%öüõéõâõñõëõ÷õòõ÷õýõýõöööö öööö ö öö%ö(ö ö%ööööö ö,öAömö—öÔö÷N÷}÷²÷õ÷ ø#ø=øCø\øaøŽø“øµøËøäøùø ù#ù/ù2ù5ù/ù ù%ùù,ù(ù<ùJù[ùpùkùžùˆù™ù‘ùùuù†ù~ù„ùù¸ùÅùãùáùàùÜùÞùâùÜùÞùßùôùú5úFú„ú±úçú=ûiû¶ûÞûü:ühüü¬ü´üËüÐüÊü®ü¤üküEüüÞû¨ûvûOûûÿúÍú»ú—ú‚úkú\úDúDú,úMúLúuú‡ú¹úÎú û&ûIûaûwûoûtûcûZûCûKûHûVûkûû û³ûÓûÞûêûëûúûüü#ü1üUü^ü„üü”ü˜üŠü|üQü5üûûÇû”ûtûQûHûMû:ûJû<ûBûAû/û ûûíúêúÖúéúÓúéúÛúðúåúÜúÂú§ú€ú`úEúúðùÌù¤ù†ùgùMù)ù ùøøÛøÒøÊøºøÓøËøù&ùbùŒù»ùéùýù"ú+ú3ú:úKúcúiú†ú™ú¨úÍúàúûúüúû ûûûûûûû.û2ûKûOûiûsûûšû·ûÃûÍûäûßûýûêûüØûáûµûªûûqû]ûXûIû]û_ûsû’û—ûµû·ûÁûÇûËûËûËûÆûÑû×ûæûóûüüü(üüüüüüöûðûúû ü$üIüqü—üÄüøüýKýSýŒýžýÓýúý,þPþuþ›þ°þÄþÒþÔþØþÎþÎþÆþÄþÌþÈþÙþÑþìþØþÜþÌþ®þ•þjþ9þ þäý¼ý˜ýuýIý2ýýâüµütüMüüõûÇû¯ûšû…û…ûuûyûpûeûYûQû)û$ûâúÝúªú™ú}útúoúyúsúú{ú„ú|úsú{úaúrúiúrúƒú–ú³úÕúøúûû+ûûû û ûôúõúÇúÉúÏúåú"ûNû–ûÅûü,üPügü“ü üÔüåü ý ýý(ý)ýHý#ý&ýýâüµü¡üsüqüfü]üZü]üküyüƒü˜ü˜üœüü“ü‹üü‡ü„üŠüüü›ü üªü­üÁü©üÅüÂüËüßüèüûüýý"ý>ýUý…ý²ýÛýþ'þ[þtþŽþ©þÈþáþûþÿÿ ÿ4ÿ>ÿKÿVÿYÿjÿaÿQÿNÿ.ÿ?ÿ ÿ ÿúþéþØþ×þÕþíþãþÿþþ ÿ ÿ4ÿ?ÿHÿSÿ]ÿmÿiÿzÿlÿlÿXÿIÿBÿÿÿõþæþÊþ²þþˆþxþlþUþ<þ*þ þðýÎý®ýƒýuýJýXý;ýMýHý]ýnýˆýý±ýÅýÍýÝýÕýëýÔýãýÏýÈýµý±ý¨ý·ý¹ýÄýÓýÙýèýíýãýèýØýÒýÓýºýÆý±ý¶ýªý§ý£ý¡ýŒý‰ýeýaý,ý%ýþüíüÝüÒüÞüÜüçüüüýýýý ýâüâüÆüÃü¸üºü¦ü¸ü©ü²ü¨ü°ü¡ü¢üü}üwüaüXüWüIüRüSüWüNü@ü0üüüàûâûÆûÀûÉûÈûëûóûü,üIü\ürüˆü¡ü¤üÌüÍüóüôüýýýùü¹ü­ümüNü"ü üáûÏûÑûüûüHüdü¡ü³üÜüçüßü¹ü±ü¸ü½üÅüÉüÜüÜüóüýýøüôüÜüÜü¤ü©ü‡ü†ü‰üŠü¥ü¨üºüÑüÕüÛüÚüÉü×ü­üÁü üžü”ü†ü„ünü\üDü üüãû¿û·û”û“û€û†û†ûûŽû²û°û¼ûÁûÈû¾û¹û—û™ûcû`û1û.ûþúöúèúìúíúîúûûúû û#ûû)û&û8ûFûLû`ûbû~ûzû‹ûxû|ûmûcû[û<ûûûïúñúåúÝúÐú¸úªú‹ú}úbúNú>ú$úúúúîùòùÝùãùèùÜùûùïùýùòù úýùúúAúCú`úeúwú„ú‹ú ú–ú›ú–ú©ú¢ú¹ú±ú¼úÅúÂúÜúØúáúóúòúÿúûûû,û@û/ûPûAûYûZû^ûnûlû}û~ûŒûŒû û¦û¸ûÈûÐûéûøûüü üü üüüü ü)üü9ü(üFüFüjünü…ü–üžü¨ü²ü¼üÍüéü ý4ýoý™ýÏýüýþ9þDþaþ^þ`þ`þYþWþdþlþpþþ—þºþÈþÈþÌþ­þ©þ‰þmþPþ0þ"þþþþ-þ1þdþgþxþvþuþ‡þoþ…þsþ„þ„þ¬þÀþãþûþ&ÿ;ÿlÿ|ÿ¢ÿ¥ÿ»ÿºÿÒÿØÿíÿýÿ  êÿÈÿªÿˆÿjÿ?ÿ!ÿÿëþÐþºþ£þ‹þuþYþJþ3þ(þ1þ*þ>þGþ\þƒþ—þºþÇþÞþÒþÙþÀþ¥þ™þþzþnþqþnþyþyþ…þzþyþxþnþ_þ[þBþ>þ þ*þþþþ#þ9þ5þTþVþhþhþrþjþsþ]þrþJþVþ8þFþ-þCþ<þRþbþŠþ­þÍþîþÿ0ÿPÿoÿ‡ÿÿÃÿÉÿýÿ ?W…Ž«¯±¦¡‹{dS1îÿîÿÕÿÄÿµÿƒÿ{ÿDÿ9ÿ ÿÿ,ÿ#ÿ;ÿ-ÿJÿ8ÿ[ÿDÿBÿ,ÿÿÿÿ ÿíþüþÕþ×þ©þ‹þZþ"þßýœý_ýýáü­ü€üküYühünüŠüŽüªü¡ü´üªü½üÁüØüðüý5ýdý“ýÃýéýþFþVþþ…þþ‘þœþ¡þþ©þ›þ¨þ™þŸþŠþ}þlþBþCþþ þþýýþ#þLþwþ“þÓþáþÿKÿ}ÿ»ÿéÿ+Z€Ä½öô ûõëÚ˾«yO/Øÿ»ÿ‰ÿpÿYÿ<ÿ'ÿÿðþÂþ¤þmþ>þþÆýšýSý/ýúüàüÅü±ü°ü§ü»üÃüØüÜüÜüÛüÇü¼üü}üNü*üüÝû®ûƒûNû'ûßú®úmú(úóù°ù‰ùZù?ù:ù!ù4ù.ùHùXù{ù‘ùµù·ùÅù­ùµù¬ùÅùÌùÀùÆù§ù“ùqùOù(ùôøÅø¨økøLø,øøþ÷è÷Þ÷Í÷°÷°÷÷ƒ÷c÷P÷N÷5÷7÷0÷5÷/÷6÷1÷2÷(÷2÷/÷4÷9÷J÷h÷s÷¬÷Á÷ì÷ø)øDøOø_øgø}ø‰ø¬øÂøÞøôøù ùùù.ùùAùCùnùwù¡ù¶ùÊùæùú%ú&úBú$ú/úúúúú1ú@úgú~ú¥úÈúöúûCûqû ûèûü`ü”üÓüý9ý^ýnýxýwýoýmýfý_ýmýkýwýý„ý†ýŽýý‹ýxý}ýwý‡ýý¦ýÕýñý$þEþoþoþþsþ`þ>þ þþÚýÄý²ýªý•ý—ývýnýXýAý=ýýýý ýýýý&ý8ýRýgý„ý”ý¼ýÓýîý&þJþ‹þ¶þùþÿSÿÿ¡ÿÅÿÕÿèÿÿÿ2Bfq­ÃÑÜïû &8FGWQ]ZUX?=,15@]}‘ÇÑïôíäÀ¥xPñ½—\8ÛÿÀÿ•ÿ€ÿNÿ?ÿ"ÿýþøþÉþ´þžþþmþQþ=þ,þþ þÞýÎý«ý‰ýýSýSý,ý)ýý ýýýýýýýýü÷üÒü²ü„üpüFü1üüüüôûüÚûóûÑûÝûÍûÓûÆûÕûÂûÌûÃûÍû¼ûÈûÎûÇûãûÔûüôû&ü9üEüaüüü¢ü›üü~übüGü üüêûÅû¦ûû}û`ûhûJûLû/û1ûû.û ûûûäú¹úúDúú¬ùjùùµø…ø:øøæ÷Ò÷Â÷Ï÷Ó÷å÷øø'ø<øIøAøYøYøløtø’ø›ø£ø«øªø‘øø{øcøVøJøJø7øKøKøaø^ørøtøoøgøOø/øøÙ÷»÷œ÷]÷f÷G÷W÷J÷€÷÷µ÷¹÷øÿ÷.øOøgøpø}ømøcø-øøè÷Ä÷›÷z÷[÷<÷÷÷ööîöáöÝöÉö¬ö¯ö–ö’öö²ö¶öÏöæö÷ ÷*÷)÷$÷÷ ÷ìöËö“ö€ö?öDööööÖõØõ¨õ˜õzõ{õ{õ{õ™õ©õÐõðõ7ögö§öìö-÷V÷~÷ ÷ ÷³÷•÷—÷f÷\÷%÷÷ßöºöžö‰ö‚öcöuöjöŠööÊöÒö÷(÷T÷v÷÷¼÷Ø÷ý÷,øTøˆøÈøù>ùùÃùúMú‘úÄúúúûCûcûpûû¥û¾ûáûæûüüCü^ü|üpü—üü‹üoülüPü:ü/üüüòûìûÛû×ûäûìûüü/ü<ü>üHüdücüsüdügüXüBüMü$ü=üü7ü)ü4üBüJü[üfüuüpüürüküTü=ü&üüüÿûõûü ü8ü?ü|ü†ü¿üÕüóüý<ýaýšýÇýþþYþfþþþ¢þªþ˜þþhþ[þPþAþNþ1þ:þþ)þþ0þ%þ"þþôýÞý¾ýºý°ý¢ý¨ý•ýŸý…ý’ýpýPý3ý!ýýðüÕüºü¬üƒüüpüoü`üUü3üü÷ûÕûÉûŽû}ûDû?ûû)ûùúôúÍú¬úƒúeú<úúöùßùÁù­ù›ù›ù‰ùŠùwùùfùùxù ù©ùÊùßùñùðù ú ú úúúìùñùÕùäù¿ùÊùÌùØùéù ú)ú7úXú_úwúrúŽú‰úŠúwúkúZúHú<ú(úúúú'ú*úBú9úUú9ú@ú5ú*úúúõùòùèùÚùæùæùùù úú8úKúaúuú|ú“ú›ú­ú¹úÉúÜúÓúéúæúãúëúÉú·úƒúXú:úðùÞù¡ù}ùRù1ùùùõø ù ù#ù-ùRù`ùƒùœùœù§ùŸù¢ù¡ùùù~ùrùfùeùdù[ùeùhùwù‚ù«ùÌùîù!úIúú¸úû)ûGû_ûcûbûRû0ûûÿúûúòúûûû*û4ûFûPû`ûXû_ûcû‚ûûÊûúû%üoü”üÕüéüüü ýçüßü£ü‘üFüüùûÖû²û«û‡û‰ûbûVû%ûûúÖúªú‡ú_ú5úúðùàù¯ù«ùoùoù>ù3ùùúøÏøÃø¦øžø›ø¥ø¼øÔø ù5ùnù›ùÚùýùDú`ú’ú¨úÓúÙúûû?û_û•ûÀû üEü™üãü5ýný¯ýÛýþ<þdþ‡þ³þÊþüþÿXÿ{ÿºÿÏÿ!DVgpq€rzsoo\dNOD;1, ôÿýÿáÿßÿ½ÿ£ÿ}ÿhÿDÿ=ÿÿ ÿãþÒþ§þ”þsþSþEþþÿýÌý¿ý’ý{ý[ýFý/ý-ýýýûüýõüöüøüþüý)ý6ýQý[ýeýhýjý`ý\ýKýZýUý|ý•ýÐýþDþyþ£þÖþéþÿýþìþÜþ±þ§þ{þtþPþSþDþ9þ%þþïýÌý¤ýyýYý+ý5ýýFý;ý€ýý®ý½ýºýÅý«ýªýŽýŒý|ýŠý„ý˜ý—ý§ý²ý¨ý²ýýyýLý(ý ýÛüÇü³ü™ü•ü…üyü`üPü0ü üúûðûÝûçûîûü/üPüƒü˜üÉüàü ýýEý[ý‹ý´ýäýþþ1þ@þ\þ\þnþqþxþyþþœþ«þÐþîþÿÿ#ÿ"ÿÿëþäþ­þ¡þ€þmþVþFþ#þþØý¹ýrýDýñü©ülüü üÕûàû¹ûÁû¯û¯û˜û—û}ûnû^ûNûDû<û1û5û4û3û0û(ûûèú½úú9úöùºù‚ùBùùãø°øøUø1øù÷Å÷£÷i÷R÷#÷÷þöýöûöûö ÷÷÷$÷*÷2÷:÷A÷J÷V÷g÷q÷Œ÷—÷–÷±÷¯÷¾÷Í÷Ð÷î÷ø.øsø¢øáøù?ù\ùnùzùùlùiùHù0ùùòøùøËøÀø¿ø¶ø¼øÆøÙøìø$ùCùùºùúHú„úÎúúú)û?ûUûeûmûxûŽû¬ûÉûùû,ü]üŽüºüÎüèüÒüÙü¥ü’ü]ü>ü!üìûãû³û²û¡û¦û£û±û­û¼û±û¯û¬ûšû©û—ûûû‹ûuûjûGû!ûôúÑú©úŠú|úbú`únú‚úú»úÐúúúû9û3û_ûaû~û­ûÂû ü:ü„üÆü ýný°ýöýþDþ]þjþ€þvþxþlþhþQþIþ0þþþìýîýâýëýèýþþ,þ9þTþtþŽþ«þÆþÔþîþÿÿ)ÿGÿ\ÿzÿ~ÿÿƒÿwÿZÿ1ÿ÷þÄþ‚þRþþþÞýàýÐýÐýËýÅýÅý¯ýºý˜ý›ýxýyýcý^ý[ý[ýlýpýŒý¤ý¿ýÝýêý þþ+þ<þFþZþ[þrþ‰þ‘þºþ³þØþÞþÿÿ:ÿ;ÿaÿaÿ†ÿ‹ÿ¥ÿ±ÿÐÿÙÿôÿ%+6-5óÿäÿÌÿªÿŸÿzÿlÿJÿ;ÿÿÿèþÞþµþþ‚þTþ=þþùýìýÏýÎý¸ý³ý³ýýµý£ýµý·ý¶ýÃý±ý¹ý¬ýœý“ýƒýyýývý‹ýŽý£ý¯ýËý×ýóýõýþþþ þþþþþ#þþþøýñý×ý¼ý“ý]ý#ýïü¬ü‘üfüSüKüLüLügüaü‚üwüüŠüŠüžü•ü®üÃüÙüýýUýwý¥ýÀýÞýâýúýêýøýïýÜýâýéýñýþ/þ9þ^þcþþ{þœþœþÀþÌþÚþéþÿÿ ÿ-ÿ%ÿCÿ1ÿ?ÿ6ÿ0ÿ7ÿ1ÿ@ÿ8ÿGÿKÿVÿ[ÿkÿuÿÿÿ™ÿ£ÿ²ÿ»ÿÑÿíÿ$NmŽ²Êæ  9KTX[H8ù潺”˜€usY[K>?#-&.CSapq„y…~Ž’±Àì0Qd~…‘ƒud`ckpywwu`H* ìÕ±´¯Âåü*B^ntrpjZI:"ÿôõìÙÒ´£Šy^^CR>IIBJ62 ùÿÝÿâÿÅÿÎÿ³ÿ±ÿ”ÿŠÿyÿwÿjÿnÿbÿsÿoÿÿÿ»ÿÊÿóÿ!:/0ýÿìÿÑÿÎÿËÿÑÿæÿñÿ%4CG79íÿÙÿ¼ÿ¬ÿ”ÿŠÿ‘ÿÿoÿdÿOÿRÿDÿJÿ>ÿIÿWÿpÿªÿÁÿ -j–²ÙÞõý( ùêÚ±®ƒ{gwuy}tsaR(êÿñÿÕÿêÿÛÿêÿùÿüÿçÿñÿ¾ÿÀÿ—ÿ“ÿÿÿÿ‹ÿžÿ—ÿ¥ÿ¨ÿ­ÿ¸ÿÄÿÒÿèÿøÿ4Ps”¥ÂÄÏ×Çͳ»£°¢¡ ª«´³°±œ‡zxnqt{‚”˜“—”‘‹~pmqcwi}x‚~yl`IPO^xŽÇï8v¹÷;~¹û#Yw¡¹ÑâîðñäÔÀ·‘ƒb`NLB:6!,ôãÖ¿´¥‚d; Üœp4úÆ‚e;A5KNq†µÑýMn©¾ñ#""$,Zm£½÷;eu ªÐÛ&Qy³É6%>% ñÒ´‰l+ؾ}e-ëÚ»ªŸ”Žd^0úÙ¶¤›”›«³ÃÕÙàÝæÖáÑÙÍȼ»•‰[8ç̲{yoy—±ÆÖØÎÀ”uY2 òÿÙÿÒÿÌÿËÿÑÿÖÿñÿ/+AB][^ockgbjWfU\Qcn ¼â9p‹Çå VŒÐð0R{¯ÃPw£½Ø_{¸¹ßãûÜþïø %-@HPb`vm^UH)îËŽz_M:*-" ;JNhtŒ˜²¼»ÊÌÚߨ×˳ˆfVH;2#"+7FrÄå +5Zu~„|dL.ÝУ—†tqnfjla_\ckn}s|rvac1ãºS ß¡†_N--ü×á½Æ¸ÒØì+@WksWMùÝÀ¬Žo<;+(縛P8ýßõÍîÒ૱—cFïÿÔÿ¶ÿÁÿ¤ÿ»ÿºÿ¸ÿ¼ÿ°ÿ³ÿ¯ÿ§ÿ¦ÿ¢ÿzÿƒÿtÿpÿrÿ}ÿ{ÿÿ‹ÿpÿ“ÿÿ¸ÿÆÿìÿ2ex¯ÁðLf‘ ¿¿Ì¶©“{r[LHBUg‚“¬ÊÙý ,E]ŽžÓÙü&þñØËÃÄÖÙÿÿ ú öÑáÝóúüØ´žuC+öɪuJßÁ­˜‰ˆ”—à6Xn™œÄ¹ÇÁ²š†xGG3D:Waƒ’ÁÛú :Siš¸Òòöúððá̽ ’€qZL/ ÝÁtC÷¾W5.$4>Zmu‚pplldzx„™Ž¢°³¯®Ž~fC2-$øÿìÿìÿßÿëÿÑÿËÿ›ÿ¥ÿžÿ³ÿ¾ÿÐÿÍÿÓÿÍÿËÿ¶ÿ²ÿ¡ÿ~ÿjÿTÿ.ÿÿÿöþúþ×þÒþ´þþþTþSþ$þ(þþ þÿý"þHþaþ”þ¨þÏþßþÿ!ÿ.ÿ9ÿBÿOÿWÿtÿƒÿ¤ÿ™ÿ¸ÿÔÿòÿ/?BaQMVttynM6÷ÿÊÿ¸ÿ^ÿDÿ ÿßþÏþÈþ»þ•þsþQþ#þ1þ(þ6þ:þ:þ@þ8þTþVþiþƒþ™þ˜þ¨þ™þŠþ©þšþ©þ¼þ¾þÛþíþÿ*ÿ@ÿnÿÿ±ÿ°ÿÞÿöÿ=y…¦»¥ÐÍáíâðçúýèäàÎÞÒÝâì$7Rn•«ÃØÓÝÅ´£ye:ܤK ¦ÿxÿ0ÿòþÈþŒþ‡þeþhþfþmþtþ|þþ¬þ¯þ»þÓþÉþéþúþÿÿ$ÿ4ÿCÿLÿUÿZÿvÿZÿwÿ^ÿ†ÿ¦ÿÒÿC„µë :b€’«»ÅÚÃÏÐËż¡†vU[PMV†¤Îý.2T:M)- ëå¾­¤ „‘lutu„zkVH- ÷Ùº•f?JTk|‚—“𤥣š{€ON/ øÿÕÿ³ÿÿpÿTÿBÿBÿ0ÿAÿ;ÿ%ÿÿ!ÿÿ%ÿÿÿÿÿîþýþìþÿ3ÿzÿ¡ÿÜÿ>tœÏþ?Sd„šªÃÉÍÍÉ¿ÓÃßÏêÅãßúõ 'öÝÚÀªŽnR1í⿵œ†ype_cFYN[cr‘®¸Âìž–zpGÒÿ¹ÿ’ÿvÿ^ÿ/ÿÿÓþ¬þnþNþ+þþ þþþþþþ4þ9þ8þ/þ)þþþùýýýáýäýáýØýÛýÐýØýÌýäýÚýåýîýßýêýõýþ,þPþdþ}þ‡þ¢þ•þ¾þ¤þµþ¯þ£þ¬þ¨þ¯þÇþ½þ×þÙþÜþ÷þûþÿÿ%ÿ-ÿDÿZÿ_ÿŽÿ§ÿÞÿB‚©÷ Lr¦Ó8`‹²ÕïðüýóíÅ¥vV*æÝ‘cO#êË´³¸¯ÎÑé÷! ÷Ûßç–{bQH5D/L=J?6- ôÿéÿõÿîÿúÿ!87MB]_q—Øë@`½à*K}ª©·©­ž©£±²¸ÀÉÎÐÎÍÀĹÎÐ÷Jaœ»ÝõìÝѽ·³ž›”ŒˆzkVD$щkS7,õíÜÐͦŸsTB  CK[muy…ˆ‹‹Ž‰‘˜†‹nhD:õæäèú/Vq­½ãÚüü !.AHZ_pr‚Œ™´ÃàõAYƒ–Ÿ²Â¿äØõ÷!)ATUT<è°€U9ÿîêÞêÜäû‘mR#ßôÏäÙñéïòÕЪ™|lUR5>òëÁ¼ƒ…UL%öÿøÿåÿçÿÎÿÏÿ³ÿ¥ÿ•ÿ‰ÿÿ‹ÿ©ÿ»ÿØÿþÿPm‹š¦ª¯²¨›`R+)ùÿôÿéÿøÿúÿ ûÿÿÿ+Kw¦Ñ >vžØã+Pw•¾Ôþ5Ok}·Ïô!?f’®ãöúúïà´’cuwy•™£¢¿¶¼±¸ÁÚø$#@Y\‡…«°Íáãó#E>='åÁžsW7)  þû ".?^f…¦Ï SWжà ,.)+÷Ô¸“xL,Ù°[1ݪˆbCÿäÖȵ³¢Ž•z|lUN#!îéÀ´™”¡©¼ÏÛóú(,@SN_??î°|/ø™gщX8þÿ ôÿ÷ÿ'0EXbx“ª¯³¸¤¢‚yXE&ûÿäÿËÿ¬ÿ¦ÿˆÿÿ]ÿSÿ/ÿ#ÿöþýþÒþÏþÀþÇþÃþÙþæþàþòþêþíþôþñþøþ ÿ ÿ.ÿ2ÿcÿqÿ«ÿÐÿóÿ5MJcMYSX_]eopz€q•ˆ›žˆž•ž›£•¦“­”¬“¡—†ˆmpLX5;")$.<>NWZhbntˆ†ž¦ÂÍëíõøúïñß×ÜÎÚÐÔâàøú$$(',26JNglŠ˜¯Æí >^™¶ì6\¥ÊÒæÚæÆ¹ŽoBß«uBß¾‡i:òåÀ¥‰bW;7')+1=;C?KK[QeAS+) îÿÂÿ¹ÿyÿhÿ#ÿÿÄþ—þvþ4þþëý»ý®ýný|ý=ý?ýýýýýêüûü×üèüÉüÎü¿üÉüËüÛüæüýý7ýMý~ý’ýÉýúý!þPþhþ¡þ¨þÞþßþôþóþíþêþéþèþþþÿÿÿ!ÿ*ÿ7ÿAÿPÿUÿOÿGÿ;ÿÿÿÿ.ÿAÿZÿsÿ|ÿÿŸÿµÿ¦ÿŸÿ–ÿuÿpÿUÿQÿUÿaÿnÿŠÿÿ«ÿ´ÿªÿ¯ÿ‘ÿ{ÿAÿ ÿòþÁþ¤þ‰þuþ`þhþWþaþQþLþ>þ#þ þþþþþþþ7þJþNþqþ}þ¤þ±þÈþÕþ÷þÿ"ÿMÿeÿ’ÿ¨ÿÁÿ½ÿ»ÿ¢ÿ†ÿfÿ1ÿÿÞþÁþšþ‚þpþ[þPþFþþþáýÊý ý‹ý`ýRý4ý)ý ýýýýý'ýýýýýíüÞüÓüÒüÎüßüÝüüüýüý%ý5ýLýLýcýiý_ý~ý\ýý]ýdýRýGýEý4ý9ý2ý2ý@ý-ý:ýý%ýýýûüéüÖü¿ü¸ü¢ü¤üŸüµü¼üÚüêüýý#ýDýEýcýeývýtýzýsýzý]ýgý:ý/ý ýòüßü¼üªü—üƒü|ü`üJü,üüïûÍû¸û‹ûû\ûRûCûLûLûyûxû®û­ûÙûÙûïûàûïûìûüü;ü_üü­üñüýYý™ýËýþ2þtþ‘þ×þòþ@ÿRÿÿ¸ÿòÿ5CUIT7B,+ûÿîÿÙÿâÿÍÿÒÿÉÿÉÿÇÿÉÿ×ÿÒÿèÿêÿïÿ úÿ1ER_krtugaRA8)ñÿ éÿõÿÜÿÁÿŸÿfÿCÿ ÿãþ©þŠþdþHþ;þþ þóýêýØýÂý¤ý‹ý^ýHý ý ýúüùüûüýýBý=ýQýDý3ýýýÏü½üüüsüdü^üXüRüQüHü=üüüØû«ûwû:ûûâúÁú±úúƒúqúqú†ú‹ú©ú®úÔúÝúûû@ûYû”û¨ûÛûûûüLüXü‰ü–üºüÉüÈüÜüÃüÊüÈü¶ü¿üü¢üü|üuü_üUüVüVü[ütüqü•ü¤üÍüÕüýý%ýý0ý#ýýýîüàüµü³ü™üüzüiüGü3ü üüûÛûÍûÆûËûËûïûýû.üCücümüyüsünü`ü@ü,üüùûèûéûÕûçûÝûõûùûü2üWüuü¦üÑüýüFýuýÇýúý7þkþþÀþáþ ÿ"ÿFÿoÿÿËÿðÿ!).B'4 òÿðÿàÿÓÿ¸ÿ²ÿÿ“ÿnÿ[ÿ9ÿÿÿùþêþçþðþÿÿ"ÿ5ÿ;ÿGÿRÿQÿ[ÿZÿTÿUÿSÿEÿKÿ(ÿÿëþ»þ…þUþþÞý¡ýsýSý#ýýïüôüÞüÙüÔüËüµüÄü¨üºü¹üÏüîüýHývý¡ýÍýîý þþ+þ$þ<þ.þDþPþkþ†þ°þÜþÿþ9ÿjÿˆÿ¼ÿÌÿæÿ÷ÿ #1Ngƒ¨¶æê ýßÙ¨£j\&ûÿëÿáÿÓÿÌÿÆÿÅÿÅÿÐÿÔÿíÿäÿýÿûÿ ÿÿ îÿíÿÛÿÆÿ«ÿ†ÿUÿ6ÿþþØþ¦þwþSþ2þ$þþ þþþýýÿýøýþþ þþþ/þ.þJþ_þhþ–þ˜þ¶þ¹þÈþÄþÈþ·þ¬þ™þ‡þ}þƒþmþ„þfþtþXþ[þAþ,þ+þ þþùý þþþ*þQþrþ£þ¾þãþíþ ÿüþÿôþôþÕþÆþ¤þ•þoþiþ>þHþ-þ%þþþòýâýÓýÛýÂýÚýÑýáýáýìýðý þ þ-þ8þ>þCþLþ;þWþYþþ‘þ²þÂþâþßþÿÿÿÿÿ ÿöþ÷þòþåþÿþóþÿ ÿ)ÿ*ÿ6ÿ=ÿ6ÿ:ÿ.ÿ'ÿ"ÿÿÿÿÿÿÿÿ ÿñþñþÓþÑþ¦þ¥þƒþvþjþ_þXþRþQþKþPþFþEþ5þ"þþþëýÜýÅý½ý¯ýœý›ýƒýkýSý8ýýüüåüÏüºü«ü±ü–ü­üŸüºü¹üÏüÑüèüëüýýýý/ý#ý-ý*ýýýóüïüÀü³ü…ü|üQüFü-ü"üüüüü-ü0üKüZüpü†üžü³ü¿üÉüÀü¾ü ü•üqüQü@ü#üüðûÖûÈû¸û£û”ûqûCûûæú³úú[úAúúú úúúúú!úú%ú*ú$ú2ú)ú,ú%úú úðùäù¸ù•ùmù?ùùïø½ø¢ø„ømøbøLø<ø!ø øøå÷å÷Ó÷Í÷Ñ÷Ò÷î÷þ÷ øCøYø}øø¼øÛøù6ùŠù¯ùúDúzúÍúïú:û\û”û«û×ûãûü üüü1ü(ü1ü üüÿûäûÖû³û¨ûûû’û¦ûºûÊû÷ûü1ü=ü^ümütüƒü‰üŠüü•üü–üªü©ü¾üÔüÛüýýýIý\ý‚ý¤ýÂýäýüýþ>þWþlþuþˆþqþ•þ„þ„þŠþþ†þ†þþŽþwþ€þyþþmþzþ]þeþMþ7þQþ9þYþsþ—þ´þÐþóþÿÿ$ÿ6ÿ#ÿ(ÿùþòþ¿þ²þ’þoþSþ8þþõýÏý§ýˆýWýGýýýìüøüóüûüý$ý:ýCýeýdýký{ý|ýzýýýmýaý.ýýãü«ü€üQüüóûÜû»ûµû¥û¾ûÁûßûøûüüü#üüüõûïûÑû³û¥û|ûWû?ûûîúÁúŸú‚úxúiú‚úxúŠú‹ú©úžú”ú–ú„ú{úvúˆú}ú‹ú ú¸úÖúûHû‰ûÁûñû2üGüxü˜üºüÛüÿü&ýNý€ý½ýàýþ.þgþuþþ­þ»þ»þÅþÛþæþûþÿ ÿ$ÿ/ÿWÿfÿÿ¥ÿÒÿc¼å3`]–}§œ¹ÉÖô)Bcfpvswqvm{w†|˜‘š˜˜“™™¡«ºÕë'#ýâ·”rK#ïÌÇ \Sø¿’[5 èÿÑÿ³ÿ˜ÿ|ÿSÿ,ÿÿÊþžþ^þ=þþòýßýâýÑýáýæýÜýÎý¿ý˜ýrýJýýíü´ü‹üaü%üüÌû«û–û^ûCû ûñú½úªúrúiúEú4úúúßù¼ùù€ùDùFù;ùHùbùˆù³ùÙù ú>újúœúÈúéúû2û\û†û¶ûÕûüü-ü/ü.üüüûãûÄû—û{ûIû5û+û%û6û)û?û3û8û1û-û$û0û$û2û>ûIûbûnûû}û•û…ûˆû{ûpûqûQûdûTûhûtûšû¿ûèûüDütüŸü×üý&ýdýmý®ý§ýÊýËýÔýÊýÃý«ý‘ýsýWý8ý ýîüÆü–üjü.üçû¬û~ûSûAû3û<ûAû\ûpû§û»ûüûüKü^üsü‡ütüüƒü’ü±üªüÑüÍüãüøü ýý ýòüïüÔüÙüÃü¯ü—üjülü;ü/üüíû×û©û‡û^û5û ûõúéúÓúÑú¸ú£úºúªúÉúÀúÑúÁúÃúÑúÖúêúìúûû)ûJûUû]ûfûaûiûhûdû\ûYûMû2ûAûCûMûbûbûû…û—û°ûû¶û’ûœû‰û|ûrûeûdûgûrû€ûŠû›û»ûÃûåûöûùû üúûüéûýûéûþûôûüü)ü>üRüjü…ü¬ü¼üãüèüý ý ý!ýýýý ý-ý*ýHýIýqýwýšý”ý¸ý§ýÁýªýªýŠýqýHý&ýýÛüÕü±ü¾ü°üÁüÍüÓüÜüåüçüõüóüýýý(ý+ýCý/ý<ýJýJýPýNýRýEýYýQýYýLý_ýtý“ý£ý¼ýÀýÎýÍýÛýÚýáýéýùý þ4þOþ†þªþÝþÿ:ÿÿ§ÿèÿIl”¦¨§ ¢t?äÿ¿ÿ“ÿtÿVÿ5ÿ!ÿÿëþáþ½þ»þ¤þ•þ‘þƒþ…þ}þ…þþþ|þqþfþ[þGþ;þ,þþþþþ þøýõýÒýÊý®ýˆýlý<ýýñü¿ü¬ü€ü}ü`üdüaübühüqüiü~ü{üžü©üÂüÙüàüÿüúüýýýýýý#ý ý%ýý-ý*ý;ý4ýMýIýNýOý@ý=ý2ý&ýý ýýüýõüúüýûüýý"ýýýýý ý ýÿüÿüýýý*ýJýrý ýØýþ=þfþ•þÇþæþÿBÿfÿ›ÿ¯ÿáÿêÿúÿõÿæÿéÿÇÿ°ÿ„ÿgÿJÿ)ÿ ÿÿáþÝþÅþÅþ¬þ£þ–þþxþbþ\þ\þHþKþ9þ.þ þÿýÆý¢ýaý@ýúüÍü™üsüGü*üüûûìûæûÙûÛûÓûÙûÒûÙûäûíûüü;üSüpü‡üŸü«ü¼ü¹üÁü½üÀüÇüÇüÕüØüöüçüøüòüùüýüýýýý+ýDýGýkýoý–ý­ý½ýÕýÝýÓýÓýÈýšýˆý^ýCýýýëüØüÂü«üüzüoüNü3üüöûàûÆû¯û¦û¡ûû‘û™ûxûûkûdûOû7ûûîúÐú¶ú—ú|úZúBú úñù³ù†ùPùùéø§øxøTøøøÑ÷È÷¬÷¥÷÷¡÷®÷Â÷Ü÷ø!øJøjø–ø´øÍøíøêøù ùù$ù,ùJùgù•ù´ùÙùéùýùüùúúðùýùÐùãù»ùÄù±ù²ù¢ùšùˆùwù_ù9ù&ù÷øåøÄø¸øøžø˜ø©ø¦øµø·ø¨ø©ø‘ø€øpø`øZøYø^øpø‹ø™ø¶øÌøÆøßøÒøÒøÍøÂøËøÏøãøîøùù(ùdùfù†ùyù‡ùkùlùSùZùPùjù†ù¶ùãù úHú`ú˜úªúêúæúûû#û@ûTû~û˜û¤ûÏûëûü*ü\ü_üyü‘ü™ü®ü²üÒüæüýý>ýJý_ýjý_ýlý\ýYýYýDýOýEýJýNýNýSýJýTýLýBý;ý5ý+ýýýõüÌü¼üüzüFü.üüïûçûÎûÝûÐûæûëûûûü üü üôûùûïûôû üüEü]üü²üÎüäüôüôüæüÐü°ü„üXü/üüÍû­û•û‡ûzûmûbûTûQûUûZûWû\ûfû^ûmûgûuûaûoû^û_ûUûNûOûKûYû]ûvû}ûœû˜û¹û½ûÔûñûøû ü3üOüiüü¢ü·üÍüðüôüýý ýýýþüÿüýý*ý(ýIýBýaý_ýeýtýsýzý‰ýˆýšýžýºýÃýÑýÚýêýèýåýåýÊý¹ý’ýyýDý(ý ýïüÞüÛüÑüÖüØüÚüáü×üåüÕüÛüºü½üœü¬üŽü›üüü™ü¦ü¸üÍüÚüèüìüúüòüúüöüý ýý4ýAýmý†ý ý¹ýÂýÑýÈý¹ý£ý}ý\ý/ý ýäüÏü¸ü¯ü®üªüªüŸüƒülü>üüÿûÍûÆû¢û˜û…û{ûvûdû`û\û7û-ûøúÌú±úƒúsúRúEú;úRúSúsúyú•ú¡úÀúÕúëúû ûGûeû‰û­ûÊûçûöûüüü(ü,ü7üLüQülüuü}ü†üü‘üü—ü¦ü¤ü²ü·üÎüÝü÷üý*ýIýsý›ýÍýöýþAþtþŸþÅþïþÿþ#ÿÿ8ÿÿÿðþéþÖþÃþÃþªþ¯þšþþþ\þEþþóýÐýœýyýRý7ýý ýý'ýFý8ýkýYý€ýuýýuýrýlýhýjý[ý^ýJýAý7ýýýôüðüÐüÜüÅüÙüÌüåüÙüåüçüíüîüèüçüÔüÏü°ü ü}üeüVü6ü-üü÷ûäûÎûÌû¶û¿û®û±ûªû¢û–û’ûyû~ûSûVû;ûCû?ûMûUû_ûqûrû„ûtû{ûGû1ûíúÁú‚úQúú÷ù½ùÂù·ùÊùòù ú<úYúƒú˜ú¿úÃúãúÜúïúâúþúòúûüúôúòúíúüúöúúú÷úùúòúûûûû)û:ûNûdûû¤ûÐûàûü üWüiü”ü ü¾üÍüèüýý.ýOýuý®ýâýþBþmþ—þºþÞþúþÿ.ÿQÿcÿ}ÿ—ÿ®ÿºÿàÿÚÿ!/?Sfl~y‘—°¯´Æ¾ÓÐÝøú A8LSJdd}’¦Öæ "(GLZVB.&øÝ͸”…X7ã°}U-# ãÿôÿÑÿ÷ÿÑÿÿÿÚÿìÿ ùÿáÿÀÿ¢ÿzÿKÿ1ÿõþÔþ þ…þ_þGþþýýÏý£ýpý:ýý¼üšüPü4üüçûÆûªûœûmûuû\ûRûHû?û%û)ûûûûûû,û9ûSûnû~û¥û»ûÛûõû üü(ü ü+üüüîûÍû¼û£û™ûoû[ûTûTûfûqûtûeûAûiûlûœûšû¹ûµû¿ûÒûÝûóûîûüûùûüûüüüüüü"üüüüûûçûÓû»û”ûvû>û0ûûûôúîúãúÜú´ú¬ú“úŒú—úšú«ú´úÆúåúüúû2ûKûQû\û\ûcûdû^ûuûfûûxûžû’û§û¨û§û©û«ûªû­ûºû½ûãûíûü=üJüvüü‡ü›ü’ü©ü©ü¤ü¸ü°ü½ü´ü½ü¬ü¶ü­üÁü»üÕüÛüöüÿüý*ýMýKýhýXý\ýCý9ýýýÛü½ü©ü†üpüeü3ü6üûûöû¾ûºûŸû’û…ûˆûŠû¢û¹ûÙûêûðûõûçûÍû²û…û_û,ûûÏú°ú‡úšúúžú¦ú·ú¹úÒúÕúüúûú%û'ûPûYûvûŒûšû®û²ûµû³û²û©û§û¥û¦û­ûµûÁûÑûÚûäûæûÛûÑûÁû¡û˜û^û7û ûåúÛúÏúÓúØúÎú×úÄú´ú£úútú=ú&úÞùÂùxù_ù(ùùÿøîøëøÜøÙøâøÞøîøíøüøùù/ù:ùgùuù¤ù¶ùÖù×ùðùú%úHúgúƒú³úÐú û?ûiû¿ûãû=ülüµüëüýQý_ý†ý…ý’ý“ýŒý}ýoýWý<ý0ý ýýñüêüñüñü ýý1ýOý_ýtý}ý†ýˆýŒý…ý‡ý|ýqýfýPýOýIý7ý@ý%ý%ýýýêüÜüÈüºü³üŸüœüƒüƒüjü_ü@ü/ü üúûÐûÅû™û“ûjûwûOû_ûKûTûBûIûBû<û5û/û ûû ûû ûûûûû#û&û<û-ûAû8ûNûUûmûˆû›û½ûÌûöûü>ü`ü‹ü§üÓüéüýý#ý3ýAýZý]ý}ý{ýý¨ý¸ýÍýØýñýþýþþþþÿý þöýþþúý þíýõýÝýÁý¤ýiý7ýôü¼ühü5üïûÂûžûŒûfûcûeûUûjûtû‚û¦û¶ûÝûþûü@ücü~ü£ü¶üÅüØüÅüÅü±üžü›ü”ü–ü“üžü°ü¼üÜüåüýý<ý]ýlýŽý”ý¬ý¯ý¿ý¢ý¸ý‘ýýkýSý2ýýöüÝüÁü¬üü–ü‹üŠütüqüWüEü<üüüèûäû¿û¨û•ûeûCûüúÔúú[úúÆùnùùµø`øë÷”÷4÷îö¨ömöKööö$ö(ö@öDöPömöröŒö—ö™ö¨öžö±ö¯öÂöÓöâöùö ÷÷%÷'÷*÷/÷9÷F÷S÷^÷_÷a÷W÷9÷8÷úöñö¤ö”öXö4ö/öö*ö'öFöbö‰ö¶öêö÷<÷b÷Œ÷·÷Ñ÷ø$øbø}ø¼øïøùLùqù‚ù‹ù—ù¥ù¬ù¾ùÂùäùðùú)úTúrúú¾úÔú û(ûXûû­ûÜûü@ühüü·üÒüáüýüöüýüüýý8ý;ý[ýyýŽý¹ý¿ý×ýáýåýóýôý÷ýïýýýçýþ÷ýþ þøýýýäýÚý»ý¡ýwýXý-ýýÿüæüÝüàüÑüìüÚüïüßüñüýüý$ý(ýRýZý‡ý‘ý±ý¹ýÌýØý×ýÕýØýÉýØýÊýÜýÚýíýþþ%þþþþôýßýÏýÀýÁýÀýÇý×ýÛýïýßýâý·ý¨ýzýNý&ýðüÔü¯ü üŽü‡üütüfüNü4ü üìû®û‡û;ûûíúÖú¼ú©úˆúnúBú&úØù¾ùuù`ù/ùùùùù$ù4ùLù\ùù¦ùÒùôùú-ú>ú_ú{úˆú‰újúXúúüù»ù—ùAùùÖø¬øørø‡ømø~øtøwøiøYøKø2øø øå÷â÷¿÷¸÷¥÷÷–÷}÷Ž÷ƒ÷Ž÷‹÷—÷¡÷µ÷½÷Ü÷ì÷'øJø—øÊø ùJù„ùÍùþùKúnúžúºúÐúÛúáúãúÍú¼úœúúfúMú4úú÷ùÖù½ù¡ùŠù}ùzùpùùšùºùÎùùùú-úPúoú¢úÀúèúûBûtû¢ûÕûýû/ü_üŠü üÔüØüóüùüýýýýý"ý#ý3ý5ýBýWýSýjýý‡ý¾ýÁýèýþþ0þYþxþ‘þ­þ¼þÇþÌþÑþÓþ×þÓþáþóþõþÿÿ;ÿNÿkÿwÿˆÿÿ—ÿ—ÿžÿ’ÿªÿ’ÿ¡ÿÿ ÿ¥ÿ¶ÿÄÿÑÿÙÿïÿ/IXЦØþQb‘¤ÂÈêä ú ìä»·‰|JBîçÌÚÄËÁËÕÎßÑåÞùøþë¾™n6üÿÁÿ’ÿDÿÿäþ¸þ‰þpþWþ;þ/þ&þþ&þ"þ4þ7þYþqþžþºþØþøþÿÿ8ÿ;ÿIÿTÿ\ÿhÿvÿwÿšÿ‘ÿ±ÿ£ÿ½ÿ¡ÿ±ÿÿƒÿ`ÿDÿ6ÿÿ ÿíþìþ×þÜþÊþÕþËþÅþÑþ¿þÔþåþ ÿ#ÿTÿ~ÿ­ÿÞÿ /6VP\TKF:<665-8,3 óÿ ûÿ8HnrŽœŸœ©™šŠ‡wlXL<)ÿÿÖÿìÿ¼ÿËÿšÿŸÿ‚ÿzÿnÿcÿMÿ@ÿ1ÿÿ ÿóþâþÇþªþ•þ^þ8þýý¿ýxý;ýòüßü ü•ühüQü.ü(üüüþûäûæûÈûÈû±û­ûŽû£ûû£ûžûŒûwû}û\ûlûhû`ûbûNû^û\ûlûxû†û˜ûŽû¬û™û°ûœû°û½û½ûâûïûü'üVüoüü­üÔüáüÏüáüÑüÜüÇüÂü¤ü—üzüjüNü@üüüûÀû‰ûaû/ûûõúáúÈú¯ú–ú”ú†úzú}úfú`úVúSúSú]újú‡ú›úÂúëúû2ûGûfûyû’ûû¹û¹ûßûûûü>üSüzüŽüªüÏüÖüóüýý;ýIýxý‰ý«ý×ýçýþ)þ9þVþGþ\þKþIþ<þþþéýÔý¶ý™ýsý`ý>ý4ýýýýý!ý%ý-ý'ý-ýýýôüÕü¨ü‚üDüüÈûŽûBûû¬úcú)úäù¥ù~ùEù(ù ùù÷øîø÷øþøÿøùù&ù)ù6ù0ù(ù2ù#ù,ù'ùùùù ùù ùùù'ù,ù(ùBù8ùRù^ùù—ùºù×ùú!úNúuú¥úÎúòúû8ûZûuû“û®ûËûîûü0üLüuüüªü«üÏüÍüåüñüýýýý.ý9ýEýFýPýJý[ýCýXýIýaý^ýký|ývýŽýˆýŽý‹ý„ý€ý€ýmýsýaý\ýZý[ý[ýZý_ýXýUýDý8ýý ýýýýý;ýOýoý‹ýÄýßý þ"þ-þAþ2þEþ-þ&þþþ÷ýÛýÕý¼ýªý—ý€ýaýIý-ýýýíüðüÞüßüãüßüØüåüÑüßüÆüÍü¶ü¿ü¨ü¯ü£ü’ü ü“üžüüŸü©ü¤ü¯üÅüÁüåüóüý0ýJýyýŒýªýµýÅýÉýáýåýþ þ2þLþcþŽþþ¹þ³þÁþ­þ“þsþLþ4þþþþþ;þ[þ‘þÆþîþÿ=ÿTÿ{ÿÿ­ÿ¿ÿùÿ,yÈ)wÅ Gr©°·¸¿ÈÌðú(÷çŰÅÄãù-=U_gp`aZRQKH@8- ýÕΚ”_D߸ŒZ*í³~R-ñÿâÿËÿ¾ÿ–ÿuÿNÿÿýþÅþ¼þ˜þþŽþƒþˆþþŸþ¬þÇþÏþèþèþÿýþÿÿ-ÿ>ÿ=ÿEÿFÿ6ÿ'ÿÿìþ¸þŸþrþ\þ3þ þþñýÚýÅý©ý˜ý~ýzýZýWý?ý7ý+ý#ýý ýý ýý(ý(ýEýOý[ývý}ý”ýŒý¬ýýµý¯ýÆý³ýÆýµý¯ý§ý‘ýŽýlý]ýDý$ýýãüÊü¼üü–ü†üiü[ü6ü/üüüèûÔûÊûÄûÚûâûùûüü8üLü[üeüdü^ü^üVüYüjüeü†üšüÆüÜüý&ýKýgý|ý™ýšý¶ýÈýçýõýþþþ2þ,þ@þ%þ4þ+þ)þ5þ9þ=þGþIþTþbþcþiþ~þvþ‰þþ—þ™þ®þÀþçþáþÿÿÿÿ(ÿÿÅþˆþfþ;þ.þúýÔý˜ý[ý.ýûüÌü•ümüFüüëûÆû¹û¨ûÂû¯ûÐûÂûÉû®û®ûŒûzûfûMûûýúíúÌúÓúÔúÕúßúÑúìúºúÙú¡úÍúÍúòú ûDû`û¢û¹ûôûýûüúû×û¦ûxûFûúúÙú¢ú€ú}úkúwúúuútú^úJú4úú÷ùäùÌùµù³ù–ù¡ù†ù‡ùgù`ù;ùùýøÏøŸø…øTøAøø øæ÷Ï÷Ç÷±÷›÷¥÷“÷œ÷¦÷°÷Ð÷ì÷ø1ø6ø]øUøkø_øaøeølømøƒø™ø§ø¼øÏøÏø×øÐøãøÙøðøþø)ùNù•ùÜù+ú†úàúDûŒûÚûü>ühüuü–üªü½üçü ý'ýUýký‡ý€ý‡ýmýcýJý5ý,ýýýýýýýý!ý"ýýýÿüöüíüØüÏüÁüºü®ü¥ü£ü’üwühüDü"üüöûÐûÁû¶û—û¢û}ûûVû>ûûóúÐú¬úšú~ú~úmúlúlúbúfúnúTú=úúêùÍù°ù‘ù‰ùwù~ù~ùˆùùù~ù|ù>ù%ùìø°ø’øXø8ø"øø øøøøøøøøø øøø&øBøgøžøÂøù,ùUù_ùtùgùnùoùqùzù{ù•ù¬ùáùúù2úKúkúƒú‹ú™ú˜ú–ú«ú±úÅúßúùúû5ûKûUûbûUûTûJû&ûûñúìúÑúëúÏúßúÕú³ú—ú`ú3úúÚù©ù–ù[ù[ù0ù7ù%ù5ù0ù<ù ùùøøàø¶ø—øføUø%øøí÷Ñ÷¨÷„÷M÷(÷Ñöªödö6ö öàõ½õ´õ¦õÆõËõõõö6öWöŒö¿öðö÷S÷e÷÷–÷ž÷¬÷’÷ ÷}÷z÷b÷N÷A÷9÷A÷I÷`÷~÷š÷µ÷Þ÷ò÷ø#øCø^øwø”øµøÚøïø)ùAùkù¡ù°ùëùÕù ú ú<úGúRúSúIúXúXúrúdú^ú=úúúÔùÁù›ù{ù_ù8ùùüøÐø¼øødø#øø÷Ä÷Š÷^÷÷æö¬öyöBööúõðõàõìõåõóõöö.ö9öTöYöpöpöŒöŒö¥ö±ö³öÉöÇöçöÚöÿöôö÷ ÷÷÷1÷7÷]÷g÷÷£÷¾÷Î÷Ô÷Ý÷Ì÷Ø÷Ø÷Ü÷õ÷ï÷øø-ø<øAøMø@øCø/øøøÿ÷ý÷ø øø ø3ø&ø:øøøó÷è÷Ê÷¹÷µ÷»÷É÷í÷ø9ø_ø{øƒøø‹ø…ø…øuøjø`ø_ø_øbøqøtø‚ø†øøø‡ø{ø~ø‰ø„ø›ø¦ø²øÂø¿øÇø¸ø´ø¬øžø€øŒø‡øžøÇøóø/ù\ù–ùÏùãù+ú7úaúuúšú°úÐúõúû)ûWûdûŒûŸû§ûµûÁû±ûÂû²ûºû²û´û¾û³ûÂûÌûÄûÍû¿û·û–û™ûzûkû^û<û'ûõúÔú«úvúdú4ú%úúõùáùîùäùú ú7úKúxú•ú©ú¿úÓúÓúêúÞúæúÎú¹ú¤úúnú[ú8ú úáù¬ù†ùWù1ùùñø×øÉø»ø´ø§øµø®ø¸øÄøÐøÔøÞøåøáøçøôøùù-ùDùZùqù›ù™ùÁù¶ùßùêùúúúú3ú*úBúGúJúhújú`újúcúfúvúŽú‡ú¨úªúËúÛúöú û û"ûAû@ûcûeû’û ûÎûèûü)ü]ürüœü¼üÓüóüýEý`ý¼ýÄýþ!þUþmþœþ§þ®þ¡þ¥þ‡þ~þbþKþ3þþöýÌýŸýlý1ýý¸ü’üiüOüAüMüxüžüûü;ý ýÖý?þlþ¹þäþÿ7ÿVÿlÿzÿÿ£ÿ¹ÿÓÿàÿ ,*5,- þÿíÿÕÿ¸ÿ“ÿƒÿ_ÿVÿ'ÿÿìþÊþ¯þ†þrþ[þUþVþWþaþjþþˆþ™þ˜þ¬þ©þ®þ±þ©þ¥þ›þ—þ›þþ°þ¦þÃþ²þÎþ²þ²þþxþLþ1þ þþþñý þþ*þ-þIþ?þIþDþ&þ+þìýðýªý’ýZý*ýýü¹ü˜ü=üüÇûuûUûûûû û=ûƒû·ûü]üÂüý4ýoý}ý­ý¡ýÃý§ý»ý©ý¯ýœýŸý~ý“ýjývýkýQýXý=ý6ý7ý1ýFýKý`ýlýpýzýpý]ýEý%ý ýõüÜüÌü½ü­ü°üºüÈüàüý*ýUýƒýÃýöý+þ^þ†þ¯þÏþãþêþíþØþëþÈþàþÄþÆþÈþ½þÄþºþ§þ˜þzþ_þ;þ þòýÊýÈý¹ý»ý¿ýÉýÓýåýìýþ þþ"þ:þCþpþ~þ¨þ§þ¾þºþÌþ¹þ²þšþxþ`þ;þ+þþðýèýÙýÒý¿ý³ýý‚ýZýIýýýöüýüôüý ý.ý+ý7ý9ýAýCýGýZýYý…ýˆýÃýáýþFþþ¦þÔþæþ ÿÿÿôþÿêþûþøþ÷þáþÎþ¬þˆþnþ1þþÑý¤ýaý7ýúüËüžüsü9üüïûÝû¾û«ûžûšû‘û™ûˆû‰ûoûsûaûVûOû?û;û5û=ûBûfûrû™û¹ûÈûëûòûÿû üúûþûàûØûºû­ûû‡û{ûXû5ûûáúÄú’úwúJú4úúúúúú!ú2ú;úcúeúqú…útúkú`úSúKúIúBú:ú6úúóùöùÌùìùÓùàù¶ùÀù´ùÃùÓù×ùåùóù úú:ú3úMúdú…ú—úÆúÌúïúû.ûQûûûÃûáûõûüüü1ü,üJüEü^üfüsü‰üŽü¥ü”ü–ü›ü­üªü¹ü£ü¨üºüëü3ýmý·ýâý&þKþ…þ þÆþÑþÜþåþÏþÏþÅþ¹þ¾þ¼þ½þãþàþÿÿ2ÿCÿbÿpÿšÿ©ÿÓÿâÿ1<bk}wz€†”‹—ŠŽ„ƒ~††—”­ŸÂ¶ÆÌÑØéïþ & ûáËž€F3ñÿìÿ¯ÿ¨ÿœÿ™ÿÿžÿŸÿ®ÿ ÿ±ÿ¢ÿœÿ˜ÿÿ–ÿ—ÿµÿ³ÿÐÿéÿÖÿñÿäÿäÿÊÿªÿsÿ/ÿîþ‚þNþÿýÈýžýwý_ýFýCýSýWýkýkýýjý†ývý”ý•ý³ý²ýãýÎýõý(þBþwþ£þÏþÿ5ÿbÿ‘ÿ©ÿÎÿîÿ '/690>3D+C(-"õÿøÿöÿøÿýÿ ßÿÂÿ”ÿoÿAÿ ÿðþ×þ®þ˜þ{þkþaþWþOþNþIþEþQþPþoþwþ±þ³þîþìþÿÿ'ÿÿÿýþéþØþ¿þ©þ†þaþ8þþ×ýý_ýýãü«üvüQü0üüüÍûÐû®ûžûŒûtûnûaûhûiûxû„û¦û¹ûÝûóû üüü)üü7ü/üUübüŒü¯üÉüôüýý+ý+ýEý=ýVýWý~ýýÓýëý(þAþ‡þ–þÎþÝþÿÿ,ÿLÿ]ÿzÿ¥ÿºÿõÿûÿ02HNNNEG8;,-"18%59<LVhlznweaA.øÿÞÿšÿzÿ3ÿ ÿÊþ¨þþmþdþRþ`þ]þuþyþ£þ³þÝþÜþÿÿ%ÿ%ÿJÿ<ÿiÿZÿ~ÿzÿ„ÿ‘ÿŽÿ‡ÿ‚ÿ^ÿWÿ?ÿ(ÿÿúþéþÕþÃþ¸þ¦þ˜þšþ™þ¹þÈþìþýþ"ÿ+ÿQÿOÿ]ÿNÿ6ÿÿ÷þÌþ¶þ‘þ‡þvþvþ„þˆþ‘þ”þ‰þ}þ^þ>þþéýÛý¾ýËýÌýïýþBþvþ…þ¯þ®þºþÀþ­þ¥þþ}þoþeþ^þ]þZþTþDþ2þ þçý¾ýýdýCý"ýýùüðüèüÓüÖüºü§ü‹üü[ü`üUüZüuüˆü»üÔüùüý9ýXýtý‹ý§ý½ýÕýóý þ%þXþkþþžþ þ±þžþ¦þþšþ©þËþçþÿGÿuÿ¢ÿÜÿ)J]{|›‘«”£}‚WBçÿ§ÿŠÿNÿ0ÿüþãþ¼þ¬þ“þþwþYþ\þ,þþóýÏý»ý—ýŒýqýbý_ýNýWýFýAýFý0ý.ý,ýý#ýýýýý ýýý&ý/ý-ý.ý6ýý:ý$ýEýAýXýkýyýœý­ýËýÎýéýíýþþ-þYþzþþÔþïþ-ÿHÿ|ÿ…ÿœÿ±ÿ©ÿÃÿÎÿäÿ C}¼üFq³ËÕÒ´­˜•€Ž—•¯¸º¸¶žqM/(!&+CTj˜·´¶¯´ž´£»ÁßöGn›»ãó *-459A5A%þðÓȶ»¶¿¸³«£’–yvh\\SRH<A!.ôÅÍž’†pk^TE/깈[*ûÿÖÿ¥ÿ‹ÿaÿVÿ,ÿ*ÿÿÿ*ÿ1ÿSÿwÿ•ÿÌÿ÷ÿKf”¤Ð×÷ô.DS`mhiVA, úëßäò":Sm‡‹¥ £ª¨¨­¡¶ÁÑæñ%K?\Pc_gcjfx{‰œœ¦“tE!زhIîÀª‰ƒ^hMXK^jŽ¬Þ ;{¢Úçó깡ƒ_iNma„‡š–“’|iT:)&(;Fow˜œ®§£œ„‘¦Íù=v·ïDJrZsP^DXNdv…ž¦¨±›™zpTN@A9?:8909619*80=<DEN\W^_]\hSecs†’±¶ÒÎÕÇË´´…]>øÑ²–mh<I59CH_zºÂëù!,9@LU_bpqlxha\Q?E%3üöâÛÒ²±„…Z\JNKO^ilŽ~“—Ÿ£Ÿ¡’–’”‹†‘}‰|yqd^ZSdl|¨µèû!5Th–¥ºÅÞÜóîíâÁ©ƒS6÷ϰ‹w\Q70ùû &MnŽÅÝ &P_q|yriO?' æÐǬ¬’‘}‚|z…‚}‚iyble\`JTSUVc`{€£³ÍÝõìøàáÄ­“gJ úЯ’wd=9íâ;Á©µ Ÿ…zjGH6(-&$+1?=B:33-/3HX}¸ºÙÐÖÑDz ¯¢´Àѽ©zBùÿÙÿ»ÿ‚ÿÿƒÿ™ÿÉÿôÿ*Hz½Ìãäîô!4QdqЉš›°ÂÚ=FiwŒ˜™¤ ±´¸¹É¸²žŽjR' ÒÅŽ_aTW^h„›Àí B{Ÿºã÷':NWdxw‰ˆ›™£¤ š†ˆcc@=!÷ëèñæ):QrŽ¡ÊÎõ'Z]‡‡—tR@!êÒͳ¶¬¥§›š‚prgtr‡ª°ÀÕÙØìÝúô "(G]d«ŸÅÃØÜðù  1$LJhmlcu_gXT@<.ùôáàÕÓ×ÏÛÌÛ×äíù øçÀ¬tQ!âÊp6íÓ²¢ŽgM)ðØ¶”…pLI.='A'(ïᶪ~qiPT?G<<:B-G:JALEELNWO`Xms…¡²Ôð%DPgf~ƒ–©»ÌÓéóù÷÷èåл¢¡—†yhV6/üÕ¸—p]H9-&! #(Ug™¸Þ'Ln  ¯¤­—˜ƒ€ulecFO9:?<FDNN^]rmxjo[P?-(àåÍÓËÕÒÊж«˜¤®ÅÎàáìöþóøçÛÑÉÂÂÀÏÔï"8Mkuœ¤ÔÜEi€«ÀÝñ#B[€¡Æî7`‡¼á@i’·Ì3=Odjy}wpq_mU]TPWRR[^n|†””•tcS4#ýìÆ¹”mUÀ•Váœi9ôÆ»“„b;#îã°°…‰…„™–­©¶³¦¡sq8)îêÄ˶¸¦©|rDFòÿðÿÍÿØÿ¹ÿ»ÿ¥ÿ±ÿ«ÿ¯ÿ¯ÿ¬ÿªÿ°ÿ´ÿÈÿÐÿÜÿíÿúÿ">DVYZ^Wg]iccZQ7B&öÿâÿÍÿ¢ÿ²ÿÿœÿÿ ÿ§ÿÁÿÂÿïÿøÿ0DG`f…›ºß 4V‡˜ËÚù ÷ 0!;+@,=,-(ìßÜÌÔÐÍáÒíäÛØ¼§„`:ó˶‰†_];.óÿÔÿ±ÿŠÿzÿfÿsÿiÿ…ÿÿ£ÿ·ÿÄÿÛÿäÿèÿøÿøÿýÿÿÿ )2D[lpŠƒƒ|iiFW/A&íÿÁÿ·ÿÿ{ÿ[ÿQÿIÿTÿUÿ`ÿqÿqÿ’ÿ’ÿªÿ°ÿ±ÿ°ÿÆÿªÿØÿ¶ÿÛÿÖÿíÿ÷ÿ#'&75TQpt||a[C2! øÿýÿÿÿýÿöÿïÿíÿÜÿãÿÐÿÒÿÉÿËÿÛÿ×ÿÖÿÍÿ·ÿ›ÿyÿCÿ-ÿõþõþÕþÑþËþÐþÒþòþïþüþÿþýþÿþïþñþçþëþîþÿ ÿÿ&ÿ+ÿ7ÿAÿ7ÿ@ÿ%ÿÿÿûþñþÿÿ0ÿCÿhÿŒÿ¦ÿÄÿÙÿïÿÿÿ'6P\xŽžÇÒ÷÷õíÕÝÑÓáâ .:Ofx—œÌÎ4;Oh~©¢¯“iX)ÖÁxe( ìʼ šŽ¦©ÀÒÓéæâêØÄ—•qnR80ôÿèÿÅÿ¸ÿ£ÿ¢ÿÿ™ÿ”ÿ–ÿ…ÿ…ÿfÿZÿ;ÿ,ÿ ÿüþàþÔþÌþÌþÐþàþèþÿÿÿ9ÿ+ÿ1ÿÿÿèþØþ¼þ™þ–þoþiþLþLþ&þ þùýðýÇýÀý¨ý›ýý‘ýý‘ý‡ýŽý”ý•ý›ýŸý¢ý¦ý´ý´ýÁýÄýÓýÜý×ýçýÓýÎý¼ý©ýý{ýsýmývý~ýýªýÊýâýþþXþuþ¨þÈþÿ(ÿeÿÿ»ÿçÿøÿ#9EZOab]kcqmwb`7 õÿËÿ£ÿ}ÿUÿGÿ(ÿNÿ/ÿ\ÿFÿUÿ:ÿ=ÿ3ÿÿÿüþèþ×þÑþ¾þÇþ°þ¼þ®þ¥þ‰þrþHþþþ»ý«ýtýnýQýaýQýqýoý‡ý¡ýŸýÉýÇýôýìýþþ*þDþOþ^þiþpþvþoþnþZþOþ1þþðýÑý©ýŠýxýWýIý>ý.ý4ý/ýBý[ýjý•ý´ýìý þOþVþ…þŽþ³þÆþàþÚþÝþÇþÃþ²þ¨þþ…þˆþoþrþhþdþ]þHþ:þþþýÕýÀýýtý@ý&ýûüêüÇüµü©üŸüü§üªü¾üÍüÞüïüøüýý"ý3ý*ý3ý"ý"ýýýôüæüÙüÅü»ü ü¥üxü‡üSüWüGü6ü@ü'ü-üüüüüöûëûçûÚûÚûÅûÉû®û³ûŸû£û’û“ûƒû|ûvûkûsûhûpûjûuûsûzû‰ûŒû©û´ûÍûáûíûüü%ü@üGükübüüuü~ülüvübüqübücüaü]übüfüiü}ü†ü­ü¼üðüýCý‚ý¹ýñý,þbþœþËþøþ%ÿBÿgÿÿ’ÿ¯ÿ¸ÿØÿêÿúÿ%9)98$5 þÿçÿËÿ¹ÿ¡ÿ”ÿ|ÿoÿ[ÿHÿAÿ#ÿÿûþóþåþáþßþÙþÝþÕþÎþÈþ¯þ¦þ‘þnþ^þ:þþûýÐý¶ý”ýsýcýDý'ýýíüáü¶ü¢ü„ü[ücü;üMüAü@üDü<ü4ü,üüýûØûÈûû‡û}ûaûsûiû„û•û»ûÔûûû!ü2üdüvü‡ü”ü¡ü©üÆüÔüãüýõüý ýýý ýý ýþü ýüüýýý ýýýýýýúüýöüÿüõüùüöüýüøüýý ýý ýýý(ý.ýIý:ý\ýDýSýFý8ý)ýýýèüßüÆüµü°ü¤ü“ü—ü…üƒüüüŒü˜ü¨ü¼üÏüçüòüý#ý-ýIýCýaýfý~ý”ý©ýÑýÿýþ[þpþ¡þ®þÄþÆþËþÃþÇþ¼þ»þ¶þ¹þ°þ»þ¯þÃþÃþÚþñþõþ ÿÿÿ-ÿ3ÿ2ÿ'ÿ!ÿÿ ÿýþâþÕþµþ˜þ†þhþaþNþEþDþ*þ1þ þþ þþúýíýëýßýèýÞýçýæýâýÓýÒýÑýÍýÂýÂý¶ýªý©ýýýzýcýMý)ýýñüäüÆü³ü¦ü‡üŒü~ü…üŽü—ü®ü½üÏüèüöüý&ý1ýIý_ýbýrýmýdýyýWýqý^ýfýTýMý(ý ýæü¯ü’üWü(üéûÁû‹û€ûsûhûqûcûyûnûû}û~ûƒûƒûŽû£ûµûèûüYü‚üÎüøü)ýNýjýzýŒý ýµýÁýäýöý"þBþeþzþˆþ†þŽþqþdþDþ,þþñýÙý»ý¶ý£ý ýý‰ýwýpýWýBý*ý ýýýý/ý2ýDýOýWýlý}ý‰ý¢ý­ýÒýâýþ:þ\þuþ•þ©þËþâþúþ ÿÿ,ÿGÿTÿ€ÿ’ÿ½ÿÎÿìÿ'-/7G]i‚Ÿ¥ÄÉÐÐØÈÍŷƱÁ·µ±©ž—}€^V-çÿ·ÿ¬ÿ~ÿRÿÿëþ®þ…þMþ$þëýÎý™ý¥ý}ý“ý€ýýzýyý‘ýŠý¨ýýºýºýÓýÙýÿýûýþMþjþ”þ²þÉþÚþìþóþòþýþÿÿ7ÿ@ÿWÿYÿnÿxÿ|ÿ ÿ†ÿ™ÿˆÿ{ÿŒÿƒÿœÿ™ÿ³ÿ³ÿ±ÿ»ÿ°ÿ¯ÿ ÿ§ÿ‘ÿ†ÿjÿlÿSÿhÿRÿBÿ(ÿÿìþ¾þªþJþ=þþãýíýÊýÛýÆýÊý¾ýŸýŒýSý+ýÿüÊü§ü{ü_ü3ü%üñûêûØûÉû¯û¬ûûŽû‰û‡ûŸûªûËûü$üSü‹ü¯üÚüýý1ýUý}ý¡ýÛýçý&þ=þnþ‡þ˜þ¼þÑþÌþãþÐþÊþÈþÀþÊþºþÁþ¦þ®þ‰þ~þgþaþIþAþ.þþ þþþþýþþ"þþûý×ý×ý×ýÕýÝýáýÓýÒýÆýÌýÊý¼ý²ý–ýtýPýýýÆütügü)üüüòûÜû·û¾ûœû®ûûjûYûBû5û1û)ûû&ûû3û/ûMûbûƒû§û¬û­û´û¦û²û¦û¨û˜ûû~û{ûû‘û»û½ûÜûäûü!üEüMünüiü|üpüyümüYüXüIü&üüÿûîûÎû±û‘û‡û|ûnûzûmûûtû”û‹ûzû…û€û•ûûŸûû’û”ûŽû û˜û•ûŒû‘ûƒû“ûû‘ûûfû@ûBû-û)ûû'ûûûåúßúºú·ú¾ú»ú«ú˜úŠú‰úvú”úúªúžúÅúÃúÖúàúóúûû-ûIûZûyûˆû²ûÝûü,üIüLüMüTüAüBü(üüüýûâûÖûÃûÙûÓûëûü ü$ü9üXüküzüü«ü½üÕü×üÿüæüýü÷üùüàüãüñüÚüîüÒüÙüÔüÂüâüÒüèüêüýü ýý,ýLýbýmý}ý“ýý…ýƒýcýcýEý)ýý¾ü‰ü[ü9ü$üïûÊûû_ûKû8û<û#û+û%û/û9ûMûOûBûHû7ûEû6û1ûûûÛú×úÍúªú”úbúHúúúéùÏù™ù„ùZù:ù)ùùù ù ù&ù%ù2ù=ùù*ù!ù?ù>ùPùTùUùrùù¤ù®ùÊùÔùéùüùûù.úú>ú,úAúúJúXúzúžú²ú×úâúûûû.û2û<ûCûCûJûNûFûQûXû\ûfû`ûhûgûWûjûFû=û'ûû ûíúÞú£ú‰úZúBú-úúöùÕùÇùÆùÛùèù úú9ú8úPúfúeú€ú~úú™úŸúœú¬úªúÛúàúÿúçúýúéúíúÀú£úFúúäù×ù½ù½ùºùÆùçùú(úWúlú˜ú¼úÒúøúû,û3ûJûNûWûxûtû‰ûzûqûtû\ûgûdûqûnûŽûŽû£û¬ûµû´û¹û£û–ûƒûrûuûdûqûhûzû“û“û«û±û°ûªû»ûÁûÆûÕûÔû»ûÂûØûëûùûüü üöû üöû÷ûôûèûüûèûôûöû÷ûéû×û¸û{ûAû3ûøúèú½ú¹úŽúúvúqúúú•ú‰úsúMú#úúèùÒùÁù—ù‹ùbùhùFùFù9ù)ù0ù&ù)ù5ù:ùXùtùªùËùúúJúTúqúfú‹úuú–úvú~úJúEú6úAúNú?úQú:ú;úú úúéùúú;ú?úXúdú€úú•ú•ú™úú¨ú‹úžú ú±úÈúäúïúÿúñúúúøúÿúÜúîú¥úÄú¾úáúûûIûdû•û¯ûáûîûöûûûüüüùûïûåûÉû»û†û>ûûÝú³ú‹úhú\úOúqúnú—ú¤ú®ú»ú¹úÁú«ú£úuú=úúüùúú$ú4ú=úOúMú[úIú5ú&úúúùïù½ù¸ù„ùsùZù+ùùÔø©øøXøAø5ø(ø5ø/ø]øPø|øø±øÀøÀøÅøœøø‘ø’øø™øŽø¦ø™ø¼ø·ø¸ø¢ø¢ø¨øžø—øžø‡øøuøjøføTøVøGø;ø1øø!øøø%ø'ø@øBøOø>øPø4øBøøøÄ÷›÷{÷F÷1÷ ÷òöÑöÄöö‚öYöNöKö>öBö4ö/ö.öööööö#öö/ö4öEöXörö–ö·öÛöêöûö ÷÷÷÷÷âöéö×öÛöÖößöéöÞö÷ïö÷÷G÷G÷r÷w÷£÷·÷×÷á÷ó÷øø8øCøWø1ø@øø)ø÷÷þ÷Ê÷Ã÷¥÷–÷‚÷e÷@÷4÷ ÷÷ìöÕöÆö°ö¶ö»öÞöÓö÷ôö÷÷÷÷÷÷÷çö¶ööŠötö‰ö{ö}öyösöuö‡ököxököoöpötö‚öyö”ö’ö¤ö¬ö£öªö¨ö«öÁöµöÙöÙöéö÷C÷x÷£÷Ë÷ê÷øøMøLødøtø‡ø³ø²øÕøÞøûøõøùùÞø×øÏøÈøÏøÓøêø×øþøßøìøÐø»ø¡øønøYøFøøøø5øgøwøÍø¾øùùMùNùWù^ùrù”ù¹ùÏùöùüù%ú=úIúSúJúGú&úúÿùçùÉùÅù§ùªù–ù—ùù†ùƒù}ùdùpùZùjùYù}ùjùù–ù´ùÎùàùóù úú!ú>úOúlúŽú°úáúêú)û3ûJû_ûdûƒû”û®ûÊûÖûÎûóû(üNüüŽü¦ü¢ü¥ü§ü¡ürüoümü„ü‰ü³ü¹üÓüäüüüýýýüýøüòü ý ý8ý\ýyý¿ýÙýþ7þTþnþcþdþVþCþ?þ1þþþñý¾ý¬ý|ýFýýëü»ü­ü‚ü‹ü{ü–ü§üÅüÙüçüíüýüüýýýý ýýý ýýÿüñüßü¾ü±ü“ü|üküTüMüJüNü^üiünüiüpüNüIüüüýûòûåûÕû±ûŸû~ûoûCû/ûûéú–úrúNú)ú"ú!úúúÿù úú&ú'úBú6ú2ú8úMúgúzú™ú±úÄúÜúõúûûû1û:ûGûOûZûgû_û€ûqûqûfûOû1û$û ûùúïúÓúÇú²ú¹ú´úÕúÖúìú÷úû"û9ûVûQû‚û•ûÀûáûüü3üJüSüVüUüLüNüKüNüGüHü>ü8ü2ü$ü üìûËû®û‹ûtûGû ûëúáú÷úû"û2ûFûcûŠû°ûÌûÖûôûôûÿûúû÷ûëûÔûÌû­ûûsûIûEû,û)û$ûû ûóúîúáúÞúåúãúáúâúêúìú ûû3û*ûBû2û8û%ûû ûëúÌú°ú˜úˆúxú†úú‰ú•ú•ú–ú–ú“ú©ú§úÀúÅúãúêúû%ûDûRûyûû¡û§û½û¼ûÄûÇûÑûÈûÈû¸ûªû™ûƒûsûNû&ûüúßú´úŸúnú]ú=úAú$úúõùÊùÎùëùøùúúúú.úPú^úlúvúú¬ú¿úÐúâúîúøúû û0û$ûûûû ûñúåú¶ú¤úúxúiúaúoúrú{ú—ú¡úÄúÚúùúû1ûOûrû„û­ûªûÔûËûúûþûü)ü-ü4ü5ü$ü üýûñûÒû»û©û ûû û²û³ûÜûãûü%üGüZüsü†ü„ü–ü†ü•ü‹ü‘ü€üüVüMü"üüàûÃû¢ûnû`û9û2ûû ûùúæúÝúÐúÞúÓúÑúÚúËú×úÕúåúâúöúåúêúãúÐúàúÃúÍú¶úŸú—ú†úwúuúeúbúpúbú€úoú{ú‹ú•ú¬ú»úÖúèúóúûû8û4ûOûdûyûûªûÃûÕûíûüü9üAüuü~ü«ü»üÑüëüèüýþüýþüóüéüØüÒüÉü¸ü¹ü©ü®ü“ü–ü€üuüeümüSüeüZüiüuüƒüü®üžü®ü”ü‰ükü[ü:ü&ü üùûðûàûÛûÕûÆû¿û±û¦û›û›ûû›ûû°û¾ûØûòûÿûüü%üüüþûæûËû±û¡û‘û}ûwûaû]û>û/ûûúúÙú¿ú¢úúsúQúGú#úúþùóùÚùÎùµù ùŽùvùkùUùIù=ù)ù%ù ùùáøÔøµø¨øø‚ø~øaørøbøløløuøxø†ø—ø§øºøÔøõøùCùwù€ù±ùªùÊùÑùÜùëùùùüùúúú7ú4ú^údú„ú’ú¡úÀúÇúñúûûDûSûtû…û–û£û¨û¯û¨û¯û£û«û¨û®û¶û¾ûÍûÓûÚûßûÝûÜûÛûÜûÒûØûÌû×ûÌûåûàûîûîûüüü$ü(üCüOühü‚üŒü¶ü»üãüäüýûüûüñüáüÇü·ü—ü‘üoü`üOü7ü0üüüôûõûðûéûéûñûêûü ü+ü>üVüqü{ü”ü‘ü¢ü˜üžü–üü’üüŒü}üüiü]üIü$üüæûÒûœû…ûYû>û%ûûûèúÞúÓúÄú¼ú®ú©ú›ú˜ú”ú‘úú‰ú˜úú™úúú~ú{údúRúIú>ú:úKúBúTúAúTúDúOúDú=ú/ú úúöùúûùñùûùåùúù÷ùú ú,ú+úHúLúaú`úyú‡úŸúµú»úÕúÔúîúôúûû%û>û:ûPûUûbûtû|û’û ûÀûÒûìûüü1ü:üSüPüZüUüSüVüGüPü=ü:ü2ü%üüüûûüóûíûöûãûöûîûïûüüü.ü7üOüTünü{üƒü“ü¤ü±üÊüÒüëüîüóüýþüýý0ý7ýTýbý{ý‹ý”ýœý–ý‘ýƒýkýSý*ýýöüíüÉüÁü¥ü¦ü—üŸü“üü•üzüŒüeü{ügüpüuüzü„ü‰ü–ü’ü”üˆü‚üsüaüSü1ü(üúûÿûÕûÑû¾û¼ûÄûÇûÓûáûØûåûÞûÐûÐûµû³û”û—ûuû}ûeûjûgûcûcûcûRûdûSûmûnûyûŽû–ûÀûÐûüüPüiü•üµüÏüôüý'ý6ýUýaýý‰ý¦ý§ý¾ý²ýÙýÕýíýúýùý þ þ!þ þ,þ9þ@þbþhþ‘þœþ±þ±þÁþ³þÂþ»þÁþ»þÃþ½þÑþÓþâþýþÿ/ÿEÿHÿaÿCÿcÿSÿlÿgÿiÿ~ÿÿ“ÿ®ÿÁÿ×ÿÍÿÉÿžÿzÿeÿLÿ/ÿÿÿÿÿ+ÿJÿbÿxÿ›ÿ¶ÿÄÿ¿ÿÁÿ©ÿ¬ÿÿtÿ>ÿ-ÿíþÚþ¯þ‹þeþ9þþØý¶ýŒýbý8ý ýûüéüÜü¥ü¤übüWü;ü5üüþûÔûÊû¤û¨û‡ûuû_ûRû;û,ûûûéúÒú²ú¤ú’úŽúŠúú˜úú ú¡úšú•ú‹úú|úú|ú–ú‘ú“úŸúú¤ú ú£ú–úlúQú%úðùâù¯ù«ù’ù”ùŸù¢ùÏùàù úú@úVú{ú‘ú¶úÓúùú%ûNûŽû©ûâû ü7üYüxüü¡ü¥ü¶üœüü„üyüqücübü^üWügüeüpütü‡ü”ü¨ü²ü¶üÀü©ü½ü¢ü°ü¢ü¯ü¦ü±ü¢ü¯ü‰üŒü^üKüüüØû¹ûŠû~û\û`ûOûTûLûMûTûIûDûAû0û-ûû ûûû#ûAû\ûˆû¥ûÛûöûü5üKüiüdü‹üƒü¡ü¦üÀüÈüÕüàüôüý ýýùüèüÎüµü‘üyüXüFü2ü.ü1ü@üEürü~ü®üÔüêü!ý/ýsý›ýËýöýþ-þKþ]þzþ„þ–þŒþ™þ„þŒþtþxþhþkþ_þhþVþdþ]þ^þaþnþoþˆþþ¤þ©þ½þ´þÄþ©þ¥þ‰þuþ]þFþ-þþ þüýôýçýêýáýéýàýåýßýæýãýýýïýþ þCþbþþ«þ«þäþÎþîþÒþáþÚþÎþÙþÆþÉþ¶þ·þšþþoþZþKþ%þþøý÷ýÎýàý¸ýÈýÂýÇý×ýàýïýþþCþDþlþ|þªþ²þÕþÒþÒþÓþ»þ²þŽþ~þZþ?þ!þ þûýûýöýøýøýíýûýôýþ þþ þþþ þþþþþ/þ8þFþ^þ]þoþnþþ|þ‡þlþoþGþ>þþþéýÎýÑý¿ýÁýÍýÄýßýÕýéýàýØýÞýÁýÅýµý­ý°ý£ý¬ý¦ýšý£ýšýý~ý`ý7ýýéüÈü°ü€üiü<üüüèûÏû²ûƒûZû=û-û+û:û4û]ûRû‰û~û¡ûûœû‹û—û€ûƒûtûdûiûWûiûSûNû%û ûâú»ú‘úvúTú@úYúXúzú¡ú½úûúûOûmûû¨ûÈûåûü&üRünüžü¶üËüãüàüïüãüÏüÍü«ü·ü—ü­üŸü¯ü»üÒüÐüëüâüìüîüìüõüýý+ýPýrý›ýÂýèý þþ:þCþ`þgþ’þŽþ©þ¥þ³þ²þ²þÁþ·þµþ±þ™þ”þþ}þ…þwþŽþ„þ™þ™þ§þ£þ§þ˜þ‹þtþXþGþþüý¼ý¡ýVý4ýòüÄü‚ü`ü1üüûûòûíûïûüü+üEüpü‘ü¸üÙüöüý-ý8ýNýLýfý^ýnýmýmýoýký^ý[ýPýPýHýQýNýQýRýKý@ý6ýýýíüáüÊü¬üžü‚üwü]üVüIüCü:ü6ü3ü6ü4üKüLüiü…ü£üÛüéüý-ýAýLýFý4ýýòüÂüükü7üüõûéûËû½û½û¨û»û›û«û˜ûûû—û§û«ûÇûØûúûü+üYü\üyü‚üü³üÙüûü)ýSý™ý¿ýþ$þcþþ þ½þÓþãþûþÿ-ÿ0ÿeÿjÿ¥ÿÿÃÿÌÿÂÿÍÿ°ÿšÿyÿfÿKÿ9ÿ,ÿÿÿøþíþÞþÂþ¶þªþ§þ¡þ¦þžþŸþ—þŸþ~þŠþ`þbþHþ=þ'þ#þ þþþþþ$þ+þ5þMþ^þxþŽþ¤þ¨þäþàþÿÿ+ÿ-ÿ1ÿ!ÿÿîþÒþÁþ®þ¦þšþ þ—þ§þ§þ£þ¤þ”þ”þ|þ}þ^þ_þKþGþ9þ4þþþüýåýÈý°ý„ýwýZýKýMýNýXýbýfýhýdýTý>ý(ý ýýÝüØüÅü¾üÅü½üÌü¿ü»üµü¡üü‚ükütüTü_ü0üüöûåû½û°ûiûOûûéúÆúºúÁúÑúøúûJûlû—û¨ûÇû¿ûÍû³û¸ûŸû§û—ûšû¥ûžûªû©û©û¬û¯û¦û½û²ûÏûÉûäûÚûüü#ü ü-ü/ü.ü,ü0üü'ü(ü5ü=üPüPüVüXüOüPü9ü8ü*üü$üüü ü üüïûîûßûÖûÖûÊûÎûÜûÔûüóû0ü#ü^ü^ü‡ü—üµüÄüæüïüý+ýLýnýý±ýÄýåýëý÷ýíýúýàýéýÖýÌýÇý¹ý­ý®ýŽý˜ýŽýý•ý ý¦ý¼ýÆýõýÿýBþ_þ”þ¸þØþÿÿ3ÿFÿ@ÿQÿ?ÿ\ÿSÿiÿiÿÿ‹ÿ¡ÿ¸ÿÅÿÓÿäÿêÿýÿ+)12$ÚÿÇÿœÿ}ÿfÿNÿDÿ%ÿÿïþËþ¨þyþ;þþÃýŸýmýZýQýWýný“ý¯ýàýþ6þLþqþzþ‹þŒþþ™þþ²þÒþàþ ÿ ÿ4ÿ6ÿJÿBÿ7ÿ+ÿÿÿ,ÿ/ÿKÿKÿoÿjÿ†ÿ…ÿ‰ÿ‹ÿpÿfÿRÿBÿAÿ4ÿDÿEÿcÿsÿ›ÿ§ÿÏÿ×ÿîÿûÿ   þÿñÿåÿÀÿ ÿfÿ3ÿÿàþÅþ¶þŸþ£þ þ¤þ©þ™þ¡þ”þ„þþQþPþþþþ þ"þ6þKþeþtþ”þ—þžþ†þ‡þiþVþdþMþpþtþœþ¼þØþùþ$ÿ&ÿPÿRÿcÿXÿeÿSÿoÿaÿgÿsÿxÿ[ÿqÿ=ÿEÿÿóþÆþ®þvþcþ&þþ&þ9þeþþþŽþµþÆþëþÿ1ÿBÿLÿGÿYÿAÿeÿcÿyÿoÿXÿGÿ"ÿÿßþ¶þyþ>þþÙý¼ý}ýký5ý-ý ýýïüÕüËü³ü¥ü›üŒüüxü`ü]üSüKüaüSünüoüsüpüeüOü>ü-üüçûµûûeû$ûûÒú¿úœúú{úqúaúLúBú1úúúòùòùúú.ú<úWúrúŽú¶úÈú×úÜúäúâúéúêúëúñúóú ûû#û9û1ûWûJûfûcû]ûjûû¥û¾ûåû ü#ü>ü\üOüOü5ü,üüôûÊû·ûû‚ûMûIû ûûâúÆú³úú“ú‚úƒú‘ú…ú™ú¡ú®úÇúÇúÔúÆúÉú¦úµúµúÂúÌúÔúÛúáúðúàúäúÂú¹ú“ú€úlúWú[úWúsúnú†ú‰ú¨úšúµúŸú ú~úhú[ú<ú?úOúaúlú‰ú˜ú¶úËúßúýúðúûöúûúñúïúñúèúðúÛúÇú¶ú¬ú¡ú¿ú£úÌú»úÖúêúû,ûCûfûrû…ûˆû’ûŠû„ûŒûŽûû«û¹û×ûñûþû)ü ü(üüüûûìûáûØûÂûËûÅûÇû·ûÆû¶û´û®û®û¬û´ûÂûÎûçûïû,ü&übüNütüZü]üJü:ü&üüüü(üKüdü—ü°üéüþü6ýUý‹ý¹ýíý#þ[þŠþÈþÿþ6ÿ„ÿªÿíÿBp¼Õý2FK\IR@0)0 BEZp„‹”ƒjM8ì̪Žxf`YH;3 ÞÿÔÿ—ÿ‘ÿ^ÿJÿÿÿÖþ²þ þuþ]þNþ:þ6þ5þ7þ?þ8þLþBþHþLþKþUþJþXþHþRþFþCþ5þ.þþþÿýðýåý×ýÍýÉýÁýÓýÛýþ1þUþ‚þ£þÏþéþÿ/ÿ1ÿSÿJÿ]ÿ_ÿhÿmÿ}ÿ}ÿˆÿˆÿ„ÿ„ÿ}ÿ„ÿzÿÿzÿvÿgÿƒÿÿ ÿ¤ÿ½ÿÊÿËÿãÿßÿåÿâÿéÿãÿæÿçÿèÿôÿñÿ((79HNK[VNWIJ;@>3?9ARUvu†Œ‡…ndS>,ýÿôÿãÿÏÿ»ÿ™ÿ–ÿxÿ‡ÿ{ÿ‚ÿzÿ…ÿ—ÿŸÿ¸ÿÐÿêÿûÿ!*MWjŒˆ”ƒŽx€Xk=H4>@=JDD=5( %):NuЦ»ÐâóïýèïÞÐÞËßèåïëéñÐáÆÁ¼©®—•z[bPKF4E6DIGO]g†ª«ÑÞûÿ$'87@6?,0 ê寏¤||X\N=?6 âÿ¶ÿÿUÿ.ÿéþ½þxþKþþÜý¢ý€ýKý7ý ýüü×üÆü©ü™ünüqüHü=ü(üüûûáûÍû»û¦ûšû„û{ûdûYûOû@ûûûèúãúÛúâúáúçúìúþúû.ûAû\ûfû‡ûšû¶ûÛûõû+üFüwü•üÀüÚü ýý3ý=ý>ýUýBý]ýQýaýjýgýyýnýxýtývýhýcýdýgýqý}ý™ýšýÕýÎýùýÿý þ(þ2þUþnþþ­þÐþæþÿ%ÿCÿqÿÿªÿ¤ÿ¹ÿÁÿÔÿßÿóÿöÿ'-=CRVop¤¨ßÿ4\–¯âù$CYvƒ“”¨™Ÿ—‹{qYZLOIUM\]^h\dNC!òè̶¬ŽŠgM. íÈ¡|F#ðÿÍÿšÿŠÿ]ÿhÿVÿkÿ]ÿxÿuÿŠÿ•ÿ­ÿ·ÿÁÿÉÿÌÿËÿÆÿ»ÿÀÿ£ÿ½ÿ²ÿÂÿºÿÊÿ¾ÿÖÿ·ÿÐÿ©ÿ·ÿ§ÿ·ÿ°ÿµÿ¹ÿÈÿÏÿçÿçÿôÿôÿíÿýÿâÿòÿäÿðÿðÿöÿüÿýÿúÿüÿöÿîÿÚÿÄÿžÿ€ÿOÿFÿÿÿñþíþÏþÎþ¶þ«þ‰þþkþtþ^þ~þpþŠþ“þŸþ®þ©þ¼þ­þ¯þ¢þ“þ’þ|þŒþ|þ˜þ™þÂþÍþàþæþíþÚþáþ¸þºþ‡þþfþWþNþ=þ=þ>þ=þEþFþLþYþ\þ{þ’þ¦þÏþÐþøþþþÿ5ÿCÿXÿeÿgÿÿxÿzÿmÿfÿXÿHÿ@ÿ"ÿÿòþÚþÈþ›þ—þsþmþLþSþ<þBþ5þ>þ<þMþXþþ™þ¯þÏþçþçþùþâþæþÈþÆþ­þ¨þŒþ‹þtþ€þsþrþwþnþqþtþhþ†þxþ©þ¬þÆþÞþêþÿÿ8ÿAÿ1ÿ:ÿ ÿÿÞþÕþ³þ¢þþzþfþ[þ;þ3þÿýÿýÊýÄý¥ý“ýý…ý‹ý”ý’ý°ý¼ýÑýîýúý#þ<þ^þ|þŽþšþ»þÅþçþöþÿþÿ ÿ ÿÿ ÿ ÿýþÿúþÿóþßþÖþ°þ¥þ~þpþUþ?þ1þþ þüýòýìýçýæý×ýÍýÀý®ý¨ý—ýý‚ýtýƒýwýŠý€ý–ýý£ýýžý|ýýmýfýiýXýcýZýZýcýRýhýiýý’ý¨ýÉýÜýõýþþ.þ%þ9þ$þ!þ þìýÓýªýýgýKý3ýýýôüÞüÍüÃü¸ü®üªü¡ü¦ü¯ü¶üÊüåüöüý'ýTý{ý›ýäýúý7þVþƒþ«þÙþöþ!ÿ-ÿSÿXÿsÿ„ÿ~ÿ•ÿ…ÿƒÿ“ÿŒÿÿÿ«ÿ¾ÿÂÿÜÿÕÿØÿÜÿÕÿÌÿ¶ÿ“ÿnÿHÿ ÿþþÝþ­þ¥þŒþ‹þ‰þ’þ—þ¬þ°þ¸þÆþÃþÏþÉþÌþÎþÌþÓþØþÔþÜþØþäþõþõþÿÿÿÿÿÿ ÿÿ$ÿÿ2ÿ&ÿ(ÿ%ÿÿ ÿÞþ×þ¡þŒþaþaþ5þRþ.þ'þ þþþ þþþúýéýÜýÓýÑýÅýÒýÐýðýåýþþúýöýÜý¹ýýoýQýBý1ý)ýýýÙüßüÄü½ü“üyüGü!üôûæûÄûÈû¿ûÍûíûîûüü-ü/ü$üüüñûÕûÈû²û©û©û û¨û¢ûªû«û®ûÆûÌûúûüMüjü·üæü>ý‡ýÛýþ_þ“þÃþéþÿÿ,ÿ8ÿFÿVÿXÿjÿnÿ~ÿÿƒÿ¢ÿÿ¤ÿ”ÿ¢ÿœÿ™ÿ¤ÿ¢ÿ¡ÿ²ÿ¶ÿÄÿØÿÞÿÿÿöÿ&!,):%=7:57&(!,#-6<OVep|‚|kUAúÿÕÿ·ÿ˜ÿ…ÿjÿ^ÿKÿPÿCÿ9ÿÿ&ÿÿÿôþÔþÆþ›þ‰þZþ6þþäý¶ýýfý5ý ýÚü¯ü’übüCüüüíûãûàûßûáûêûìûöûûûöûûûðûäûÓûÃû û‹ûaû`û6ûEû%û7ûûûûûúàúéúàúÛúÛúÚúÛúåúíúùúûû9ûAûPû_ûcûnûyûzûûûšû”û§û›û©û‘ûšû‰û”ûû†ûˆû~û…ûû‘û¢û›û›û™ûœûûŸû³û¼ûÓûåû üü=üGüqü~ü™ü¬ü¹üÍüßüúüý/ýTýlý–ý«ý»ýÛýÍýïýÒýêýÚýéýÜýøýçýþõýÿýüýòýïýêýâýÔýÔýÈý½ý¦ýžý‰ýsý^ýCýýðüÔü•ü‚üHüüûûÖû¹û ûûtûqûjûxûlû‘û‹û²ûÎûðûü-ü8üHüRüeüküuüzürüuüfü\ü?ü5üþû÷û¼û§ûrûUû+ûûçúÏú¶ú›ú˜úƒúú{úƒúú˜ú™ú¾úÃúõú û<ûZû{ûû©ûÃûÒûáûìûûûýû üü üÿûÿûçûÝûÊû©û˜û}û[ûLû<û/û(û$û+û/û>ûCû\ûTûiûdûeûsûjûû{ûŽû‘û¨û¥û±ûªûªû¥ûœû›ûƒûûqûlûeûgûlûoû€ûû³û¼ûäûìûüü!üü$üüüüóûèû×û»û®û‡û~û_ûNûEû)û+ûûûûû'û7ûBûgûjûˆû û­ûÍûÙûùûü.üOü_ü„üü›üü¢ü–ü“üŽühübü7ü1üüòûÑû¦ûûaû=û ûðúÙú¨úŠú`úHú&úúúýùïùÜùÕù¸ù§ù‡ù€ùOùGù,ùùùùòøùøø ùùù1ù1ù4ù9ù5ù6ù5ù:ù7ùDùQùWù€ù™ùÉùÛùú!úOúaú‡úú«ú®ú´ú¿ú°ú¶ú§ú¨úŸú–úšú~úƒúoúXúKú6ú+ú&ú-ú5úFúAúXúIúOúWúSúQú=ú#úýùÖù·ù}ùqù+ù&ùéøÛø¨ø˜ødøUø%øøä÷Ó÷¯÷ ÷„÷z÷m÷]÷_÷G÷E÷<÷5÷;÷5÷D÷J÷b÷}÷˜÷¸÷Õ÷ï÷ø!ø%ø8ø0ø8ø)ø&ø'øø-ø,ø=ø>ø`ø_ø|øƒø˜ø›øºøºøâøõøù8ù?ùRùTùùnùùŒùªù±ùÒùâù úú,ú[ú`ú}ú€úyú[úTú(ú)úüù úòùÿùúú8úEú\ú[ú}ú‚ú—ú—ú­úµúäúû3ûbû‡û­ûåûøû)ü*üPüGü`üPüqüaü€üŒü¥ü¬üÈü¿üÌü¾ü¯ü¢üžü€ü“ü|üŽü‹ü™üžü¤ü­üµüÉü¼üÈü­ü£ü‡ütüQü8üüüçûáûÍûÌû¾û¾û²û­û¤û—ûŽû„û}û{ûsûpûmûqûjûiû\ûXûBûLû2û6û3û#û7û4ûOûgûpû”ûŒûœûû€ûeûZûFû<û?û%û,û(û#û=û2ûHû6û=û0û5û7ûDûXûWû|û}ûŸû­û·û¿û¾ûºû®û™û|ûYû:û)ûûûêúÌú¦ú’úaúVú<úBúAúUúcúxú™ú¬úÚúìú û%û3ûOû]û…ûªûÓûü2ülü›üÐüøü,ý;ý^ýlýtý‹ýŒý ý¿ýËýþþXþoþ“þ´þÃþúþÿ=ÿ[ÿ‡ÿµÿíÿUv¥ÀßôøûýùåàÌͼ¾º§®”˜‡ˆttZVD:äÿßÿ³ÿÆÿ¤ÿºÿ¤ÿ³ÿ´ÿºÿÈÿÃÿÏÿÌÿºÿÆÿœÿ™ÿmÿ^ÿ@ÿ"ÿÿûþìþØþ¹þ²þ“þ€þkþPþCþ?þ1þAþ6þGþIþSþQþUþEþAþ þ þàý½ý•ýoýMý,ý ýøüóüâüïüÖüàü¾üÁü’üü]üUü$üü÷ûòûÏûÐû­û«ûŒûûuûxûjûoûbûaûVûHûCû/û9ûûûÍú¾ú‚úhú3ú úÜùÂù™ù€ùpùHùBù1ù)ù#ù0ù*ùGùIùwùùÄùÏùøùúú%ú9ú:ú6ú9ú>úeúhú›ú´úÖúüú)ûHûdûmûyûwûaûvûbûzûyûžû¶ûêûü;üIü^ünüoü‹ünüŠüpüwürüüˆüü¸ü°üÔüÖüåüåüìü÷üüüýý$ýEýJýeýjýtýpýqý\ýFýDý!ý(ý ý ý ýûüýôüúüëüòüíüñüóüýýý3ýKýjýý­ý¼ýãýþþ?þ?þ\þhþ—þþÉþ¶þÖþÉþáþÌþÖþÊþÙþÔþôþûþ ÿÿ%ÿ'ÿ-ÿEÿHÿ]ÿXÿfÿiÿuÿÿ—ÿ¡ÿ³ÿÎÿéÿþÿ3Fg|¨·Ý=[}™¿Éåäü /=`m…•˜›‰”zwcW?% ûÞÀ¨w[/ߪ“r`YJRYe{£ÈÕð&+!33<F@IA>/.óôËÔ¯² Ÿ•˜‡’ˆ••¡§¸Äçè:9KIEG?H>89-**% õÜͰª‰}cQC07& ùÿêÿÞÿÃÿ¨ÿzÿTÿ4ÿÿæþ°þ“þlþDþ1þþþúýþþ"þ:þaþvþ›þ§þ¶þ¯þ½þ¼þ½þ¶þ»þ®þ¼þ¸þÁþÇþÍþÒþØþËþÈþ©þ™þqþUþ'þþâýÀý¢ý‰ýgýhýIýVýJýYý]ýsýý´ýâýþ9þiþþ·þÆþðþñþÿ ÿÿÿÿÿñþùþäþÝþÇþ¾þþ‰þtþXþ9þþþÞýâý³ý·ýŒýýoýcýGýCý/ý*ýýÿüÜüÎü™ü‘ücüCüüüÝûÆû»ûû¥ûŠû¦ûû­û°ûÄûØûãûüÿû üü(ü6üEüSüdüfüzüü‚üüŒüüšü…üŽü[üQüüüÇûûMûûÙú¿ú¹ú®ú¿úÉúëúûFûyû©ûÉûíûü-üIü\üpüqü”ü¾üëüý>ýPý^ýmý^ýWýJýDý1ý2ý"ý"ýýýýþüóüàüÂü¬ü€üfü[üLü:üHü<üFüKüQüZüfüjüoüoüiügü‡ü™üÇüéü ý1ýHýrýwý”ýšý¤ý´ý¾ýÓýæýùýþþ*þ)þ9þ)þ,þþþþôýôýïýõýþþþþ þþþþúýðýÞýßýÄýÍý»ýºý´ý¢ý‘ýsýaýFý;ý*ý)ý#ý3ý1ýFýNýaýsý„ý‰ýŠýý†ý™ýŒý©ý¬ýÍýâýþþ*þLþKþfþYþdþbþnþvþšþ²þÖþðþ%ÿ)ÿeÿ`ÿˆÿ~ÿ•ÿ‘ÿ¥ÿ¥ÿ·ÿÂÿ×ÿòÿ+FXqr{hT9$éÿÌÿ®ÿ‡ÿnÿGÿ ÿúþÝþÀþ¨þþtþkþIþKþ'þ)þ þþñýÔýÀý—ý‚ýTý4ýýäüÎü¥üŠünüHü/üüüôûíûÞûàûéûçûüüüü+üü4üü"üü üìûéûÖûÐû¯û³û—û’ûwûnûSûKû:û)ûûûúüúëúïúäúçúáúáúÌúÉú¸úÇúÅúéúßúûûJûbûû”û°û¯ûÇû»ûÈû»û¿û¶û¹ûÂûÉûéûüüIü\ü‹ü üÃü×ü÷üý ý>ýUýkýý—ýÄý·ýÛýÕýèýçýìýçýìýäýæýâýÑýÑýËý¿ý¹ý¡ýŒýfýGýýíü±ü‰ü[ü5üüüüúûüü9üJümü}üü“ü‰ü‰üqüjüGü:ü üüüûûãûæûÌûÉû±ûªû‹û„ûeûaûLûIû0û"û ûýúøúúú÷úôúìúôúëúÿúüú û#û2ûYûsû–ûµûÒûæûöûïûýûÝûÛû®û—ûUû2ûôúÏú•úzúSúNú6úUúTútúwú ú¢úËúÜúýúû)û>û_ûlûœû¥ûÜûñûüMü\üü§üÉüãüþüý&ý.ýFý[ýuý‹ý®ýÉýâýþþ-þ7þ[þrþ–þ²þÆþðþÿ'ÿYÿoÿ±ÿÌÿíÿ3&0úÿúÿØÿÄÿµÿ—ÿ™ÿyÿÿtÿ|ÿnÿ}ÿsÿÿ~ÿƒÿÿyÿ{ÿqÿZÿDÿÿôþ×þžþgþ2þöýÆý–ý_ý2ýùü×üüüVüEüüüóûòûêûçûñûêûóûùûüü$ü6üUülüü³üÅüôü ý2ýQýgýý“ý›ý®ý²ý»ýÁý×ýÏýßýÜýÙý×ýÀý¯ýýxýhýMýRý:ýJýFýUýaýxýˆý¬ýÂýãýõý þþ1þAþEþOþGþKþ4þ0þþþäýÃýšý~ýPýAýýýýýüý ýýýýý+ý+ý:ý+ý?ý'ý8ý!ý5ý-ýEýMýWýnýný~ýƒýzýýwý}ýwý„ýzý’ýý’ý­ý„ýªý„ýŒýsýfýbýGýFýCý2ýDýCý[ýVýiýeýgýZýRý%ýýöüÖüÐü©üŸüƒüiü[ü8ü1üüýûûûàûØûÀûÉû¬û±û¨û–û“û}ûvû^ûZû?û<û0û%û!û&û-û>ûCû\ûRûdûZûaûUû^û?ûEû7û.û/û(û2û/û;ûGûWûdûyûŠû û´ûËûâûïûü4üVü}ü›üÂüßüýý8ý2ýWýHýeýNýhýQýSýFý3ý%ýýûüÔüÆü¬ü”üŠütüuümüzü…ü–ü«ü¨ü±ü¤ü¤üzüwüLü6üüüûÌûÆû£û û‰û{ûzûlûqû`ûmû]ûmûgûrûpûjûlû`ûXûCû=û,ûû$ûûöúâúÚúáúÑúáúÃú³úžú|úzúPúaúdúpúŒúúÃúÕúþúû&û5û:ûCûAûOûOûhûkû‹û–û¶û²û»û®û¦û‹ûxûJû ûïúÎú¢ú–úpújúGúHú!úúéùÜùºù³ùŸùù¡ù¯ùÊùïùõùú!ú&ú:úIú?úCú2úJúJúYúrúŒú´úËúôú ûû+û3û8ûJûGû]ûkûƒû­ûÌûýû$üMürüžü¶üìüý,ýXýnýšý½ýëýþQþrþ•þ©þËþÔþ×þÏþ°þœþxþoþCþ4þþÿýñýÚýËýÈýÃýÇýÖýßýòýþþ2þBþQþnþtþ€þ–þ‹þˆþ™þzþþgþpþPþ_þBþMþ9þ-þ1þþ þóýäýÞýÕýÚýÝýéýòýþ þþ þ)þþ,þþþþ þÿýøýýýúýüýõýïýèýØýÉý¯ý›ýnýiýNýPý1ý0ýý ýýëüáü¼ü”ümü[ü(ü(ü üüûòûìûéûõûòûúûÿûüü üñûñûêûâûëûâûòûóûõûüúûÿûüüüü$üüüüüíûúûüû ü&üBüqü–üÒüüü7ýeýŽý¸ýÝýåýþýïýþýþ þþþþþþþ þþþúýñýÅýôýÕý þ%þTþwþ’þªþÀþÊþöþþþÿÿ ÿÿ)ÿ(ÿ/ÿ5ÿ+ÿ=ÿ?ÿUÿUÿrÿmÿ¤ÿ¤ÿåÿüÿ6U‰™ÁÍØæãæñíÿû*/*J;WWm€­ºÇÐÛ×ÝÑÚÛáéìç ,=PVIDÜÖ¯¥šŒ}†|£¥²º¿ÁÉÃÙÈïßÿíÿ$# ÿñßѪœ~ZAÕª‘‰Œ‡•’¶¨À½­´ ®’žŒ¡‘¦‘‘sbB# ÖÿÃÿ‰ÿyÿBÿCÿ1ÿAÿ/ÿGÿ0ÿ6ÿ ÿÿïþêþÙþÐþÏþÇþ½þÊþ¹þÂþ¹þ¸þ¯þ›þ©þþ‚þuþ^þRþ2þ4þþþúýçýÙýÄý­ýµýý˜ý—ý—ý•ý•ý“ý“ý„ý{ýlýLý@ý*ýýúüñüÖü¿ü¶ü–üŒü^üRü3üüü÷ûàûçûÞûÞûÜûÙûÇûÙûÖûÒûÕûÌû¸û±ûªû§û¥û”û–ûyû}ûbûIû/ûúúÚú½ú§ú’úŒú‰úúúŸú«ú©úµúÉúÊúÙúÒúàúàúòúûû,ûJûYû„ûû£ûÂû¼ûáûÎûóûïûü üüü(ü$üüüüðûæû×ûÔûÁûÏûºûÌû¾û¸ûÀû¯û¯û¯û£û¨û›ûªûû¦û˜ûœû}ûsûZû3ûû×ú™úZú>úúúÌùÍùªùœù‚ùjù?ù!ùùøßøÇø±ø°ø¸ø»øØøæøùù,ù9ù)ù0ùùÿøØøÄø—ø{økøVøEø>ø#øøøå÷Ú÷¸÷³÷–÷›÷•÷’÷°÷½÷Û÷õ÷ø8øMølø”ø§øÂøôø÷øù6ù`ù‚ù»ùæùúDú…ú¡úÜúòú/ûSûŽû»ûîû,üTüüÈüìüýGýPýdýfýZýHý'ýýçü¾ü¥ü‹üxü`ü[ü<ü=ü!ü!ü üýûÛû×û¨û–ûtûjû=û,ûÿúïúÕúÀúÇú¸ú¶ú·ú¸úÇúÉúìúèúû$û8û\û_û{û…ûûû”û’ûûvûaûEû+ûûØúµúšúlú]úBú<ú0ú/ú0úúúíùíù´ù§ù€ùYù7ù ùêøÌøøŠøcø-øøÎ÷©÷w÷I÷÷çöµöªö“öö{öoöaöVö<ö&öúõñõÙõÐõªõ•õqõPõ,õ õâô¹ô‡ôYô+ôýóÏó«ó„óaóFó?óóóûòõòïòâòîòÜòðòðòóó:ó\óoó¦óªóÓó×óûóôOôrô¸ôåô(õbõ«õØõö;öbö„ö•öÁöºöàöÞöüöÿö!÷"÷A÷0÷I÷8÷<÷4÷/÷#÷&÷&÷+÷L÷E÷|÷÷³÷Î÷ì÷ø@ømøžøàøùTùjù¡ùµùÏùÑùÚùÒùÍù¹ùÀù«ù¬ù›ù£ù¸ùÉùûù ú'úEúRúiúúƒú–ú¡úªú°úÂú¼úÐúÕúçúâúõú ûû5ûMûû”ûÛûèû&ü,üeüqü€üŠüüxüƒüiüoüjümü}ü™ü üÐüØüý ý>ýBýTýdýtý{ýŠý”ý£ý§ý­ý°ý®ý¥ýµý¢ýºý®ýÊýËýÙýáýèýøýþþþþþþþúýþùý÷ýüýøýþöýùýïý×ýÂý”ý‚ýFý&ýòü¿ü•üaüOü&üüóûàûÑû²û²û”û‡û…ûuûsûoûoûeû`ûYûXû=û<ûûýúÎúÀú—ú‹úúrúú^ú_úKúAú%ú"úúðùÓùÎù»ù´ùù§ù˜ùšù«ù¦ù¬ù­ù±ù»ùÀùàù÷ù,úQúúµúëúû#û2û û*ûû$ûûû ûû!û/û;ûSûPûfûYû`û[û[ûRûbû]ûsûûšûªû¾ûÔû×ûíûíûðûüúû#ü-ü\ü‚ü®üÝüýý1ý:ý?ý=ý:ý9ý1ý9ý=ý?ýKýPýfý|ý‚ý“ý–ý‘ýšýŒý–ý€ýý~ý€ýxýký]ýOý(ý.ýðüÿüÔüÜü¿üÌü´üÀü»üµü«ü ü‹üyüfüJü:üüüúûåûÙûÒûÈûÊûÅûÎûÎûáûäûíûúûþû üü!ü7ü@üJüZü^ülürü}ü‹üŽü£ü§ü±ü¾ü½üËüÃüÒüÒüâüàüîüçüùüäüóüÙü×üÁü¹üžü üzü~ücüWüDü8ü"ü#üÿû üßûåûÃûÂû©û¬û£û±û¬ûÎûÍûõûøûüü1ü:üOüMüZüeüaüyüpüü{üü†ü}üŒü|üü†ü‘üüŽü‹üŒü‡ü‚üsüeüMü1ü%üöûìûÂûÄû¨û¨ûŸû ûžûžû›ûŠû„ûdûSû=û$ûûûèúìúÉú×ú¼úÈú²ú¹ú­ú¦ú›úžúŽú úžúµú¸úÖúÕúòúâúïúÓúÆú®úšútú^ú>ú"úúúùúùÝùÚùÌù¿ù¼ù¢ù©ùœù’ù‘ù{ù‚ùyùyùù~ùsùyùtù†ùùˆù~ùùyùˆù—ù™ù ù›ù¡ù£ù§ù«ù ù¨ù©ù¬ùÉùºùáùØùúúWújúŽú»úÐúû!û;ûWûyû…û§û¹ûáû÷ûüDü`ü„ü¢üµüÎüØüåüñüñü÷üñüúüôüýýý&ý$ý>ý;ýOýHý\ýTýYý[ýZýjýdý~ýtýŽýˆý–ý•ýŒý‹ý~ýuýpý\ýYýIýKýGýOýLýVýMýWýJýOýBý@ý2ý.ý!ý-ý"ý/ý(ý7ý2ý@ý@ýCý9ýBý?ý8ý<ý2ý)ýýýóüçüÌü¬üühüBü%üþûæûÉû¹û˜û¡û|ûû[û_û'ûûäúÃú›úZú@ú÷ùØùšùqùJùùúøÏø­ø–ø{økø]øOøJøFø?ø9ø=ø>øMøZøqøŠø¥øÆøãøù ùPùlù”ùªùÑùØùúú*úLú[úoúúˆúšú ú§ú»ú§ú¿ú¿úÕúîúû*ûFûnû‚û¼û½ûüûüFüNü€ü˜ü½üÔüìüñüúüüüýüüýéüäüÛüÍüÈü»ü¢ü¦üzüüYü?ü.üüýûÝûËû°û¡ûûjûPû1ûüúÜúúúXúNú6ú-ú#ú3ú<ú>ú5ú2úú0úú1ú-ú;úQúbú€úŸú±úØúãúûúûûû(û4û/ûZûaûŒû¨ûÔûñûü%üKüMüvü“ü«üÜüý2ýqý¦ýáýþNþ{þ¶þáþ ÿ=ÿpÿ¢ÿÑÿ1o›Áø:Jg‰ ¼ëIu£ÒéÿóàÓ»°£š†ŠmykkgNT>@*2þöåÅÁš‚W(ì§n+ëÿÆÿ—ÿÿsÿÿ‡ÿ”ÿœÿÿœÿ¡ÿŒÿ‹ÿYÿVÿ0ÿ)ÿÿÿ ÿ ÿÿÿÿ ÿúþçþÍþ®þ‡þeþ<þ+þþ þþýý þþþþ'þ(þ?þAþXþJþ\þPþMþ<þ4þ!þ þöýíýÓýÒý¹ý»ý¦ý§ý¹ý¯ýÅýÇý×ýéýúýþ!þ(þOþSþ„þŽþ³þ»þØþØþîþóþÿÿGÿDÿwÿtÿ¢ÿ£ÿÆÿÒÿèÿÿÿ"*;VSg^e^_Y`Zdx|›˜ÁÌâü '+AVs…­ÂÜèóèÝÔ·­‹zT9óÒÀž‰p`VIH@D9AD<;5/)06&?-79%,ñÿøÿãÿÛÿÓÿÍÿÈÿÎÿ¶ÿ©ÿšÿŽÿqÿpÿRÿ<ÿ2ÿÿÿôþÜþÔþºþºþ¥þ¥þžþ¥þ¡þ·þÏþûþ"ÿ]ÿŽÿÝÿj£î(u¸ö<g®Çû')E16+ ðèÄ¿qS6öÆ®|uMZ?;<3."óûÚÓÀ´Ÿ—‹‚mpUPE/. -N\Ї¿Úù"F`°Ô÷?h‘ŸÕÖùû ).:BPOUI;1 ÛÜ¥ rg?7' &0Uk‘ÅæC}­Ö (\p¡·×åùýúëíÚÒÅÁ¬·®¾ªÅÂÒÙñï@6fo…’’ ž¯²ÅÍÜô   ãÞ¬·›¨¢­§°¢œŒmW0ýíÝäÕïàêäÈОšjiDCLFikœ¥ËÏëçñóîù(CYg}jcG&Ñ­zS, òÛÁ›~O?þ¶:úÝ΢XRSAW[^Z_agciV/ùÙÁ¦ŠlL,ûÿìÿßÿÌÿÊÿÅÿÎÿÌÿÚÿáÿöÿ*#5,/#ÿÿóÿÞÿÚÿ·ÿÅÿ˜ÿ¢ÿuÿfÿXÿEÿCÿEÿDÿPÿAÿ[ÿZÿ\ÿÿ‰ÿ¨ÿÅÿØÿ51L\kŠ–³ÏÚñû&8/=O]l‹ªÓ&NWry“›››œ¬Éâ>m{“»´ï÷÷áḬ́ȻÒ×ÿú@J¬øHˆ­èLs¤Íò1P[phwcscn^hbgmclhbgTP=8ÿ÷ôÛÖ¾³¢’‡rlSJ/ äéÃǰ¹˜œ€–u…k_TE;*' øãÄ©ƒmK&êׯ¦whJ(óÛº¢~eK2üôåÚ̸¶£Œ]T4 繕~[F%ðÿéÿÈÿ¿ÿŒÿvÿJÿ(ÿÿþÐþ¤þ`þ4þéý·ýxýLýýðüÏüªü‹üsü]üGü4ü2üüüýûüøûíûúûáûïûíûòûñûýûéûøûâûèûÕûÔûÈûÅûÁû¼û²û·û­û«û£û¢û”û’û‘û†û˜û•û©û°ûºûÌûáûü4üKü“ü«üõü&ýuý±ýöý7þoþ´þàþÿ<ÿfÿ|ÿ–ÿ¢ÿ¼ÿÆÿØÿðÿúÿ-P_Ѝä P‚Çò=\—®ä$LXƒƒ¶¾äî!?Hij}ДІ|gY6÷ƹ•{nzq…{˜’­­Á¾·Å­¬˜Ÿ}ŒkpSG.óÔ±”eM%õÙȤ´Šš‹‹–Ž« ÅÅó"CRfgt`hLG6# ïëÑÎÀÀ¼´·°¹¯®³¨±­¥š“{}_YXKQWXeftv~€ ™Â¼àÞöîÐØŸ¦xljTio‹¦ÉòARly|˜—Ä·ÚÝàáÕÆª¤€ƒcfec}˜¤·¾ºÅ¤µ•œ†‹xxh]Q3õdz‡ziYOL=C.5%- (#)7BWn®Îø <Pl‹„¯­ÅÆÝÌè×íÕðß÷  ÷îøõð÷úôüìëÜÈ·¯‘‹s]VFC?74$$ ïðáåìÚóÚæÚÔÖÚÛåíö "2DVZZYQWSORPY_gyt‡~†}†‹ž²×ì#>j‰¡¼Ð×çêíæíÐä¿Ø·»™qsKA)  ùó×˵ ™wwNS5:ýðÖßgR/    !$öíýîòôðýû ðæÕÁ¦¤Œ}Œ…€‰xy†Šž´Åïý*4Q^gvg|gqmdqoŠ~wiT:!øÞÖÔÑéæ%/T]ˆ“ÈÏ'5DZ`ts‰‰›²Ã÷ ?]¥¸ÛÝÿþ#E?dl‚–¢£¢ž¤—©œ¡œœ–‘‚dOþ¼ p`39óäxI'çÏ¡’x}h€o‘‚‘”•›®¥ÉÈø%>D\VT\KaVl}’µÉåCPtƒš±Çãáõîñ÷áçÑͲœ‹ui‚o{kmZI/÷åµ w\W*=*7HPlu{ˆˆ‚itccX\JaHWSbmx‰Ž¥¿Óìö ûàѽµ¢ˆ’Ž¡»Óæ ,/@/1-%"&3C1?<:>03  òþø    &$:7MFceˆ°¼Ó×äÕÐÆ¯¤‚wWE.üçÚɵ®›“……{Ž” ¾Ãßêþö3Qi…¦¿æø ))@BGQLb]rzŒ——¦˜ž™‘–‘£²Éê5Rr™¶¿Ûßöü   àã­ªoiJM3:(éßÏÇ»ÈÁÙÙëßëåäæÞßâáïù2?YPfYYZBRITbl“–ÂÅÙßìæíÞÚк²‹}M8âžw0 ͯ{lNC6*÷áÖÀ¿ªŸ–ŽŠ|nVH)øåÏÀ½¶»ÍÓéÿ $!$$>Lj‹˜À½ÑÖÞâáÞäâñ*Lb€€¥’‘ruNN@ô⸗a<è²°u„]`USPNJVIciy™´ß 6`Š«ÑèûýüìîÐÇÌÔÞ)Pao€ ©³¹žŒc^+0èì§«Œƒ^F/ñÑÍ¢´‰ŠjMX2-'ïõöïîêãàáÑÔªªšŒ…f]?3'+2Ne¤ÇÕõ )"C@ls“¸Ñå2?>L& üÛÅ©|Q:"úõãÛßÆÕ˜ŸŠe`S31ñÿðÿÎÿÓÿ¹ÿ´ÿ¡ÿœÿ‡ÿƒÿzÿ‰ÿ‡ÿšÿ™ÿ¢ÿ¯ÿ«ÿ¸ÿ»ÿÀÿÅÿÛÿÙÿõÿîÿ   +1>PYbmh{biQFC%/úÿùÿÜÿÕÿ¾ÿ¼ÿµÿ®ÿ°ÿ¡ÿ‹ÿ‰ÿ‰ÿ…ÿÿyÿqÿoÿbÿUÿ?ÿ$ÿ!ÿ6ÿ9ÿ*ÿ@ÿÿ,ÿÿ ÿòþöþëþÿþÿþÿÿ4ÿ7ÿ_ÿSÿ~ÿ…ÿ”ÿ©ÿ¹ÿºÿÓÿÞÿùÿýÿ)5>SQ][`Ymo„‡ŒŠ|…ckPE4' æÿÿÿÛÿàÿÄÿÀÿµÿ·ÿ¨ÿ«ÿ}ÿ~ÿ^ÿxÿ\ÿsÿUÿLÿ>ÿ4ÿÿÿÿÿ)ÿ9ÿCÿ\ÿmÿ™ÿ¿ÿâÿøÿ3PoŽš¼¸Õ×áìî÷üýõçéõùôþó ìþãßÌÀ¢’}tZN3õÿÜÿÙÿÅÿ¾ÿµÿ¯ÿŸÿœÿ‡ÿ”ÿwÿ‰ÿqÿÿdÿeÿcÿ3ÿ>ÿ:ÿ^ÿXÿ†ÿˆÿ°ÿ°ÿÕÿäÿøÿþÿ 9=K^ayƒŽ¡˜£’}gR/àÿÖÿÿ¬ÿ~ÿ„ÿeÿMÿAÿ(ÿ-ÿÿÿåþ÷þëþþþÿÝþàþâþòþùþ ÿÿ!ÿ$ÿÿ(ÿýþüþ!ÿÿ(ÿ!ÿ!ÿ"ÿÿÿÿ ÿûþõþÿôþÿôþúþßþôþùþÿúþÿÿÿÿ+ÿ2ÿ3ÿ8ÿLÿKÿ]ÿ\ÿmÿvÿÿ”ÿ¤ÿ›ÿ´ÿ¾ÿÛÿØÿðÿ úÿðÿÚÿÖÿÎÿ»ÿªÿ…ÿfÿBÿ$ÿ ÿÜþÓþ—þ‰þkþ_þ7þ4þþ%þþþþôýðý×ýÔý«ý¡ýŽý–ýƒýzýqý_ý;ý4ý4ý.ý!ýýýýý>ý?ýdý`ýiýý›ýµýÇýâýÕýðýìýôýäý÷ýëýóý÷ýþíý÷ýÜý¾ýµý©ý›ýˆý‡ýQýHý.ýýüüÛü¿ü’ü|üGü(üúûàû¢ûŠû^û/ûûøúÞúÐú®ú ú‰ú€úYú<ú<ú"ú'úú!úúúúúúúúúúúùþùýùýùúú4úYúrú¬úáúüú7ûNûxû ûÁûèûüü4üVü‚ü€ü¿ü·üÕüãüüüýý)ý.ý8ý;ý=ý@ýLý_ýqý€ý‚ý‘ýŽý²ý§ýÀý°ý¹ýÀýÆýÒýÜýÛýëýøýùýþþ&þ*þ/þ6þ)þ'þþþØýæýÏý¹ý¯ý˜ý‘ý‹ý|ýtýPý,ý ýåü¾üüvüdüOüCü@ü6ü?üJüVügüfüfüUüUü+ü%üüîûÚûÇû³û ûŠûpûgûSûSûIûKû2û@ûû3û û!û!ûûûû ûüúæúÑúÂú²úœú†úrúWúFú1ú"úúþùìùÝùËù°ùšù}ùXùDùùùäøÃø•øXø?ø øøÒ÷Î÷ ÷«÷Ž÷œ÷—÷Ÿ÷¨÷»÷Ä÷Ö÷á÷Ý÷÷÷Û÷ö÷ø÷ú÷ø ø'øø@ø4øDøFøSøhøføsøsøqørø}øŠø‡ø ø¨ø²øÁøºøÏøÕøÝøéøêøßøéøöøùùùù ùù ùùùñø÷øØøÕøºø½ø¦ø£ø‰øpø_ø<ø1øøø÷÷÷÷ä÷ê÷à÷×÷Ó÷¹÷Ä÷—÷¡÷m÷h÷(÷4÷÷÷÷÷ ÷øöÿöõöáöÙöÅöÈö«ö¶ö—ö£öö¡ö¡öŽöö|ööuösökörödöö€ö¸ö³öÖöãöîöûöøö÷þö ÷÷*÷=÷[÷d÷‡÷†÷ª÷²÷Æ÷Ì÷Í÷Ù÷Ú÷á÷ó÷øøøø)øø'øøøô÷ò÷Ï÷Þ÷Ñ÷Þ÷Ð÷ä÷Ò÷ä÷â÷Ö÷Ê÷´÷§÷”÷ž÷¡÷²÷Ì÷ë÷ø;ø^ø‹øªøÐøäøù$ù7ùQùrùùÃùÚùúú@úOúfúwúúyú‰ú‰ú“ú¥ú¬úÆúÆúæúÐúñúÔúæúÊúÆúµú°úŸú§ú—úŸú—ú‘úúpúhú1ú úÚù»ùwùVùùùãøÚøÆø¯øµø—øƒøpøBø3ø øé÷È÷²÷‰÷÷_÷F÷2÷÷÷âöÇö’ö€öFö8ööøõÖõËõ²õ¬õšõŠõzõ[õHõ!õõöôçôÕôÐôÈôÎôÍôÏôØôáôõõ7õWõ^õŠõˆõ¹õÂõáõéõóõ÷õùõööö öòõæõÕõ¯õ¬õsõcõ3õõæô¯ô“ôrô`ôYôOôQôQôRôTôJôKô@ô<ô7ô;ôEôUôhôô¦ôÈôïôõ5õJõeõsõ|õuõmõRõLõBõ9õBõ&õ8õõ%õõ õõõôÙôÊô©ô”ôxô_ôFô+ôôôñóíóêóëóôóôô#ô:ôDô„ô”ôÒôéô õ6õIõ…õ˜õÁõÂõÞõÑõãõÝõÞõÎõ¬õ‰õcõ/õ õÍôžôpô6ô&ôûóðóÙóíóîóô>ôuôœôÊôéôõõõCõLõkõtõõ‘õ«õªõ¿õ¾õÞõÒõèõãõèõãõÿõ öö?ö5öPö0ö<öööÌõ¸õ‘õVõCõ(õ/õ#õ9õEõQõRõSõJõKõAõ:õ?õ8õTõ`õvõ†õ…õ|õwõqõbõQõ+õõãô¶ôœôuôiôJô3ô%ôýóîóØóÃó½ó£óŸó­ó´óâóô?ô€ôŸôÝôõ0õWõqõ†õõªõ®õÃõÑõÛõþõöö0öAöKöjödö…önöŒövöököiö[öSöJö0ö öÑõ”õdõ õëô¦ôpô1ôôóóÜóÜóãóô0ôfôŽôÄôâô%õ9õ{õ£õÕõþõ+öOö~ö£öÊöäöòöêöïöÉöÆö”ö‰ö^ö%ööÅõ½õŠõ|õdõGõ0õ'õõõ õôôìô÷ôíôõõõõøôýôÝôçôÊôÌôÌô×ôõ õNõ]õ—õÊõö>öyöŸöÙöøö0÷V÷y÷›÷¾÷Ñ÷ì÷ú÷øøøù÷é÷Ë÷Ä÷£÷£÷‡÷„÷o÷Z÷X÷1÷9÷÷÷óöñöÜöÜöÌöÔöÈöÎöÀöÉö¼ö©ö öˆözömöOö8öýõàõ³õõmõNõ&õõÞô¡ôŠôGô7ôûóìó¬óšóZó7ó óÓòÀòò‚òbò\òKò[ò\ò}ò•òÅòóNóžóíóJô˜ôôôKõ–õÕõ öIöö£öÃöäöùö÷"÷%÷@÷?÷Q÷P÷L÷D÷9÷-÷÷÷ ÷÷ ÷ ÷÷)÷6÷A÷O÷I÷W÷J÷Y÷K÷N÷U÷T÷c÷j÷t÷x÷‚÷”÷÷°÷½÷Ì÷Ü÷á÷ý÷ê÷ ø øø,øø8ø(ø8ø9ø;øHø\økø•øŸøÏøÐøòøëøîøáøÜøÀøÁø–øœø|ø„øtøqørø^øpøLø[ø7ø3øøø øøøø)ø5ø]øeøø‘ø¶ø®øÁøÁø¾øÏøËøÕøãøáøýøÿøù2ùFù[ùrùxùù}ùŒùoùfùLùAù*ù"ù ùù ùùùùûøùäøìøÂøªøŽøbøQø&øø÷÷ñ÷Ô÷Ï÷­÷¬÷‰÷y÷\÷.÷÷÷öùößöØöÔöÅöÊöÈöÌöÙöÞöíöôö÷üö÷÷)÷÷0÷(÷/÷-÷:÷6÷B÷@÷A÷9÷$÷÷ùöîö¾öµöqöMö!öýõßõëõæõööDömö£öÅöÿö÷4÷F÷`÷i÷}÷|÷ ÷’÷±÷«÷³÷¶÷¼÷º÷´÷©÷š÷—÷Š÷Š÷s÷€÷h÷z÷u÷~÷ˆ÷Œ÷÷ ÷³÷¼÷Û÷õ÷ø*øXøVø…øtøøøžø±øÁøæøúø,ùSùù¨ùåùøù-ú/úSúMúNúCú?ú2úúúúþùüùéùÚùËù¼ù®ùùùŽù{ùƒùzù‰ù†ù™ùŽùùˆùxù|ùhùaùMùIù:ù0ù-ùùùöøüø×øØøÃø°ø¤øø‰øwø‚øzøø‚øø“ø~øšøtø‹øcøtøGøYø#ø/øøø÷Ù÷¿÷ª÷–÷„÷t÷[÷P÷-÷7÷÷÷ööûöíöðöóöúöýö ÷ ÷ ÷ ÷÷÷#÷÷÷÷ ÷÷õöóöãöæöÖöÔöÏöÏöÊöÌöÆöÌöÛöäö÷÷5÷ ÷C÷!÷÷õöÈö£öiöDööôõæõÖõðõñõöööö ö öàõºõ…õIõ1õõõõõõ5õ4õaõHõOõ5õ#õ"õõ2õ>õ[õmõ—õ«õÇõæõØõìõÇõ§õõLõ:õüôæôÂô¯ô‰ôyôTô.ôôâó¾ó¤ó‹ó‘óó©óÅóêóô7ôLôVôQôQôBô5ôôôô ôôôôô&ôôôîóóóÌóÔó³óÅóÁóåóòóô$ô2ô>ô<ô/ôô ôéóîóÞóáóãóêóíóûóùóôôôô/ô_ôŠô½ôôô+õ`õ£õÊõýõö/öEöOö`ököxöšö¶öáöùö÷÷÷÷þößöÓöÀö²öªö°ö¿öÌöóöûö÷ ÷÷þöäöÒö¿ö¦öööƒö{ö‡öö‹ö‚öqöxöcöbödörözöŽöµöÔöÿö*÷J÷a÷h÷`÷g÷Q÷E÷?÷÷÷ðöÖöÊö‹öpö>ö"öñõÝõ¯õ™õ‡õ•õõ²õËõòõöDölö|öö‘ööŒöŠönöröUöUöZöcöpö‡öö­ö»öâöèö ÷!÷6÷W÷b÷‰÷–÷Ã÷å÷ø1øfø€ø ø¹øÎø×øèøþøùùù-ù ù)ùùùùñøÔøÃøšø†øføXøEø0ø>ø"ø?ø-ø;ø:ø5ø<ø0ø$ø"øøø øøû÷ý÷Ý÷Ï÷´÷’÷y÷\÷A÷3÷0÷,÷1÷=÷6÷?÷-÷1÷#÷÷þöÙöÉö²ö³öªö¶öÅöÕöïö ÷÷-÷*÷?÷)÷A÷F÷]÷÷ž÷Ë÷ï÷ø3øNøUø]øOøVø:ø4ø.ø&ø.ø0ø=ø6øLøEøHø>ø5ø#øøøøø÷ øø$ø?ø:øWøMøMøMø7øBø>øDøUø\ø{ø„ø¢ø§ø´ø«ø½øžø³øšø›ø™øŒø•øø‡øuødø`ø9ø2øøø÷î÷×÷Ö÷ã÷æ÷ÿ÷øøøøøí÷Æ÷·÷Ž÷€÷d÷[÷Q÷X÷_÷w÷~÷›÷ª÷½÷Ð÷Ô÷ñ÷ó÷øø5ø>øKøLøVøHø9ø-øøó÷È÷®÷‰÷f÷L÷4÷÷÷üö÷Êö»ö°ö—ö°öµöØööö.÷P÷‡÷Ö÷øRø—ø¿øäøÓøÂø«øø^ø;ø&øð÷Ð÷Ê÷¯÷¿÷Í÷ë÷÷÷ø!ø-øGøVøxø“ø­øÊøãø÷øóøùùùÝøÎøøbø$øÚ÷Ÿ÷U÷2÷÷éö×ö¾ö©ö¢ö–ö¡ö™öšö”ö¨öªöºöÍöÓöÄöËö×ö×öÛöÛöàöÔöÔöÑöÌö«ö§ö öœööŒö~öoö]ödöQö[öTö]ö^ö_ösözöˆö”ö™öžö¦ö¥ö·öºöÑöÙöôöûö÷"÷#÷;÷4÷O÷>÷Q÷P÷T÷U÷[÷^÷h÷]÷`÷P÷<÷,÷ ÷øöÆö­öö‚öröaödöOöTöDö<ö$ö/ö"ö1ö4öGöRöhöwö’öŠö¹ö¥öÊö¥ö­öˆöuösö[önöRöyösöö¯öÜöùö"÷F÷h÷‡÷™÷¯÷»÷·÷À÷«÷­÷…÷‚÷V÷L÷!÷÷üöòöööçööößöòöåö÷ýö÷&÷4÷C÷D÷J÷J÷T÷^÷u÷ƒ÷š÷´÷¾÷á÷ñ÷ý÷øø*ø.øøøô÷ã÷·÷­÷‰÷v÷d÷M÷N÷I÷X÷b÷~÷‹÷»÷Â÷ øøVø|ø¯øÖøù*ù-ù=ù>ù;ù=ù5ù4ù%ù-ùù(ù#ù&ù6ù>ùJùZùlùqù‰ùŠùšù¨ùÃùØùðùøùûùÿùûùñùøùÛùíùØùáùÑùÙùÜùáùùùøùøùüùæùïùÕùØùµù°ù’ùƒùnùWùMù7ù(ùùùýøÝøÐø²ø£øˆønøYø=øøÿ÷Ý÷À÷¤÷˜÷ˆ÷”÷Š÷¦÷·÷Ó÷ù÷ ø8ø8øRø\øZøaøgølø€øø™ø¨øÅøéøùGùjùvù€ùù„ù{ùXùPù2ù'ù&ùùù ùù+ùBùOùaù[ù]ùMùUù@ùCù5ù3ù;ù3ùLùgùtù§ù·ùÔùÚùñùóùú"ú6ú<úFúIú<ú?ú+úúúúýùíùîùøù ú úúúúú(ú'úúúåùäù»ù¯ùùùqù_ùRù6ù%ùùùîø÷øöøù ù!ù9ùIùsù‚ù‹ù–ù–ù¤ùù¥ùŽù¡ù‘ù—ù˜ù~ùŒù‹ù|ù“ùtùŽù|ùù€ùyù€ù{ùŒù}ùŠùiùzùWù[ù>ùDù ù+ùùùù&ù-ù9ù;ù2ùCùEùSùUùRùaùRù`ùMùEù4ùùùýøÏøÔøµøÂøºø¶øÉøËø÷ø ùNùVùzùˆùù¥ùÄùçùüùú;úPúrú{úžúžú®ú¹úÀúÃúÁú¾úÅúÈúÒúæúãúðúøú ûû&ûBûIû`ûuûû£ûÄûóû.üUü üÀüþü$ý<ý^ý_ýqý`ýbýDý2ýýöüáüÀü·üšü™üƒü€ümüpüXüWüCü?ü6ü6ü/ü=ü5üHüFüWüIüMüEü/üüúûÛûÃû£û“ûfûMû2û5û'û/û1û)û0û)ûûûùúßúàúàúÏúÝúÐúÚúèúçúûúýúôúûèú ûáúòúÉúÍúºúÊúÆúÖúÎúÙúèúéúþúûû9ûXû{ûªûÛû üJümü üºüÞüäüýúüðüäü·ü­ü|üküBü,ü üñûßûÆûÀû¯û°û¢ûŸû¢û–û£û™û§ûŸû®û°û¹û¹ûÎûÐûòûü0übüüÄü ý3ýý¹ýûýþIþYþdþaþYþGþ8þ"þþþþýþþþ þþ2þþ2þ+þ)þ#þþþþðýáýÍýÊý­ý±ý“ýŒýoýeýHý;ý*ý0ý.ý9ý:ýDýEýTýSýXýGýWý<ýJý7ý:ý%ý.ýý ýîüÒüÁü–ü~ü]ü4ü!üóûöûËûËû¹û½ûÁû·ûËû·ûÈû¹ûÅû¼û¾ûÅû¸û¿û¸ûÀûÃûÉûÆûÒûÑûÝûåûíûýû üüüüüûüûÝûÛû¹û±û•ûûuûZû7ûûûìúôúéúèúëúøú û)ûDûjû‡û­ûÁûàûïûòûüü>üNü‰ü¤üëüýGý_ýtýŠý|ývýcýIý9ý)ý,ý*ý@ýNýlýƒýžý­ý½ý¹ýÃý¹ý½ý»ý¼ýÃýâýïý.þ:þ|þ|þ¼þ§þ¿þ¯þ°þ»þÁþäþðþÿCÿmÿ³ÿðÿ+w¤èD^š¬ÆÑæèìñåÙЬ˜‘s†~”§Åëý!:03îÔ²Ž|_YLAC+Ὧ„KMíÿÖÿÿnÿ+ÿêþ¶þWþ%þÔýžýpýPý8ýCý;ý]ýfýƒý›ý¦ýÈýÏýßýñý÷ý þþ%þ3þ@þBþ@þ>þ2þ%þþþêýãýÅý½ýŸý‡ý„ýyývýtýbýdýSýRýRýFýHýDý=ýAý&ýýýçüÎü´ü‘ü„üsügünütü„ü–üŸü¶ü²üÖüÙüúüý!ý:ý]ýýÁýæý/þUþ“þ¹þØþòþÿÿ ÿíþöþÛþÕþÚþÍþàþîþúþÿÿ-ÿ*ÿ=ÿHÿCÿRÿ=ÿ7ÿ&ÿ$ÿ ÿÿ ÿÿúþèþ×þ½þþþOþ9þþïý¸ý›ýmýFý*ýòüÙü¡üfü-üàûªûjû8ûûßú°úú}úfúkúZúfúIúLú>ú1ú(ú+ú2úCúcúrú ú·úìúû6ûMûvû—û«ûÐûÝûÿûü-ü&üDüMüQüeücüyüzü‡ü üžüÂüÁü÷üúüý9ýUýný†ýý ý™ýªý§ý«ý¨ý¤ý¨ýšý–ý}ýtýYýMý?ýýýóüôüåüíü÷üý$ýZýpýœý´ýÏý×ýâýðýæýúýíýþþþþþþþçýÑý˜ý\ý ýÝüžühüOü ü üðûèûíûßûîûÙûÞûÏûÏûÇûÝûñûüJüdü¨üÔüýü0ýDý^ýfýuýoýzýyý}ýuý}ýqý`ý\ýJý0ýýüüóüÖüÕüËüÆüäüÞüýýýýýýðüßüÒü×üÓüæüûüý2ýBýSý|ýiýýŽý©ý¾ýùý"þNþƒþ®þãþ ÿ7ÿYÿoÿÿ‘ÿ©ÿ©ÿØÿØÿ#-z‘Óß$FZx‘«±æð -.-,!JjŒ¸ë?nz¦ ¯­Ÿš‹q`:)ßÓ†[) Ýͼ°´°¼³¼¯¥¡w^L15,,* ùôîóÿ%2Sej|„~“„˜’“šž™Â¸ÎÐÌ˺ǻ»Íï?}«åN}³Îû'-QRitw“‡º¢¹ÂÃÄ訵™¡~ƒ^E0 ýãÎÁ¬¤––„•—¦©ÀµÂ¶´–Šye`[Z[jou‚‚‘ˆ…v\\,1ãͰšt`*ßÈ«š‹…xƒ~vŠqˆevcffdglnx|{|tiM;öüåØÎ¾¬–iQ:/öÿþÿéÿðÿôÿûÿúÿöÿ,1I_ެ¶ÆÅéâÿ#!:EP\q{“ž®¸ÅÎÖâåïîùóÿ 19bt“ºÚû,J]o€’›ªºËÐçî 09C=I0(òáÆ¨‘lM*ðÏ¿­£ª¦¹»Ì×ïü -*>=T`p‚Š“Œ…wtj`XTC?0 çÚÁª™…€p[ZNE<0å˦‰pJ;÷ßÛº´‹‘sm^LB"#ïÿãÿÁÿœÿÿ\ÿ\ÿ2ÿ)ÿÿ ÿÿ ÿÿÿ*ÿ/ÿ9ÿ3ÿ7ÿ+ÿ+ÿ(ÿ(ÿ)ÿ ÿÿ ÿÿíþÙþ·þ©þtþiþ<þþþÕýÏýªý™ýŠý~ývýzýwý}ý…ýˆý¤ýý¹ý­ýÃýÎýÍýèýâýõýýýþþþþ1þ=þSþaþoþyþ”þˆþ±þ®þÒþ×þñþóþ ÿ ÿÿ ÿ ÿÿ ÿÿÿ#ÿ5ÿIÿ_ÿÿ‘ÿ·ÿÒÿïÿ+CDqm™¯×ÿHS|~•Žœ¥´Å×Þý'6'7'& ïÞÍ«¤ziI9&  3&5.+ úñæÑٺī¥}eM8ûÿðÿ 53NRarƒ¡ºÞü;Zpˆ‘¤¯ÁÍÙáùéêóèáÓà‹rM/ ìî†vVJ9867RHegˆq†sq‹¥¦Æ¿ÊôÞ èìÝÈÁ®š’yul_]CE8D:B6<@^\}x›’¡‡kof|…Œ­³Úäö÷ùÿýòÒÉÁ¤ š†Št~popgurˆ’®Èßö9Jcx”«áü:Kƒ Åî!êäÌÇÊÐÉÏÊÃæã(9Y€¥Êù-;7(øß£€6ó ô÷çÜ»µŽ‘rmlm|Š‘­Ÿ¹¥ª’x|ieea`tr‚…}†‰ ”¬´¼ÊÁ¾ª¥Œ†n]AA ýÜÔº±ŸŽ‚pzm†•³ÄüJw©Î(V{˜µÕØþö:?OYWkT]NGK>IN^v•§Ëéù!4-@5;277@BHQJK:(üñÏÄ­¡•–w‹m}md_K6.íÖ¾©›oJ9ââË´·£µ±´¿µÌÆÒÍÖÈÝÏäã -<M_VfLA!íêÁ·•ƒ\;ôØ«`?Ûѵž…bR:Éÿµÿ“ÿ‰ÿ‚ÿÿ„ÿƒÿ‰ÿˆÿÿ’ÿ–ÿ¦ÿœÿ¬ÿ–ÿ«ÿ’ÿ£ÿ›ÿ¤ÿ©ÿ¹ÿÆÿÇÿÞÿÖÿðÿ 35^{¢Ïû7^—ºí/hn£¯âó$:s¾ä$5WPtiˆ€žš¯µÂÀÍÒÕÚÜØèéîÿü &A9A<1!ñËÄ’feLD-7/$&%+(3/CJTgd|ux…oq[X?5 çÌ¡ rqL=åõÉݺӶͿÎÿ¿¨­‘‹wT>òØÀ¨˜~wgL\+42*KNfp|z„”š¢¶ÎÔûøôÜÍÀº¼¹ÇÅÇÎÃÍÁ¾¿®µ«¬­¯¼¦¶˜“jHä½›xZ?' ðÿ×ÿ¸ÿ¨ÿ—ÿšÿÿ”ÿŽÿ—ÿ–ÿ£ÿ ÿ·ÿªÿ»ÿ©ÿµÿ±ÿ­ÿÇÿ²ÿÔÿÈÿÜÿÜÿÖÿÕÿ»ÿ©ÿ„ÿdÿ<ÿ ÿíþÁþ³þ þþœþ‰þ¬þ§þÍþäþ ÿ0ÿ^ÿ—ÿÒÿV™Ü K|§Úõ,EJWW_YYTKI;2" %"%!1.?M_ƒ·ÇÝööïãÎͬ´”„lpS_SVSWD\@\<G)26>Yo€—šª­¿ÇÕàðó÷÷äæÔÏ­¢›Ž‘€€{w~|Šœ§ËÜ)Ut•ŽysP?-þíØÄ¹‘‚VJáãû¬£’‚nL/þä·•qeN@A+0"6Pƒ¯ê%[ŒÂá.VoŠ«Ðê+^jœÇÁÜåê÷ 63:4(3.HTQb][dSXJC<!#ûûÔ•xM2ïÌÀº¬Ã½ØÝòþ45_Unq€}Œ‘¢®ÊÚõ$-HSbpu“šÅÚ%K€¯×2<KGODQD?@&üìÀž{L6ôÚÿž¤…ŠtqXV;5'ùöÜÔ°ª›‘“†ŠŽ‘‚‚|z|‚ƒ“ž¨²ÈÉàÙõí 4@KZcckgXYBG-#÷åÀ¢sT0 ÿÓѱ°Œ‰kj_RXKTYew‡£¶Íã÷$7DQstž¥ÈÎæáíêøö ÷æÝ¶°vk:* çݺºª™“Œ‡~Š“šž±³ÊºËÇÓéêþþù,>>IYSx_nlupokh^]WMP@UFcRpdov_sboqouqohZP0+ þêöñ÷CUsƒŒ’ql=>äÕ¶«}\N9&:;I`EW-$ÿúþ />iw|‡‘š¶¯ÓÂÔÖÚÜÖÙÀ³Ÿ€lB ø×À£¡~km[ngx‚•¤ºÓê=^zšÀÒö &6Gaoˆš¯Ì×ùÿ &+9<=H@MKUgyž¸ÃÔçáðîáîÖÛÉÀ·›„‰y{qryhyU[@.þÛÂ’oB-éÛʶ­”ŠecL@-.ùìòæïïø9Ig¥Ïç$<Wg}‘«¸ÎÛÞîåäæÖÞ××ÎּˠŸˆxqb[^Yhhy‡šª¹ÇÍÏÓÅĦ«ˆ‰jaD.öÙ·™sK%ïLJVâ±}Y2 ëÿïÿÉÿàÿ×ÿìÿòÿO\£±ðK\«Þñ(VVŽ™¾ÓÛôííßÐȰ¬™Ž€vlRW>7'  'BKp‘¦×è /3LcoŒ¼ºÜñô '//641+-'ù÷ìòÛéÕâÍÖÊø©¢¤¡§¢­¥¯ ™ˆspNL&üíÓÌÀ¯¬˜š‡‰{vfWW78  ÜϪšƒpfLL68$öñÏɤ¡oT" úÿ7'7BMBXD?QJZQdnqŒ°¥Ðä'3rÂÙ Od”¸Ñù&2?Oeoާ²ÆÔãäþ*%033KHcdy‡©¾Çãï")RAjLXI44 ÖÓ¦Œg@!âɳŸ‘”|‚„†‘’œ—›¢—¡£´ÂÓãëûþ   òâÚÁ¼­¡¢œ«£±¢§œˆ{gLP9L?S^crsrƒz}|yx}zƒ¦©ÌÆíê /7HO\[e[_VU\]gprz{yujdZ[MRVJjWxrŠŒ‘Ÿµ½ÏÓìõ?9MFC;0% øûéêØÒ½ÅŸ±‰—x}ZS?(ïÜÜÉÙÆÎ»Æ±®¤¥©¥Â»ÛßíöüÿüóëãØÎ¼¶¨®–¢‡‹nqMX<F;<75.+* -$B?RYglvz{}mkM@$ ýîÜк»£¥š“•‰œ“ª¦¸©ÆÁÕ×èèúü(,;C?C@09ñÚк°ž€pi`ZKO'*öæÁ·¨”™‡›šžžŸ “{bcEE+5% ö åñÙäÒçÔìÜèåÒçÒæÙêìü &@7IURhehkjw’›±¹ËÚçõø+)9.>)>->5*4$ ÷öûñðûøûìÄÕ¼Áñ¾©¹¸Â½Ãµ³—ˆ_L'÷æÃº™‰xdiWYMGD8C-?1?>FTWuw”™°ÆÖõ 2Q}ªÑ@n­Ì:^\yp…|†}†zzcVG<31()4#D$G:\Ymt€†š¢®ÇÎßðø*)=ESYdjsegLE3úèãûž~wf\GðôËÙ¤‡ŒgL ÈŸ}ee>; ööíåèÝäâÜÛà×èâõêûýÿ 41B(Ns‘Ãï<o•¤Òê/RZ}ƒ©»ÈÚåø÷ûþÿïñØÊµ§”{iM?);)HHxÂ×4j†³Éý BR|–§º¸ËÊÍÑý«¬x~a`@)ã¡|< Õ¤wQ. çÓ¸¦ŒsT@+ ùÕáÔÕ×ÔÏÏʼ½¸ÁÂÏÒßàâß׿ž™‚rVD! ûëõèøðý!:>TY_dPRAA-0$**09,A094.1'*"!)6JauŒŸ£½§Å©¾¶¸ÍÈàëöF=ceu…„ ‘º¶ãà  '(1/..'* ûäýÔãÌÑÕÖÛíâú (%?BNSaVrg}‚…›—¥Ÿ¥Ÿ¯¥µ¯º¹½Åµ¹­³§‹‹zj]D5!÷ãÒ¿ª°¦‹–—’¦œ¬«³¼ÄÉØÚäçëÝìÎäÀؽÎÄËÍÍÜ×êØîßäÛν²¨¥ §¤°­Â½ÏÚàñþ"89NJYUbWbYQK>3/& ïöçÔڽȳ¬©˜ƒyr^XKA:0&"#")159JDUQRVGN?@/2&!ôúáèÔÓÌÀʱº«§  “™ŽŠŠ{†ƒ‰}|††|{zw†‹–ª©½ÇÏáàüí ú ("/8<=GAOOTe`qso†u…Ž•Ÿ¢¸¶ÇÓÖíì %&=CS[alqqvxt}o‚i‹zš•§ª¶²Ä³¼¹¹½´Ã±Á®Â¯»¸ºµ¾¼ÃÆÓÒîï !)GJ]^fgijqgrcii]aZXWONBB;=// ýëÕÁŠhZ?-õðÕËÓÏßéùø3D5?=*/%çòÑ×·°šunbTHJ7<:9JERScgr}‡ˆƒ|zshlM]61( üï䯷§ƒmVN6(üññëäÝÝÙÚÔÙÝéëø÷üÿÿùõ(=Sn¯ÜùA^‚›»ÌæNN}š¨Ÿ»ª½µÁºÆ¹Â°³²©¤­‘§‹–|xlhUF4 ç̶›‹qaN0'ùä¾¢ˆZHß¾¤|sVR95+#$$)+:=Pcp“¥¿Þï+@X`lwqnihmsy‰Œ›ª¢¾±ÏÈÛßêö (*BH[iu‚‡š£ÃÕï.B`g†•ªÀÑÝóï þþóõçæåÖáÓÞÓèÎããéðîíãìÝæÞðî/)A@@E39'$þ æç¾ÉžxgM(üîßÉÁª›ŽscI+"êìØÝËÇ¿±¶› ’Š„‹|ˆ…›š£¦—¥‚ŒlzQaFG;/-"$4 <6EMSex‰¢«ÄÌéò=Bbh‡š©¿Ëáù"->W\^iUjHV54èÕ»®}bL4âÀ¶˜twNX//êòÞëæîòúðüðòïØ×¹£“€ƒm|em]XQA1)üÿýÿñÿøÿùÿñÿôÿåÿñÿèÿôÿãÿêÿæÿáÿäÿéÿ×ÿîÿåÿøÿôÿ $/?VkŒªÑýOr–¿ÊAT|®Öåü4-B;D7G-H;TQY`hkwx{ˆ¡±¿Òé÷25E[]q€†“šš§›¦‘‰vYLÝÚµ ‰qU@óáÍ¿²£›Œ˜Šœ›¡¸¸ÒêîKW†‰·¼ÐÜÔæØäßâßñÚõâñíù"& '!$'*#!10GL_ds|˜™›¢“›yj]I4üϼ¢‹{\RE7;4%& ïîÕÓ¾ÁÀ»¸¶±»ÁÄÈÆÍÊÚÇæÓÿú*8LPXOSHD;-$ÿÜÚ³¬„xZ<6 ïîñêðóöùþ8Ja€ˆ«©ÃÈߨûë*-&õøðÿÿ ")0=AHAOAK8?//-(/!2%- òìÌ̱¯›˜†~lU9# óçĽ¡œ‰ˆ€nxZgEJ5-,#" ÿôïîéöô  øûêçØÈ¹¯™tjSJ+3$ &)2CMn‚£»Üè%3ekŽ¥¬ÎÆÞÔÞÈÉ«zkC8 åשªykLìÿäÿÛÿÞÿÎÿØÿÒÿÑÿâÿÐÿðÿÙÿðÿãÿïÿèÿõÿîÿüÿôÿ*:2RRpjŒ«¸ÐÞõ(48AE?<@"-üúþþ  /-0@-2 !)'><VBL6/óãÌdz±—›|‡nyk\I?  õÿÇÿÖÿ¹ÿÏÿÇÿÍÿ¹ÿ±ÿÿ„ÿkÿ–ÿ€ÿ¯ÿªÿ¥ÿ¨ÿ­ÿÎÿÕÿüÿþÿ)<;JK[nm†w‚€yepg[WP>69  &$*+BCMU>[Y^chmz†˜§¼Ûë îôÙÄ­£ª±•©‰ƒ”|xttdgUP>B,7+ ÿÿøÿôÿéÿèÿíÿáÿíÿÓÿÙÿÑÿÑÿÁÿ·ÿˆÿuÿrÿHÿDÿÿÿ÷þôþôþÿÿÿþþ ÿüþ ÿ ÿÿ!ÿ=ÿ=ÿcÿjÿ‚ÿ ÿ¤ÿÈÿÎÿæÿòÿ %))82D@DA=/4%$=-CK]eyz†š£»ÈÚð*EFrr™žµº×Óðó+>LTeYjfcf^]ZWML<A20$îÜɯ²› ”•Œ‚pvkf_PMC=51-2,)127C:QDbbp€…š—¡‘‘€yg^J6ùðèæ×èÐßÍÒÉÓÇÊþ¶¼©¯¡£“—}pdYPVNb_vƒ”¦³Å׿ø$1CKZaqwƒ”{Ÿu„twt|svslc\=E(*óîÏĨ¡‡ugJO7@0=1G9RDUDK7*&öÿùÿáÿÑÿ¿ÿ¹ÿ©ÿ™ÿÿxÿcÿkÿIÿcÿRÿkÿfÿxÿÿ‚ÿ’ÿ§ÿšÿÆÿ²ÿÒÿÏÿàÿñÿùÿ  .1?8K?VMUNLLTS]YZTLD<35%1,%(3)B7DJ=TBXMWRqg˜Œ´²ËØØïáüð&%#/)@-D:@GBMFYDZHJA20  þðòÐ̸¥¦„‹nnbXbN`P_]djmu|…›š²°Å¾ØÃմë´™žƒwkPD:&& ÷ÿóÿØÿÍÿ©ÿ¥ÿ‡ÿÿcÿiÿJÿUÿKÿPÿ@ÿGÿIÿKÿXÿQÿaÿZÿ\ÿlÿ^ÿlÿpÿrÿ…ÿÿ•ÿ›ÿ ÿ§ÿ«ÿ²ÿµÿÊÿÊÿãÿßÿ÷ÿóÿûÿôÿíÿýÿàÿèÿ»ÿÔÿ§ÿ¬ÿ‘ÿ‚ÿsÿ[ÿ_ÿ_ÿlÿfÿqÿnÿiÿlÿ~ÿÿ”ÿ“ÿªÿ«ÿÅÿÌÿçÿñÿ")GP^xw™­²ËÎæÜíìâêÝÝßÑÝÒÑÕÁDZ»¤¦š”›ˆ–ˆ””ššŸ¢©¦°µÆÏìô7.8>0C<CQIhUu`}u„„vlaq`bVNE)ü䯏¢ŽŒzxrfc\PP@=?2H:SIZbkxw†„‹ƒ‘„𡦴½ºÆº±° ¬Ÿ¤ž£¦©°§±®¶¸ÁÂרñî #/;DJJSIY[gwx‰•‘©›Ÿœ›‘˜Œƒ‡o{fsdj`ZZMNEIAF@GC@?31*+$ #ûæãÙÌÉ´¾¢º–´”¯ ¬¢¨™ ‡•Œšž´¶Øßý #!0340'  õêåÔØÄÔÇ×ÍÝÜîó #3!>6EIVV^f]qc„p‰š¢³²ºÁÎÔàåõú.AP~ª¹Íéãö*.LOv|’²ÆÕîø '*9BGXSd[cTT=B1C(E/DDNUXhh~z™™ÁÆßôý2@\Xl_fUQI@0+íêȶ ~ncUUC@3&' èúÕ߷«ª©”›u~XTA74,"+þìÙ˵¢”ti?. ùÙÆ¡šmkF7+'" þúúúüû÷ðçæÑ×À»­–miTO1/ÿÿ÷ÿÙÿÏÿµÿ¿ÿ©ÿ¾ÿ¨ÿ´ÿ¡ÿ°ÿ¡ÿªÿ³ÿ³ÿÈÿÌÿÜÿíÿüÿ:BZkoŠ…œŸ±»ÆÙçö!,33,1(5)>.B8<87A<FCEKIRKSPVVSTWVUTOX]gpjxbs[PM34&þñ×Õ¼À¢¨„’n…o€w…|’ž¥§­¨¹ºÎËàÞôøüúþúôãÜôž•|oTI,, ÷ÿÿÿ÷ÿþÿûÿüÿÿÿ!3EQsv‘¢½Õì.FU_g‚Ÿ®±¸Ê¸ÔÁàÝè÷ð##:Hes§ÍÞî=1]Sr‚ˆ£œ²µÍÅÒÎź¸‰\]>-ûíÖ¿¬ƒndXKH28$   þ     òûÜñÙâ×ÓÈг»Ÿ€tiVTLK@KEUT_iZnWTF-&ÿåÛ©­§¦­´¶Ãßð3E_lz’•¼ÍàÔòû/2Q5T):5?>NM]dp|„˜Œ¯µ±Â¸É¬»­¨¢‘‚opRWHIK@I3H0CH[dƒ¡­ÁÊÍÔØÖÔâêçð ðììÌ˲Ÿ}p@5;-5#*ûñåâçÜÛáæáïãíÕ×ÈÁ·±³‹}fiV[8> ÞÞÙÝÓæäìëóí%07QVkVnq€~†—™²ºÉ×Þø*!!&!73NG`bijvwy{€‡„€yk\`ScKN;%11JP[egxxˆ…x‰v‚ƒ„}Œy‚‚}ƒ~•p}“›“ž§®§½·ÍÔäÜñ×äÝâÞäÞÞÙÛÅÇ´½´¼·±²¥›¢š¡ª®¼¼Ñ×äüÿ!!97VKeWR_Tjgxl{qyw„€ˆ‡’Ž‘‘‘’š–•Š‰š‘°žº²ÊÎÙÝãèïû 22VPso‰†¦§ÄÖßüÿ,<KWgk’–ŸŸ­¯³ÃºÏÐÖÖÝÒØäÜðåõîþóôéäßÜÏÏ´¹ –‹€uhh\OV=G65./05-< 8$:+?2LMkj|£µÏÕëöù%%..03+-   (@3PTfv˜›±¾Îëî!(;MWop……œ—¨¶­Ç»ÐÅßÐçäîùôö #$'38IHV]eeegk}u’†–•Ÿ¥«±»»ÀÊÈÉØÍ×ÛÛßßääïèõòòûÿý      # ( 1 & ; 3 ? : ? 6 ? < I G R N U U W V ^ _ b k i n u p } t „ ‚ ƒ ‰ ‘ Š › Š œ ” ›   £ ¤ Ÿ « œ © – ª › § œ § › ª ¡ ¯ ® ­ ® ¼ Ó æ ù    ' 6 Q Q s o … ‡ … Š ‘ — ª ± ¶ Ë ½ Ý Ï Þ Û í ì õ ÷ ö  ø  ú  ÿ       *  &  * + : : F I Z V i c p t v z † „ Ž ˆ ‘ ˜ w ’ w ~ | r w V d S X [ M V G A > *             ý  þ   ÿ           ê ÷ é í æ â Ú à Ê Ð ½ ® ² ¡ ­   ¥ œ ¢ “ ’ ’ ‰ ™ “ Ÿ ™ ­ š · ¬ ª ³ ¶ ¾ ¹ È º Ñ » Æ Ä Æ É É Ñ Ê Ñ Ê Ì Á Ë Ç Ë Ë » à ¯ º £ › – w ‰ s … { ˆ ‰ Š ˆ ‹ ‹ • ‘ š ¡ ¦ ­ ­ ¹ ¡ ¿ · Å Ñ È Ø Æ Ï Å ¼ ¾ Å ¸ Á ² ¯ ¯ ¨ ¡ € | u o t a g N D I 7 = ( 3 2 : O E c N ^ f i w q ƒ w ‰ | † w ‡ ˆ ™ • – ” Ÿ ” ’ – š ª   ­ © £ ¡ ª Ÿ ¯ ¬ « ² ¶ « ° ® ¬ · © Ä © Å ± º ® ¹ Ã Ä Ë Ï Ë â Ø á ß Ì Ù Õ Ù à æ à ç Þ Ý Ò Î Ô È Ë ¾ À ´ · ¦ § ™ – £ © ™ ¤ § ¦ ² ¸ ¸ Æ Â Ä Ð Å Ø Î Í Ã Í ¿ Ó Ì Ö Ú å ä Ý × × ß Ý ë ð é ÿ ð þ ú ü û          2 8 < X K _ _ f e r ~ € “ – © © ¸ ² ¾ Å Ä Õ Ó Û ç ì ù   " ' B = a ^ u ~ ‡ • ” « ¯ ¸ È Ð é ð  5 0 [ h } Ž – ¢ ¯ ² È Ó å í þ   (.-2-4,"!" ý ê Ú Ò ´ ¼ š £  Š t t o ] ] E L ? ? 1 @ =  2  % #  '  ( " #     $  " , # ( #     , 6 4 < E < S E U Q Y [ _ o ` l q w Œ ¢ ¤ ½ ´ Ä ¸ Ã Â Ê à Ý ñ ï ú í ÿ ô * 4),30!(#0+"3%6 5 *!!  #/&  ¦ › … ˆ “ Œ ˜ “ ‚ ™ t ™ | | r t b k ] t _ p e E C ? . 3   ý í ô è ê Ö Ë Ð ® Í £ Á   ´ ¸ ´ ¾ ¸ ¸ ± µ µ ­ ² § ³ £ ³ › › ‹ Œ  } e l R ^ D P D A A > 9 H 0 B - < . G 7 K C ^ S r _ o f p n v u { ~ ~ { | y ‚ … ‰ Š  ‘ † › ” ¡ Ÿ © ¥ ¯ ­ § ´ ³ µ à ¹ Ä È À Ô ½ × È â Ï é Ú ï ð ò ô ñ ñ ö ÷ ö  ð  ï ñ í å ì â ê Ü ç Ü Û Ý É Ý Ì Ø Õ Ü Þ Ü ê Ð ç Ñ ä ß è ï í ÷ ë ý ë õ ú ó ú ô ü   ü        ,  )    ! . ) 2 3 . < 0 8 8 > G ? Z E Y R Q O Y N d Z \ b ^ a c f l o b w g ~ Š –   ” ¥ ° ´ Í Ð Û Ý Ü × Ó è é ï ø   1.5C9CE:B7PESOWQcZm`higphw`vUyWzeynw{yzƒ|ƒ€{‰{Š~ƒxt‡j‘pzŒƒƒ‡Ž™•˜•¢’§”¨œ£§™£˜ •œ”Ÿ˜Šƒ†‚Œ||ˆ{€v‡x‹zŠ„ƒŽ}„{‰„Ї„Œ~ŽŒˆ„~lhZbZ_`ShJfQSY[V[PNLRDB50*7+D5@0$&!)  ! #'   þ þ ô ó ø Ú î Ç Ü Ô Ò Ç Â ¨   œ ‰ ’ r  e p [ ` K \ A X ? N A J : @ $ , , ( . / ! 3  +                            % $ . . 8 2 D G N Y ` b i  † Ÿ ¬ ¯ ¯ ± ¸ È Õ ß â ÷ ò þ %&+!&!/1>?@IAJ?@RJ^^dnjzrn{s…u…x…~™~Ÿ†¥—ª¥²³¹¾ÍÃÖÌßÜõéþîýüþ"%! *&11;3:/0,:->49?5D0:36:3;,9!3'   û ÿþÿõÿíüïêòÞïßèÛÚÍÜÎÝÚÜáÚßÔÓÔØÓäÎéÔåêãðßíàéßÝÙÏËɽƲ¼³©³Ÿ¬™­–£š‡œ€‹joibpXtZpYNQ=WCMD8>38(@*F5C>EB8:&>(?3=4B1?>FIBIBFA?;2?7C9LALC;90;3K8SFUWIaSa`bgeledoksuq|t{wffjdwmr}l‚mvmwpxn|f‚`mhoddg\j^`GP;IKHNLIIDG;X8M@=AAD5C;-C*I5I-5$&&3 # ô ò    #$!:(?6;=IF@;89<<AHK9I7NGWRTRNID6B79A>>A95./--6 /  )31.*;39+84)A*,''())(.&ø ÿ ç í ï ë ù ð ù ÿ ò ï ê ÿ ç ú á æ Ø ê í ß é Ò Ú Ý Û å Ò Ó Ê Ï ´ Î ´ Á Ð × Ò Í « ¥ Œ Œ ‚ ‡ u q p t \ j j v l } I - !  / @ 4 5   0 D e l w | w v † € Š ž « ° ¼ ³ ± § ° ³ ½ Ë À ¿ ¶ š £ ƒ { { l k c a _ n Y l i j p ] f U X \ W Y S W U T V S W N A =  !  # + & . " 5 # . " & * ) - . " ; / ? 9 A L = S % %         ù  ÷ ÿ ú    - " 3 . ; 3 8 4 5 3 7 0 # "      ú ñ â è ó þ    + ) , 2 , . / 2 3 8 6 @ < > ? E = F < @ : A / 3 - / 1 3 5 5 ? ; @ @ 4 B > 8 L 2 G 8 C 6 ? ) < 7 < T J M K : : ; 3 = / 2 + 1 ' .  (  # (  '  '  %  %  ! , ! ) (  &    $  (  "  #  %  ! ! + (  %  # ' ( & $ !             ÿ þ   ô ý é ø ï ì ó â ì Ý ß Ì Ñ Ì Î Ì Î Ã Õ ½ Ô · Ç ´ Á ¹ º ¿ ¶ ½ ½ ² · ¶ µ ¸ · ¹ ¶ º ¹ ­ ¹ ¢ · ¥ ³ ¨ µ ¤ ± § Ÿ ¡ ˜ ¢ Ÿ ¡ ¢ ž š ˜ œ ž › ž • £ ˜ ¡ — š ” ’ Œ ” Œ — ‰ ˜ y ~ ƒ ‚ ‰ ‰ ƒ ‚ ƒ w { w p ~ q x r w b w \ l X a X ^ V Q L G < N 7 G C : ? 2 > * 2 0 ) / ' - # +            ý   ÿ  ý þ û þ ù  ø  ø ø õ ì è ñ ç ð ò é ó î ç î æ è ç æ æ å í â ñ × î Ó è Ø è Ü ç â Ù × Õ × Ù Ü Û ß á Ú ä Ñ Ö Õ Õ Ö Ø Ó Ú Ñ Õ Ð Ì Ó Ñ Ô Ð Û Ï Ù Ó Ñ È Í Â Ì Æ Æ Î Á É Á ¿ ¹ » ½ µ » ¶ · ³ » £ ³ Ÿ ª   ¦ • ª « Œ ˜ † † ‰ } Š w  l s n p j m a n T V I I L D R B L A G 1 ? - = 4 = 4 8 1 4 2  $  #           "    (      !     ÿ                  ó í ñ å î ì è é ã Ú Ù Î Ú Ç Ø È Ï È È Ä ¯ Ç ¯ ¿ ² ¸ ® ´ § ª › ‹ œ — ™ Š   … ¡ Ž Š ƒ ~ }  { „ v … { { u v w t v w i v i _ g J \ O \ Q X U L E E = E K F W N [ \ V ] L W [ L c ^ ` Z K J : Q D K 3 & ' ! .    & .  7  /  #       ý ý ý ï  ï ê ò ì ä ï Ü ç Ó Ò Ú É Ö Æ Ï Ã Ç È ¾ Å ¾  ¼ Á · µ ¼ «  ª ¾ ¬ ¹ ² ¯ ° £ ³ £ ± ¥ ­ ¬ ¨ « ¦ ¤ ¨ £ ª £ ¦ ¦ ¥ ¢ ¨ œ ¢ ¦ › ª › ¥ £ ¤ – § š ¥ ž ¨ ® › ® — ¬ £ ¦ ¯ ¡ ³ ¥ ³ ­ « ® « ³ ª ¹ ¬ ¿ ­ Æ © Á ­ Á ³ Á »  ŠÁ É ¿ Æ É É Ï Ð Ò Õ Ó Þ Ë Ù × Ô ä Ó ì Ü ç é Û ì Ø è à æ ç é ë í ê æ ï è ô ó ì  é  é ÷ ì ò õ ô õ ÷ õ ü û ò  é  é  ò ü õ ü ö ù  ý       %  ,  + # '  ) 0 ! " # * / 3 : - I < M T V d [ m b c m p n w ˆ ƒ Ž ‚ Š ƒ ” Ž œ š š « ž ´ © ² ° ¾ ¹ Ä Ä Ï Î Ö Ø Û Û ì é ù ü       & " 4 ) ? 4 ? 5 D A J N Z V f f o g w r € | … ˆ “ ˜ ž “ ¯ š ¶ ­ Á » Î Å Ï È Ó Ù Þ æ î ò û ý ý   "  . & 3 8 = ; K C Z V g j q ~ r † | ˆ — – ¢ § « ¸ µ ¿ Ä Ê Ö Ú á í ò ö  ý    + ' < = C J D \ N l e u v † Œ – ¡ ¡ ¸ ¹ Å Ó Ô æ æ ê ÿ ú %15CJHYUnjˆ™£§°¹ÊÌÖæéõ 0(;?KRXc`rxƒŒ–¢Ÿ©¨¬¬¾¾ÒÎæÞñëôý !+9:CQXXlkjtyn|w~Œ‰›–§¤¶­½ÁÂÜÍìá÷ø   2%LAYZg‚®¦ÀÈÊÞåû /MUsl™ ¶¾Ðßø #6@X[nwƒ„‡˜¦¼ÍÚêð84RPco}ˆŽ£¤²Æ¸ÙÍéêú*!GGaeuw~—“³¶Îßáÿý(+@MSfpy‡—§ªµÁÉÌáËÛ½ÎÙÚïèøúû"0<:SPR]kg€‡Œ’Ÿ¢«§º²ÒÂä×òðýï.#@4>;NFP`Zog€m…x‚„€†ƒ‰‚‹…Š›–§ª­±»¨´¯µ¿·ÐÀÐÇÉÐÇÚÒÜÞäæîäðôðø !$"1#@->8:=PE`[]ye|s}‡‚™œ¥«¶®·»ÈÀÞ×àéíôíþû " &*'05=@DNgO{Xsev{wŠ€—‰˜“”©¦²µ¾¹¿¸­¶¥¾°Â¯Ä¹Âþ´Ŷ̺׸ÎÁÄÎÌÐ×ÕÝÙÚËÞÒåÝíàèåéãèôéúöþ!((*<7ANEOWTk\qp[kav{…ˆš ™É·Ã©¹§°ÐѲ¨¬Ýý !'"GRq|–œ›¬½æÜÿõ &E+ULMWESPUPR</:358<<<B<?/?4D<AKBKONRMLHS7Z/E'93A6LDPQ^YXW]ZhUf:MD\aqw‚Š–¨­²·ÂÈËÜÙéíûîþüþ !@$H+B;@JK7;5/.<:BJIVDLP^ewˆ—­‚{~lpogz€• ¦¾ÍÕÛèèðìôôùù   üü þ  úøþöÿøùøõòíêêãëâãêØäÑÖÇÚÅÛÎÙÕßÖÖÜØåÚìêì÷ñóóþÿ !)1>GNXZffnmrs~‹™—¤´°¹¿ÆÑÚáççêñõý   û þ   & 1 % ) " 2 + 3 , 9 1 < 2 7 2 = 3 = = : C B A C A F = G B I @ < ,  !  ) & * 3 % > . 8 ; 9 E > J @ O F L L K R O T T W X \ S X P M T Q P S W I ^ E V D R C K H K H P @ M 8 N < G I ? N H E B < @ D H R K ^ S ^ _ T j ` k o l p i o f a n X s X n ] o ` j Z ^ ^ d ` l k ] x V s _ p n p q w w  € | ~ € † Œ ‹ • œ Ÿ ° ¦ · µ » Ù Î ó ÿ !!!! !#!!-!2!/!(!1! !+!!0!!.!7!&!4!&!,!%!+!/!3!B!?!D!V![!?!a!B!]!P!m!Y!|!f!„!w!u!s!{!{!…!‘!˜!¡! !¹!°!Á!Ç!Ú!Ú!ä!Ý!è!ì!ò!ò!ó!ñ!ú!""""""""ÿ!""ú!"ö!"û! "ó!ò!á!×!×!Ú!Ê!Ô!É!Ã!¶!µ!®!³!½!­!¾!¯!®!¨!­!Ÿ!Ÿ!ž!˜!–!!™!ˆ!!ˆ!|!u!}!b!y!u!m!~!x!z!`!n!\!f!m!l!k!z!n!v!z!k!u!q!{!m!€!w!t!!n!}!o!‚!…!…!“!ƒ!‰!”!!!‘!‹!™!—!ª!¬!º!¾!Æ!Ê!Ë!Ç!á!Ì!ê!â!è!ò!ï!ð!õ!ö!"" """"$"$"%"#"6"1"K"A"S"P"^"_"l"}"m"‡"t"{"r"o"r"h"d"V"W"Q"M"P"O"F"O">"B"*"7"*"'"""""""û!ò!ò!í!ï!á!å!×!Ç!Ñ!º!´!¦!§!ž!!£!–!¡!!‰!„!w!!u!Š!~!…!’!Œ!”!Š!š!‘!°!›!·!¨!³!¼!¹!Ê!Ä!×!Ü!ô!÷!" "#"#"8">"B"U"P"d"m"j"†"y""ˆ""•"“"š"¢"£"µ"®"»"»"¶"Î"Á"Ù"Ó"ß"ì"å"ý"é"û"õ"## ## #-##*##"#.#(#4#3#:#1#A###1##"#######÷"#õ"ï"ø"ã"ï"à"Þ"â"Ô"Ü"Ê"Ö"Ç"Ó"Ë"Ô"Ï"Ö"Í"Ö"Á"×"Î"Ò"Ú"Ô"ã"á"è"ç"ë"ê"ï"í"ù"ï"#ù"ü"#÷"û"ø"ü"û"ø"û"û"ö"÷"ï"â"ç"Ú"Ú"Þ"Ð"Ù"È"Ê"¸"¶"¨"§"—""Ž"‹"…"~"x"w"q"m"m"`"g"^"]"c"T"e"G"c"O"["^"\"b"b"`"h"`"`"k"c"u"r"q"|"s"„"|"Ž"|"ˆ"u"†"v"‚"~"s"|"e"n"n"W"d"P"S"N"F"A","9"$"9""(""" ""ì!é!×!Ù!Ü!Û!â!Þ!Ý!Ö!Ê!Ì!Ë!Ô!Ó!Õ!Õ!Ö!Ö!Û!ä!ã!ý!ø!"" """4"C"G"V"^"i"y""™"•"·"­"Ç"È"Î"å"ß"þ"ò"# # #(#+#/#D#C#W#a#b#|#w#‹#Ž#ˆ#ž#”#±#¨#À#À#Ï#×#×#ã#Þ#û#õ# $$$($*$1$-$=$7$H$M$M$`$V$i$k$a$u$g$€$r$‰$y$‹$x$$q$„$i$~$i$o$j$_$d$G$P$'$1$ $$ù#÷#í#Ô#×#¶#°#“#’#u#|#X#_#@#C#/#&# ##ú"ý"ë"ð"Þ"Ú"Ï"Ç"Â"³"³"§""¢"Ž"“"‡"u"v"^"`"R"Q"J"="<"-")""""""""""õ!"Ý!î!Ð!é!Ô!Î!Ô!Ç!×!Ï!È!Á!³!À!µ!Å!½!¹!º!¾!®!±!£!¬!­!±!Â!¹!Ñ!¼!ß!Å!Ñ!Ð!ã!ß!ò!ô!û! " "1"-"O"G"i"`""„"˜"ž"¨"°"Å"Ò"è"õ"##1#Q#P#l#`#‡#}#œ#–#±#«#É#Í#Ð#Ñ#Ò#Ü#Ü#ä#à#Ð#Á#±#±#¡#ž##”#’#†##}#\#d#Q#L#0#(#"###### #ø"ó"Ó"»"©"—"z"r"P".""""þ!þ!õ!ï!ç!ë!Ù!Ì!Ò!¿!á!Æ!Ý!Ì!×!Ò!Þ!Ý!Ö!Û!à!Ý!ì!ã!ò!ì!ñ!ô!ø!"þ!""" "" """""""""""""""""" "$"2"3"J">"X"R"l"r"ƒ"˜" "¹"Â"Î"Ö"è"ó"###.##5#3#@#?#L#C#N#F#B#H#9#1#)### # #ü"ö"í"ä"à"Ê"Å"­"¡"”"y"{"W"P"7"#" """û!þ!ì!í!Ò!×!È!Ê!Í!Å!Å!Å!È!Ã!Ë!Æ!»!Ð!¿!Õ!Ñ!Ã!Ó!Ã!Ö!Î!Ñ!Ë!Ã!Ê!Á!Ë!Ã!Ô!Á!Ø!¼!Â!Ç!Ç!Ë!Æ!Ñ!¾!Å!Î!·!·!¢!¢!Ž!ª!•!¬!¦!©!¡!¢!—!©!¢!¸!›!­!–!“!“!’!‡!!“!•!š!¡!¤!¡!¯! !¢!œ!ž!¢!¶!¯!¿!Ä!Ã!¿!¸!¯!¨!™!!‚!v!h!_!Q!A!,!"!!ÿ î Ì É ˜ ‰ a N . üòÐòœ‰|d^QMEE9HEALRXazz”™««º½Ì×ÕîÛóãìÚÜÍ˹¶­–”zh]@F!ðߟœƒsnZ]EJ58+7*:;?XVhkv‹–¨¾ÈÞöû,<MShjywƒu}x{e\G3ýçÓ¿³“zoXP34õöÞåÔÎÏÀ¿Â­»©¬¢©’˜xubaQG/ù úûþ 3KA\i{вºåõ09\n…¥°ÓÙõû)3BCTS[jip~|Œ˜¸¾ÏæÝùú  7 : [ U € r – Ž « ­ ¼ À Ì Ï Í Ê Æ ± · ¤   ™ „ † g h H @ 2  óõßàÇÆ·±®¤§›ššˆŽ|†‚~ƒ}{t}rwuwvtrosdhYdNYH@2(ïéÒ¶¾£µ©ž§ ³¼ÀÎÐÙèõÿ-LIujŒ—¨ÂÒàùõ   ) - ; : ? C : @ : - 3 '      !  ( ) + / 4 4 = 8 G K ^ Z r p Œ — ‡ ’ ® ž ´ © µ ² © ® › £ ž ˜ – ‹ … ‚ r h [ G > 0 '   ðîÇ𣓀v}|‡š®Åå + [ ‡ ¥ Ô å !7!O!„!š!À!ä!"&"6"X""—"®"Ò"â"ò"## ##!##$####ø"ú"æ"ä"Í"¿"¬"¢"„"Š"d"S",""ö!í!Ñ!Å!¥!œ!„!p!]!ôªn6À¯cJÕ£yHÒ¤‰ha_iKN@FQsw“¦·Òèâ,0<YNss…ƒ‘‹‘”ŠVhHZV]XfjvƒxŽŸ»¾ãæ*?^nˆª¶Òßö <Dgnƒ¤Íå ,;Vk{‘¨Ÿ£ŸŠ–y†rmhU]F<>(2#*%&+46GQhmŒ’¶¿çö)Bhz›·ÅÝèíðüøùóçÒÀ¤ˆzO<÷ɧvZ7þÒ½”†x[VD14"&#%((:LYrˆ”¿Áó/M|ŸÏò?\~±ÆWjžÆì(OŽ«å9W…­Ëò1SoŒªºÖâ 23TNh[a\NJ6!ðÙºq=ó̦yUŰ|Z9ýï§œaN&ÿòíãóèúó9DWl‚±¾Õìø+Jesœ¦Öê2[j‚‡Œ£¨ÁÎ×èäó.!2,,;5LIMRQU`gvŠ©¹Èæ÷ 17;DCMUUhZp^mSaGOB?<,.ûóÓͨ©‰„j[C91"óÙ²Žc6ãÈ—yL.à¶”oQ0÷Ó¾‚]I#îÚ¼°•ˆolTM?5îêijž€SW)öäͳ™‰idK=48'V> äÜ­§t_B2/÷ ç á ® § ‰ ‰ ƒ ‚ z € | ’ › º Ø ë 9fÇû:t­ïO€¯â1'FWo£°´¹¸¯·³²² šˆsjg]R_coxƒ®Àî .\ˆ²ñCp–Ëç )=`\zpzuom^]B+ؽ‚o4俉P0îÏ™nMû㽕€jb]^Zgd}‚šªÈÛÿ8QlŽ¡Íæ>DcYi]fQ[GG/, ùàÏ´£“zv[S:1-÷ *@]w¥ºñ4jƒ¹Ü4CP\ZZY=6!ú˳•sUG÷éàÉÈ´ºµ»º¼¹·¯ž›•›’Ÿ£´»ÜÙùü03KMhVfIaGVA=/ñçÓŲ›“soGFãΧ”kP3#øñÅÁ™’zvb[AH5NBnv˜ÁÑVƒ¯â5^†™¾Ðð !0DESVPJF6/ ÛÙ¡¢ypS9"úãʸ¢œ‚‡llJU2?#*&% ùñôãÛ×Ǿ«•tX9 è⼷ª¦ŸŽœ„‘…‰€wkf^MH'%ñ Ü § ‚ Z ] = 0  Ï ¾ ‹ –  r l W ] I Z I Q @ / / ÷ é Ø Í Á § › … ‚ t i v e p k Ž { Ÿ § ² É ç  E v © Ð  E ~ Í L£Ðc“ßx«8³$Tލäó!%NCYY`ec`UC>æÃiPݲl8ø´‡@ß™xO!ʽ˜pL: í Ð “ i 3  õ Ù » ¡ ‹ † t y p r p u i v ^ k ` b Z Z a U W M O M I R 9 F > D A A > ; A 2 B ' 1  ù ß Ï ¿ ¨ ¢ x v Q I (  ö í Ö Ø Ó Ë Ë Å Ä ¾ ° « ¢ ‹ ƒ Ž Œ š – § · À × ã ÷  $ ? f t “ ¹ ß  : k } © ¢ Æ Õ ú   0 * V P i b „ „ › ¢ ± ¼ Ó ß î )6bk‘ ¹ÎÙþ'.GLVelzŽ¢—³¡®§—‹ˆ}h\<ÿÒ¸yh. ç ½ “ { O ' ð ä ò Ó þ Ý  é þ í   % 5 L E [ X { x • ˜ ¾ Ë ç ü 6Qo’¦Ñß#K„žÔé-D~ŸÌÝ2?Mag‡™’wmbJ4(ôåÀ zG-ÿÙ¼’gHúäÀ¿—¡“™•—’¥¨­Â¹ÍÎÕÏÛŶ¦©£¨„pWVedw{ƒ}thfpU`>6à à ¥ ¢ › • ™ ’ ‘   § ½ Ê Ù î KX…޲Îê:Vš»÷Ldž±Óë"*+A;N=I3?%ðêáÚÎÐÎÜ×ïèGO~‘¹ÃçR`‹¤Îõ(>„¢àý7Mwƒ›š•sbBÈ©n; ౎ƒb]ONCX`„œÁðPs²Ô&KŒ·îGqލÈã  øòÖ¶™\<ïÌzEî™5ã„9ÚŽD÷ÀƒI"òݺŸ—ƒ€}l\XJHJEA=G>GHetŠ›®ÃÏäò  $EAblk€{~|ysfWD9'þüðóÎ̲¶  £Žœ‡vmO9ÕÅ›|S7ï  ¯ ‘  q n p z € … “ « · Ù é A/Kcw•§ÆÔþ/@Pitw€|{vukgZO?%LÒ ‰ V  Ý ³ x K ! ß ­ { U :   ú û ì ë ç Ú ã Ï Ú Ù È Ä · › Œ { ^ W I 9   ó æ Â ¼ ” ˆ m [ D 3   ëæÐÙËÙâó % ? I q ¤ ­ Þ ã  * b  ¦ Ê á ï  , M g ¶ ä  W ž Ó L t · ß )S’ÒD}­áû*;^c{jll^]<@ â¼j+¦fÌ ‡ = ý È ‰ i  Å « t \ / á º Ž g F 4  ø Û Å ­   ˆ { c ] M / !  óÙ¼œs[@ úèɼ¬Ÿ™•’Œœ”«­·¹¼¼ÒÝöü$;Kq}´Þ > } ¨ ï W  Á ò  K h Š ž ¯ µ ¹ ´ ¨ ¡ y \ @ ! ù æ ¿ ¥ } h >  ú Ñ   ~ P :  ñ¾¤qY,ë⽪ž•‰‰piNI80áØªœlj@AúöìàÜáæÿ ,0=RYXU`QXOkUo^m[]RL;4ííéÙõëþ#*$&÷ûôâìÞãØÓÛÐçñ *M]ˆ¤Óú)]›Îa¢ñ= “ Ð  V º  ~ ¬ þ  K l ® × ò é û           ú ê Ù É ± Ž … U D  í Æ › Š j P ? * $ "   ý     ' & 8 9 M [ t u £ ¨ È Ý   C g ” » â   8 C [ o € ¤ Ÿ À â "I\_q®¾ßêÿ4B`y“´Çï 0\~¶ÞQƒÁú/_–Êì!Ik™“±À©¦sC*Ø¿i'Ú¾‹o=#ýÙÁŸ_U4õè `4ùéÍ»’zJÒ ® s D  Ü ¯ y , ó ³ s 0 ë ± Y  Ø ]  ì z7Öµzo93 ((E\v”±Õåþ"%DWoˆ‡¥Ž—†vbL'Þ¸uFâªR Rßqý”ª:ßf²lÓÿ|ÿIÿÿÖþþmþGþ"þþãýÕý¼ý²ý™ýžýzýgýPý,ýýßü¨üTüü×û¡û^û7ûæú¸úeú%úÖù}ù+ùÏøxøø½÷f÷ÿö¥öNöö«õOõõ¼ô‘ô]ô6ôîóÛóÕóÖóæóýóô)ôô.ô@ôWôaôwôuôôlôô~ôuôpô9ôôüóáóÒóšó|óUó%ó÷òÇòaòòºñTññÆð^ð ð§ï?ïÚî€î&îÏí`ííÁìhì4ìáë¯ë’ë}ë}ë~ëvëëÇëÿë/ìxì¥ìøì9í‹íÜíîtî¹îï]ï•ïÅïçïð@ðiðzðrð_ð,ððÂïxïïÊîJîòí‹íDíóì’ìSììåëÏë³ë¤ë¯ë½ëÞëäëì;ìyì·ìçì0í`í­íïí=îbî¥îçîïQïŽïÝïðYð¬ðãð>ñ‰ñÚñòaòžòÊòûòóFóXóŠó­óíó5ô`ô¾ô,õŽõ öŽö÷Ì÷±ø~ùú­ûÀüòý ÿcËèæØÛ¾© w 8 Ó r î { Þ O¡üNr™¼ÓíéÏ£W›@³ : ± 8 ¤ M î   Q  ì Ï ô  a ¸ # ® + Ò ” c!é©p5¼aöŽ"ª1®þJ˜Íô âÏ¡p_1î¤T!ãŠ-äŒMÓ™\%Û·¬—]P6Q}´ê!tž]É?”þyæUÐ'‹ä>s»êý ,*;*- üÌ•b±Pé§d ÝzQþÞ­‡mqj©Å÷GpêLÅ ¢îYÁQ‚µ÷+Qctu‰Šƒ‚qr?"âКnù¸{R'ïÇ­­µ¹ÁÜÒ3yÍ~Î4²eÀ h« 9 U ‚ Œ ® ª À ² ¨ ‰ n V 2 ú½h½kù°°&¤®GÂ_ ¿Žk4þ-K®Þ S€Ù Pn¥»*RT_RXGK ×¹‰Qÿ»EzŒ‹íU— ní^ÆDÙÇxJú ø î  /\iŽƒž§·ØÎÓÁ´˜šaSå ³ t a 0 ü ½ “ 6  ¿ ‡  ® D ð : å~Nó­g:ðË“†m]B1ñûϰ”Y>Õkøák˜;´E®}ÿÊþJþ¥ýýqüÛûCûÖúKúäùrùù¡øVøì÷¥÷h÷#÷ÛöŽöVö öçõ¯õõGõõõìôàôÒôÜôçôõõ7õbõ€õ«õºõ«õÐõœõ„õTõõÆôFôôófóøò]òèñ0ñ¥ððkïäîNîÉí;í¹ì-ìÄëKëÎêUêÐéMéÃèEèµç5ç¶æNæÔåpå(åÆäyäKää ää;äxäµäååææçyçèrèÃè2éQé‹é éŽééIé)éÊè‡è$è²ç4ç³æ?æ¡ååŽäÙã[ã¿â7â‰áÿàTà»ßßÞÞÝÝÜEÜØÛ•ÛUÛÛÿÚèÚóÚÛOÛœÛÐÛ%܆ܿÜcÝÏÝGÞ¨Þ ßnßÂß àFàpà‘àªà·à®àœà|àPààÐßuß-ß×Þ{Þ$Þ´ÝQÝÖÜJÜÅÛ-Û¯ÚúÙ?ÙˆØÎ×1×zÖÃÕÕEÔ±Ó(Ó¦Ò(Ò§Ñ4ÑÜЕÐeÐ<ÐÐúÏûÏÐÐ ÐVÐPЉЗÐÎÐíÐ8Ñ^єѷÑñÑ*ÒwÒ–ÒÂÒéÒ4ÓvÓ¸ÓåÓ1ÔpÔ¿ÔþÔ6Õ…ÕÇÕ,Ö€ÖÝÖ3×˜×æ×GØ‹ØÓØ*ÙpÙÒÙ"Ú„ÚÏÚ,ÛwÛÆÛ5Ü›Ü&ÝžÝÞ˜Þ$ß³ßLàçàaáÌá2âçâ¦ã[äå¯åæEç"èéíéâêÐëÛìüí&ïwð«ñéòñóBõyö¶÷Ýøúû!ü ýøýÆþ˜ÿ]ßhœEÇ'vÐ|¼7[ŽË !Ni¶î b † Ô ö i É Y Î a ö ± d å¥o1ˈ@ù6¿HÊRÀ(i£ä *æ¸u;×ðiÎ:°^£jæJÝ_£ˆJM2FEnŸ×I‘¿H{ÅæDp®Êîðòð×Ѳ‡NìÒ¬V¸…G*漎ndunvr¥Ý]ŽË"Ÿ4ÄVârà“]½Yí…,´'oÁe¨àñ/ýÓ¥k/ÿº~×v%í£gÎ’‚^P òîçìþø þ.P¡²´ÇçöýýòåÓ¶š] ¾m¬8Ì8¹"«²&š |‹ •£&»Gü ” J à f $ ð ¤ c <  î ¼ ‡ c = '  ý á à ¤ n 7  ˆVò¢M¹mK»t-ò¶wWøÛ¨ƒS;!Ø«ŽfI6úÏÁš‰‹t†r|p˜¹ÝçíÒæÐâÑ·f&Ðÿ¤ÿbÿ5ÿÆþ€þ)þßý’ý:ý¯ü:üÏûrû ûúúeùùhøøq÷ßöxö ö¹õiõ*õìô¶ô‹ô]ô(ôôüóôîóÛó½óœó¢ó’óžóœó®ó¬ó«ó§óÉóîó ô ôàóµó»óÃóÆó‘óJóúò¾òzò3òÌñWñÖðiðð‡ï&ï²î/îÐíwí$íÝìšìKììÓëÇëŽëëbëBëëõêÏê¸ê‘êTê3êêœéIé÷èÇè…èSèæç‡çTç'çùæÈæ€æJæôåÃåhå%å½äGäÁããÄâ9âÛá=áÉàVà àÅߟßjß)ßß ß*ßiß­ßÃßðß6àŽàîà*á`á{áœá©áœá˜áaáá«à`àôßÀßrß'ß¶ÞRÞ Þ±ÝbÝ Ý¼ÜŠÜCÜÜÆÛ«ÛeÛQÛÛäÚ¥ÚSÚÚÍÙ”ÙNÙôذØ3ØØÅת×w×W×:×%×××äÖ×Ö­Ö’Ö†ÖuÖ[ÖSÖ#ÖÖ÷ÕãÕ®ÕtÕ,ÕôÔ±Ô~Ô1ÔùÓ ÓXÓÓÞÒÒ^Ò1ÒüÑÔÑÁÑÁѴѳѹÑÍÑæÑæÑúÑ ÒÒ>ÒZÒ€Ò«ÒØÒÓ=Ó‹Ó¼Ó!ÔoÔÑÔFÕŸÕ ÖpÖÐÖ>פ×ù×H؃ØÑØèØÙ+Ù1Ù;Ù(Ù ÙÏØqØØ‘×(×­Ö<ÖÛÕqÕÕÑÔzÔGÔÔÜÓÞÓ©Ó´Ó¥Ó½ÓµÓÌÓÍÓÛÓÓÓÎÓºÓÓ^Ó&Ó ÓÛÒ¥ÒUÒÒÑÑ›ÑpÑJÑ4ÑÑúÐàбÐÁаПЉÐZÐVÐeÐjÐrÐgÐyÐ{ЧТÐÊÐìÐÑwÑËÑ&ÒwÒíÒLÓÝÓbÔåÔSÕÕÙÕ<ÖgÖ«Ö×E×f×”×Ñ×6Ø€ØüØYÙÔÙZÚþÚ¸ÛDÜÝÑÝáÞÅßÀà¼áÇâÿã5å~æ²çéWê¾ë'ísîîïWñ÷òlôöœ÷ù}úÕû6ý|þ¾ÿÛ庋.ÝP’¼ÚÚÛÁl©DãGÏ/¼©Ïÿbÿ6ÿÏþ›þuþ€þˆþ»þ×þÿ`ÿ­ÿ+É0ø¿•d@Ðy" À d í R ¢ Ü ^ c i <  · ` ç p ì < ±ød¼Z™îV©*‘%ËŽ}j“´ü8¡ñ}ò”°8ÆgÞjëUæ: ­ é ; e n ~ d P 8 ö § 9 Ã^ÀZ²D†+8±Råz=óÊŠhYO[z£ïÆG±(›„€¥?® d Î : ‚ Ä Ö ÷   )  ¹ { 0 á « P ýn,Ò’ÜxÚ¨|føÇæù7?m—à(“øiÏŒéz è @ — û X Œ ë  M n ^ <  ë Ì r  ¥  À  ´bílÓYÍ%²F÷¥n棗‡ž”Œy޾Øââø$=7"þñôäĈ`/Òÿ”ÿ<ÿÉþþöýŒýý¥ü2ü¿û?û¯úDúÍù}ù*ùÐøhøð÷¿÷Ž÷‚÷W÷÷ÐöÔöÙöñö÷ö÷öõöáö÷÷Q÷~÷µ÷Ô÷þ÷9øŠøÕø-ù@ùxù°ùøù4úuúúòú"ûgû¡ûÒûôûöû<üMüVüRü…ü¹üçü$ý$ý)ýýý#ýýúüÄü¡üü‰ü|üjü>üüÞûÁû‡û…û?ûûÚúÞúËúØúÀúÉúÈúáúÓúÜúöúû.ûû,ûû ûûûíúÁú~ú5úõù§ù0ù¡øø«÷7÷´ö+öõ(õ›ôôzóóŠò0ò—ñ÷ðyðð­ïAïÆî?î×ízí-ííì’ìOì(ìéëøëøë-ìHìgì®ìí]íºíî^î€î¾îßî&ïLïlïQïIï0ïï¹îPîïínííŠìýë‰ë ë§ê ê‚éçè†èè†çõæNæ¬å+å­äKäâã±ã=ãìâ¡ââââ—â–âÅâñâiãöãväååæµædçþç†èïèxéáéXêêÏêÚêêêÜêÌêžê~êê½é%é—èèhç°æíå=å•äôãfã¬ââDápà³ßºÞæÝûÜÜ=Û\Ú—Ù¾ØØ[×ÂÖBÖ¶ÕeÕôÔçÔ½ÔÄÔÓÔÊÔÕCÕ¹ÕÿÕ‚ÖóÖSר×NØ×ØiÙýÙ‚ÚÛ¥Û=ÜÉÜ@ÝÐÝÞ›ÞåÞBßßÕßààJà\àhànà[àEàà«ßSßÓÞcÞÄÝ9ÝŽÜêÛ2Û…ÚÕÙÙ‡ØÄ×8׎ÖÖŽÕÕÀÔbÔÔéÓ¶Ó¤Ó”Ó”Ó‘ÓªÓÏÓåÓ&ÔOÔŽÔÍÔÕZÕ•ÕïÕ;ÖsÖÒÖ×b׊ױ×ì×û×1Ø<ØKØJØ@Ø(ØØô×Ô׻נןײׯױפר×y×W××äÖ²ÖŽÖ_ÖKÖBÖDÖHÖ8Ö4ÖÖÖ!ÖÖ%Ö'Ö\ÖÖ»ÖêÖ×M×¢×ß×(ØWبØíØ`Ù«ÙÚhÚÔÚ^ÛýÛ§ÜlÝ%ÞëÞÊ߸à¨áÂâÒãíäæCç˜èòéKë”ìÒí ï\ðžñÂòÚóÔôÚõÛöÌ÷©ødù:úû¿ûXüæüsýþýrþÓþ(ÿfÿÿÎÿñÿÿÿËÿ¯ÿWÿ8ÿêþ¥þJþòý“ýZýýùüÇü›üü‹ü´üáüýVý£ýþ–þÿ¤ÿ1½f£FÑ|øžÚdøŠ   Ÿ  ~ ì E Ù  A V ^ ? % ñ Ç s ?  w ì ¤ / å } - Ü”u3+íîÔåì0Jw³ÿP ¨ õ h Õ \ æ ] ñ p ŽŠhð?•Ô!JS_L4ùТTÑ^9ÿÕšz[YF=SY¬é WŽÕyÄ(fÉk¡Û >ep{†fh4ê¬~LÊQœYÖw™-ÄNè |  ¿ l *  Ë ¦ z } Œ x ‹ ˆ ½ Ì ë ü  5 ) ? J Y l [ i k r W H  "  õ Ç ¦ i K ñ º d  ® N ï”2´&¨3ÅAÆdþ£aáªoH754(0GhxœÃ*w•ó5{«8Äd˜×ùH}|€n[T%Å€3â£Uœ8ÜŽ@íŠFó¬tÒ‚@äÿ›ÿ\ÿ%ÿÔþšþ^þ7þþÞýµýŒýgýSý0ý ýøüÔüÛü—ü”üYüBüüòûÀû‰û@ûøú¦újú-úÊùdùòø¤øGøù÷‰÷+÷²öQö÷õ¢õiõõØôžôRô4ôôÑó®ó‰ó[ó.óó½òò5òò±ñgñ"ñæð˜ð\ð/ðÖï½ïzïRïKï,ïúîôîáîòîï,ï4ïVï\ï“ï§ïîï)ðNð‚ðŸðÂð ñiñ™ñÑñìñ/òZòšòÆòÓòÙòäòíòóûòåòÅò’òOòò±ñ-ñÇð2ð°ïïgî±í"íyìÐëëêâéXéÍèSèíçŽç8çùæ¡æ™æ…æ|æQæMæQænæuæiæIæ.ææJæSætæiæŒæ„æ¬æØæ÷æ çç çççççççßæÆæ¸æžæuæ=æíåÊå¥åŽågåGå6å;åNåTådå¬åáå7æUæ‰æÍæçfç–çµçËçÕçÑç¿ç›çqçç¹æAæÉå[åÈä"ävã¤âûáEá–àßß(ßSÞ³ÝûÜ|ÜÁÛüÚ/ÚÙõ؃ØØ•××ÛÖÖtÖjÖ\Ö|ÖƒÖ°ÖÓÖ/×ר”Ø Ù«ÙQÚõÚœÛ!ÜÊÜYÝÎÝAÞ†ÞÔÞßßßöÞÓÞŠÞGÞÅÝ`ݨÜÜ]Û²ÚÚ5ÙqØ„×½ÖØÕ ÕKÔrÓ½Ò×ÑÑ0ÐwÏšÎÞÍûÌ&ÌqˤÊúÉ(ɆÈàÇ:dzÆ<ÆâŨŕňťÅÄÅÆ^ÆÏÆÇpÇ»ÇòÇ@ÈTÈ‹ÈkÈdÈÈÐÇVÇÚÆ*ÆŒÅÉÄøÃ(ÃW¦ÁåÀIÀۿڿ׿ۿٿؿݿֿۿֿ߿ÿ¿|ÀíÀpÁþÁÂ+ÃâÃwÄ2ÅïÅÞÆ²Ç¯È™ÉœÊ§ËÏÌÎ!Ï_Ð~ѪÒÒÓòÔ÷ÕÓÖš×DØÆØ;Ù|٭ٴٺٚÙfÙ#ÙÐØžØSØØÕ×Â×±×Ò×ÿ×?Ø—ØÙnÙóÙiÚ"ÛÅÛ‚ÜÝàݘޔ߂àwáeâ`ãuä§ååæ)ètéÉê$ì±í6ï¼ð:ò¶óõ„öÔ÷ ùúûÝûŒüý“ýðýþþþþëýÅýý&ýìü«üvü3üæû»û¤ûˆûxûrû^û„ûžûÏûáûüPü¡üëüYýµý.þ‹þÿrÿ"ž<É^òž.Ð@¨ú_ÃüþÛËk zý[®ö/o—Ìÿýþ+þ”ýÛüOü²û;ûÕú€ú!úôù¸ùùŸù†ù«ù§ùâùú/úkú•úãú4û ûüUüÑü:ýãýmþþþvÿþÿ{vËA{†…UË“<ÒRÐhòÿŒÿ$ÿ¹þaþþÏý’ý^ýCý0ý2ýJý^ýýÚý8þœþôþ]ÿ½ÿWÔ~ÿ˜2Ïuú ,µ•ógÆà    í·GõdòhØC›úW×LÖHÆSøÿµÿ~ÿ\ÿ2ÿÿ ÿ'ÿ>ÿuÿ’ÿßÿ%dºùuØR}Ú9½;¨ðD“Ý*_­ÀêæîìŸo&û¬\öŠ*Õ@ý·yaSV;;''12TWwOJW‚–€€ƒoaU-¬„S8ù Køÿ¸ÿiÿ/ÿÄþuþþœýTýýÖü‡üüÒûûpû3û#ûñúÇú¥ú‹ú›ú¬úµú“ú|úƒú©úÛúàúèúâúúúûúûû5ûû ûÎúµú•ú…úCúú¿ùlù<ùéø°øsø4øã÷‘÷N÷÷Ëö™öKööÂõ–õaõCõõãô™ôYôôôÞó€ó;óÓòµòò‹òGò<òôñÛñ‡ñpñDññ¬ð]ð"ððõï ðÈïÉïyïyïVï;ïïÇîrîFîøíÇí}í:ííÏìŠì.ìßëœëSë ë²êAêäé±é¡é¥é‡ézébégéxé¡éÍéúé ê7êZê¹êúê@ëlë¨ëÏë.ìmìªìÖìí<í€íºíî:îî¯îïAï“ï¼ïð%ðSðLðXðQðað_ð7ðûï­ïbïûî¦îî‘íåìLì’ëëŽêê‰éØè;èÑç‡ç5çÔæyææôåÅå¿å¡åzå`å3å+å(å8å6å-ååå÷äòäþäååååIåå­åÞåæå%æHæ†æ„ææƒæˆænæ*æéå¥åeåå”ä÷ãƒã ã•ââá%áÑàdààçß·ß ßdßPß'ßAßDßGß1ßßß÷ÞÞÞ®ÞwÞÞÇÝ_Ý#ÝËÜNÜÅÛ3ÛÅÚWÚãÙmÙñØ‹ØØ®×>×ÐÖZÖïÕZÕöÔŸÔÔAÔåÓ¬Ó[Ó*ÓØÒ‰Ò8ÒøÑ³Ñ}ÑAÑÑëЯЧÐvÐgÐDÐ.Ð)ÐÐÐàÏÃωÏAÏ ÏºÎ_ÎêÍ”ÍͬÌ.̲Ë0ËšÊÊŒÉ É§È>ÈÄÇiÇÇÊÆÆ(ÆäÅžÅUÅÅÕÄÄXÄÄãàÃxÃWÃDÃ<Ã/Ã8Ã>Ã<ÃTÃBÃWÃLÃTÃ4Ã,ÃÃë¿ÂlÂ6ÂÀÁvÁóÀ’ÀÀֿ޿տݿ׿ڿٿڿٿڿؿڿڿؿڿۿֿݿֿܿٿ׿޿ӿà¿Õ¿Û¿Ú¿×¿Ü¿MÀ×ÀNÁÔÁ[ÂÔÂeÃáÃgÄÍÄTÅÉÅ_ƼÆ4ÇÇÈbÈ·ÈÉÉôÉCÊ~ÊÄÊìÊ'Ë;Ë[Ëy˪ËÒË!Ì_̧ÌÍxÍâÍ8ΗÎϾÏÐ$ÑìѰҦӼÔÝÕר:ÙÚÉÛ7Ý‹Þâß0áŠâôã\åÌæ5è¡é ëoìåíMï¾ðòEósô˜õ¯ö©÷„øRùúÖúgûëûAüœüÔüÿüöüãü²ü’üeü üÑûrûBûÚú»úlúHú)ú ú ú*úWú«úèúNû û,ü¾ürýþÃþaÿæÐ¥eܰŠ8ßz © # š ó L s … f 8 ä q  q ýXÅá5€€”Yò»ykŽ«Ñá2“Á Yà%[ŸÉóòïñôê°€ä…#­#­,Ÿÿ3ÿ¢þ8þÁýNýóü~ü:üòûÉû­û…ûnûYûaûxû–ûµûìûümü´üýnýäý þ~þÀþJÿºÿI–þZÖFºn¼ n¨ KCOJ;Ù :ãyr }ÿÿœþþÄýBýüüºüœükü-üüêûüüüü!üGügü‹üÆüêüý ý1ýdý—ýÊýÒýÈýÁýµý×ýÀýºý~ýNýúüÏüüYüïûwûû‰ú/úµù@ùµø:øÊ÷K÷éööBöúõõeõEõKõAõHõ.õQõ`õõ§õ×õöNöyöö²öéö$÷D÷^÷V÷m÷~÷–÷°÷¸÷™÷÷V÷M÷S÷5÷÷ÝöÀö”ö‘öeöQö öâõ‘õkõHõ,õòô¢ôKôôÛóªóYó óºòŽò?òòÒñªñwñXñ(ñññññ-ññ$ñ"ñ)ñAñ`ñ\ñrñkñqñqñ€ñ~ñkñ[ñ=ñ%ññ*ñ+ñññóðôðñ)ñññþð ñ ññûðãðÉð™ð‡ð]ðBððÛï¤ï[ï.ï ïàî¼î›îrî]îKî>îîîëíÜí²í”íWí2ííÔìˆìì½ë‚ë7ëíêxêê£é\é&éßèšèVèèùçÙçÔçÉç¨ç—çjçjç^çpçSçGççççíæÛæ¦ækæ/æææåÄåzåSååûäÅä‰äVä2ääÝã«ãFã ãÃâ‹ââ¯á0á×àWàùßzßß™Þ-Þ¨ÝdÝÝÞÜ{Ü/ÜÐÛ±ÛšÛÛZÛÛðÚÅÚ²Ú¬ÚÚBÚäÙ¦ÙYÙ-ÙÕØyØض×^×ׯÖ]ÖÖºÕ\Õ ÕéÔÀÔ™ÔDÔ ÔÍÓ™ÓeÓÓÔÒŽÒEÒÒªÑ_Ñ7ÑþÐÍÐuÐ;ÐÐñÏÏÏÁϔυÏyÏÏ‘ÏÂϼÏÖÏÔÏéÏéÏÐÝÏÌϘÏrÏ-ÏþΠÎbÎêÍoÍàÌgÌãË_Ë·ÊÊiÉÔÈ6ÈšÇùÆ\ÆÃÅ"ÅˆÄ ÄÃ;Ãײª­¶¸ÂÈÂÇÂ×ÂÜÂìÂóÂÃÃÃÃÃÃà ÃbôÃþÃ]Ä·Ä7ŨŠÆyÆàÆ=Ç¢ÇñÇ<ÈeÈ…ÈÈrÈYÈ:ÈÈÕÇxÇ+ÇéÆ·Æ‘Æ}ÆtÆrÆŒÆ×Æ&Ç’ÇÈ£ÈPÉÊèÊÛË·ÌÍ‘Î~ÏnÐ?ÑÒçÒ»Ó~Ô=ÕõÕ®Öi×%ØÒØ’ÙOÚ8ÛÜìÜÌݹ޶ߎàhá*âúâÅã\äáäEåµåæeæŒæ‹æ¤æ¤æÜæåæõæççeç¤çèuèãè_éðéêKëïë¾ìYí(îÈîŽï@ðñŸñ2ò¿ò[óòóôÞô>õªõö€öÙö÷~÷Ô÷'ørø‘øßøùHùfùmù{ù‡ùŠù€ù‡ù]ù:ùöøÅøøtø.øü÷¡÷s÷A÷=÷;÷I÷>÷X÷‰÷ß÷_ø«øñøJù«ù@úÉú<ûªûüwüáü6ýƒýÈýþ(þ@þSþiþœþœþ¥þþ¯þ®þÁþ±þ®þ¡þªþ˜þ’þvþmþaþMþ/þ÷ýÒý¡ýsýZýýÎüŒüuüjücü]ü7ü3üEüxü—üÛüòü9ýiý°ýïý6þxþ þÊþÝþÿLÿ…ÿ‡ÿ’ÿœÿ±ÿºÿÎÿ×ÿÛÿ÷ÿ'@o›Æø1g¥ç@c˜³ÇãóùàçäßæîðÓ¿Ðê543@auy~cQ4(ù½†.Юq; Ѷ“§„oTH@ID6*ðÿ ûÿõÿÖÿ°ÿ ÿ¡ÿ˜ÿƒÿPÿ7ÿ/ÿÿ(ÿÿÿëþÊþ£þœþþþ\þ;þþøýèýÄýªýrý7ýýëüÔüÇüªüyü[üFüMüiülüƒüxü}ünüuü’üžüªüŒüŠü‡ü¡üÊü®ü±ü•ü—üuü~üVüaüBü(üýûäûÛûÎûÈû•ûû_ûaûYûOû8û!ûëúñú×úÔúÖúªúúUúEú!úúúÚù‘ùkù+ù#ùÿøêøŸø\ø*øøê÷½÷†÷R÷/÷ûöÈöŒöDööÒõõRõ(õõÄôôaô4ôô ôÙó¥ózó?óóÖò›òòBòòÏñˆñGññÚðµð<ð ð¾ï„ïsïJï?ïï ïçîçî¸îšîiî<îîÌí“íjíAííÃìbì1ìåëÆëqë8ëÝê™ê`ê'êïé¶é˜éméVé.ééõèÏè°èuè=èèðç»çŽç?ççÔæ§æjæ.æñåªåfååïäºä”ä[ä7äôãíãÌãÔãºãžã’ã˜ãŽã£ã†ãdãAã/ãããöâõâÍâÏâºâ¿â¹âÓâØâûâ ã(ãEã~ã›ãÀãØãîã ä(ä-ä=ä8ä#äéã®ãsã7ãúâÃâ…â!ââ·á“áQááîàÌàªààmàIà8à àþßÙ߲ߥßeß@ßüÞÅÞ‡ÞOÞÞÀÝyÝÝäÜœÜQÜÜ´Û€Û[ÛBÛ ÛÛõÚçÚãÚ²Ú¥ÚyÚbÚ/ÚñÙ²Ù|ÙDÙ Ù¸Ø`Øø××+×´Ö<Ö·Õ>Õ¿ÔGÔÈÓNÓÌÒbÒæÑÑ ÑÀÐoÐDÐøÏÇÏŠÏxÏkÏhÏfχϒÏÐÏÐKаРÑzÑàÑQÒÜÒbÓÔ–Ô+Õ£ÕTÖÖÖ×ù×nØØØ3Ù©ÙûÙFÚƒÚ¢Ú©Ú«Ú˜Ú€ÚIÚÚÓÙ“Ù9ÙöاØNØï׋×R× ×÷Ö¹ÖŒÖpÖ€ÖšÖÁÖõÖL×À×1ØßØ@ÙÚ™ÚvÛÜñÜ·ÝœÞsßkàNáVâ9ã9ä)å,æçèùèÜé•ê`ëì¼ìbíÞíFî£îïmïÌïð:ðYðŒð³ðíðûð4ñ_ñ°ñúñ>ò¢òøòQóÒó<ôÄô^õëõ•öüö»÷.øËø^ùïù‡ú"û¯ûEü»üEýÈýCþºþÿ\ÿžÿÔÿ+$Éÿ“ÿ^ÿÿ¬þþ¯ý:ýÐüeüøûû!ûÛú‘úZú/úúàù¸ù°ùËùÖùúú<ú‰úÁúûoû¡ûüKü³üýaýÐý$þþÿaÿÈÿ}¼ý9ZÌêûûêõäγ‡h$è¡xG&Çÿ¢ÿRÿ0ÿÿÌþ•þ\þDþþþëýØý³ýý‡ý”ý€ý…ýwýqýqýmýhýlýfýNý=ýýúüìüÎü«üŒüeüLü3üòûàûÆû²ûyû@ûûûüúÝú¬úOú9úúúØù³ù€ù*ùãøšøzøVø%ø øð÷û÷øøøøøøøAøWøjøcøeørø¥ø½øÞøîøù:ùaùƒù¨ùãùú#ú'ú:ú`úxúú‹úŽúŽú™ú›ú¡úŸú±ú´ú—ú¬ú®úèúîú ûýú û7ûWû‘û±ûÕûðûüNü•üÎü ý!ýQý‡ýÆýþ.þHþcþ{þ†þ³þÐþéþäþÁþÈþ½þÁþ²þ‚þXþ<þþçý²ýný;ýðü¯üPüüÊûzû6ûØú•úLúúÀù¤ùPù:ùæøÍøœø†øhøXø'ø'øøø.ø0øEø7øHø[ø€ø­ø»øêøù<ùùÃùú(úƒúúÞú û<ûjûxûœûšûÈûÆû½û™ûgû2ûûÑúúNúóù«ùIù÷øøMø&øè÷È÷€÷3÷ ÷Ûö»ö§öyöUö4ö#ö ö,ö$ö'ö-ö1öYökö¤öÍö÷ö÷;÷o÷÷À÷Ì÷Ô÷Ä÷Ì÷¬÷÷F÷õöžö*öÏõLõÖô8ô«óówò×ñBñŽðùï]ï¾î5îˆíí}ìûë]ëëêƒê%êÜé›éhédéBéHéWéxé½éèé:êlêåêXë×ëaìÈìEí¾íCîÄî7ï›ïâï+ðlð©ðÓðþðëðåðÒðÄð«ðƒð[ððÄïgï6ïúîÊîhî%îºípííÂìbìßë”ë"ë±êGêãéé+éßè[è+èÙçÏç ç”çç•ç±çÝçè<èmè†èµèÖè é3éUé?éLé"ééæè®ègèðç‡çç¥æ#æ¯åôäeäÊãAã·â)â¢á.á¥à7àÌßaß%ß×ÞÞ[ÞÞÞÞÞóÝ Þ'ÞUÞ Þ÷ÞQߨß8à¾à0áÀáuâãªã8äÍä[åáågæ¹æç)çWçeçiçWççåæ–æFæÖå\åôämäñãnãã†â-â¸áEáÁàXàóß”ß/ßÏÞfÞýÝœÝ7ÝáÜ|Ü+ÜÑÛŒÛ6ÛÛÏÚ±Ú–ÚÚŸÚ¬ÚåÚÛFÛ–ÛãÛ9Ü~ÜÑÜÝfÝ§ÝøÝ.Þ=ÞnÞ_Þ€ÞfÞDÞ&ÞîÝÒÝ–ÝgÝ)ÝãܰÜlÜ+ÜöÛ½Û†ÛKÛÛËÚšÚXÚ&ÚâÙ¶ÙˆÙnÙPÙ<ÙÙÙÙÙ6Ù6ÙfÙ~Ù¶ÙýÙ/Ú‚Ú­Ú÷Ú*Û\Û‹Û¤ÛÙÛÝÛÜÜ7Ü*ÜMÜKÜVÜPÜfÜxÜ ÜÅÜÙÜÝGÝyÝ¥ÝÙÝ ÞEÞoÞoÞwÞoÞqÞ`Þ-ÞäݘÝXÝÝôܵÜ|Ü@Ü ÜæÛ¿Û½ÛžÛ“Û‚Û‰Û˜Û²ÛÕÛ÷ÛÜ6ÜdÜÜéÜ)ÝvÝÄÝ'Þ›Þ,ßšß.àºàvá5âçâªã`ä3åÿåËæçIèùè¸éZêäêkëÓë=ììÈì íí.í ííäìßì›ìmì(ìñëÎë®ë~ëRë ëõêÀêÔêËêÓêÇêÌêöê%ëUëŠëºëìlìÖìMíÒíWîåîhïóï†ðñšñòòóòfóÏó+ôvôÐô=õõùõ:ööžö÷7÷‚÷½÷Þ÷ø4ødø„øÎøùaù¼ù úZú²úû”ûü¡ü ý¥ý:þÜþ‚ÿ(ï7ÚŠ?ô‰ŠxÜ5k²Ú 1   ' &  !    5 , 8 A Y V \ H > E 5 1  êÛÕÌ×ÎÙÆÛû0 T Š ¨ Ú 7 ^ l u Œ ™ ¦ • ‚ s Z ;   û æ ¾ š { f = $ êà©jcHAîÛÞêøí M\›¼ù2 h ·  d ³ ì 6 t Ð  R Š · Ñ õ  , I P ^ p ¦ À Î Ï Ç Í Á Í » » ¦ y b 1 > 4 × ¥ Ÿ } n ] N H > 9 H k ¥ ´ â b º V¡Ø}À?gs¢¶Ì¿»š‹fN/ݦ‹bsB1ò×͸±¢‘tvnpaR\Xnoy}€npkghSO:é  z % Û y A Û ˆ  ¤ . Ò i £7߆<ô³i%ã·¡wf6âÕµ¬Ž†ncJH.2ùòüüú" îÕ¤o8Ó£^ ³mè¢XÕÿ£ÿ†ÿWÿ1ÿ ÿÚþÖþ©þ¥þ~þiþ[þWþDþHþ=þEþTþRþBþ?þ6þ2þ;þþ þöýàýßýÁý½ý§ýýný;ýýýüÉü™ü.üêû–ûkûûÇúYúñù˜ùGùÞøøøÃ÷c÷*÷ðö·öƒömö>öNöFö^ö`ö~öwöö…ö­ö½öéößöñö÷÷'÷ýö÷öãöíöÑöªöŒöwöoöWö*öïõÕõ¨õõUõ*õÔôªôEôô³ójóÿò’ò'òÂñ[ññ¥ðNðÜïžï\ïBï#ïïïï<ïxï³ïÜïð\ðÍðñsñ»ñäñ5òMòlò‡òˆò¥ò}òvò?ò òïñœñJñáð„ð.ð»ïRïçîlîîƒíöìlìäë]ëÌê6ê éýèrèáç^çÔæQæËåXåå˜äSäñãÏãœã‘ãˆãã¤ãÊãä2ä|äËä/ånåÌåææäæTçœçîçè_è‰è è³è«è¨èŽèmèFèèÉç†ç4çëæ›æIæðå’å/åÂäOäÛãWãëâTâÍá5á¥ààŠßýÞƒÞö݇ÝݶÜkÜ>ÜÜïÛïÛïÛ!ÜEÜƒÜÆÜ ÝqÝäÝYÞÔÞ4ߪßÿß]à¶àáTáuá»áÙáâ-â6âXâXâbâKâNâ=â;ââýáÔá¯ánáQáÿàÕà~à@àÉßzßß¼ÞIÞØÝ=ݽÜ)Ü©Û!Û£Ú*Ú»Ù_ÙÙëØÐØ³ØØyØu،ؓضعØÏØÚØïØÙÙÙÿØçØ½Ø·Ø¤ØØfØ>Øþ×Ò××]××ÜÖ Ö[Ö$ÖóÕÝÕ¥ÕkÕ'ÕíÔ­Ô”ÔcÔ>Ô/ÔÔÔãÓûÓÔ,Ô.ÔRÔjÔ¨ÔÙÔ0ÕhÕ¼ÕÖ€ÖùÖX×è×FؾØ#Ù‹ÙÿÙkÚÞÚBÛ¬ÛÜrÜàÜQÝÉÝ3ÞƒÞÞÞ ß£ßÛßàJàoà‘à¹à¿àÀààžàkàYà,ààñßÕ߾ߔßߗߚ߫߻ßáßàFàhà¾à÷àNááâwâïâsãõãiäíähåíå}æçšç è™èééêzêÚê*ëëÕëì^ì©ìÔìí0írí¬íöí(îyî§îøîKïšïìïBððûðgñïñjòõòó3ô¶ôXõåõö;÷å÷¢øCùú¹úŽûBüýü›ýJþâþŽÿ¨é+ºï )%4æ¦Rö®{-ü½ŠMæÿ¶ÿ‰ÿgÿHÿ2ÿ4ÿ=ÿ5ÿUÿtÿžÿäÿ%r¶7…|tÝE‘ø\‚¯·ÒôþÝdž?,çµu+úÙŸ^:Ú¾œ’uUK0KS\ªå2xÚ>²“z–~ìX ¾ ! Ï  G t ™ Ó × ð Û î ë ÷ â Ý ² ‰ g 7 Ñ ˜ Z & ü å ¬ ‰ c I 9 '  ( 2 J g } ¼ Õ  ) j ˆ Ì ô , [ ‚ § Î ý  [ ‚ ° Ú î * 4 t ‡ ´ Æ Þ ñ ð î ù Ò È   – h F  ì Ï ˜ } M F  û  ð ò  ÿ + / U z £ à ï  S z ¹ ï 2{·[œí*}¹þ4_‹®ÄÖéÏᯣn9Æ,Ö?ñ–Dò ± l + ô Ä ž | ` ` N Q > ? : U V g i r ƒ œ ¨ ½ µ ¹ ¶  ± ± ‚ € ` @  Ú ¢ u 7 ì ¨ D ý — 3 °4È@¸;«B¯!“%·[è…S úãØ× "X{À×2\n޾Ú'(0EK/ ûÓ¾_߇[Ûˆ¿ÿ]ÿöþjþþ¨ýdýùü¸üZüüßû£û…ûZûNûûöúßúÌúÅú¨úúFúúõùÙùÌù•ù`ùùùïøáø²ø†øfø\øZø\øOøRøIøNøDø=ø9ø7ø)øøà÷¼÷¬÷÷o÷L÷G÷+÷2÷%÷"÷9÷<÷Y÷S÷n÷Ž÷´÷í÷ø=øUøuøšø²ø×øæøÏøÞøÎøàøÅø›ø`ø$øøÁ÷§÷X÷ ÷¤öTööÈõ‰õ5õÝôgôô¯óeóÝò„òîññúðŒðð’ïï³îAîúí{íAíÛì‡ìKì6ììììì7ì<ì\ìì¶ìôì+íxí íèíîWîîÌîï ïGïnï®ïÆïâïÙïÖïºïœïoï9ïåî˜î5îóííAíÖìwì ì¯ëEëéêšê7êöé‘é?éôè©èrè(èÞç¡ç[ç#çáæ›æ`ææëå˜åZå'ååÕä™äWä äõãàãÆã¡ãƒãaãLã;ã@ã(ã#ãÿâçâãâÊâÎâ·â™âzâkâ>â3â âðá«á}á<ááâà¶àoà;à àáߥßwß#ßèÞ¦Þ?ÞÞ­ÝzÝ3ÝàÜ™ÜCÜÜØÛ”Û]ÛÛïÚÉÚ©Ú›Ú‹ÚšÚÚvÚZÚaÚUÚoÚ_ÚnÚaÚ~ÚoÚڗڡڌڠÚÚ±ÚŸÚ³ÚšÚ²ÚÀÚ¾ÚïÚñÚ Û"ÛCÛWÛoیۤۨۓۑÛvÛpÛBÛ"ÛÛíÚ½Ú˜ÚMÚ'ÚíÙ¿ÙyÙJÙÙêØªØ‹ØiØ)ØØé×È׷י׋×o×k×V×W×\×d×v×y×¢×ÀרIØŸØùØfÙÎÙPÚßÚaÛöÛÜ&Ý¿ÝJÞïÞißàoàøà]áÓá4â‚âÔâüâJãbã–ã’ã§ã¡ãã¡ã•ã„ãyãfãaãDãLã1ã-ã-ã;ãEãbãã´ãøã3ääØä,å‚åüånæþæšç6èÐèˆéHê#ëìëìòíÛîãïêðêñöòùóÿôûõáöÔ÷§øsù@úãú–û(ü¤ü%ýlýÎýøý.þJþTþ_þMþ9þ+þþäý®ýŠýHý!ýäü¹üüWü+üüÜûÕû²û´û«ûºûÎûñûüHüŠüµüLý±ý=þÅþ<ÿÜÿ{*Ì€÷ŠŠ„ëS•÷]mŠ…pW,ò¯j(Ò‹Ôu¼`Ð{[åÒÁ¯¾¿éùMzÝ2›sùníhÞH¾$~àÿ? P Y S U )  ܺl7ç™R«Qï™#Ü|7ó·€L<%"9_‘Å#jØN¹:¿HÒnõ” ¯ 9 · 8 – ú U £ Ú û â › a    J Ô n ý | û j ø£,àuAð¤h*éÐϯ©¦­³Óà#C}—Éø=pŒ©Ï×ïßÖÅŸŽQ&ΟKʼn=ð¨g9ïÖ{]þû¹°‰uXNNTS\^w†·Î,c}¥Í÷#9QTeliQW,#éé±^ûÒÀ”_?$ õáÖÔàóÙîÓáÒÙÎÜÐÝß MLhc—±Ùãû 33AG`^aNIKP1#èä³¢‡W+õ®i1ùÿ©ÿVÿïþ™þ7þéý„ý ýüü—ûDûËúJúÆù/ù·øTøÍ÷e÷ëö†öAöèõ¨õsõ=õ.õõàôÏôØôÎôÙôÛôÜôäôùôùôõõ õõÿôõõ%õ-õ.õ@õ@õ`õ‚õ²õáõüõ%ö>örö¥öçöôö,÷5÷i÷ƒ÷¤÷½÷ª÷Å÷£÷®÷£÷Ÿ÷Ž÷h÷?÷ ÷÷Ëö£ö`ööáõ õoõõçô¤ôYô!ôãó­óbóAóóËòŽòPòòØñ¯ñeñ(ñÌð•ðjð<ð÷ïÓï{ïEïüîÒî›îlî6îüí»í†íní2ííÆì ìiìPììóë¡ëqëëÝê£ênê*êøéºéœé€édéCéAé%ééýèøèçèîèßè×è«è¦è•è…èjè\èèëç¥çCç ç²æqææ§åNå åÏä¢äZä%äôãÏãÐãÅãËãÄãµãœã¡ãšããmãGãÿâÐââXââ¸áUáíàà8àëߣßXß ßæÞ¹Þ£ÞzÞ_ÞKÞ0ÞÞÛݸ݇Ý`Ý"ÝÕÜ’ÜfÜEÜ4ÜÜ ÜÜöÛÜÿÛ-ÜWÜ„ÜÁÜÝlÝÅÝGÞ™ÞíÞAß{ß½ßñß à àúßÖßÈߨߊßKßßáÞ§Þ‹Þ`ÞÞéݱ݉Ý8ÝÝÒÜ™ÜDÜýÛ•Û`Û ÛµÚCÚÕÙ}ÙÙÄØØBØ*Ø Øÿר;ØxØËØ ÙzÙùÙvÚÛ”Û7ÜÆÜUÝÍÝ[ÞÌÞPßÃßàsà°àüà%ácá~á›á’á‡áƒáuáváCá4áùàùàÏàÃà à}àhà6àà÷ßâßßßÊßÉßÍßÜß à3à^àˆàÕàásáÖáAâ¸â5ã¾ãEäÕäMåñåæççûçVè èöè0éOéqéŽé·éÐéðéÿé êêêê"ê)ê?êLê_ê|ê»êáê,ëJë¤ëØëKììíJí®í îqî×îCï¡ï ðnð÷ð=ñ­ñýñ`ò¶òóóÕó3ô•ôõUõªõäõ/ögö¡öÔö÷,÷m÷˜÷É÷ øRøøÆøùyùÒù[úµúûzûðû|üáü_ý¾ýþvþìþ1ÿÿ¹ÿïÿ&N§Ì#Wrž°×Ûïì'>4R\ƒ’†´·ëñ(<U]dƒž¼Õñ%DkŒ¬Ùçú90=4õôÍŒD Π\ ¹s<¿i1Öž{%ßÿÀÿ“ÿÿ”ÿÿ™ÿ’ÿ®ÿ¹ÿîÿ3yÖDw¿ò-X€ˆ¶ÏöêþãÜ×½ŸjM áÀhJöåáËÒØêåðåê '=C^rƒz¤¶í /Pk‘¿¼ÙØîîúåìÈÐ¥®}…T5 íγ–‘†zfbIQJYjsަÏó1P”²1ŽÇ!LÖOmª¿éü6U0òãóпU÷ºŸnGÿÃų®y](B-N// ,.& õã¾§dG$þÉp;ȉ-èÿ–ÿjÿ!ÿÖþ®þtþTþþÆýªý†ýýPý+ýïüÖü¶ü¶üœüüüü{üüÇüÝüîüèüñü ýKýgýý˜ý¬ýýÉýóý%þ+þ)þ(þIþjþþŒþþ‹þ°þ®þ¿þÆþÜþÝþéþÑþêþõþùþûþöþèþÿþÿþÿÿÿÿÿÿòþÿüþ ÿìþåþÑþÉþÍþÚþÌþ¿þ‘þþŽþ“þtþFþþÎý¨ýrýHýëü¸üZüü¸û—ûOûû¼ú†ú=úFú+ú5ú$úúú#ú0ú>úAúEúCúEú2ú+úúúúÛùºù†ùiù[ùHù/ù ùÔø¨ø¢øø‘øxøsøgøaøWøpøøfølø<øVøTøtødøpøLøqø†øªøÈøÓøðøù<ùVù‰ù—ù´ùæùóùú*ú;úBúDú úùùÃù…ùMùÞø†øí÷ˆ÷÷Ÿöö¡õ'õªô>ô¶ósó/ó óÎò—òkòzò¥òÕòÔòàòóóJóló‰óƒóŠóŽó»óÒóðóÑóéó¾óëóàóôôôôÿóôôôôçóÁó¢óbó(ó³òTòÇñOñªððyïîîvîæíRí¿ìJìäëŽëëÈê…êKêêêùéêíéóéåéúéê,ê&ê"êê'êê2ê#êêýéâéñéÚéÑé¡éé\é<éüè·ègèèÌç[çûæfæöåPå±äÝããVâ‰áà®ß¼ÞòÝÝ>ÜVÛÚÙÙ\Ù²ØSØæ×Çעו×q×m×o×s×”×¥×Á×´×É×Ï×é×ü× Øþ×üרØüרñ×ü×éרØIØb؛؟ØÚØøØÙÙÙóØÍØ{Ø,ØÉ×[×ÔÖGÖœÕãÔ:ÔzÓÛÒÒxÑØÐ0ÐÅÏOÏëίÎÎdÎqÎqΛÎÔÎÏXÏÏÿψÐÑ–Ñ)Ò¾Ò_ÓóÓ›Ô8ÕäÕcÖן×9Ø´Ø!Ù”ÙüÙVÚŽÚÃÚáÚÛëÚÒÚ€ÚBÚØÙpÙߨ<Ø×éÖ+ÖnÕšÔãÓ%Ó€ÒßÑsÑëОÐ4ÐÐÐ ÐÐQÐoÐØÐ&Ñ‡ÑøÑ|ÒÓ†Ó9ÔáÔÉÕÖn×SØAÙ;Ú*ÛÜðÜÉÝÄÞßWàòàá5âÉâ8ãxã¤ãÄãøãä*ä"ä-ä,äNäbäväoäxä{ä£äÜäåtåÏå(æ‰æÿæaç èŒè ééê¸êbëõë‰ìí¸íbîï‘ïDðçð¾ñaò ó¬óeôþôºõ6öÊö6÷°÷øjø´øÈøÖøÚøÔøÔø¦øœøeø)øô÷­÷‡÷T÷÷ÞööwöeöhöJö#öûõêõö7öbö|ö·ööö?÷Ÿ÷â÷Fø™øòøQù¸ù-ú¥úû€ûãûRü´üý[ýªýÓýþ0þVþ[þaþsþjþHþþÇýý-ýÖüeüÔûLûÃúWúÙùDù¸ø"ø»÷Y÷öö§öSööÛõÉõ¬õ±õžõÅõÏõ öWöÀö÷x÷å÷IøÕøBù¾ù"ú˜úû…ûôûcüÏü2ý’ýåý:þzþ¾þýþ/ÿLÿ_ÿaÿlÿ_ÿ]ÿ1ÿÿÛþÀþþŠþXþIþþûýÄýÁý¿ýêýßý÷ýÿý;þþÉþ ÿWÿ…ÿÉÿ%÷O¨ïA ZžëZ’Ó$J]”´ãí÷ ßÏ­›}C¶›f3ÔˆZ.&  ôìéþ;y»åO¤ó0e‡”Çç+=W1-"ûÔ“Y Ëk¶OÛt#å¤:çžk#üÿÔÿÊÿ³ÿ›ÿwÿ†ÿ°ÿÇÿÊÿÁÿÒÿäÿ(N‚¢±Ðõ?h›~’×îúùбƒhX4ü˜SÔÿ¤ÿ;ÿÜþiþþ¾ý‘ý$ýÝü…ü%ü»ûiûûÖú†ú=ú÷ùÅùùdùLù*ù ùÐøªøžø¦ø³ø¯ø¬ø±øÖøëø-ùQùù˜ùªùÚùùùúAú:úiú€ú«úÑúåúû ûûùúåúêúÖúçú¾ú©ú~únúPú2úáùªùdùBùùÔø”øCøì÷“÷5÷×öö&öÁõvõõ§ôBôôó±óbóóÃò„ò[ò1òîñÃñ‹ñjñAñññððÌðœðlðUð(ð;ðð÷ïëïæïýïð!ð/ð?ðAðxðŽð«ð·ðÍðîðñ&ñ;ñVñGñ`ñGñBñ!ññïð°ðeððÅïxï-ïÌîwî/îÝíkííÛìµì†ì-ìíë¾ë¼ëÉëËë±ë˜ëžë°ëÒëáëÔëÊëºëÏëÞëíë÷ëÿëöë ì#ì=ìbìxìŽì¦ì½ìÐìíí<íí%í3í3í8íííÕìÕì‹ìiì+ìðëÂë€ëëÏê”êaê/êÙéŠé8éóèÆèpèOèèÒçwçVç0ç5çççéæíæ÷æ!çNçyç‰çªçÐçèJè|è|èˆè±èâèúèéþèêèÖè©èxè:èèÕç–ç:çêæÄæƒæ[æÿåÔå—å`å/åéä§ägää¶ãaããêâ¸â‹âTâ âááµáxá;áøà¶ànà6à/àààëßÖß§ß§ß…ß}ß_ßLß=ß$ßß÷ÞÃÞ†Þ-ÞÏÝ–Ý3ÝâÜmÜ܆ÛàÚTÚÙóØ,ØeשÖÓÕ+ÕeÔ³ÓÝÒÒcÑÈÐ$ЊÏÏŒÎ1οÍ]Í!ÍÍÁ̼̾Ì÷ÌÍUͦÍÎqΣÎ÷Î-ÏŸÏëÏAÐ¥ÐÑuÑÅÑ/Ò€ÒÛÒ ÓdÓÓËÓøÓ6ÔAÔ4Ô'ÔÔÛÓ¯Ó‹ÓOÓ&ÓÓéÒ¾Ò­Ò‡ÒvÒcÒƒÒ—ÒÁÒïÒ,Ó¥ÓÔÔ Õ€ÕÖžÖ)׳×-Ø×ØiÙÚÚÛ¸Û3ÜÊÜBÝÂÝ:Þ²Þ ßpßÙßHà›àÖàõà á'á7á4ááÄàkà6àÝß’ßß Þ Þ´ÝKÝöÜ£ÜVÜ)ÜñÛçÛìÛçÛÜ6ÜhÜÂÜ$ÝŸÝÞ¡Þß²ß8à×àmáðá¥â7ãä­äaåæäæ©çeè'éÙéšêzë+ììì•í7îíîï,ð»ðñ“ñâñ/òpò ò½òÚòÙòëòóòóóóóþò óXó¡óáóô_ô¢ô=õ¼õCöÍöc÷ø¦ø<ùØù^ú×ú8û–ûéûdüœüóü ýJý€ý‹ý•ý–ýžýŠýýqýGýýÝü¬üü4üÙûoûû²úhúú›ù6ùÖø–ø/øï÷‰÷N÷ ÷íöÔöÖöàö÷0÷÷à÷YøÝø@ùÌùFúóú•û%ü±üý‹ýäý]þªþöþ1ÿ…ÿ°ÿêÿÿÿ>_gvhSJ?Òÿ¦ÿrÿIÿæþ˜þ.þØýkýý³ü^üü§û^ûûéú×ú¤úƒúkúhúƒú¤úÐúôúû7ûoû™ûåû$üwü·üýOý¬ýñý@þþ¤þíþÿrÿ›ÿâÿP¶Û &Ot—¥±¿Â­„pgcJ%øÝÁ¶¬¶ ½žÅÓé娸û&4;<)*,øË“e6 Ûÿ³ÿƒÿfÿ1ÿ'ÿÿéþ·þŒþ‹þ€þ~þQþ8þþþþõý÷ýÛýÇý”ýbýSý?ýSý%ýýòüüüõüýý0ý.ý%ýGýtý§ýÕýÎýõý þAþfþuþ€þjþ`þNþ>þ@þþ#þûýôýùý þþþþøý þþ þþþþþôýþñýçýÅý«ýœý{ýxýlýhýlýWýXýEýNýSýhýpýxýwýƒý‹ý©ý›ý©ýˆý¡ý‹ý½ýÓýÒý¶ýý‹ý˜ý—ý~ýaýDý+ý ýñüÖüªüŒükü?ü5üüùûîûÈû¤ûŸûƒûzûfûcûaûTûGûEûHûDûZûYûƒû€û¬ûÙûüZüü¨üÕü ý8ýuý~ý§ý ý¿ý³ýÛýßýñýßýÙý¹ýÇýÉýÑý¹ý«ýýŠý}ýhýKý&ýÛü§üJü-üÈû‹û#ûÚú€ú'úÔù}ù.ùÒøxøøÒ÷“÷Q÷÷½öŒöEööÛõ¨õŠõ\õ0õõÛôÌô³ô±ôŒôtôpôuô’ô˜ô’ô„ô‰ô‘ô¨ôžô¡ô~ô^ô;ôôùóÅóƒóóÑò]òòàññKñïð±ðfð3ðïï«ïMïïÈî¡îSîîÙí§í„í;ííäìÀì²ì„ì‡ìvì“ì±ì×ìí*ígí¤íÝíîRîŠî±îÀîÓîÌîæîÏî³îlî"îÌí{íí ìì}ëêêOê½é'éoèÔç$ç~æÝåOå»ä=äÆãKãèâ…âSâÿáÑá•árá{ááœáªá½áäáâ7âFâ‰âÎâýâ@ãiã¦ãßãäQäläŽäŒä”ä–ääXäþã¡ã<ãÈâLâ×áFá¸à$àß ßÞÞÝ%ÝÄÜ`Ü ÜÖÛŠÛcÛ+ÛÛÛÛ)Û3ÛMÛ^Û‚ÛªÛÆÛ Ü$Ü[ÜzܤÜÞÜÝ)ÝKÝ^݃ݕݩݱݶÝËÝÃݺݭݘ݈ÝpÝ"ÝõܤÜ\ÜܼÛRÛñÚwÚþÙ—ÙÙËØRØî×’×$×ÜÖwÖ.ÖãÕ–ÕXÕ ÕÒÔ¢ÔfÔ/ÔêÓ¯Ó‹ÓNÓ.ÓÓéÒÚÒÁÒÐÒÇÒÚÒøÒÓ<ÓWÓŽÓÅÓûÓ:ÔsÔ¨ÔÙÔÕ/Õ\ÕƒÕŸÕÀÕËÕÑÕÒÕÑÕ½ÕÑÕÄÕÍÕ¹ÕÊÕÂÕîÕçÕ ÖÖÖ/Ö9ÖZÖ]ÖvÖÖžÖµÖÉÖàÖûÖ×<×i×…×¶×Þר<Ø}Ø¡ØÖØöØÙGÙlٖٟÙÄÙ¼ÙÑÙßÙÔÙÚ٭ٖÙrÙNÙ'ÙíØÆØŒØkØFØ ØØúרó×ö×Ú×ìר#ØEØmØ©ØÙØ'ÙiÙÀÙ'ÚyÚâÚ$ÛÛ܇ÜïÜNÝ®Ý+Þ³Þ>ßÀß7ààáiáÞá6ââ±âïâã/ã[ãjãƒã…ããpãvãrãuãdã:ã3ã6ãIãaãvããÐãäzä»äå•åæ“æçç$è¸èWéÖé]êìêpëñë_ìµìídí²ííí#î^î~î î²î·îÌîßîßîõîÔîÈî±î»î¾î³îŽîƒîmî‰î}î„î~îîÁîóîQïïõïWðÌðVñòñ´òmó6ôöôÔõªöš÷qøGùúèú¬ûvü ý­ý0þÊþÿ˜ÿÄÿ'cq€chBL( ìÿ²ÿ¡ÿ{ÿWÿ2ÿþþØþŸþ€þQþ5þ)þþ þþþ&þGþWþ|þ¤þÛþ3ÿiÿÝÿ!¤þcÂ4—úd­ñ NйÐèßåÙᨚd82úõÇvRXYWA,$@Ul‡ªÎ`´eÆA¯0«ª. Î ] î  î b Æ  z ° Þ ò ï í Õ ¶ { `  à ` È D î } + Æ “ 4 çŒ7óµn[Ú¶‘“š§«Ñº+¢çM Í$ N ƒ « Â Û ð ú Ó ¶ G ) ÙHÚx ¨@ç•2Øt%ð¿”d4/ÿí 7Hˆ‹ÊýC¨`´ CŒÃ,”ÚG€Æ & 2 1 / %  ÿܤp+ôË”h×›]3øÆ~c<1"% ò×¶«s€J+áК˜†WA òÞãËÒ·¦Žƒ{U: ñÅ‹AФR!Îÿ‘ÿLÿÿÉþ¤þYþEþ$þþ#þþþþ2þ\þ_þ„þ}þ‰þ¡þ¤þ¿þ±þÅþ°þœþ£þÐþÝþÿþüþ!ÿÿIÿQÿjÿ]ÿcÿoÿ‡ÿŸÿªÿ¸ÿÔÿðÿ1;QVtz““ ¬¹ž‘•~…lT(æÿ¾ÿzÿQÿÿÚþwþBþÝýŠýýËü&ü û4û­úcúìùsùù¤øoø+øø«÷{÷J÷9÷$÷ ÷õöÊö•ö…öƒösöpö_öRöKöNö_öVöƒö†ö±öÄöéö÷7÷X÷s÷˜÷¯÷¸÷Ý÷î÷øFø[øeøkøvø™ø”ø—øønøløfø^øKøMøøøÛ÷Æ÷£÷x÷<÷÷ö½öiö<öþõ¹õnõõ×ô”ôXô!ôÍóónóaó9óóùòÛòêòÉòÝòÁò¬ò¹òÃòÔòàòúòóóó-ó#ó5ó.óóóêòÛòÅò›òuò[òòòéñÉñ’ñ~ñZñ0ññíðÄð­ðˆð|ð-ððÖï¨ïwï9ïìî²îjîEîîøíÔíÐíËíÕíËíòíî(îUîeî…î³îãîðîïï,ï.ï=ï(ï!ïïêî·îiî?î¶í“í!íôì˜ìQìåë‚ë%ëŒêêÄéZéæè“èòç‚çøæ–æ&æŸå4å¿äRäëããKã ãàâ—ââ>â8â1â#ââââ âââêáÒá°á™ápáRá%áãàqà3àÑߟßPßßÊÞpÞ(ÞäݶÝÝ6ÝçÜ¢ÜTÜ"ÜùÛ¥ÛkÛAÛ÷Ú ÚoÚ$Ú ÚâÙšÙmÙHÙ9Ù;ÙHÙRÙAÙ=Ù6ÙÙöØÙàØžØ^Ø5Øì×ß׬×e×$×ÞÖuÖ/ÖÊÕXÕüÔ—Ô)ÔÁÓƒÓ0ÓÕÒÒQÒÝÑ¡ÑHÑÑÅÐÐ@ÐÐäÏßϵϮϦϸÏÙÏÐNÐ¥ÐåÐ@Ñ‹ÑèÑ)Ò™ÒÓrÓæÓDÔÈÔÕ¯ÕÖiÖ»Ö×[ן×ü×WؘØÞØÙbÙ«ÙÿÙGÚ”ÚÜÚÛmÛ¯ÛàÛÜTÜ{ܱÜöÜ?ÝJÝƒÝ•Ý¼ÝæÝãÝ ÞÞ?ÞJÞmÞÞ­ÞÙÞßß[ß“ßÜß+àpàÊàává¬áÿáFâ}â»âßâ ã0ãaãlã™ã}ãvã›ãã›ã²ãÀã·ãÍãáãøã/ä$ä\ägä’ä±äêäìä*å:å€åå¾åçå%æKæoæžæ£æÞæ$çVç°çôçOè™èéséüéfêäê`ëÏëUìÅìRíÔí8îÀî%ï¡ïð¬ðñœñòòótóñóeôÌô/õ’õéõ]ö¾ö÷[÷÷Æ÷ø1øIøWøNø_ø^øløSøPø#ø øò÷ç÷¿÷œ÷…÷x÷d÷H÷÷÷ ÷ ÷0÷9÷I÷l÷Š÷¸÷Å÷ÿ÷!ømøŽøÒøùVù§ùöùBúúéú;ûûËûürüÙü5ý“ýÒý$þwþØþ1ÿŒÿËÿ]äZ•Ê6tŸÃãþ\„«în­ö*k¬ý%\†ØúAKc—ºÚñþÿÿû  +;37%:0\Z]S\h„”¢£Ýã  ? b | ¨ Ô  ? z — Ï  8 l … ½ Þ  " = ] c ” Ž ~ ¥ Ÿ š   ­ ± ¶ ¶ À » Ì Ö Ø à Ú Ø Ó Ä Õ Ó Ì Ê ² ´ › § ‡ z f _ N B 1  â Á v <  ñ Ç £ z ^ ,  ö Ó ¸ ¡ { x V ] ? M G J ] ` r ƒ – £ ¬ ¹ Á Î á þ  !  , 4 < P L a V v t z ‰ Œ | t v g Z I &  å ¿ r A %  ðϹ‘iHùЦŽfFñص©‚tSO;* ⿳›vQþј^2Ý f3ã¬A8% îÜßç&+@;\i…‡˜ˆ‚‰VjD5ù× wAÁ†Pøÿ¦ÿ,ÿÜþ;þíý`ýÿüsüü€û6ûÉú‰ú=úþùÒù®ùœù•ùžù¦ù¯ùªùóù#úlú£úÌúôúû`û†û­û·ûÉûÚûØûÜûåûÞûÐûÀûûvû9û$ûâú¤úTú ú·ùYùïøuøè÷`÷¹ööeõÃô!ôXóÅòòeñºðEðœï5ïÔîŒînîAî(îîî%îwîÀîïWï¥ïãïðJð‰ð»ðÓðñîðñññ÷ðìðºðyðfððÙïlïï¡îî°íí’ììhë½êêiéÂè8è˜ççiæÉå5åÊäfä ä³ãzãHã%ãã=ã<ãrãžãÂãäcä¬äðäåZå‘åìå9æyæŸæÆæÓæòæïæøæñæûæÎæÌæ¹æ”æækæ_æ+ææÙå¥å‚å[å(ååä¹ä”äQä:ä÷ãßã¬ãŠãKã/ãããôâÏâ²âÎâ×âôâã7ãZã‰ãÄãä:ähäšä¢äÀäÜä×äÁä‚ä4äËãvãôâzâÝáálà©ßùÞBތݽÜôÛOÛÌÚLÚíÙŸÙ6Ù÷ØÆØ‰ØkØdØØ¨ØËØíØ+ÙbÙ¯ÙÚTÚ°ÚÛZÛ¶ÛÜŠÜ ÝpÝÚÝdÞÖÞLß›ßéßà5àFàUà>ààÒß;߯ÞEނݩܢۛڰٽØÞ×øÖÖQÕŠÔÈÓ.Ó˜Ò0ÒÆÑhÑ5ÑÑÑÑ#ÑÑÑ)ÑCÑpÑÑâÑÒVÒ¶ÒòÒ\ÓªÓ÷ÓHÔÔÝÔ ÕpÕ²ÕýÕ=ÖfÖšÖÔÖ×R×q׬×Ð×þ×2ØX؈حØÏØÞØÙ;Ù]و٦ÙÍÙçÙÚJÚyÚ®ÚáÚ ÛZÛÛñÛ1ÜÜÜÜ5ݳÝÞzÞÚÞ.ß”ßüßSà”àâàáAádáŠá—á á›á˜áá“á~áqá^áVáUáGáEáAáRáXáá™áÑáúáHâ“âãâ4ããÞã<ä{äñä>å¨åæ=ææïæGç£çÐçèbè”èðèéJéWéoé™é‘é‘éféfé`éMéCé#éééééé é*é@éeé”é»éê_êµêë~ëàëEìžìììIíší îHî•îÄîïaï­ïôï#ðnð¡ðñ=ñ—ñÕñ!òRò~òµòúò3ójóŒó³ó²óÇóµóÁó°ó§ó…óó«ó°ó¸óÆóÔóôüóôô(ôSôjôŽô¥ôÆô õ?õrõ«õãõötöÌö'÷Œ÷ó÷eøÍø[ùåùvúëúˆûùûœü"ý¬ýþ{þÃþ6ÿŽÿñÿ7y®ã2Gfm’—­³¯—˜‚aFܤ”e[H%öÿâÿÔÿ¿ÿ¿ÿÉÿÀÿ¸ÿ§ÿ§ÿœÿ´ÿ±ÿ¬ÿÿ‹ÿhÿlÿTÿHÿÿ÷þÐþÄþ¡þþdþ5þþ×ýºý}ýJýýéü¢ürü<üü¾ûsûAûûîúÌú³ú¦ú¢ú£ú¢úÆúÍúýúûaûŠûìûü‚ü±ü ýaý´ý þQþ§þéþ?ÿbÿ¹ÿäÿHd“ŸÒÕçñúúÖÞÂDZ‘\@úÿßÿÿcÿÿÁþ€þ>þþâý¨ýzýRý!ý ýýàüÊüºü³ü ü¸ü½üÛüÝüúü ý'ýFýaýtý•ý­ýØýÝý þ)þiþ†þ–þ­þÀþàþÿÿÿ ÿÿñþöþßþâþÇþœþ|þNþIþ#þþ¶ýoý5ýýüãüªüqüüÚû’ûnû6ûûú»úúBú(úòùÛù©ù—ùnùTùùÝø¶øøJø øÃ÷¤÷÷^÷#÷÷õöëöÀö»ö³ö°ö‹ö„öSöoö\öböGö"ö,öö öçõæõ¨õ‰õeõXõOõZõFõ9õõ+õ%õ;õ@õMõ4õ2õ9õFõgõwõjõ|õ“õ¿õáõíõôõ ööööööö4ö%ööö öîõÐõÅõšõˆõZõ=õõêôÍôŸô3ôîó…ó]ó ó¶òoòòÓñŸñkñ$ñ×ð©ð†ðsðjðRð7ðð$ððþï ðíïðúï ðððð"ððððGð8ð<ð:ð7ðEðFðEð4ð+ð%ð'ððýïìïËï¾ïïyïGï:ïïïøîÃîªîjîoîLîIî$î îñíìíÀíÝíØí×íÃíÑí¼íëíûí2î,îHîiîŸî²îÙîñîòîïï6ï;ï6ï-ï"ïýîÛîÅî‚îMîî­íIíÞì‚ììëëœêêŠéüèmèÕçXç­ææ_å¿äDä¶ãMã«â-â¾ágááÀàZààØßÀß—ß‘ßpß`ßZß]ßwߑ߶ßÂßËߨßãßêßýßèßÝ߭ߘß^ß>ßåÞ¤Þ8ÞãÝÝÝ§Ü ÜÆÛEÛëÚ_ÚúÙˆÙ8ÙÑØvØØ»×x×A××ÕÖ©ÖvÖcÖMÖPÖTÖkÖqÖ~Ö ÖÆÖÙÖ ××F×_ד׿×ôר+Ø*ØOØZØzØrØlØNØFØ%Øñ×Ã×|×'×âÖ’Ö6ÖæÕÕ?ÕÕÔ†Ô@ÔþÓ½Ó‡ÓHÓ%ÓÓýÒëÒûÒëÒÓÓ"ÓDÓaÓÓ°ÓÎÓÔÔPÔ‘Ô¿ÔÕ=ÕzÕ™Õ×ÕÖ'Ö^ÖˆÖ§ÖÓÖèÖ×>×a×ס׸׶×Ú×Ü×ä×Ð×Ð×¶×­×–×€×;××ÜÖ ÖLÖÖÂÕtÕÕÊÔdÔ%ÔÓÓ‰ÓBÓüÒÈÒ…Ò`ÒÒøÑÈÑšÑzÑlÑPÑgÑbÑtÑiфћÑÔÑ ÒOÒŽÒÖÒ=Ó¥Ó ÔŒÔÕqÕ÷ÕyÖ׆×ö×fØÃØÙ]Ù™ÙÙÙæÙîÙúÙãÙçÙÛÙ²ÙyÙXÙ6ÙÙÙçØÜØÙØãØÙÙAÙŒÙÜÙÚÚ½Ú4Û—ÛÜÜäÜ]ÝæÝrÞß«ßMàòàvá&âºâsãäØärå æ²æfçòç¤èéŠéèé]êÔêëcëyë±ëÊëñëïëôëúëôëøëêëéëïë ìì ì5ìcì‰ìÆìõì0íyíÅí îiîÅîïmïÃïð`ð´ðñ€ñØñòŠòÜòpóÜófô¼ô.õ…õñõ4ö•öÏö&÷V÷–÷¾÷è÷øøøøøøø øÛ÷Õ÷³÷²÷¯÷÷˜÷‘÷„÷š÷–÷¼÷Ä÷æ÷ø=ølø­øáø=ùzùáù%ú€úÒú1ûˆû¾ûüHü¬üåüDýƒýÍýþ3þfþ—þÖþþþ$ÿ2ÿ9ÿYÿ@ÿZÿIÿ4ÿÿÿêþËþšþhþþÇýýXý'ýíü°ü€ü9ü-üôûúûÍûàûÇûÄû×ûíû üü@üVü{üžü¿üíüýEýYý|ýýÄýäýþþ$þ1þOþqþŒþˆþ§þ£þ±þµþµþ·þœþŒþeþeþ*þþæýâý¤ýžýiý`ý8ý&ýþüËü¹ü¿ü±ü¦ü•ü‰ü…ü…ü„ü‰üšü§üŸü²ü¥üÅüÌüØüÙüÔüîüãüýýý#ý-ý6ýAý]ývýý“ý’ýœý¾ýÑýâýÙýÆýœý~ýaýRýýîü¯üü_ü1ü üÑû¤ûqûIûûåúÂúšújú6úúöùáùÉù•ùŒùnùiù[ùOù=ù9ù$ùùùïøù×øðøÃøÃø»ø­øÁø£ø¶ø§øœø¦øø¡ø¤ø—øø”ø•øøŽø–ø~ø„ø\økøRø_øHø;ø(øøøÿ÷è÷×÷¯÷±÷z÷{÷T÷1÷!÷ÚöÁö‹önöKööñõÊõ•õqõ;õõãô¬ôŒôSô:ô ôæóËó–ó~óJó,óóóéòÛò¾ò­ò¤òò“ò“òˆò™ò—ò£òŠò’òpòmò7ò5ò*òAò;ò9òRòMò_òIòOò5òòò òò$ò!ò4òJòpòyò‘ò˜ò‘ò³òò±òœòšò|òcòRòDò2òòíñÌñÆñºññwñbñQñXñYñtñxñtñ£ñÀñàñàñçñóñýñ òòöñÕñ¸ñÅñœñ˜ñTñ>ññçðÁð™ðrðBððßï¶ï¢ïrïoïHïïêîÄî“îbîîÑí£íWíBí÷ìÞì˜ìì\ìEìýëôëËëÙëÉëÆëÄëÇëàëåëõëôëíëñëèëßëÊë£ëqë/ëëêµêbê=êÙéŸéNééõèÇè¬è‡èkèièèƒèŸè™èºèÅè÷èé3éféqé°éºéîé÷é ê7êEêaêaêkêxêgêRê#êýéÛé±é{éAéõè»èeèè¦çBçÍæfææå:åáä”äOäøãÄã‚ãbãIãEã1ã.ã&ã1ã:ãCã>ã0ã;ã<ãPãbãuãŒã¬ãÄãïãäeääàäåiå¥åæ:æ‚æ¨æàæçç&çç çÕæ¨æbæ æ®åOåûä‹ä4ä¾ãqã ãÇâ_â â¬ázá0áüàÁà–à[à5à÷ßÄß•ß_ß7ß ß×ÞÉÞ Þ–Þ†ÞyÞ‹Þ˜ÞÂÞûÞ2ßmß¹ßñß>ààÁàá2ádá‡á¤á¹á¾á¿á áyáDáá¾àzààÆß\ßߟÞBÞÑ݆Ý*ÝêÜšÜZÜÜïÛ¯ÛmÛ3ÛÛçÚÚÚéÚòÚ Û'ÛSÛyÛ¢ÛÌÛíÛÜ?ÜwܬÜÉÜÝÝ:ÝVÝvݗݬÝÊÝåÝðÝ ÞÞ'ÞÞÞïÝÙÝžÝbÝÝÚÜ“Ü?ÜÛÛ„ÛÛÁÚ?ÚÓÙIÙÖØ`Øë×|×תÖfÖ#ÖíÕ¸Õ›Õ{ÕoÕkÕ~ÕŽÕ®ÕÛÕûÕAÖ~Ö×Ö×u×Â×/؆ØýØrÙýÙoÚøÚsÛìÛfÜæÜJݸÝÞdÞÞËÞîÞðÞÔÞ«ÞvÞÞÐÝaÝèÜcÜÏÛQÛ¯Ú%Ú‡ÙýØlØé×o××ÄÖ„Ö[Ö9Ö#Ö=Ö[ÖÖÑÖ×s×Ö×GØÂØFÙÜÙtÚÛÂÛƒÜGÝÞáÞšßsàDá âæâ¶ãjä)åÀålæôæçåçJèè»èÒèÍèÒèžèeèèÅçHçòæqææåå±äLäéã¬ãRã(ãåâËâÂâÒâìâ(ãWãÃã$ä¸ä5åâå}æ"çÕçˆèHé êâê ë_ì-íïí§îZïøïœð2ñÆñ>ò´òøòLó”óÃóáóåóËó§óˆóFó óŸòEòÕñjñýð‰ð ð¾ïï=ïïþîïï@ïlïØïNðÚðuñ òÓò™óô[õ-ö$÷ øùõùÙú·û„ü^ý þÐþnÿùÿ…ïoÇNt˜›š’fHýÂn ÀT×ÿsÿÿ¥þ2þ×ýxýAý ýìü¼ü¯üÐüÿü:ý’ýõýlþíþŒÿÆh!ǃ)Ýp |}T¦Ý J S q K E -   ¿š3û¦Bæp¶Sïš<ö©rE@&GJ}¶U»/¶>Îcí‡ •  i Ð $ ‚ ¿ û    ü ï ¥ q - Þ “ ) Ú l  —3Ñhö“Ãa¿`< ðáÛæ÷FˆÁ%rØ<¤ Þ`§ G ¡ à T v £ ´ Ð È ã » É Ž “ Q G  Ý œ h <  Ë’;ñŸYÒ‹KÍ¡^S  èïö"1Ys£Æê!(?23)þÄ¢pJ ÂrÅnÍp§PëªPùÿ¡ÿZÿÿúþÖþ²þ‘þ|þ\þ~þþšþ¯þµþÚþÿ:ÿjÿ’ÿÐÿ^œñ@»ýT†œÄ¼çàåÓÍȾ¨‹‚€tkR@7&8 )üøûõïäÙîãõãäÉÇÂÎп­š¤§²{[N6þṋT) Þÿ­ÿoÿ?ÿÿèþ±þ£þcþ]þ)þþ þþþþýþôýìýåýûýõýóýçýÚýØýÝýÝýÞýÈý¬ý¬ý™ý ý‚ýqýCý.ýüüáü³üü]üüäû¡ûjû6ûâú¥úFúú´ùcùù»øuøøÜ÷…÷P÷ ÷éöÀö±öö„öföˆö}öö}öyöxö ö®öØöÖöõöùö÷÷4÷D÷X÷T÷a÷z÷™÷¬÷­÷ª÷«÷¼÷½÷¶÷«÷y÷c÷&÷÷ÊööQö÷õ´õOõõ¬ôQô ô©ófóóêòºò£ò|òWòLò;òBòNò`òoòŸò·òåòýò$óSóqó}ó“ó™óÇóÕóéóìóãóìóæóûóãóïóÅó²ó•órófó-óûòŸòkò òÒñ~ññ¶ð=ðáïsï5ïÇî…î"îáí·í“íífíIíLíVíLí`íWíoíjísí_íoípí†íííqíSíIííôìÃì‚ì/ìÝëë=ëðê…êê¡é&é»èCèáçqç çŽæ?æíåÆå‰å[å&ååå;åGåˆå¶å÷å=æ‘æßæ]çªçèkèÏèOé´é%êpê×êëFëdë‡ëë¥ëëuë6ëëÐêêEêßé…é é®è.èËç;ç®ææ„ååzäìãgãÕâXâÐá[áÑàqàúߨßPßßõÞÕÞÇÞÌÞÑÞß@ß‚ßÊß,à„àèà]áÌáCâžâãhãÃã äAäpä†ä—ä–ä¦äƒätäWä$ääÍã~ãXãîâÅâsâ2ââ¨áŠáIá3ááäà±àšàtàƒà\à`à@àPà>àRàZàgà„ààÈàáMá”áüáBâ°â ããäqäåäWåÀåEæ¢æçHç–çÕçè%è9è8èCè;èHè%è!èèèóçïçÚçØçÑçØçÚçÌçÊçÄçÅç®ç©ç–ç{çsç8ç'ççç÷æËæ³æ™æœæ”æªæ‘æ‰ææ´æçæç'çWçrçºçäçDèsèÉèéoé¿é3ê°ê"ëëì’ì%íÁíeîøîŠï'ðÕðrñò‰ò ó—óôˆôäô6õ‘õãõöLöwö¨öÞö÷5÷I÷Y÷{÷ƒ÷—÷´÷Ù÷ô÷ø6øeøŽø¾øéø ùBù‚ù×ù.ú‚úÜú<ûªû/ü¬ü"ý‡ýþ†þ ÿÿ}æ_Ó-•óE¾ö9=7,+ù¤‚/ö¡] Ö”{>+-<V§á:” `èG×^ñvù– — z á D ´  x ¢ ê  D [ c ` I  ð µ p  Ø f  › 0 Ä [ ò/·lã¥e9þèÁ¤ƒsRAKSwsЇ¤Ñö.Ld›­ÝÛÝÎÌ®ŸvCÈ‘,íšCØq 1ÑY­YÔÿ¶ÿÿWÿ:ÿÿÿÿÿÿÿþÿÿ5ÿXÿyÿ’ÿ½ÿÝÿ N‡ÄïEw¡Çì)DIQJ87!ѯ~:û™qDÿÿÇÿ}ÿKÿ#ÿÿïþÄþ¾þÄþÈþùþÿTÿ|ÿ»ÿíÿI«TØP˜R°ë,„À 4br‘¹°¼©¤qQ(í¾}Hó¶z9ùÌa.Ô¤}[SXOVa…ŸÊ-gŽÔç/W¯Òý $?6;-&=. õúïÞÓËÁ©­”•‚vgYrhntdxkrcfQKP))üõ¶¢e>úÚŒ\ à¬s?öÿÆÿ‚ÿJÿÿÓþ˜þfþþãýžýtý3ý ýËü˜üZü,üüÄûÀû“ûwûsûoûpûwû}û’ûû¶ûãûü6ü|ü™üæüýCýhý¥ýÍýþ!þCþ^þnþyþhþqþgþ@þ5þþñýÃý‘ý`ýýãü‚üLüðûûIûû®úiúúÈùùBùùäøÆø¸ø·øÍøæø ù,ù{ù™ùåù'úfú¯ú×úû2ûqû‡û½ûÊûíûü#üXü`ü—ü~ü²ü¥üÑüÓüØüÙüÔü¾ü²üˆüQü(üÖûû9ûÙúˆú ú·ùKùõø”øQø øÐ÷¼÷¡÷˜÷›÷÷¸÷Õ÷ô÷$øPønøžøÌøöøù0ù.ù1ù1ùGùDù/ù'ùùù$ù%ù.ù0ù;ùAùXùhù~ù|ùyùeùOù2ùùÙø©øWøøÓ÷Ž÷>÷üö¸ö‡öHö1ö ööþõö)öZö—öÙö÷k÷½÷ï÷@øiø©øÖøõø ùù&ù-ù.ùùùâøºøŽøcø@øøå÷±÷r÷B÷÷äö‹öVöéõ¶õCõõ¨ôeôèóŒóóºò_òòºñpñ3ññÛðÂð°ð¨ð²ðºðáðþð0ñ[ñŠñ©ñæñòEòYò‘òœòÅò¶òÐò²ò·òŠòlò*òò×ññlñ ñððžðlð!ðôïÂï…ï[ï3ïïþîÓîÕî¢î›înî^î<î5î îëíÔí¹í²í«í®í²í£í°íÇíÀíæíÚíÜíæíðí÷í îîîÓí´íxíDíúì ìPìñëŒë&ëÚêxê0êÙé™é`é1éééééFéhééæé)êêßêEëŒëúëMì³ìí_í®í îRî©îï[ï¨ïòï@ð|ðËðñLñŠñ½ñëñ(òNòyò„ò‘òòòžòzòlòNò.òòèñ³ññRñ(ññðÍð¤ðŽðoð†ðjðwðpðžð¼ðçðñWñ ñÚñ,ò„òëòZóÇó6ô¢ô$õ¥õ.öˆöúöj÷Ý÷døÓøIù¤ù úvúÐú%û_û­ûÊûü&üEüNüVüFü;üüüîûÕûÀûšûqûXûBû0ûûûû)û2û[ûrû³ûäûJü{üËü ýwý¼ýþYþ³þìþFÿ…ÿÍÿQÚ[“ËGÓIzžÓ÷  þõðÁ¦wY@íáä×õý)N`›»ø'a•ÍE{®7Œ»@šÕ[ƒÙöQ d ¢ ­ Ç Ñ Ú Ö Ñ µ ³ ƒ € \ 8  æÉ˜‹liNOI[]€…²Ñ 8 \ › Å ü . b ¢ É 1 j Î ý 2 o Œ · Ó  A | œ ° Î Ú ÿ (=D=:ñ ò » µ  b @  ú á È © › Š ƒ b d F D 4   ó Ü Ú º ½ Ž m N 8 !  í Ý ± œ j ? å Á o @ è¼L “,Óv ³8Ödè–:˜]ÜKòΓ‚=1=ÿÿ#9Rl¨ÔÕñðð(/TH]\J@J:7 á׫¾˜mm6L2 ØÿÑÿ¨ÿŸÿÿvÿTÿ3ÿ+ÿ/ÿ+ÿ1ÿÿÿäþÉþ¹þÉþ¤þþ\þ@þþþáý—ýuý:ýýÍü¢ünü.üüû²û[û"ûæú³úpú8úúÏù¦ùfùZù!ùþøåø¹øœø“øøøiø‚øzøuøžø©øÅø´øÒøÔøåøýøìøìøÑøÔøÌøÃø¤ø‰øbø%øÛ÷—÷`÷ÿö¯ö[öÜõxõ-õÆôPôùó“ó-óèòŽòCòäñ¨ñbññØð¦ð[ðIðÿïÕï¯ïsïeïXï6ïïïìî×îÖîÙîÁîªî™îxîMî9î;îîûíÉí¯í¤í¥í›ííVíIíBí*í3íííÑì²ì°ì‘ì’ìUìVì%ìì$ìì'ìì'ì/ì7ìaìyì§ìÀìáìøìøìí÷ìí í íðì¨ì’ìtì~ìHì!ìèëÇë£ë•ë`ëëçê°ê¶ê‹ê‡êfêKê:êêêêþéÌé¹é™ébé[éé éÒèµèèYèJè#è,èè/èWèmèšè³èÜè÷è0é:éméméŒéˆéxéOé0ééÆè‡èAèéç•çAçêæŸæ[æ"æØå¯åzå{åmå^åKå2å#ååå ååûä åûä åå!åå åå0åEå]ååžåÃåéåæ2ætæ‡æ¹æ¿æíæþæç'ç ç5ç)ç:ç#çççççðæèæ×æÀæ°æžæ†æYæ;ææéåÓåŸåeå<ååîäæäŸäŽä[äAääìã¬ã‘ãiãRã7ã(ãããéâìâÌâÌâ§âŽâsâFâ?â â âäáàáÇáÊáµáÊáÉáÐáÏáÄáÉáÄáÐáááòáüáâ2âZâ|â­âÁâôâãIãyã¢ãìãäWää¦äÓäîäå.å>å;å?å4åå åëä¹ä™äYä"äãã£ãkããËâmâ#âÚá­á\ááêà»à–à~àMà0ààààà,à=àhàŸàâà0ááàáPâ»â0ã§ãä¬äå—åýånæðæJçÁçèièžèäèøè*éMééŒé„éméeéoéré`é<é(é!éé4é:é?éLéQé“é´éêRê¾êë™ëìžì/íÅíQîíî~ï/ðÊðjñêñoòäòxóÌó6ôVôÊôòôYõhõ õ­õ·õËõ¨õ“õaõ9õõÅô’ô<ôúó«ó`ó2ó×ò¯òOòòÐñ¬ñ‰ñxñQñDñKñXñ™ñÌñòUò¼ò-ó¾óHôÑôXõåõ’ö4÷à÷tøùªùGú×úeûßûZüÞü ý€ýÀý þ2þMþeþnþƒþoþlþGþ!þþÊýŸý^ý6ý"ýéüãü·ü üŠüšüŽü¾ü±üØüïü0ýpý¶ýïý+þˆþÌþJÿ›ÿ~qózésÊ4‘õEˆ¬Þí19# õí«{_#íÃ’_׋BýÚ‘W éÒ«£•ž³ß`u´â'…Ë]Ð_¡Åü /IWTI,Ø®r>øSüÁg²dÄU#ÐC÷ÿ¨ÿÿQÿ%ÿîþÇþ‘þ’þþ‡þ|þ_þ`þHþUþNþcþDþ>þ!þþ þþ þóýçýÍýÏý½ýÁý”ýxýUýCý.ýýûüÛü¼ü¥ü|übü9üü üÓû¥ûrûTû+ûûÜú§ú’úfúaú=ú:ú+ú%úúúú\ú[ú™ú©úéúûsûÀûüRü£üíüNý¯ý þKþ‹þÆþøþ*ÿTÿxÿ|ÿ–ÿÿ¢ÿ•ÿÿÿmÿWÿ%ÿ(ÿÿÿÕþ¹þ£þ‡þuþJþOþ6þ>þ*þFþOþ^þuþ€þ“þÂþõþ1ÿdÿ¥ÿÄÿS˜î9†¿ 7€©Öö   ðГk,ã 1îŽ=ãÿ”ÿHÿêþþNþþãý™ýxý@ýýýåüÎüºü£ü–üˆüfü_üEü:ü)üüùûëûÚûÊûÐûÈûËû©û°û¡û•û„ûuûFû?ûùúîú­ú‹ú;úùùŸùJùþø¨øIøá÷m÷÷³öcö ö®õUõõÞô°ô‘ôdôHô.ô,ô)ô3ô3ôQôZô}ôŒô²ôÄôÞôõ'õ6õUõqõ‰õ®õÇõïõòõöö<ö6öböZö`öEöEö-ööÕõ€õ@õïô§ôSôÝóóóÀòhò òÌñ‰ñ9ññßð±ððað=ð-ð$ð'ð.ð.ð)ð#ð ð3ðBðHðVðað€ð§ðÛðüð?ñoñÀñùñ?òiò¥òÕòó5ó:óWóHó`óAóóçò¨òYòýñ§ñOñæð†ð,ðÐï…ï4ïéîœîLîî´í}í8íöìªìgì*ììÉë’ëTëëôêèêãêÙêÚêçêþê"ëNë‰ëÅëìTì‹ìÎìí@íhíŠíší´íÄíÇíÔíÏíÇí¾í»í©íží–íí}ígí`í>í2í ííì·ìxì7ìäë˜ë6ëÖêdêôé€éé£è3èÚçpç+çäæ½æ¡æ‚ææxææ°æðæçZç€çÙç ècèŸèáèéQééÒéê@êƒê®êëêëMëwëªëÐëçëì ì&ìììöëÞëžëbëëÃê…êêÒé^éé¬èZèþç³çVçç¸æmæ@ææÝå¢ååkåoåmåiåzåyå­åÀåøå'æTææ¹æïæ#çiççØçöç8èbèšèÌèöèé>éSéoéƒé¦é²é®é¬é†ézéQé-ééÁèˆè2èóççUçñæ¤æ@ææå–åTååâä¡äväGä2ä!ä'ä-äTäaä¤äÔä.åuåËåæˆæáæaçÊçQè±è'é‡éëéGêêßêðê.ë?ëXëYëIë$ëýê¹êpêê¬é0é¢èè~çÝæIæ¯å-å‘ä!ä•ã5ãÓâŒâGâ!âëáááËáÛáçáâ@âkâ§âèâ6ãŸãùã_ä´ä1å›åæ‚æêæ>ç£çè\èÅèóèLéfé–é¦é³é¨é¤é~ézéHé/éýèÈè‘è]è1èùçÙç²ç£ç…çˆç•ç§çËçèBè–èöèLéÌé:êÒêZëãëzìí´írîïØïtð%ñ×ñ~ò#óÇómôòônõñõZöÈö÷]÷|÷÷¾÷°÷Ä÷›÷‡÷g÷?÷!÷êö¹ösöEö öÚõ—õtõ>õõÿôëôÚôÒôíôõ+õaõ‹õÙõ,ö‚öëöJ÷¾÷7øøù~ù úcúºúùúAûŒûÄûü ü&ü@ü?üVü3ü9ü üîûÓû¥ûtû:û÷ú®ú^ú!úÐùˆù3ùìø•øIøøÔ÷Ž÷Y÷7÷÷÷÷÷÷÷C÷Q÷y÷Œ÷â÷ø}ø²øùXù©ùúXú«úþúKû–ûÝû3ükü¶üäüýHýxýŽý¸ý¼ýÇýÈý¹ýµýƒýgýýïü²üxüIüëû²û^û(ûôúÃú‡úiú0ú9ú ú"úú-úú;úNútú©úÔúû3ûiû¶ûèû4üsüÀüýLýŠý»ýñý#þJþ~þþ¹þÛþäþÿüþÿûþÿòþëþÑþ±þ„þsþ=þ6þïýÛý‡ýpý&ýòü½ü‡ü]ü5ü üóûËûÆû»û¼û·ûÇû·ûËûÉûÚûâûüü=üKüyü›üÅüöüýNýJýqýŽý©ýÆýØýýýþþ'þ"þþþ þûýîýÔý½ý¢ý‹ýuýoýbýPý8ý'ý ý ýéü×ü´üžü‚üüfünüaü_ühübü}ü}üü—üÁüÆüý ýCýPý‚ý—ýµýàýþ$þ@þTþqþŽþ¥þ§þµþÁþÍþÛþØþðþÝþíþÒþ»þ¨þ¥þþŒþkþUþHþþþáýÑý«ýý{ý^ýEýFý$ý*ýýüÿüÞüâüËüÔüÕüÚüíüüü&ý7ýUýnýŽýºýÝýþþ=þAþVþ_þuþ„þŸþˆþ€þoþcþJþ&þÝý±ý^ý*ýÈüoüü®ûHûÞúPúèùXùðøWøÝ÷E÷»öEö¼õXõ×ô…ô(ôÖóó_ó;ó óâò°òŠòhò_òKòLò=ò@ò=òLòkòjòsòkòò¢ò¬òÏòÃòáòàòåò×òÔòÎòŸòsò4òðñ²ñ^ññ™ð1ðËï\ïïîîî¶íCíáìyì$ìÔë‘ëTëëæê·ê¨ê„ê~êSêBêDêLêfênêˆê€ê¤ê©êÕêÜêëë;ë^ëzë¢ëÆëÙëçëüë ì1ìAìVìLìJìEì4ì$ììèë·ë“ë^ë.ëøêºêŠêIê"êëé¼éŸéé€é^éUéQéQé`éqéuéˆé‰é®é×éôé'ê-êDê3êIê`êoê…êtêjêSê;ê3êêêýé×éâé¿é¤é~éKééÞè§èfèèÓçkç-çÃædæøåŒå9å½äxäóã²ãeã5ããÿâøâöâãã<ã„ã±ãïãäMäoä§ä»äÉä³ä²ä”ä~äOä+ä×ãˆã'ãËâtââ¥á:áÊàjà àªßQßóÞ‹Þ;ÞÙÝšÝFÝݦÜ_ÜÜëÛ³ÛˆÛ_Û^Û[ÛhÛyÛ¬ÛñÛUÜÂÜ,ݨÝFÞÞÞ‚ßàªàá¹á/âÉâã†ã³ãÜãüã ääòãÑããRããµâ\âöá€áðàzàöߊßß„ÞèÝmÝéÜlÜîÛiÛÛ„ÚJÚÙٴلÙ]ÙWÙ2ÙWÙdÙ­ÙäÙ5Ú—ÚÛ|ÛûÛXÜÞÜ5ݼÝÞdÞ¤ÞçÞßCßaßHß-ßßÝÞœÞ]ÞôݘÝݶÜ@ÜÄÛJÛËÚ[ÚèÙ‘Ù&ÙæØ~Ø:Øè׶׉×w×L×C×:×@×c׈×ÈרjØÛØHÙÏÙWÚüÚ ÛZÜ Ý×Ý|ÞZßñß­àFáïásâûâLã‘ãÖãíã ää äÂã}ãã¯ââžááiàËß)ߌÞéÝXÝÂÜ3ÜÛ%Û—Ú8ÚÊÙ‡Ù0ÙÙÏØ«ØŸØ›Ø»ØãØÙgÙÏÙ@ÚÓÚZÛéÛyÜ,ÝËÝ‚Þ&ߨßà$áÅáaâæâ_ãÂãäbä—ä­äÍäÉä¼ä¬ä€ägä#äòã¦ã[ãã¹âsâ âÇásáGááÖà¨à„àŒàxà{à~à¨àÎàáPá±áìá^âÇâDãÎãOäñä‚å%æÑæƒç*è×èyé êµêCëÕëaìÐì@í—íáí+înîxî¨î©î·î½î¬îîtîDî)îóí½íƒíXí/íïì¸ìyìBììáëÁë™ëëvë{ëzëë¯ëÆëêëìXì´ì í_í»íîwî÷î~ï ð—ðñ²ñVòøò•óô´ô(õËõNö»ö'÷s÷Ê÷øFø{øšøÁø¿øÐøËøÒøÛøÚøÙøËøÂø¶øø ø~øøuøoø{øeøoø;øJø.ø9øBøDøQøLøUø\øxø‚ø­øÄøÛøùù)ùPùfù‚ù¯ùâù úDúpú úÃúãúüúû1û%û7ûûûûäúëúËú´úžútúhúJú,úúûùñùÓùÒù§ù¢ùŽù”ùŽù‚ù‰ù~ù…ù“ùœù›ùžù¥ùÏùÜù ú-ú\ú~úŽúÈúëúûMûjûˆû²ûÕû üü)ü-ü4ü,ü!üüü×û½ûƒûOûûòúÈúúQú úÂù‡ù9ùîøšø>øý÷¨÷g÷÷Àöhö&öÜõ—õGõõÕô˜ôQô ôöóÕó²óŒóbóPó@ó>ó1ó=ó4óAóAóHófó}óœó²óÉóéóôCôZôŠô‰ô©ô¸ôÝôõõ(õ0õ5õIõGõ]õVõWõdõQõgõLõiõaõ\õOõTõJõ`õNõ\õ<õTõIõSõSõaõtõ‚õõ£õÊõööTöTö~öŠö¿öÕöÿö÷*÷S÷]÷‘÷–÷É÷Ó÷ä÷ô÷øø1øCø;ø+ø'øøøøö÷Í÷«÷„÷|÷I÷.÷õöÑö±ö‚öWö+öðõÈõõeõ8õ õúô¾ô´ô‚ôyôaôSôDô:ô0ôDô7ôRô[ô†ô–ô¹ôÐôõ+õgõ•õÜõüõ5öeö¤ö×ö÷?÷n÷÷É÷þ÷øøøøøø,ø*ø1øøø ø ø øò÷å÷Ã÷½÷®÷³÷¨÷¥÷—÷¤÷•÷—÷”÷¢÷–÷«÷ž÷®÷ ÷©÷±÷µ÷µ÷µ÷Ÿ÷£÷‹÷÷`÷B÷÷ÎöƒöBöçõ‰õ%õ§ô:ôµóNóÅòVò¾ñIñÒðmðð±ïAïØîî8îî¾í íeíGí)í'ííííííí=íUíqíží¸íòí îWîxî°îÕîòîï ï0ï"ïïñîÉîvî-îáíŽí$í¨ì-ìžëë¢êêé éè è‚ççxæþåuåúäœä)äÊãaããªâXâ#â÷á¾á¥áxáaáQá^ádáoáŠá«áâDâ«âãyãâãSä¯äðäAåŽåÞåæ0æCæ^æ_æqæGæ,æýå¿ååBåå»ä~ä(äÜã—ãQã ãÂâvâAâìáÍává5áá»à¬à}à€àUàNà:àAàJà\àsàˆà´àÏàõàáWáƒá¯áÕáÝáöáââ âæáÝážápá(áÏàzà&à³ßVßÓÞqÞðÝ Ý Ý¯Ü4ÜÙÛvÛ/ÛèÚ¬ÚpÚ>ÚÚôÙïÙçÙÿÙÚ,ÚSÚŒÚËÚ!ÛYÛ¢ÛéÛ3ÜžÜòÜSÝ©ÝëÝMÞ†ÞÖÞ ßLß{ß¡ßÉßâßîß à à àúßüßáßÑߴߒ߉ßWßDßßþÞÇÞ¹Þ†ÞuÞSÞRÞ8Þ?Þ-ÞÞ4Þ;Þ„Þ¥ÞçÞß8ßiߤßâß ààXàaà“à˜àÄàÄàéàñàá!á:áRá`ásálá}áágáqábácáSáWáKá2á'áááòàòàáàÙàÑàËàßàÛàòà á#á`á|á¾áçá,âjâ­âÛâ2ã\ã¬ãáã(ärä¼äóä3å]å©åäå3æZæ™æÑæçpç³çè@èŽèàè5éŽéÝé/ê„êÐê'ëgëºëÕëì<ìmì¤ìÅìõì íí:íDíaí„íí—í¡íÅíÐíáíäíêíùíîî îî+î.î_îUî}î’îÌîýî,ïIï„ïžïæïýïYðuð¡ðéðñ|ñÉñ3ò~òÈò óUóœóáó'ôDôcô“ô°ôöôòôõúôõõ+õ/õ)õ*õ-õ/õ0õ0õ<õ5õ5õGõ@õYõkõrõ}õ‰õ›õ¹õËõÿõö7öLödözööŠö°öÉöæöÿö÷0÷T÷z÷¦÷³÷â÷ ø/øYøzø—øºøàø ù/ùSù„ù§ùÏùúù#úPúƒúšúÒúáú#ûSû“û¸ûèûü;üvüŠü¸üÈüÚüöüýüýý+ý)ý6ý8ýAý>ýJýIýRýYý]ýpýý“ý¢ý¥ýÄýÌýêý÷ýþ þ4þþþþþ þïýÛý£ý›ýuýWý#ýýÛü¿ü¥ü•üŒütüvü^üVü;üLü3ü5üü üÕû¹û§ûûQû%ûýúßú¹ú˜ú…úZúGúDú*ú'ú ú4úGúNú]úhú|ú˜ú§ú«ú¨úºúµúÁúÃúÖúÇúÄú¤úœú”úˆúyú[ú.úúöùßù¨ù™ù_ù@ùùùøãø´ø“øYøøè÷µ÷…÷J÷!÷âö¾ö}ö]ö;ööéõÒõ³õ´õŸõ¦õ‰õyõõgõfõMõUõ;õ4õ õçôÇô±ô‹ô^ôôéóºóˆóhóóúò˜ò\òòèñ³ñqñ9ñãð³ð{ðZððüï¼ïïsïaïSïPï2ï-ï ïïïï ïï)ï.ïVï`ïï¡ïÀïáïð%ðVð„ð¥ðÆðåðññ@ñIñRñOñQñ;ñ1ññ ñçð·ð‡ðKð!ðìï¸ï€ï1ïïî¯îxîAîîÉí…íTí6ííùìÏì¾ì¥ì ì•ì¤ì“ì«ì‹ì•ì‰ììƒìxì`ìWìGì;ì/ì&ì ìúëÛëÕëÃë¶ëžë•ë‚ënëXë6ëë ëôêÑê³êêhêTê.êêæéÑé®é³éŸé¶é°éÃéÂéÒéðéê9êbêmê•êµêáêÿêë(ë&ëHëWësë€ë™ë•ë¦ëë¹ë£ë¸ë¶ëÅëÇë¾ëÍëºëÏë­ë’ëoëHë0ëëãê±ê€êXê$êøéæéÀé±éŽéZéaéDénéSéhéYéxéˆé½éÓéöéê.êFê‡ê•êâêçê:ëYë®ëãëìKìyì”ìÂìäìíí8í.í1í)íííÔìšìyì;ììÊëšëjë<ëëÔê ê†êeêMê6êêê êýéãéÐé²é—éVé(éÖèªèNèè³çaç%çâæ¶æsæGæ æùåàåÔåÄå¨åååsåbåMåååÕä©ä–äjäWä1ä äÛã¿ã˜ãŽãUã?ã/ããã ããã÷âåâ­ââaâPâ â âÞá»á™áuá]áKá*á*á á0áIáuá”á²áØáïáâ.âYâkâ‡â‡â£â¤â²â±â†â€âUâIâ â âåáÉá§á›áváiáJá;ááüàÈà«àfà3àÚߣßAßþÞ—ÞYÞèݹÝZÝ7ÝâÜÎܣܒÜvÜ~Üv܈ÜܪܹÜÑÜÞÜÝÝ3Ý/ÝBÝ?Ý3Ý<Ý&ÝÝÿÜèܼܰÜ~ÜgÜ-ÜÜÁÛ‘ÛEÛÛ¾ÚtÚÚÊÙ^Ù Ù¬ØTØô××?×èÖŸÖZÖ-ÖûÕÌÕÎÕ»ÕÇÕÒÕõÕÖHÖ†Ö¶ÖóÖ<×~×Ù×ü×8ØbØØ¨Ø½ØÑØÛØÕØÞØÂØÉØÌØÄؼ؜ؙ؉ؕØyØrØEØ$ØØü×âׯח×|×A×M××"××öÖ××'×2×a×—×Û×%Ø‚ØçØKÙ»ÙÚ‡ÚÛ†ÛÜuÜ÷ÜkÝøÝ`ÞÇÞ%ߌßòßEàšàÜà-áuá®áßáâ,âPâ{â“â°â¿âÎâÊâÌâÇâÃâ·â¤âŠâyâtâ\âVâ7âââíáââââ â'âPââ¤âÞâ ãZã˜ãõãEäŸäùäKå²åæ}æàæPç­çè‡èøèHé¶é ê]êÊêëhë¼ë ì]ì¥ìÒìíNí…í×íõí$î-îLî‚î¦îÁîÌîÒîÞî÷îï,ïDïZïwï€ïŸïÆïð:ðwðµðïðDñ¦ñÿñKòòæòGó—óæó7ô}ôÉô õSõ‡õÇõöõöQödö‘ö™öÅö×öîöööõöøö ÷÷#÷÷÷øöÚö´ö¢ölöJö öåõ±õ›õmõBõ õíôÞôÕôÄô¶ôœô”ô…ô’ô’ôô—ô´ôµôÆôìôõõ0õOõdõŒõ©õÜõö:öQö‰ö¨öÙö÷@÷w÷²÷ñ÷,øMøŒø¬øÕøÞøýøù(ùNùYùPù[ùOùnùlù{ùsùeùaù]ùbùqùmùqù{ù}ù›ù¹ùÐùÿùúEú^úú¼úìúûEûiû‘ûÇûõû ü@üPüzü¤üÁüÞüÿü$ýBýMýSýpýpýý‘ýý›ý¢ýý°ý™ý’ý{ýZýIý&ý%ýêüÝüüsüCüüöû¹û•ûRû4ûýúýúÏú¸úúzúqúoúkúoúZúlúpúŒúŒú¬ú¹úÔúÒúúúûNûlûûµûäûüFü]ü‰ü¬üØüòü ý*ý4ýBýFý>ýAý+ý2ýýýóüêü¿ü°ü£ü•üücüVü8ü1ü$üüüÛûßûÎûÇûÍûÈûÆûÂû¾ûÊûÕûåûýûü ü,ü[üdüü¥üÎüöüýFýgýŒýªýÍýÑýðýþ þ%þþ+þþþþñýÚýËý³ý¨ý‹ý}ýcýZýCý,ýýúüïüàüÑüµü©ü†üwü]üKü ü'ü ü üüôûþû ü ü(üü+ü)üBüCüOü[ü`ünüjüaüSüVüTüTüDü8ü ü üäû³ûˆûjû7û+ûðúÙúžúˆú`úKú#ú úßùÂù•ù_ù>ùùãø°øwø$ø øÑ÷²÷y÷O÷ ÷÷ãö¸ö•öpöBö"ööÛõ½õ£õ—õ€õoõwõhõ_õ[õXõFõ_õPõMõ7õ!õõõøôãô¸ô™ôtô^ô.ôôÇó¬ó†ó]ó.óóÁò¥òòSò/òòòñÐñ¾ñ¯ññ}ñ\ñ,ññõðèðÆðºðð…ðxðgð]ðJð=ðBðHðCðHð@ðOðcðVð€ð`ðxðsðˆðð{ðcðIð9ð"ððÚï¸ïïqïGïïûî½î—îJî,îõíÐí­íxíIíííÇì²ìpìWìììÐë´ë|ë]ë6ëëÿêÜêÆê³êŸê›ê‡êyêrêgê^êQêJê-ê(êêêêúéìéÌé©ééné?ééÏè¤èrèPèèèÄç©ç„çqçdçTçLçBçMç\çwç„ç˜ç¦ç®ç¼çÊçÃçÑçÎçÀç¾ç§çç}çUç@ççåæ«æ}æ?ææÚåžåvå?å åèä²ääWääÝã˜ãlã5ã ãßâ¨âˆâQâ=ââúáßáÊá¾á¹á·áÅáÇáØáêáâ&âDâiâ~âŸâªâÇâÏâÝâÍâàâÀâÎâ­â™âŽâcâKââêáÃá–ápá@ááêàÎà³à’à€à[àKà=ààà÷ßàôßà à(à>à]à‚à¨à½àöàáQáwáá·áÙáâ%âOâWâ‡â¨âÏâùâãNãbã„ã‚ã–ãžã«ã½ã¿ãÖãÉãõãîãääääìãîãÆãÅãµãËãÕã×ãèãæã ää@äoä›äÉäýä2åå¶åèåæEæŒæ©æôæ$çaçç¶çàçè?èLè|èœèÐèé4éhé¡éÒé ê êUê‰êÈêæê*ëWëë£ë¹ëÔëäëìì(ì0ì?ìIìNìRìEì5ìììì(ììììììýëáëàëíëôëìììLìXì}ì‡ì¥ìµìÒìïìí3íaí†íÄíïí3î\î¢îÓîïBï{ï·ïãïð>ðgðªðàðñ@ñaññ¯ñÑñæñøñÿñò)òKòYòqò„ò†ò‘òœò®ò°ò®ò´òÉòÛòôòó)óVólóˆó¨ó¿óåóôôGôEôrôzô˜ô³ô¾ôÜôÛôíôúôõõõ$õ@õ?õZõmõ…õ–õ¦õ õ¬õ­õ»õ³õ§õ§õõ’õ…õyõzõeõaõ^õSõPõ@õIõ+õ*õõõñôåô÷ôëôüôãôûôèôöôùôýôøôíôõôõõ õ õ%õ õ%õ0õ@õQõaõhõwõ~õ‡õõõ‡õ~õuõjõ]õGõ?õ-õõ õüôñôÝôÍôÃô«ô¨ô‡ô—ôô ô¡ô·ôËôÜôôôõõ$õ@õdõxõžõµõÌõ÷õö0ö4öZögö~öŽö¢öºöÇöÑö»öÔöÇößöÙöéöàößö¿ö´ö¦ö‹öpöCö+öùõÈõ®õpõDõþô½ô‡ôBô(ôèóØó ó‰ó^óPó@óHóAó=ó&ó,óó&ó ó-óó!óó!ó$ó&ó*óó%óóó÷òàòØò¹ò³ò£òŠò“ò„òròXò/òòôñáñ´ñ–ñ`ñ1ññ×ð¤ðrðOð2ðððûïâïçïîïäïúïð,ðdðmð¥ð¡ðÎðÄðäðÌðÐð¨ð ð†ðZð@ððîï¨ï‡ïSï/ïñî»îˆîYî'îöí¼í{í-íÖì©ìjìFììåë·ë…ëcëëëÞêÓê½ê¾êÈêÝêîêë@ë”ë±ëìAì—ìÙìí]í‚í¹íÏíõíîîîìíÕí²í‚íLí íøìÇìªì~ìCììðëÜëÂë³ë«ë¨ë¨ë°ëÊëÔëíëðëììì/ì/ì>ìEìbìdìƒì¥ì»ìîìíCítí¬íÖí"î2î]î~îîºîÄîôîáîïãîåîÂî®îhîOîûí»íí;ííÔì´ìuìQìììéëßëÉëÃë¬ëšëŠë|ë_ëWë9ë'ëëóêëêÒêÈêªêšêŒê‚êtêhêcêCê6êêêáéÚé´é¤éé|éWéMé1éééÖèÃè¬è’èpèaè2è5èèèþçøçè è"è2èfèè®èÙèé8éxéÁéÿéMêŽêÓêëMë˜ëÇëì%ì_ìrì¤ì­ìÆì¶ì¢ì‹ìsìPì+ìúëÄë…ëYë*ëñê·êyê?ê)ê÷éÕé¤é~éXéCé-ééé é ééé4éLéxé©éØé"êhê¸êëëüëpìçìDííîgîÂîïFï†ï±ïÝïð"ð/ð8ð9ð<ðLð9ðCð-ð,ð ðððð ððöï ðòï ðøïþïëïýï÷ï ðð/ðFðbð‡ð¨ð×ðñ@ñuñÔñòŠòÙòYó¹ó*ôôúôJõÒõ öjöö»öÅöìöøö"÷(÷:÷@÷:÷?÷1÷)÷÷÷öÒö¬öŠöhö4ööÊõ¤õxõEõ"õçôÂôwômô7ô"ô ôÏóÖó´ó¸ó§óºóÂóÒóôóô"ô;ô‰ô´ôïô:õzõÔõö{ö¼ö÷?÷w÷¿÷ç÷ø,øGøø+ø+ø-ø5øøøÆ÷Î÷¦÷‹÷s÷÷áö³ö—övödö>ö)ööö öö ö ööööö;ö5ögööÀöñö$÷m÷¶÷ü÷GøŸøÒø?ùùñù/ú}ú©úþú7ûzû®ûÓûëûîûûûüûäûåû©ûšû]û+ûñúÁú|úGú úÕù“ùlù*ùîøÄø˜ø‚ø2øøÚ÷»÷…÷`÷O÷÷ôöëöîöööûö ÷÷G÷K÷}÷¥÷é÷#øcø‘øÖøúø$ù^ùšù×ùøù0úWúnúú«úÆúËú×úÉúµú úúkúQú$úýùÐù²ùxùeù8ùùðø²øø[ø6øú÷¶÷§÷ˆ÷}÷÷÷ž÷œ÷ ÷š÷÷•÷¤÷Å÷ò÷2ø_øŸøÉø ùZù’ùËù!úKúŠú¸úûûXûlû‘ûˆû¯ûÍûæûðûü üüüïûâûÏûÀû¨ûšûgûFû6û ûûÚú¿ú’ú€úoújúxúdúiú[ú^úGú`úmúvú‹úŒúºúÙúþú#û2ûCûIûgûvû•û‹û›û™û‹ûŠû›ûªû®ûÆûÏûËûÅû¸û¥ûŽû€ûbû'û û×ú¸ú¢ú|úlúKúúúëùÞùÁùªùùù‡ù€ùvùoù_ùOù;ù/ù3ù4ùIù_ùUùdù‡ùªù¾ùúúHúnúŠúÃúæúû<ûfûûžû ûÆûÁûÅûÏûÓûÀûÙûßûçûæûÒûÄû·û¨û£ûû—ûˆû~ûƒûdûZûTû@û&ûûû ûøúüúþúýúûûû?û5ûjûqû•û¢ûÄûÜû ü)üWülü„ü¨üÎüìüÿüý÷üîüæüÌü±üŠüWü(üâû—ûQûûÈúuúBúØùªùZù!ùÚønøøÒ÷Á÷‹÷r÷Y÷T÷=÷=÷3÷#÷3÷7÷c÷z÷’÷¶÷â÷0øQø«øÜø.ùŠùéù9údú£úÝúøúû&ûûûÛúÌú~ú1úØù€ùùŸø'ø¬÷÷Œööõùôˆôúóróýò©òNòíññBñ ññðÙðÓðÈð¾ðäð ñKñŽñúñ;ò”òóFó¬óô–ôõrõáõ@ö öýö<÷‹÷¹÷õ÷ ø%øøøô÷Õ÷˜÷h÷÷®öcöÞõ€õêô€ôéóbóÙòTòÐñEñÝðdðð¨ïXï ïÕî—îî†îî¼îÃîï2ïï¸ï÷ïRð»ðñoñ¿ñòLò°òÝò ó+óMólóvózófóUó)ó óÆòƒòLò×ñ›ñ!ñ¯ð^ðÁïQïÂîIî¸í,íµì6ìâëpëëµê]êúéÁé—é}é`éYéNéAédé}éé™éžéÄé¼éÓéÐéØéÌéµé½éméyé@é(é éÊè«ècèEèÝç«çZç-çóæáæŽæfææÚå¢å™ådåNåååÞäÚäëäõä(å:åŠå³åäåæNæœæÁæ ç0ç[çaçç§ç‘ç³çÃç³çÈçÀç¹çç…çhçWçDççÝææJæóå©åNåþä¡äOäæã±ãhããæâžâ{âOâNâ5â&â-â7âgâ}â²âðâãtã³ã äcä¬ä å`å©åûåLæ†æÇæçHçbçŸçÅçíçèèè èèèè èöçÔç·ç˜çzçOççØææZææÌåjå1åùäËä¯ääoäläeämäxä”ääÞäåDå|åÆåæ[æ¹æûæJçˆçÁçè6èdèˆèªè¼èÖèåèÿèéñèéåèäè¿è›ègè4è$è èíçÃç•çxçSç6ççÐæ·æ‚æ…æmæQæFæ/æYæNæŠæ¢æÜæçQç’çõçHè°èüèté é.ê~êÿêIë³ëìUì©ìöìSí‹íÞíî`î¢îÜîïAïïïÆïòïðð(ð5ðTðGðKððéïÓïÃïÄïï{ïSïJïïûîúîïîáîïîîïï?ïlï’ï®ïßï&ðQð“ðÁðñ7ñsñ§ñàñíñ)òLòòœòÏòêò ó3óEó[óiógótó{óyó[ódóZó?óMó<ó)óó óóòòýòçòóò¼ò“òò‚ò…òò}òkòWòTò&òòò*ò4òHò[òwò‹ò òÇòëòó;ó[ó†ó–ó¾óÐóæóô#ô:ôVô[ô{ô…ô•ô´ôÐôßôïôùôõ6õHõzõ†õ“õ­õ¶õ¾õÕõ¶õÑõÒõæõÜõæõåõÔõÒõÌõãõÓõÞõÐõ÷õöõöFönö£öÄö÷@÷v÷Å÷ø<øŠø²øýø"ùYù„ù£ùÂùãùôùúúú+ú8ú[ú{ú¬úÌúîú û<û^ûŽû®ûÖûßûíûùûü ü üüîû¾ûÀû¬ûû›ûûwûhûGû7ûûûìúãú±úúfú7úúúùäùÌù¬ù”ùùvùqùfùXùLù2ùBù,ùCùCùfùgù…ùù¬ùÁùÒùÛùõùú9ú6úYúUútúdúmúlúmúaúIú@ú?ú)ú:úúúñùëùÕùÄùÂù²ù´ù|ùSù$ùðøüøÛøãøËøÒøÑøÐøàøÚøÞøÌøºøÆø¿øÔø×øßøãøêøùù1ù!ù/ùù"ùù$ùùùÕøëøÖøôøúøùùùùù$ùDùUù]ù_ùuù{ù‰ùù}ù~ùvùtùhùYùPùKù7ù5ù#ù ùùùù ùüøüøùòøüøûøùùù%ùù*ù3ùRùZù„ùù¥ù¶ù×ùôùúEúcú{ú’úwúwúTúTúgúYúCú7úúúãùÅù´ùlùKùùïøÈø}øUø øý÷º÷³÷c÷5÷÷±öˆö9ö÷õÀõ‚õUõ*õõÊôÆô¢ôžôŠôƒôjôvôxôôô³ôÔô÷ô#õ6õcõõÃõàõ öö7öVö`öYöFö;öWöBöJöööÚõ¸õœõqõ>õõÊôŽôdôôÝó‰ó6óÙò‚ò:òÛñ¥ñfñ#ñéð¨ðuð'ðøïÝïÂï¼ï¨ï­ï§ï¯ïÈïÒïøïôï7ðRðŠð±ðÇðñ#ñbñ‡ñ»ñÐñòòOòZò{òsòˆòtòò{òòWòPò'òòæñ¸ññKñýðÂð{ðDðÿïºï{ï9ïïÐî¶îiîOî&îîðíÃí«í í¦í í¹íÄíðíîdî¯îêî<ïuïÔïð€ðÈðñVñŽñÌñûñò@ò<òHò.ò5òòòÚñ®ñuñMññàðžðUðð»ïnïï¡î<îàíbíîìnìúëyëðêhêîé{éé³èQèèÃç¾ç¥çËçáçèIè‹èûèOéÊé/ê°êë~ëÈë-ì^ì³ìÜìíí<í7í9í"íúìêìÄì¨ìŒìoìCì+ìðëÊëŠëZëëÄêwêê·éHéãèdèõçvçç©æKæ÷å½å…ålåcårååÊåævæÝæhçéç|èéªé>êÏêfëçëQì³ìþì>ígíŒí‹í™í“í›í…ívíBí/íÿìÞì¼ì‰ìpìHì/ììßë²ëƒë8ëëºêŽê@êêÚé«é’éléSéIé8éJéqé’éßéêhêºêërëØë,ìŽìáì1í‚íµíñíîFîKîgîPîiîPî[î9î7î'îî#îÿíîîîî-î>îhîhî„îmîpînîgîRî3îîãí¹íœízí_íííàìØìÚìÐìÔìäìí"íaí‘í×íîCîmî¥îÁîîîìîôîôîèîëîÐî¯î“îqîUî-îî îîî5î?îeî˜îÎîïZï¬ïõïJð“ðàð%ñOñ†ñŒñ¨ñ³ñ®ñ´ñ©ññ‘ñiñ}ñ^ñlñ\ñiñoñŒñžñ½ñºñ¶ñÁñžñ—ñoñ<ñ ñ´ðxðð¯ïAïÔî`îüíŸíbííáì¬ìƒìxìiìuì€ì¬ìÎìí;ííÂíîMî…îÈîõî6ïmï¬ïïïðPðrð¯ð÷ðAñ…ñÏñò[ò¸òÿòaó¢óçóôKôkôœô¨ô±ô£ô}ôhô#ôô®ólóóÕò…òMòþñâñ˜ñŠñfñTñGñHñMñuñgñ£ññÆñÔñÿñ(ò,òUòfòò„ò¤òžò³ò¼òÙòäò óó7óGóbó†ó¬óÊóâóæó ôô,ô;ô+ôôøóÞó·ó™ó\ó.óæò²òiò-òÝñÀñ…ñ†ñoñhñuñŠñ¬ñÌñïñòXòšò×òó`ó¡óâóôeô°ôëô.õTõˆõ³õüõöbömöö¼öâö ÷!÷K÷U÷t÷†÷…÷‚÷t÷r÷X÷L÷-÷÷æö¶özö-öîõªõõ?õùôÍôžô‚ôhôLô=ôCôGôpô}ô¡ôÊôòô4õDõwõˆõ½õãõööCöEö{ö“öºöÞö ÷)÷T÷÷º÷ó÷%øWø…ø³øöø#ùbùƒù±ùÄùñùú!úúúúúöùïùÉùÅù³ù°ùù„ù`ùVùJùFù;ù5ù)ù'ùù ùù ùùñøùîøøøóøùù6ù\ù‚ù˜ùÛù úVú¡ú×úûDû†ûËûûû7ü[üüªüÈü×üÕüËü»ü£üüJüüÉû~û2ûãúŒúAúïù¸ù`ù%ùæø®øøYøAø+ø(ø-øHø^øøªøâøù+ùnù‹ùÔùúfúžúûJû¡ûübüÈüý~ýÒý:þ’þñþ>ÿŽÿéÿu¥Õ 8/òÐÅ©vw7%âÿåÿ³ÿ•ÿyÿZÿIÿ,ÿ)ÿÿÿÿÿÿ&ÿÿ!ÿ*ÿÿ?ÿLÿvÿƒÿ¦ÿÆÿéÿ =Pƒµâù8Hi˜§¤ª–‘pb=úàî†zR7(ÿÿëÿÐÿ¸ÿªÿœÿ‘ÿ{ÿiÿ\ÿKÿDÿ;ÿ%ÿÿÿüþÿøþÿÿÿ ÿÿ$ÿ@ÿRÿmÿkÿ‘ÿŸÿÀÿ»ÿÕÿÚÿÜÿöÿõÿóÿöÿÙÿÐÿªÿ—ÿtÿPÿ6ÿ ÿñþÇþ¬þ…þnþJþ6þþýýõýãýÞýÐýÍýÓý­ýÁý¹ý¹ýºý¶ý¾ýÃýÖýéýòý þþTþqþ´þÌþÿ9ÿeÿÿ´ÿëÿPgŸÄãöøÒŘv4 ¾ÿ€ÿ9ÿôþÈþhþ6þäý­ýpý(ýìü©üzüCüüîû¶ûûfû6ûûøúÝú¾úªúúŠúxú„úqú€úyú–úšúÉúÒúüúû3ûWûrûŽû­ûÁûÙûíûñûðûìûàûÜû½û®ûŒûhûGû,ûûéúÉú­úú~úpúaú`úIúNú1ú9úúúõùõùÒùÊù®ù—ù„ùkùNù>ù%ù ù ùèøùøÝøæøâøÞøêøâøõøíøýøôøù÷øõøøøáøìøÆø×ø®øºøø‰øiøGø;øøþ÷Ù÷¼÷ª÷’÷|÷e÷R÷-÷÷òö×ö¾ö ö‚övöSöGö+ööòõéõËõÏõÁõÌõ×õèõøõö#ö@öXöwö‹ö©ö»ö×öÚöéöÞöêöêöÙößö¿öÂöšö”ökö`öEö,öö ö÷õðõãõßõÓõÄõ¯õšõ…õjõWõ5õõïôÆôŸôdô?ôôëó´ó˜ógóPó,óóüòòò÷òóó-óUósóŸóÇóöó%ô]ô‚ô»ôàôõ>õtõŠõ¶õ¿õîõùõ$ö$öMöFögöZöqöiölöoölöiöföVöZö?öBö'öööêõæõÅõ¼õ”õ†õZõIõ#õõ÷ôõôÕôÖôÂôÉô¾ôÄôÆôÐôäôïôýôõõ2õ=õAõQõHõ[õdõcõhõ`õbõ[õ`õXõJõ>õ1õõõôôÝôÌô¬ô¥ôzôôNôTô2ô:ô-ô)ô)ô ôôíóçóÚóËóÌó¿ó©ó”óródó7ó=óó óçòßòÂòÉò·ò´ò¯ò­ò³ò³ò½ò®ò·òò§ò†òòeòdòMò=ò=ò-ò,ò8ò=òKòaòyò¥òÍòó4óró¥óáóôLô“ôÐôõIõ•õÁõ ö?özöœöØöìö5÷I÷|÷†÷¦÷­÷·÷²÷²÷½÷°÷º÷ª÷¯÷™÷Ž÷z÷]÷I÷-÷÷ÿöêöÎöÀöŸöö|öXöVö@öAö@ö4öBö8öOö[öiözöŸö­öÒöêöñö÷÷?÷F÷n÷~÷¢÷¨÷Ó÷Ì÷ö÷ð÷ø÷÷õ÷ã÷Ý÷Ï÷Å÷¶÷Ÿ÷}÷_÷>÷ ÷ðöËöœö}öJö'öüõÑõ»õžõõqõfõ`õWõRõUõEõRõDõVõLõrõsõ¬õ¸õöõöUözö­öëö÷d÷—÷ß÷+øcø²øçø-ù]ù¦ùÃùúú0ú8úLúCúKúEú=ú.ú%ú úúâùÝù»ù«ù™ùˆùvùbùYùJùLù3ù?ù!ùù ù ù ùùù,ù/ùCùJùgùvù˜ù¦ùÙùïù'úLúwú–ú¸úßúû'ûQûû“û¤ûÈû¬û½û©û­û·û­û”ûxû]ûHûEû*ûûûøúøúïúûýú#û'û9ûHû\û‚ûŒûµûÑûìûü,üaüxü©üÏüýHýžýÖýþdþ þêþÿSÿ›ÿ¹ÿýÿFiv”‹’Œ†pSKöÿ¸ÿ„ÿ5ÿÿÄþ…þJþöý½ýmý'ýäüºütü@üüÂûµû}û}ûjû1û6û,û-ûNûbû„û‹ûÂûèû'üRüü»ü÷ü*ýý·ýþFþ†þ¿þäþ$ÿEÿXÿwÿ‚ÿÿƒÿ~ÿ_ÿ_ÿHÿ5ÿÿèþºþ‚þRþ þÑýuý4ýÝü¨üLüü¿û‹ûAû ûëú¬ú‰úxúcúZú^úbúsú‰ú˜úÎúÎúûJû‘ûÕû üSüüÅüüü-ýqý†ýÃýßýÿýþ<þ?þCþ6þ8þ%þ þþäý³ýŒýIýýéüœüjüü×û}ûEûòú™ú3ú×ù€ùCùúøÏøøoø/øøÍ÷®÷u÷i÷8÷.÷÷ïö±ö¦ö£ö–ö”ööŽö}öqönöGö:ö ößõ»õuõRõõÝô„ôiôôõó¯óóSó#óóçòÚòÐòÚòÙòéòóó@óqóžóÎóôaôœôéôõbõ§õúõNööÊö÷@÷|÷–÷Ù÷ö÷ø5øOøjøbømøuøcøaøXø8ø6øÿ÷ô÷µ÷—÷X÷÷Ûö•öUööÍõžõVõ3õôôÞô¯ô•ô…ô~ôyôsôˆôŠôŸô°ôÉôãôõ%õEõxõ³õö>öhöœöÑö÷E÷€÷¦÷ç÷ý÷Cøiøø³ø½øàøèøöøùøøùóøìø¾ø©øhøAø øÆ÷…÷1÷äö‹ö*öÖõ€õ4õßôôGôôÉó­ókó;ó$óúòüòØòÓòÆòÀò°ò«ò¥òò ò‚òò‚ò{ò{ònònòmòkògò`ò[òOòYòIòTòMò6ò:ò'ò8ò4ò*ò6òò ò òýñçñËñ¾ñ¥ñ•ñ~ñhñ`ñJñCñ<ñ?ñHñUñjñuñ€ñ‘ñ¤ñÁñ¼ñÝñÛñòò4ò:òVò<ò[òAòDò/ò<ò1ò>òAòNòEò[òKòWòSòTòZòNòPòIòJòRòPòmòkò€ò~ò•ò‰ò¢ò ò»òÌòÝòøòó"ó.óHóYójó‡ó|óŒóUó]ó5ó óóíòÙòžò‹òTò6òýñÌñ“ñ`ñ5ññçð¾ð•ðfðDððþïÁï´ïnïeï0ï,ïï÷îýîôîï ï#ï6ïJïmïzï¨ï¹ïçïð2ðAðtðsðžð£ð¬ð·ð°ð±ð±ð¡ðð„ðUð:ð ðÛï¥ïuï/ïï´î‡î2îùí·í…íNí$íòìÝìËìÊìÑìãìÿìíJízíÁíòíEîyî½îÿî7ïsï©ïãï ðAðyðšð×ðèðññ.ñ9ñ@ñ@ñ9ñ3ñ1ñññßðçð±ð®ðtðUð%ðüïÁïŒïbïïïÍî¶î¢îîƒî‚î‹î¼îÃîüî&ïdï­ïëï=ð„ðÆðñJñŠñ¹ñëñò*òBòNòlòjòƒòdò}òbòoòiòdòRòNò6òòòÝñÂñšñdñ.ñýð´ð†ð/ðð¢ïxï(ïíîÁîîeîIî2îî'îî*î1î;îSîjîƒî³îÇîõîï>ï`ï†ï®ïÂïöïÿï%ð.ð>ðOðZðlðnð|ðtðjðpðGðOðð%ððéïÔï³ïïiï,ïþîÊîšîhî0î÷íÄívíRííæììwìIì.ììÿëíëßëâëÔëàëæëóëì.ì\ìmì ìÂìòìíAíYívíyí“í¤í¦í’í†í•í¡í§íší¬íšíªí›í›í‘ívígífí_íiígíWíríXíoíZíIíPíLíJíLíDí^í[í|í‰í¢íµíôí î[îîÅîïMï§ïýïJð¥ðÞð>ñmñ˜ñ¿ñâñþñúñòàñÚñ°ñªñnñQññçðºð†ðFð+ðìïÇï³ï{ïtïCïJï(ï/ïïïïï"ï0ïEïQïlïï´ïÖïðSð’ðÚðñsñÃñò\òªòëòCó„óÊóô6ôqôô¦ô¿ôäôðôôôõ õõòôêôÇô·ô§ô†ô‹ôaô-ôýóÚó±ó¢ó¡ó—ózóvó]óMóHóTó5ó^ó(ó6ó+ó2ó"óBóFóHóJó óóñòØòÄòÑòÑòÜòÙòàò´ò°ò–òòoòCòòÂñiñ9ññãðÂðŽðWð&ðùïËïŸïbï,ïþîÍî£î‚î\îMî8î:î4î2î$î%î*î/î1î>î2îBî@îJîUî\îeîzîuî…î‡î›î«îÅîÒîþîïBï‡ï«ïåïð>ð`ð’ðÁðéðñFñXñññÃñÈñëñêñòò#òòAòHòiòkòò„òŒò©ò²ò¼òÍò×òàòöòòòøòúòóó1ó;óIóZósó‡ó°óÄóáóô+ôWôvôªôÂô÷ô õ6õCõkõŒõ£õËõáõöö5öQöZö‚ö…ö¬ö®öÃöÌöÔöàöÝöÜöÃöÆöÂö²ö°öœö¢ö‹ö’özöxöuömösö~öxö‡ööŒöyöŒöžöö»ö®öÑöÖöìö÷ ÷7÷3÷\÷j÷…÷¡÷Ç÷Ø÷ý÷ ø.ø.ø]ø]ømøwømø|øføuøQøJø9ø7øøøí÷é÷µ÷²÷÷‹÷o÷l÷V÷[÷E÷W÷J÷e÷^÷÷ƒ÷‘÷¤÷´÷Ä÷Õ÷æ÷ì÷þ÷ü÷ø&ø@ø0øFø:ø;ø=øøøï÷Þ÷½÷¨÷{÷J÷÷Ùö¨öiö!öçõ õ\õ$õÙô¥ôSô&ôÜó¦ófó?óóßò²òšòoòbò>ò&òòÿñòáñâñ×ñÑñÚñÌñÐñÈñÃñÐñÔñÝñæñìñýñõñòò,ò>ò\òvò–ò±òÍòèòýòóó.ó=óFóbóFómóSóbóOóLóJó@ó8ó2ó2óó*ó-ó ó4ó+ó?ó:óVóVó\ó_óRóFó:ó#óóìòÈòžòlò4òòÆñƒñUññÿð¶ð™ðbðLððÿïÌï™ïTï7ï ïêîÃî£îzîYî=îîîùíóíåíøíÒíìíëíî î*î5îIî^î€î‹î¹î®îÇîÁîÊîÓîÏîØîËîÈî¦î}î_îî îÌí¹í~ící3ííííì÷ìÓìæìàìòìñìíí#í/íSíníí³íÞíî4î`îî«îÖîñî6ïeï²ïäï+ðwðµðÿðBñcñ¦ñºñóñò+òEòpò…òžò©ò±ò½ò»òÔòÑòÚòÚòÛòÎòÉò³ò¢òòò_òcò@òNòIò?ò7ò-ò?òCògòhò{ò™ò¥òÛòèòó,óbóóÎóæó%ôHô{ôºôÙôõ0õIõYõsõmõxõgõIõ õßô”ôKôüóóGóÞòròòšñ+ñÆðfð ð¯ïZïïÊîîUîîÝí¨í›íwíuílí_ízíiíí•í·íÈíüíîCîjî’îÂîãîïCïmï”ïÆïÊïøïð ðð ððûïÿïÌïºï†ïVï'ïàî¾îkîEîþíÒí—ípí9ííòìÔìÇì°ì©ì™ì¡ì¦ì°ìÁìÚìÎìéìíGíxí±íæíîMî€îÂîôî'ïjïïÁïåïð3ðOðeðð‡ðŒð’ð™ð†ðƒðjðYð8ððúïÞïÄïœï‘ïïhï]ïMï4ïï ïïï*ïï5ï5ïJïoïï­ïÍïð'ðcðœðÖð#ñeñ©ñò3ò™òÈòóCóyó™óÁóÌóâóÏóßóÀó¿ó¡óókó*óóÁò¦òVò.òåñÆññmñ.ññéðÂðµð…ðƒðbðfðHð_ðNðjðrð¤ðÄð÷ð+ñPñšñ½ñûñò]òò×òóAówó•ó¶óÔóÕó÷óáóûóêóêóÙóÚóÁóµó óózóaóGó+óóöòËòµòqò@òòÏñÅñ|ñañ#ñ ñÞðÒð®ðŸðœð¡ð¬ðÑðâðñ5ñmñ™ñÃñüñ3òaòžòµòïòíòóó%ó)óó óóòòîòÚòÅò¦ò’òwòkò]ò=ò6òòòòò òÝñàñ½ñ­ñŽñ„ñYñHñ"ñøðãð­ð©ð‹ð}ðhðYðNð@ð9ð0ðð)ððððïïêïÄï·ïïsïIïïøîÇî îrîOî&îîÙíÈííƒí}í`íjíbíkí‰í„íší¾íÚíî3îhî¯îèî;ïpïÇï!ðhð¾ðñ[ñ§ñûñRò˜òÝò1ó…óðóKô°ôÿôSõœõïõ/öeö¯öÙö÷@÷b÷ˆ÷˜÷§÷¼÷³÷Í÷¸÷Ê÷´÷¶÷§÷¦÷ ÷–÷•÷Š÷ž÷÷³÷Æ÷É÷ë÷é÷øø"ø8øAøZøqø~ø˜ø©ø¬ø¾ø¸øÑø×øãøôøþøù%ù'ù:ùUùVùù‹ù¯ù»ùÕùÍùâùØùØùÙùÂùÂù§ùùoùHù&ùùÚø¶ø¥øø^øNø-øøøøú÷æ÷ê÷ç÷â÷â÷ã÷É÷Ú÷»÷º÷¬÷‘÷z÷X÷5÷'÷ ÷õöÞöªö©ösösöQöLö2ö-ö$öö ö öïõïõÜõÔõÃõ®õ—õ‚õ`õGõ!õõçôËô³ôžô}ôvôJôGôôôúóðóæóÊóÃó¡ó£ótónóJó=ó"óó óóóóóó)ó*óOóIórózó¢ó«óÏóëóõóô2ôUôdôƒôŒô¥ô ôµô±ô°ô¹ô¨ô°ô¥ô‘ô“ôqôoôHô;ô.ôôôô ôôôôô#ô2ô4ôLôSôlô€ô™ô§ô¶ôâôðô,õ<õyõœõÉõñõö9öföšöÇö÷+÷d÷„÷¾÷ã÷1ø8øyø‹øºøÌøåøùù'ù+ù1ù+ùùùùüøÛøÐø¶ø¨ø™øƒø•ønø‡øløzøø‰ø’ø‹ø†ø‰ø‘øšøœø¨øøµø»ø¿øÓøÙøéøüøùùù2ù2ùFù9ù<ù<ù0ù(ù.ùù!ùùùêøÝø»ø¬ø}ø^ø2øøí÷Î÷¤÷{÷V÷.÷÷ëö×ö¶ö£ö¥ö†ö‘övöö“ö›öÉö¹öæöÚöÿö÷!÷8÷A÷q÷x÷¯÷¿÷ð÷ø(øIøaø„øŸø±øÎøÛøðøýøùùøïøöøçøàøÂø¤øŠø[ø>øøÒ÷§÷o÷Q÷÷çö›öiööÚõŽõZõ#õåô½ô…ôZô<ôôôàóÖóÃóÇóÈóÇóßóÖóúó ô+ôQôˆô½ô õMõ‘õ×õ"önöœöÖöýö4÷K÷x÷Š÷ž÷š÷–÷‹÷p÷U÷1÷ ÷âö´öyöNööËõŒõ<õùô«ôbôôÄóó=ó ó²ò}òBò òâñ¸ñŸñ€ñqñañcñ^ñzñ{ñžñ²ñÛñýñ'òAò~ò˜òÍòáòóó$óó$óóóÝò¸ò›òcòBòòÚñ™ñ\ñ!ñçð§ð}ð0ðð±ï“ïDï%ïÚî­îeî6îüí²í—í@í)íïìÕì¶ì™ì”ì™ì¬ìÃìéì í/í\í|í±íÙí î8îdî“î³îíîýî&ï7ï]ïSï|ïï«ïØïîï'ð7ðdðwðµðÕð ñ1ñPñ{ñ‡ñ¨ñ¹ñ±ñÌñÈñÐñ¸ñÃñ ñªñññoñlñeñfñtñoñ‡ñ…ñ¥ñ°ñ²ñÂñ»ñÊñàñéñòñòáñöñëñéñëñÜñÍñ£ñŒñ‚ññ„ñsñsñBñ@ñ$ñ;ñ-ñ<ñññÐð»ð¶ð¹ðÍðÌðâðÆðÛðËðÙðáðÞðíðûðõðññ@ñjñŒñ¿ñêñò:òQò~ò‹ò¾ò¹òçòáòèòßòÍòÀò¸ò‰ò~òTò9ò òõñ×ñ¸ñ ñœñ‡ññtñcñRñKñQñIñZñ6ñVñ8ñeñTñmñfñqñvñ„ñ…ñŒñ‘ñšñ°ñ¼ñ·ñ¸ñ¬ñ¿ñÅñÔñÆñÎñÄñÏñÕñÅñ¦ñ›ñ‰ñ„ñzñoñYñ1ññ÷ðÕð©ð…ðYð4ðÿïàï¯ï‡ïcï/ï$ïòîîîÖîÐîÊîÉîÖîÑîïîäîï ï+ïAïcïxï£ï¼ïçï ð5ðkð™ðÍðñLññÁñëñò?ò[òšòµòÙòÝòåòäòâòÜòÅò£ò–òUò3òòéñÎñ³ñµñññyñlñeñPñJñ,ññìðØð¸ð ðŒðoð`ð=ð5ð&ððð÷ïððð*ð1ðIðYðjð|ð‰ð¢ð´ðÐðÞðýðñ#ññ6ñ.ñ7ñ)ñ'ñññøðøðçðàðÙðÃðÂð°ð§ð ð™ð“ð•ðð“ðšð£ð®ð»ðÌðçðýðñ6ñ?ñsññ¹ñÏñò:ò|ò´òÖòóóHóró˜ó¶ó¹óÑóÈóÕóÍóÑóµó¤ó†ócóDóóñòÕòžò…òWò<òòõñÜñÁñ›ñ•ñyñgñ]ñOñQñ]ñ]ñzñŠñ¯ñ¼ñÚñæñöñ ò)òFòmòvò«ò»òñòó/óFóeóóžó±óÂóÇóÌóÍóÁóÁóºóžó–ó{ólóSó=ó,óóóó óóóó$ó'óHóQó€óŒóËóÙóô,ôpô’ôÑô÷ô.õVõ}õ°õÍõøõ#ö7öMöQöaö]öföRöSö8ö!ööãõ¨õ~õAõõÒôôYôôØóšóZóóÜò–ògò/ò òÛñºñ ñˆñŠñrñ|ñxññ¥ñªñáñ÷ñ%òUòrò¾òÕòóGóŠó¸óóóô]ôô¹ôÝôõ'õJõ^õ€õ‚õ‘õ•õõŠõ{õjõOõDõõøôÚô¬ôôlôPô*ôôèóäó¸óµó“óŒó~ójósóoó…ó†ó¥ó¶ó¿óæóùóô:ôKô~ô˜ôºôâôõ/õEõqõzõ¢õ¹õéõüõööDö>ömö`ööö’öö¨ö¯ö£öŸö’ö–öƒö}öoödöVöMöQöAöYöKö^öZömö{öŽö™ö´ö±öÍöÅöÍöÏöÆöÊö¶ö²ö‘ö‡öiöEö8ö öðõÄõõuõEõ%õìôµôô8ôô¾ó‰óTó+óõòÎò§òƒòbòFòDòò&ò òò òòò*ò4òYòkò˜ò»òçòó7óaóƒóžóÉóâóôô:ôWôfôŒôƒô²ôŸôÉô»ôÃôÆôÀôºô«ôšô•ôzô}ô_ôOôBôôô÷óïóØóÉóÀó¸óºó²ó¿ó¸óÂóÏóÑóâóæóûóôôô5ôBôXôcôpôƒôŠô¤ô­ôÊôÒô÷ôõ'õ;õcõõ©õÁõçõö&öLömö}ö£ö°öÑöÖöèöôöùö÷÷÷ ÷÷&÷.÷K÷U÷l÷t÷Œ÷•÷÷«÷¹÷½÷Ò÷Ì÷ä÷Î÷â÷Ç÷Ç÷¶÷¤÷ž÷÷{÷c÷[÷N÷8÷8÷÷÷ÿö÷ïö×ö×ö¿ö«ö ö…önö^ö<ö4ööööõçõÙõÍõ×õÛõíõùõö+ö;ö_öpööªöäöûö/÷P÷x÷²÷Ç÷øøPøUø˜ø¤øåøéøùù/ùCùCùJùSùAùAù/ùùùÕø®ø}øHøøû÷¿÷¬÷s÷k÷F÷I÷9÷:÷H÷M÷o÷÷›÷È÷ì÷øNø~ø°øõø+ùqùªùÖùúTú‚úÇúûAûˆûÄû üHüüÆüÿüýVýzý¦ýÉýäýþþ>þJþYþgþuþzþ„þ†þŠþ‹þvþˆþmþkþOþMþ@þ)þ#þþ÷ýæýÆý¼ýý|ýaý4ýý÷üËü ü|üEü(üöû×û°û£û…ûxûuû`ûjûdûeûwû€û—û±ûÄûãû÷ûüü,ü1üTüuüˆü¬üÌüõü ý/ý@ýdýtýŒý–ý½ý¾ýÈýÓý¿ý¸ý·ý¢ý’ýtýMýýõü«ü—ü1üüÊûŽû[ûûàú˜úYú ú¼ùxù3ùéø·øZøøÖ÷€÷Z÷÷Ýö“ölö4ö öéõâõ½õ±õªõšõšõ­õºõÛõöõ ö:öOö‚ö‘öÄöèö÷*÷[÷f÷‡÷¤÷¡÷¸÷»÷Í÷À÷»÷±÷™÷÷l÷i÷0÷.÷ ÷ÔöÃöŸökö]ö7ö öÖõžõrõOõ+õ õæôÂô¶ô‹ôšôrô…ôƒô£ô»ôÊôõõWõ|õ õÙõöHöpö£öÆöãö ÷0÷B÷I÷I÷B÷F÷?÷E÷6÷#÷÷âö²ö‘öföDöûõÉõ‡õKõþô»ôtô+ôÞóŸómó)ó óÞòºòšò{òuò`òrò„ò›òÙòøòTóšóïóXô¶ô*õ õööñöe÷½÷ øIø‘øÄøãøêøðøÁø©øiø øÌ÷\÷÷yö4ö›õ0õ¦ô%ô”óóyòúñcñàðXðïï€ï(ïÆî‚î$îãíÆí°í í¤í«í«í¿íÛíî:îîÝîLï¥ïððððjñ¶ñ>òòóTóœó÷ó ô|ôœôËôëôðôüôõôÕôÍôôuô#ôëó•óKóñò¤ò?òêñ‹ñDñæð–ð<ðãï£ïWï"ïèî»îžî‡îŠî|îî›î¸îøîïWïlïËïðwðÁð;ñ‰ñòYòÄò#ó}ó×ó(ôrô´ôìôõ=õZõgõmõgõ]õ=õ õñôÉôˆôMô ô®ómóóºòLòöñšñ9ñòðŠðOððï®ïaï)ïðîÇî´îšî¢îžî·îÊîøîïMï|ï¶ïùï8ðyðÀð ñEññÀñòFò‡ò¿òëòó3óMó_ólótómóhóKó5óóäò•òiòòßñŽñFñ÷ð·ðaððÀïï-ïÿî±î|îAîîòíÕíµí±í£í¯í¼íÛíî)îmî”îøî"ïzï¸ïð^ðÆðñjñ¢ñîñ*ò]òòÊòþò,ócóˆó®ó§óÂó²ó¼óžóžólóYó&óóÌòœòWòòÓñšñZññÝðŒðhð&ððÐï´ï¡ï†ïrïnïlïnïqïyï€ï~ï‹ï•ïµïÒï÷ïð4ð_ðlðŒð‹ð­ð®ð®ð™ð¦ð±ðÅðÄð×ðÕðÝðÜðÏðÀð±ðžð“ðxð~ðdðoðEð]ð0ðFð,ð2ð1ððððð*ð*ðNðGðhðoð™ð£ðÇðàðñ(ñOñmññ·ñíñýñ òBòcòŠò´òËòóòó(óBóTóqóƒó ó´óÅóÖóâóçóëóßóèóßóÜóÚóÑóÇó¨ó“óuóSó'óóÓò¡òqòAòúñÆñsñ;ñãð¦ð\ððèï£ï~ï;ïïâîÄî¢î‰î‰îxîîŽî–î î´îÁîÑîæîï!ïLïrïšïÐïñï+ð[ð„ðÒðùðEñ…ñÃñò9òlòžòÇòó/óYó‚óŒó¹óÄóÜóéóþóôô)ô-ô)ô:ô7ô;ô)ô)ôô ôðóñóìóÖóÇóŸóƒóOó-óúòÚò¤òyò^ò"òòìñØñÇñËñ³ñ¿ñ¯ñ»ñÌñÝñçñâñò#òhò‰òÜòôò@óró³óæóôSôôÄôþôdõ£õðõ2ökö ö°öéöþö4÷/÷Z÷j÷o÷q÷V÷?÷÷÷Úö¹öbö"öçõ¾õ‹õMõ7õõ õúôãôÜô×ôÖô¸ôÁô®ô¢ôžô®ô³ôÃôËôÀôØôÌôÐôÇô¸ô¹ô¿ô¿ôÉô¿ô½ô¬ô¼ôÄôÄôÕô¼ôÉôÇôÒôèôÞôÏôÚôÖôäôßôùôÛôÑô³ô ôwôrôdôgôMôLô1ô6ôôô ôôÿóô$ôCôSôqôyô¢ô£ôÚôÍôïôáôðôôôáôõõô õþôõýôúôùôïôõôßôìôÏôØôÁô·ôôˆô|ôgô]ôBô!ôáó¦ó˜óyóQó)óóôòÝòÐò™ò‰òjòyòcòhò[òRòPòTòaòlòhò4ò*òòòôñÔñÔñ¶ñÊñ£ñ­ñ„ñzñRñHñ'ññîðÏð¬ðœðsð\ð&ððÔï§ïuï0ïï¿î–îRîîîí§íˆíZí0ííãì°ì™ìwì_ìVì4ìAì)ì0ì/ìIìNìcìtì‰ì¢ì½ì¿ìÕìÍìëìíìúì÷ìþìëìíìÚìÎì³ìŸì…ìqìXì:ì"ììçë×ë²ëžëëdë=ëëçê´êƒêAêêÖé¨éˆé8ééÇè£èmè@è0è èèèè#è0èCè^è€è¡èÖèôè7éZé˜éÃéçé$êVê•êÎêë[ë’ëûëIì¥ìéì+íRíšíÆíî?îeîˆî³î¨îÑîÇîËîÀî·î«îî{îbîHîîïí¶íƒíHí"íäì¾ì‚ì`ì$ìþëÌë”ënë3ëëêêÕêªê“êê]êPêBê1ê;ê)ê:ê3êNêJêxêqêµê»êëëhë˜ëàë#ìhì¡ìéìípí¨íîí-îwî¬îïî#ïVï‰ï¾ïàïð(ð]ðrð¡ð®ðÀðÉðæð÷ðñ+ñ4ñUñkñ†ñ…ññ›ñµñÔñòñò'òBò]òxò‚ò§òµòçòñòó*ó!óHó=óGóCóCó@ó0ó&óó óôòãò¾ò¶ò‘ò‚òmòZòFò6ò(ò'òòòêñäñâñÜñÜñäñÙñóñêñúñòòò ò)ò<ò>òCòOò=ò>ò3ò7òòòôñåñ¶ñ¡ñvñHñ'ñïðÙð£ððXð?ð ðìïÃïœïjïFïïãîºî|î`î&îîåí±íŸíhíXí.ííþìáì×ì·ìÄì­ì¼ì·ìÉìÜìñìí)íPíjíŸíÅíîí*îFî†î²îâîïAï~ï°ïáïðJðŠðºðöð.ñYñ˜ñÅñò-òsò”òÍòßò óó2óHóGóYóPóWóHóEó)ó%óóóúòêòçòËòÊò ò¥ònòhòGò3òòòéñÄñ»ñ†ñ{ñ?ñ6ñüðïð·ð®ðxðvðHð?ððð ðð ðððð5ðEðcðuð˜ð¹ðÖðùðñ1ñIñUñWñrñgñ„ñxñ“ñ‰ñ›ñ‘ñ¢ñ‹ñ¥ñ†ñ¦ñ–ñ¬ñ¸ñ¹ñÉñÁñ×ñÌñéñäñ ò ò*ò0òSòcò…òœò»òæòùò,óAópó…ó±óÌóÛóô ô+ô+ôBôQô]ôgôjôrôbôrôZôaôVô=ôFô ô#ô ôþóíó×óÔó¯ó­óˆóƒóhó[óKó>ó8ó>ó.ó;ó+ó>óEóeókó˜ó°óÔóûó$ôKôsô¯ôÊôóôõ%õFõOõsõoõ‰õƒõ†õšõ‹õšõ€õzõ^õGõ+õýôâô”ôhôôÑó—óFó óÆòzòOòòáñ˜ñ‘ñvñsñjñnñkñrñ|ñ‹ñšñÀñèñò9ògòyò´òÊòó!óNófó’óŸóÑóÚóôô4ôQôIônôqôœô ô¿ôÄôÅôÁô±ô‹ôzôIô4ôôñóÕó»ó˜óaóKóóóòòìòÚòÚòÈòáòËòêòçòó!ó:óVósó~ó›ó¢ó¶ó¾óÐóìóô ôDôiô“ôºôÞôõ)õbõŒõÀõìõö+öPö\ötöwö˜ö…ö•ööwöcöIö9ööþõÈõ©õwõUõ"õ õåôÍô§ô{ôeôGôôôâóÚó¼óºó¬ó¬ó£ó—óˆó‘ó{óšóœó¹ó¦óÒó¼óïóÿó;ôUô—ôÊôÙôõýôÿôõ%õDõ:õ?õýôãôõéôõÎôÈôbôhô&ô!ôøó¯óˆóióUó:ó1óóÞòÃò«ò‡òlòCò8òòò÷ñýñüñò,òcòbòzò§òÊòó<óróŸóØó$ôeô©ôèô,õbõ–õÈõùõ!öIöhöö›ö±öÄöâöôö÷÷ÿöòöÕöÇö¤öŒöaö6öþõãõ‘õuõ&õøô¯ô‹ôCô ôòóØóÂó¨ó¨ó¤óªóÎóÛó ô#ô[ôwô¯ôÝôõPõõÈõöNöšöÖö÷K÷n÷›÷Â÷ì÷ ø9øHøaøkø€øløuø^øYøAø$øøà÷Ç÷“÷o÷1÷ ÷Õö¯ö{öWö!ööÌõ§õxõOõ9õõ õ÷ôûôáôøôâô÷ôåôòôöôõõõ õ õõõõõøôõòôîôíôÕôËô¶ô–ô†ôkôOô1ôôô×óÆó¢ó‰ózóZó`óSóLóSóQóaódópó}ó‹ó³óÆóðóô#ô>ô]ôuô•ô¢ô¶ôÅôÝôùôõ(õOõNõdõ{õ‚õ£õ›õªõÆõçõöö ö3ö.öYöJöWöJöö4ö!ö*ööööøõöïõúõßõÑõ¾õ£õ~õfõMõ8õ#õõ õîôõôÔôÛôÂô·ô¤ô”ôô”ô—ô‘ô‹ô’ô‘ô•ô¢ôšôžôŠôˆôrôvôLô8ôôæóÁó›ózóQó/óûòÊò˜òiò@òòññÌñ±ñ–ñ„ñnñbñcñSñQñMñCñWñ7ñXñ1ñ@ñ)ñ.ñ/ñ2ñ0ñ%ñ ñ+ñ/ñ0ñ:ñHñañpññ¤ñÄñ×ñòòDòFòƒò€ò´ò·òßòÓòßòâòûòó-óSóvó”ó¸óºóãóéóüóôþóôôôôôóóàóåóÎó¿ó¯ó‚ó‚óNó8óóêòØòÅò¾ò²ò¦ò ò¦ò£ò³ò¬òòpòvò‡ò”ò­ò³òÎòÙòóó:óRóbó{óšó¥óÃó¾óâóôô&ô2ôHô\ô^ô|ôqô~ôiôsôBô2ôôèóÈó“ótóLóúò¡òmò^ò:ò5ò&òòòÿñòþñøñíñÍñÏñ®ñÈñ¼ñÕñÞñ÷ñ òúñòò(ò,ò>ò>òGòIòWòfò_òKòSòOòRò_òbòuòròqò}òhòiòLòLòCòCòEòIò@òHòBòIòJòSòRòWòPòYòTòeòlòzò€ò’ò˜ò¬ò¹òÂòÔòßòóó<óQóoó‡ó¨ó¶óÊóÃóÙóåóôô"ôôô ô ô ôôô÷óôïóúóèóáóêóÕóàóÄóÁóµó¦óŠóbóIó#óóÿò×ò¼òòqò_òGò8ò/òþñòñ¹ñ½ñ“ñ¨ñ ñ ñ…ñmñkñhñgñ‚ññ”ñ›ñ¡ñ´ñÁñÊñÛñÜñîñóñÑñÄñ–ñ¤ñ‹ñ›ñ’ñ’ññ¦ñ¥ñ¯ñ¥ñ·ñµñÂñÀñÍñÜñÙñëñôñüñññòñþñòòò*ò;òHòZò|ò•òÅòÚò ó+óbó—óÄóâó ô5ô_ôô•ô®ô¿ôâôÝôòôóôâôÖôºô™ôqô6ôôìóÙó¥óqó@óóÑò¤òjò3òöñ³ñzñAñ ñÓð‘ðJðøïÒïªï‡ïrïUï7ïïïïïïïïEïOïyï“ï¶ï¯ï¯ï¡ïˆï®ï¶ïÆïÛïÞïüï ð ððððð ððð%ððððàïÔï·ï°ïïnïAï-ïïï÷îâîÁî¶îîî~îjîrîoîqî}î•îªîÕîýî0ïLïƒïŠï»ïàïðð0ðKðgð‰ðµð×ðïðõðññññññéðóðÅðÁð­ð†ð_ð#ðôï·ïïEïïéî±î~îZî7î&î îîôíõíðíéíùíîîñí îîKî^îwîœî¾îöî ïKïfïï¯ïÖïóïýï$ð/ð\ðrðzðƒðˆðŒðxðuðjðeðkð\ð[ðSðDðEð?ðUð5ðAð:ðcðnðð˜ð¸ðÉðÓðëðððþðññ#ñ(ñ.ñ2ñ-ñ$ññ4ññññëðáðÒð¼ð¾ðŸð¦ðððƒðwðaðHð ðýïÜï¾ï ïïeï?ïïßîÀîˆîiî=î!îîîòíïíÐíÄíŸíí†í”í“í¾íÈíøíüí1îMîpî–î¿îÚî ï,ïoï˜ïÆï÷ïðtð«ðýð@ñŸñÞñ9òmò¼òìò&óVóó¶óèóôAôjô€ô—ô—ô¦ô¢ô¼ô¼ôÂôÛôÐôÞô¹ô¤ôŽôqôJô ôîóßóÙóÍóÌó»óºó³ó©ó¦óŽó…óró~ópóqóaówóŸó¶óÞóüó*ôKô|ô‚ô¤ô·ôÑôûôõCõVõtõŽõ£õµõ´õ¾õºõ£õõ‡õ†õŒõzõyõcõ_õNõAõ4õ&õõõõöôÝôÖôºô¹ô‘ô…ôHôAôôûóÒó«óŽóióMó6ó#óýòâò­ò§ò…òŠòoòiòZòMòFòFò?ò1ò&ò#òò òòþñøñìñÜñÉñ¦ññ†ñ“ñ™ñ¢ñ˜ñœñªñ¸ñ½ñÊñÊñÌñÐñÙñîñâñåñãñáñðñíñýñóñòýñ òò!òò!ò*ò5òJòUòXòcòfòpò|òtò‰ò~òšò‘ò´ò¥òÇòÂòéòîòóó<óNóvó—ó°óÒóæóôô;ôDô^ôpô‹ôžô·ô»ôÄô½ôËôÈôÓôÄôÊô¾ôÓôÄôÛôÎôÛôÚôáôÙôâôÝôòôñô õ õõ%õ,õFõHõhõjõ~õ}õ}õ‰õuõ‚õpõrõYõSõCõ7õ'õ õìôÕô²ôªô†ôwôTô5ô$ôøóñóÒó¸óŸó†óxófóWóOó7ó.óó óóøòäòïòÙòÚòÑòÄòÆòÃò·òÅò²òÇòÅòÉòØòÎòÑòÍòÝòóóBóbózóŸó·óÙóîóôô=ôEôeônôôtôyônôgô[ôCô:ôôôáóÇó‰óxó9óóôòÊò¥òzòfòCò*òòóñÙñÌñ»ñ­ñ¨ñ™ñ§ñ¦ñ©ñ½ñÂñßñôñ ò6òGòpòœò¯òðòó<óYó‹ó¬óÇóïóôô%ô-ô+ôôôûóæóÏó£ó‚óGóóÅò—òJòòÔññWññæð¬ðŠðNð0ðþïçïÅï³ï–ï‚ïqïkïjïbïrïyï™ï°ïÖïöï-ðKð‰ð¥ðîðõð,ñ0ññ‰ñÖñçñò(òOò[òwò}òzòMòDòò÷ñ­ññSñ0ñññåð¯ð‹ðNð;ððþïÐïËï»ïÈïÙïÐïãïâïýï ððð2ðGðoðžðÂðñ%ñdñ¦ñÒñûñòJò…òÈòïò(óIóqó‚óó£ó¢óóóVó<óóçò·ò—òNòòÔñžñ_ññ÷ð½ððlð>ðððâïìïËïÍïÏïÖï÷ïð>ð`ððºðÞð$ñHñ“ñÄñèñ"òeò¬òùò:óuóºóóó1ôZô“ô¸ôÑôðôòôõ õõõðôÅô¯ô’ôwôeôLô+ô ô÷óúóÖóÌóÇóºó·ó¼ó¾óÙóâóûó ô%ôZôuô¸ôÑôùôõQõõ¤õ×õîõ!öMöwö¯öàö ÷A÷g÷¨÷È÷÷÷ø?øLøiøqø‡øø˜ø‹øzøgø?øøÞ÷Ÿ÷ƒ÷M÷-÷÷Îö¶ö‹öwöZö5ö&ö"ööö öö ö0öö:ö=ö4öVöSöhöböcö`öjö_öiöfölöföoöeöjöqöcöcöTöIö9ö)ööôõíõÄõªõ‡õeõ@õõáô½ôôGôôóÔóœóŒó\óhóZóeóióƒóžó»ó×óüó0ôpô ôÿô<õ’õÒõöUöŠöÓö÷D÷|÷¬÷å÷"øXø–øÚøýø6ù[ùùÍùèùú8ú`ú‚ú’ú±ú¿úØúÏúÔúÊúÎú§ú–úvúOúJú#ú úîùáùàùÛùÑùçùØùùùþù$ú@ú_ú…ú§úÑúðúûAûSû‡û›ûÇûÝûöûüü$ü4ü.üBü8üLü;üCü>ü'ü üîûÇû±ûyûHûûÙú’úWúúÁùxù0ùãø£øMø&øÄ÷¯÷S÷B÷÷÷ñöóöùö ÷÷8÷R÷z÷÷½÷ã÷ø3øDø|ø‹øºøÆøáøþøù7ùgùbù’ùù­ùšù©ù–ùŒùqùaù/ùùÖøŸøOøøÂ÷…÷<÷ïö¨ö_ööáõ£õpõ?õõõôÌôÅô«ô›ô˜ô¦ô”ô¸ô»ô×ôêôõ&õ6õ]õ|õ‡õ£õ­õÍõåõö&ö"öMöAöNöXö`ököyönönöqö_öXöOö:öö öåõÈõ…õaõ3õïô×ô•ôeô3ôôÕóœówó:óóÓòÊòòaòCòòôñÎñ´ñ‡ñ`ñ4ññùðÎðºðºðð‘ð‚ððZðWð9ðCð"ð'ð&ð"ð-ð>ðDðKðWðdðxðƒð’ð§ðªð®ðÄðÅð¼ðÇð¶ðÇð«ðÈð²ð¸ð®ð·ð©ð§ðµð³ð°ðÈðÄðëðïðñ ñññ5ñ6ñAñAñ=ñCñ&ñ1ñ&ñ#ñ3ñ9ñ8ñ2ñ:ñ/ñ&ñ#ññ ñ'ñCñXñuñ€ñ½ñ±ñíñøñò&òò0ò0ò;òEòLòaò=ò\òUòdòjòxòògòfò\ò=òòòàñÜñ¹ñ•ñyñ;ññ×ð ðkð)ðúï¹ï—ïRï9ï÷îÜî¨îî\îFî.îîîúíúíîîîîîîî'î$î1î0î3î#î:îEîBîZîNîkî^îpîYî[îAîMîIîSîEî@î8î3î#î#îîüíííÈíÄí í—í€ídíEí9íííùìïìéìÙìãìÒìßìÊìÊìÃìÅìµì¶ìžìŸì“ì¥ì„ìŠì~ìzì{ì|ìˆììšì¹ì§ìÇìÉìÕìôìí/ínífí›íŽí§í±í¶íÞíÄíäíØíßíÒíÝíÍíÙíÜíïíçíêíìíôíðíøíòíøíìíîôíøíûíãíôí»í©íqíYí.í íþìÒìµì‘ìwìQìììÄë¦ëkëIë"ëóêÑê´ê†êqê]êMêBêAêAêQê_ê|êŒê¥ê»êóêëZëyëµëÒëì7ìuì˜ìËìììí8ílí“í°íÝíöíî=îGîpîtî‘î“î¶î¹îÐîÝîóîï&ï0ïKïaï‚ï¬ï½ïõïðGð€ð¼ðñ6ñ‹ñ´ñøñ$òjò£òÛòóMóóÀóô)ôxô‹ô×ôùô%õIõuõõ®õÃõÞõíõþõööööýõ÷õØõÒõ¤õœõ}õSõ@õõüôóôÈôÉô™ô’ô€ôoôuô`ôyôbô…ôlôôyô—ô™ô·ôÎôîô õ3õTõ~õœõÅõéõö5ö[özö“ö°öÁö×öáöãöæö×öÔö¾ö®ööOööÕõŸõ[õ%õØô¦ôHô"ôÅó–óHóóÛò òwò7òòãñ²ñ‘ñ\ñ=ñ#ññôðØðÏðÂð´ð¹ð§ð¹ð¼ðÑðåðùðñ&ñJñañzñ†ñ®ñ´ñÖñÙñëñïñîñøñîñéñâñÎñÑñ¼ñ®ñ¥ññxñPñ;ññ ñôðæðÍðÃðªð›ð‰ðpðeðHðFð%ð(ðððððêïðïï ðÿïðð ð2ð=ðSðQðkðpððð“ð—ððð©ð”ð¥ð†ð|ð^ðCð2ðð÷ïÔï³ï‰ïsïLï-ïïòîËî¥îîiîOîî îÜíÖí¾íÃí¿í®í¶í¨í²í¦í²íÇíÇíãíâíýíÙíëíîî9îJîRîSîEîYî]îrî„îªî·îÎîéîûîïï*ï"ïïÿîïÛîÈî¯îœî–î¬î®î¼îÉîÃîÌî¶î¿îÐîÉîÃîÝî¨î³îËîâîï(ï=ïfïlïï‘ï‘ï¥ï›ïÎï¼ïàïñïð ð7ðWð„ððÇðÔðþðñAñNñDñ>ñ`ñpñ‚ñ¦ñ£ñ´ñ¾ñÚñîñõñúñò$ò4òVòbòtò‰ò©òžò¹òØòøò ó óAóRójó•ó§ó¤ó¾óéóô?ôsôô±ôÄôõ5õUõzõ‘õ–õ¬õ¶õóõöõö-ö2ö5öOöPöTöZögöZöbö/ö öö öööö ö öþõþõóõüõþõüõö öööö ööööíõæõÖõÍõÇõÐõÅõ¯õ¶õ©õ´õ©õ°õ¡õ£õ‡õŠõWõ/õõõòôõôÕô¹ô©ômô‚ôcôLô^ôZôHôpôfô‰ô„ôŸô®ô¯ôÚôàôôô õ%õFõjõ‡õ›õ©õàõþõFöyö™öÑöûö)÷[÷~÷¶÷»÷÷÷ ø1øLøeøxøø‘ø›øøŽøzønøhø\øAøAø øý÷ó÷ß÷Ö÷Ë÷¯÷®÷÷•÷H÷G÷%÷&÷÷÷÷éöóöÚöÇö¿ö·öÁöÆöÄö×öËöÖöÑöãöêöáöòöêöúöàöðöÜöÒöÂöÀöœööpöhöTöMöFö8ö#ö ö öúõöóõñõÏõÑõÈõÍõÇõÁõ·õ¶õ¥õ¨õ¤õ¢õšõœõ•õuõuõWõRõ=õKõ>õ[õGõWõ1õ$õ1õ;õMõeõeõfõyõ^õhõMõ^õnõkõõõ‡õ›õªõÑõÚõúõ öAöCörö…ö”ö§ö¾öäö÷ö÷7÷1÷K÷\÷~÷†÷š÷‘÷£÷Œ÷{÷s÷W÷I÷÷÷Èöªörö\ö=ö&ö öùõ×õÏõÈõ­õõyõPõ<õõ õäôÒô½ô›ônô\ôYô;ôPô1ô,ô8ôôôôþóøóþóôóöóþóðóåóÕóÎó­ó¦óógóóûòÊò—òsò=òáñÀñ‹ñSñ3ñÿðµðœðaðFð"ðçïÖï¶ï·ï¢ï¥ï˜ï“ï‹ïŒïïŽï‘ï­ï¯ï¼ïäïñïð3ðSðð¨ðìðñJñxñ°ñÌñþñíñòò,ò;òFòEò@ò@ò:ò&ò%òòùñòÙñßññ­ñ’ñyñŠññ£ñºñÇñØñëñòò>òIò5òQò_ò}ò®òáòó9ó]ó”ó¶óïóôAôyôšôÉôéôëô õõGõ`õfõeõKõ^õLõ[õYõ/õ0õ#õ*õ%õõõ÷ôêôÏôÕô¶ô¯ô›ô¡ô’ô’ôˆô–ôô‘ô–ô}ô‡ôoôiôbô]ôhôeômô‰ô¯ô¼ôÐôñôõ&õ"õ2õHõYõõ©õÎõóõö ö;öJöKöFö8ö:ö-ö"öööèõÞõ–õŒõGõ=õõïôãô±ôôôjô]ô4ô&ô ôüóÝóÔóÌóÀó¿ó¬ó¹ó•óªóÉóÞóñóõóõóïóÞóÐóºóªóšó óšóó“ó‹ó|ó=ó.óóçòÏòŸòòRò)òòÐñ±ñiñfñDñ8ñ%ññññññ"ñ,ñNñ_ñyñ›ñ­ñÉñÔñéñññò"ò@òhòò»òÈòóéò óóEó^ónó‚ó‹óžóªóÇóÀó¿ó¹ó³ó¦ó­óó{ó]óNóFó)óóèòÏò¢ò›òŠòzò`ò8òòò%ò6ò9ò=òZòkòjò“ò¢ò¼òÔòüò#óRóqóºóàó&ôMô™ô¾ôüôõYõxõ§õÑõùõ öö&ö-ö8öIö_öVöRö=ööö÷õâõÉõ«õõ[õ5õ õýôÚô´ô…ô\ô.ôôáóÍó´ó®ó„óómónótóróƒó‚ó•ó¬ó»óÁóÍóäóôLôzô¹ôëô õLõnõ¥õËõëõöGöRö’ö–öÏö·öåööö÷.÷=÷M÷g÷s÷÷–÷¡÷³÷Á÷è÷û÷ø1ø=øYøbø”ø©øËøàøù!ù@ùjù”ùÆùÖùòù.úHúrú¡úÖúèúû6ûEûpû„û°ûÕûãûü7ü^ü‚ü”ü½üÑüýüýDýQýsý†ýý’ýžýµýÔýæýûýýýóýþüýþþþøýþþúý þþýþÿýþíýõýóýêýÿýðýÿýöýþþþþþäýêýÂýÏý§ý¦ý_ýTý-ý ýòüÆü³ü}ü^ü(üüû¼û’ûJû(ûÑú¡úiú8úúìù“ùpù$ùù×ø¼ø„øVøøÍ÷š÷a÷D÷)÷÷ûöéöâöÓöàöïöðö÷ûö2÷÷S÷c÷¡÷Ê÷ý÷3øFøuøŽøËøîøù/ùWùZùZùyù’ù‘ù£ù»ù›ù¯ù–ù”ùdùBù ùùæøÖø·øˆøpø=ø"øê÷Ê÷Ž÷t÷-÷ ÷æö¹ö„ötö2öööïõãõÒõÏõÙõÌõñõ÷õöö7öVökö˜ö«öÐöíöþö&÷+÷T÷`÷‰÷÷µ÷Ê÷à÷æ÷ý÷ø øø"øø)ø øøøø øøøøøø øø øð÷ö÷ß÷ö÷Ô÷Ü÷Ð÷»÷±÷µ÷÷Œ÷Œ÷‚÷x÷r÷f÷c÷V÷K÷R÷8÷9÷8÷*÷4÷÷÷÷÷÷õöÝöÍö¼ö¸öœöö|ö[öCö&ööÞõºõ¦õmõWõ3õõçôÓô­ô‹ô‚ô`ôJô/ôô ôýóðóÛóÃó¬ó¡óŒóœówó|ó_óNó<ó,ó.óóó ó óóüò óòòõòÝò×òÄò¾ò®ò¤ò™òvò}òUòSò>ò<ò+ò,ò"ò"ò)ò5ò9òHòaòuò¢ò¸òæòó&óDómóuóœó²óÄóéóþó ô1ôPôoôô©ôÄôÚôðôõõ&õ7õGõYõqõ{õ—õ•õ¨õ“õ—õjõOõ$õõõûôòôçôÖôÇô½ô ô“ô`ôNôô ôþóôôóæóÆó©ó{ó]ó=ó ó÷òßò¶ò‡ò?ò!òïñôñâñäñ¼ñ—ñGñCñ_ñgññ…ñ©ñ®ñ×ñâñò<òNò™òªòÐòÝòó=óYó˜ó¹óâóîóôôô+ô4ô6ôBô/ôBô$ôô÷óãóÆóšózó8óóÆòœò^ò#òëñÀñ‚ñtñCñ=ññ ñ÷ðìðÑðÑðÇðåðÞðúðñ1ñLñdñuñ›ñ¼ñìñòPònò¦òÓòóYóóÐóôGôhô²ôçôõNõoõõ´õÓõïõö.ö,öYöVözöyöyö”ö~öö‘ö…ö‡öeö^ö*ööçõÍõ¯õ›õ‡õfõRõ õõæôûôÝô õîôõ õ)õ0õaõlõ–õµõ×õùõ ö1öWörö¥öÀöÔöéö÷$÷S÷p÷÷¥÷š÷©÷­÷Ó÷ä÷ø$ø.øGøMøvøuøŠø˜øŸø¦øµø´ø´ø¸ø°ø¯ø¥ø’øŽø€øløføQøFø6ø4øøøø øøó÷ý÷é÷ã÷Ü÷Î÷¿÷º÷¯÷­÷ ÷ª÷›÷²÷¤÷º÷¸÷º÷Ó÷Ù÷õ÷ÿ÷ø*ø9øFøSø_øgørø‰ø‰ø¢ø°øÇøÍøòøéøùùTùFùiùaù{ùwùŽù‡ù„ùiùcùgùsùvù…ù‘ù¤ù°ùáùú.úUúŠúÃúèú,ûPûyû¥ûÑûÿû%üMüjüŒüžü»üÊüÌüòüèüýý.ý=ýCýLýTýJýLýHýOýNýAý@ýý ýöüÊü¨ürüGü üéû°ûûKû ûÕú§úoúAúúîùÍù±ù“ù‡ùhù_ùHùKùFù>ùAù3ù<ù-ù8ù4ù;ù@ùNù`ùnù…ù–ùµùÅùäùóùúú>ú7úSúQúYúXúTúDúOú9ú6úú úöùñùÔù¼ù§ùŒù‡ù…ùù€ùŠù…ùšù ù®ùÎùÚùôùúú/úAúMúhúgú†ú‹ú¢ú–ú¢ú ú¯ú¸ú¹úÃú©ú¯ú£úŸúŸúŠúˆúwúfúIú<úúúàùÀù¤ù{ùbù7ù#ùöøÝøÃø§ø”ø–øø‰øyø|øsøgø}øuø“øø ø¦ø¶øÆøÝøðøùù8ùIùgù|ùœù®ùÉùËùæùüùú1úBúfúúšú°úÊúÐúáúíúòúýúóúûúòúéúÖú»ú²úú…úeúXú:ú#úúþùêùÜùÅùÁù¨ù¸ù ù±ù¦ù©ù ù«ùªù¹ùÇùËùÞùàùòùôùúúú.ú%ú=ú5ú;ú8ú2ú0úú,ú#ú0ú)ú-úúúÿùúâùäùÄùÅù¬ùªù£ù™ù•ùŽù‚ùù~ùù‹ùˆù¦ù§ùÆù×ùòù ú0úEúcúyú•ú°úÑúçú ûû0û4ûNûZûiûgûsûfûoûdû\ûTûOûEû5û4ûûûûúáúÐú¼ú—úŠú]úJú úúäù¶ù ùrùiù@ù:ùùù ù ùùùùùù-ù6ùHùfùiù“ù—ù³ù½ùÎùâùøù úúú#úúúú úëùíùËù´ù”ù~ù\ù4ùùðøÝø©øšøkøTø'ø øÞ÷Ã÷¡÷}÷g÷C÷*÷÷÷÷ÿö÷ýö÷÷C÷Q÷€÷Œ÷»÷Ï÷ô÷ø5øOø~ø—øÈøÛøúøù ù;ùAù[ù^ùsùrùyùxù|ùkùrùXù`ù=ù5ù ùôøÕø¹ø•ø{øWøDø$øøü÷ç÷Ú÷Â÷¶÷¢÷›÷÷–÷›÷ ÷²÷©÷½÷µ÷À÷Ñ÷Ò÷å÷á÷ù÷ö÷ø ø øøøøè÷é÷Å÷³÷™÷{÷e÷F÷÷ûöÕö°öŽöeöHööüõÛõ½õªõŒõ„õoõkõdõcõiõjõjõ†õŠõ¡õÂõÑõüõö2ömö|ö°öÎöúö!÷U÷z÷®÷Î÷ö÷ø<øaøø™ø¼øÄøëøäøùþøùþøðøåøÝøÁø¼ø’øø\ø1ø øæ÷¶÷š÷j÷P÷,÷÷óöÕöÇö­ö™ö”ö‹ö–ö˜ö§ö³ö¼öÜö×ö÷ýö(÷3÷X÷t÷—÷²÷Ô÷ê÷øøKø[øzøŒø£øªøºø¿ø»ø¾ø±ø¾ø³ø·ø¶øªø¦øø“øpørøPøOø5ø/ø ø*øøø%ø,ø3øJøTøcø„ø•ø¿øËøüøù:ùhùù§ù¿ùÑùâùñùôùÿùúöùñùÝùÌù¶ù“ù|ùBùùâø­øeø+øÜ÷Š÷8÷ãöŽö/öçõ‰õEõóô®ôgôôÞó«ógóRóó óÝòÛòÈòÍòÈòØòàòüò ó9óFóióˆó¯óÍóóóô4ôOôtôŠô¢ô¹ôÖôáôîôøôëôíôÙôÕôÏôÁôªô¨ô„ônôUô0ôôØó­ó‡ó3óóÐò¢òaò5òòÛñ·ñŠñoñYñ5ñ.ññ ñññ ñ"ñ"ñHñDñnñoñ‚ñ„ñ ñ™ñŸñ®ñ•ñ˜ñññ‡ññ~ñ„ñ}ñzññxñ—ñ„ñ|ñhñHñKñ8ñ;ññ$ññüðùðúðùðìðõðûðýðñ4ñLñiñrñ~ñ²ñÕñò$òRò\ò…ò›ò¾òÌòâòöòóó4ógókó’ó”ó¨óÅó»óâóêóôóêó÷óßóäóÍóÐó¿ó­ó¢ó…ódóRó*óóÝò´òò`òIò òøñ¯ññbñ1ññÖð°ðvðOð0ððïïÒï¹ï¤ïˆïïqïtïiïbï_ï_ïaïeïhï„ïŒï°ï´ïÞïìïððJðPðð—ð¿ðæðôð4ñCñlñ‰ñžñÂñäñ òòCò_ò|ò¥òµòÓòàòéòóó-ó1ó5ó3óó óâòÚò­ò•òxòKò#ò òÓñÆñqñqñññÍðªð€ðgð<ððõïÑï«ïïdïPï.ïïï÷î×îßîÈîÐî¿îÈîÉîÑîÚîèîêîîîïï.ï9ïaïlï…ï“ï¦ï¨ïÁïØïæïþïððð)ð:ðNðKðYð[ðVðcðXðoðeðeð_ðgðdðyð|ðˆð¡ð¡ðÆðÆðæðçð ññ4ñ<ñjñkñŽñ–ñ¬ñµñÑñãñò òò)ò1òCòGòFòIò@ò=ò/ò#òòùñåñÍñ«ñ‘ñyñYñJññ ñÕðÎð’ð‘ð^ð_ð?ð>ð6ð9ðCðBðSðcðeðŽð’ðÈðÚðñ'ñ\ñxñ¤ñÇñêñò6òHònò€òžò´òÂòÒòØòåòäòêòÜòßòÉòÈò¯òòwò[ò:òòüñÚñ­ñŽñfñ;ññêðÜð³ð¢ð†ðqðiðQðNð=ð6ð;ðDðEð[ðaðwð†ð£ð¨ðÏðâðþðñ4ñQñhñ|ñ™ñ¨ñ±ñ¸ñÏñÚñëñòñþñòñøñãñØñÈñ°ñžñ‰ñkñ]ñ?ñ&ñ ñÞðÄðžð„ðgðNð@ð.ð,ð%ð(ð-ð7ðTðjðð­ðÛðñ<ñ^ñ ñØñòQòšòØò!ódó›óÑó÷óôPôqôŽôšô°ô­ô±ôºô¡ôŽônôUô,ô ôÛó¤ózó3óó¿òòKòòåñ®ñvñIññðð­ð“ðxðWðMð:ð)ð(ððð0ð%ð=ðGðPðmðqð”ð¡ð¾ðÍðÞðìðûðõðññðñòðùðùðÒðÝð¿ð·ð•ðð^ð_ð*ððæïÏï›ï}ï`ï=ï-ïþîèîÂî¦î˜îpîjîGî<îî îî.î?îPîbînîœî½îðî.ï_ï|ï•ïÄïÛïð=ðfð–ð–ðÌðæð&ñ3ññ–ñÀñâñò)ò>òhòpòòòœò¨ò£ò¦ò¢òªò£ò¡ò™òròdòUòPòNòJòFò>ò8ò6ò&òò òò òòò òòûñòúñöñåñäñÏñÌñ¶ñ§ñwñdñcñTñYñIñFñ9ñ9ñYñVñ{ñ\ñ{ññ›ñÉñÒñÿñò5òhòQòyòzò¥ò¾òçò óóAóYó~óó±ó²óÖóÌóçóÖóéóÍóâóÃóÊó¬ó•ókóXóóóÑò®òkòGò òòñÅñ¡ñ€ñañ=ñ)ññññññ ññññññ#ñ(ñ5ñ@ñHñOñkñtñ£ñ›ñœñ£ñ«ñÅñÌñäñðñòò'ò<ò&ò9ò=òAòMòYòcòlònòsòjò‚òtò…òƒòlòNò+òïñÊñ¦ñwñ=ññàðÍð»ð«ð–ðð_ðAð.ð(ðððûïðððð*ðGðMðrð…ð¶ðÞðñTññ®ñòñòOòò¾òÛòó%óWóUójóƒó˜óó²ó¦ó¥óšóŒó|ópóMóHó(óóÿòÜòÐòœòŠò_òGò$òòéñÔñºññ“ñpñeñQñ@ñ8ññññùðãðçðÆðÓðÍðÕðÓðãðÚðîðìðþðùðññ+ñDñYñ„ññÆñØñùñò.òKògò{ò–ò¬ò¾òÓòäòòòó$ó4óMóOó`óvóvó“óŽóóšó§ó ó­óŸó¦óšó—ó}ó{ó]ójójógóióhójónóuógóuókóló}ótó}ó~ó‡óƒó‚óŒó{ó|ókóió[óJó4ó"óýòåò¾ò–ò{òEò;òóñßñ´ñŒñjñGñ3ñññððöð×ðëðÔðÜðÐðãðÝðððïðñÿðñ ñññ'ñ=ñRñeñ‡ñ›ñ¼ñÉñçñþñò!òEòEò_òmòvòoò{òiòlò[ò\òOò5ò0òòòúñÖñ×ñ·ñ¿ññ±ñ’ñ™ñ‚ñ|ñ_ñZñTñLñWñYñdñWñ_ñwñiñ‹ñ‹ñ ñ ñ´ñÂñÑñâñðñòñò òò ò2ò'ò7ò ò&òòòûñÞñÅñ–ñpñHññÇðð=ððÅï“ïXïïïî²îŠîcî8îîñíÜí¾í¬í—íƒí€íwíoí}ízííŸí­íÄíÌíêíÿí îî î&î5î:îGîBîEî5î3îîîîîîîî îîîî*îGîmîî¤îÑîãîïEïxïŸïÓïûï+ð\ðƒð­ðÊðéðñ-ñ7ñBñGñGñVñQñYñIññ ñÍð¹ðŠðXð+ðîï¶ïƒï8ïï¦îqîîöí¦íí5ííØìÈì–ì†ìdì\ìTìOì`ìUìpìjìtì~ì–ì°ìØìùìí7í]í}íí³íßíòíî,îbîdîˆî’î®îÄîÐîîîêîïòîïïïþîïîíîÙîÔîÂîÄî·îÁîÂî¸îªî˜î¡î¨î·îÉîØîôîïCïpï¦ïÖïðTð“ðßðñañ”ñàñ òSò~òÂòâò ó@ó`óó˜óºóÆóÌóÔóÙóØó½ó·ó£ó‚ómó9ó)óâòÐòòhò6òòÖñŸñ~ñJñ/ññáðÉðºðŸðšðšð€ðœð£ð´ðÏðÒðñüð'ñ@ñYñ„ñ˜ñºñÓñóñò.òGòcòoòò“ò°ò°òÇòÍòÝòåò÷òóòùòñòöòíòæòÒòÜòÀòÂò¬ò òlòvòTòXò8ò3òòþñÐñ®ññcñ>ñ8ññññÿðòðóðçðîðåðéðíðôðîðéðþðéðëðëðàðçðáðåðÝðÝðØðÉðÊð½ðÉð¾ðÅðÄðØðÍðàðÞðñðððñ/ñ-ñSñWñvññ©ñÑñéñ ò/òaò|ò»òïò%ó\óóÓóÿóOô~ôÒôõNõ›õÌõ ö)öiö}ö³öÒööö÷÷'÷:÷2÷2÷,÷÷÷÷÷ñöÌö»ö—öƒönöSö2ööòõÙõ´õ£õzõoõSõGõLõ=õ:õõ/õõ õÛôâôÈôÓô¾ôÎôÏôÙôäôûôõ õ(õ3õXõbõ…õ•õ¨õÐõÕõêõæõøõüõöö/ö+ö@ö=öFöKöFöWöUöTögöhö{ö†öˆöœö“ö¢öªö¯öÁöÂöÃöÑö¿öÈö·öÂö¹ö¾öÂö¿öÈöÆöÐöÈöÍö¾öÌö°öÁö¤ö¡öŠöö[öGö,ööèõ¶õ£õbõ@õõÎô­ôeô6ô ôÙó§ó{óMó,óóçòÎò°ò ò‚òlòVòEòò òùñèñêñìñÕñÛñÕñÍñÐñÌñ»ñ£ñŸñ‹ñ”ñ‚ñˆñrñjñVñPñ7ñ6ñ$ññ(ñýðññððöðÖðäðâðÞðèðöðêðññññññ!ñ ñ(ññ$ññ ññíðèðÔðÇð¡ðšð{ðcð_ð*ðððïÝïÇïŸï”ïgïcïFï?ï"ïï ïïöîèîóîâîçîèîÒîëîÄîïîàîùîôîï$ï$ïKï[ïvïï«ïÅïåï÷ï)ð4ðXð\ðvð„ð ð¬ðÆð¼ðÉðÄðÏðÖðÖðäðÈð×ðÔðîðñ/ñYñZñtñŒñ°ñÉñÿñ ò?òJòsòˆò–ò«òÝòñò ó3ólówó¢ó¿óØóüóô.ô6ôGôCô\ôSôeô>ôRô-ô@ô ôôçóãóÈó˜ó‡ó=óóßòÁò“ò^ò9òòäñ´ñ™ñnñdñCñ6ñ#ñ ññòðéðØðàðÙðÝðòðïðññ,ñ3ñRñmññÆñÐñò&òKòròò´òÊòáòùòó.ó>óDóIóFóIó:ó3óó"óóóöòñò×òÉò­òò‰òxògòPòDò9ò5ò/òòòÿñò.òBòeòdò~ò˜òªòÛòóòó$óBókótó£ó¯ó×óÏóöó÷óôÿóôôôúóõóÓóÉó²óžó‡órópóeóhómópókóhócóqójóró€óqó{ó‚ó’óªó¸óÉóÏóæóéóôôôô ôôô'ô&ô'ô1ô!ôô÷óÝó»ó°óŽóó[óCóóóÍò¥ò|òDòòåñµñzñZñ#ñôðÎðð~ðiðLðDð'ð(ðððùï×ïÛïáïÉïäïÞïäïèïõïþï ðð/ð2ðJð]ðrðŒð°ð¸ð´ð¾ðÊðºðÃð¨ðð€ðJð#ðØï‡ïLïïÀîaî%î×í›íOííÛììoìAìüëÕë¥ëjëRë*ëëûêÑêÎê®ê›ê”ê“êtêyêSê;ê0ê0ê&ê,êêêêêñéêáéÝéÎéÆé¥ééxé]é>éééÒè»èèiè/èèøçÙçÆç§ç­ç“çŒç†çŒçç§çÇçÚçßçè1è_è‘èµèèèéIé^é‹éºéÑéê1êWê‡ê•ê²êÏêÕêòêòêëëëëÿêâêÑê¶ê“êgêFêêÏé˜éGéé¶èdèè¿çç:çç¿æ—æXæBæ æõåæåÙåÚåäåæ æ4æJæqææÄæúæçfç§çâç)èjè­èØè éLé†é²é×éêê&êê$êêðéàé³é“é[é*éâèè7èÓç~çç¼æ?æíåŒå0åáäŽäOäääã®ã‘ãpãcã]ãaãlã‡ãœãÆãþã'äpä•äÚäåPååÉå æCæ}æ¹æíæ-çfç–çÃçéçè9èTècètègèqècèTèAèèúçÚç¯ç‰çJççÛæ¤ænæ;ææïåÅå¨å”å}åqåqå\åaå`å„å†åµåÎåææNætæ¤æÂæúæ&çFç‰ç›çäçûç1èSèzè›è±è×èäèéé ééìèáè´è®è€èYè!èîç»çvç8çôæ­ækæ1æ÷åÉå‰åoå=å%åõäêäÏäÎä¼ä¿äÎäÈäíäïä å(åKåpå•åÈåýå%æeææÏæøæLççÌçèLèƒèÀèéèé:é_évé•é™é±é¹é¿é­é«é‘é…éré]éVé/é4éé ééóèæèòèìèôèéé1é?éjé~é¶éÞéêTê‡êÔêÿê`ë—ëÜë0ì`ì°ìÞì3íLíŠí¹íßíþíî4îHî\îcîjîRîQî)îîñí½ížíií%íí®ì’ìMì+ìíëÊëžë›ëpënëiëjëhë‚ë”ë†ë»ëÌëì%ì^ì|ì½ìÚì5í=íŒí¤íàíî4îUîŠî™îÃîÌî÷îßîïúîïùîï×îÏî¨î‰î]î,î îÌíí`ííàììUììØëëvë1ëëðêäêÅê¾êÃê½êÏêÚêõêëëSë_ë„ëŸëËëãëì-ìZìnì—ì¥ìÈìÊìßìëìöìþìí ííí ííóì÷ììì×ìÜìÇì½ì¤ì°ìŒì“ìììoìaìhìJì@ìAì#ì6ì4ìHì[ìì–ìÀìÔìðìííGíOí‚í“í¿íÝíîî!îaîVî„î¨îµîÏîÏîãîàîîîïîðîøîìîïÿî ïïï$ïïï#ï2ï4ïQïaïuï¢ï³ïÐïÞïûïð(ð>ðPðbðnð“ð‘ð©ð©ð´ð¯ðÁð¾ðÅðÃð¼ð»ð°ð—ð“ð€ðqðZðYð;ð:ð)ð.ð2ð)ðHðIðRðpðð¨ðÃðððñ0ñXñŒñÂñàñ%ò7òwòòÉòøò!óVóó²ó×óô3ôZôxô’ô±ô»ôîôôô%õõHõ=õIõKõEõHõAõ7õ2õ*õõõîôÎô§ô‚ôfôAô2ôôùóõóâóÅó¿óŸóó…ó{óómótówó„óóšó¥óÃóÐóïó ôôBôPômô…ô¡ô¼ô×ôïôõ#õ6õ6õNõ@õWõDõSõKõ?õ>õõ õõûôÜôÀô¯ô¡ô„ôˆô\ôgôFô?ô(ô.ô ô$ô0ô/ô@ôLôUô[ônônôôvô‰ô„ôôªôÆôÓôïôõõ+õUõPõnõwõ…õ˜õ£õ§õ¯õŸõ¢õ‡õ{õaõLõõêô°ôôeô%ôôÆó•ó_ó'óóòªò~òFò òÛñ«ñ|ñBññððÊð ððdðYðEð4ð2ððððððð%ð8ð>ðeðvð…ð©ð¶ðØðßðñ ñ/ñGñHñfñañyñlñtñhñlñañSñOñ:ñ+ññþðÞðÈð±ð¤ð“ð€ð€ðaðZðPð`ð]ðoðoð’ð‡ð³ðÁðÑðíðñ"ñIñeñ”ñ¹ñØñóñò(òIòfòˆò•òµò¿òÝòèòóòýòüòóóóõòþòÚòÕò¹ò›ò†ògòUò1ò"òðñåñ½ñ©ñ†ñmñUñ@ñ+ñ#ñ ññýðíðóðáðûðéð ñ ñ(ñ-ñKñ[ñvñ€ñ¡ñ ñÂñÓñÝñöñòñòòò#ò7ò0ò@ò?òLòMòKòGò=ò2òò òØñÇññ‰ñ]ñMññìðÊð¯ð–ðnðXðððÑï·ï‘ïqïJïïïñîúîáîÝîÕîÕîØî×îÜîÙîÜîÜîåîåîèîìîäîíîßîÜîÒîÊîÉîÅî¼î±î½î¨î¯îŸî›î«îšî§î›î îˆî–î€îƒîtîoîiîiîmîvîgînî{î©î¸îàîìîï&ïIïbïiïvïzïœïÆïÜïðð+ð.ðTðGðWðQðUðNð@ð"ððéïÐïÄïµïŸïŽï|ïfïRï;ïïïïîÎî»î|îbî0î*îîîííîíãíàíïíõíîî&îHî^îqîî“î¾îÕîï:ïuï˜ïÓïèïðLðcð¢ð¹ðéðññ5ñCñ]ñoñ¡ñ±ñ×ñÔñáñãñäñûñûñòóñÿñòñõñëñäñÙñÎñËñ±ñ²ñ€ñ{ñXñUñ1ñ8ñ(ññññýðñ ñ ñññ!ññ(ñññññÿðñóðüðððßðéð×ðìðÙðçðÞðâðÛðÏðÀð»ð—ð™ðwðyðgð`ðUðKðDð5ð'ððð ðóïõïåïãïàïÎïÛïÐï×ïÜïäïÞïäïãïçïíïôïðððððððððð,ð ððð*ð<ð`ðrðŒðšð¯ðžð²ð©ðÉðÍðíðêðûðïðÿðñ/ñ)ñEñGñMñVñTñ[ñ\ñZñZñoñvñ‚ñ‚ñ…ñ~ñzñtñ{ñYñnñPñcñEñTñ?ñ>ñ:ñ5ñ4ñ8ñ'ñ2ñ%ñ!ññññññññññ ññññüðñ÷ðõðññðññññ4ñEñZñeñ’ñ›ñÆñÔñùñò+ò`ò_òò“ò®òÄòÛòåòüòóóó*ó#ó/ó:ó>ó;ó<ó7ó2ó#óóóõòóÝòÙòÃò¨ò™òvòfòHò;ò#ò òòòåñÖñÆñ²ñ”ñ}ñYñ;ñ%ññæðÒð­ð“ðpðQð8ð ðüïçïÓï¸ï§ï|ïcïAï:ï*ïï%ïï-ï,ïCïRïZïwïŠï®ïÀïòïð8ðfðŒðºðêð,ñVñ¥ñÍñòLò}òÀòäò&óVó…ó¹óÞóô(ôGôaôdô…ôôˆôŠôyôiôXô9ôôëóÉó•óoóGóóéò¿ò’òcò>òòôñÐñÁñ¡ñšñŒñ†ñ„ñ€ñƒñ’ñ®ñÂñÞñøñ$òJò~ò¼òÛò!óLóŒóÁóôDôtô­ôâôüô(õ<õ{õ˜õµõÉõËõØõÑõÑõÀõ¨õŸõ~õsõUõ>õ1õõ÷ôìôËôÀô£ô“ô‹ôzô|ôqô|ô~ôŒôˆô§ô¯ôÍôíôõ1õAõwõ†õµõÞõþõ/öRö„öÃöÛö÷÷#÷%÷ ÷&÷÷ ÷÷àöÑö•özö4öö×õ©õnõ6õõôÄô‡ôQôôõóÇóªózómó7ó6óóúòåòçòÜòãòÝòîòöòó(ó)óMódóó«óáóûó*ôPôpô£ôÇôøô*õLõ{õ–õ¹õÕõæõøõûõýõîõæõÛõÍõ»õ¥õtõTõõóôÆô—ôgô1ôôÙó²ó‘ómóOó:ó%óóóóó!ó5óóCóDókóóÀó ôôfôkôµôÇôûôõ;õWõfõrõ‚õ}õõyõõ`õXõ,õÿôÚô˜ôpô ôëó©óqó-óìò§òlò'òöñ²ñ†ñMñ)ññìðáðÝðÜðåðíðóðñ"ñIñ„ññàñýñTò‹ò×òóAó•óÉóô>ôeô£ôÎôõõ=õCõ`õpõ†õƒõoõ_õ?õõüôÜô¨ôŒôOô4ôýóÕó©ó…óXó$óóæòÙò½ò¨ò¥ò‡òˆònò{òiòzòsò‹òŠò òªò¼òÀòÕòáòóó2óKócóŠó¥óÈóÊóæóýó ôô:ô3ô:ô4ô+ôôô ôÿóùóäó×óÔó¼óÄó¶ó³ó©óªó¬ó«ó°óµóµó¹óËóÇóØóÖóçóîóþóô"ô'ô2ô9ôPô`ôpôôô›ô¥ô³ô¸ô½ôÏôÕôÑôâôÂôÇô¾ô®ô›ô„ôMôBô.ôôûóÑó§ó•ó_óQóó óãòÓòµòŸò•òmòyòNòMò3ò.òòòòò ò òò ò òò%òò"ò0ò#ò1ò+ò-ò*ò3ò*ò;ò)ò0ò ò+òòò òòøñòôñòòòòòòò#ò(ò4ò@òKòNòdòqò€òœò¥ò¸òËòÚòðòýòó!ó/ó=óUó[óeómókónósóió_ó@ó'ó óóòÓò¹ò–ò^ò:òôñÅñ„ñKñ"ñâð´ðƒðQð1ðíïÔïŽï{ïUï5ï!ï ïúîîîòîÙîèîÚî÷îïîïï0ïïCï8ïPïWïXïhïzïxï‚ï{ïyïuïmï~ïcïZïFï)ïïïíîºî›îfîHî0îîíÉí¤ííqíjí?ííÿì÷ìúìòìúìóìöìïì íòìíí3íEíhí`íŒí–í·íàíôí î1îMîvîî½îãîï.ï8ïbïxïšï·ïÐïîïøïðð-ðð.ðððÿïêïÙïÖï¬ï¾ï‚ï—ïnïkïbïNïSï@ïGïGïQïYïaïqïxïŠïžï¾ïÐïôïð6ð>ð}ð‘ðËðëðñ<ñhñ~ñ­ñÉñíñò$òHòPòiòpòkòpòoòfò^ò<ò8ò òüñÓñ½ñ‰ñfñ@ññçðÈðšðzðPð3ðððïÐïÄïªï¡ïï†ï‚ï{ï€ïyï‘ïšïÃïËïòïð7ðUð|ðŸðÆðððñGñfñŽñ³ñÉñáñýñò6òAòhòmò‡òƒòòˆòòkò]òGò$òòìñÔñ²ñ†ñ]ñ!ñ ñÌð¹ðzðbð2ððøïÚïºï¸ï§ï¡ï›ï‘ïŸïï¢ï¦ïÁïÔïòïð7ðkð“ðØðñEñzñ§ñæñòWò—ò»òûò'ó_ó’ó³óöóôBôXôsô{ô…ôô}ôtômôSôOôôôÝóÊó”óŠóPó@óóîòéò³ò¬ò†òƒòdòdòLò[òHò]ògòmò…ò“ò©ò»òâòòò ó-ó?ómóƒóªóÇóäóôô8ô9ôTôWôuôtô}ô‚ôhôUôYôSôBô@ô/ô ôôÌóµó’ósóZó3óóôòÔò¼òœòŽòpò_ò5ò)òòòñéñÈñÂñ®ñ ñ—ñšñ¬ñÁñÏñëñòò&ò9òKòcòzò™ò±òÎòÛòýò óó(ó7ó<óDóPóRóVó_óbóXóQóJó=ó1ó)óóó óáòÙò²ò©ò•ò…òvòtòdògòQò_òDòOò=òRò?òTòSòhòQòoògòoòvò…òƒò‰òƒò†òŠò‰òò‘òƒò™ò”ò”ò–ò„ò‚òò_òZò@ò1ò)òò ò òäñõñÌñÍñ³ññjñañFñKñ:ñ;ñ)ñ/ñ"ñ"ññ ññþðñññññ(ñ"ñ(ñ&ññññ"ñ0ñ*ñ;ñRñZñwñoñ•ñ‹ñ³ñ®ñËñËñäñèñññòò ò.ò7ò5ò1ò=òMòDòTò<òRòGòIòTò@òHò=òGòFò@òCò5ò2ò/ò%òò òòññêñÖñÊñ½ñµñ¤ñ˜ñ‹ñ†ñzñ…ñ{ñ†ñ“ñžñ£ñ²ñÈñÚñò'òLòtò™òÄòâòýò$óTózó±óâóô3ô`ô“ôÂôëôõ4õXõhõõ„õ‰õõ‰õ~õƒõwõuõ`õSõGõ(õõýôÚôÂô±ô™ôƒônôOô6ôôôæó½ó›ó†óZóPó"ó óôòÑòËò«òžò“ò…òˆòò}òòò|ò‘òò§ò©ò²òÉòÑòèòöòó óó'ó$ó/ó+ó7ó,ó/ó(ó(ó$óó,ó$ó-ó ó#ó"óóóóóóòòðòäòÓòÁò±ò”òòhòPòFò.òò òòñòñ×ñÎñ¹ñ¡ññtñMñLñ,ñññòðØð×ðÆð¼ð¯ðŸð–ð†ð‰ðrðdðdðWðnðzðŸðµðÉðÔðßðìð÷ðñ4ñUñaññ„ñ¯ñ½ñÙñññùñò!ò9ò=òZòXòpòiòiògògòbòYòXòIòNò/ò4ò òòúñòïñûñøñóñøñùñõñòýñòò.ò@òLò]òtò{ò‘ò¤ò ò¼ò·òÐòÞòèòñòïòñòýòóóó/ó'ó.ó#ó&óóóóóóóïòìòÚòÛòÐòÈò¾ò§ò¢ò‚ò‚òfòyòSòcòQòOòZò=ò[òMòhòròò¡òžòËòÓòìòþòó,óNófóóŽó£ó¸óÖóÝóôÿóôô#ôôô#ôôôûóöóòóÖóÙó¾ó®óŸó‹óŠó`ó\ó:ó:óóóóòåòßòÐòÜòÍòçòâòùòúòóóó ó2ó@óHó\ójó~óŠó¡ó¢ó·ó¿óËóâóÔóúóèó ôñó ôô"ôAô?ôYô^ô_ôqôaô|ôxô‹ôŒô•ô­ô°ôÇôÊôÍôÀôËô¸ôÕô½ôÓôÁôºô±ô ôŠôônôôTôZô7ô4ôôô÷óäóÑó»ó¶óžóˆókóIó+óóóåòÕòÍòÂò½ò»ò·òÁò²ò¿ò²ò¾ò³òÊòÓòåòúò óó3óDóhó|óŸóÈóíóô=ôQô}ôšôºôêôúôõ>õNõsõ—õ¨õËõáõöö0öMö[ököyö…ö‘ö›öö©öªö¦ö£öœö‘ö“öˆö€ö…örö‹ö†ö–öö¥ö²ö´öÅöÄöËöËöâö×öëöíöìöóöëöòöìöîöîöåöíöÎö×ö¯öªö‰ö„ögöJö=öööäõâõ³õ¶õ”õ—õŽõ‹õõŠõ“õ—õ˜õ¥õ¦õ¾õ¼õÝõÞõöõöö(ö<öKö_örö…ö™ö­ö»ö¾öÃöÁöÃö·ö¹ö¬öžö—ö|öröOö8ööõõåõ¤õŽõ]õ@õõëô¨ô€ô^ôKô8ô#ôôüóüóäóàóÖóÖóÛóàóðóûóôô+ôEôZô}ôôµôÎôôôõ7õWõsõ‡õ¨õ½õÖõîõþõö!ö4ö>öPöHöeödösöqöö|ö€ö†ö~ösöqözönöröSöVö5öBö%ö,öö öööö öÿõþõöîõûõæõïõæõîõîõìõöõëõóõßõôõáõåõÞõÝõÍõÚõ´õ½õŽõ›õpõ€õ]õSõ>õ2õõõéôèôÆôÃô¨ôŸô“ôtô`ôWô;ô"ôôêóÏó¬óœósófóBó9ó&óóóóÿòóó8ó9óBó@óMóPósó}ó•ó ó·óÉóàóþóô7ôNôsôŽô¦ô×ôäôõ!õUõsõ”õÔõèõ+ö8ösö‡ö°öÇöäö ÷÷B÷D÷^÷T÷_÷Z÷I÷R÷:÷>÷÷÷ðöåö¹ö˜ölö=ö$öðõÓõªõõaõ3õõëôÍô«ô¢ôƒôôeôuôhôzô}ôô¢ôµôàôóô!õ@õyõõ¾õßõõõ7öBö~ö•ö»ößöùö÷(÷4÷N÷Z÷k÷m÷~÷k÷~÷k÷c÷O÷M÷.÷,÷÷øöèöÍö¶ö öuö_öDöööïõßõâõÎõÏõÅõÌõÕõçõïõööAöWö‡ö£öÌöòö!÷G÷m÷©÷Ê÷ñ÷-øGøpøœø®øáøßø ù ù)ù(ù;ù'ù%ùù ùúøéøÕøÇø°ø–ø€ø`øQø4ø8øø øøø øþ÷øø!ø ø<ø;øiølø£ø˜øÇøåøù7ùrù‘ùÄùñùú>úWúmúŒú¥úÞúøú2û4ûQûcûYûqûYûmû;ûGûûûÑúÒúžúŽúvúVúIúúúÜù¿ù¤ù‰ùqùMù@ù-ù ùùíøëøÆøºø±ø—ø‰øoøhøQø^øXøYøUøBø@ø>øDøDøHøGøRø]øløcøWøxøyøšø–ø¤ø©ø©ø¯ø°ø˜øø¤ø¨øÃøÅøÃøÈø½ø¹ø±ø¢ø›øŠøœøŠø øŒø¢ø†øœøjø}ø\øVøJøWøbø‡øŸøÖøöøù@ùKù~ùqù~ù–ù¹ùéùíù)ú<úuú|úºúÇúèúåúÚúÐúÙúµúŸú~ú‡útújúXú9ú2úúñùÇù©ù‡ùdùOù<ù.ù ùöøòøÐøØø¦øžøƒøeøYøDøøÿ÷÷÷øøøø.øEøxøŠøÒøâø ùùBùVùXù\ù5ù"ùùùùùöøêøßøäøÃø¸øƒø_ø=øøì÷Ù÷—÷i÷;÷÷íöÅöœöötöYöDö,ö öëõÙõ®õ¤õˆõ|õsõhõlõdõ\õBõBõ6õAõKõXõxõˆõ°õÖõö$öMönö©öÉöøö ÷5÷P÷n÷†÷’÷½÷Å÷Ü÷ò÷î÷øõ÷î÷ã÷Õ÷­÷Ÿ÷|÷÷o÷\÷S÷=÷.÷÷÷åöãö¶öÂö›ö¡ööŒözömöoöVöEö0ö$ö$ööööööö)ö/ö2öCö9öAö0ö6ö0ö:öAöEöSöOöjöföö†ö‰ö‘ö®ö°öØöÖö ÷ ÷B÷D÷g÷x÷—÷¶÷Ú÷î÷øø ø+ø.ø<øGøCøTøXø_øtøtø‹øzø˜øŽø¨ø«ø°øÀøÃøÔøÍøÖøÏøÜøÎøñøØøùãøùñøòøåø÷øìøôøôøôøùøóøüøèøçøÕøåøÑøÙøºøÈø—ø¨ø{ørøGø2øøú÷Ý÷¼÷¢÷ƒ÷b÷U÷"÷!÷÷ööçöÖöÃö¿öªö¥öžö˜öö’öƒöŒö‰ö‹öŒö€ö„ölö|öeötöbödö[ö^öVö`öHöeöGö[öSöKöTöDöBö5ö$ö*ööööôõíõáõàõÞõÓõâõÉõáõÏõÜõÒõÚõËõÜõÆõÎõÏõÕõÖõåõÜõùõèõöøõö ö"öö8ö+öMöGögöWöpöjösöuö{öƒö…ö‚ö~öögöhöOöLö)ö öðõäõ½õ—õyõPõ%õõÝôÑô®ô™ô{ô_ôJô3ô/ô(ô-ôô0ôô:ôKôDôdôsôô±ôÐôêô&õ>õ‚õõËõõõ"öNöyö­ö¼öõöüö)÷-÷J÷\÷q÷†÷•÷¥÷±÷¸÷Ç÷È÷Ï÷Ï÷Ü÷Þ÷ã÷é÷õ÷ó÷ øøø-øFøQø|øø³øÍøìøþøùù<ùEùWù`ù[ùfùIùVù/ù4ùù ùùîøêøÌøÈø¤øŸøuø}øcøcøJø4øøøî÷÷÷Ý÷Ü÷¿÷À÷¤÷¬÷÷˜÷÷}÷t÷_÷w÷[÷}÷g÷†÷v÷÷÷Ÿ÷¤÷¼÷¼÷Õ÷Ö÷å÷ä÷ñ÷é÷ò÷á÷á÷â÷Ä÷Ï÷­÷­÷’÷{÷Y÷?÷÷÷áöÓöªöšöuöQö8ööúõÐõ´õ’õwõYõDõ"õõçôÑôµô¡ôŒôuôoôYô^ôUôWôVôXôdôkôzôˆô“ô¡ô®ô¸ôÌô¾ôÚôâôõõ6õIõjõoõõ–õÌõËõîõ ööAö>ö_ö^öcöqölö}ömöuö_öJö;ö.ööö ööööþõöèõòõÃõÃõõ‘õ{õ\õKõ,õõùôáô¸ôžô€ôbôCô ôôáóÏóªó’ótóaóDó.ó'óóûòðòÍòÊò¥ò¦ò›ò’ò“ò‚òòlò{ò^òfòLòDò5ò0ò;ò0òAò;ò=ò7ò=òAòDòRòJò@òBò8ò,òò ò òòÿñùñöñòñîñññÝñáñÑñÜñÑñÍñÊñ¼ñ¹ñ¨ñ’ñxñ\ñAñ0ññ ñÕðØð³ð¦ð‰ðuðhðTðLðEð;ð/ððð ððððûïþïðððððð ððð#ð*ð9ð4ð8ð2ð>ðBðMðDðað?ð]ðJðSðPðJðOðJð[ðTðað^ðYðLðJð:ð;ð1ð4ð-ð6ð7ðCðFðGðGðLðað`ðeðyðð¦ðÆðàðüðñ,ñPñnñŠñ­ñÁñÜñõñòò2òEòbòsò‚ò•ò¡ò¶òÌòÇòêòØòóòòóóóó&óó óóóóóóõòûòôòñòóòóòøòûòó óó+ó8óLóLócóUókóqóó‘ó’ó­ó®óÆóÍóÝóîóîóüóô ôùóûóìóýóõóûóúóóóòóáóÙóÅó³óšóŠó{ókóYóIó3ó*óóìòÍòò‹òuòaò^òKòRòAò>ò8ò&ò+òòò ò òòòòøñúñëñôñòñòñûñóñòøñôñíñÛñßñÖñÍñ±ñ¦ñ™ñ™ñ›ñzñjñPñ?ñ8ñññýðÝðÑð¦ðªð¢ð¤ð­ð²ðµðÃðÍðçðòðñ ññññ"ñ#ñ1ñ1ñJñ?ñUñMñWñVñGñ@ñ-ññ0ñ$ñ5ñ@ñeñ{ñ£ñ¬ñÐñÇñìñíñ òò0ò4òTòSò…ò…ò™ò­ò®òÀòÈòØòìòõòóó%ó3óJóRóYóióWótóqóƒó–óƒóó™ó™ó“ó~ó~óeó^óNó?ó3óõòíò¹ò~òWò6ò1òòòßñÒñ±ñËñãñÿñò.òò2òVòtò•ò¦òÙòÔòóóLó‚ó«óÝóòóô9ôfô€ôœôÀôäôôôóôúôõ õõõõ÷ôÚôÑôºô´ô›ô„ôsôOôfô_ôyôô£ô¦ô¸ô¯ôÍô×ôßôçôüôõõ*õ6õdõ†õÂõçõö!ö]öpö”ö¹öãö$÷V÷n÷À÷Þ÷&øGø‡ø–øÂøÌøÝøàøçøåøíøÛøÉø¶ø’øŒøiøFøû÷õ÷«÷‘÷`÷:÷äöºö‰öPö+öïõ°õ‘õjõdõWõFõBõBõEõ:õ7õ(õ6õ'õ4õ1õ.õDõTõqõzõ|õõ”õ¨õ®õ³õ¶õÀõÅõ×õÓõÞõÅõ¹õ¦õ™õxõSõ!õõõàôÉô¯ô}ôoôYôFô,ôôýóòóÝóÔó±ó ó—óŠó‘óó–óšó®ó°ó½óÁóÄóÇóÇóÎóÌóÐóÔóäóñóöóøóýó ôùóôôôôüóúóùóõóñóñóàóâóÑóÆó¬ó£ó€óbóBó(ó#óüòÿòáòßòÄò¤òŸò‰ò‡òzòyòpòoòZòRò>òGòCòMòJò]ò]òcòxòoò‚òmòˆò†ò™ò ò¢ò¶ò«ò¸òÃòÔòêòûòýòóó&óóó*óó*ó.ó8ó>óHóXóYóZóJó?ó4ó(ó%óóóó)ó0ó*ó>óAóVó]ónóoó|óyó¢óšó½ó¤ó¾ó¯óÆóÉóÎóÚóÏóÚóËó¼ó¶ó¶óžóóvóqó^ó[óVóSóFóOóBóKóKóCóLó4óKó"óóþòó óó#ó&ó:óQó^ó€óŽó¨ó»óÕó ô1ôoôôÓôúô0õXõwõ¦õ¾õçõóõöö öþõûõßõÎõ´õ‹õlõGõ5õõôâô§ô•ôtôPô9ôô ôôóáóÊó¿ó¶ó¿ó±óÉóÄóáó×óøóòóô ô<ôUôzôžô¸ôãôõ(õ@õjõ~õ™õ±õ¿õÐõÓõØõÄõ´õ¥õ õžõ‹õ‰õuõyõfõiõjõWõZõKõTõDõIõFõBõVõHõdõZõuõˆõ“õ£õ¸õÑõèõ ööOölö‘öÇöïö÷7÷@÷|÷÷À÷ã÷ô÷-ø3øiøiø–ø‹ø–øŽø‡øføWø;ø+øø øøü÷õ÷ð÷å÷è÷Ê÷Ö÷®÷»÷’÷•÷v÷o÷Z÷S÷6÷÷÷ïöâöÇö³öžö™öŽöŠö†öŽö…öˆöö‡ö•öŒöö•öˆö–ö’öŒö ö‰ö“ö…öoöjöRöCö5ö%ööëõÑõ³õ“õ€õYõHõõ õÅô»ô‡ôpôDô0ô ôöóÍó³ó’óqóRó#ó óóòÏòÉò§ò¬ò‰ò¦ò„ò–ò…òžòŒò¡ò±ò­òÄòËòÙòßòåòóóó#ó9ó?óNó[óZó_ó_óbóróbóqóló\óSóJó<ó7ó ó!óóúòóäòåòÒòÊòªòªò‘ò™òòzòqòcò`òdòbòxòeò’ò‚ò¤ò©òÌòÝòùòóFóWóóºóþó#ôjôrô¢ô»ôÿô!õAõRõlõƒõ¥õ¼õßõÞõöö öàõÞõ¸õ¦õ€õxõRõ;õ4õAõ7õ)õ'õõõñôÈô•ôôYôIô*ôÿóøóöóíóåóäóÞóÛóñóõóúóôô8ô0ôUôfô~ô”ôµôÑôßô õ õ&õ7õ'õBõ3õDõCõ7õ;õ*õ&õõôôîôÂôºô”ô€ôhô>ô)ôøóÌó”ótó6óóáòÂò’òoòOò0ò òçñ¸ñ§ñ‘ñ…ñvñ}ñ…ñ‰ñ ñ±ñÒñèñòòOòdòuò’ò“ò¶òÄòàòíò ó ó-ó(óJó@óbóRóeó_ógó\óGó0óEó/óJó9óDóWóWóŠóó³ó´óÈóÖóåóô'ôZôvôšô»ôÖôùôõ)õKõbõ„õ›õ³õÍõåõõõöö ööööéõÓõ¹õ©õšõ„õpõdõAõ9õ õõÞô­ô¨ôkôjôTô6ô-ô ôôôñóÝóºó±óóóóyó–ótóó‹ó‹óžó›ó±óÆóÓóôó ô*ô@ôfôwô¢ôÄôçôõ1õIõjõ‚õõºõºõÈõÑõËõÚõÔõäõÖõÜõËõÏõÄõ·õ®õ§õŽõ‰õvõdõOõ.õ)õõýôõæôëôÚôéôÌô¾ô²ô¡ôœô‹ôŽôyôxô^ô^ôKôCô:ô=ô:ô/ô8ô.ô#ô!ôôôúóêóÕóÄó¥ó‘óhóKó'óóìòÊò¶ò“ò}òbòMò7ò òòòïñòñíñîñòñ÷ñùñòùñ(òòLòQòvò…ò¦òÂòæòÿòó=óTóyóóªó¿óÏóíóíó ôô1ôôIô9ôfôZôeôZô[ôKôbô]ôkôfô^ôeôGôkô=ôWôFôGô:ô=ô+ô9ô%ô<ô&ô8ô8ô6ôAô<ôJôHô`ôVôdôfôeô†ôŒôžô³ôÄôÍôéôäôçôÝôÏôÉô³ô¯ôô‰ô^ôOô.ôôôÏóÂó—óvó\ó:óóýòÙòÀò ò‰ònò`òDò2ò(ò òòëñêñáñ×ñåñØñìñöñóñ ò òò4ò.òXòeòòœò¯òÈòÕòöòó$ó+óOóaózó•ó¤ó°óÍóþóôMô\ô‹ô•ôÂôÍôþôõ)õ,õOõXõsõõœõ¬õ¾õÁõáõßõ öýõ'ö öBö=ö[öPözö|ö˜ö¤ö¾öÀöÛöãöçöðöùö÷÷÷,÷$÷-÷"÷!÷ ÷ ÷ðöïöÖöÊöÆö«ö˜ö˜ö~öuöjögöaö`ö_öaöaöbö^ö^öcö[önö]ölö[öiöaöjödöfözösöŽö„öžö ö¢ö©ö™ö¯ö”ö¥ö•öŠöösöeöUö:ö.öööòõàõÍõ±õ™õˆõgõ\õ0õõóôÙôÇô¨ô§ô‡ôzô_ôIôRô@ô9ô-ô#ôûóúóÖóÃó§ó•ówóaóPó3ó-óóóûòáòÙòÊòÉòÅòÃòÊòÇòÛòÐòÑòÐòÕòÜòÚòßòåòßòãòØòÙòÔòÍòÑòÃòÇòºò¹ò°ò©ò˜òŽò‚ò|ò|òò}ò|ò}òwò|òsòò‡òžò§ò¼òâòìòó ó,ó5óVónó|ó‡ó›óó¸ó£óµóºó·óÅó«óµóŸóóóóoóbóQóKóBó?ó:ó*óóóøòçòÒò¸ò³ò‘ò›òqòzò`òRòCò8ò4ò(ò1òò$òòò òøñïñëñÞñØñ×ñÑñÛñÆñÙñÒñÄñÖñØñàñæñíñöñ÷ñÿñüñðñøñøñ òòò òòòúñòòýñ òò òò ò!òòòòòøñîñæñ×ñÞñÛñßñãñåñýñûñò#ò&ò<òSò]òsòZòzòcò€ò…ò•ò“òšò‹òªò‚ò›ò‡ò“ò…ò‹òŠòoòsòPò=òòòåñáñ»ñºñ¤ñ–ññ~ñ{ñlñsñeñcñcñeñ\ñVñRñ>ñ)ñ!ññ ñîðýðÖðÙð°ðŸðyðpð]ð>ð>ððñïÔïÆï©ïœï|ï^ïBï(ï ïìîéî°îºî‹îîgî]îTî<î8î3îîîî îîîîî îîîîîîîîîîî!îîîÑíÂí¿í§í²íŠí~í5í6íí"íí÷ìåìÇì¶ììmìUì3ììì¼ëÄëœëŽë{ëjëgëQëYë@ëiëAëSëkë?ëaë[ëqë…ëëŠëªëÁëÁëìì$ì2ìOìJìmìUìvìhìì‡ìœì¦ì¬ìŸì£ì…ìŒì}ìuìgì\ì:ì/ììöëëëØëËë¨ë ëëuëlëaëYë<ëPëAëSëBë>ëCëGëLëeëjëFëTëjëtë’ë§ë¹ëÐëÜëì)ìWìmì¤ì°ìëì í*í/í:íFíUípíwíží±íÀí×íõíûíîîîïíýíØíÛí¾íÄí®í§í—íƒí}íqíoíríoíhíYíMí;ícítíŒí•í±íÃíØíòíîî:îaî†îµîáî ï<ï{ï¦ïäïðRððºðìðñ6ñ]ñ›ñ­ñæñ÷ñ%ò<òbòò‰ò±ò­òÄòÊòÐòÛòìòùòýòó*óöò óÿòóóó!ó&ó9óHó`ówóƒó¢ó§óÎóÐóöóô8ôrô¢ô·ôáôõSõ’õÜõö0ö^ö|ö›öÑö÷$÷5÷A÷W÷V÷€÷€÷“÷÷h÷u÷M÷Q÷I÷2÷)÷÷ðöæöÀöªöŸöwöqöZöZö4ö6ööõõêõàõ×õÂõ»õ¤õªõŸõ¼õ’õÁõ©õÙõÚõþõö5ölönöªö“ö¿öÓöúö+÷>÷j÷s÷™÷•÷©÷«÷¶÷Ä÷Ö÷Ð÷Ò÷Ë÷¥÷÷÷o÷c÷T÷B÷3÷÷÷¾ö«ö}ö]öPö#öýõÜõ½õõ‡õxõRõ9õõõêôÛôÕô½ô¥ô‚ôrôOôLô1ô-ôôôôëóæóÀó¦ó“óŒóvósóbóUóKó3ó0ó#óó óóó óüò%óó0ó#óHó3óHóSó]óoóxó}óuóuóó¦ó»óÓóáóýóôô=ô.ô&ôô1ô,ô0ôBôAôFôYô`ôlômôtôpôsôiôoôfôjômôYô[ôRôfôZôdôXôbôOô\ôKôFô+ô3ô/ô,ô2ô-ôFô*ôSô;ôMôKôKô\ôTôgôcôjômôiô[ô\ô5ô1ôôôÝóÚó¯ó‹ótóXó=óó óÒò§ò˜òZò>ò'ò òæñÝñ¼ñ´ñ¬ñ¯ñ³ñ¥ñ~ñcñqñ€ñ–ñ³ñØñÕñò$òVògòŒò¬òÉòçòó óóó)ó:óNójókókóópóˆó„óŒó{óvó]óJó3ó óóßò´òœòZò3òòÚñ½ñžññbñ;ñ ññïðáð½ð¤ðiðhðVðNð(ðýïæïÙïËïáïäïÙïÇïßïìïìïìïúïþï ðð!ð!ðððððððð ðúïðøïöïóïúïáïáïÞï×ïÚïØïáïÑïñïÌïâïÙïðÿïð$ð8ðBð^ð]ðfðKð\ð_ðYð^ðuðið~ðtðŒð`ðnð^ð^ðFð=ððëïïuïEïïþîÒî½î}îiîPî=î"î îõíÜí²í¶íí†íríbíKííííæìàìØì½ì³ì¥ì¤ìƒìì]ì\ì9ì=ì"ì ìüëîëÎë¸ëÇëÉëãëéëûëìì9ìIìrìkìšì©ìÂìåìíEíƒí¨íÚíàí$î5îtî—î¹îãîëîïï+ïOïWï‹ï—ï¢ï¸ï¸ïÃï¾ïÆïÌïÏïáïÖïßïÑïÍï¹ïºï«ïšï{ïfïBï@ïïïõîòîÁî¹î¼îî¦îœîîîŒîŠî î’îžî©î¨î·îÈîÐîçîðîïýî#ïï<ïEïOïqïvïï®ïšï»ïÂïæïäïÿïððð-ð<ðBð:ð:ð:ð,ð.ð$ððëïÃï¶ï›ï›ïyï~ï\ïFïUï&ï7ïÿîïêîðîäîØîÖî¬î”î˜îîsîgîPîWîKî8î î î î&îCîcîaîiîgîvîî²îÁîÀî—îŒîpîuîwî}îƒînîoîfîFîAî-îîôíÞí½í¡ízíbí<ííØì¼ì—ì~ìjì=ì&ìÚë­ëŠë{ëzë{ëwëcëhëeëzëë˜ë¹ë¿ëìëñëì%ìGìnì—ìÄìÏìí+íxí£íñí#îSîîÆî ï@ï‡ï¦ïåïð5ðQð|ð|ð™ð¨ðÁð·ð×ðçðêðñöðÿðÙðßðàðÖðÚðÖð×ðÓðÙðÝðÕðÑðÔðÞðßðßðßðëðÝðöðâðùðîðúð ñññ/ñ.ñIñIñOñIñPñDñGñ?ñ?ñBñ8ñ+ññññøð ñðð÷ðèðãðäð×ðÔðÒð·ðÀðŸð§ð„ð”ðgðiðOðNðEðJðDð,ð*ðð.ð!ð:ðð:ðð%ðð/ð)ð>ð8ð6ð8ðBðXðmðƒððžð¬ð¯ðÉðäðñ!ñLñVñ‹ñ¡ñÓñêñò ò6ò8òQò^òŒò‡ò±òŸò´ò¥ò¨ò«ò òœòòsò[ò?ò'ò òðñ×ñÀñ°ñ˜ñuñjñ;ñ6ñ ñýðàðÓð³ð©ð‡ð|ðbðUðIð0ð$ð ðñïÓï¿ï˜ïœïnïzï:ï1ï ïþîðîñîèîáîÙî½î§îŒîoîoîlîjîbîXîPî.î7î/îGî<îBî)î+îîîî îÞíÛíÝíÊí×íÑíÓíÏíÌíÙíÓíÈíçíèíóíôíæíìíÈí³í’í‡íbí^ífígílíníyísí„í€íŽíí“íƒí“íƒí…í‰ísíríXícífíaídí`í^íiíbíhíNíYíHí]í`íqítíxí~í„íuíŒíxí†íŠí–í–í©í¡í í§í“í£í¥í£íÇíÊíïí×íîÍíõíîíîîî î îîî îîîþíéíçíÚíæíêíùíîî îî,î-î@îLîTîlîuî‰î“î¡î­î¼îÀîÈîÕî×îÙîÙîßîìîìîõîøîþîïïøîûîÞîïîçî÷îüîþîï ï&ï#ï(ï%ï2ï5ïCïNïPï`ïgïwïyï”ï—ïµï¾ïÏïÛïãï÷ïôï ðúïððAðCðmðnðˆð“ðšð³ð°ð½ðÅðÄðÑðËðÐðÍðÈð¿ð¸ð¬ð ðŽðzðjðOð8ððùïÜïÂï²ï‘ï€ï`ïQï:ïïïðîðîÑîÙî½îÏî¼îÐîÈîÚîÖîïîôî ï!ï#ïKï>ï\ïXï^ïiïnïnïwïoïqïmïaïYïHï7ï(ïï ïöîòîÒîÎî®î°îîîkîhîOîCî8î4î3î3î7î7îCîGîTî_înî€îî›îªî¶î¾îÕîÖîéîòîï ïïï$ï ï2ïï5ïï'ïïï ïüîýîèîéîÔîÕî¼î»î£î—î“î€îî‚î’î‹î™îî¢î¯î·î¼îÙîÜîýîï#ï.ïLïbïmïïŠï¤ï¥ï±ï¶ï´ï»ï¤ï®ï„ïƒï]ï\ï:ï>ïïïçîëîÁî¾îœî‘îuîeîNî9îîþíñíÕí×íÕíÍíàíÞíåíõíîíî î'î5îSîfîxî˜î©îÆîáîöîï ï0ïGïGï`ï]ïdïeïaïgï`ïdïVïIïDï)ïïøîÏîºî}î{î>î.îÿíÚíªí‡í[í5ííáìËì™ììfìgìJìJì@ìBìIì]ìnìì®ìÇìììüì#íGíní™íÔíãí*î7îeî}îîÈî×îýîïïïï,ïï+ïïïïûîæî×î½î¸î’î™îuîxîcî[îMîDî@î=î;î?îBîAîWîQî}î€î¬î¶îÝîåî ï$ïEïjï‰ï®ïÈïèïýï ð$ððBð7ðQðKðEðFð2ð$ð ðûïäïÐï¿ï¡ï—ïsïYï4ïïçî¿î§îˆîvî^îSîLîBî@î@î:îLîEîeîpî‰î¨îºîØîúîïDïcïïºïçïðGðoð“ð¼ðÝðñ!ñAñUñtñxñ†ñ†ñˆñŒñ†ñ€ñiñañ=ñ)ñ ñßðÇðžððcðGð$ð ðßïáï±ïµï•ïŸïˆï—ïƒïïˆï˜ïï ï›ï¶ïºïËïãïìïþïðð,ð7ðFð^ðbðƒð…ð›ðžð°ð¬ð·ð³ð³ðµð«ðŸð£ðŠð•ð~ððkð^ð@ð-ððüïîïÑï¸ï‘ïïhïbïUïHïNï/ï,ïøîöîÅîÁî˜î“î`îaî1î+îîøíèíÔí¼í®íší’ívípíjíaíaíbí]ílícíhíiígíeídí`ícídí^ífíjíŠí™í·í¦í¼í±íÐíÝíðíî î"î&î>î6î@îDîRî_îeîzîxî‚î…îˆî‡î”î¡î›î·î¨îÊîÀîÑîÇîÂîÈîÖîóîï"ï.ïOïQï{ïzïšï ï­ï¬ï¶ï­ï³ï­ï¯ï¬ï²ï ïªï˜ï«ï¡ï³ï±ï²ï·ï´ï¼ïÁïÃïÉïÕï×ïæïèïðïçïüïìïðøïðð0ð$ð=ð.ðKðBðfðað}ð{ðƒð”ð¨ð¦ð³ð¶ð¾ðÒðÍðÙðÑðÈðÂð®ð°ð‘ð•ðvðpðSðHð7ðððÿïðîïãïÐïÂï½ï­ïµïšï¦ï…ï¢ï…ïŸï‡ï¢ï”ï¢ï¨ï©ï§ï¾ïÁïêïëïðð9ðLðiððð¬ð½ðÒðöðùð*ñ0ñJñVñZñwñzñ—ñ ñ­ñ¹ñÁñÌñÖñÛñàñÞñóñ÷ñ òòò8ò=òIòRògòsòuò—òƒò¦ò˜òžò“òŒòò‡òŽò„ò‹òòvòiòTòJò1ò*òòòÿñØñÓñ®ñŸññjñHñ;ññ ñóðÔðÓðªð­ðŠðƒð{ð_ðcðIðRð@ðAð2ðAð/ðEð;ðOðPðSðbðað`ðlðtð…ððžð¯ð¼ðÍðèðïðññ9ñ>ñañpñ‰ñžñ¦ñ¶ñ³ñ¼ñ¿ñÆñ¼ñÃñ¬ñ®ñ™ñ‘ñ„ñjñiñFñJñ.ñ(ñ ñõðÝð¯ð¥ðð‰ðuðlðLðIð:ð8ðAð1ðIð-ðAð8ð<ðKðMð^ðeðoðoðwð}ð‚ð‹ð–ð›ð°ðªðºð°ðÄðÃðÓðÒðÝðÔðâðÔðéðÉðßð¾ðÎðÂðÁðÃð´ðµð¦ð•ð‘ð†ðð…ðuðyðoð_ðbðGðFð2ð5ð!ð-ð!ððððð ððð!ðð#ðð$ð!ð&ð ð(ð'ð5ð8ðBðLðMðYðeðcðkð{ðqð…ðtð„ðzð~ð^ðAðððáïÐï¦ï•ïgïNï&ïïéîÏî«îînîZî;î-îýíîßíÔíÆí¯í¶í¥í°í¦í´í¦í¨í©í¶íÊíÝíøíîî î9î-î1îGîRîfî‚îîœî¨î¹îÚîåîöî ïïï8ï)ï8ï6ï:ï6ïAï=ïNï?ïJïJï>ïGïCïKïJïNï8ï?ï+ï2ï.ï7ï>ïAï<ïRï:ïCï9ï0ï3ï<ï4ï:ï?ï$ï1ï.ï'ï>ï@ï`ïOïhï<ï=ïDïXïoï~ï‘ïïŸï ïï˜ï¥ï¦ï±ï´ï®ï¬ï¢ï©ï§ï°ï¤ï­ï›ï¥ïï¤ïˆï¦ï ïªï¾ï¸ïÄïÝïÚïþïðð(ð(ðBðEðWðWðcðbðlðqðlðbðXðRð`ðEð^ðKðbðUðYðHð5ð"ððððçïÒï²ïï†ïcïPï.ï,ïïïâîÒîµî˜î‹îdîWî@î î$îøíûí×í¼í±í’í”í{í„íjíífí{íqíuí{íwíŒíí•í‡í–íšíŸí¹í®íËíÁíáíÛíüíîî"î4î:îNîYîuî†î•î«î´î¸îÊîÂîÁîÙîÖîõîìîïûî ï ïï!ï"ïEïOïgïï’ï¿ïÂï÷ïðïð"ðCðZðyð™ð´ðÊðãðõðúð'ññSñCñiñgñvñtñ‡ñoññkñvñpñeñhñUñ_ñCñGñ6ñññòðòðÙðÌðÅð­ð­ð›ð”ð˜ð‡ð‡ð‰ðwð€ðqðjðQðVðHðJð;ðCð=ðBð>ð/ð'ððð ðð ðððð ðøïìïæïâïØï×ïÀï»ï£ï¦ï}ïŠïjïƒïvï„ïï–ï—ï¡ïœï¡ï ïÅïÎïòïððBðMð{ð€ð¤ð½ðÒðìðýðññ)ñ>ñSñmñwñƒñ™ñ’ñ³ñ¯ñÉñÃñ×ñÒñßñâñÝñßñÝñÐñÎñ½ñ­ñ ñ…ñsñYñEñ/ñññëðíðÆð¹ðºð™ðœðð}ðzðwðeðPðBð;ðSðPðlð]ð]ðVðlð`ðrð[ðjðPð\ðUðPðRðSðQðJðPðMðNðNðNðKðGðCð3ð5ð(ðððýïðïãï×ïÊïÍïºï°ï­ï¥ï£ïïœïžï™ï¤ï˜ïŸï•ïï¢ïœï¦ï­ï©ï¹ï¦ï«ï¡ï™ï£ï“ï¥ïŽï’ï†ïvïtïWïNï6ïïïðîÜîÅî î‹îfîTî;îî îêíÕíÀí¤í‘íjícíPí[íKíUíMíUí\íbílípíŒíœí°íÑíÜíþíî#î1îLîbî{î™î­îÒîâî ïï$ï.ï*ï4ï6ï5ï9ï6ï3ï8ï#ï ïï ïûîïûî÷îÎîÅî™îŠîmîVî>î%î îýíîíàíÑíÁíºí£í¨íí—í€í‰íwí‚íhíqíTípíUíeíQíNíFíLíMíCíLíGíOíPíSí^í_íbígíZídíOí^íKíLí9í;í+í8ííííííí íííÿìîìóìÒìÕìÀì³ì´ì£ì¤ì’ìììpìmìcìWìOìEì:ì=ì*ì'ììì#ì$ì6ì4ìBìIì[ìcìpì‚ì’ì¦ì¾ìÕìáìþìíí)í0í>íCíVíPíoí_ísífíoícíkíbíZí[íIíOí4í7íí íôìëìÕìÂì»ì¦ì ì—ì‡ììqìvìpìmìtìuììŠì—ìšìÂìÅìïìí?íeíŸíµíæíííî&îPîeîî˜î¢îµîÈî×îäîúîï.ï>ïVï`ï|ïƒï¡ï¯ïÆïØïäïøïðõïððï ðèïïïßï×ïÈïÃï´ï®ï£ï”ï„ïpïgïMïKï.ï3ï ïïïïï(ïï,ï5ï:ïRïdïsï‡ï•ï¥ï¼ïßïäï ðð6ðPðað€ð|ð¢ðªðÀðÎð×ðãðÞðëð×ðáðÌðÄð»ðªð¬ðð—ð}ðqð^ðLðIð6ð1ð"ð ððÿïûïüïâïïïåïæïáïåïÓïðïÓïäï×ïÙïâïØïëïëïòïôïüïþïöïøï÷ï ðððð,ð ð6ð.ð4ð;ð2ð>ð4ð:ð5ð2ð2ððððð ðððððððùïðûïðýïððððð+ð$ð?ðAðMðaðsð|ð˜ðšð¥ð«ðÄðÉðåðãðíðýðëðñöðúð ñÿð!ññ+ñ(ñ(ñ0ññ*ññññññ ñññððîðÝðßðÉðÂð§ð‹ð‡ð|ð‰ðzðƒðˆðˆðð˜ðð¨ð’ðªð£ð£ðµðµðÄðËðêðéðüðñöðñôðñíð ñëðýðëðäðÝðÉðÄð·ð±ð¡ð–ð‡ðwðsðbðVðNð7ð@ð*ð,ð)ð$ð+ð#ð.ð ð7ð3ðSðVðrð†ðð»ðÑðëð ñ$ñLñlññ²ñÍñøñò1ò=ò[òeòuòuòuòwòdòZò8ò"òòññÔñ®ñ–ñ]ñ;ñ ñÎð¨ðcð8ððÜï²ïïZïBïïíîÅî±îšî„îzî_î\îQî]îLîaîoî}îšî¬îØîîîï$ïGïxï}ï¸ïÎïð3ðTðŠðœðÐðÍðñùð%ññ=ñ4ñEñ7ñ6ñ!ññýð÷ðÏðÃð°ð–ð’ðlð]ð6ð'ð ðòï¾ï¢ïxïiïaï[ï^ïgïdïŠïï¬ïï¿ï²ïçïÝïð1ð_ðƒð¦ðÎðíðñ2ñ\ñrñ¢ñ®ñÖñèñ òò9ò>òJòWòWòqòcòlògòeòbòdòOòAò2òò&òòò òò òò ò òò òòò9ò;òWòeòkòŒò‡ò±ò´òÕòàòóÿòóøòóþòÿò#óó2óþòóñòóó&ó#óóóóÿòìòåòÊò¹òpò[ò6òòûñòïñòñæñíñãñßñàñãñìñåñøñùñ òòò)òAòDò{ò}ò™ò§ò­òÇò°òÏòÖòüòó+óBóPótó|ó™ó¦óÂóÖóÞóõóýóôôôýóÜóæóãóÔóáó¸ó²óŽóóbó@ó#óþòôòºò¯ò~òiòDò:ò!òòÐñÈñ–ñ‹ñkñ\ñDñ1ññ/ññ"ñññññññÔð¼ðÇðßðëðÿðññIñañŽñ¡ñÁñÖñýñò6òUò`ò„ò¤òÆòØòàòÓòÔò»òØòÎòåòÓòèòÑòðòðòóó ó ó2óóòîò×òäòìòóó(ó/ó8ó?óNóLóDó]óDóRóUóUóhóbó~ónóuó‚óyóó‚óóó”ó”óóƒó‹ó‚ó˜óóyókó[óLó=óóó÷òàò×òÄò»ò¦òšò„ònò[òDò2òò òþñññ×ñÉñªñ’ññsñ[ñTñ8ñ0ñññúðçðØð½ð¹ð¨ð§ð˜ð—ðŒðƒð‚ð†ðŽð’ð¤ð§ð½ðÇðÑðáðêðññ4ñOñgñˆñ«ñ¹ñèñüñò9ò]ò‚òŸò¼òèòó)óEóióó©ó¼óÝóîóôôHôJô]ômô€ô€ô­ôœôÁô³ôÎôÉôÑôÁô½ô¹ô¯ô­ô£ô‰ôwô^ô@ô'ôôôôóàóÐó´ó°ó“ó†ósó[óBó8óóó÷òåòãòØòÒò½òÍò¸òÂò¹ò½òºò¼ò¾òÃòÂòÈòÊòÉòÎòÐòÔòÝòÛòÒòÜòÂòÚòÉòÏòÄò¼òÁò°ò«ò£ò•òŽòò}òzòhòtò`òfò_òTò[ò[òTò^òRòOòGò8ò2òòòòòôñôñßñÍñÚñ­ñ´ñ’ñƒñlñ[ñFñ2ñññëðÄð±ð”ðqðXðBðððåï§ïšïJï<ï ïåî½îžîvî]î4î'îúíîíÎíÉí©í“í‹ícícíIíDí1í7í)í*í)í&í/í$í5í(í<íAíMí_ílíví€íí‘íí§í¨í¹í¹íÁíÁíÆíÀíÊíÆíÁíÊí¿íÂíÏí¼íÌíÎíÂíÑíµíÍí¿íÌíºíÎí·íÔí½íÚíÌíÍíßí×íéíåíþíÿí î îî3î5îRî^î~î—îªîÔîÖîðîîîïï,ï)ïDï@ïGïJï=ïEï;ï9ïEï9ï;ïAï/ïBï2ïBï.ï2ï<ï)ï.ï ïïï ïþîáîâîÁîÍî£î¤î‰îªîœî­î„î›îxî”î¢îºî±îÄî¸îÉîÂîÂîÓîÑîíîêîïøîóî ïúîïôîïöîïïîçîÅî¦î‡îoîUîAî"îîííÚíÅí¤í£íkízíKíSí4í(í íííííÿìí íííí í2í;íPí]í]í|ísíªí íÍíÏíÛíæíðíúíîî?îFîjîwîîîîŒîšî¦î©î´î î§î‰î…îjî^îLîAî2îîîìíéíÖíÈí½í§í¢íŒí€ííaíiíSí]íCíFíCí?í@í@í,íBíí7íí'ííííííííí íííøì íùìíí#í'í/í9í6íLíEí`í[íví}íí£í£íËíÇíîíííî îî"î,î3î:îQîNîmî{î”î¬îÌîÏîÚîÐîÓîÝîìîûîïïï ïïïÿîïïï!ïïïïïïï!ï*ï-ï3ïAï7ïMïEï^ïXïfï`ïmï_ïxïeïïvïvïƒïnïxïtïoï|ïtï{ïxïcïzïYïmïWï[ïGïNïEï<ï.ï0ïï.ïï%ïïïþîïîöîÓîÆî§îŽî•îŽî£îšî¢îžî›î“î¢î±îµîËîÈîÌîÅîâîáîþîïï<ï8ïWï]ïvïwï‘ïŒï£ï¬ïºïÁïÊïÓïáïëïöïñïñïâïðïÔïÕï¾ïÅï´ï½ï¦ï©ï˜ï“ï’ïŒï‚ï‡ïyïyï}ïpïxïxïwï~ïƒï‡ï†ï•ïˆïšïŒïï•ï¢ï¦ï½ï¼ïÖï×ïåïóïúïð ðDðAðjðkð„ðŒð£ð ðÌðÀðãðéðøð ññ-ñ0ñ6ñHñFñ[ñ_ñ}ñwñ–ñ¡ñ°ñ´ñÔñÌñøñòñòòò4ò6ò;òJòFòaòZòpò‚ò–ò±ò°ò»ò®ò»òÅòÕòçòèòãòÜòßòÕòàòÐòìòÑòßòÔòÛòÏòÊòÇò´ò¼ò¡òµòò¡òƒòƒònòqòZò^òLòKòFòHò=òKò?òCò3ò4ò.ò.ò,ò+ò!ò%òòòòòòòò#ò-ò/ò1òFò:òUòHòkòeò{ò‘ò™òµò¸òÊòÉòÒòêòïòóó'ó,óHóZónóxó•óŸó¯ó¹óÈóÚóáóóóìóùóèóÿóúóúóôýóúóùóàóÝóÆó¨ó¬ó‹ó‚ómó[óKó.óóÿòÜòáòÂòºò˜ò…òfòUò:ò&òòìñëñÈñ¿ñ«ñ‘ñšñoñsñfñeñbñfñeñfñjñmñyñrñwñ}ñ{ñ‡ñŠñ¤ñ¡ñÁñ¾ñØñÛñïñøñòòò(ò)ò7ò!ò(ò"ò&ò+ò/ò'ò#òò òòçñâñÉñÐñ¼ñ®ñ²ñ•ñšñ‚ñnñ\ñEñ;ññ ñññûðéðñðÛðíðØðêðÞðäðÝðïðäðñðéðõðùðññ ññ4ñ*ñ;ñ2ñ<ñ<ñCñHñAñIñ4ñBñ+ñ+ñññüðîðÞðÔðÂð½ð¡ð–ðuðqð]ðPð:ð+ðððøïêïÒï×ïÅïÈïÉïÀïÈïÄï¼ïÆïÂïÂïÉïÏïÏïãïÝïöïíïðð ððð/ð7ðFðKðVðRð^ðbðyð~ð„ðŽðƒðžðšðµð¢ðºð•ð«ð£ð¨ðµð®ð½ð¿ðÆðÇðÇðÃðÊðÐðßðîðõð ñ ññ ññ)ñ.ñGñ7ñQñDñUñRñUñiñdñtñnñsñ|ñ~ñ‰ñ—ñ•ñ¦ñ˜ñ¸ñ—ñ¸ñ¬ñ¬ñ­ñ¨ñ›ñ˜ñ„ñzñlñZñSñEñ<ñ3ñ)ñññññúðóðêðåðÔðÔðÊðÛðÍðÔðÚðÒðèðçðöðÿðññññ/ñ8ñHñLñSñdñ\ñrñ|ññšñ˜ñ«ñ­ñ¶ñ¸ñ¿ñÁñÅñÉñÉñËñÌñÆñÇñ¼ñ¹ñ¨ñžñ ñ‰ñ’ñ{ññyññ€ñyñvññwñ…ññƒñ‹ñˆñ”ñ|ñ‰ññ‘ññ­ñ·ñÐñÓñâñäñâñïñôñÿñò òòò ò(òò$ò"ò$ò.ò%ò(ò*ò!ò0òò3ò&ò%ò1òò)òòòò!òò/ò*ò0ò6ò8òFòHòPò[òXòdòpò{òŒòò¦ò»òÈòÊòéòéò ó óó+ó-óFóAóHóNó7óVó3óUó4óDó.ó1ó+ó#óóóóóóóó óóóóóó óóóóóó/ó(ó=ó>óWógó{ó’óžó¹óÌóÙóùóþó$ôô@ô-ôHô8ô>ô6ô)ô+ô$ôôôúóøóÓóªóxó@óóôòíòàòÎòÆò²ò¯òŸòŽò|òdòUòGò<ò%òòòòòÛñÇñ®ñ±ñ³ñµñÀñÌñãñ÷ñòò"ò3òSòpò”ò·òÁòÞòãòó ó"ó+ó0ó3ó'ó-ó.ó,óó ó&óó(ó óóóûòãòäòÛòÓòäòÒòáò×òÞòÞòáòèòçòõòÊòÕòÓòèòàòîòó ó7ó6ónóxó–ó«óÄóÞóíóôô&ô ô7ôô(ôô ô ôøóóóÜóÚóÀó³ó™ó’óióbó2óóóíòäòÄò¹òžòòvòYòBò#òòòøñþñîñòîñòÿñòò)ò8ò<òUòXòò{ò¢ò™òÈòÈòöò ó4óGó\ó|óxóxó‹ó‚óó‡óyóyógóPó^ó-ó7ó*óóóóíòÞò¿òÅòµòºò òzòhòTòZòpòpòŽòtòuò‰òò¶ò¼òêòþòóó3ó5óLóvó˜ó½óÓóìóô#ô<ôWômôzô~ôôô›ô•ôŒô•ôpô†ô]ôaô8ô/ô ôþóÚó®óƒóTó5óóóÕòÇòò“ò|òtòZòQòIò>ò/ò(ò"òò!ò'òòòúñîñûñòòò ò òò3ò9ò`òfò‡ò“ò£òºò»ò°ò¹ò·òÔòÍòÓòáòâòôòõò óòòõòñòó÷òó óóó óó óóóó)óó)ó$ó0ó$ó0ó$ó-óBó@óXóPóHóLó?ó>ó:ó6ó)óóóóÿòúòòòâòéòÉòÄò±òªò“ò…òwòdòPòLò1ò'ò òðñâñÄñ³ñ¥ñ…ñpñSñYñ8ñ.ñ'ñ,ñ!ñ+ñ'ññòðññ6ñFñ|ñ–ñ´ñãñò"òCòVò–ò”òÀòÄòÜòÒòËòÙòßòôòóó4ó7óFóLóNóLóZó^óbóióZóióWófógóSóOóAó:ó8ó5ó3ó8ó2ó)ó'ó ó-ó,ó3ó:ó@óJóLófó[óhópó|óyó•óŠó¤ó£ó¤ó›ó“ó€ó„óuóló_óEó>óó"óÿòêòÉò¾ò¥òŽò~òdòOò/ò!òøñéñÕñ¼ñ½ñ”ñŽñsñsñ_ñfñVñ`ñMñiñnñwñ–ññ·ñºñäñ ò7òXò‡ò¬òÖòýò,óDówóóÆóÖóô'ôYôsôô™ô´ôµôÓôÐôßôàôÛôêôâôëôÖôÌô¼ô¹ô£ôôôuôjôUô?ô3ô ôôôéóøóÛóæóÛóÝóâóçóåóòóõóôô0ôBôQôVômôôžô¶ôÔôîôõ,õLõcõxõ“õ¨õÂõÔõíõöö#ö(ö+ö@öGöjöeö}ö€öŒöŠöö‘öö™ööŸö’ö£ö–ö¢ö¡öžö¤ö¨ö¬öºö½öÍöÎöäöãöøö÷÷÷+÷*÷G÷<÷K÷J÷K÷I÷N÷O÷K÷E÷C÷A÷9÷?÷÷÷÷ôöçöÌöÀö¥öövöeöEö3öööôõóõÜõÑõ»õ®õ™õ‡õ„õfõpõQõUõ>õ6õ3õõõ õõ õõ õõõõõõýôýôöôøôîôìôéôåôêôåôéôëôàôåôâôàôïôÚôëôÕôáôÏôÍô¾ô½ô»ôÅôÆôÖôÉô×ôÓôÙôæôÐôÙôÖôÞôùôõõ8õ;õbõyõ™õµõÖõéõö!ö;öeökö¡ö£öÒöâöëö÷öö÷ûöôöýöèöáöÙöÀöÂö£öœö}öxö_öWöHö ööéõìõÁõ¿õ¬õ­õ›õ›õõ‚õ|õ}õcõqõ`õpõgõzõvõ|õ…õ{õyõ„õ|õõwõwõcõ[õvõaõsõ`õKõTõDõJõBõKõ0õ õõðôàôÌô¹ôÆô¬ôÀô¦ô«ô‘ô€ôxôyômôzôlôoôvômôŠô‚ôŒôô©ô¾ôÌôçôêôõõ?õEõhõzõŒõ©õ¨õÇõÃõâõÝõýõüõöööööö ö öûõøõñõÓõ×õ¥õ·õŒõ“õqõkõLõEõ(õõ÷ôøôÚôÜôÂô´ôˆô|ôgôZôOô2ô%ôô÷óëóÐóÈó¨ó©ó¥ó–óžóóó‰óózómóaó]ó_óMó^óQóZóIóUóHóUóEóPóDóBóAó>ó/ó8óó-óó&óó&óóó'ó óó óóóó&óó*ó.ó,ó*ó3ó9ó:óFóHóVó\ógótókóxóóó’óóóœó’óªó•ó¶ó˜óÉó¸óØóèóõó÷ó ô ôô ôôô:ô2ôNôCôJôEôMôIôZôYômôlôuôô†ô”ôšô«ô°ôÄôËôåôáôöôþôõ$õ6õZõUõ~õõõºõ¹õÚõæõíõöö"ö9öCö\öjösöö‘ö¤öÄöÃöàöâö÷úö÷ ÷ ÷ ÷÷÷÷÷÷ ÷üö÷ùö÷÷ö÷üö ÷÷÷÷ ÷÷ ÷÷*÷'÷:÷7÷Q÷Q÷j÷h÷÷÷”÷¹÷À÷Ø÷ï÷ÿ÷ø*ø3øRø\øyø“øªøÏøëø ù"ù2ùJù^ù‚ù„ù§ù­ù³ùÅùÃùÎù¼ùÂù¸ù¯ù°ù³ù©ù·ù©ùµù¢ù®ù©ù½ù´ùÅùÂùÒù×ùæùãùñùûùú(ú.úQúYúoúŠú‘ú¦úªúÅúÎúÙúçúëúýúòúûëúÿúåúýúäúìúÓúÐú³ú¥ú‡úpú\ú:ú ú úÞùÒùªù’ùuùUù1ù-ùùùæøóøÒøÆø´ø ø¢øø‘ø‹ø}øzøkøtøxøhø|øoø…ø{øøžø£ø³ø´ø´ø§ø­ø¤ø¨øœø ø‡øøxø‡ødøuø\øeøRøSøCø=ø4øøøø÷÷ï÷Ü÷Õ÷Ð÷Â÷À÷¼÷²÷±÷¥÷ª÷©÷±÷­÷Ä÷³÷Ë÷À÷Ï÷Ë÷Ð÷É÷Þ÷Õ÷í÷ë÷ø÷ø÷ü÷øø øø#ø ø<ø1øHø5øBø5øCø'øBø$ø:ø!ø$øø ø øú÷ú÷ì÷æ÷Ý÷×÷Ó÷Í÷À÷¼÷¿÷²÷Ã÷®÷Ò÷Ã÷Ö÷ß÷Ù÷ï÷í÷øøøø+ø>ø;ø\øMøuø|ø–ø§ø¶øÂøÔøàøÝøðøïøùøùùù ùùùòøíøçøÝøÝøÚøÑøÚøÊøÛøÉøÈøºøÂø¶ø¯ø¹ø²ø·ø¶øÉø¹øËøÈøÙøâøåøêøúøôøù ùùù1ù6ùTùGù_ùSùTùVùHùRùIùQùMùMùIù?ùAù&ù&ùùùóøàøÀø·ø‘ø†øjøNø:ø'øøøí÷ë÷Â÷Õ÷«÷«÷Š÷ƒ÷j÷j÷S÷[÷C÷M÷;÷E÷*÷6÷+÷8÷0÷;÷@÷D÷R÷T÷a÷i÷r÷ƒ÷÷˜÷º÷½÷Ù÷ç÷ý÷øø7øKøføø§ø¼øÔøãøóøýø$ù1ùRùbùjùŒùù¦ù²ù¿ùÒùÓùåùåùùùóùúúúøùøùþùíùúðùøùëùÓùÜù±ù¿ùªù³ùŸù¥ù¥ù–ù¯ù•ù­ù¢ùœù¨ù™ù›ù˜ù”ù‰ù‘ù…ù›ù”ù¥ùªù¦ùÃùÀùØùÝùÍùÛùåùþùú9ú>úeúwú›ú£ú¾ú¾úÛúàúñúðú ûûúû û ûûûûû(ûû"û û ûôúîúâúÚúÐúÇú³ú¬ú’úŽúuú^úSúFú=ú,ú'úúúøùïùçùÔùÎùµù­ù™ùŒù†ùvùyùiùjùiù_ùhùbùkùoùoù~ùjùrùjùuùjùoù}ùyù„ù„ùyù†ùqù…ùhù€ùcùvùfùeùZùTù9ù7ù ùùùùñøïøèøÓøÓøÈø½øÁø¼ø±ø¹ø¢ø¸øšø¥øø›ø—ø’ø¤ø—øªø©ø¬ø±ø¹ø½øÃøÇøÄøÌøÆøÁøºø ø™øƒø}øjøZø9ø*øø÷÷È÷¬÷‰÷o÷H÷2÷÷ÿöäöÏö±ö›ö‰öuöwöeödö`öaöfönömöxöŽö”ö³öÆöÒöíöôö÷!÷4÷S÷l÷÷¯÷Î÷è÷øø)øJøYøjø}øŽøŸøËøÏøòøîøûøù ùùù#ù'ùù2ù#ù'ùù ù ù&ù$ù'ù#ù,ù+ù&ù.ù0ù?ùFùEùQùJùVùbùgùiù€ù†ù ù¡ù¹ù¾ùÒùÔùàùÓùêùçùöù÷ùúúùúúú ú úÜùÊù§ù­ù‘ù¢ù|ù‘ùcùmùJù[ù1ù;ùùùùùù÷øùÿøýøéøÏøÐøÃø½øÓø¨øÑø»øÓøßøçø÷øÜøáøÕøÚøêøëøìø÷øþøùùùùùùù ùùðøìøÒøÇø°ø–øø‹øŽø‹ø‰ø„øƒø…øyøsø`øWø\øMøVøGøKøKøJøHø=ø,øøø øøø%ø#ø1ø2øAøTøføzø’ø”øºø¢øÏø­øÍøÁø×øßøñøöøùþøùÿøùýøúøýøùôøùùøùùùùù ùùöøùîø ùïøöøÝøðøÒøãøÍøÜøÎøÒøÈøÝøÇø×øÌøÒøÌøÐøÐøÙøéøèøüøñøùù*ù)ù6ùIùXùdùtù‰ù”ùªù¸ùÏùäùùùú(ú:úMúlú~ú›ú©úÁúÙúãúÿúûû'û:ûJû[ûeûkûuûrû~ûvûûuûƒû}ûˆû…û~û~ûpûnûWûOûEû2û*ûûûùúâúØúÀúµúªú ú¡ú úžú¢úú¡úšú¥ú¡ú«ú®ú¶ú³úÐúÈúêúáúôúòúýúûûûû ûûüúûûúùúæúÍúËú¦úªúˆú{ú[úHú.ú3ú úúòùãùÔù²ù­ù‹ùùcùcùJùPù0ù@ùù)ùùùùùùùùù#ù$ù*ù*ù8ù=ùKùOùhù`ùùsù“ù‚ù§ùžù´ù·ùÃùÇùÉùËù¼ù¾ù»ù²ù¸ù­ùªù¦ù¤ù¢ùùùpùùzù|ùqùhùXùMùKù?ùEù1ù=ù/ù7ù=ùEùTùUùfùkù…ù¥ù±ùÚùÙùÿùúú$ú!úBú>úXúhúwú|úúˆúpú†úú{ú„úkú|ú[úTúMú@ú/ú)úúúíùàùÓùÇù®ù¥ù‹ùxùrùfùiùIù[ù6ùBù0ù+ùùùù ùùùù#ù#ù0ù*ù3ù2ù2ù2ù0ù#ù4ù ù)ùùùùþøùõøïøÞø×ø¿øºø¤ø˜ø…øøqøoømøuøoøpøqø|øŠø’ø›ø¨ø¸ø¿øÑøÝøßøùøþøùù;ùEùbùsù—ùœù½ù×ùïùúú3ú?úYújújúvúuúvú„úfúsúMúJú!úúñùÐù¨ùù^ùHùùóø½ø†øTøøØ÷¦÷h÷7÷÷Ûö¶öö_ö8öööãõÓõ¶õŸõtõ^õ5õ&õõ õ õ õõ õ'õ#õ*õ8õ7õQõhõ}õ‘õ õ¨õÇõÎõôõöö.ö<öOöaö}öƒö¡ööªö£ö°ö¾ö¯öÑöÀöÍöÓöÒöÖöÜöÝöíöæö÷ôö÷ ÷+÷%÷=÷G÷[÷e÷u÷ƒ÷”÷¦÷¹÷³÷Ì÷Â÷ã÷þ÷ø-øBøRøoøøœø«øÃøäøéø ùù-ù4ù>ùSùNù_ùbùuùtùùùùsùkù]ùYùBù3ù0ùùùùøùäøãøÐøÎø³ø¼ø±ø£ø¬øœø¯øƒøœøzø‘ø{ø…øø~ø…ø~ø}ø}ø‚ø„ø„ø‘øŽø¤øø§ø­øœø³ø¨ø¾ø±ø»ø´ø­ø²ø£øžø‘ø„øøsøiøbøXø8ø3øøøö÷â÷Ø÷Ñ÷Å÷¹÷Á÷£÷¤÷ ÷÷š÷„÷÷÷÷~÷w÷n÷g÷o÷m÷l÷÷u÷‚÷ˆ÷ˆ÷–÷Š÷¡÷š÷®÷©÷Ë÷Á÷Ö÷Õ÷ß÷ê÷å÷øøøø=ø7øMøfø_øyø€ø“ø­ø°øÆøÉøÑøàøæøõøþøù$ù/ù:ù=ùMùKùVùVùZùeùbùrùhùrùtùrùjùlùvùdùmù\ùaùZùYùMùVù2ùBù*ù(ù!ùù"ùù$ùù)ùù(ù/ù@ùDùVùaùlùxù~ù‡ù†ùùù”ù›ù¤ù¹ùÆùÏùÐùÝùåùþù ú#úú*ú ú:úDúVú_úqúxúuúŠú’ú‡úúƒú•ú‘ú’úµú¹úÑúÑúîúíúúúýú÷úûûûû ûûûûûûûûû ûöú÷úßúåú¶úºú–úú_úKú,úúìùÄùùxùXùEùù ùõøËøÀø™øoø[øøøì÷Ð÷¸÷¬÷š÷÷z÷n÷a÷O÷\÷2÷P÷'÷@÷!÷;÷÷ ÷÷0÷2÷<÷P÷A÷Q÷K÷b÷Z÷Y÷g÷g÷j÷h÷w÷x÷w÷z÷l÷÷f÷u÷d÷Y÷H÷<÷+÷÷÷çöÜö©ö¡ö‚ö^öBö$öÿõãõÊõ¤õ‘õ\õEõ0õõûôäô¹ô–ô‚ôZô`ôôôíóÒó·óªóuócóEó6ó)ó$ó"ó)óó#óó$ó7óCóQóZóVóbólóxó‚óªó†óŸóžó±óÀóËóâóÕóçóäóçóþóôôô4ô=ô^ôoôzô˜ô£ôÄôÆôéôéôýôõ õõõõõõõ7õõ7õ1õ)õ5õ&õ)õõõÿôýô÷ôìôçôÑô½ô¶ô®ôô‘ôdôjô;ô@ôôÿó×ó×óµó¨óó|ó]óKó7ó$óóþòøòâòßòÖòÊòÌò³ò¼ò¯ò©ò±ò«òµò¶ò»òÇò½òÏòËòæòüòó3óMó`óƒóŒó¦ó©óÈóØóèóôôô)ô'ôAôOôRôqômô}ô‹ôŠôªô¥ôºô»ôÆôÇôÎôËôÒôÜôÓôàôÚôÑôÞô¿ô×ôÈôËôÐôÆôÑôÎôÖôØôÓô×ôÔôàôÏôÚô½ôµô¢ô¡ôô˜ô‡ôô{ô~ôjôiôRôIô;ô8ôôôùóýóðóëóáóÚóÏóÏóÄóÁó¿ó¶ó¹ó°ó±ó©ó«ó¬ó¡ó³óŸó²ó©ó«ó±ó¯ó­ó­ó©ó³ó¸óÃóÇóÎóÊóÌóÃóÎóÅóØóÐóÈóÎóÃóÝóÈóÕóÑóÓóÖóÎóÐóÙóÑóßóÏóÛóÑóÔóÚóÚóâóáóæóäóñóíóþóõó ôôôô(ôô6ôô2ô!ô)ô+ô)ô5ô.ô4ô*ô*ô&ô,ôô%ôôô$ô(ô'ôôô ôôôô"ôôôô"ôô"ôô*ôô.ô(ô4ô9ô<ôJôHôYôgônô„ôŽôôµô»ôÔôÚôãôõõ#õ&õ.õ3õ3õ%õ*õõõõõõõüôæôÚô¾ô³ô˜ô‰ônô^ô8ô1ô ôõóÏóÂóžó‘óuójóWóEó*ó óóõòéòÕòØòÍòÏòÑòÙòÙòãòäòòòõòóó/óNódóuó–óžóÄóÏóúóõó)ôôOôMôvôrô‹ô‡ô§ô¦ô½ô¼ôÄôÊôÉôÄôËô¿ôÊô½ô½ô¯ô°ôªô§ôœô‘ôˆô|ôrôhô_ô[ôaôHôJô9ô9ô3ô+ôô ô ô ôô!ô"ô1ô5ôQôYôvôwô–ô’ôªô¹ôºôÚôãôõôõõ õ,õ5õ=õNõJõiõiõ}õõœõõ¶õ¯õ¹õ³õ§õ²õµõ´õ¶õÃõÇõÎõÎõÍõÑõçõæõýõýõöõýõûõúõÿõöööö"ö2ö8ö6ö1ö öüõîõïõøõ öööö*öö1ö,ö1ö?ö?öVöRöoövö”ö•ö¯öÀöÈöÛöØöõöïöúö÷÷÷%÷7÷N÷V÷t÷ƒ÷œ÷­÷·÷À÷Ñ÷à÷ì÷øøø ø,ø7øEøMø[øgøvø‹øœø«øÀøÃøØøæøåøùøøùùùùù ùùù(ùù(ù#ùùùùùäøãøÔøµø”øløZø8ø#øøá÷Ê÷Ÿ÷‰÷f÷?÷,÷þöçö¯ö“ö_öJö!ö öòõÙõ¸õ¥õ’õsõgõHõ7õ"õ õöôäôÄô»ôžôôtôVôAôôô÷óöóÛóÁó­óˆóˆólólóaóGóDó,óóóâòäò°ò¸òŠò„òbòIò7òòòòñæñâñÊñÔñ¿ñºñ¸ñ©ñ²ñ¢ñ¿ñ®ñËñÏñÜñòò0ò0òWònòò òµòÂòãòäò óó-ó[ócóóœó¾óãóüóô2ôCôVôlôô“ô½ôÆôçôÞôõõ9õ5õeõeõõ•õµõÅõØõçõüõö2öCönödö…ö‚ö—ö¤ö²öÏöÌöçöùö÷÷ ÷1÷&÷M÷C÷a÷Y÷{÷x÷Ž÷“÷Ÿ÷™÷Ÿ÷ª÷¸÷Ê÷Ã÷Ú÷Û÷ê÷ë÷ÿ÷÷÷÷÷û÷ü÷ô÷øõ÷ø÷÷øÿ÷ øøø øøøøøøþ÷ï÷ë÷ê÷×÷è÷Í÷è÷Õ÷Ù÷Ð÷É÷Å÷Í÷Ê÷Ú÷Ï÷Ö÷Þ÷æ÷ä÷ó÷è÷ì÷ì÷î÷øþ÷øø;ø:øVø[øvøƒø˜ø¬øµøÇøÞøîøöøùù.ù/ùPùHùhù]ù}ùfùyùùˆù¢ùžù²ù¯ù·ù¶ù¾ùÀùÄùÐùÌùÔùÔùçùâùòùòùþùþù ú ú ú5ú;úIúMúHúOúTúWújúnúyú„ú’úú¥úú¬úšúªú¨ú®ú¨ú¦ú–ú“úƒú…úyú}úfúsúdúWú`úQúGú8ú1ú$ú"úú úúùêùèùÔùÎùÁùÉùºùÇù´ùÀù´ù»ù­ù½ù¦ù·ù¶ù»ù¼ù½ù¾ù»ù½ù·ù¹ù¶ù®ù«ù¦ù¡ù®ù‘ù¦ù‡ù’ù{ùŠùpùmùbùRùaùAùLù(ù"ù$ùùùùýøùøøùøëøøøßøðøíø÷øùùùùùù#ù&ù(ù>ù7ùMùNùTùaùYù[ù_ùSù`ùHùUùAùKù:ù,ùù ùùãøßøÉøµø§ø“øtø]øIø6øøøî÷à÷¼÷¼÷÷~÷b÷H÷G÷)÷'÷÷÷ùöïöàöÉöÈö¼öÀö»öÃöºöÃöºöËöÍöÏöéöäöóöôöþöþö÷ýö÷ ÷÷÷÷÷&÷#÷,÷÷÷÷÷ ÷ýöýöÞöîöÌöØöºöÆö¬ö´ö­ö©öµö¤ö¶ö©ö«ö¨ö¤ö±ö­ö¾ö½öÇöÎöÙöõöÜö ÷÷÷'÷9÷H÷V÷R÷_÷T÷^÷a÷d÷[÷S÷@÷<÷÷$÷÷öõöÏöÅö§ö›övölöMö6öööäõØõ½õªõõõkõUõKõ=õ?õ,õ:õ1õ7õ@õ8õWõIõsõmõ‹õõ õµõÌõéõöõööBöCödökö†ö‘ö¥ö±ö¿ö¿öÃö½öÆö¼öÌöÌöÐöÖöÝöÙöÔöÜöÓöÚöàöÚöÞöÜöÒöáöÉöÒöÓöÖöéöäö÷÷÷÷#÷)÷L÷H÷s÷j÷÷•÷Â÷¿÷æ÷é÷øø%øGøKøløuø‘ø›øªø¹øÁøÉøÝøÕøëøÜøæøÜø×øÔøÉøÙøÇøÒøÄøÇøºø®øœøˆø†øsøyøføoøWøIø@ø(øøø øøø øù÷õ÷õ÷ï÷æ÷ä÷ç÷Ù÷à÷×÷Ì÷Ñ÷Á÷»÷°÷™÷‘÷~÷k÷h÷I÷F÷+÷÷÷ìöÚöÄö öŒöhöUö?ö*ööîõåõÁõÈõ¢õ´õ‡õ‚õ^õKõ/õ õõÜôÒô¹ô§ôô}ôiôWôJô5ô1ôôôôôòóèóàóÍóÉó½ó«ó§óŒóó}óxóYó\óHóIóDó8ó5ó&óóóóóéòèòÖòÎòÁòÊò°ò¹ò°ò’ò‘òwòwòiòYòIò<ò)ò"ò òòêñáñÑñÊñÏñÅñÈñÂñ¾ñºñ¥ñÃñ¨ñÑñ¼ñÐñÑñ×ñÐñÜñÓñïñèñòûñ òòò#ò<ò3òFò]ò\ò|òoò˜òˆò¦ò¨ò¼òÍòØòêòóó*ócóXó„ómó™ó„óÅó§óàóÚóñóô!ôôôôôôô ô ôðóÍóÃó¯ó»ó§óÉóÈóÇó»ó¸ó²óºó­óµóªóó˜óžó©ó±ó¶óÆó²óÀó¯óÕó²óÉóÄóÆóÏóÉóæóÎóéóÝóòóôô&ô3ô+ô1ô:ô8ôZô^ôyôô‹ô™ô£ô³ô¾ôÇôÔôØôÚôãôáôÜôéôàôæôèôêôÜôÙôÃôµô«ô´ô®ôžô”ôbôUôDôIôGôOôUô7ôAô"ôôô!ôô3ôôôôáóÄóÍóÇóËóÙóØóãóÚóèóìó ôþó/ô+ô@ôHôQôcôuô…ô£ô°ô²ô¾ôÎôËôãôäô÷ôúôõõÿôõõõõ/õ-õ0õ;õ-õ:õ7õ0õ=õ@õFõHõFõ7õõõõõõ)õ%õ+õEõMõaõcõ|õ|õšõ‘õ±õ¶õÍõÓõëõîõþõö"ö#ö)ö6ö4öCöXödöiö‹öŽö®öÀöÜöðö÷$÷'÷A÷I÷t÷w÷”÷ª÷¾÷Ü÷ã÷ü÷ü÷øø ø8ø;ø@øbø\ø„ø†ø¥ø£ø¶øÆøÐøÎøßøéøòøþøùù ùù ùñøøøêøÃø¶ø§ø ø«ø¥øøžø‘øƒø’øŒøø…ø|ø‡ø‡ø”ø›ø£ø®ø¿ø·øËøÆøÍøÓøÈøÍøÃøÅø¾ø­ø«ø¡ø–ø•ø‚øøvøøcøbøKø3ø>ø-ø6ø0ø8ø.ø,ø%øøøøø ø øøøøøøøø)ø!ø2ø2ø:øKø=øJø?ø2ø<ø6øSøRøYøhøløvømø†ø|øø|ø€øwø~øwø{øZøcøXøPø?øDø,ø5ø øøøÔ÷Ì÷¢÷•÷r÷[÷N÷,÷'÷÷ ÷÷ööêöÛöÍöÍö´ö¬ö¤ö“öŽö†ö‚öröiöZöMö:öööôõûõÖõØõÇõ²õ¤õ¢õ‹õ}õhõNõ3õ'õôôÉô™ôrôVô2ôôôåóæó¾óÉóœóªóyó€óQóOóCó9ó#ó1ó/ó.ó!ó óó óó óÿòóåòèòÚòïòÉò®ò³ò³ò§òòšò¤òŸò¢ò™ò…òò`òqòkòeòoòiòdòjòoòoò\òVòQò;òQòJòGòTòOò]òaò{òtò€ò†ò‡òŒò¤òŸòžò¯ò£ò¯òÂòÇòÉòÞòËòáòÙòßòåòæòìòãòèòÓòÜòµòªò§òµò¯ò¯ò—òœòzòwò^òOò!òòîñèñÚñÇñ±ñœñ{ññKñGñ8ñCñ)ñ$ñññññóðîðçðÚðÊðÀð¸ð ðvð^ð:ð:ð,ð9ð1ðJð?ðHðCðDðCð5ð<ð5ðIð9ð=ðð+ðð#ðð ðððð ð ðððþïóïñïâïïïãïìïáïÕïåïåïÞïãïÕïàïÍï×ïÌïÔï×ïØïßï¿ïÅï±ïºï©ï–ï‹ïkï{ïvïzï‹ï~ïïï›ïœï¢ï ïŸïªïŸïšï‘ï‚ï—ï™ï›ï‰ï†ïwïuïZïVïZïRï2ï0ï)ï7ï(ï>ï<ïLï-ïDïOïcïiïbïbïgïbïcï[ïhïwï”ï ï¯ïºï§ïºï¨ï¶ïï›ï™ï°ïÄïüïëï ðøï@ðRðuððð¼ðÔðÜðÛðõðñ#ñLñXñqññ„ñÄñÏñìñÜñÖñßñõñòòòòòò%ò=òDòGòYòGò_òjò^òLò2ò#òòòóñôñòñâñÕñ½ñ¿ñ¦ñ¦ñ—ñ‹ñyñañVñIñEñ1ñ7ñññññâðçðÒðáðÕðÞðëðóðñøðññ#ñ=ñFñkñ}ñŸñ¯ñÅñÞñãñõñò ò%ò2òOòZòyòšò°òÚòîòþò÷òóó"óDó2óOóRó=óEó"ó(ó%ó4ó6ó3ó1ó$ó óóñòáò¦òžòŠò‹ò“òò¢ò¯ò²ò¼òÙòÓòùòïòó óó4óMófóuóŽóóœó®ó»óÑóÏóÞóÕóÒóÞóÛóàóäóìóéóïóôóèóÑó¯ó•ó‹óóUóPó óóúòêòÍò¯ò£ò{òtòIò8ò.ò òòôñ òÜñàñÂñ¼ñ ñ‹ñrñlñ\ñjñUñ[ñFñKñBñEññ*ññ?ñ2ñNñQñeñlñxñ„ñ‡ñŠññŸñœñ´ñ²ñ¼ññ¡ññ™ñ–ñ’ñ¢ñžñœñ–ñ—ñ†ññNñGñ4ñ?ñ8ñ)ñ ñ*ññ$ñþðñûðéðôðÛðìðÖðÓðÈðÄð°ð“ðqðoðqðmðTðfðhð~ð|ðð™ð¢ð³ð¹ðßðêðñ*ñ?ñ^ñzñ˜ñ²ñÌñåñòò:òDògò{ò–òºòÀòõò÷òóó0ó&ó@óDóJó`óOó`óPóbó^óxóoówóxó}óó’óžó£ó²ó®ó­ó®ó¼ó¼óØóåóùó ôô1ô?ô]ôgô|ôzôŽôšôºôÊôÖôÙôøôõõ8õYõ[õ{õ|õŒõŸõ¥õ°õ¹õÃõ½õºõµõ³õ¨õõzõeõlõdõ`õdõXõ\õFõCõ3õ=õ;õ@õCõPõhõeõ€õ~õšõ‚õ§õ¢õÁõÍõÚõÿõö4öDöSörögö‹ö|ö˜öŸö–ö¤öšö”öœö‡öœö€öoöXöIö?ö4ö"öööúõíõáõÇõÆõ õœõrõmõMõIõAõ3õ5õõõ õõþôõõôîôáôÛôÜôòôäôüôêô õ õ õ)õ-õ6õ4õ!õ:õ8õDõLõOõGõXõOõkõnõrõvõZõuõtõƒõ‡õŠõ–õ‹õ—õ‹õõƒõ}õuõeõjõdõiõNõFõ3õ'õõ"õõõ"õõ õ õúôìôÂô­ô™ô“ôƒô|ô‰ôuôhôcôOô\ôBôXô2ôQô.ô=ôôôôôôôõóíóìóïóÛóÇóªó£óŸó’ó‡óyótóWóbóQó`ó]óóƒóšó¤óÁó¸óØóÜóàóíóñóûó ôô ô'ô9ô,ô,ô1ô0ô7ôMô@ôRôgôdô]ô`ôUôjôUôdôOôXô=ô@ôôýóÛó·ó¦ó¢óqóróóóõòíòËòÂò±òšòŒò|òjòOòJò1ò(òò òôñëñãñÍñÎñ¬ñ§ñŽñxñhñBñ>ñ,ñ*ñ%ñ"ñ"ñññññ ññ-ñ&ñ,ñ2ñ:ñ;ñKñCñMñXñZñƒñzñŒññ—ñ›ññœñ§ñ¼ñÏñãñññòò,òCògòMòTòUòrò~ò‘ò­òºòÓòçòóó'ó?óSópósó˜óšóÄóÇóñóæóôôôôô ôôÿóôùóóóÚóÏó³ó§ó…ó|óoóoóKóWó3ó4ó óóóòåòØòÍòÇò¯ò´òòyòFòò÷ñÎñÉñªñ¡ñññrñYñPñ8ñ$ñññññññ!ñññ$ññ9ñ4ñ<ñ?ñ:ñKñWñXñsñzñ…ñ ñŸñÁñÝñòñòò òò$ò<ò@òHòHòDòLòBò<ò9ò"òòòòñâñÐñïñâñéñíñéñññîñòñùñúñò÷ñúñíñðñûñïñíñÐñÂñÃñ«ñµñ§ñ£ñ±ñ¶ñ´ñÂñÑñÍñÝñÔñÞñïñøñòòò òòòûñòñòüñ òòòòòòòòññßñÝñìñòò)ò@òPò^ò‚ò}ò¢ò§òÇòéò ó(óJóhóó¢ó°ó¥óÃóÎóûóþóô)ô*ô9ôEôUô[ô^ôaôRô\ôUôDôMô?ô@ô'ôôôþó ôîóòóÛóßóËóÚóÂóØóÃó´óŠóƒóŽó‹ó¥ó«óËóàóõóô,ôVôiô…ô®ôÅôÙôçôõ õ'õ8õAõdõ‘õ´õàõö"ö,öJöMöeöiöuö‰ö“öªöÅö×öûö÷÷÷þöøöûöûö÷÷÷÷÷÷ ÷(÷/÷8÷;÷;÷R÷R÷g÷W÷w÷÷™÷¸÷µ÷×÷ã÷ï÷ü÷ì÷ò÷ß÷ê÷ö÷øøøøøý÷ì÷½÷»÷÷b÷=÷÷ ÷÷åöÃö‰ö[ö öËõxõ:õ õåôÆô‰ô}ôcôNô6ô#ôûóåóÁó¢ó•óIó@ó óóó)óó/ó0óOóIófógó‚óŒó™óÁóÏóøó ô+ô*ôEôPônôvô…ôô ô±ô¼ô»ôÃô¹ôÎôÃôÎôÁôÈô²ô±ô³ô³ô±ô´ô³ô´ô¤ô¦ô‹ô†ôiôdôTô;ô.ôôôÿó ôóóäóÊóÏó³ó¿ó¬óÀó§ó±óó¡óó’óˆóyó{ógógóTó;ó,ó(óó2ó2ó(ó&ó#ó!óóóüòëòÚòæòÛòÜòØòÇòÍò¹òÀò²ò±ò¶ò¡ò¸ò–ò¥òò™òvò€òxòzòòò‰ò‹ò˜ò™ò©ò¦ò»ò¾òÉòÍòËòÊòÎòÍò×òÇòËòÊòÌòÑòÞòßòæòåòìòÞòÉòÏòÃòÌòÈòÌò´òÅò¶òÅòÄòÊòÄòÎòìòåòó óó!ó2ó;óQóRólófóŽóó£ó¦ó²óºóÏóÝóèóóóðóöóáóäóÏóÐóÀóÁó¥óµó¢ó¯ó¦ó§ó’ó‡óxójóeóGóIó(óóóýòÍò¿òºò£ò¬ò”ò–òò„òòmò‚òYòfòBòKò&ò5òò òòéñâñÎñ»ñ¿ñ°ñ®ñ–ñŽñuñPñHñ>ñ3ñ5ñ%ñññ ññôð×ðÛðÎðÉðÉðÍðÉðÉðÂð¨ð¤ð‘ð–ð•ð›ð’ð“ðœð¯ðËðãðïðññ(ñ7ñbñxñŸñ¤ñ¾ñÎñåñ òòFòMòƒòòºòÃòáòìòóóóó1ó.ó<ó-ó2ó5óBó@óKó?óRóBó]óLóbóSóYóJó1ó&óóóàòîò×òÜòÓòÕòØòÖòÌò²ò·ò¢ò—òzòpòhòmòbò|ò\òYòUò;ò?òJò@òHòGò8ò@òFò>òJòKòQòWòWòMòSòò4òÿñòôñòÿñòò(ò)òKò@ò[òMòFòNò`òkòŒòšò·òÐòìòóó%ó;óIóMó]ó]ólótóvóoóqótóvóƒóóƒó…ózóqóhóaó_óMó[óUópórópó\ódóEóhóZóYó0ó?ó'ó(óDó$ó=óFóRóeóyóróˆó«óÃóæóëóùóïóô(ôHôaôyôôô·ôÒôìôõõUõXõ…õ’õ­õºõÄõØõâõòõö ö!öö/ö.ö:ö9öEö1ö@ö'ö-ö*öööýõØõäõÖõÎõÐõÂõµõµõ¥õ…õƒõvõfõcõSõUõ8õAõõõãô×ôÇô´ôœô–ô}ôeôPôPô(ô!ôôôëóÔó¸ó¤ó€ólóWóGó)ó+ó%ó"ó0ó(ó@ó;ó?óLó]ópóxó—óœó°ó¿óÓóÔóåóäóúóôô+ôô@ô8ôWôMôaôXôcôaô\ô[ôSôSôRôMôMôSôPôEôJô6ô9ô0ô#ôôýóøóòóóóøóýóúó ôþó ôôôôô*ôô4ô;ôNôVôpôlô‡ô†ô¤ô¯ôÃôÓôßôôôûô õ"õ7õ?õVõXõpõqõƒõõŠõ‰õ õ™õ¾õ±õÓõÑõåõîõíõöööö'ö,ö8öAö@ö:öBöAöKöWöSö[öTöOöMöDö9ö,ö3ö ööùõ÷õãõËõ¹õžõŠõvõkõKõFõ)õõ õöôÛôÐô¸ô®ô£ôžôô‘ôzô€ôxôkôvômôsô~ô|ô“ôšôœô³ô¬ôÄôÍôåôðôÿô õõ%õõ>õ5õWõSõmõjõõ|õŠõ}õ€õqõ{õeõsõTõZõ=õ9õ(õõõõôìôÓôÖôÂô·ô«ô¤ôôŠô„ôwôsôZôUôOôJôDôLô8ô,ô9ô%ô;ôô@ôôôôìóÙóÅóµóžóó{óbó^ó<ó7óóóöò÷òÝòÑòÆò¼ò¬ò©ò‹ò‹òlòxòeòuòuòzò“òò®ò´òÔòöò ó2óFó]ó‡ó–ó±óÈóçóýó!ô<ôeô‚ô¥ôÊôàôõõ>õRõeõ‹õõ³õÄõÓõçõçõö öö&ö3ö7ö9ö<ö7ö7ö3öDö/ö8ö/ö)ö%öööÿõ öüõööööööööþõö öö!öö)ö ö ö&öö*öö.ö(ö$ö&öööøõñõ×õÍõµõ§õ‰õnõVõ5õ/õüôõôÈô®ô‰ô~ôZôLô0ô#ôûóôñóçóáóÍóÖó¼óÏó¶ó«ó¥ó¬ó©óÂóµóÂóÐóÃóàóÇóÐó´ó·ó­ó“óóxóqóaóTóDó2ó,óóóóöòÝòÀò·òˆòòhòhòPòBò4òòòòêñäñÑñËñ¾ñÁñ´ñ¿ñ²ñ¾ñ«ñ¿ñ¿ñÌñÚñßñúñò&òMòZòƒòŒò£òÊòÞòóó8óOóOófó[óóƒóŽó™ó”ó¡ó–ó«ó“ó”óó‹óóxó~óióqógó^óGóDó6ó2óPó4óaóFóXóCóUóTófóyózóóó¬ó¢ó¾óºóÑóçóøó ôô!ô=ô:ôWôGô]ôEôLôPôRôPôKô8ô&ôôáóÝó´ó¿óó—óoókóVóYó5óFó/ó2ó$óóóó1ó(ó3ó<ó4óLóUóqóŠóó³ó¥ó¹ó¸ó¾óÕóÙóèóðóôôôôôô%ô+ô.ô*ô(ôôô÷óòóàóÒóÁó¯ó™ó‰óuófóUó:ó*óóþòòòÕòÒò»ò·ò­ò ò˜òò‹ò„ò‡ò€ò‘òˆò’òò‘òšò§ò¸òËòïòêò ó#óJóEóvó|ó–ó³ó³óÞóÜóôô+ô;ôPôkô}ô™ô¹ôÆôòôõôõ!õ5õNõbõxõ–õ¢õºõËõÙõåõ÷õ öö,öDöQögösö{ö„ö‡ööšöžö¥ö¥ö£ö¨ö–ö‘ö‚övölöiöWöUö6ö3öö öåõÝõ½õ­õžõ|õqõZõ<õ9õõ õæôÖô¹ôªô–ôôtô`ôIôIô1ô6ôôôôôôôôóåóæóÍóåóÕóìóíóîóêó×óÙóËóåóçóñóôóèóýóçóôóóôô ôôôôôô,ô%ô:ô4ô8ôDô;ôRôAôRôNôHôXôMôgôVôpôjô}ô‚ô›ô–ô¢ô¨ô®ô¿ôÁôÏôÑôßôãôíôêôñôõôõõõõ%õ)õ7õ3õ:õ2õ@õ;õEõBõUõMõdõZõ\õ`õgõkõvõsõ~õ~õõõŠõxõŒõxõ‡õ„õ†õ‡õƒõ~õhõkõLõ[õ9õBõ'õ%õõþôõØôÎôÃô¤ô ô„ô€ôcôeô<ô=ô"ôôôüóýóáóéóÙóÛóÍóÝóÔóÜó×óÚóÝóáóäóìóæóÚóêóãóìóÞóêóàóãóËóÕó­ó¦óó”ó™ó ó‰óólójó>óBó óóýòæòÍò½ò¡ò”ò€ò_òaò8òEòòò ò÷ñòñåñÞñÔñÑñÃñÊñ¹ñ¶ñ¯ñµñŸñ±ñ‰ñ¦ñŒñ‘ñ“ñ…ñññ€ñiñiñ_ñXñWñCñMñ6ñ@ñ5ñ2ñ.ñ-ñ.ñ"ñ1ñ ñ0ñ#ñ:ñ0ñ<ñ<ñ>ñYñVñgñuñ|ññ™ñ­ñ¹ñÑñãñìñòò;ò=òRòjògò“òò¬ò½òÊòäòñòó(ó4óBóJóYó{ótóžóóœóˆóó}ó{ó€ó†óyó„óyótó}ókóvóaódóWóPóUóPóHóTó@óHóKóVóNógóTólókónóhójóaóxóxówóóqóyópólóXóQóIóHó<ó?ó$ó'óóóóÙòÖò§òò{òiòFò3òòþñÏñÅñ¦ñŒñwñbñGñ9ñ"ñññññññ ñ ññ-ñ)ñ6ñ@ñLñbñlñ†ñ ñ½ñÅñëñçñòò$ò5òJòUò[òdòqò_ò‡ò‹ò¢òÃò³òÓòµòØòÖòâòæòñòóòôòáòêòÒòáò¿ò¼òŽòZòRòDò:òDò1ò;ò4ò?ò9òHò@òLòKòOò\òXòbòdòhòròxòxò„òuò…òiòwò[òYòDò6ò)òòòòæñáñÇñ³ñ£ñyñzñOñPñ*ñññððÝðÃð¨ð™ð‹ðƒððxð}ðvððƒðyðð…ð©ð¯ðÁðÎðèðîðññ0ñ9ñUñYñ‚ñ…ñ¦ñ·ñÏñÙñîñòñò ò!òò(ò%òòòòýñúñëñêñÛñÒñÄñºñ¨ñ•ñ†ñ|ñmñbñTñ@ñ4ñ'ñ ññõðþðÿðøðñ ñ(ñ!ñ@ñ@ñañhñ‚ñšñªñÉñÙñëñòò$ò;òKòmò~ò•ò°ò¯òÌòÊòÐòÎòÌòÒòÈòÇò¯ò­ò•ò–òtòtòIòPò%ò5òòòýñëñÜñÍñËñÃñÅñ²ñÁñ¼ñ¾ñËñÃñÐñÓñâñëñõñòò'ò.òDòGòPòiòfò€ò„ò–ò—ò©ò òµò©ò±ò¼ò·òÀòÀò½ò¾ò¾ò±ò­ò ò”ò—ò}ò‡òtòyòpòpòhòcòXò`òOòjòRòjò[òpòmòuò…ò‚ò¡ò£òØòæòó óó;ó?ósó‚ó›ó¶óÎóÛóùóôóôôô(ô&ô5ô+ô,ô:ô(ô4ô#ô8ô+ô-ô!ô!ôô ôôöóøóèóøóìóõóìóøóîóúó ôô ô ô ôôôôôôôôô*ô%ô<ô4ô@ôKôGôZôLôYôJô^ôOôbôKô\ôKôPôBô>ô=ô2ô6ô3ô"ô0ôô&ôôôôüóûóøóîóìóæóÕóÚó¶óÁó²óÌó¹óËóÂóÄóÖóÏóäóÕóñóéóøóüóô ôôô$ô3ô<ôKôRôfôeôvôô|ô”ô‹ôô™ô˜ô¡ô¡ô ô³ô ô°ô£ô£ô¯ôô²ô¥ô¶ô®ô¶ô°ô©ô¥ôô–ô™ôô¦ôô£ô›ôœô—ô¢ôžô¬ô§ô¶ô¯ô¾ô¶ôÃô¬ôµô²ô¶ô¹ô·ô¸ô°ô²ô¢ôŸô‡ô‰ôqôzôgôaôUôEô?ô.ô5ôôôøóûóãóçóÔóÒóÁó½óŸó¬ó—óŸó“ó¥óžó•ó¥ó‚ó˜ó•ó’óŽó’óyósózónóló`óióVógóeó]ónóYóYóTóCó?ó/óCó%ó4óóóöòçòËòÅò£ò—ò‚òaòZò?ò:òòòÿñ÷ñáñéñÏñçñÆñÓñÙñÇñÍñÓñÏñÏñÝñÁñæñËñêñâñÞñëñæñîñóñûñòòòùñüñññûñ÷ñíñêñÛñÚñÁñ¾ñ§ñ£ñ…ñƒñoñfñSñRñGñ9ñ-ñññõðæðÞðÈð¿ðËðÙðßðöðñ$ñ/ñVñnñ›ñ³ñ×ñíñÿñòBòVò†ò¢òºòÐòÞòóó2ó6óJóMóbókóxóŠóóŸóó¨ó£ó£óšó—óƒóˆó_óZó7óóóëòáòÀò«ò‰òlòHò=ò òòìñáñÎñÁñ®ñ¥ñ•ñ‹ñƒñyñsñtñhñjñfñ]ñ`ñPñQñLñIñFñLñOñTñTñVñWñQñTñañRñfñUñeñWñ]ñRñQñGñRñRñXñZñ]ñhñfñqñgñpñnñxñˆñƒñ”ñŒñ”ñ–ñ¦ñ¤ñ¹ñÎñÔñõñýñ'ò1òNò[òeòrò—ò´òÚòèòóóJóWó‹ó“óÇó¾óúóüóô;ôMôeôvô€ô–ô“ô«ôªô¸ôÄôÄôÕôËôÎôÏôËôßô×ôãôçôÞôñôîôøôøôôôöôïôõôõôñôïôõôìôíôôôïôíôïôóôóôúôõüôõõõõõ#õ&õ6õ?õHõKõVõXõrõvõƒõ’õœõ§õ¶õ¿õÃõØõäõöö0ö3öWöaöxö™ö¦öÎöâöþö#÷F÷_÷”÷¦÷½÷Ù÷ö÷ø>øCøuø}ø™ø¬øÁø×øçøùø ùù#ù6ù3ù:ù6ù6ù4ù.ù-ù/ù%ù'ùù ùòøáøãøÎøÍø°øªøƒøwø`øRø4øøø÷÷ù÷Ü÷ß÷À÷Ç÷¦÷«÷’÷’÷„÷r÷h÷\÷F÷D÷+÷÷÷ëöëöÉöÓö³ö·öžö“öƒöyö^öXöDö9öööúõôõÙõÒõ²õ¯õ“õ~õõTõXõ5õ&õõòôôôÊôÁô¢ô•ô‹ôzô}ô`ô_ôKôPôLôUôOôWôPôMôGô?ô=ôFôBôMôMôKôTôUôZôhô\ôtôoôvô|ô~ôô’ô§ô—ô½ô¢ôÉô¹ôÎôÓôÙôçôíôíôðôëôöôôôõûô õõ õ õõýôüôùôúôùôþôùôÿôõøôõúôõõõõ&õ#õ+õ'õ'õ2õ4õHõJõ\õgõ}õõ™õŸõ«õºõÈõæõãõüõöööö%öö-ö0ö8öEö=öRö?öGö=ö:öHö5ö9ö-ö'ö ö$öööóõÿõòõøõéõèõÔõÙõÀõÑõ´õÅõ¹õÀõÅõÆõËõÎõáõÜõóõ÷õöö#ö>ö=ödöeözö{ö–ö—ö¶ö¹öÉöÕöÓöâöØöãößöÕöáöÓöÛöÎöÔö¿ö¾ö®ö¥ö›özöuöaöUöQö-ö:öçõ÷õåõìõòõðõòõõõöõ ö ööö,ö<ö@öUöiöqöŠöö©ö¨öÈöÏöèöïöüö÷÷÷÷-÷0÷8÷9÷J÷A÷X÷H÷V÷O÷?÷N÷A÷B÷I÷A÷B÷F÷/÷3÷÷þöêöãöÒöÓöÂöÌöÃöÇöªö¸öŸö¯öŽöŽötöföUö@ö öèõÒõ»õ¯õ õžõgõ?õõáôÔôÊô˜ô”ôvôNôGô3ô/ôôôúóìóÝóªó“ómóVóPóQóCóóó$ó*ó9óQóEóUó\óVóxósó†ó‹ó¤ó¨óÕóéóýóô-ôSôfôˆô¡ô¾ôÔôûô õ)õ2õ>õbõoõ‘õ©õÂõÙõóõöö*öBö_özö”ö¦ö¶öÎöÝöõöøö÷,÷?÷Z÷a÷r÷}÷…÷’÷ƒ÷•÷Œ÷“÷—÷—÷÷”÷÷¡÷”÷¢÷—÷÷‹÷“÷÷‰÷†÷o÷n÷S÷J÷G÷<÷$÷#÷÷÷ ÷øöóöÞöÝöÁö½ö£ö¬ö’ö€ösöSö=ö-ö4öDöEö`ödöö†ö ö¸öÐöÏöâöêöÌöÒöâöÙöäöÖöãöÜöêöîö÷ ÷ÿöóöÙöºöÆöÕöûö÷.÷M÷X÷z÷“÷©÷¸÷Ë÷Ï÷Ý÷ï÷ø ø!ø2øAøOøeøpø{ø‚ø‰øŸøšø²øµø¼øÊøÍøèøéøøøùùù0ù6ù>ùIùQùZùbù^ùpùiùoùiùlùqùyùyù‰ùˆù˜ù—ù¬ùœù¢ù±ù ùÀù²ù¼ù°ù¸ù¸ùµùªù¸ù¸ù¸ùÂùÆùÅùÓùÛùãùíùðù úú!ú2ú:úDúVúZúaúrúpú†úú”ú¤ú¦ú­úµú¹ú°ú²ú®ú©ú¨úžú¦ú™ú úú™úú}úsú[úYúBú9ú,ú úúíùÜùÇù©ù¨ù†ùùkù^ùDù/ùùùùùøæøÎø¿ø´ø™ø•øqøjøYøQøAø7ø2ø!ø#øø øøû÷ÿ÷ê÷æ÷Ú÷Ñ÷¿÷¨÷™÷Œ÷Œ÷o÷q÷d÷Q÷H÷/÷(÷÷÷ìöïöÏöÍö²ö™öörö\öGö/ö öö÷õøõôõõõéõñõêõûõööö&ö-ö3öBöGö]ö`öŒö‘ö»öÃöêöüö÷'÷<÷L÷`÷q÷†÷™÷¤÷±÷Ã÷¼÷Ï÷Ñ÷î÷å÷øú÷ øøø ø øú÷øí÷ê÷Ü÷Ò÷Á÷¼÷´÷£÷¡÷Ž÷÷‚÷€÷}÷u÷u÷g÷m÷a÷Z÷b÷U÷_÷Q÷Z÷U÷S÷R÷M÷J÷R÷L÷Y÷P÷\÷[÷S÷e÷R÷e÷a÷Y÷Z÷O÷L÷K÷H÷=÷>÷%÷4÷÷*÷÷÷ ÷÷ýö÷öìöÛöÔöÒöÌöÑöÊöÏöËöÇöÄöÉöÅöÒöÒöÚöáöëöçö÷íö ÷÷÷÷%÷*÷5÷7÷D÷D÷H÷M÷^÷U÷f÷i÷b÷y÷k÷|÷`÷m÷g÷b÷q÷W÷n÷S÷\÷O÷>÷D÷*÷3÷÷$÷ ÷÷÷ö÷êöîöåöâöÞößöÐöàöÒöÝöÖöØöÛöæöæöîöøöüö÷ ÷÷!÷'÷>÷C÷`÷j÷€÷‹÷©÷¨÷Ç÷Â÷Ü÷ß÷ò÷ø øøø.øø:ø0øJøAøUøLøQøSøHøMø3ø;ø+ø.ø%øøøøþ÷øë÷å÷à÷Ç÷Î÷¸÷·÷£÷›÷Ž÷z÷n÷f÷^÷R÷J÷=÷9÷0÷,÷*÷÷÷÷ ÷øöþöîöéöàöÅöÅö¯ö¨öœöö„ööqömö\öQöEöCö0ö5ööööööçõêõÔõØõËõÑõ»õËõ°õ·õ§õ¢õšõõ‘õ—õˆõŠõtõvõjõ]õ[õGõDõ0õ2õõ(õõõõÿôõòôñôñôàôæôÞô×ôËôÇôÄôÄô½ôÃô»ôºô½ôºô²ô±ô§ô«ôªô¯ô£ô¯ôžô«ôŸô©ô¥ô©ô°ôªô»ô°ôÁô·ôÌôÅôÒôÑôÓôÌôÏôÝôÑôçôËôÚôºôÒôÁôÑôÎô×ôÙô×ôÍôÊô¾ôËôÃôÕôØôÖôØôâôáôìôñôõùôõõ õõ)õ<õ>õLõPõ`õaõwõ|õ•õõ¬õŸõ»õ¤õÃõ´õÂõÀõÈõÇõÄõÃõºõ­õ®õ®õ¬õªõ¯õ¯õ¬õ¯õ®õ´õ°õ«õ¯õ¨õ®õžõ´õ¤õ¦õ°õ¥õ³õ­õÁõ¸õÑõÉõáõÖõêõëõõõþõ ööö5ö'ö?ö7ö5öGö.öHö;öQöDöXöQöWöKö[öOögöJögöNöZöQöRöKöNöHöUöIöUöXöOöYöTöPöZöTöXöXöZöKöböFöföNö\öXöeöföxöeööwö‡ööö„ö}öö€ö†öƒö…ö…ö†özözöröyöoööuö~öööö~ö‚ö‡öƒöö–öŠö§ö¡ö³ö­öÈöÄöÝöâöñö÷÷ ÷÷3÷4÷=÷B÷I÷V÷W÷c÷_÷j÷m÷i÷k÷{÷h÷y÷p÷s÷m÷a÷Y÷M÷@÷7÷0÷÷!÷÷÷÷÷÷ðö÷òöÿöîöööòöòö÷öèöõöæöøöûöúö ÷÷÷÷(÷0÷?÷F÷\÷g÷x÷÷‘÷—÷¥÷µ÷®÷Ë÷¼÷á÷î÷øø7ø ø(ø8øOøZøwøzøyøtøbøaønø|øŽø™øø³ø£øÉø¿øÑø¿øÂø¼ø³ø²ø”ø~ø‘øaø€øUøNøEøLøOø]ø[øSøYøUøPøQø?ø@ø4ø*ø#øøøøÿ÷ð÷ó÷×÷Ý÷Æ÷º÷¹÷¦÷ ÷›÷u÷~÷r÷p÷u÷s÷h÷d÷e÷l÷l÷u÷~÷…÷÷•÷¢÷°÷½÷¿÷Û÷Å÷ã÷Ô÷ï÷Ý÷ù÷ñ÷ø ø øø øøøø#ø!ø+ø"ø"øøøøø$ø&ø'ø(ø#ø3ø+ø;ø/ø?ø;øDøDø=øNø6øLø>øEø=øEø:øOø=øXøKøVøOøPøXøQøOø\øNøZøIøOøFø<ø9ø3ø øø øøþ÷ì÷Ø÷¿÷÷…÷÷r÷z÷h÷l÷W÷W÷5÷'÷)÷+÷*÷;÷6÷8÷A÷M÷[÷j÷m÷w÷l÷÷‚÷‘÷÷Š÷‰÷÷ž÷¹÷È÷ã÷ó÷ ø'øBøSøjø‚ø—ø¶ø¾øÜøÞøúøôøùù'ù&ù?ù>ùOùUùXùeù^ù_ùWùIùdùNùRù4ù.ùùùòøéøÉø¾ø£ø—ø‚øqøYøQø.ø,øøô÷Ø÷É÷¼÷²÷¤÷›÷Ž÷†÷ƒ÷ƒ÷~÷€÷x÷‚÷t÷{÷z÷k÷z÷h÷z÷h÷u÷i÷x÷n÷x÷v÷v÷~÷ƒ÷“÷•÷¡÷£÷¬÷®÷Â÷¶÷¾÷¸÷½÷¯÷Æ÷²÷Ä÷°÷¸÷¤÷¬÷˜÷©÷—÷›÷’÷÷÷ƒ÷‰÷z÷o÷m÷g÷c÷Z÷W÷R÷N÷F÷H÷<÷A÷E÷9÷J÷8÷G÷;÷8÷6÷'÷"÷÷÷÷÷PýcýQýMýCýCý4ý;ý7ý.ý:ý,ý0ý.ýý-ýý$ýýýýýýýýýýýýýýý&ýý*ýý.ý*ý:ý+ý@ý4ý8ý8ý=ý(ý5ý%ý0ý,ý-ý-ý%ý"ý ýýý ýýþüýüïüöüìüàüëüÊüàü¿üÐü¼ü¿ü¸ü¸ü¦ü¦üü‰üü{üxühüdüTüKü5ü"üüüùûÿûØûÉû­û“û†û]ûKû4ûûûóúÜúÀú¸ú”ú…újúWú@ú&úúúæùáùÇù°ùžù‡ùxùiù\ùGùAù.ù&ùùùù ùýøÿøúøùùûø ùþøùùùù&ù&ù6ù2ùDù<ùHùLùQù^ù]ùlùmùyù|ùù…ù‹ùŠù•ù’ù ù•ù±ù›ù¦ùªù•ù³ù¡ùªù²ù™ù¶ù™ù§ù•ùù•ùƒù’ù}ùƒùvùzùrùmùfù_ù^ùTùZùIùNù;ù2ù1ù ùùýøîøëøÒøÖø³øÄøø¥ø™ø~øzøUøVø:øDø&ø0øøú÷ÿ÷ï÷÷÷ç÷æ÷Ú÷·÷µ÷”÷ˆ÷j÷e÷U÷G÷@÷8÷@÷.÷<÷.÷<÷D÷Z÷]÷x÷t÷Ž÷ˆ÷£÷•÷¯÷­÷¹÷¾÷À÷Ç÷Á÷Ò÷×÷à÷ó÷ï÷þ÷ö÷øøøø$ø"ø/ø,ø1ø5ø>øJøJø\øSøaøPø]øTødøVøeø]øbøcøcøaøZø[øXø]øKø[øMøOøPøLøNøOøVøRø_øbøaøoøcøvøYøuø`ørøiøvøiøyøcøpøaøføTø[øRøJøFøBø:ø=ø6ø:ø2ø0ø$ø.øø*øøøøø øøøü÷øøü÷øô÷øë÷øì÷øô÷ý÷ù÷ø÷ÿ÷ì÷ü÷ó÷ü÷øü÷øþ÷øøøøø!ø"ø$ø'ø$ø.ø!ø:ø(ø8ø3ø9ø=ø?øJøGøXøOøXø_ø]øtøjø„ø}ø”øŠø£ø“ø¨øžø·ø®ø½ø¿øÌø×øàøåøìøêøþøûøùùùù)ù&ù#ù*ù#ù4ù*ù9ù1ù1ù.ù+ù'ùù"ùùùùùù ù ùùÿøþøÿøúøýøýøúøÿøÿøúøþøûøùùùùù ùþø ùøøýøòøùøîøôøåøâøáøËø×ø¹ø¾øªø¢ø˜øø}øyøjøfø]øOøNø9ø8ø(ø-ø ø ø øøø÷ò÷ð÷ð÷ñ÷ê÷ï÷ê÷â÷Ù÷Ñ÷×÷×÷Ô÷Ø÷Ú÷Ö÷Û÷Ý÷Þ÷Ñ÷Ý÷Ý÷Ú÷å÷Ó÷ç÷Ù÷Þ÷Ð÷Ñ÷µ÷Ì÷¹÷Ö÷¿÷á÷Á÷Ø÷Ì÷É÷Ô÷Ú÷Ö÷ã÷ä÷æ÷õ÷÷÷ øø"ø.ø<øGøZø^øyøvø”ø‹ø­ø§øÆøÈøãøêøùøùùùùùùùûøùúøùôøùøåøæøÖøÓøËø½ø½ø¨ø¬øŸøŸø™ø“ø~øtøbøSøUøCø>ø.øøø øþ÷ øû÷øþ÷ø÷ó÷Ü÷Ø÷Ú÷Ø÷ä÷ß÷æ÷á÷æ÷Ø÷Ô÷Ç÷Ó÷Ñ÷è÷Ù÷è÷ß÷æ÷ù÷ö÷ø ø%øø$ø.ø0øAø?øNøHøeøWøwøføø}øžø™ø©ø ø¯ø­ø½øÀøÃøÖøÅø×øÒøÏøÊøÊøÃøÈøÈøºøÍø©øÅø¥ø¯ø¢ø˜øŒøøvø{øiø`øXøLøEø@ø<ø1ø(ø(ø øøøøøø÷ü÷ô÷ö÷û÷í÷þ÷ó÷ö÷ê÷ð÷ð÷î÷ç÷ð÷ç÷î÷ï÷è÷ç÷×÷Ü÷Ú÷Ý÷à÷Ø÷á÷Ä÷Ï÷«÷¸÷ ÷³÷®÷¾÷¾÷Ã÷É÷¾÷Ä÷¾÷É÷Ø÷Ö÷ã÷æ÷â÷ù÷÷÷øø4øGøUøfø}ø…ø¬ø°øÒøßøùø ù!ù=ùJùkùuù–ù£ù»ùÌùÞùùùú"ú7úMúlúyúú”ú­ú©úÖúÓúñúûûûû-û.ûFûKûTûbûhûkû{ûoûkûnûgûsûpûûsûsûmû`ûfûZû\û[ûGûPû8ûFû-û5ûûûþúûëúàúÞú»úÆúžú—úzúgúXúBú1ú"úúûùâùÊù¼ùœù”ù~ùtù^ùNù?ù2ùù#ùûøùôøøøêøèøáøÙøâøÈøÒøºø²ø›ø¯øžø­ø¥øšøœøŽøøšø‘ø“ø’øŽø„ø…ø…ø{øˆø{ø€ørømøeøTøZøUøCøIø5øø øøøø#øø øö÷î÷ó÷ù÷ø÷øó÷ã÷Þ÷Ê÷Ä÷³÷œ÷÷j÷\÷H÷8÷!÷÷ ÷÷ïöóöëöåöåößö×öÛöÁöÂö¯ö¦ö‘ö˜ötö{ödöTö7ö*ö ö ööÿõöêõöóõöìõ ööõöööööö ö öõõöÿõ ööööö ööööö%öö.ö%ö0ö-ö0ö/ö0ö1ö@ö5öGö@öFöTö>öböFöZöZöiöqöhö…ösöˆö‚öŒö•ö•ö¡ö²ö›öÁö¥ö¼ö·ö·ö°ö²öö•ö¥ö–ö™ö¢ö‹ö•ö‡ö’ö‚ööyö…öoözöföaöSöQöSöIöSöBöGö;öEö.ö.ö(ö!ö&ö#öö"öö"öööö ööööö ö÷õöéõ÷õêõäõíõÕõåõÎõÑõÃõ½õ¯õªõ õ‘õõ|õ}õiõiõUõMõ@õ9õ4õ%õ"õõõõüôêôãôÓôÐôÂô¹ô±ô§ôô–ô†ôôvôpômô`ôcôOôXôEôDô4ô0ô+ô"ôôô ôôÿóôôó÷óèóùóßóùóãóñóåóìóáóæóíóçóùóïóôþó ôôôô,ô1ô=ôLôWôiôtô…ô•ô™ô¶ô»ôÔôâôóôþôõõ1õ8õ?õSõ^õfõ}õwõ‘õ‹õ›õ”õ õõ¥õ«õ¬õ·õ³õÂõ¾õÃõÁõÂõÉõÀõÑõÇõÔõÑõ×õÛõÒõåõàõéõôõîõùõöõòõûõëõùõçõøõìõ÷õóõøõöõòõçõäõÖõÚõÌõÊõÅõ·õ²õ¦õšõ’õƒõƒõqõjõaõVõIõNõ4õBõ/õ5õ4õ3õ3õ<õ<õ=õOõ9õ[õEõaõZõnõrõ}õ†õõ’õ¥õžõ·õ¶õÊõÓõæõòõöõöÿõöö'ö'ö-ö5ö7ö@öDö:öIöFöXöUöcödögöpövöoö{ötö„ö{ööö’ö„ö˜öö—öŸöšö¯öžöÁö«öÅöÃöÈöÐöÔö×öàöÞöéöëöôöéöøöâöïöçöìöéöêöìöëöñöèöñöãöðöáöðöáöìöëöâöïöÚöæößöàöæöàöäöâöìöçöëöæöäöèöêöîöñöïöõöóöøöðöóöôöòöýöùö÷ùö ÷ûö ÷õö ÷þö÷ýöÿöðöúöáöéöÙöÓöØöÆöÊöºöÀöªöºöö­ö‰ö ösö}ötölöyöaölöPöSöCöNöCöLöBöGöDöCö@öGö:öWöCö`öOöaödököpöö}ö˜öö°ö§öÆöÅöèöæö÷÷!÷'÷L÷_÷x÷˜÷›÷À÷´÷Å÷Ò÷æ÷ê÷û÷øøøøø øøø/ø+ø3ø1ø;ø8øJøOøZø_ø\øcøgøcøxønø}ø}ø‰ø‚øšø†ø¥ø—ø®ø«ø·ø³ø¸øµø¾ø¼øÉøÃøÚøÍøâøÒøÔøÙøØøÝøçøãøîøíøòøìøëøÖøßøÊøÓø¾ø¾ø¡ø¦ø•øŸø§ø“ø¨øø–ø˜øŒø–øƒø{øoø„øqøˆø€øøøø˜ø•ø™øŸø™ø¦øœø³ø«ø·ø·ø´øÃø³øÄø²ø¶øµø®ø²øªø¬ø¢ø¡ø¤ø›ø”øŒøƒø‚øø}øwø\ø\øIøZøLøPøIø5ø3øøøøü÷ù÷ö÷þ÷ü÷ô÷í÷é÷Û÷Û÷Õ÷Ñ÷Ç÷Ë÷½÷À÷³÷±÷§÷¥÷œ÷§÷Œ÷–÷€÷€÷€÷x÷{÷l÷y÷h÷s÷l÷u÷n÷u÷n÷v÷d÷o÷c÷u÷h÷u÷t÷{÷|÷ˆ÷{÷ˆ÷€÷‡÷Š÷ˆ÷÷Š÷‘÷†÷Œ÷÷v÷÷g÷{÷c÷h÷c÷P÷U÷@÷<÷-÷+÷÷÷÷úöëöàöÆöÆö¬ö­ö—ö˜öƒö{öröcöUöFö;ö2ö&ö"ööö öööíõðõìõæõãõãõàõáõìõãõëõæõìõîõüõðõ öõõöÿõööö&ö%ö;ö7öGöNöOö^öVö]öhöjötöööö‹ö“ö•öö ö§ö«ö¶ö´öÊö½öÓöÄöÔöÔöÔöæöØöîöâöêöçöçöäöïöçöëöëöçöáöíöÔöäöÈöÕöÆöÐö¼öÅöÀöµöÄö¦ö¶öŸö¥ö§ö¤öªö¥ö©ö©ö¯öªö¸ö¯öÃöÀöÃöØöÎöçöéöóö÷ÿö÷÷÷)÷2÷C÷Q÷V÷e÷s÷z÷—÷£÷Å÷Ð÷ê÷ö÷ñ÷øó÷øø ø1ø.ø<øEøBøTøCøXøRøføZømøcøgømøiøsøtøø}ø†ø‚øƒø†øŠøŒøšø“øžøŸøŸø¯ø©ø·ø³ø´ø¶ø¸øµø¸ø½ø¼øÊøÃøÎøÌøÍøÕøÌøÊøÈø¹øÂø²ø·ø®ø¦ø¢øøŸø›ø”ø’ø•ø‹ø–ø{ø‚ølø{ømøvøsørøvørøoø`øaøaøføjø_øpø`øsøqøpøhøføeødøjø`ømøgøsødø`øRøHøIøOøOøCø-øøü÷ï÷ð÷í÷â÷è÷Î÷Ü÷É÷Ï÷Õ÷Â÷Ï÷¸÷È÷¶÷²÷´÷¬÷¢÷ª÷˜÷÷ˆ÷Š÷}÷q÷s÷f÷b÷X÷H÷G÷.÷4÷÷÷÷÷ôö÷åößöÜöÆöÌöÂöµö·ö¥öªö‘ö‡övömöhö\ö`öNöKöDöBö:ö.ö2ö%ö.ö"ö.öö'ö#ö öööööööö ööööö ö&ö ö0öö0ö ö0ö#ö'öö#ö"ö$ö!ö-öö'öööÿõöööõõòõîõØõÉõÈõÉõ¶õ»õ¨õ‰õ”õõõ°õšõºõ«õÁõ°õ¹õºõ°õ¹õÁõžõ®õœõ­õ§õ¿õ½õ¾õÂõÄõ½õ²õ¬õ¤õ¢õœõ™õ–õ–õ‡õ—õƒõˆõ~õvõyõcõqõ\õZõQõRõ@õKõ8õFõ;õBõ8õ8õõõõõ!õ!õ)õõ/õõ0õ!õ õõõõõõõõ õ õ õÿôõõýôõþô õõõõõõõõõ-õ&õ(õõõ%õ&õ/õ@õBõSõaõjõxõ‰õ~õ˜õ‘õ£õ§õªõ½õ¹õÎõÏõãõßõûõúõö ööö$ö9ö-öIö=öaöNököYö{ölö…ösöföJö\öaö|ö}öšöö§öªö¾öÐöÛöêöñöüöúö÷÷÷6÷B÷N÷a÷Y÷n÷b÷r÷j÷s÷a÷Q÷E÷L÷@÷M÷;÷E÷2÷C÷2÷=÷+÷(÷!÷!÷"÷÷÷÷÷÷÷ ÷÷öýöñöñöîöáöàöÓöÄöÉöÂö¿öÀö½ö¼ö¸öºö²ö¸ö°ö´ö¸ö¬ö´ö«ö³ö¯öµö°ö¹ö·öÉöÁöÐöÏöÐö×öÙöÑöÛöËöÙöÐöÛöÛöàöãöèöãöèöìöéöööïöüöôö÷üö÷ÿö÷÷÷÷÷÷÷÷ ÷ ÷üö ÷þö÷ýö÷ñöÿöêöéöáöÚöÒöÓöÂöËö¾ö¹ö½ö¤ö¯ö˜ö§ö—öšö›öö™öˆö‘ö†ö‡ö‹öˆö‘ö“ö—ö öžöªö¦ö®ö´öºöÉöÈöØö×öåöåöøöóö÷ ÷÷÷,÷1÷A÷B÷T÷O÷_÷f÷r÷~÷€÷‘÷’÷ž÷Ÿ÷¦÷¨÷¯÷ª÷º÷°÷¾÷¿÷Î÷Î÷Þ÷Ú÷è÷ñ÷øøø6ø-øBø:øHøGø\øXøiørønø‰øtø‰øzøƒøŽøø–ø˜ø›ø¡ø£øªøœø®ø§ø°ø±øºø²ø¾ø³ø½ø±øµøºø¶øÉø½øÉøÁøÌøÏøØøäøáøíøêøïøüøûøùùù ù#ùù-ù%ù3ù>ù?ùLùLùKùTùVù]ùcùfùpùqùrùwùmùtùlùtùqùrùrùmùoùoù_ùqùYùdù_ù[ù^ùXùVùZùPùRùQùJùSùJùOùMùPùKùMùHùLùHùPùJùTùVùQùcùVù_ùZùeùaùjùgùrùiùpùrùmùtùrùxùxùzù„ùùŒù‚ùùƒù–ù†ùŸùŒù¤ùžù®ù°ù·ù¿ùÆùÏùÞùçùïùÿùúú!ú-ú6úAúWú^úwúzú•ú“ú¬ú¯úºúÈúÔúØúñúëúûûû ûûû!û(û)û7û1û6û=û/û8û5û3û9û5û7û:û:û8û@û5û?û;û@ûAûMûGûZûPû[ûYûSûgûXûlûaûmûhûnûmûoûmûiûoûnûlûrûpûhûtû[ûfûXûVûXûNûMûHûBû;û8û,û&û$ûû#ûûûûû ûûûûûûúûüúþúûûûûûûûû'û&û:û1ûTû<û`ûQûmûoû‚û—û›û¥û§û¯û¦ûÈû¹ûÐûÜûÔûðûìû÷ûëûìûçûèûëûëûÚûÜûÅûÏûºûÅû¯û¿û¬û±û¨û¦û¢ûœû¢û‰û–ûyû„ûvûoûkûdû]ûPûMû6û9û&û#û#û ûûôúûëúàúçúÆúØú¼úÀúµú±ú£ú¦úúŽú‡ú{ú{úsúmúgúfú\úPúKúAú?ú5ú4ú(ú(úú!úúúúúúúúùúöùðù÷ùÞùêùàùâùÝùÚùàùÏùÞùÊùÑùÈùÈùÉùËùÉùÏùÄùÏùÎùÈùÑùÄùÑùÆùÍùÇùÅùËù¾ùÂùÂù·ù¾ùºù¸ù¹ù¼ù·ù¿ù°ù±ù³ù¯ùµù³ù·ù¹ù¼ù¹ùÁù·ù¾ù¶ùÆù»ùÈùÈùÉùÏù×ùÏùÚùÝù×ùéùÚùëùéùéù÷ùæùöùëùøùóùúÿùúúúú úúùúýù úúúúÿùýùôùõùêùóùáùîùÔùêùÐùáùÌùÏùÆùÃùÂù¹ù¾ù¹ù´ù±ùµù¨ù­ù²ù¥ù»ù¦ù¼ù²ù¼ù¼ù¹ùÈù½ùÎùÌùÔùÛùÛùèùäùãùëùáùóùæùöùîùûùüùúùþùòùõùïùöùãùôùÝùãùÖùÓù¾ùÂù³ù´ù­ù¨ù£ù›ùŽùù|ù}ùuùqùkùmùbùcù[ùVùUùNùPùNùDùMù(ù3ù/ù&ù;ù*ù9ù)ù2ù/ù1ù9ù3ù2ù8ù(ù.ù&ù!ù*ùù.ùù)ùùù"ùù!ù ùù ùùùùýøùùùøùöøÿøùøúøüøïøìøÞøÞøéøÚøîøàøèøçøÖøÞøËøÚøÔøãøÜøãøâøâøìøëøìøùôø ùù ù ù ùùù&ù'ù&ù4ù,ù;ù:ù?ù>ùEù>ùKù?ùCùDù?ùDùHù5ùJù+ù9ù0ù.ù3ù'ù4ù ù6ù!ù-ù'ù-ù$ù&ù&ùù$ùù&ùùùùùùùùùùùù ù÷øüøùøþøùøùýøûøûøêøìøíøëøôøôøòø÷øùøòøùæøùøøøôøù÷øùôøùôøÿøõøùýø ùýø ùù ù ù ù ùùùùùùùùù ùùùùù ùùùùùùù ù!ù ù ùùùù!ù#ù)ù2ù-ù7ù6ùBùIùRù]ùaùfùnùwù€ù‹ù“ù©ù¤ùÁù»ùËùÎùÒùðùèùúúú,ú úKú/ú]úHúqúeú}ú|úˆúú”ú¤ú¦ú¸ú·úÇúÏúÙúçúíúñúôúñúíúÿúüú ûûûûûûû ûû%ûûûû+û/ûAûCûUû[ûnû}ûŽû—ûœûœûû•ûû‹ûyû{ûuû|ûnûuûgûjûWû_ûIûOûBû=û=û2û0û$ûûûû ûûùúíúêúÖúÒúÅú³ú¼ú¤ú­úŸú›ú˜úŒúŠú|úzúoúiújú\úhúOú`úKúRúAúCú3ú=ú)ú*ú%úúúú ú úüùúøùþùøùóùòùðùéùãùêùÛùéùàùâùßùæùÛùæù×ùãùÛùâùÛùêùÛùñùàùñùÞùíùåùðùëùõùñùõùýùïùþùëùþùðùúöùÿùùùùùúùïùöùèùñùìùçùëùáù×ùÜùÇùÑùºùÁù¨ù©ù–ù˜ùŠùˆù{ù{ùrùlùlù[ù\ùWùHùPù0ù"ùùûøõøÞøßøºøÃøšø§ø€ø‰øgøqøYø\øHøGø9ø5ø+øøøø ø øøøý÷ÿ÷ö÷ô÷ë÷ø÷ë÷ò÷ò÷õ÷÷÷øü÷ øøøøø!ø/ø4ø>øIøIø\ø`øsøˆø¡ø£øÇøÄøÕøÜøÝøæø÷øõøùùùùù ù$ù-ù,ù0ù2ù5ù/ù;ù/ùEù4ùEùEùCùEùCù:ùFù=ùIù+ù2ùù*ùù#ù(ùùù ù÷øúøßøâøÐøÈøºø¶ø¥ø«øšøœø“ø’ø‰ø…øøxøzøløvøføwøjøwøzøuø”ø‘ø±ø¯ø±ø¯øªøÀøÈøÛøÞøçøñøíø ùùøùùù#ù"ù)ù.ù-ù>ù@ùRùQù[ùcùjùyùƒù…ùšù”ù¢ù±ù°ùÂùÇùÑùÚùàùêùïùëùþùöùúú úúúú ú&úú/ú+ú:ú5úAúHúDúQúJúQúMú_úPúeú\údú\úhúZúeúWúbúXú^ú[úVúVúQúJúGúCú=ú?ú=ú2ú<ú*ú9ú-ú%ú-úú'úú$úú ú úúúúúúúúúúúúúú úú,úú5ú)ú3ú5ú1ú5ú/ú>ú3úAú;úAú?úAúCú?ú?ú;ú:ú9ú>ú9úBú6úDú4ú6ú9ú0ú9ú/ú6ú+ú6ú&ú7úú1ú ú0ú%ú$ú,ú%úú.úú"úúúúúúúúúúúúú$ú%ú0ú/ú;ú8úEú;úWúHúcúcúhúwúwúƒúŠú‰ú ú—ú°ú«úÀúÂúÒúÞúáúøúôúûûû&û2û9ûCûZûOûpûcû„û~û‘ûžû©ûÀû½ûÍûÍûÐûâûÞûöûüüü üüüüüüüüþûýûüêûõûÝûæûÙûÙûÏûÊûÂû¼û­ûªûŸû–û“ûû„û‚û~ûsûwûfûkûXûYûRûSûVûOûXûQûQûMûPûUûSû\ûWû]û_ûbûfûgûlûsûrûˆûzû“ûŠû›û›û£û©û®ûºû¿û¿ûÖûÊûðûìûüöûüüûü üüü*ü)ü)ü"ü&ü ü3ü-ü3ü5ü%ü(üüüüüü üüþûüûøûïûîûÙûßûÖûÐûÔûÁûÊûºû½û³û«û¤û•û›ûŠû‰û…û|ûvûvûiûiû`û^ûYû]ûPû]ûPûWûLûXûHû^ûNû]û\û^ûiûpûgû{ûsû„û‰û’û›û­û²ûÉûÑû×ûåûîûü ü&ü-ü6üGüKü\üeüoüü~ü˜ü‘ü°üªü¿ü¾üÎüÒüáüãüîüøüþüýýýýý#ý&ý,ý;ý:ýFýFýLýMýTýPý^ý]ý\ýeýfýcýwý`ý~ýjý‚ýwýýƒý‡ý‹ýý’ý“ý˜ýšýý¨ý›ýªý£ý¤ý§ý—ý–ý‚ýýƒýxý‡ývýƒýqýyýjýsýcýiý^ý_ýMýKýGý4ý?ý(ý7ýý'ýýýý ý ýùüûüóüìüòüàüèüÜüÚüÛüÑüÎüÒüÎüÓüÍüÓüÉüÜüÎüãüØüåüÛüëüàüñüîüñüøü÷üöüýøüýýýýýý"ý ý!ýýý#ý"ý!ý,ý$ý0ý'ý*ý.ý&ý2ý,ý9ý4ýAý9ýAý=ýBýFýKýNýSýWýYýYý_ýWýaý\ýfýdýmýfýqýmýmýtýfý{ýlýyýuýpý~ýiý|ýeýnýaýiýZýiýVýYýQýJýNý9ýEý,ý(ýýý ýýøü÷üêüØü×üÎüÆüÆü¼ü´ü™üœüwüücü^üOüBü;ü3ü*ü(üüüüüüÿûöûüûýûúûüû÷ûùûüüüüüü'ü.ü)ü1ü:ü<üIüRüTüeüYüxübüvüoü„üzüü‰ü’ü•ü“ü¡ü¢ü®ü°ü²üµü¶ü½ü¿üÊüÈüÍüÆüÚüËüàüÙüçüëüêü÷üìüõüòüþüüü ýýý ý#ýý"ý#ý!ý3ý#ý:ý)ý9ý0ý6ý,ý4ý,ý2ý5ý1ý:ý/ý9ý1ý6ý-ý3ý+ý4ý)ý1ý)ý+ý)ý-ý#ý6ýý6ý)ý-ý;ý+ýEý-ý=ý/ýCý4ýLý<ýOý@ý\ý<ýWý=ýWýBýVýLýMýTýIýQýHýCýIý@ýEý:ý<ý3ý-ý,ý.ý.ý!ý"ýýý ýöüøüäüÉüÆü£ü¢ü˜ü™üŸüœüšüœüŠü˜üŠüŸüüžüwü€üjü{ülü|üiücühü]üvümü{üvüyüoühüoühüküpüfüjüWüYüOü>üGü1ü2ü&üüüüùûòûßûÖûÉûÁû·û«û¨û“ûžûŠûûûyû…ûtû~û€û{ûzû}ûmûuûmûzûyûû‚ûŒû‘û˜û—ûœû¤û¡û°û®û´û°û»û·ûÅûÀûºûÀû¿ûÌûÒûÖûâûÖûïûÜûïûêûðûîûøûëûôûêûùûäûéûÞûãûÚûéûÎûÜûµû¼û¡û°û‰ûžûfûqûMûXûYûFûMûCû9û(û0ûû+ûûûûûæúüúîúîúòúûûú û ûûûûû'û&û)û.û0û*û:û*ûCû1ûDû=ûBûJûHûOûUûXû^ûfûrûwûqû‰ûpû–ûyûûƒûpûoûiûrûcû{ûgûzûmûfû]û]ûTû`û^ûXûaûeûoû|û‡ûû”ûšûœû©û¢û³û˜û´û‹û«ûû û“ûœûŽûû‰ûžûŠû û û´û´ûÜûãûüü$ü1ü3ü9üDüQü]ü_üsüqü{üˆü‡ü—üü®üžü¯ü­ü¯üºü·üÊüÅüÔüÏüÛüãüçüëüôüðüþüøüýýýýý&ýý,ý+ý/ý0ý<ý4ýAýAýGýWýTýcý_ýcýhýoýoývý{ýý„ýŠýƒýŽý‰ýŽýšýýŸýšý™ý£ýýŸýý›ý”ýœýýžýŽý”ýýŒý‚ýˆýuý‡ýpýyýpýiýoý`ý`ý]ýQýSýNýJýHýCýBýFý7ýGý3ý<ý8ý7ý7ý1ý=ý*ý0ý$ý0ý'ý1ý,ý0ý1ý'ý1ý"ý'ýý!ý ýý&ýý)ý ý(ýýýý ýý ýý ýúüýüüóüùüñüïüîüæüíüàüïüÑüáüÖüÐüáüÄüßüÀüØüÂü¶ü·ü¤ü£ü¦üŒü—üzüüjüiüUüHüFü1ü2ü*üüüÿûýûìûàûÖûÇû¼û²û­û›ûœûŽû‡û€û{ûyûlûpûeûcû^ûSûSûDû?ûEû3û8û6û$û3û"ûûûûûûûûúú ûüúüúõúõúéúñúêúäúêúáúçúàúßúÜúÙúÚúÔúÖúÍú×úÉúÎúÅúÁú¹ú¼úµúµú¼ú¯ú°ú°ú¢ú¬úžú§ú¢ú£úªúŸú¯ú¢ú­ú¡ú§ú£ú©ú¥ú®ú¥ú¶ú úÀú úºú¥ú³ú©ú°ú®ú¦ú±úú¨úžú™ú¨úú¡ú˜ú•úžú‘ú“ú•ú‡ú›ú‡úúŽú›úú¡ú¤ú£ú©ú£ú´ú§úºú³úÆú¾úÎúÈúÍúÒúØúØúñúáúüúóúýúûúúûûûûû-ûû:û$û:û0û=û@ûBûOûFû[ûNûiû_ûgûoûgûvûuû~û‡û…û’ûûûŸû˜û¬û£ûºû³ûÊûÆûÒûÕûÑûèûÝûôûëûüúûüüüüü ü(ü4ü.ü:ü*ü<ü#ü3ü'ü"ü'üüüü üüöûôûÜûçûÃûÏû³û¯ûªû•û¡û€û‹ûwûuûoûbûhûVû^ûLûJû?û9û<û,û4û)û(û*ûû$ûû û ûûûû ûû ûûûýúûúûõú ûøúûûûûþúûùú ûÿú û ûûû ûû ûû û&ûû!ûûûûûûû,û$û4û/û<ûCûCûGûCûPûLûSûXûVû[ûbû^ûrû[ûvûdûvûrûxûûtû„ûtû{ûyûwûwûuûrûrûqûnûpûeûqû`ûqûaûkûdûhû`ûaûWûUûTûLûSûEûTûBûKû>ûBû1û:û,û.û'û#û"ûûû ûûþúÿú÷úûúêúöúÞúëúÝúÚúæúÌúçúÖúãúáúéúæúïúíúëúýú÷ú ûûûû%û%û1û/û>û>ûJûNû[û\ûkûmû|ûsû‡ûûû”û˜û û¡û©û­û¯û®û»û¹û¿ûÌûÁûÖûÊûÖûØûÐûßûÑûãûØûæûàûæûâûÞûÛûÞû×ûàû×ûÖûÞûÑûáûÍûÙûÊûÔûÈûÖûÆûÐûÆûÉûÃû¿û¹û¹û¯ûµû«û±ûûªû•û›û“û‘ûû‡û„û‚û}û~ûtû{ûfûmûhû`ûmû]ûnûbûfûdû]ûcû\ûcû\ûgû^ûkû]ûhû_û`û`ûfû^ûdûdû\ûiûXû[ûZûHû^ûBûRû>ûEû;û:û5û*û.ûû(ûûûûûûûûûûûüúþúûúúúõúðúðúÜúìúÒúßúÕúÍúÓúÀúÂú¹ú¤ú®ú”ú™ú‹ú…ú|úqúiú^úYúNúGú4ú(úúú úúúÛùÕù¿ù¼ù²ù¶ùŸù’ù†ùgùlùPùNùBù2ù-ù$ùùùù ùúøöøøøíøîøâøçøÛøÜøàøÒøàøÔøÛøÚøÓø×øÚøäøÙøäøÕøÛøÙøØøåøÜøåøåøäøÝøãøÔøÞøÑøÕøÔøÕøÍøÕøËøÖøÂøÕøÂøÎøÖøÏøßøÏøÔøÑøÍøÔøÑøÛøÒøâøÚøéøàøßøØøÛøØøåøÕøßøÎøÉøÈø¶øÂø¯ø·ø´øªø´ø¤ø®ø¡ø¢ø›øŒø“ø}øƒøvøløqøgøgøaøWøZøLøTøAøPøBøHøKø@øMøDøJøMøSøLøeøWøbøfø_øjøjøvømø„øtøøƒøzø~øtøqøtøsørøzøvø~ø}ø}ø~øtøƒøvø‚ø‚ø|ø‰øyø‰øwøŠø„ø†øŽø…øø‚øˆøƒø‚ø‰ø‡ø‹øø‡ø€øˆø…ø‰ø€ø…øoø{økøqøqøoøuøjøsøførøløkøiøjøaøløYøgøOøYøQøLøRøHøKøGøGø@ø=ø8ø5ø-ø6ø#ø5øø(øø#øøøøøøù÷ÿ÷û÷ô÷ô÷à÷ç÷Õ÷æ÷Í÷Ý÷Æ÷Ï÷Æ÷¿÷Ç÷²÷¿÷®÷µ÷­÷§÷¬÷¢÷¢÷÷›÷˜÷–÷ž÷÷˜÷÷Œ÷‹÷„÷ˆ÷÷÷w÷y÷p÷v÷^÷t÷X÷g÷Z÷\÷P÷G÷V÷=÷K÷1÷B÷,÷8÷(÷÷þöööîöíö÷öêöðöÙöÒöØöÐößößößöâöÍöÑöÎöÐöÒöÙö½ö×ö½öÛöËöÛöÏöÙöØöàöêöãöîöàöðöçöêöòöàöîö×öïöàöéöèöêöçöïöòöïöÿö÷öúö÷öôöñöùöðöõöðöéöéöéöìöéöëöðöéöìöèöÛöØößöØöàöàöÛöçöÝöèöáöéöãöèöèöéöàöëöÙöîöÝöîößöèößöèöçöçöåöãöáöÚöÚöÏöÜöÇöÜöÉöÓöÃöÍöÁöÃöÀöºö¿ö³ö¸ö¯ö®ö±öŸö¥ö˜ö˜öœö•ö•ö–öˆöšö„ö öƒö™öŒö‘öö‘ö“ö•ö–ö™ö•ö•ö“ö”ö†ö›ö„öööqöxönö€özö~ö€ö|ö‚ö…ööˆövöxö}ö{öyöƒöröˆö|ö„ööƒö|özöö{öŠöˆöŽöŒöŒööˆö„öö‡öörösö`ökögö}ötöö}ö—öö©ö¦ö²ö¸öºö¼öÄöÃöÓöÉöÞöÝößöãöåöëöìöòöóöõöÿö÷ö÷òö÷ôö÷þö÷÷÷÷ýö÷÷ýö÷þö÷÷÷ ÷ ÷÷÷ûö÷éöõöÞöåöÝöÛö×öÌöÒöËöÒöÎöÏöÓöÈöÔöÀöÆö³öÂö¹öÀö¾öÁöÃöÁöÌöÅöÒöÃöËö¼ö½ö°öºö­ö¹öžööö“öö–öšöŽö“ö{ö{öwö‚ö~öö†ö“ö•ö‘öžööŸö ö¡ö ö¡ö ö£ö¤öœö®ö˜ö¨öŸö£ö£ööžöŸö•ö¢öö öŽöžö˜ö˜öšööšöö’öŒö…ö{önökököbösöböiö`öRö_öRöeöWöcöNöTöBö>ö5ö=ö-ö7ö.ö1ö5ö@ö:öRö9ö]öDöcöWödöeö^öoödöoöjöröuörözöxöwöƒöyöö€ö~ö€öˆöƒö…ö‘öö‹ö†ö~ö~ö„özö…ö€ö‡öŒö‡öö€ö’ö‚ö”öŒöœö’öžö˜ö™öŸöžö«ö¥öªöªö¨ö²ö§ö·ö£ö«ö¬ö§ö«öªö¥ö¯öŸö¶ö–öªö•ö¥ö›öªö ö£ö¯öŸö­öö–ö’ö˜öö˜öšö…ö™ö†öŒö•öö”öƒöŒö†ö‚ö…ö}ö}öxöxöxöpöröqömöoöiögö]ödöZö^ö\öSö]öQöXöQöLöIöFöFöCöCöBö>öCö=ö6ö@ö)ö@ö-ö6ö.ö,ö)ö#ö+öö#ö"öö*öö&ö#ö!ö"ö!öö!öö öööö$öö!ööö$öö&öö+öö.öö)ö ö+öö2öö4ö!ö,ö*ö%ö(ö)ö$ö+ö&ö-ö!ö1ö ö-öö,öö/öö1ö#ö)ö*ö#ö$ö'ö ö+ö$ö#ö'öö&ö!öööööööö"öö ö öö ööööÿõöÿõööýõÿõÿõöõýõõõ÷õïõõõëõóõéõòõàõóõâõçõêõßõéõâõáõäõÚõèõÔõêõÐõìõÏõçõÒõßõÚõÑõäõÎõÞõÚõØõáõÙõáõÚõéõ×õíõÚõêõâõæõçõäõíõåõíõíõíõìõðõéõùõçõ÷õïõôõöõñõûõíõöîõöõõûõüõôõöõõöõõöýõöþõþõöþõÿõþõþõìõúõìõÿõìõüõòõõõùõõõúõóõîõðõñõïõðõ÷õèõùõëõðõðõåõôõäõóõèõñõæõñõàõòõèõëõîõáõöõÙõ÷õÕõíõËõÜõÎõÛõÓõÚõØõÕõÔõÏõÄõÏõÇõÍõÏõÊõÒõÊõÒõÒõÒõÙõÓõÚõÑõÓõÕõÌõØõËõÏõÀõÃõÈõÁõÎõÆõÎõÐõÊõÎõ¹õÑõÀõÐõÏõÌõÙõÌõåõÔõæõáõèõéõçõæõîõéõðõçõêõÐõÜõÖõàõàõìõåõìõèõëõêõùõðõÿõþõýõööö ö öööööööööö%öö!ööö%öö)öö)öö#ö%öö'öö%ö ö&öö+öö&ö!öö#öö#ö!öö'öö%ööö)öö(ööööööööö!öö'ö ö#öööööööööööööööö öö öööööööööööö!öö ö%öö*öö)ö!ö'ö'ö&ö+ö$ö/ö&ö.ö,ö)ö3ö,ö-ö6ö(ö:ö*ö8ö/ö8ö4ö3ö9ö2ö;ö1ö=ö3ö@ö2öCö1öCö5ö<ö?ö4öEö5öBö<ö>ö:öCö6öHö9öAö=ö>ö@ö9öCö8ö@öFö>öBö?ö>ö6öEö3ö?ö6ö-ö+ö.ö*ö'ö2ö$ö.ö*ö%ö)öö,öö'ö&öö'ö ö(ö"ö&öö#ööö!öö#öö$öööööö!öö#ööööö"öö*öö)öö.öö8ö%ö5ö5ö+ö@ö*öAö3ö<ö9öBö:öFö<öEö@öGöBöKöBöLöDöRö@öTöBöUöIöOöSöLöSöOöQöRöUöLö[öQöVöVöUöRö`öLö`öPö^öSö^öTö\öYöVö`öRöböVö[ö\öXö\öYö^öVö\ö_öSöföQö\ö_öSö_öXöYö]öSöböOöeöMö`öRö\öTöZöTöZöOö]öLö^öOöWöRöUöSöOöVöHö[öHöTöRöKöVöMöRöRöTöRöVöQöSöUöMö[öNö^öTö_öVö_ö]ö^öbö^ögödöjödöqöcösögöpöpöpöxöoö|örö‚öqö†öuöö…özöö€ö‹ö‹öö—ö|ö¢ö}ö öŠö–ö”ö“ö‘ö—öö˜ö”ö•öžö–ö£ö™ö¢öžö¢ö¡ö¦ö¤ö©ö©ö¦ö²ö¦ö±ö¥ö±ö¦ö³ö«ö®ö²öªö³öªö³ö®ö·ö®ö¼ö³ö½ö¶ö¾ö²ö¼ö¹ö¼ö½öºöÃö½öÇöÂöÃöÄöÀö¿öÅö»öËö½öÄöÂö¾ö¿ö¾öÁö»öÃö¾öÁö¼öÄö¹öÂö¸ö»öÀö·öÃö»ö½öÃö´öÈöµöÂö½öÃö¿öÅöÇöÃöÕö¼öÖö¼öÕöÅöÔöÊöÒöÔöÑöÛöËöÛöÐöáöÖöåöÛöåöáöèöÞöìöàöðöçöíöôöëö÷öõöïöôöøöòöþöúöûö÷÷ýö÷ýö÷÷÷÷ ÷÷÷÷÷÷ ÷÷ ÷ ÷÷ ÷ ÷ ÷ ÷ ÷ ÷÷ ÷÷ ÷÷ ÷÷÷÷÷÷÷ýö÷÷÷÷þöçöåöäöÙöæöÎöäöÕöáöÚöãöÙöÝöÜößöáöèöâöïößöùöæöùöòöñö÷öéöìöçöíöàöîöÕöåö×öâöÝöçöÞöàöÜöÛöÜöÏöèöÏöôöÞöòöøöïö ÷òö÷÷ ÷ ÷÷÷ ÷÷÷÷÷÷÷÷÷÷$÷÷&÷÷$÷÷"÷÷!÷%÷÷&÷'÷÷'÷÷ ÷!÷ ÷%÷"÷*÷#÷/÷!÷&÷÷%÷#÷÷%÷÷÷÷ ÷÷÷÷÷ ÷÷÷÷÷÷÷÷÷÷÷÷ ÷÷#÷÷"÷÷÷ ÷÷ ÷÷÷÷"÷÷"÷÷$÷÷(÷÷$÷ ÷$÷÷"÷÷÷&÷÷)÷÷+÷÷(÷÷%÷÷(÷÷,÷÷+÷÷'÷"÷÷'÷%÷'÷*÷,÷+÷1÷1÷,÷3÷-÷0÷3÷1÷:÷2÷6÷5÷7÷7÷5÷:÷7÷<÷<÷=÷=÷B÷>÷?÷@÷=÷D÷>÷G÷A÷F÷H÷C÷G÷?÷E÷E÷E÷H÷H÷H÷J÷K÷E÷W÷<÷W÷C÷Q÷P÷J÷X÷H÷W÷J÷K÷V÷D÷[÷K÷U÷P÷U÷P÷V÷N÷U÷X÷N÷e÷M÷g÷L÷i÷I÷e÷O÷`÷X÷Y÷_÷]÷`÷h÷^÷f÷_÷f÷c÷i÷b÷k÷^÷p÷Z÷h÷c÷^÷m÷]÷f÷g÷a÷k÷c÷`÷a÷b÷_÷j÷]÷p÷[÷q÷a÷f÷f÷_÷g÷_÷l÷^÷r÷c÷n÷m÷k÷m÷q÷i÷x÷h÷}÷j÷÷n÷~÷s÷w÷€÷v÷€÷|÷z÷|÷v÷o÷w÷c÷{÷b÷~÷r÷€÷{÷†÷w÷ˆ÷÷ˆ÷Œ÷†÷÷Š÷÷–÷Œ÷–÷Ž÷–÷•÷—÷›÷—÷¡÷—÷›÷ž÷÷§÷‘÷§÷š÷¢÷ž÷¢÷÷¦÷›÷¥÷ž÷£÷ ÷«÷œ÷±÷ž÷®÷¡÷¨÷¤÷£÷¤÷¥÷§÷©÷¡÷¨÷Ÿ÷¢÷¥÷¡÷¨÷¥÷¦÷¨÷¦÷¨÷¦÷Ÿ÷¨÷Ÿ÷ª÷¡÷©÷¢÷©÷¥÷¥÷¥÷¥÷¢÷­÷Ÿ÷°÷ ÷³÷ž÷¶÷œ÷®÷¦÷ª÷°÷¨÷´÷«÷´÷µ÷¯÷¸÷´÷·÷¾÷¼÷À÷È÷Å÷È÷Ð÷Ä÷Ö÷Ò÷Ñ÷Ù÷Þ÷Ò÷ê÷×÷ã÷Ü÷æ÷Ý÷ê÷ä÷ì÷î÷í÷ó÷ï÷ò÷ô÷ï÷ÿ÷ï÷øö÷øøü÷øÿ÷û÷øõ÷øøøøþ÷øøø øø øø øøøø øø øøøøøø#ø øø%øø&ø'ø)ø+ø1ø,ø3ø.ø1ø4ø6ø9øAø5øJø8øJø@øHøBøMøEøPøKøNøNøSøOøSøMøWøKøYøXøQøeøQøcøZøXødøXøcø_ø]økøXørøWøjø^øhøløhøsømøtørøtøsønøølø‡øuø†ø~ø†ø„ø†ø„øŒøƒø—ø„øšø‹øšø–ø–ø˜ø™ø ø™ø¦ø˜ø§ø¢ø¢ø ø£ø¢ø¤ø¢ø®øœø·ø ø­ø­ø£ø©ø¨ø¦ø±ø¦ø´ø«ø¹ø­ø¹ø©øÁø¨øÈøªøÅøµø½ø¿ø´øÀø´øÂø¹øÅø·øÍøµøÌø¾ø¿øÉø½øÈøÆøÃøÏøÂøÐøÄøÍøÆøËøÍøÇøÎøÑøÅøÚøÂøÒøÉøÆøÔøÂøÕøÊøÎøËøÓøÇøÐøÇøÎøÈøÎøÄøÕøÁøÓøÅøÅøÎøÁøÌøËøÊøÎøËøÍøÐøÊøÒøÊøÍøÖøÇøàøÈøÞøÐøØøÔøØø×øÞøÕøâøØøçøÛøéøØøéøáøâøðøäøïøëøíøêøñøãøóøðøéøýøèøüøïøùøîø÷øîøöøøøóøùñøùõøùüøùùùùù ùùùùù ù ùù ùù ùùùùùùùùùùù$ùù#ùù ùù#ùù%ù"ù%ù!ù*ùù!ù&ùù2ùù(ù!ù#ùù*ùù-ùù&ùù#ù ù"ù"ù%ùù!ù ùù'ù ù'ù ù,ù"ù$ù,ùù4ù"ù-ù1ù$ù9ù+ù7ù+ù6ù/ù3ù=ù2ùAù8ù=ù>ù;ù=ù@ù:ùIù9ùNù?ùIùIùCùKùHùOùFùWùEùYùMùZùNùVùQùWùWùVù\ù[ù\ù_ùYùbùYù_ù`ùdù_ùlù\ùrùZùsùVùsù\ùjùgùhùgùhùkù`ùoù^ùoùcùpùaùsùbùsù]ùmùdùcùmù_ùsù]ùvùaùnùjùeùpùeùsùfùnùrùbù}ù[ùuùgùjùoùhùrùlùpùpùiùvùbù|ùbù}ùgùyùlùvùmùvùgùwùmùqùrùtùqùtùwùpù{ùuùwùùwù~ù‚ùwù‹ùwùƒùùù€ùƒùƒù…ù‹ùù”ùzù“ù‚ùù‹ùŠù“ù‹ù“ùùŽù•ùùžùù¤ù’ù¥ù™ùžù›ùœù˜ùœùœù›ù›ùù¡ù›ù¢ùŸùœù¦ùŸù«ù¢ù±ù™ù´ù˜ù®ù ù«ù¢ù§ù¢ù§ù§ù¤ù¥ù£ùžù¥ù¢ù¡ù¢ù¤ùžù¬ùŸù¨ù¥ùžù¨ù™ù§ùœù¥ù¢ù¢ù£ùŸù£ù¢ù©ù ù³ù¡ù±ù©ù­ù­ù§ùªù¯ù¥ù¶ù¦ù¶ù¥ù¶ùù¸ùùµù±ù¯ù¸ù®ù°ù«ù¬ùù­ùù¦ù›ùœùù–ùù–ùùœù•ùùùrùkùcùdùdù\ù]ù]ùUùhù\ùoùuùù„ù‚ùŠù|ù”ùŒùžù¤ùù°ùœù´ù«ù²ùÁù·ùÂùÇù½ùÌùÆùÉùËùÍùÒùÐùÖùÖùÕùØùÖùÖùÊùËùÀùÇù»ù¾ù¿ù»ùÁùÀùÅùÅùÂùÈù¿ùÉùºùÃù½ù¯ù²ùù°ù¢ù¬ù¨ù«ù³ù²ù¼ù¸ù¶ùºùÁù½ùÈùÁùÁùÉùÁùÎùÈùÉùËùÉùÑùÆùÖùÈùÙùÓùÏùÔùÏùØùÛùØùéùÝùèùíùåùìùêùìùïùóùïùùùôùûùóùúñùúüùúúúú ú úúúú úúúú úúúúúúúú úú(úú)ú$ú(ú%ú'ú)ú+ú0ú/ú5ú1ú3ú8ú)ú?ú.ú=ú6úEú7úJúAúAúMú=úTúDúQúKúNúNúHúPúDúOúGúJúNúKúOúKúSúLúQúLúUúKúaúLúbúNúcúPú\úSú[úRúgúKúuúNúpúXúbúXúaúVúYúSúIúUú>úVúGúJúJúBúDúEúAúDúBú7ú9ú<ú<úKúBúLúIúRúTúZúUúSúBúFúFúBúNúFúMúIúIúDúBúLúEúXúJú\úNúgúSúsúfútú{úxú‚ú…ú‰úŠúúúú˜úŽúú˜úŸú¢ú ú¥ú¥ú ú¦úŸú¦úŸú°úœú¸ú§ú­ú·ú ú¹ú­ú°úºú¯ú¹ú±ú»ú®ú½ú¯ú»úµú¿ú³úÇú°úÉú¶úÀú¼ú·úÃú»úÄúÂúÆúÃúÇúÇú¾úÐúÃúÎúÉúÑúËúÔúÐúÐúÙúÎúÜú×úÒúâúÒúàúÛúÙúÛúÙúÙúàúÙúåúÚúéúÜúîúØúñúÝúîúçúîúéúïúðúïúöúïúóúùúíúþúõúúúûúúûûûû ûûûûûûû û ûûûûûûûûûûû ûûû"û#û!û(û'û(û(û-û+û,û4û+û8û/û9û5û3û:û6û<û<û?û=ûDû<ûKû?ûIûEûKûIûLûJûSûNûPûTûKûYûNûXûUûWûWû^ûYû^ûaûYûeû[ûgû\ûjûaûhûjûcûkûiûoûkûuûgû|ûlûwûuûsûqûzûtû{ûwû{ûxû‚ûvûƒûyûû~ûû„û~û‰ûû‰û…ûûŒûƒûŠû†ûŽûŠûûûŠûûû‘û“û‘û˜ûû—û˜ûû£ûŠû£û•ûû›ûŸûšû£ûžûû¤ûœû§ûŸû¢û¨û¥û«û¨û©û«û¨û¯û¨û±û¯ûµû­û½û­û½û·û¼ûÉû½ûÌû¾ûÉûÂûÌûÅûÍûÇûÌûÐûÏûÓûØûÒûÞûÔûÝûÚûÜûäûØûíû×ûïûâûéûåûíûèûðûìûõûêûùûìûòûöûêûüêûüòûÿûûûÿûúûýûýûýûüûûüúû üþû üüüü ü ü ü ü ü ü üüü üüü üüüü üüüüüüüüüü üüüüüü ü!üü%üü&üüü*üü1üü1ü!ü*ü2ü'ü.ü.ü)ü3ü(ü5ü%ü;ü'ü6ü4ü+ü?ü)ü>ü0ü6ü8ü9ü5ü<ü6ü>ü=ü<ü?ü:üBü@ü>üGü>üJü>üJü>üLüCüHüIüLüFüSüFüPüNüJüTüHüUüNüSüUüSü[üRü[üUü]üZü`ü[üaü`ü_ühüZühü`üfüfühücümüeüküeümücüpühüoükürüiütüoülüuümütütüsüwüuüyüuüzüqüülü…ürü~ü{ü|ü|ü{ü}üzü…üyü„ü~üü†ü{ü‡ü}üƒü…üü‹üüŽü„ü‰üŒü„üŠüŽü„ü–ü†ü•üˆü•üŠü‘üŽüŠü“üüü”ü‹ü˜üü‘ü•ü’ü—ü”üšü—ü¡ü•ü¨ü“ü§üü¤ü¦ü«ü ü¸üŸü»ü¨ü³ü¯ü´ü­ü¾ü­üÂü´üÀü¹ü¼ü¹üÂü¶üÉüºüËüÁüÅüÄüÁüÅüÁüÄüÈüÀüÏü¿üËüÈüÆüÎüÎüËüÔüÊüÓüÎüÔüÏüÉüÅü¾üÄüÄüÀüÊüÄüÇüÏüÅüÓüÄüØüÉüÕüÍüÔüÏüÕüÎüÖüÔüÔüÒüÕüÔüØüÔüØüÑüÔüÉüÒüÍüÔüÑüÔü×üÖüÚü×üÕü×üÖüÚüÓüáüÑüãüÓüÞüÜüØüâüÚüàüàüßüåüÞüæüÙüäüáüÞüéüßüêüäüëüæüêüæüäüïüãüòüêüîüíüðüëüðüìüñüðüõüðüöüôüûüùüùüøüüüÿüûüýùüýùüýûüýþüýýýý ýý ýýýý ýýüýþüýýý ý ýýý ýýýýýýýýýýýý ýýýýùüõüðüôüîüòüñüîüöüèüûüêüëüìüíüõü÷üùüýúü ýüü ýý ýý ýýûüýúüýûüöüÿüìüùüöüúüýüýüýýýý ýýýýýýýýýýýý ý!ý"ý%ý#ý&ýý-ýý2ýý/ýý0ýý9ýý<ýý;ý ý9ý(ý3ý-ý/ý0ý*ý3ý*ý2ý-ý3ý*ý8ý)ý7ý0ý.ý8ý,ý9ý.ý;ý0ý<ý4ý7ý9ý6ý:ý9ý<ý;ýAý@ý?ýBý=ý?ý@ý?ý;ýCý@ý:ýGý2ýHý5ýHý;ýLý9ýPý;ýOýBýHýBýJýBýHýDýLýGýOýEýHýAý:ýAý4ýCý8ý=ý8ý<ý9ý@ý:ýBý:ý<ý;ý5ý8ý/ý(ý3ý%ý1ý2ý1ý=ý:ý?ýGýEýFýHýKýIýQýGýVýFýWýHýXýKýWýJýZýOýZýUýXý]ýVý^ýVý\ý\ý[ýaýZýcýYýgýTýdýYý`ý]ýgýZýmý[ýjýdý\ýnýYýmýbýiýdýlýbýlý`ýpý`ýpýgýkýnýkýnýkýqýgýpýlýoýpýpýmýwýiýtýhýqýnýsýnýsýoýrýpývýoýnýwýiýzýrýpýzýnýyýpývýrýtýuýqý{ýqýwývýoýwýxýpý~ýtýwý~ýpý€ýtýsýyýpývýyýsý{ýxýxýxýwýtýyýsýyýtýzýxýtý}ýpýýsýýtý€ý{ýzýýxý|ýwý|ý{ýzý‚ýwý‰ýxý†ý|ý~ýƒý|ý…ý}ý…ýýƒýˆý}ý‰ýý‡ý‡ý€ýýýý„ýŒý…ýŠý‰ýˆý‡ýý†ý‘ý‹ýýŒýýŒýýýý’ý‘ý“ýý”ý‡ý“ý…ý”ýŒý“ý’ýý•ý’ýý™ý‰ý›ýý“ý›ýŒýœýý˜ýýý‹ý›ý’ý“ýžý‰ýŸý‰ý›ýŽý˜ý–ý’ýžýý ý•ýœý’ýžýŒý¦ý…ý¥ýŽýžý–ý™ý‘ý™ý—ýý¦ýŠý¦ý•ý™ý¥ýý¦ý“ý¤ý˜ý ý¦ýœý©ýœý¢ý£ýŸý¦ý¢ý§ý¥ý¦ý¥ý§ý£ý¦ý¥ý¢ýªý£ýªý¥ý¨ý§ý¨ý¢ýªýžý­ýý­ý¡ý¯ý¥ý¨ý«ý¢ý¬ýŸý­ý¡ý°ýý¯ý¥ý¥ý¬ý¡ý«ýªý¨ý¬ýªýªý­ý©ý¦ý©ý£ý°ý¥ý±ý©ý®ý°ý¯ý§ý·ý¢ý»ý¨ý´ý´ý­ý¶ý²ý°ý³ý¯ý°ý±ý®ýµý°ý³ý·ý¨ý¾ý¦ý¸ý³ý¯ý»ý¬ý¸ý°ý²ý±ý®ý°ý³ý­ý¹ý®ý´ý´ý³ý¯ý¶ý©ýºý¯ý¶ý´ý¶ýµý½ý¬ý¿ý©ýÀý«ýÀý¬ý¿ý³ý»ý³ýµý¶ý¸ý³ý»ý·ý¹ý¹ý¸ýºý·ýµý½ý³ýÅý¯ýÉý²ýÈýºýÁý»ý¿ý¿ý½ýÄý¾ýÃýÂýÂý¿ýÂý½ýÇý¿ýÆýÃýÉýÂýÊýÃýÇýÅýÉýÃýËýÆýËýÎýÅýÕýÃýÒýËýÌýÐýÐýÎýÕýÌýÔýÊýÎýËýÎýÏýÊýÕýÇýÙýÈýÕýËýÔýÐýÌýÜýÃýáýÈýÔýÖýËýÚýËýØýÏý×ýÖýÖýÙýÖýÕýÓýÕýÕýÑýÙýÑýÙýÑýÚýÐýÓýÕýÏýÖýÓýÕýÒýÝýÌýÜýÌýÖýÒýÓýÖýÔýÓýÙýÑýÓýÒýÒýÓý×ýÐýØýÓýÙýÔýÙýØý×ýÖýàýÓýåýÔýÞýÜýàýÝýâýÝýåýÞýäýçýåýõýíýðýëýèýòýäý÷ýëýíýðýâý÷ýÛýüýÖýúýÞý÷ýïýüýíýþýäýÿýâýþðýôýôýòýøýùý÷ýøýõýôýýýÿýþýûýúý÷ýùýôýøýôýóýñýúýòýòýóýòýñýøýóýþìýþðýþÿýþþýýþòý þùýþþþ þþþþþ þþþþ þþþþþýþþþ þþþþþþúý þøý þþþþþþþþýþþ"þþþþþþþþþþþþ þþþþþþþþþþ þþþþþþþ þþþþþþþ"þþ þþþ%þþ&þ"þ"þ+þ þ%þþþþþ"þþþþþþþþþþþþ þ þþ)þþ+þ#þ+þ þ'þ+þ"þ1þ!þ)þ"þ(þ)þ(þ/þ)þ+þ1þ&þ-þ!þ'þ!þ*þ%þ*þ&þ.þ%þ2þ)þ.þ3þ(þ:þ"þ@þþ=þ#þ4þ)þ3þ.þ.þ4þ3þ/þ8þ.þ0þ/þ.þ0þ2þ3þ,þ6þ5þ0þ3þ,þ,þ5þ-þ,þ3þ-þ1þ0þ5þ.þ4þ8þ1þ=þ7þ8þ@þ9þ>þ6þ:þ;þ1þGþ-þFþ3þ@þ0þ?þ%þBþ+þ?þ8þ6þ@þ0þ>þ.þ7þ7þ6þ9þ1þ<þ4þ>þ:þ>þ;þ>þ:þ;þ@þ7þCþ6þ?þ7þ3þ>þ.þEþ1þCþ6þ@þ;þ?þ9þ=þ6þBþ8þAþ:þEþ8þNþ:þCþDþ;þGþ>þFþ?þFþBþ=þ=þ6þ<þ7þ<þ<þ9þAþ<þ9þ?þ2þ<þ9þ3þDþ,þCþ+þ9þ+þ2þ0þ6þ+þ=þ+þ)þ(þþ#þþþþþþþþþþþþ þþýþ÷ýïýõýùýþþþþþþ'þþ3þþ;þ&þ5þ'þ2þ*þ8þ2þ;þ9þ=þ;þJþ5þOþ8þLþ>þKþ:þEþ)þ2þ$þ'þþ'þþ"þþ þ(þ!þ5þþ@þþ9þþ8þ%þ9þ*þ+þ"þ!þþ,þþ8þþ6þ)þ,þ1þ-þ<þ-þ<þ6þ0þ:þþ%þþþþ þþ+þþ1þ)þ<þ7þ<þ?þ=þBþ>þFþ;þNþ8þRþ:þOþ@þNþDþLþIþGþQþCþKþHþGþTþCþRþIþPþRþNþUþKþSþPþKþRþNþTþLþPþKþAþPþ8þSþ:þSþ:þKþ@þ<þ:þ;þ2þCþ7þAþAþ?þLþ@þNþBþNþGþJþGþNþ?þCþCþ:þEþ3þEþ0þ@þ<þ9þ>þ/þ0þ-þ8þ1þ>þ<þ<þ=þGþDþHþMþ?þSþ@þRþCþQþHþPþOþIþRþGþSþKþVþFþ^þBþbþKþQþTþRþPþXþQþTþXþRþSþRþOþTþTþRþVþWþRþYþOþQþPþJþUþHþ^þIþZþQþSþ^þLþbþQþ[þYþZþWþ_þQþ[þYþZþ_þXþ`þUþaþYþ^þYþZþRþ]þNþ^þRþZþVþYþ[þPþbþTþcþUþ^þYþ\þZþYþWþJþKþLþMþOþVþKþ[þKþ\þTþSþaþNþeþSþ^þYþ]þYþ]þ[þ`þ^þ^þ^þaþ[þdþXþYþ_þXþcþYþbþZþ_þcþZþfþUþYþ\þVþZþ]þXþ^þ[þ\þZþ\þXþbþTþhþSþeþYþ\þZþYþ]þ\þ[þaþ\þ^þ^þcþYþiþYþiþ[þeþ^þeþ\þhþWþdþUþcþWþbþ[þ^þbþXþeþNþiþPþhþTþeþ\þaþ_þdþ_þdþ_þaþdþ\þiþ_þaþkþUþpþRþqþVþmþ]þeþgþaþcþ`þbþeþaþfþaþjþ_þkþ]þeþZþhþWþnþVþmþ^þhþeþeþfþdþiþbþiþcþkþbþmþcþiþmþjþjþmþiþjþmþfþiþaþcþ`þdþeþ`þlþ_þmþ`þsþVþwþXþpþ`þoþbþmþfþgþkþgþjþiþmþfþpþeþoþgþjþoþhþoþkþhþuþ`þvþeþbþrþYþtþ^þpþcþoþfþnþmþgþrþdþsþcþwþaþuþbþnþgþkþmþiþlþkþmþlþoþiþeþnþcþnþkþfþsþfþqþnþqþoþqþqþmþxþkþwþjþuþgþrþgþvþgþyþiþuþpþuþkþyþlþwþsþpþzþjþþkþþqþzþqþ|þkþþnþyþsþqþpþoþsþlþyþiþwþnþsþtþnþtþfþxþgþuþoþlþuþjþuþgþrþiþrþlþuþgþyþeþuþfþoþoþkþmþtþhþsþoþpþpþtþlþwþpþoþsþqþpþtþlþoþnþoþiþtþhþtþlþmþuþbþwþhþmþuþgþwþgþwþgþsþdþpþeþwþcþwþlþmþxþiþrþvþeþþeþ}þmþwþqþvþsþxþwþvþ}þqþ~þrþ|þvþrþwþsþzþrþzþwþtþþuþzþtþwþtþyþsþ{þxþvþ{þrþþwþxþ}þxþ|þxþzþ{þrþ|þlþ}þtþxþyþvþyþyþzþyþyþvþwþzþuþ~þqþþoþ„þpþ€þ{þtþƒþqþþwþyþ{þpþyþrþtþ}þiþƒþiþ~þsþlþyþeþxþnþoþxþjþ{þeþ{þkþuþsþqþxþtþtþwþsþsþwþtþzþvþvþ{þvþ{þyþzþtþuþzþtþwþ|þrþ~þyþwþ{þuþzþyþyþ{þwþ~þrþƒþoþ‚þrþƒþvþ€þzþzþ|þxþuþ}þnþ|þzþuþ„þoþ€þvþ|þvþvþtþcþsþcþuþfþ|þ`þ|þcþ}þlþ~þpþ~þtþzþvþrþ|þqþ}þzþvþ‚þsþ†þsþþvþwþ}þxþwþþvþþwþþpþþsþ}þ|þvþþtþþsþ{þwþyþ}þvþ€þsþ…þpþƒþyþwþ€þsþþxþ}þyþ€þuþƒþrþþuþ{þuþƒþpþ…þtþ~þvþxþþvþƒþwþ‚þ|þ|þ‰þsþŠþvþþ‚þzþ„þ}þ…þzþ‡þsþˆþwþƒþþ~þƒþzþˆþuþ…þwþþƒþuþþpþŽþtþˆþwþ~þ~þxþ„þzþ}þƒþzþ‰þ{þƒþzþ…þ|þþþƒþzþ‡þsþ‚þwþþþzþ‚þyþƒþzþ~þuþ~þvþxþ~þwþ}þ~þxþ„þqþ‹þrþŒþ{þ|þˆþuþŠþuþˆþmþ†þlþƒþvþwþƒþqþ„þqþ|þqþ{þuþvþþpþ†þmþˆþpþ}þ‚þvþŠþpþ‰þrþ„þxþzþvþzþpþ{þwþuþ~þpþ€þoþ|þmþwþzþqþ‚þrþ|þxþ|þtþ…þtþ†þtþƒþxþƒþ}þ~þ{þuþ}þoþƒþqþ€þ|þuþ‰þiþ†þrþþ€þ{þþ~þ|þþzþ}þyþ}þzþvþþtþ‚þzþ}þyþyþxþxþ~þzþxþ†þpþ‹þhþ‰þhþˆþqþþ}þ}þþ‚þ}þþþþ|þ…þ{þ‚þ}þþzþ‚þtþ…þtþƒþ|þ|þ~þþwþ|þ{þuþ‚þpþ…þqþþ|þrþþlþ|þvþyþtþ{þwþxþ}þ{þvþƒþpþ†þpþ‡þoþ‡þyþxþƒþnþ}þvþzþyþ}þzþzþzþrþzþxþxþƒþsþ‰þtþþƒþxþ†þ{þþ‚þ~þ‚þþ‚þ…þ‚þ„þ„þþŠþxþ“þxþþ„þþŠþxþ‰þþ€þ„þzþ‰þzþþ€þyþ‡þxþ„þ{þ~þ~þyþxþqþoþgþlþ_þoþcþtþdþoþ]þaþ]þ^þdþ[þdþWþdþ`þaþoþ_þvþfþrþdþgþZþeþ_þ]þfþUþ_þUþdþ\þfþ^þbþUþVþNþYþZþ]þfþeþjþkþqþnþzþtþ€þrþþvþyþ~þþsþ„þrþþ}þ|þ}þ‚þxþ‡þpþˆþpþ‡þ|þ~þƒþ~þƒþ‚þþ€þ~þ~þþ}þ…þ}þ„þ‚þ…þ|þŠþvþþyþŒþ~þŒþ~þŒþyþŠþ{þ†þƒþ„þ„þ‹þ~þþþŠþˆþŒþŠþ‹þ‹þ‰þ‰þŽþ‰þ‰þ‚þ‰þ}þ†þ„þƒþˆþ€þƒþþþ€þ{þˆþ|þ†þ…þƒþ†þ|þ‡þ~þŽþ‚þ‰þ†þ‹þ†þ‘þ‡þ‹þŽþ‰þþþþ‹þþ‹þ’þƒþ’þ{þ–þ}þ–þ|þ˜þþþþˆþ‰þˆþŒþ‰þ‹þŒþŒþþ’þ†þ–þ†þ”þþ’þþ˜þˆþ™þ‰þþŠþþ‰þ‘þŽþþŽþþ‰þþ‹þ”þŒþ•þŽþ’þ‘þ”þŒþ“þþ’þ‘þ“þ’þ”þ‘þ—þþ‘þþ‹þ”þþ’þ’þ’þ”þ‘þþ™þŒþŸþŒþþ˜þ‘þ¢þ‹þ¡þŽþœþ”þœþ•þþ’þ£þ“þ¤þ‘þþ‘þ›þ•þ›þ˜þ–þžþŽþ›þ’þ•þžþ’þ þ“þžþ˜þ›þ–þ›þ–þŸþ”þŸþ—þ›þ þ•þ¡þ‘þþ—þšþ˜þœþšþœþ˜þ™þ–þ˜þ›þ“þ¡þ“þ¢þ”þ þ™þ™þšþ™þœþ—þ¢þ’þ¥þ“þžþ–þ˜þžþ•þ¢þ•þ¦þ“þªþ’þ¨þ“þ¡þžþšþ§þ•þªþ˜þ¨þšþ¢þœþ¦þšþ©þœþ§þ£þ£þ«þœþ¬þ¡þ¤þ«þ¢þ¨þ«þ¡þ­þ¡þ£þ¨þ þ«þ¢þªþ¥þ©þªþ þ®þ¡þ°þ¦þ«þªþ¬þ«þ¨þ­þ¡þ±þþ±þžþ°þ§þ¨þ³þþ¶þœþ®þ¨þ¨þ©þ®þ¦þ´þ¡þ°þ¥þ¯þ­þ°þ­þ°þªþ®þ´þ¥þ¶þ¦þ±þ¬þ­þ®þ°þªþ¸þ¥þ¸þ¢þ¶þªþ´þ­þµþ©þ¹þ¢þ¹þ¥þ¬þ²þ¤þºþ¨þ¶þ¯þ°þ±þ®þ°þ¬þ¡þ«þžþ¥þ£þ¥þ¢þ›þ¥þ•þ°þ–þ©þ¤þ¡þ¡þ þþ¥þ˜þ—þ®þþ©þ˜þ§þ£þ¦þªþªþ®þ±þ³þ¯þ½þ®þ¼þ¶þºþºþ¼þ¶þ¿þµþÄþ¶þ¼þºþ°þÀþ²þ¸þ·þªþÃþ¨þÃþ¬þ·þ©þµþ®þ¸þ°þ·þ®þ³þ¯þ³þªþ´þ¦þ²þ®þ±þ´þ³þ¯þ¶þ­þ¶þ®þ¹þ«þ½þ±þ¾þ´þ»þ®þ¾þ´þ¿þºþ¾þ¶þ¸þºþ±þ¹þ±þ·þ»þ±þÁþµþÅþ¸þÆþ¹þÂþ½þÆþ¾þÆþÃþÄþÇþÉþÄþÌþÅþÉþÌþÇþÍþÊþËþÊþÏþÄþÐþÅþÎþÅþÒþÄþÑþÊþÉþÌþÅþÎþÄþÔþÂþÕþÉþÍþÒþÅþÖþÌþÕþÏþÔþËþÔþÉþÕþÆþÉþ¿þÈþ·þÍþ¹þÈþÃþÈþÆþÏþÃþÒþÄþÐþÇþÓþÇþÓþ¼þÊþ¹þÅþÃþÅþËþÃþÏþ¾þÐþ¿þÇþ¿þÍþ¿þÔþ¹þÒþ¿þÎþÍþÍþÔþÕþÐþØþÔþÓþÜþÕþÙþÓþÜþÎþäþÈþéþÊþçþÎþãþÓþÛþÙþÙþÙþÛþÛþ×þâþÖþÚþÞþÑþêþËþéþÐþãþÜþØþãþÑþâþÔþÝþÙþÙþáþÕþßþÖþÜþÙþØþÜþ×þÝþÛþ×þàþÓþÜþÖþÝþ×þàþÒþåþÒþãþÚþÚþÜþ×þÞþÙþÜþÙþßþÛþÝþÚþÜþ×þâþÕþâþÙþáþØþåþÓþäþÚþÛþäþØþãþàþÙþéþ×þéþØþåþÜþàþáþßþâþâþÞþâþÞþãþÚþêþÖþéþßþàþæþÛþâþßþáþãþÞþçþÛþêþÛþìþÙþëþØþéþÞþàþéþÙþìþÝþåþÞþåþÝþæþÝþçþßþãþäþÜþçþÛþæþàþãþàþãþãþàþâþÝþÝþáþÚþãþÙþçþØþçþÙþßþàþ×þçþÔþéþ×þæþÛþäþâþàþêþÞþëþáþãþæþâþåþáþâþÜþâþÜþæþÚþêþÙþêþÜþæþØþèþØþëþÛþêþÝþêþâþçþèþãþìþæþèþìþåþèþïþàþòþäþïþèþðþâþøþÝþøþàþìþæþãþëþåþçþìþåþëþíþçþíþîþäþóþæþðþéþîþèþëþìþæþöþáþöþâþõþæþðþìþãþìþåþãþñþÚþîþàþêþæþâþèþäþéþéþäþìþèþêþæþèþæþìþåþíþæþìþéþéþïþæþîþçþæþòþáþñþæþíþèþìþæþèþëþèþêþéþéþéþìþäþêþèþåþòþàþðþêþäþõþâþñþçþæþêþèþéþêþçþðþáþöþáþëþðþãþôþåþóþäþöþäþìþïþäþøþäþóþíþêþôþîþíþôþæþ÷þéþôþìþõþêþ÷þëþíþôþâþüþåþóþòþëþøþéþòþìþóþîþîþóþåþñþäþîþçþêþéþçþìþéþîþîþìþïþîþïþëþòþêþñþðþìþòþðþìþôþèþôþðþìþöþèþùþêþôþæþïþíþëþóþåþøþèþôþïþñþìþøþäþÿþãþüþéþõþñþïþõþðþ÷þíþùþñþòþõþðþõþíþïþòþéþúþæþûþêþöþîþïþòþìþñþñþïþóþôþîþúþñþõþûþóþ÷þúþñþüþñþüþêþÿáþÿàþÿâþÿéþÿþíþúþêþûþëþúþëþÿåþÿåþÿþðþùþõþúþòþüþñþüþóþóþöþñþóþøþïþûþòþ÷þõþ÷þõþòþõþóþòþûþîþýþîþúþòþöþ÷þöþôþúþöþ÷þ÷þøþïþþþîþÿìþÿèþÿìþÿôþöþõþôþöþóþùþñþýþîþþþíþýþñþ÷þ÷þöþùþôþûþñþ÷þôþöþúþ÷þóþÿïþÿïþÿïþÿðþÿðþÿóþýþüþöþýþöþúþûþ÷þÿ÷þúþÿðþÿóþþþúþûþþþ÷þÿöþýþøþøþûþ÷þüþùþüþøþÿòþ ÿîþÿöþÿýþúþÿõþÿòþ ÿòþÿùþÿþþÿþýþÿùþÿõþÿóþÿõþÿüþýþøþÿòþÿõþÿñþ ÿóþÿúþÿøþÿôþÿñþ ÿòþÿõþÿþõþÿþõþÿñþÿîþ ÿñþÿ÷þöþüþöþýþóþÿðþÿôþÿþüþùþþþþþøþÿþýþ÷þÿóþüþöþûþöþÿóþÿ÷þÿþüþ÷þÿùþûþÿôþÿ÷þÿüþýþÿþÿýþÿÿÿÿÿüþÿþþÿÿýþÿþþÿÿÿ ÿ÷þ ÿõþÿóþÿóþÿûþ ÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ ÿÿÿÿÿþÿÿûþ ÿýþÿÿýþ ÿùþÿüþ ÿÿÿÿ ÿüþ ÿÿþÿÿ ÿýþÿþþ ÿÿÿÿ ÿÿ ÿÿÿ ÿÿþÿýþ ÿÿÿÿ ÿþþ ÿÿ ÿÿüþÿûþÿÿ ÿÿÿ ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ ÿÿÿÿ ÿÿÿÿÿþÿÿÿÿþÿÿ ÿÿÿþþÿþþÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿ ÿÿÿÿ ÿÿÿÿÿ ÿ ÿÿ ÿÿÿüþÿüþÿÿ ÿÿÿÿÿ ÿÿ ÿ ÿÿÿ ÿÿÿÿÿ ÿÿÿÿ ÿ ÿÿ ÿ ÿÿÿÿÿÿ ÿ ÿ ÿÿÿ ÿÿ ÿÿÿÿÿÿÿ ÿÿÿÿÿÿ ÿÿÿ ÿÿÿÿÿÿþÿÿÿ ÿ ÿ ÿ ÿÿÿÿÿÿÿÿ ÿ ÿÿÿÿ ÿÿ ÿÿ ÿÿÿ ÿ ÿÿÿÿÿ ÿÿ ÿÿ ÿ ÿÿ ÿÿ ÿÿÿÿÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿÿÿòþÿþíþûþûþ÷þÿÿüþ ÿöþÿíþ ÿïþÿóþöþîþ÷þðþÿñþ ÿöþ ÿýþ ÿþþ ÿþþ ÿÿÿÿ ÿ ÿÿ ÿÿ ÿÿ ÿÿÿ ÿÿ ÿ ÿ ÿ ÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿÿÿ ÿÿ ÿ ÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿÿ ÿÿ ÿ ÿÿÿÿÿÿÿ ÿÿÿÿ ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ ÿÿÿ ÿÿÿÿ ÿÿÿ ÿÿ ÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ ÿÿ ÿ ÿÿÿÿÿÿ ÿÿ ÿÿ ÿÿÿÿ ÿÿÿÿÿÿ ÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ ÿÿ ÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ$ÿ ÿ#ÿÿ!ÿÿ"ÿÿÿÿÿÿ!ÿ ÿ!ÿÿÿÿÿÿÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿ!ÿÿÿÿÿÿÿ"ÿÿÿÿÿÿÿÿÿÿÿÿ&ÿÿ#ÿÿÿÿÿ%ÿÿ)ÿÿ%ÿÿ#ÿÿÿÿÿ ÿ&ÿÿ%ÿÿÿÿÿÿÿÿÿÿ#ÿÿ$ÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ#ÿÿ%ÿÿ#ÿÿ#ÿÿ!ÿÿÿ#ÿÿ$ÿÿ"ÿÿÿ ÿÿ$ÿÿÿ#ÿÿ#ÿÿÿÿÿÿÿÿ$ÿÿ#ÿÿ"ÿÿ$ÿÿ&ÿÿÿÿÿ(ÿ ÿ"ÿÿÿ"ÿÿÿÿÿ!ÿÿÿÿ!ÿÿÿ%ÿÿ!ÿÿÿ ÿÿ#ÿÿ ÿÿÿÿÿÿÿ'ÿÿ+ÿÿ'ÿÿ"ÿÿ!ÿÿ'ÿÿ&ÿÿ&ÿÿ&ÿ ÿÿ)ÿÿ)ÿÿ#ÿÿ&ÿÿ$ÿÿÿÿÿÿ"ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ÿÿ$ÿÿ#ÿÿ$ÿÿ!ÿÿ!ÿÿ$ÿÿ"ÿÿ#ÿÿ"ÿÿÿ$ÿÿ!ÿ ÿ"ÿ!ÿ#ÿÿ"ÿ ÿ ÿ'ÿÿ(ÿÿ"ÿÿÿÿ%ÿÿ'ÿÿ#ÿ%ÿÿ&ÿ%ÿÿ*ÿÿ+ÿÿ$ÿÿ&ÿÿ+ÿÿ.ÿÿ,ÿÿ*ÿÿ.ÿÿ+ÿ$ÿ ÿ1ÿÿ2ÿ ÿ/ÿ"ÿ1ÿÿ2ÿÿ*ÿ%ÿ$ÿ,ÿ!ÿ/ÿÿ-ÿÿ'ÿ#ÿ#ÿ!ÿ'ÿ!ÿ#ÿ*ÿ ÿ,ÿ!ÿ$ÿ(ÿ$ÿ&ÿ%ÿ(ÿ#ÿ*ÿÿ)ÿÿ&ÿ"ÿ%ÿ$ÿ&ÿ'ÿ"ÿ)ÿ#ÿ$ÿ%ÿ ÿ)ÿ#ÿ$ÿ+ÿÿ1ÿÿ/ÿÿ,ÿ%ÿ&ÿ)ÿ&ÿ+ÿ'ÿ-ÿ#ÿ/ÿ%ÿ*ÿ-ÿ'ÿ-ÿ,ÿ*ÿ0ÿ&ÿ.ÿ%ÿ0ÿ ÿ1ÿ%ÿ,ÿ+ÿ(ÿ+ÿ(ÿ+ÿ(ÿ-ÿ,ÿ,ÿ*ÿ+ÿ+ÿ+ÿ,ÿ&ÿ1ÿ#ÿ6ÿ&ÿ3ÿ*ÿ3ÿ,ÿ-ÿ-ÿ0ÿ*ÿ-ÿ)ÿ(ÿ2ÿ$ÿ1ÿ(ÿ.ÿ'ÿ,ÿ+ÿ,ÿ2ÿ)ÿ5ÿ'ÿ/ÿ+ÿ)ÿ/ÿ*ÿ-ÿ,ÿ&ÿ/ÿ%ÿ0ÿ'ÿ(ÿ+ÿ(ÿ*ÿ5ÿ!ÿ5ÿ ÿ1ÿ'ÿ(ÿ*ÿ$ÿ(ÿ&ÿ"ÿ*ÿ$ÿ$ÿ.ÿÿ2ÿÿ*ÿ'ÿ$ÿ.ÿ ÿ+ÿ$ÿ!ÿ)ÿ!ÿ"ÿ'ÿÿ$ÿ ÿ#ÿ!ÿ!ÿ$ÿÿ)ÿÿ(ÿ ÿ ÿ$ÿÿ!ÿ#ÿÿ(ÿÿ#ÿÿ%ÿÿ)ÿÿ(ÿÿ ÿ!ÿÿ"ÿÿ!ÿ"ÿÿ%ÿÿÿ$ÿÿ)ÿÿ%ÿÿÿ!ÿÿ"ÿÿ"ÿÿ%ÿÿ'ÿ"ÿ!ÿÿ"ÿ ÿ"ÿ"ÿÿ$ÿÿ'ÿÿ'ÿÿÿ$ÿÿ"ÿ$ÿÿ&ÿÿ"ÿÿ#ÿÿ+ÿÿ.ÿÿ.ÿÿ.ÿÿ-ÿÿ'ÿÿ!ÿÿ%ÿÿ$ÿÿÿÿÿ!ÿ"ÿÿ#ÿ ÿ ÿ$ÿÿ"ÿ$ÿÿ-ÿÿ*ÿÿ$ÿÿ ÿÿ!ÿ!ÿÿ$ÿÿ(ÿÿ"ÿÿÿÿÿÿ"ÿÿ"ÿÿÿ ÿÿ"ÿÿ!ÿÿ!ÿÿÿ"ÿÿ ÿÿÿ#ÿÿ*ÿÿ)ÿÿ"ÿÿ ÿÿÿ$ÿÿ)ÿÿ*ÿÿ%ÿ!ÿÿ(ÿÿÿ+ÿÿ/ÿÿ"ÿ$ÿÿ$ÿ"ÿÿ)ÿÿ+ÿÿ$ÿ%ÿÿ'ÿ"ÿ ÿ'ÿ"ÿÿ-ÿÿ(ÿ!ÿ$ÿ"ÿ&ÿ ÿ%ÿ(ÿÿ-ÿÿ-ÿÿ$ÿ%ÿ"ÿ&ÿ$ÿ"ÿ(ÿÿ)ÿ"ÿ!ÿ)ÿ#ÿ"ÿ,ÿÿ3ÿÿ1ÿÿ-ÿÿ+ÿÿ-ÿ ÿ&ÿ(ÿÿ-ÿÿ)ÿ ÿ&ÿ&ÿ"ÿ'ÿ ÿ&ÿÿ&ÿ!ÿ"ÿ"ÿ%ÿÿ,ÿÿ&ÿÿ%ÿÿ#ÿÿÿÿÿÿ ÿÿÿ!ÿ ÿ"ÿÿÿÿÿÿÿ ÿÿÿ ÿÿ ÿ ÿÿÿÿ ÿÿÿÿÿÿÿ"ÿÿ#ÿÿÿ%ÿÿ*ÿÿ,ÿ ÿ#ÿ(ÿÿ%ÿ)ÿÿ-ÿÿ'ÿÿ#ÿ#ÿÿ)ÿÿ-ÿÿ,ÿÿ&ÿ ÿ"ÿÿ(ÿÿ'ÿÿÿ!ÿÿÿÿÿÿÿÿÿ ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ!ÿÿ!ÿÿ"ÿÿÿÿÿ%ÿÿ'ÿÿ&ÿ!ÿ$ÿ'ÿ!ÿ.ÿÿ2ÿÿ0ÿÿ+ÿ#ÿ'ÿ*ÿ#ÿ-ÿ#ÿ)ÿ'ÿ"ÿ-ÿÿ,ÿ$ÿ)ÿ%ÿ,ÿ"ÿ*ÿ%ÿ%ÿ+ÿÿ*ÿÿÿ$ÿÿ$ÿÿÿÿÿÿ#ÿÿÿÿÿÿÿ!ÿÿ(ÿÿ*ÿÿ-ÿÿ(ÿÿÿ!ÿÿ ÿÿ!ÿÿÿ ÿÿÿÿÿÿ"ÿ ÿÿÿÿ+ÿ ÿ.ÿÿ-ÿÿ.ÿÿ*ÿÿ'ÿÿ(ÿÿ-ÿÿ*ÿ%ÿ!ÿ,ÿ!ÿ%ÿ*ÿÿ1ÿÿ3ÿÿ(ÿ0ÿÿ:ÿÿ7ÿÿ.ÿ ÿ1ÿÿ0ÿ ÿ+ÿ"ÿ&ÿ'ÿ$ÿ)ÿ%ÿ$ÿ*ÿ&ÿ"ÿ,ÿÿ-ÿ"ÿ)ÿ#ÿ(ÿ(ÿ#ÿ,ÿÿ/ÿÿ+ÿ"ÿ*ÿ#ÿ-ÿÿ5ÿÿ3ÿÿ%ÿ,ÿÿ,ÿ$ÿ'ÿ!ÿ*ÿÿ+ÿ"ÿ'ÿ#ÿ)ÿ#ÿ)ÿ%ÿ$ÿ*ÿ"ÿ)ÿ$ÿ(ÿ$ÿ*ÿ%ÿ&ÿ+ÿ#ÿ'ÿ)ÿ$ÿ,ÿ#ÿ(ÿ*ÿ&ÿ(ÿ,ÿÿ6ÿÿ8ÿÿ/ÿ%ÿ(ÿ(ÿ)ÿ#ÿ*ÿ#ÿ*ÿ#ÿ,ÿ!ÿ0ÿÿ3ÿÿ4ÿÿ.ÿ#ÿ/ÿ#ÿ,ÿ"ÿ'ÿÿ,ÿÿ/ÿÿ&ÿ#ÿ"ÿ&ÿ'ÿ"ÿ)ÿ"ÿ)ÿ'ÿ"ÿ-ÿ!ÿ*ÿ$ÿ$ÿ+ÿÿ/ÿÿ,ÿÿ+ÿ ÿ+ÿÿ*ÿÿ*ÿ ÿ&ÿ$ÿ'ÿ"ÿ)ÿ"ÿ'ÿ$ÿ$ÿ"ÿ)ÿ ÿ(ÿ#ÿÿ/ÿÿ.ÿÿ.ÿÿ/ÿÿ+ÿÿ(ÿÿ'ÿÿ+ÿÿ1ÿÿ)ÿ$ÿÿ*ÿÿ'ÿ#ÿ"ÿ'ÿ ÿ(ÿ ÿ+ÿ ÿ&ÿ&ÿ ÿ-ÿÿ/ÿÿ3ÿÿ3ÿÿ1ÿÿ+ÿ#ÿ$ÿ(ÿ#ÿ&ÿ&ÿ&ÿ"ÿ,ÿÿ,ÿ%ÿ"ÿ3ÿÿ2ÿ!ÿ'ÿ+ÿ"ÿ'ÿ+ÿ#ÿ.ÿ ÿ0ÿ!ÿ-ÿ'ÿ$ÿ.ÿ"ÿ,ÿ'ÿ)ÿ(ÿ)ÿ&ÿ+ÿ)ÿ$ÿ1ÿÿ5ÿ"ÿ+ÿ,ÿ%ÿ+ÿ+ÿ$ÿ2ÿ!ÿ2ÿ"ÿ0ÿ'ÿ*ÿ+ÿ%ÿ,ÿ(ÿ*ÿ+ÿ&ÿ0ÿ"ÿ4ÿ!ÿ3ÿ ÿ5ÿ"ÿ/ÿ)ÿ*ÿ/ÿ'ÿ.ÿ%ÿ1ÿ&ÿ/ÿ&ÿ0ÿ'ÿ/ÿ*ÿ*ÿ-ÿ(ÿ0ÿ%ÿ0ÿ(ÿ/ÿ*ÿ.ÿ)ÿ/ÿ+ÿ+ÿ/ÿ*ÿ0ÿ,ÿ.ÿ.ÿ-ÿ/ÿ/ÿ+ÿ2ÿ*ÿ4ÿ+ÿ2ÿ-ÿ0ÿ1ÿ.ÿ-ÿ3ÿ,ÿ4ÿ-ÿ1ÿ/ÿ5ÿ(ÿ;ÿ&ÿ8ÿ-ÿ0ÿ5ÿ*ÿ<ÿ'ÿ9ÿ/ÿ0ÿ6ÿ-ÿ4ÿ/ÿ8ÿ*ÿ<ÿ)ÿ:ÿ+ÿ7ÿ0ÿ4ÿ2ÿ3ÿ5ÿ4ÿ1ÿ6ÿ/ÿ8ÿ/ÿ7ÿ/ÿ5ÿ5ÿ1ÿ6ÿ2ÿ1ÿ:ÿ*ÿ>ÿ,ÿ8ÿ4ÿ2ÿ7ÿ4ÿ3ÿ4ÿ3ÿ5ÿ5ÿ1ÿ9ÿ1ÿ7ÿ2ÿ9ÿ-ÿAÿ&ÿAÿ-ÿ9ÿ3ÿ7ÿ2ÿ9ÿ2ÿ6ÿ3ÿ8ÿ0ÿ;ÿ2ÿ6ÿ6ÿ5ÿ3ÿ7ÿ4ÿ5ÿ4ÿ5ÿ6ÿ2ÿ;ÿ.ÿ<ÿ.ÿ;ÿ/ÿ<ÿ.ÿ=ÿ1ÿ:ÿ6ÿ6ÿ6ÿ7ÿ8ÿ6ÿ;ÿ2ÿ?ÿ1ÿ=ÿ7ÿ5ÿ=ÿ3ÿ;ÿ:ÿ8ÿ9ÿ9ÿ9ÿ<ÿ8ÿ:ÿ9ÿ<ÿ5ÿCÿ1ÿDÿ5ÿ=ÿ;ÿ=ÿ8ÿ?ÿ:ÿ=ÿ<ÿ>ÿ;ÿBÿ7ÿDÿ7ÿAÿ=ÿ>ÿ=ÿ?ÿ@ÿ9ÿEÿ9ÿAÿ?ÿ=ÿ@ÿCÿ8ÿKÿ5ÿIÿ;ÿAÿ@ÿCÿ;ÿGÿ<ÿDÿBÿ=ÿEÿ@ÿ?ÿEÿ:ÿIÿ8ÿGÿ=ÿCÿ>ÿCÿ>ÿCÿ@ÿ>ÿHÿ;ÿEÿ?ÿEÿ>ÿDÿ?ÿDÿ@ÿDÿAÿBÿCÿCÿAÿAÿFÿ=ÿGÿAÿAÿHÿ?ÿFÿAÿFÿBÿDÿEÿAÿHÿAÿHÿAÿIÿ@ÿGÿEÿBÿIÿAÿJÿCÿDÿIÿCÿFÿJÿ@ÿLÿDÿGÿIÿEÿKÿBÿOÿAÿOÿCÿLÿIÿIÿLÿIÿIÿMÿFÿOÿFÿOÿHÿJÿOÿGÿPÿJÿHÿTÿCÿUÿHÿPÿJÿUÿDÿWÿIÿNÿQÿKÿOÿQÿJÿSÿHÿRÿIÿNÿNÿHÿTÿFÿTÿGÿPÿLÿMÿNÿMÿOÿJÿSÿHÿQÿPÿGÿWÿGÿQÿQÿHÿTÿLÿNÿRÿGÿUÿDÿUÿFÿSÿHÿQÿKÿRÿLÿSÿMÿOÿVÿIÿWÿPÿMÿXÿIÿPÿOÿPÿKÿWÿHÿVÿMÿUÿNÿXÿNÿSÿYÿIÿ_ÿHÿZÿOÿWÿPÿWÿKÿ^ÿDÿbÿCÿ_ÿKÿVÿOÿOÿRÿIÿ[ÿDÿaÿFÿXÿUÿKÿ]ÿJÿZÿQÿVÿVÿRÿ[ÿPÿ]ÿVÿVÿaÿRÿ_ÿVÿ\ÿZÿXÿ^ÿSÿ^ÿOÿaÿPÿ`ÿTÿ\ÿWÿ[ÿWÿYÿXÿXÿ[ÿYÿWÿbÿPÿfÿTÿ^ÿbÿUÿeÿXÿ^ÿaÿWÿfÿSÿhÿPÿcÿSÿaÿYÿZÿ[ÿZÿ\ÿ[ÿZÿ[ÿ_ÿVÿdÿWÿaÿZÿaÿYÿbÿUÿdÿZÿ_ÿ^ÿ^ÿ]ÿaÿ[ÿ^ÿbÿWÿeÿXÿ_ÿ^ÿ]ÿ]ÿeÿWÿ`ÿ^ÿYÿbÿVÿgÿUÿiÿUÿeÿZÿcÿZÿdÿ\ÿaÿbÿ\ÿcÿXÿbÿ]ÿ`ÿ`ÿbÿ]ÿbÿcÿ\ÿkÿVÿkÿXÿhÿ_ÿ^ÿhÿWÿjÿ_ÿbÿbÿ^ÿeÿ`ÿhÿ^ÿdÿcÿdÿdÿcÿfÿ_ÿlÿ[ÿnÿbÿeÿkÿ^ÿoÿ]ÿlÿdÿfÿfÿeÿiÿbÿmÿbÿiÿiÿbÿnÿaÿpÿaÿqÿaÿkÿfÿgÿfÿlÿcÿlÿgÿfÿjÿeÿeÿhÿhÿbÿnÿ`ÿnÿeÿmÿcÿsÿ^ÿsÿdÿnÿjÿiÿhÿlÿmÿfÿrÿ`ÿuÿbÿrÿdÿlÿjÿjÿjÿfÿkÿhÿiÿiÿkÿkÿjÿlÿiÿnÿeÿkÿhÿfÿqÿcÿpÿfÿkÿjÿiÿkÿiÿkÿjÿnÿkÿmÿkÿmÿnÿkÿpÿmÿmÿtÿeÿuÿgÿnÿkÿjÿlÿnÿmÿiÿnÿjÿqÿmÿmÿrÿkÿrÿoÿoÿrÿtÿnÿwÿqÿmÿxÿkÿvÿnÿtÿnÿuÿnÿwÿlÿuÿpÿrÿuÿnÿzÿoÿwÿqÿvÿlÿ}ÿfÿƒÿiÿzÿpÿsÿnÿqÿmÿpÿqÿkÿwÿdÿvÿkÿoÿpÿlÿsÿkÿtÿfÿsÿhÿtÿhÿsÿjÿmÿpÿkÿlÿmÿoÿlÿxÿhÿzÿkÿvÿmÿ{ÿnÿ{ÿtÿwÿwÿyÿsÿ|ÿuÿ}ÿzÿ{ÿyÿ~ÿ{ÿyÿ€ÿuÿÿwÿ}ÿzÿzÿ~ÿwÿyÿyÿsÿ€ÿqÿ{ÿuÿvÿ}ÿpÿ„ÿoÿ€ÿvÿ}ÿxÿ|ÿzÿ}ÿxÿÿxÿ|ÿÿrÿ†ÿuÿƒÿ{ÿ‚ÿwÿ‰ÿtÿ‡ÿ{ÿ}ÿ‰ÿtÿŠÿxÿÿ‚ÿzÿƒÿyÿÿzÿ‚ÿ|ÿÿ|ÿ€ÿ|ÿÿyÿƒÿzÿ†ÿwÿ†ÿzÿ€ÿ…ÿsÿŒÿuÿ…ÿ~ÿ~ÿ€ÿ€ÿ€ÿ|ÿ‡ÿxÿˆÿyÿŠÿ|ÿ†ÿ„ÿÿ‹ÿyÿÿsÿ•ÿsÿŽÿƒÿÿˆÿ‚ÿƒÿ‡ÿ‚ÿƒÿ‰ÿ~ÿ‹ÿ€ÿ‡ÿˆÿ‚ÿ‹ÿÿŠÿƒÿˆÿ†ÿˆÿ„ÿŠÿƒÿˆÿ†ÿ†ÿ‹ÿ„ÿÿ…ÿ‹ÿ‡ÿ‰ÿŠÿ…ÿÿÿ“ÿ}ÿ’ÿ€ÿ’ÿƒÿŽÿ„ÿÿ‡ÿ‹ÿ‹ÿˆÿŠÿÿ…ÿŽÿ†ÿ‡ÿ‰ÿ…ÿ‹ÿƒÿŽÿ€ÿÿ†ÿ†ÿ‰ÿˆÿ…ÿŠÿ†ÿ†ÿŠÿ‚ÿŒÿƒÿˆÿ‹ÿÿ’ÿÿÿ‡ÿ‡ÿ‹ÿ†ÿ‹ÿ„ÿ‰ÿ‡ÿˆÿŒÿ†ÿ‰ÿ‰ÿ†ÿÿƒÿ’ÿ|ÿ˜ÿ|ÿ“ÿ‡ÿˆÿŽÿ‡ÿŽÿ‰ÿÿ†ÿ”ÿ‰ÿŒÿ”ÿˆÿ“ÿ‹ÿŽÿŽÿ“ÿˆÿ–ÿ‡ÿ“ÿÿ‰ÿ›ÿƒÿ›ÿŠÿŽÿ—ÿ†ÿ›ÿ‡ÿ—ÿ‹ÿ‘ÿ‘ÿÿÿ’ÿÿ•ÿ‘ÿÿ•ÿ‰ÿšÿ‡ÿ˜ÿ“ÿÿœÿŠÿ˜ÿ’ÿ“ÿ’ÿ—ÿ’ÿ–ÿ•ÿ’ÿ—ÿ”ÿ•ÿ”ÿ—ÿ’ÿ–ÿ”ÿ–ÿÿ›ÿŠÿžÿŒÿ›ÿ’ÿ’ÿ›ÿ”ÿ–ÿ›ÿŽÿ¡ÿŽÿÿ“ÿ˜ÿ—ÿ’ÿÿÿžÿ”ÿ˜ÿ˜ÿ“ÿœÿÿ¢ÿŒÿ¥ÿŽÿ¢ÿ‘ÿŸÿ˜ÿ›ÿœÿ˜ÿ¡ÿ”ÿ£ÿ‘ÿ ÿ˜ÿÿ”ÿœÿ˜ÿšÿŸÿ˜ÿ›ÿžÿ˜ÿœÿŸÿ“ÿ¤ÿ”ÿŸÿšÿœÿ—ÿ¡ÿ’ÿ¨ÿÿ¦ÿ“ÿ ÿÿ›ÿšÿ ÿ—ÿ£ÿ˜ÿ¡ÿšÿ¡ÿ˜ÿ¦ÿ”ÿ¦ÿ—ÿ¡ÿœÿ™ÿ¡ÿ•ÿ£ÿ™ÿ›ÿ¢ÿšÿÿžÿ™ÿ£ÿšÿ¡ÿ›ÿžÿ ÿ˜ÿ¡ÿšÿÿ ÿ™ÿ¥ÿ˜ÿ§ÿ”ÿªÿšÿ£ÿŸÿžÿ¤ÿ ÿžÿ¤ÿÿ¥ÿ¡ÿœÿ§ÿÿ¤ÿÿ¦ÿÿ£ÿ ÿŸÿ¥ÿžÿ¥ÿ›ÿ¬ÿ˜ÿªÿžÿ¤ÿ¥ÿŸÿ¤ÿ ÿ¨ÿÿ¨ÿ ÿ¦ÿ£ÿ¥ÿ¥ÿ ÿªÿžÿ¨ÿ¦ÿ¡ÿªÿ ÿªÿ¤ÿ¨ÿ¦ÿ§ÿ¥ÿ­ÿ ÿ°ÿŸÿ¯ÿŸÿ²ÿœÿ³ÿ¡ÿ«ÿ§ÿªÿ¨ÿªÿ©ÿ¦ÿ­ÿ§ÿ¥ÿ²ÿšÿ»ÿšÿ´ÿ¤ÿ¬ÿ©ÿ§ÿ­ÿ¤ÿ²ÿ¢ÿ²ÿ¤ÿ¯ÿ¨ÿ­ÿ¨ÿ®ÿ¦ÿ°ÿ¨ÿ­ÿªÿ«ÿ«ÿªÿ¬ÿ¬ÿ©ÿ³ÿ¢ÿ¶ÿ¦ÿ¯ÿ¯ÿ©ÿ®ÿ¯ÿ«ÿ­ÿ¯ÿ¨ÿ´ÿ©ÿ°ÿ©ÿ´ÿ¥ÿ·ÿ¢ÿ¸ÿ¤ÿ·ÿ¦ÿ±ÿ¯ÿªÿ³ÿªÿ±ÿ®ÿ°ÿ®ÿ±ÿ°ÿ²ÿ¬ÿ·ÿ©ÿ·ÿ¬ÿµÿ®ÿµÿ«ÿ·ÿ¬ÿ¶ÿ¯ÿ¯ÿ´ÿ°ÿ´ÿ²ÿ°ÿ²ÿ²ÿ³ÿ´ÿ¯ÿµÿ±ÿ³ÿ²ÿ´ÿ³ÿ´ÿ´ÿ³ÿ²ÿ¼ÿ«ÿ¿ÿ®ÿ½ÿ¯ÿÁÿ©ÿÃÿ°ÿºÿ¸ÿ¸ÿ´ÿ¿ÿ´ÿºÿ¸ÿ¼ÿ²ÿÃÿ°ÿ¿ÿºÿ·ÿ»ÿ½ÿµÿ¿ÿ·ÿ¼ÿºÿ¼ÿ·ÿÀÿµÿÁÿ´ÿÂÿ¶ÿ¿ÿ¸ÿ¾ÿ¹ÿ¿ÿ¸ÿ¿ÿ·ÿ¾ÿºÿ»ÿ¹ÿ»ÿ»ÿ»ÿ»ÿ¶ÿ¾ÿºÿ¹ÿ¼ÿºÿ¹ÿÁÿ´ÿÃÿ´ÿÃÿ¸ÿ¿ÿ¾ÿºÿ¾ÿ¿ÿºÿÀÿ¾ÿºÿÂÿ»ÿ¾ÿÀÿºÿÂÿ¹ÿÆÿµÿÈÿ¶ÿÂÿÀÿ»ÿÆÿ·ÿÆÿ¾ÿ¾ÿÇÿºÿÉÿ¸ÿÎÿ³ÿÒÿ¶ÿÈÿÆÿ¹ÿÐÿ·ÿÍÿ¾ÿÅÿÄÿÅÿÂÿÇÿÄÿÂÿËÿ¿ÿÈÿÅÿÅÿÄÿÌÿ¾ÿÎÿÁÿÇÿÉÿÄÿÉÿÅÿÈÿÃÿËÿÁÿÍÿÁÿËÿÄÿËÿÂÿÌÿÃÿÊÿÈÿÂÿÎÿÀÿÉÿÉÿ½ÿÕÿµÿÛÿ¶ÿÕÿÀÿÌÿÈÿËÿÆÿÎÿÄÿÏÿÈÿËÿÊÿÌÿÇÿÑÿÇÿÌÿÏÿÅÿÓÿÆÿÏÿÉÿÎÿËÿÊÿÏÿÈÿÍÿÍÿÉÿÐÿÉÿËÿÌÿÌÿÉÿÍÿÊÿÎÿÊÿÑÿÄÿÔÿÌÿÉÿØÿÀÿÚÿÃÿÙÿÃÿÙÿÂÿÛÿÁÿÛÿÂÿÙÿÊÿÏÿÐÿÏÿÍÿÔÿÌÿÑÿÑÿËÿÙÿÉÿ×ÿÎÿÍÿÜÿÆÿÛÿËÿÔÿÕÿÎÿØÿÌÿÜÿÍÿÖÿÖÿÏÿÜÿÏÿÖÿØÿÐÿÛÿÓÿØÿÒÿÛÿÐÿÝÿÔÿÓÿÞÿÍÿàÿÑÿØÿÜÿÑÿÜÿÖÿØÿÛÿÕÿÛÿÙÿÖÿàÿÏÿäÿÑÿáÿÔÿßÿÕÿãÿÏÿæÿÓÿàÿØÿÞÿÖÿçÿÏÿçÿÔÿãÿ×ÿåÿÑÿêÿÒÿèÿÕÿåÿØÿãÿÙÿãÿÝÿàÿÝÿàÿßÿßÿãÿØÿéÿÚÿàÿçÿÔÿíÿÙÿãÿåÿÙÿëÿ×ÿêÿÛÿèÿßÿáÿäÿáÿàÿéÿÛÿéÿßÿäÿâÿäÿäÿáÿèÿÞÿæÿæÿÞÿëÿÞÿèÿäÿãÿçÿãÿåÿçÿâÿêÿâÿéÿáÿêÿåÿäÿíÿÞÿïÿàÿëÿâÿïÿâÿèÿëÿàÿðÿâÿíÿãÿíÿåÿéÿêÿéÿçÿêÿéÿéÿçÿñÿÞÿõÿãÿêÿíÿèÿëÿêÿìÿæÿñÿåÿðÿçÿïÿæÿñÿèÿîÿéÿîÿëÿìÿîÿèÿòÿèÿòÿãÿúÿáÿõÿêÿíÿîÿðÿèÿôÿèÿóÿêÿñÿíÿïÿïÿíÿñÿíÿðÿðÿíÿðÿòÿëÿ÷ÿæÿûÿæÿøÿíÿïÿöÿéÿûÿåÿþÿæÿùÿìÿùÿéÿúÿìÿ÷ÿïÿöÿìÿûÿíÿøÿíÿ÷ÿòÿôÿõÿðÿøÿïÿúÿïÿøÿðÿúÿðÿøÿõÿñÿûÿïÿûÿóÿöÿöÿôÿùÿôÿûÿîÿÿÿïÿþÿóÿøÿöÿøÿùÿöÿùÿõÿûÿ÷ÿùÿ÷ÿúÿ÷ÿùÿúÿùÿøÿüÿõÿûÿüÿ÷ÿþÿöÿúÿñÿïÿ÷ÿýÿûÿûÿþÿöÿùÿüÿÿÿøÿÿÿüÿÿÿ÷ÿôÿøÿÿÿÿÿýÿÿÿýÿþÿÿÿýÿ÷ÿ öÿøÿ ñÿ úÿÿÿùÿúÿûÿþÿýÿþÿÿÿþÿüÿûÿüÿùÿ öÿúÿþÿþÿúÿ÷ÿúÿþÿýÿþÿÿÿ÷ÿ øÿùÿúÿÿÿÿÿÿÿþÿúÿøÿýÿýÿýÿüÿýÿûÿúÿüÿüÿûÿýÿþÿýÿüÿþÿþÿýÿüÿüÿýÿþÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿúÿüÿýÿýÿüÿüÿúÿûÿúÿûÿ÷ÿûÿÿÿÿÿþÿúÿ÷ÿ ÷ÿ ÷ÿ ùÿþÿûÿöÿ ÷ÿýÿÿÿþÿþÿþÿúÿúÿÿÿùÿüÿýÿþÿÿÿûÿýÿÿÿþÿÿÿÿÿþÿôÿóÿ ôÿ ÷ÿùÿýÿþÿþÿûÿùÿ öÿ øÿþÿþÿúÿýÿþÿýÿûÿþÿþÿþÿþÿÿÿýÿùÿÿÿÿÿûÿýÿûÿÿÿÿÿÿÿýÿüÿüÿýÿþÿÿÿ÷ÿ ÷ÿþÿÿÿüÿýÿõÿ õÿ úÿüÿýÿÿÿþÿüÿøÿýÿþÿúÿûÿýÿþÿÿÿÿÿþÿþÿþÿýÿüÿüÿÿÿþÿ÷ÿ ùÿüÿüÿýÿüÿøÿ÷ÿ øÿÿÿüÿüÿþÿüÿûÿþÿÿÿüÿüÿþÿûÿûÿüÿÿÿÿÿýÿùÿûÿûÿüÿþÿÿÿýÿþÿýÿøÿ øÿýÿýÿúÿýÿþÿúÿúÿûÿþÿþÿýÿûÿûÿûÿÿÿÿÿÿÿýÿøÿ óÿ õÿûÿþÿÿÿýÿüÿýÿüÿüÿýÿüÿÿÿþÿúÿûÿ öÿ øÿøÿýÿþÿúÿ õÿ ôÿ ÷ÿýÿþÿÿÿýÿýÿúÿýÿýÿÿÿøÿþÿþÿþÿþÿúÿüÿýÿùÿþÿÿÿþÿýÿúÿþÿÿÿþÿüÿüÿýÿüÿüÿþÿÿÿþÿÿÿÿÿýÿûÿÿÿÿÿþÿþÿþÿþÿýÿúÿþÿþÿûÿÿÿÿÿýÿýÿùÿ õÿ ôÿ øÿÿÿÿÿþÿüÿøÿûÿûÿûÿúÿ öÿ ùÿüÿüÿûÿúÿúÿùÿ õÿ öÿýÿüÿþÿÿÿÿÿÿÿþÿüÿýÿýÿüÿüÿüÿþÿÿÿüÿûÿþÿÿÿýÿüÿþÿÿÿýÿýÿþÿÿÿüÿöÿ öÿ øÿüÿþÿÿÿûÿüÿûÿüÿüÿ÷ÿ õÿ ùÿÿÿþÿþÿúÿ÷ÿûÿÿÿÿÿýÿÿÿýÿýÿüÿþÿûÿúÿúÿýÿÿÿüÿüÿüÿûÿøÿÿÿýÿ÷ÿûÿüÿùÿúÿýÿþÿýÿÿÿüÿûÿÿÿÿÿþÿúÿþÿÿÿþÿüÿùÿùÿýÿÿÿüÿûÿúÿùÿÿÿþÿúÿ õÿ õÿ öÿúÿþÿþÿüÿøÿùÿùÿùÿüÿûÿ÷ÿúÿþÿùÿúÿþÿþÿÿÿûÿÿÿýÿùÿÿÿþÿüÿýÿÿÿþÿüÿÿÿûÿûÿÿÿþÿûÿøÿúÿüÿûÿûÿþÿûÿýÿÿÿÿÿþÿÿÿüÿüÿýÿÿÿÿÿÿÿÿÿþÿûÿÿÿþÿüÿüÿtkabber/sounds/psi000075500000000000000000000000001477701321300141005ustar00nobodynobodytkabber/sounds/psi/chat_their_message.wav000064400000000000000000000124521477701321300205200ustar00nobodynobodyRIFF"WAVEfmt |ø*dataþ'úÛù´Ñ])þî÷§ü‡ ý†ó¿ü¢< ¸ÿñó_ù u *Çô÷Ï 0võ¾ò{£ Éxú¯òCúa  XÿHñ¢ö= p5ñÏñŒ þôZïEÿ± øïÎüyŠ Êû<ï÷M Ñ/2ñFó=ÿxô¿ñVrË ÷ëïzüœ ¬ ïüðüöÊ ýn_ñôø@Ïô`ñ:z, LøGðüÒ ] Ãü+ð÷÷ ZRƒñ!ôë¸KôšñÃ?Ä ‡øUð üy P <ýÄð•÷q ȇñ‰ónæôÐð‚1 øbï:ûO ”NýŠï¥öu F¹©ñ°òØÕcžôOðêÿ’˜ åøïÏú œ”ý¢ï°öˆ 8cbñúò£‹ôÐðŠc Søóïü | Àü=ðŸ÷ª zšßñQô«½æšô¥ñ;ß !øðü ? Æüqðû÷ð ¡ñaô€ô¡ñƒ|Ä ™÷ðýü¥ Ö äû'ðwøg  FñŽôiú>úóòÙEA u÷•ðEýV Ÿ Õû>ðæø… ¨M”ñ/õ„x½ôòääµ÷ñzý  ÄûØðù $K ò}õL¶côÕò¾¬}÷%ñ›ýó Ú ¢ûÁðHù Næÿ¸ñÉõÈ* ôó¡$÷}ñ;þ< t ûýðôùƒ º –ÿîñöèðËÕóyóË·ìö›ñ•þW  Ðú3ñvúÊ H ÙþâñÓöi˜F¸ó§ó<¢a½öæñ ÿK ’ rúeñùúò ô Œþ÷ñ+÷|¿ÔóiôÃHÆ ö\òÿ,  Cú|ñ*ûÜ £ ^þòl÷¦³Êó‰ôê=Š|öòÿ ò ú¾ñ‡ûì u ;þAò±÷®Ú ^âó¸ôß `ƒö¤òºÿ) × ú×ñ¦û 7 êýIòøÁ ¹óÿôF ^öäò 7 ›ùò-ü Ñ ýeò‰øG ¬ùó¥õ|Ž tmö}óhÁ ×Åù°ò‚ü° W ¸ýìò½øÈ¼ {iô ö>ü BËöïó_= |úùó‚üO ê ¡ýjó%ù†P wÁôPöCÒ âö=ôyÿ JúfóÈü> œ uý„ó}ùÅ0 ŠôlöfÁ ôÛöuôÑ ä¿ùó"ýZ \ 'ývó¡ùÅü þÀôóö¸r qÚöÔôóà ¡¥ùËóZý7 # *ýÍóúùÀƒ ©õ7÷©> %¾öõ6´ Q§ùô¥ý( ¨ ÜüôpúÍC Yîôž÷ù ÃÚö~õ[_ à‘ùgôþ( C œü?ôÝú  ëôâ÷· xÊöÑõ〠g4ù²ô‘þ8 æQü_ô!û› §ÿ/õŽø_Y ø×öYö- >ùòô±þ ‹%üºôŸûô! …ÿzõËøO ¹÷¶öà Ðuù~õîþ¦ 0jüõ›û®ã qÿ»õ ù± ÎT÷Íöö ¨›ù½õåþZ Þ[ühõïû¦§ pÿûõ<ù  s÷-÷9 QªùÿõÿJ Àdü­õüjO uÿFöù Q•÷…÷1 (¸ù=ö&ÿ ybüîõCü>öJÿ‡öäùÇ .¿÷Á÷(Ç ÿÔù†ö4ÿÛ<Yü8ö‰üBÖÿ†öú³ úÃ÷ú÷S£ ©ËùÔö™ÿìÜü;öÃüo¥Úþsöú<¬ Ò´÷Eø±Ÿ UvùÜöèÿ —ÊûWöýiZ¶þÌö¸úe6 dÐ÷–øÆj •ù@÷ùÿª`ü«öEýKë‰þ÷Þú7ëOøäøª øÞù ÷]ïü<÷…ýú¬™þP÷&û1Ÿ,Sø6ù§§þùø*´üp÷ºýðTpþ÷ZûøAhøtùà~Iîù3øiƒôûŽ÷ÞýË^þÂ÷¾û(ºzøÕù déùoøù6ÒûÈ÷%þÍÈþÒ÷éû1Û‚øùùù0ú£ø¢Ôìûñ÷/þ½¬þü÷ü“¨ø úÝúÝø¯•Òâû!øfþ¼‡þø!ü’t¿øKúØ™úùîÌû_øŸþŒ3þý\ø„ü.ãø­ú7­nú6ùûqxÓû{øÀþþØýtø±ü#×ø¿úAˆE úhùüQ^Õû¢øÑþïÐýqø¬ü%ÿÿâøÐúM‹:úù?ežû¾øÿ—Ñœýzøíü2áÖÿùûo\åú¼ù\5â­û÷ø'ÿUg¥ýéø>ý `ªÿVùqû[Ï\úú^岨ûAù?ÿ#2¯ýùEýòR«ÿrù—ûRϬpúKú]Ÿpàû‰ù^ÿöù¨ýRùýÙ£ÿœù´û6š˜ˆúpúi•eêû±ùÿùç•ýdù•ýËè…ÿÅùñûJh]«úÁúwL* üçù{ÿª–µýÊùÄý’™†ÿ ú!ü  aëúàúP+ü<úœÿaUÒýúÖý[U|ÿJúZüöÔU-û;ûU¾Ù]ü–ú£ÿ"ÉýQú þ= wÿ›ú•üß„"TûtûV¡güºúÂÿ%Éýeú-þFçTÿ˜úÀüoÜ2û±û¬iGüêú¨«ý¬úƒþ1‘ÿÈúý»dûéû44aü2ûÍ]©ýöúªþRÿûKý÷LJ®ûJü™àîŽü›ûC’¹ýJûÚþÜöÿRûŽý×€vÍûü¦¨µœüÚûOhô²ý`ûïþÑØûþkû¼ýçSJãû¹ü·€š®üüi7ªÃý¾û-ÿ¨ƒðþ½ûðýµ A-üûü”j÷üZüKàuáý ü ÿHJ$ÿüüýqÁD„ü2ýpÚ[$ý‹üY¬O þIüJÿ&ÿOüCþd{/™üeý~ž4<ýÊüt‚ýýmümÿÐêþ]ü†þ‡Bäÿ«ü°ý£~ã#ýý¯^ÉýýÊü®ÿøŠëþ¦ü¦þdÜÿÙüØýŠLîZýýŽIÚ þ±üˆÿéöþ§ü‰þ<áü·ýwWõVýýŽJâþ¯üÿý´ùþü‡þX+öÿÈü¸ý”m÷Dý ýœgäòýžü–ÿž×þüªþ}!ËÿªüÈý¶sÙ(ýý®`Åîý¸üµÿ‰Ëþ‘ü³þ,Øÿ¶üÌý±eÍ6ý-ý¿Z´áý¹üÃÿ|³þ–üÍþzô¤ÿÁüýýÂFš(ýWýæK~×ýðüæÿ@™þ¿üÿ‹Ãyÿáü=þÖ hIý™ýÿFÎý*ý)æþ˜þÿü>ÿk„cÿýünþÛä?MýÊý ñ ÜýSý;ÏÏþý]ÿniYÿýþâË+[ýãýãûØýkýHÍÆ…þ!ýlÿvVDÿ ýžþÞ¹Yýïý)áæÅýýaèaþ"ý…ÿzI'ÿýÀþò¯úÿMýþSâ˯ý„ý€âGþ3ý¹ÿ+ÿýÚþ¦Òÿ6ý(þdЫ£ý¡ý¬Õb(þCýÑÿšåþ#ýÿ„ºÿKýIþ}Í‚—ýÅýÂÃL4þ`ýáÿ„ëãþHý"ÿ[§ÿgýuþ{šo¹ýÞý¸ª6-þrýôÿzרþGý&ÿT ÿdýtþ§h¥ýèýÓ§#,þ‡ý |ÈÉþVýLÿ$N•ÿ`ý‚þ‡–Z­ýôý×­þý#·¸þUýLÿ =zÿ_ý¡þœ€6­ýþåž!þ•ý~±½þgýZÿ+8tÿhý¥þž†=£ýþ÷ªùþ ý3€¡®þeýfÿ!\ÿfý¸þ§y™ý)þšÕþ¶ýPwq”þ‰ýÿ$ðJÿýóþªC¾ý[þ hµþðýZJ[®þ¯ý¡ÿÕAÿ£ýÿþ–'öÿÔýpþýF¦1þþT2F»þÉý¦ÿùË_ÿÈýûþ"æýtþó@¶EþýýE3HÃþØý§ÿç¾]ÿÃýÿ†÷ÿßýqþñ9ª5þþ_'0±þÜý¿ÿò­AÿËýÿ€òÿøý”þû%Kþ1þa#½þõý»ÿß¡Pÿàýÿyîîÿþý”þ÷ˆGþ5þ^ (Äþôý½ÿΗVÿéý'ÿsäîÿþ¦þó—Wþ9þcþËþþÊÿЊTÿöý:ÿ|Öåÿþ«þïþ‚XþKþbìÿÆþþÒÿ¼sQÿ þ8ÿ\¾äÿ3þÏþæ×y|þhþ\ÚþÜþ*þÊÿ¦neÿ"þCÿNµõÿ?þÊþÞÏixþ€þa½æÝþIþáÿ“DTÿ?þbÿBÔÿ^þýþâ¦S‘þ¥þx©Åìþlþôÿ‡ Iÿ[þ‰ÿUn¯ÿUþÿž/…þÀþ”¦˜Âþ€þ!‘$ÿOþ‘ÿYg¦ÿVþ%ÿ–yþ¿þ™´¦¼þeþ¨&ÿKþ›ÿgfœÿLþ%ÿ­fþ·þ¤Á¦¸þhþ¢$ÿBþ—ÿqkÿ=þ&ÿ"«Wþ¶þ¯ÈžŸþnþA¶þÿNþ¼ÿ‡bxÿ5þ:ÿ3ŸfþÑþ¿²x¢þ‰þP¬ëüþIþÃÿ‰SnÿGþGÿ*ìÿ[þâþÕ®\•þ’þZ´ã÷þ\þÑÿ}9fÿXþeÿ4{æÿlþñþÊ¥t­þ–þF™ç ÿlþÌÿiCÿ[þRÿ&ƒ÷ÿjþÝþ±t·þ™þA‹ÝÿpþÔÿm2sÿdþZÿvòÿ„þûþ¼‹Z¸þ»þ\‹Ãÿ~þßÿg!rÿ~þqÿ[Øÿ…þÿÈyD¯þ»þ^„»ÿ‡þéÿdgÿyþÿ%RÎÿ„þÿÍvD¶þÌþdy¯ÿ¡þþÿWü_ÿˆþ’ÿ)HÈÿŽþ*ÿÍc7¿þÝþhi–üþ«þUïWÿ’þœÿ"7Ãÿþ=ÿÓQÁþûþ€b‡ÿ»þJá`ÿ­þ°ÿ¿ÿ°þLÿËJ+ÒþôþfSÿ¹þüÿ8àcÿ¢þ˜ÿ.Àÿ¢þ=ÿÅQ/ÍþòþjYŽÿÅþHß]ÿ§þžÿ,Ìÿ®þ@ÿÄL0ÖþùþiOÿ¼þÿÿ?Ý_ÿ¨þÿÆÿ¼þKÿ¹0âþÿg<~"ÿæþÆ{ÿÝþ°ÿëôÄÿãþgÿª(ÿ!ÿT}Dÿýþüÿ÷¯ÿïþ²ÿÙá¿ÿìþoÿ¤þÿ<ÿ^P:ÿÿ÷‘vÿ ÿÔÿÖĽÿ ÿ‹ÿá %ÿXÿ`çGFÿ.ÿ!å‰ÿÿÓÿÅ·ºÿÿ›ÿŽÅûÿ.ÿcÿ_Þ=Qÿ=ÿ΂“ÿ6ÿÜÿ® Åÿ4ÿ©ÿŽÃ>ÿlÿQËJkÿMÿ·vœÿ@ÿÜÿ§œÂÿ1ÿ¡ÿ}¸>ÿhÿMÂ<bÿNÿÂnƒÿ3ÿåÿ³ Âÿ.ÿ¥ÿ…¹AÿyÿYÅ5[ÿTÿ%Çxÿ2ÿÛÿµ­Èÿ,ÿ¡ÿ†Á5ÿiÿUÑEXÿ8ÿ Æÿ+ÿÔÿ­©Îÿ/ÿ•ÿ„Ï9ÿ[ÿFÔYmÿ7ÿÇŒ ÿ/ÿÌÿ­·Øÿ&ÿŒÿ‚ÑEÿaÿ@Ètkabber/sounds/psi/connected.wav000064400000000000000000000213601477701321300166420ustar00nobodynobodyRIFFè"WAVEfmt ||dataÄ"€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}|{yvtrponnonke`\Z[_djpvz|}}|}‰‘™¡¦ª°¹ÃÎ×ÜÝÛ×ÑÌÇÄ¿»¶±¨Ÿ—“‰ƒ|vnd][]\WNHB;4/-*% $0>HNT`nwyz}€‚‚…”™¢§¨¦¥©®±³¹¿ÂÂÂÆÊÇ¿¹¶³­©§§£˜˜–Šˆˆ„ymggikr}‰–¤¥¢Ÿ¡¤¡˜‹†z|}sjd^RGEJPPNQWZZ\bd`Z[afhlvƒŠŠŠ‹……‰‰ƒ}~€~}„“Ÿ¢ žœ–†„wjb_ZQKLOLGEHKKMWelljnrqmpy„‰‹‘› ¢¨²¹³¤–Šƒ€„‹ŽŽ‘™¡£¢¨³»¸²°±®©©¯³­ –ˆ€{~zl`\\]bmz|€†ˆ„ƒ„‚yme_XPMT\_\\`b`akvwla[]_clx~z{€ƒ—›œ¢¬²´·ÀËÐÍÉÇú²±´±¤’ƒxnggntrmlopkede`VOKE90/6;;EHMXfptv{~ytof\Ycvˆ•Ÿ¨¬¨¤£¤zlb\\gzˆŽ“™š”‰„|tqrpidiw„‹ŽŒ†…ˆ‚ui_VRVbouvy‚‹’•–•‰„‚€{y€¡°»ÂÄÁ»¸¶¯Ÿ‹ylb^exŒ™Ÿ¢¦¨¥¡žš‘…}||wqs~Š‘””’‡ƒ„„|nbYPHDISY[Z[^_adfaWNJFA<>J[m|Š•œ¡§®°¨›‡xwŸª³¹¸²ª¢šŽtpnljny‡”Ÿ¨­®¬¬­¬¤˜Œƒxk^WX[`gnqoiea\RIEA:2.2=K[m}‰Ž‘’‡{spoljls~Œ›©±®¤˜Žƒwnlnpoqx„‘ ¯½ÈËÌÊÆ¾²ª¨¨¤–‘ŽŽ“¤¥Ÿ•Š|kZMFA;89=CM^s†“˜˜‚rgehmoqtw}‰š«³²ªŸ’€oedgkotwy}‡™­½Åެ—†€€}wnfabl|‰‘“…s]K@;9:<<97=Mauƒ‰…vaQLPX_ejlpw…–¤¬¯®§—ƒpc]]cltwvxƒ–«¾ÌÑË»«£¢¤¦¦§¦¤£¦¬±³´´°¤xdVONSXZWUZgy‰”˜’„sgcdefhlosy€†ˆŠŠ}kYLEFOZdgio}‘¥·Âù¬£Ÿžžžž ¡¢£¥¦¤££¡˜†nVA4/5?FHGHO\m~‹‰~ursw{€…ŠŽ‘•–••—˜“‡s^J=8=FMPPRYf{‘¥°°«¦££¤¥§§§§¦¦¦¤£¤¥¢–„p^PKMTZ\\\`hw‰š£¢™Ž†€‚†‰Š‹Šˆ…ƒƒ††udRB747>FJKJLQ]n—™™™œ¡§­°±°®­¬®³º¿½´¥•†{snlkjhfehp~ž¨¬¬ªª©ª«¬¬¨£œ”Œ‡}obWNHECA?>>>==BL[is|ƒˆŠŠ‰‰‡ƒ|{yxz~|unje_XQLJLRX[[]dr‚“£°¸¼»¹·¶·¶·µ°©¤ —‘ˆ‚zn`SKHJNMG@?FVj•¢§¦¡œ™˜šž¡¡˜–••–˜›™‚qaVSXaec\X[h}•­¾Åľ¶±¯°³µ²¨œ†{|~}vgS@2-1;CC<31:OkˆŸ©¨¡˜‘ŽŽ‘•–“ˆƒ‚…Œ–œ‘iWLKRZ]XPKO^w”®¾Ã¿¹´°®®°±¯¨Ÿ•‰‹“œž–…q\KBBGKIC==FWn…•›˜’Œ…€}|‚|unkov{yo^L;117?EILQ[j~”¨¶¾ÂÃÀ¹±«©¬±µµ¯¥ž›ž¢£|hWNKOTZ`gox„’Ÿ©°´µ±©Ÿ—”–¦¬ª¡•ŽŒŽŽ…wcP@747ø¾÷êø­ùbøìøín = rJ € ß 6Ì ŒïjëSðoñTð7ïøî³ð¨ñ¾í;ïtþ%ŠùB~¼ë TÏøüñð´ðÉïúîUðóðï©ñsúZØ :Jh«Ð3âm2[{õïíRð¡ñËïgï˜ð£ðpïÓñ¼ûÒ ~r£ºz›„*ª3Pòý¬ðNíoðëðâðÏï€ì«ðþ³]‡Q¸FbÞÉþÿìõÜî2ïÔðññÓî®ï`ûETþ¢ÿ1 ¾Íçp^L3 Ï{gö¢í¢ïyñò4ïõî{ø7Ò1gþëù;aȃbéžþµd1ú¹îï^ò4òÞïæïàø!(ÿý–žm_À” èþÁÿl¦(ý±ðµîÕò`ðhîˆ÷½z·ÿ²ÿþWWjÙU ÿ|ÿvøÿ]»þ†ô(ïYñ ð/ï«öøÿéZÿÿù C€´“ žuŠlŒæ¼û]ôìðÿïÇðL÷ßÿUdÿdæ/ÿ¼ñ؃ ¯øŸÁÿÔÿmÁýÙò îFðNøonÿ~–L¢þˆÀ òú DõþÀžsÿ×þMXô•êÇñoÆùíÂð þd»‘ ïUš“f] ׸þ.5Ç÷@î¥ï…ñ(òÔï(î;ù:%þãa%büø ®þ÷Bò5Èÿ ÿýð­öœ¿TÇÿ/Òÿ/¿ÿÔÿyOOk¦ †I˜ùXø¡ÿ³šÿ;ìÿöÿéÿþÿ¬ÁóÿöÿÜÿ/»ÿÙÿŽ3˜ÿ;Õÿæÿ/¤²ÙûT÷ÇþI¡ÿåÿ7"e9þÛG _*þ¯ñU»ÿÈÿ(û·ð-ùBDDdþ=' ESÿ“:¦Ìÿæ¾þ†ôjïù]¢xÿ¦úñ–ÖT: ¡ÿÒþ¦ƒûÿÌÿåÊþõOïö—°dÿr¢Ú¦ÿCI ¢S Aöþ¶É>½ÿÍíþDö ð‘õÀÿCG”—“ÿ:Ä `Ç{ûjþcî*ÁpüÙõòóò¹õ6üõW¾æÿ4| QFÏæÊÿ\ÿK)”ÿûõYó›ó™ñû÷'²»ÿ–ÿ¶.[— ò e,yÿ"YÂ_ùÑñRô öEòMôŸþßKàÿh| € 3s ÈË<ÖUùÄñuô‚ö»óáòƒøÆÞÿðþ²˜Ns ÷ Ú çƒjþmjú…òzóõâôÛôXó$òÎø1jôÿÝ<  Ç  ¾ ZX¼ÿ þ÷IôNõ öö4õ óøT=‚Ü B ² ë ( Ø Ñ åDþÍúÉô¹ôöõõ§ö¢ôöhþ„ƒõ þ x e Ï p  è  ÜÝýfø-ööÇõ1õfõQö õÆôðù4V ä ¸ 9 Ï œ w  ðü‘ö5ö.÷îööNõ~õáö¨öÃó0ùq„ K B Î ÷ Î þ D Ñ Û=÷·õÛ÷P÷<ö&ö ÷ø¾õ(÷'À F +   Ô Ü ´ v Ê ¾ ûõúøƒøýö$÷ ÷÷ÊøQöÆö Œ Z T %   J $ Û ™ Öû;÷^øÄø|÷÷£÷Õø7øZ÷&ütÕ ¯  e ó % O » ªüúö~÷Üø°øø¿÷¿ø¡ø(ùöýáÿRŽó P<ÇsRÉz¬á@ÿ9ûúøÊùZùUùéù!ùÿøÌü´ÿOi Î8۟ꎖý<ùúíúõúðúüùhùöüÛr!—ë¢9üYþö”zgPûEûÒüÃüü¥û¹ýÚÿþ­üÓþç(yﺺçóäôðÿ%þˆþÊþ þêýôý-þÏþ£þyý„þ–¤›ÉRÓàZëUbûÿøÿþÿÿÿûÿùÿòÿŠí ”þµýLþ±ÿ/æÿ&6šýøoó‰òróôäô±õßõïôXóòžñ&óDúÕGú)øÿòÿsè¿èÍE ë ¥ n ² e ýçŸþþ|ÿùÿìÿÅíý¹ö}ò?ò óêóŒônõïõNõyôÆóõòÄòBô†ù¥âê—¹ýÿëØ 0Tmb û õ Ú c è ªÎ” ÇŒÿ«ýþmÿÌìHŸúÅò{ò$óaóõäõ öæõõ‡óxòíñFôÎü‘ÿZþµõÿQÿ¦ô ¡AÅî ; r å ý ¡ f 3óbÔ “'ÿôýMÿ ËÿÛü4÷‡ó0óøóÈô’õö öö±õ×ô ôãóKô°÷²þr¯){ÑÿØà cÿ &  à  ð õ  Ø & tqCšýÝýaÿ/ËþÌø,ó†ò}óqôÞõ$öÿõçõ6õ=ôüóåóõRû€å§Ë¯ éJÙ Kî ì  ; ó ú  í @ ä ã  FjþÿâÿŠþÜø•õBôôòôÃõ öööúõ öøõ3õuôäó öÈü ú1z  F»   • ý î ê  ½ ƒ Së Ñ ÌÍý“ýoÿìÿAgÄûØõôãóEô9õØõööõö,öçôôóÞóûó1ùØ×³ Úÿ™ÿòì™ m– Ú  ê  þ ú  õ ù Á . Å × ”·þãÿ»ÖýÇöôõõÞõöñõööôõöö4õ õÇô¥õáû\õ`ÃÿÎOº ù ! þ M B ó  ¼  † „   [ ï³þ…ÿIñ—ÿ‡ú½õ×ôýô<õööâõ@öåö-÷™öÙõõÓôºøüþØ ¨Ïÿ!L > ô Ê ú ð ø ý  è  è Œ e F _ÿ'ÿéÿjåýCù_öÐõðõöºö6÷±ööŸö÷ùö÷÷ÉöØõ•õªùXÿȺò7 k è   ø  ü ÿ ý  ý  H ýSºþbø;ö7÷ëöÿö÷÷ýö>öPö÷÷îö÷æö(öHöm÷ïù1þîÓòŽîê 5  Ï  Ú j  n Ú × ò S Ü wÍøÿÜÿÉüøÚö÷íö÷ÿöüö÷úö÷îö÷É÷øÜ÷ùööˆ÷Ðûjÿñ) ù ï æ % Û é < ä  ü ý 6 š Ã;ÿ–ü ù–÷øú÷þ÷øø øR÷>÷ö÷øó÷øøï÷øÛ÷ÄøýÛòdމ  ó  õ  þ ÿ  ÷  ´  œ    .½;ØÿtþÓúBøË÷øþ÷þ÷øý÷øû÷øñ÷ø±øùùôøeø$øYú¦þÕÎz Ü U  õçU ó  ñ  ÷ M ì÷ý| è  G%þSù4÷=÷&øèøùùìø8øï÷÷÷ø®øùøø ùùËøÞ÷›÷OûÝÿþ‚ß P × ÷î†   œ öø æ3 ¼ M ”'Ñüê÷€øåùãùú ú|ù÷øøøùùøøüø•ù#úñùEùcøñ÷ùø’üö| ‚ ¤þøí7ê õ «‡H  1 ¾¾ý°ø"ø^ùúÌú(ûÌúú;ùôøöøüø–ùúûùú úÑù ùzøDûxÿ…½~ ú5€Ú²ÿýçCÌ?õTýÙúù’ùªúûú ûû™úýùñù úèùúÂúû ûîúpú€ù¯ú9þ¬êUx» ¥Öó Ž»ÂË5ì¿„üÝùúúúúÁûüèû*ûPúöùøùðù‡úþúû¼ûÀûÛú ú¥ùQû‚…“Ù‚=ÿ‹üùÀççÿ)>’ÅôüÂúèú¼ûüüüúûüëû:ûêúûúûœûŽüãü?ü?ûûÞúmûÉÿ'ëZ É(~þúÏ?ìÿèMC7ÿUý:ý'þêþÿÿëþ:þêýþþýþíý%þÙþ'ÿºþìý+ýýßþÀ–?¶JÔ ó÷u'ø›Õüüù ùOêÿýÿþÿÿÿÿÿýÿûÿçÿ|Ü0äÿ üÿÿÿýÿÿÿÿÿýÿÿÿüÿæÿ1Ú‚×ÿÇ"ÈÒÿ”µVÿ¿þYÿüÿmÿ)ÿãÿ6Rÿtÿ{^‹ ¸)ÆÕ¿\%ÿHÿûÿ…ÿäþýþÒÿÿ$ÿÔÿçÿ«ØMS)úJï~‹ÿÿ°ÿ6±ÿÿ¤ÿÔÿ¯Ú`¹XÛL\ç<>Ýÿ/ÿjÿ ¥ÿîþíþ©ÿëÿ-„A¾Ùzé0Qðÿjÿ+ÿæÿ&’ÿôþöþ”ÿøÿÛÿÝðí4áèÍÿ|ÿêþÿ©ÿ-Ïÿÿ‰ÿÔÿÈ‚ºBåÝÛÿüÿÿÿ»ÿÿÿúÿüÿøÿ×ÿpÖ8x$ÉEU èÿ ôÿDÿHÿIÿEÿòÿøÿúÿ’–Ù.ýµðÿûÿþÿõÿ Sÿ>ÿóÿìÿ ËÿðÓ4¢| àÿôÿýÿþÿÿÿýÿþÿþÿÛÿK®UQãÿ ûÿýÿõÿ Rÿ>ÿ÷ÿ÷ÿüÿðÿÚŸ1×qÔÿýÿÿÿÿÿkÿÛþÿÀÿ/´ÿÿÿôÿüÿ€oåJËJåpüÿôÿÿÿ´ÿ/Àÿÿßþhÿ Ôÿ›+Èÿ‹T÷ÿèÿôÿôÿõÿ>ÿQÿ ÷ÿüÿÿÿÿÿýÿÿÿüÿ äÿ0Ü|èÿþÿøÿöÿÍÿ"ÿ‚ÿøÿûÿúÿÉÿbºùÎÿöÿüÿÿÿÿÿþÿþÿþÿóÿèÿóÿ[ƒÜÿôÿýÿþÿÿÿÿÿÿÿüÿõÿýÿ$ê6ìÿþÿþÿÿÿÿÿÿÿûÿöÿøÿš  ‚ðÿüÿûÿþÿÿÿÿÿÿÿüÿõÿüÿ•ùÁíÿýÿÿÿüÿõÿúÿ˜ý ùOèÿüÿÿÿþÿýÿêÿO÷òöOêÿýÿþÿÿÿþÿýÿéÿOù ü˜úÿöÿüÿÿÿÿÿýÿüÿêÿO÷øù×'ëÿýÿÿÿþÿÿÿüÿêÿPøøùÖ'ëÿýÿÿÿýÿýÿÿÿüÿìÿÅûþÿý®òÿüÿþÿÿÿüÿíÿÄûþÿý®ñÿüÿþÿüÿúÿòÿ ûýùé9éÿÿÿþÿýÿüÿûÿóÿ üýùé:éÿÿÿþÿþÿýÿøÿøÿuý7V ü ñÿûÿüÿýÿÿÿþÿéÿ:êùýý ~òÿúÿüÿÿÿÿÿÿÿþÿðÿ ¡4Ì¥®#¿¡çÿýÿøÿýÿýÿûÿÿÿçÿ|Ü0åÿ üÿÿÿýÿÿÿÿÿþÿüÿîÿÄúÿýýÿûÄíÿüÿÿÿÿÿþÿþÿÿÿéÿ;éùþÿýù ÷Oêÿüÿþÿÿÿÿÿÿÿýÿýÿÿÿéÿ:éøÿÿþýù×&ëÿýÿÿÿþÿÿÿÿÿÿÿþÿüÿñÿ®þÿýýÿÿýú fìÿýÿüÿþÿÿÿÿÿþÿÿÿýÿëÿ'×ùþþþÿùé:êÿÿÿþÿþÿÿÿÿÿüÿõÿûÿ–ýýÿýú òÿúÿüÿÿÿÿÿÿÿþÿýÿíÿÄûýþþù øOéÿüÿþÿÿÿÿÿÿÿþÿüÿíÿÄúÿýÿýû—ûÿõÿüÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿèÿ:éùÿþÿÿýú gìÿýÿüÿþÿÿÿÿÿÿÿÿÿÿÿüÿðÿ®ýþýÿÿþþÿùé:éÿÿÿþÿþÿþÿÿÿýÿêÿ'Ùùýÿýû ~òÿúÿüÿÿÿÿÿÿÿþÿÿÿþÿêÿ'Øùþÿÿÿþþù øOêÿüÿþÿÿÿÿÿþÿüÿéÿO÷ ùþÿþþÿýü–úÿôÿüÿÿÿÿÿÿÿÿÿÿÿþÿüÿìÿÄûýý÷µŸjéÿüÿþÿÿÿÿÿÿÿÿÿþÿþÿìÿ7í –óÿðÿÿý ÷S×ÿ'Ø(ªòÿýÿÿÿÿÿÿÿÿÿýÿñÿ ¨+Õ"ôÿñÿÁø’þÿôÿôÿGÿwöÿùÿüÿÿÿÿÿÿÿÿÿÿÿÿÿüÿüÿðÿaaðÿüÿüÿÿÿÿÿtkabber/sounds/psi/groupchat_their_message.wav000064400000000000000000000170721477701321300216000ustar00nobodynobodyRIFF2WAVEfmt |ø*dataýÿúÿüÿüÿûÿþÿüÿÿÿÿÿÿÿÿÿýÿúÿüÿÿÿúÿúÿþÿ âÿgÿFÿèrÿ’Nþ½ûßúŸýh^¼áAçûgøzø‚þåÏ›gl-þ ùh÷Ëú¡ÿÆË¿¿»çüMôvñD÷ÂÿÊ@ ¹ + Ký‚ö…òÌô üêu  3  þ÷„ó$ôùû © àsŠù¶ó‚ñTôüxp  ûžýKö óÏó…÷êýÊÚ ò ­AüÎô3ñòòºù+É VΩõýõ|ïFïîô—þæD<× ”ú„ñéíºð ù¸ª öMöÆýäôIðéðÙö«o @x O­÷Mñ’ï£ò‡úê¼ T»µeþWõýïdð ö ÿ2 è O–ú=óoð¥ó#û × ‰¡ ïþ õ‰ðÚð©öœÿ~® º GúòòñïNòžùs ‰üþö±ðªðîõÊþ&‘Äz '¬ù™ò\ðbó“ú¸µ €Þ µÿ}ö'ñÿðüõFþ=Õ ‡Ä åúRóðŸò úmw …2ÿxöëððÊõ²þ’û ”òù‡ò±ï…òCúÕÐ Ïv Çþ!öûðåðö¿þ×ü 4= Bú6óàð¹óÿú ¯ "k EþÙõæð8ñ¡öOÿHL\Y |Uú/ó}ð óíùàô L:ÿlö%ñíðö±þÀ"¨¸  1úÉòùï»ò*úžº ÑS÷þòõ‰ððÄõ˜þù‰úÏ ƒú¼ò8ðóaú˜“ zí £¿þ"öæðñZöÿVˆS ;úÚòJð@óšú¸“ aÎ þ*öñ3ñxöÿÿ" ú"ó¬ð¡óûŸ 5 ßþÞõ5ñÇñP÷ßÿjÉS Lùó ñ%ôSû/‚ ÂØ € þRöÙñ=ò‹÷ïÿB„ Á ±ùxóñÅô÷û] Kj Iåý3öîñò±÷Ñÿù7 å á húàóåñÈô‹ûæì 2 ÕýGö.òæò+ø-C à u Ý¥ù¦óçñõìû8$ :I ¸ý4öòÏòø8Be Ð Y où óòõünG û ¹wý,öRòóOøG?P ¦ 9 ¬–ù·óòSõ<ü1 ä ¼ ‰jýGöŠòróÁøš4æ °b‘ùäó]ò¨õ¶üìH ¢ ? ý4öœò·ó#ùñVÁ È fyù-ôöòFöþüµ¯ æ ¤ »Dý¼öeójôhù¿Û/ G  »ùƒôFócöÛüv{ Ç ¦ ánýÙönóhômùº²ç ý ÷2ùùÆôqóŠöüümC Œ z »Zýêöó ô¥ùÔ£Ý  8íùËô¡ó¾ö ýg@ ˆ h  BýëöÄóÔô´ù»’Å Ç ¡ßÚùõôâóýö<ý* : pNý÷ÿó õåù䌖 Ÿ Ÿúóùýôäó÷@ýu + d7ý ÷þóõöù — ½µùùôôC÷{ýœ/ , ß 1ý÷ô;õ úþº¶ € N©Öù+õ6ôP÷wý  ¼  ý ÷ô7õú'Àœ z Rš¶ùüô ôF÷•ýÅ?  ¹ øÜüìö(ôkõYúUÜ - òQ•ù õGô˜÷áýò: Í F  Âü÷iô×õÏú»2 ¼ “;ÌùrõËôø+þÔÅ H ë„Ùü<÷ªôöÕúp€ó –AËù†õñô.ø&þÂ¥ 4 êƒäüZ÷Ùô8ö÷ú}}Ò [ HÓùÌõTõøGþ«q å ‚/Áüi÷õ›öOû™[‰   úö—õ±øHþz' ¥ d6ôüÇ÷|õÔöYû€J × ï úSöÕõÝøbþv { ;ãüÏ÷™õðöiû|ù ˜ Ìÿÿ>úˆööù~þwÞ ÌÈÓü øöƒ÷Ìû”Þà C ŠçÿNúªö@ö1ù~þb·î ³ØýHø!öl÷¼û‰Ê  XÐÿSúÄöpö‚ùÞþš§ k¡íüFøIö±÷ü¸Æt Ô%²ÿ\ú÷Äö¾ùõþŠ|r [ÃüEøöøCüÕÊ[ ¤ôÿHú÷æöâùøþsb^ MÉüaø—öøYüæÀ. e°gÿ`úF÷,÷.ú9ÿŠN- Ý0¿üoø½ö@ø|üîª ]¶iÿ\úN÷>÷/ú.ÿtÔ‘Øü°ø÷‰ø›üê†Öyÿ‹úƒ÷p÷Wú:ÿeÌŽèüÅø"÷’øŸüÙ`­÷{uÿ˜ú÷z÷rú`ÿxò©`ܲü®ø6÷Óøõü…®×= ÿ`ú§÷Ð÷Âúvÿ]Äz8½³üßø†÷ù ýfw€æøþ|úù÷/øû³ÿz£·}Ìü'ùË÷Jù.ý8(Æ"ÿÈú?øjø<û¹ÿHPСÏü5ùøŽùZý ëÇ(ÿÑúRø…øFû«ÿ7JË’lÃüAù"ø»ùuýÎÒuèþÊú„øÒø‹ûÇÿ'ŽSJ×ü‚ùføãù„ý Ø›±r ÿûÄøûøûÌÿê[5?äü©ùøú‘ýô¦cŒkÿûÊøù¤ûÏÿ ÛJ->åü¯ù²ø5ú°ýüžOpO ÿ$ûìø*ùÆûÞÿ ËöèüÄùÇøPúÖý«9>ÝþûåøAùýû óæåüÁùËø\úèý+­8:¹þïúùƒù7ü8$ Ð£Ó¹üÍùù¢úþD«Ø¯þûùŸùQüF#Ь{·²üÕù#ùÓúMþY”çÒ¯žþû0ùµùbüQ+™²mž üÚù6ùïúiþk‘Ç ~†þûoùþùšüfhv9~”üäù[ùû‡þl}£s_~þ*ûù'ú³üa÷8HˆÍü;ú¬ùBûtþ6E~el¤þZû©ù*ú±üdý3<€Àü#úŒù(ûoþCGthv¢þLûŸù/úÌü‡)âP¢ü,úÉù‘ûÞþŽ]T Hþû¶ù~ú$ý¿öϦ-¥üVúúÂûïþ}1ÆË:þTûúÒúWýÏ ã–Oóÿ¨üú7úìûÿ˜$Îm’Bþ‘ûWú ûŽýþ ˜1 Þÿ¯ü únú?üoÿÄ ‚"f+þ„ûgúDûÈýøkýßÁÿ¶üÖúÍú™ü‹ÿ–´0åF-þ²û¼ú¢û þÑ-»¦ªÿÏü ûüú«ü|ÿ|¤.åA2þÊûÚú­ûÿý§ùŽŽ¯ÿëü6û,ûÎü“ÿ~|í¹8<þÚûñúÐû#þ¤ë‚”¾ÿôüBûBûçü”ÿ[Sʘ%Jþ ü6ûüAþö[¥Ss¯ÿýoûpûý—ÿKAÈ›!KþüFû ü/þï\¡RÉÿ,ýûuûñü‰ÿO9ŸqQþ,ü]û%üCþþ`Š O®ÿ(ýŸû û%ý£ÿ=cE|þeü—ûYü]þì)Jë7ÁÿVýÓûÎûDý«ÿ#Ù;)„þ€ü´ûnüpþø$Ê$ºÿfýÿûûûYý¢ÿ«÷„þ›üæûžü„þëùø—ûªÿqý#ü5ü”ýÀÿ™ëæâ‰þ°üüÅü£þïëàuÜ¥ÿŽýQücüºýÕÿ÷k®£®‚þÛüJüý¾þéÀ§QΠÿ–ýdüoüºýØÿm¥š«‚þâü[üýÚþÍ‘›ÿ¢ý†ü¤üíýðÿúQq…`þËü\ü0ýúþч}vÿýü¶üþ AWKwzþýžüdýÿ²[Ýcgÿýªüàü+þú(;;w†þý«ügý ÿ—AÉ`~ÿÂýÉüóü0þè2+ezþý¢üfýÿ®\âluÿ©ý²üéü0þ Þ 3=yˆþý»üýÿ˜FÉGRÿ›ýÀü ýKþè)"_þ+ýÍüƒýÿ‘7´@aÿÅýöü-ý]þØêöý\œþRýðü›ýÿózªP„ÿÚýçüý)þóÿÁð&|¦þJýáüŒýÿïv¬VŠÿÝýëüýBþ×ú'lˆþ&ýÂüƒý$ÿ +±KsÿÐýñü ýMþ ÀÛôXŽþLýöü«ý5ÿ ‚”/dÿÏýýü4ý_þÒÝæñ[©þjýýºý2ÿõ^ïz/|ÿôýýBý`þÈÍÕçR™þ[ý ýÀý8ÿôVæ{6ƒÿûý&ýPýlþ±´¿ÕJ¤þxý2ýçýPÿóKÕ_lÿ÷ý;ýuý‹þ£›©ÃD¶þýRýòýGÿÜ&­?uÿþYý‰ý˜þ%¡Š“¶A·þ£ý`ýþRÿØ£LÿþZý‘ýŸþ&Ÿ†Œª2¬þ¥ýsýþhÿå‚ëkÿþrýµýÃþ7™nc‡&³þ­ýxý-þ…ÿþ‚Ñ^ÿ$þŽýÒýÜþI™VCiµþÇý›ýJþ—ÿ^Ù±Lÿ!þ™ýåýïþT7VÉþÜý²ý[þžÿ P̬Rÿ-þ©ýýýÿf›7<¹þÚýÃý|þ·ÿò5·¢Rÿ7þºýþÿ`ƒ$+æÿªþíýîý¡þÆÿúÕ ‘‹QÿSþìý6þÿXv è!úÿÓþþþ¡þ¹ÿêÆ‘špÿsþþAþÿ>OîÛçþ*þþ”þŸÿϼ Ÿ¢rÿsþöý(þÿ<_ð5íþþöý†þ¡ÿÞÅ ¢«sÿeþëý/þÿMgþã&ýÿÊþþðý•þ³ÿçÊ ˜–]ÿYþìý;þ%ÿUhþÜëÿËþþ þ¯þÅÿëÂþ‡ˆ]ÿkþþFþ*ÿVaðÔøÿÝþ&þ þ¢þ±ÿÙ¯ðˆ“dÿhþÿýHþ*ÿXeòÔñÿÎþþ þ­þÅÿóΈ†XÿfþþSþ/ÿS[éË òÿÙþ&þþ¶þÊÿí¼ìmpHÿ[þþTþ:ÿbeïÊëÿÝþ/þþ«þ¶ÿÝ´îwcÿ{þþYþ8ÿaeá·þîÿßþ1þ þ½þÏÿë±àp‚aÿuþþ[þ5ÿOLÒ²ûïÿæþ?þ8þÐþÎÿߣÐYl^ÿˆþ3þ|þLÿ[JɨïäÿåþHþEþÛþÔÿÙ“ÁRi^ÿþCþ‰þLÿM3°×ÖÿëþcþcþêþÖÿÖŠ®8V[ÿþUþ›þ]ÿZ7£~ÛçÿùþjþmþÿêÿÒs“%Q\ÿ þcþ¼þ„ÿp6“_«¼ÿéþuþ…þÿïÿÑmEUÿ¦þlþÀþ„ÿp7’[¤³ÿçþþ™þ,ÿ éw/HÿœþjþÈþ‘ÿƒJ˜Q•«ÿÜþsþ”þ4ÿïqqë:ÿŸþþãþ¦ÿŠ@‡D«ÿáþxþ˜þ8ÿøytí<ÿšþtþÝþ°ÿœLˆ?‹§ÿÞþvþ”þ4ÿôwtí-ÿþrþáþµÿ Q‡3z›ÿÚþyþŸþAÿ&…yé8ÿœþ{þèþ·ÿžMƒ0v–ÿÚþþ«þSÿ6pXÇ÷ÿ+ÿ£þþúþÀÿŸCpm–ÿÛþ†þ¼þdÿ>û]EÀúÿ3ÿ¶þ¬þÿÍÿ˜0^aÿéþ¦þØþnÿ9òZG¾òÿ*ÿ¬þ¥þÿØÿ¥1SüOŠÿëþªþáþ{ÿAïJ2²ðÿ.ÿ·þµþ.ÿìÿ§)GòG€ÿæþ¶þüþ•ÿOî= ¤ëÿ6ÿÆþÈþ6ÿäÿ™9å?‚ÿðþ½þøþÿJì9“Üÿ1ÿÍþÔþCÿñÿ¡-Ù>ŽÿÿÎþÿÿDß,–æÿ>ÿØþßþMÿöÿ¡!Ë2…ÿþþÎþÿ”ÿHâ,…Öÿ7ÿÜþçþTÿüÿ¦Â'ÿÿáþ!ÿ±ÿ]ãémÎÿ>ÿñþÿuÿ  üþ§ÿÿõþ5ÿºÿSÊùÐ\ÈÿJÿ ÿÿwÿŒãéÿ(ÿÿHÿºÿE»ïÎfØÿWÿÿ"ÿyÿûÿ…ãéœÿ+ÿÿMÿ¾ÿI½êÁTÊÿPÿÿ*ÿˆÿ „ÖÜÿ6ÿ#ÿZÿËÿK²Û±IÐÿjÿ3ÿ>ÿ‹ÿ|ÊÒ‘ §ÿKÿ$ÿIÿ´ÿ<§Ô¹`ãÿlÿ$ÿ)ÿxÿ÷ÿuÃË”(§ÿ?ÿÿHÿ²ÿ1¡ÛËtîÿiÿÿ"ÿwÿúÿ{Òâ & ÿ:ÿÿQÿÀÿ@«àÆbÝÿcÿ ÿ)ÿzÿöÿwÏÞ—–ÿ;ÿ&ÿWÿ¾ÿ8 Ï±Väÿ{ÿ?ÿAÿ…ÿõÿk»É’*¶ÿVÿ.ÿRÿ´ÿ1ŸÑ¶_êÿzÿ6ÿ:ÿÿñÿc²ÂŽ(°ÿPÿ*ÿNÿ®ÿ'”˹bæÿwÿ:ÿ@ÿˆÿùÿn¼Å„¡ÿUÿ@ÿfÿÂÿ6™Ã§Tåÿ}ÿGÿNÿ‘ÿüÿl´¹{¨ÿVÿAÿnÿÈÿ5³”AØÿ}ÿLÿXÿ¡ÿi§«s³ÿfÿLÿqÿÆÿ1Ž·™CÖÿ{ÿOÿ_ÿ«ÿu¬©l ¥ÿ[ÿFÿqÿÊÿ4µ–?ÓÿuÿGÿXÿ¢ÿ q®«kŸÿUÿFÿwÿÙÿGµ‹6ÑÿyÿLÿ]ÿ§ÿ q¬ªk¢ÿXÿIÿ}ÿÞÿE’­‹7ÑÿxÿLÿ^ÿ¥ÿaœ¤r°ÿcÿOÿ|ÿÖÿ=±–DØÿzÿLÿ_ÿªÿ h§©q©ÿaÿTÿ~ÿÒÿ7‹±•EßÿÿOÿYÿÿbžh £ÿ^ÿTÿ„ÿÚÿ7‚¡†=Üÿ…ÿ[ÿmÿ¯ÿ`œ¡l±ÿkÿYÿƒÿÖÿ7‡¤ƒ7Ûÿ‰ÿ^ÿlÿ­ÿ^_ °ÿkÿWÿ‚ÿÙÿ=ˆ¡‚6ÖÿƒÿYÿjÿ°ÿg˜’X¬ÿmÿbÿ’ÿçÿA–z4Úÿ‰ÿaÿsÿµÿc’ŽW¥ÿgÿaÿ‘ÿãÿ9{“u*Óÿÿkÿxÿ²ÿ\’’Z¬ÿpÿcÿÿáÿ?„œ}3Öÿ‰ÿfÿvÿ¶ÿh˜‘Zªÿlÿdÿ“ÿàÿ7™w,Òÿÿ]ÿsÿ¹ÿf–Qüÿ«ÿrÿjÿ›ÿêÿ<|”z3ÙÿŒÿgÿuÿµÿ a—”Xþÿ§ÿoÿgÿ‘ÿáÿ;”n#Ìÿ…ÿiÿ{ÿ¹ÿ_†Oÿÿ¬ÿqÿjÿšÿêÿB‚hÊÿ‡ÿnÿ‡ÿÊÿcŠ|Gýÿ±ÿ}ÿxÿ¥ÿîÿ9t†h%Ôÿÿqÿ…ÿÃÿX{G÷ÿ«ÿ}ÿ}ÿ¨ÿïÿ;p€f'×ÿ“ÿuÿ†ÿÂÿaŽƒI÷ÿ§ÿuÿvÿ¨ÿöÿF€‹eÇÿ…ÿmÿ‰ÿÌÿ^v:éÿ ÿwÿxÿ©ÿøÿGz‚XÃÿ‹ÿ~ÿ›ÿÙÿ%d€p8îÿ¦ÿÿˆÿ¶ÿûÿAuZÆÿŒÿ}ÿ—ÿÑÿZp3åÿ¡ÿÿ„ÿ°ÿöÿ>s{R Æÿ‘ÿÿšÿÖÿ eƒq5ëÿ¨ÿ€ÿ…ÿ¸ÿLvxP Âÿ’ÿŠÿªÿæÿ(]r`-çÿ§ÿ„ÿ‹ÿ¸ÿüÿ>mtN Åÿÿ„ÿ¢ÿÛÿYtb0íÿ®ÿ‹ÿ’ÿ¿ÿþÿ>lrM Æÿ‘ÿƒÿ ÿÞÿ&`{m3æÿ¤ÿÿŠÿ¹ÿýÿAmpJ Äÿÿÿ¡ÿàÿ)e{f,ßÿ›ÿ{ÿ‹ÿÄÿT|zNµÿ€ÿ{ÿ¨ÿîÿ6mf'Øÿ—ÿ}ÿ•ÿÏÿTzp;ñÿ¨ÿ{ÿ~ÿ«ÿñÿ:nzYËÿÿ{ÿ”ÿÒÿ^zj9óÿ°ÿ‡ÿˆÿ²ÿ÷ÿ@pwUÎÿ“ÿ~ÿ™ÿ×ÿ#`zg2ðÿ®ÿ‚ÿ…ÿµÿúÿ?ntOÉÿÿ|ÿ–ÿØÿ%a~n3äÿ¡ÿ€ÿ‹ÿ¼ÿIvvM Éÿ™ÿ‰ÿ£ÿßÿ$^vb-ëÿ®ÿ‡ÿ‡ÿµÿEmlCÃÿ’ÿ…ÿ¥ÿáÿ$ZlY*ëÿ±ÿÿ•ÿÀÿCnoI Âÿÿ†ÿ©ÿèÿ-ar\$äÿ®ÿ’ÿtkabber/sounds/psi/groupchat_their_message_to_me.wav000064400000000000000000000176361477701321300227710ustar00nobodynobodyRIFF–WAVEfmt |ø*datarþÿýÿüÿûÿüÿýÿýÿþÿýÿýÿÿÿÿÿþÿýÿüÿûÿüÿüÿûÿúÿùÿøÿúÿûÿþÿþÿþÿþÿþÿýÿþÿÿÿÿÿþÿþÿþÿþÿÿÿÿÿþÿýÿþÿÿÿÿÿÿÿÿÿÿÿùÿøÿøÿìÿãDÿþsÌ0<ÿý'‘ºü8þõ2uþHù3ÿ¢Žý/û\ÿH*ýòú ãRþÕüÖÿzoÆþÝ$ÿ4þþJûJýùÿÒ÷ üñX[ýõœü é3ü¨ôÂü ”’ü-ö¹ýÎ>QüjøÿDf:ýûBÿ§óþÿfÿHÿ®þjÿ Ï$ÿûþ~aþ>øýþÌoýäõ†ü“¢|üVõýÉ8üö©ýâ§ÇüUøþÉuÆýMûÿñXoÿ–þPÿjÿìÿÔ@ÿÃûþt{uþ¶øãüD}Óý­öªüîjý˜õ£ül`Ûü=ö+ýr@ý#øéýŒ÷_þ:ûvþjt:îþ¥þÔþIoP‘þwû\þ¬n-þrøý~x¾ý™önü’olýÕõxüýE7ýhöýG fý#øËý™"Fþ×ú^þÙÙçÿ6þ½þÀÿœ¨ŠÃþküáþÛgdþgùsýÌ­ þe÷¹ü"Ûý_ö¹ü½ù?ý‰öîü%$œýþ÷rý¬iþhúõý<ŠÒÿmýDþ9`‹£|þ$ýXÿg¬wþWúÐý-5þÿ÷Õü›„ÇýËöüCíý»ö¸üòCÎýë÷3ýµÖfþúØý̓ÿôüoþØ” ±þîý•ÿÉ´þ ûâýz©œþ—øµüýUBþ0÷QüÊâòýèö‰üÉpñý³÷õüË%gþ¤ù¤ýøHaÿZü;þn!³Vÿ¡þœþ^RªþªûTþ ¨þCùýË\þ ÷mü~³þúöTü±¬-þŠ÷µüþdþ%ùRýPÏCÿ¹ûþ啊Éþƒþ(ÿz È¢þ:ü«þÇt€þ©ùeýVfPþû÷§üDYþR÷¦üOþÍ÷éü×\{þVù[ý;ÈRÿ¬ûØýíÙš‚þEþIÿÜ_tþ‘üÿ£ësþ8ú½ýþâ`þ‡øöüý=þ«÷ü/5Sþì÷¼ü´v”þ9ù<ýYüBÿUûÃýPQ þLþÏÿ%½߈þ$ýXÿ2eœþÐúêý†y˜þùý‚™yþ5ø­üËÓmþYøÑüS+ÁþŠù8ý#íXÿkûÁýP6LÖý9þ`t’þ©ý‘ÿÆôÕþtûþõâÇþ¿ù6ýö2´þ¨ø¨üa·Âþ”ø¥üMìþnùý6_ÿ$û‹ýŒ…+sýþm°NŒþþàÿŽw»þåûjþºwÇþ'úrý›µËþ.ùíüOÂþëøËüâýþ«ùý qÿ8û—ý“-Hý þ©ó+ÿmþuþ4Mø²þeüËþpîËþªú¶ý_dÏþ{ùýÝ Ýþ2ùåüÐäçþ´ù$ýaÿûŽýÁà ÷ü þ2å)ÿoþýþi¥þíü)ÿ[ÓþEûþÝÆñþ,úRý[–ÿ·ù ý`¡6ÿ úýÕ ‘ÿ%ûeý´íÆüæý#^×åþ`þHÿÀ±Ïþ~ýIÿ—óÿÒûþon4ÿžúKýð[[ÿ"úÿüwÿFúõü”´ÿ&ûFý¦û)¸üÍýLšÁ”þUþ¤ÿ }ŽÄþéý’ÿT|ÿ^üWþÿ^ÿ(ûyýñ„ÿ‡úþü¢J©ÿžúýYèÐÿPûVý˜ù"—üÆýo±¢fþUþÖÿ"FTÜþ;þ¸ÿ#ÿ³ü‘þÞ¶TÿdûºýW{€ÿ8û„þL7ýþ'ü^þ ØUýªûÅVýÂûJ(ýaüÑÑû%ûGãäÚùüW#ÿáúÜýQ¤jþ«ûÿ“;þgýÈKþ¨æ@ü¹ýDŸþ¨úÿÎÛñúÊøØà°ø³øìÝLø<ú„ݸÿoø[ü8Yþóùmþs}¼ý-ü¢_E4ýkÿ¶ ýÒýÎç~þ©ú ÿ¤ðûAùÊÐŽ³ùÊøŠ¬%ø´ù¼JöÄøwû;BZÿ6úäý ÒIþ=ü·³ þTÿÑWýCþÌw@þØúnÿÎõÉûù¥î×Âù‘øNäÍ´ø ùNª©²ø—úÞßóùïüµ5Ûþ6übÿ€þkþWÿŽ£øý–þC•þuûeÿ/¯0ü¢ùP¤gúùÚ/Å<ùoù31[áøµúÊß!ðùÇü¸†ñþÌûÿéÈvþŠþ (ÇþŠþ‘ýþ)üGÿW[»ü=új£Y´ú[ùÏõ¸wù„ùßš)ù¾ú‡Ü…þùvü•Û^ÿ­û~þÀ>Ãþ þz_gÿžþãsÿÙüÿž,pýÀú×ÿÝ”—û•ù_&%úvù?×)wù<ú ìù¶û>†ôÿ>û·ýÒÿRýÉÿÉfÅþåÿo×ýÿº#þ‡ûžÿi9üûù¦Ò7¬ú“ùæ°n°ùþùÌ]`ÄùMû<ú5Ñú*ýà]ÿªüÿ ?ïþ,ÿç}“þ ÿÞ8ƒþ<ü²ÿjö”ü‘ú@ÿúäù¹^}Þùú²k¤·ùåúp¥|ú}üöyÆÿ2üjþ1ñ4ÿ™þGÃPÿ$ÿ>ÌèþÞü§ÿÔ±éüûú‘øë7ûÿù‰1™úýù€`ÆÜùÏúøuÁ†úKüÛ½üþ R‡ÿVþÌÿÁÎÿmÿÒFÿrýÊÿRFJý—ûx^¹·ûxúS·”„úú/úµú“m'¥úöû±ÿCïû»ý'Å£ÿîý‚ÿ7eÿexÿÛýÿÁ;Éýáû&êÍ#ü’úûg»èú'ú¼ä>ú¸úML]ÙúÜûp ™èû@ýå ËýëþíÚÃÿïÿ{›ÿŠþÊÿ8µ þˆü/?i˜ü3ûàÂŒgû|úLÆú¢úó[Èëúmû.[íÈûÝüæ°]Dýcþtoÿåÿ&ÿâÿªKdþý/ÀÛü©ûØPZ°ûÑú\1?ÿúÌúã8Îûmûr)½û•üÎÚ’2ýþ'êúþ“ÿ¼ÿ'å£þžý5=ÖFýü¨ÐMüû4Õ=Pûãú²Õ"ûtûý]0¾ûŒüáóüøýT!¬þzÿhÞÿ¬Àÿþ Ÿ¬ÓýˆüO1E½üˆûÂ0Tü:û4½ûû‹|#ünüuóÙýÂý%IK˜þ:ÿo^ëÿT”vÿtþÊÿ-®DþÕü »E*ý¾ûvÐjfüRûÝ?2 üû7ï³WüZüO$ý‡ýÿv|vþõþo£ E”ÿßþòÿÉO€þNý H†ýü?_kØüû¤ï;^ü ûøÔávü-üa)ý:ýæÀ½KþŽþjGÆÿîÿ®ÿ<ÿl½þ«ýöÖ²ýpüO9þüÇû‡£D¨ü»û͌ԸüRüñë`KýDý¿«äfþ~þX![¬ÿËÿÅÿ}ÿ'âïþüýþÿ†´#þÉü–/uýüBDJýíûŠP ý_ü¯¸~zý@ý³¸âQþgþXFo•ÿ¬ÿÌÿŸÿ þÍÿ.þìÿL§Kþøü g“ýFüF-$ýü.ùýgü§º‹{ý(ý–à NþAþXsŒfÿhÿÜÿðÿ$±?ÿyþíÿ‡þ<ýâÿéýtü Ç7jý,üQLý`ün§·žýýzË*PþþM–¢Mÿ?ÿêÿ-8{R]ÿÖþ¬9µþ¡ýòÿ±Ò#þÏüÿÿaÀýtü#¢£ý•üAoÓÖýý:»_qþêý²èFÿøþÓÿsnCkÿ#ÿmÿÒþÝýîÿ{¼Oþÿüôÿ1ãý”ü“ªý”ü6hÚÞýüü1ÕpUþÎýÖû$ÿÐþãÿŸw!æÿ‡ÿbÿ *Îÿ4þôÿ'€zþQýñÿäì!þÑüôÿ4ûý¾ü /Úþý¹‰wþÂýáÿ¬þ×ÿÍ”ôÿ¨ÿ”ÿ¬ÿ:ç‰"ÿŒþþÿÐF¹þ¬ýåÿˆ¼cþ!ýáÿëì9þþüçÿàÔTþ?ýóÿއœþÑýäÿÔ)2ÿšþÀÿÞ´èÿ…ÿ™ÿØÿG³eOÿÐþõÿ(øþæýÆÿ2§¶þfý³ÿŽèŒþ*ý·ÿ§Þ€þPýÓÿi˜´þØýæÿÉ"#ÿ•þàÿñ£Åÿyÿºÿýÿ:‚Qxÿÿèÿ; :ÿ8þ¶ÿÙ}åþ«ý´ÿG»¶þiý¶ÿe½´þýÁÿ:ŠÕþåýÑÿÇ90ÿ|þÆÿ Ï»ÿ8ÿ§ÿArPõÿ{ÿbÿú¦FÿžþßÿŒ) ÿþÄÿéuæþÉýÀÿÖþÀý»ÿüsÿþ½ÿ–0Pÿþ¼ÿÒµÿ-ÿªÿZ…BÒÿoÿˆÿ;ÖuNÿÝþùÿJì0ÿbþÍÿ¨E ÿþ¸ÿÌmÿþý«ÿ¸a8ÿ3þžÿi3uÿþ¤ÿðßÈÿ-ÿ§ÿb‡)Áÿÿ¶ÿ/Ÿb{ÿÿâÿÛmÿ˜þ«ÿJ'^ÿ\þ–ÿoWeÿFþˆÿiJtÿsþŒÿ.žÿËþÿ»ÕëÿBÿ—ÿG6Çÿ•ÿÃÿ3ŠA‰ÿMÿóÿέ‡ÿßþºÿ‚ÿšþÿ"/ÿ†þŠÿ'*™ÿ˜þ„ÿ ¬ÿÅþ‰ÿÉÛÚÿ6ÿ£ÿdƒ¬ÿ¬ÿöÿ;Qµÿ„ÿêÿ“”½ÿÿ¦ÿÊí¾ÿÊþtÿî.Çÿ þSÿôJÔÿŸþTÿè4ÖÿÃþiÿ¾øÿÿpÿnÄ+}ÿ{ÿoVéÿ‘ÿ§ÿ ‡Y ÿ@ÿÓÿÁǰÿåþŒÿá¼ÿ³þpÿö0Äÿ¢þ^ÿò7Þÿ½þOÿµÿ_ÿiÏ4mÿjÿŠjÜÿxÿ©ÿ9“K•ÿJÿéÿ½§¤ÿûþ­ÿèõ¬ÿÃþwÿè(Êÿ³þ_ÿß+àÿÅþWÿÃõÿýþ^ÿ„æLÿpÿ3–A·ÿŠÿÛÿGj"œÿ}ÿ›y¬ÿ7ÿÃÿµÆ¾ÿÿ‘ÿ¾ïÇÿáþ|ÿÄýÞÿóþwÿ¥éýÿ ÿuÿqÄ]ÿvÿ-˜J°ÿwÿØÿbt‹ÿ•ÿ!ŠLžÿ\ÿóÿ§Œ°ÿ-ÿÂÿ¯¹Ëÿÿ‘ÿ¢Ûëÿÿyÿ‘Ûþÿ,ÿzÿjÀ \ÿsÿ2 F›ÿrÿñÿ|lÛÿ{ÿ³ÿI!†ÿyÿ¤c”ÿKÿîÿ²•©ÿ#ÿÂÿ³µÄÿ ÿŸÿ”Áîÿ5ÿˆÿo¿LÿlÿE¿Dwÿ[ÿ £j³ÿZÿÎÿ}‡ëÿhÿ™ÿH 5€ÿdÿ §l£ÿIÿÜÿ¥”¾ÿ:ÿµÿ´éÿ2ÿ‡ÿvÇHÿoÿH·9uÿaÿ¤`¬ÿ\ÿÔÿƒíÿbÿšÿR£&qÿmÿ(·Z€ÿFÿûÿº‰£ÿ5ÿÊÿ ¤Ñÿ<ÿ¤ÿ€³üÿFÿ~ÿRµ5sÿcÿ hªÿZÿÚÿ‰ŠÖÿNÿ£ÿp±TÿnÿA¾DvÿZÿ°iŸÿNÿÞÿ˜ŽÎÿJÿ¬ÿx§\ÿ…ÿA¦7ÿiÿ j§ÿNÿÖÿ”‘ÎÿIÿ´ÿ~¡öÿUÿÿX®!mÿwÿ*¤G•ÿsÿ†^ÀÿvÿÛÿitðÿ~ÿ®ÿ>‚'•ÿ…ÿ Q±ÿqÿàÿzvÑÿcÿ¸ÿh”üÿeÿ•ÿM›uÿ„ÿ2˜5“ÿÿƒVÂÿ€ÿ×ÿ[rþÿ‡ÿ¥ÿ3{*Ÿÿ…ÿ ‡V²ÿfÿÜÿ„‚ÐÿUÿ³ÿtœñÿVÿÿ`¢ gÿ‰ÿ@œ-Œÿÿ †T¼ÿÿáÿ`fòÿÿµÿ7w&§ÿÿxVÂÿpÿÖÿvàÿ]ÿ©ÿhž[ÿŒÿO©!jÿ}ÿ4 :ŠÿvÿˆN¼ÿƒÿâÿ_hóÿÿ¶ÿ1l$§ÿ”ÿtVÂÿqÿØÿx€àÿ_ÿ¬ÿh—÷ÿ]ÿ™ÿWœqÿÿ7’/–ÿˆÿ yD¾ÿ•ÿîÿUSíÿÿÂÿ0d!³ÿ¢ÿaNÓÿ‰ÿÒÿ]yïÿoÿªÿXoÿ˜ÿD”yÿ‹ÿ3’)Œÿ‹ÿz4¯ÿ›ÿY>Øÿ©ÿäÿ5BÃÿÁÿH4Ùÿ¥ÿâÿMYéÿŒÿÅÿOwùÿuÿ©ÿVnÿ•ÿG•ÿ‘ÿ-‰'•ÿšÿp/¸ÿ¤ÿûÿJ=ïÿ·ÿÏÿE%Óÿ¬ÿêÿKYêÿ„ÿÀÿ]…öÿiÿ¢ÿZ›aÿ‹ÿO¥lÿƒÿ?˜‡ÿ•ÿ'z*¬ÿ£ÿK<éÿ°ÿÔÿ"G Êÿ§ÿñÿ\XØÿ{ÿÊÿj„ëÿeÿ®ÿh—ôÿ\ÿ¢ÿdœaÿ—ÿT• ÿÿ1u«ÿ«ÿ N0æÿ¼ÿÖÿ"L!Èÿ£ÿôÿbWÏÿyÿÔÿp~Üÿ]ÿºÿz–äÿRÿ¬ÿr˜ïÿaÿ©ÿX†…ÿ®ÿ6d¶ÿµÿ9+õÿÄÿÐÿH+Êÿ ÿïÿb[ÏÿsÿÐÿz…ÕÿUÿ½ÿƒ’ØÿSÿ¸ÿ“ÜÿYÿ¶ÿq‰íÿ~ÿ¾ÿHg¦ÿÆÿ?ÜÿÌÿëÿ6Òÿ²ÿóÿUQÓÿÿ×ÿnx×ÿaÿÁÿ}‘ÚÿQÿ¹ÿ}“ßÿ[ÿ¸ÿn†êÿrÿ»ÿXsöÿ•ÿÂÿ0O ÈÿÎÿÿÿ!#ÙÿÎÿüÿ>7ÜÿÿÝÿYdàÿwÿÅÿkãÿeÿ¹ÿr’æÿ[ÿ´ÿpŒêÿjÿ»ÿ`tñÿŽÿÆÿ:OÂÿÓÿ $úÿßÿÛÿüÿ/3êÿ§ÿÕÿIeóÿÿµÿZõÿaÿ¤ÿh¢ùÿYÿÿf¡ÿÿeÿžÿSŽ ÿ«ÿ=m¬ÿ¾ÿ9èÿÖÿåÿ("êÿ·ÿÙÿ9Zûÿÿ¸ÿG~wÿ ÿS—iÿ˜ÿSš sÿÿG† ‰ÿ®ÿ9g °ÿÉÿ9 ãÿèÿûÿÔÿÕÿG¬ÿ²ÿ)p“ÿšÿ8Œ}ÿ“ÿE–vÿšÿI ÿ®ÿGlüÿ£ÿÓÿ7<îÿÎÿøÿ òÿóÿÔÿûÿ9$Êÿ«ÿd1§ÿ”ÿ#„&‡ÿ‹ÿ5”!ƒÿ—ÿ>† „ÿ°ÿElúÿœÿÑÿ9?ðÿÈÿôÿ êÿùÿÜÿíÿ*)Úÿ°ÿúÿ_8¬ÿ‘ÿ€6“ÿ‡ÿ*‘%}ÿŽÿ?’~ÿŸÿC{–ÿÂÿ:Oóÿ·ÿìÿ/êÿéÿ çÿðÿ#&àÿ´ÿùÿV6¸ÿ“ÿ }8–ÿÿ“2…ÿ‡ÿ-Ž$‡ÿ™ÿ8€•ÿ°ÿ0[¹ÿÚÿ %öÿêÿ íÿðÿ%åÿºÿ÷ÿS:¾ÿ“ÿzC¡ÿ~ÿ=Žÿ}ÿ ’1ÿÿ+~›ÿ²ÿ0Vÿÿ¸ÿàÿ(%ïÿèÿ îÿîÿ'ìÿ¼ÿñÿK<Êÿ™ÿýÿnA©ÿƒÿˆ;‘ÿ€ÿ$(‰ÿ“ÿ6ÿ³ÿ=cûÿ§ÿÖÿ5:íÿÍÿüÿ!æÿþÿ!Ôÿéÿ/7àÿ©ÿöÿ\=¶ÿÿ ;˜ÿÿ 1‡ÿ…ÿ-Œ‡ÿÿ:x —ÿ¾ÿ8Tøÿµÿâÿ)"íÿæÿïÿëÿ)ðÿ¾ÿôÿL;Èÿ˜ÿtC©ÿƒÿ‰<”ÿ‚ÿ -‹ÿÿ+|šÿ°ÿ-\´ÿÖÿ'.öÿÝÿýÿúÿðÿòÿÈÿðÿ=7Òÿ ÿùÿhG´ÿ„ÿ†EŸÿ~ÿˆ8”ÿˆÿ€'šÿ¢ÿ&d²ÿÊÿ"6ýÿÚÿôÿðÿýÿÐÿèÿ7>Þÿ ÿêÿ_NÆÿŒÿùÿwJ«ÿ€ÿ ‡Aÿ‡ÿx-©ÿ¨ÿWºÿÏÿ/ûÿÝÿûÿúÿìÿ #ùÿÆÿæÿ:>Üÿ ÿîÿbNÀÿÿøÿ€Q©ÿ|ÿ ‡AŸÿ‡ÿ)žÿ§ÿ%_±ÿÌÿ&3õÿÔÿúÿæÿúÿÖÿàÿ)=íÿ¨ÿâÿRQÔÿÿëÿkQºÿ…ÿ|D©ÿŽÿt*©ÿ«ÿ Y ¶ÿÐÿ#5öÿÏÿ÷ÿãÿøÿ Öÿ×ÿ@øÿ®ÿÙÿEPÞÿ’ÿâÿbTÈÿ‡ÿóÿpH¶ÿ‘ÿ q1®ÿ¦ÿ^·ÿËÿ"8øÿÌÿöÿ$Üÿïÿ#ÛÿÎÿC³ÿÌÿ8Xòÿ“ÿÒÿY^Öÿ‡ÿâÿhVÆÿŒÿøÿh=¾ÿ¤ÿ Z¾ÿÆÿ9ÿÿÑÿðÿ áÿíÿâÿÎÿ > ¹ÿÊÿ0S÷ÿœÿÎÿM\âÿŒÿÙÿ^VÎÿ’ÿóÿaAÈÿ¦ÿT#ÇÿÉÿ6Ôÿòÿ ãÿëÿäÿÒÿ :½ÿÆÿ+Sþÿ£ÿÌÿtkabber/sounds/psi/presence_available.wav000064400000000000000000000152701477701321300205070ustar00nobodynobodyRIFF°WAVEfmt |ø*dataŒþÿýÿÊÿª2Ë+þÏûÔýã—iÅšúøÌý5=8°ü”÷×ùñþàO§ Jùqò4÷Šÿœß â fUûãó®ôaü­µ ¯ ]ùû"õþóèùûI Ý 0­þ«õdñ„õA W z¶øóó›ùý7 ‚ÄýÍó“ð2öÒÐ ‡ñ ªÿ_ô¾îTòvý, ®ªI2ø;ïŒïûø©Ý/û‹ñ·ï*÷Û’ þhó\ï¯óêþü ô³÷«ï(ñdú›P—ŒûÔñFð;÷Ã" |É ýþgóïQô;ÿZ •þ ½¾÷ð›ðrùêÆ4v"û9ñPï&öiz =| Qÿ±óÎîñò?þ¸ 'Kë`÷‘ï©ðâù{­\8…ûñï=ö™‹ s Òÿ9ôÐîÖò þB ðLì÷•ï‚ðú‡yCBèûÖñ;ïÆõíÎ ¸ƒ äÿ…ôrïdósþK fà ›E÷¶ïýðeúÑaÑö¬û«ñgïúõ 3 ,› ¯ÿôëî%óLþV Þ-¼`÷ªïÈð<úÅ ¬)ûPñAïSöà ÷( Hÿñó!ï]óŽþ ˜Ó ¨b÷ÅïñðMúâ¢Ï|ûQñ ïÒöøx ™Î 2ÿôó5ïšóÎþ¡ œ˜ <÷Áïmñ*ûZQ ±’úeñVðæ÷°Q ï €þÍóÚï›ôkÿ’ Û ‹éö^ðTò­ûRø{oúÝñèð,ø¼= —… Vþ ô=ðÔôˆÿk ¢y œP÷¯ðfò‘û«J&žúòþð$ø su OþôMðõÄÿŸ ¾M <òö€ð…òçûuóRítúòñ<ø¦ j^ .þôMðõëÿØ » åàöÔðãòõûEªÝoúò?ñ˜øû ãöýô¥ð°õræ Y{ ~¯öÜðKó¨üƤ < úò§ñù>ò þüƒô"óøZ´  ™Vþ?÷Ûóëöeÿ± =á <ÿóï—õ) „uÝ qý†ï›éeðÀþ­ ƒ µüñZë–ïˆýö F² ’Mû%÷‰ø2ýw¦úÿ¾ûsû;À ã¾öˆï?ðù>²`£Õðæ†æ@óP) ºôkê ëàôoã <Þ <_üÐùqûûþUeýú,û 9Ï 7 ¾Óú®îøè•í„û Cf±ûþ…ì\âOåôÄåý:¥¦óÉêlìö:» Ö €ÕüCúˆûgþ¯ÿ‡ý úùIüV= &oùP÷öëèÉï ÿhX]¥ û`ëåäùê#úò $4ºÿOóéí•ð ù¹ð” -”ÿ˜ÿ‰ßþâùÊõ¾õNû-â~‘6ô×é©èò{bK ûh÷ê¼æ^îûüÓ ‹Ê» žþ6õÁñ¢ôfûó<ø…΂‰põü½öNó@õýüC°9 ïÿNñ èé½ô‡qÃ7õ®é*èÄðGÿ¿ 9øbúýYö`ô÷¾üð¹ißèÞÿLû}ô™ñhõ+ÿó PÀ oüJîGçë9ø ýR¹«óÁê}ë®ôrÙ ì –”ýøø„ú}ý'ÿdÿ@ÿm¥ž´ €«€÷,ðï¹õìl{# ù—ëÎæÚì(û| viuÿÿŸòìeî·÷ãü _ + å%þ3ûû+ü÷üÁüGü&ý–ç¡ Û ±ÄþŒô÷íÉîƒ÷eÚ•ï?ö‘ê%èðœþQ ²jµ wý˜òTî´ñSúºÓ Ç |š¶þýýGý}ü"û¬úŽüR¬v ‰ °œüuòöìyïâùÖfµôó^ê0êbó¼¾¢E&ûŸòªðõéü9"ò÷&¾ÿ}ÿþrûÑøPø‡û– `R èÆúžð`ì­ð4ü G] ŠÿûñÕêíìåö¶Zž˜úLôŸó·÷ÜýöS:—Zý*ù^ö<÷jü‰X Ü *y÷îìÏò\ÿ§ ‚c íüñúënïsùLó 2¼ LûQöö1ù‹ý,4ÙüS˜¹Þ&ü2÷Áôàöšý¬Bv Iõ\í%í>õEbH€°ú½ðíòçûf% Æ  ÊkûøMøÃú¯ýÞÿ2S܆SóÐúMõmóîöÿ·´så †þFóíÈî¹÷DçéÝø¯ù¸ñðóô³ý&è à Î|ý×úúnûvü—ý(ÿŠ¥ySÚïø€óÀò°÷Ä è/œü8ò‹íœðúíê^Ž ý ùÊòiòR÷¿þd增¸’þÐü ü™ûMû­ûžý_Û= ª ÿ:÷òOò­øÏl 9Þ‚úñîœò…ük¶% <Ðø0ô§ô7ù]ÿvå¡·mk¨þëü$û¿ùÝù‰ü X Πݧý^õ¿ðMòôùÆŒŸ ûÁøµð8ïµô‰þ[$Ò ÐÿÚø¡õŸöˆúXÿFC`Šcóúÿ:ý-úø‚øTü˜ëƒ A üêûµóðóÍû¹  ã æV÷ ðoð’ö!Þ> ñ : ÿtù<÷lø±ûJÿŽ8^%;^ýlù÷ÿ÷‡üw  ä ÇdúµòOð„ô¼ý û¯× «öñ–òçøw•} ¢ œÚþ úùúUü þ‚ÉqŠ…ðü`øöõh÷åü¡O ² e bÉøÙñÄðöŸÿM ø?ªMþDöÂòÒô ûW¼s r>õþ-üHûµûŸü™ýÊþލܦÑEü÷åôH÷Óý g Ø Y ˜X÷¥ñÜñè÷Fß D ™5ýªöiôùöªü¤ŸŒº‡|ÿ–ýÜü•üSüdüpýâÿ]©#s‚ûµõôw÷ýþŽG ‚ ÿÿVöªñóÊùåg 7 f §3ü÷þõÍøÀý˜‡éq_Ž>ÿþ³üfûû\ü®ÿá ºÈù¹ôô‚ø¤ñ³ ¯ 4ý<õòÀôåû]ƒ å d±ûØ÷±÷™ú¨þóK œª•ÙþyüiúÜù°ûåÿ%& ² iÿ`øòóiôðùU ” g oºûõ,ó„ö…ýÁ ! ¢.üNùmù®û”þ œFX1Ì“ÿæûwù#ù®ûœ'× ² TAþk÷Ëó$õ4û€b ã  !-û|õ\ôø‘þÁ­oȸü™ú˜úü9þ"‘§Œºìµþ ûø³øþûA… ˆ QíüöÑó,ö¯ü£¡  ž³kúÞõ»õ«ù£ÿè]+$ýšûÎûîü/þPÿ‚þ™©noÆþ‘úÏ÷8ø.üVÒ iêûèõô[÷<þ¼«  åÃù€öJ÷Uû æ“ú,þýýBýuýöý^ÿª'Är«þù÷#øÃü`  jªú{õÀô¸ø’ÿVB Ì Y ÿßùŸ÷çøœüæ?`fv$ÿQþ³ý"ýÎü5ý×þª¼z¾sýêø¸öhøý,O À •ú¥õŸõÕùn’¬ ?¨þ2ú’øú`ýïVŽPûÿ ÿèý¹ü ü”ü»þ] ù¶üøöÞø€þ Z ˆñÿcù±õgöûvÅè_"2þ¦ú£ùûãýÁš.ój¸¼dÿÁý"üNû1üÿÝ>Œ·zûf÷²öÛùÐÿí Œ (µþ÷øLö¸÷eü$“+> þ>û¥úñû2þ`Ée¢²iu­ÿfý]ûŽúçûZÿ§×YG¨úûöÿöÅú×¶Í µô¹ý¹øðöáø„ý´Aþ~þâû›ûÃü{þùÿú±XÞéþÿEýçú"úÂûƒÿ‹þõÿúíöu÷“û²+… ÌíýÁø©÷ú€þþ»õüõRþîüÅüaý=þÿíÿøPœù»ÿÿ¤üúŒùÖûLÇ vþCùÞöOøøüÜxã·lüù¶øLûRÿýùÍ»Ñþºýyýµýþþfÿݱvcÿôû¤ù»ù¤üfï'øÉTýãød÷‚ùMþ¦H¼ûsCü úIú˜üØÿª§B¯qÿœþ þ¥ý„ýþFÿ"i=6ÉþUûuù3ú˜ýPA¶ùª’üæøKøøúœÿ$µd•ÿ8ü¶úmû¼ýfU ©´³óÿ\ÿ þÆý4ýkýÄþ†=þÎú?ùuú7þö•s)±óûôøùýûjY7mœ*ÿŠüžûlüMþP§ç’JäÓþsý“üÞü˜þZ g”™ýFúIùûÿŒ¥öHÒÿûLùíùûüþ7vòÿþöü|üFýžþïÿÙL‹Íì…i¹þ÷üöûƒüÏþ«¨Tõçüíùlù·ûÛÿšDV+ÿ†ûèùÚúÃý=Ó™Q"ÿÅýwýøýÍþŠÿªX\ö’yþ†ü·û¢ü&ÿaòŽËK|ü úú£üš6÷=l¾þÌûÍúòû~þF'©†ÿ|þ&þMþ¦þÿžÿdYJ½ ^þ>ü¹ûñü­ÿß.'®ÿ/üEúÏú€ý#aZštþ:ü­û×ü ÿ@’½àÌÿÿ°þ…þzþ®þKÿL‡¡ò¸ý üÔûaý9-è£w,ÿ&ü¾ú‡û'þvÑ¡WþŒüEüjýQÿ9`ÁÙNÿÇþtþOþ~þ.ÿaÐâúÛÀÿiýäûüûÐýµmÓBâªþüû+üÑþØîLø DþÕüÄüáý…ÿþØñ|ÝIºÿÿ|þþ3þÿþjùû¸„ÿ8ýãû:ü8þ“¦ÇS\þühû¥ü3ÿç¥Ù–uþDý=ý$þqÿšLŒ{4½ÿ9þºýìýûþ®lkYìþ½üÆûü·þŠÍ†bÜþ0üíû?ýŽÿ×59C¯þÔýÜý…þiÿ:ÙFucO;ÿþký§ýìþÛ±š>±þ‚ü°ûŸüûþÎáP÷xíýYüKü¶ýãÿÓØ²œ/ÿ^þJþ˜þÿÂÿt »þ—{òþˆýÜü^ýÿYAóÔ$þ*ü½ûý“ÿ-Õä`úÿÄýŸüÛü9þ¾~C]BPÿ³þ{þ”þáþlÿ:&è*¹ŠÝþcýÏü„ýVÿ“P£`ìýAüüˆýýÿZ¤häÅÿåýýLý~þ \áC~Äÿ"ÿªþsþ”þÿ7![´M˜þ:ýÚüÄý¯ÿÞg“Bûÿ´ýaüŽüþA>>àf‘ÿ'þ–ýéýàþürx&¢xÿáþhþQþ×þôÿRf£Ð$>þîüËüúý.z[Ô‡ÿyýüý·þ³=Ä2æwÿqþ þrþÿÙÿyï/; ƒ«ÿºþ þþ¾þ¨­©µÿÙýÉüýþ˜zYÑ'ÿ‡ýüü«ý7ÿêN±•wÿ»þ†þÀþ6ÿ¿ÿNÈ8”²ÿ«þóýöýËþ=Æ´šczÿ´ý×üFýáþõš$d»äþ”ýLýþ’ÿãðOe—ÿ ÿÇþÞþ3ÿŸÿ˜b@Ÿ”ÿvþÐýþ ÿˆô³\õÿ™ýý¾ýOÿ#s·ãdÖþÖýÀýˆþ¿ÿ㎓fÅÿSÿÿÿÿeÿèÿ+€Z¡ÿbþÍý þ#ÿ­ ¡­ûþ¶ýXý þ‹ÿ.Db’>÷þ8þ/þÃþ¤ÿ„G§)±ÿ5ÿÍþ®þÿÆÿ¹èŽƒ ÿþ›ý$þuÿG“Ø^µþ‘ýnýUþÑÿB#)\!üþWþ\þåþ«ÿjï(ÇI³ÿ"ÿ¿þ«þÿÏÿÕ°ú„dÿãýý:þ¤ÿ9Y‰±%’þ ý¥ý“þNüÞ ÿ”þœþ ÿ¬ÿQÆþÝxÚÿ%ÿ™þpþÖþÇÿõé/”EÂþ°ý…ý\þÞÿpmhhàÿvþµýæýäþ7PË”Ùñÿ6ÿÔþÍþÿ‚ÿ„ñ1#¶úÿÿ`þ(þ®þÔÿ)Cx ‹þ›ý ýžþ/¬n)©ÿoþâý)þÿF*…RÁƒÿÿ÷þ ÿQÿÃÿVåEJÛÿ?þþ½þóÿM7;OÕÿbþý¾ý×þe¿ZÿÛsÿfþþ}þdÿ` ? £ÿgÿDÿ-ÿ8ÿ‰ÿÅMféúÿðþ3þþÄþq>¤ÿIþ¡ýöýÿ“¿)±œfÿˆþPþÇþ¤ÿy÷ Ëdºÿÿ[ÿFÿXÿ›ÿ¶:JÒðÿìþ5þ&þâþ.}<üxÿ2þ±ý)þ\ÿÃÊ rM'ÿ|þ€þÿÚÿˆçç§VÒÿ˜ÿZÿ)ÿ-ÿ†ÿ/é`W¿ºÿ±þþAþ-ÿ€¨+Ę0ÿ#þÜýzþ°ÿõÇÔ(!*ÿ¢þ¯þ0ÿÜÿp¿ÆŸd-òÿ¡ÿDÿÿÿ‰ÿE ‡o±Œÿvþìý;þUÿÂã: Yñþþýèý´þûÿ,Æ›ÕÜÿÿÔþûþiÿäÿD|–˜ˆk.¸ÿ'ÿËþÝþuÿfOÀz‰Hÿ7þÚýkþ¬ÿHñÿ±þ þ6þÿ8.B‰ÈÿDÿÿ<ÿ‘ÿâÿEh‹¢Œ6©ÿÿ¼þäþ”ÿŽe¸UQÿ6þþ¸þæÿ$éÞÂÿ°þ6þ{þPÿTQû^ÇÿbÿFÿgÿ¢ÿÕÿüÿ+g¹ž/†ÿëþ¶þÿÄÿ´w¬$ ëþ9þ?þÿ0Bɵ™ÿµþlþÍþ•ÿeí½GØÿ‘ÿ|ÿ‹ÿ¡ÿ®ÿÍÿnºÕ£dÿÐþ®þÿíÿÞ‰éãÿãþOþqþ>ÿV<•H~‹ÿÙþ±þÿ³ÿXÀÒ—;ïÿ»ÿ—ÿ‡ÿ…ÿ“ÿ¾ÿÙä–NÿÅþ²þ2ÿý†p¹¯ÿÅþ`þ¥þ{ÿƒI}BkÿäþàþMÿèÿk°¨h!òÿÑÿ·ÿ¡ÿÿ’ÿ¸ÿrÌß“øÿCÿÉþÈþOÿ-o@‡ÿÍþŒþçþ³ÿ"9Ò#vÿÿÿ}ÿðÿK€Y- îÿÊÿ ÿÿ|ÿ©ÿ …ÖÕ}Üÿ4ÿÖþîþzÿGY^„ÿáþ´þÿÒÿ“ « yÿ8ÿRÿžÿòÿ;aaQ: Üÿ¡ÿoÿeÿ ÿƒÕÝ|Öÿ1ÿÓþðþ„ÿOüBXtkabber/sounds/psi/presence_unavailable.wav000064400000000000000000000127001477701321300210450ustar00nobodynobodyRIFF¸WAVEfmt |ø*data”ûÿýÿÿÿÿÿúÿþÿ úÿÆÿœÿCÈ/^ÿîþàÿ:âÿýþÝOòÿéý@üéýÿÿ†Ì:ÿËüXü²üüý†ÿóþ‰æ ñCs¥ÂKÿÿýqþþWþoýkûuûdþíÿÉþ-ýÆûâû'þCB\šÿÁ Fúaÿšþá ÿ¥ü#üiûnüèýZýnýþýýŠþáþþeýmû(ü¶þ…þ³ýùþAÌE_~\µ4ÁÉÇ€±Òù’Ïý1üzúùŸù£ù!ùùú+ýÁý£þ¯ÿØÿ‹ö—Oþ…ýÿüüúüÑýþüÔýñÿ)”Ìé’ô¤;_¾øaŒöÿ)gJDÿ‘þ6þ©üïûâüZüQúù‰÷«öÅ÷{ø&ùöú1ûŒúÞûûýÄÉMOú Á 2 _ £ " … _¨<ÿÃÿC6ÿ1þ¤üeú’úeü½üJü?û+ùGødøDøùZû=ûûsû8û³ûLý–þ¥bHIÀ9© a ô È  ¬0[}_ÿäþòýMü$ü=üÏû¾ûœú¥øGø†øø}ùûùÿøÚørù$ú}üÿÌÿÇõ(¾]¼<È?0e|JÒJºa^Ÿÿuÿæÿ¬þÓüèûˆúˆùóùËùùºøÆ÷÷Þ÷søËøtú»ûEüzý3þÑþFM©b –’8¥ } R &[6ò®èÂ#ÿý@ü"û‰úXú1ùoø5ø÷„ö†÷ø–ømùù÷ø”úü¼ý4vÝÜtH—. 4`q/ø1(‘„ÇHôÃìÿ^þ—ûúÃù0ùHùVù:ø±÷Ò÷Q÷¸÷+ùéùÜú!üQüêü}þsÿûvš'!7¼ŽW ~ - ­M¯ôc-*ÿÕüãûëúzùðøé÷ìõ õÜô×ôöh÷É÷¤øNùzùCû©ýÿÜvà „> ¾ v Ÿ : ¬ |-fDø$§ÿHÿþ-ü½úÝøk÷J÷´öö‚ööSõöåöƒ÷cùöú¬ûýOþÿ垸‰ÅÓ÷¡_ > ½ ) ‚P¥ûÎÿVþ“ýôûÀú=úóøÔ÷{÷³ö6ö†öö÷Nø¾øUùû_ü©ýíÿ~cϵ_8ú0 ¥çØ:‚‘r¯½“Õ“ÿpûMùúÅù]øéõ!óýò4õ‹õ¨ô÷ÀøðùýpþÕÿwAàRbº÷æ¡:ùš6ØÇ½ITÅ€Qíiçý«û4ü:ü=ùQöNô„ô5õ—ôõ"õ›õ©÷dø—ööoù”ûÕüiÿèrÎa¡ ñYƒÇ  Œ Û éxPÿÍütú¼ùÃù!ú%úxùGùù¥øÓöÝôôôlô?óùóröøÙû¿HÐ ñ " A ~ Q m H ÄÖÏn-¬Ðý2û­øý÷4÷ö;õˆóLó¸õú$ýÿª¯æµ¨Éÿ PêþýÉý1½þœýý÷ü¨þïÿ*ÿ/ÿòþÜþ`t¤ÉBÒÏò â c nÔÏ+; ýæúªø€ö™õ[ô|ó(ò™ðñ“ò@ôõ¦õ÷$úãþéQîH á +ÁŸå+1Q uA+³ÿ|ü0ù·õ.òôðÌï€íÛë ë±ëîìÖîRñÊó>ö©ø÷üè» æ ÜU6 ½ÞBÔše 4óîÿDýú÷þôòqð«ð]ðð‰ï’ï-ñÜó£öcø{úüÿ2ÿÆä$ µ  æ š • Ú ; í­¼¿ÿèýý–üóú›ùŠø÷u÷øuø ùºù]ú‡û÷ýØÿgâ²ÜÉrgs™9Àêÿïüúúðù®øw÷Ñõ–ôBô›õJ÷wøïùÜúùü ~­q]6 nÌ!_J œ ] Ž zô\ÿ ü‘ú]÷]ô†ñïûíí:íÉìÉí‡ï°ñõé÷ ûnþŸ~\ Ë fô¨);ð;¯ç Ô qBUÿ™û÷±ô\ñAîmìªê›é¬éŸê˜ëiíDðó'÷<û¼þlÄ„ ØáWˆ¯Ý}8< ÔƒxÿûÃ÷Ùôó§ñøïïƒîÎî9ð"òçó¸õ¾øMûÚý(Æã†[ < ­ ” O  ’ ñ Äåa£ýû3ú5øÉööeõÖõJöáöÇ÷ÑøtúýÈÿBôÿyq¶ ã Œ & Ðþ[2ïKþ®üûëøùönõuôô£ôÃôëô=öÈ÷ úüÉþ†:­  dc1É• »  yº4lþ×úÁ÷úô£ò¥ðãîííNí…íqîðuòÆôž÷iú|ýIB¶ H ·œ/†ä¯m ø ܈éPýúO÷ô…ñ ï–íËìnìjìeíåîÚðþóÅö­ù4ý:K–¿ . 4¾ŸÁæ ç Ô y[E€þ0ûšøeö7ôàò­ñÀðŸðgñˆòôöÌ÷Œú£ýðÿq zHö ò 4 ƒ  h ’ üiŠRþÿþ)üú›ø8÷hö”ökötö+÷wøýùËûÑý‚ÿ¶Îo KG æ ÷ ¦ & zãJ·»íÿ¸ýIû ùc÷"öàô$ô”óóGô,õÏöœø˜úÒü3ÿÏ^ a 8 î Ûï`| ?  ¡hÉÞAþhûÒø{ö?ôHò˜ð‡ïïiï9ðBñó×ô?÷@úRýw* ¤ ç ¡¡‹+&¦  1[6þ#ûø\õ5ó^ñðïþîIïð‡ñaóÉõEøÇúœýiIã>R ! à |ÊÂ%3   ° †?²öÿŒý&ûù'÷VõTôÚóÈóþó°ôáõG÷/ùûÿü"ÿ24ËDži w W ð Ö8‘éTŠþ¬üKûúù*ø‘÷Ÿ÷î÷‹øYùŒúüýlÿ´õß§  ÕòÉD­³³þ´üÃúÁø÷ö0õ—ôoô®ôuõ‚öø¿ùÔû.þ…ñGL Ä  é h ^ ô % Õ m ‹F½ùÿ†ýû§øböôóÎñ.ñõð>ñ<òxóõ÷AùÈû[þ—dÖ¬ Q – ™!oC ñ # ší|ðý]û÷øäö8õÑóèòMòDòÊòjósôëõè÷'úRüsþ†á Íe¤ Á d t  † Î ™&uáÐÿÆýü’úUù+øV÷ÇöÒö6÷œ÷„ø¸ù*û¬üþ•ÿ&Ç!A/Òiw |¸ÀjžLÿþªü{û‡úÔùcùù"ùùIú$û üSý´þTñL£åö 3 ËüÊxôSwÿ—ýÎûUúù¯÷²ööÄõôõCöéöó÷lù û¼ü¿þËïê¥@  Î õ ò Œ ì ® ~šu ¬ýnûhù†÷Ãõ{ô˜ó0óó,óãóõªöiøSú†üÓþ9v‹…/ Œ t W K ã Ù '}«fWþtü¤úÛøW÷ö;õÅô ôüôžõ‡ö°÷)ùõúîüûþÌ‘bùYKí[ ˆ V ¢±‰AÞ7÷þuý üÎúðù^ù ùÒø×øHùøùÝúÍûÔüþVÿ˜©»Ä—I²ÜÃmÚ IL¶ÿUþ:ýGüoû¯ú'úúúpúáú™û¨ü¸ýãþd©ÄǤr+²<”Ž@ÍU¶þ*ýÃûhúBùCø‹÷#÷÷B÷Ã÷ƒø|ùÚúcüÉýTÿΘ?𙄠3 } t  O Šè0QJÿSýtûÀù[ø÷öuõ/õNõ´õlö]÷šøúµû£ýÿkCôŠõ Û @ [  — ·,ƒÝ/pÿ´ýü¶úmù|øÒ÷Y÷÷!÷’÷RøOùwú¯ûüü[þíÿ}Õ ÞzæçüA\KÏœÿ…þšýÄüâû/û¹ú–úÍúûzûüÊü¨ý™þ©ÿ¢Wþ–JHÌTÅçí 8ÿyþ¦ýÆü ü¥ûlûNû{ûËû9üÀü\ýDþ^ÿwoYP5üu¤ÊÎržª¥zLÿþØü³û¡úËùBùãøšø|øÂøcùCúFûeü¶ý,ÿ¨~Ô÷ä„ñ-Â&b‰…/'Îþsýü¾ú›ù¼øø·÷›÷Ê÷5øéøÁùÃúüsý×þ:¬#lw<Þ^©²`ÌCAì±ZÿþÙüÖûóú@ú¹ùeùXù…ùçùnú*û"ü'ý,þ:ÿMOH<ú‚å!$ö³F­ì/>Qÿxþ­ýýü$üåûÛûü^üáü{ý.þëþ™ÿK»TàDj|Q„îD«ÿØþþdýÕüWüøûÄû³ûÝû5ü¶üVýþÊþ ÿ‰{e2Þrß%I9Œá*,ÿóýûüü?û™úúàùÜùøù:ú­ú[û3ü%ý6þ\ÿ”ºÎéè´F«àÕS}{b*âÿ¬þ…ýpü{û¯ú ú›ùYù7ùXùÇùcúûòûïüþNÿz¤ÐÓ°bÒ%]HéiÃ÷ ôÿëþéýõü&üû û¾ú’ú±ú ûlûäûü[ý@þ3ÿíʼn2¬ñ"8©TØ/†ÆûÿOÿªþþžý5ýöüßüÒüêü2ýƒýíýþÿ¤ÿIçsý€â" ë¦3°]Ãÿ)ÿ}þåýeýðüšühü[üvü˜üËü=ýÙýþ<ÿ³uSŸq©°3Ç&g£ÃÜÿöþöýýaüÑûOûïú½úÀúöúLû½û^üýäýÑþÉÿ¸¥„Cø `vU ÏEŒ·Ìßñÿíþôýý:üûûÌúªúµúÛú3ûÌûwü1ýþÝþ³ÿ›{;âoçM„”†AÖ_É GvœÿåþIþ°ý)ý²ücüYüoüŒüÈüýyýþþÿ«ÿ1®6Â7†³Ïåã³^èbØO¿ÿ&ÿŸþ'þÈý‘ýqýeýpý“ýÓýBþÇþ2ÿ¡ÿ•õF{”¦¨{9Ù[æhÊÿÿuþðýŠý9ýêü´ü«üÀüýkýÙýSþÔþ^ÿüÿ·bðlÐ<šÈÜΓ;ÔEÉþÿBÿþÑý$ýˆüüÊû³û´ûÆûûûLüÏüxý.þôþ´ÿr:¾L¸ FfV°F¿"ˆ×Uÿþëý`ýßüiüüÔûÆûðû$ülüãü|ý3þëþ ÿX¾TáE}Ÿ–uP ˜wïlÏÿ$ÿ‘þ þžýLýýýü ý)ýZý°ýþ’þÿžÿ!¬-‰Î"CJ%î¥S ¹Oáÿrÿÿþ”þ@þüýÉý¯ý°ý×ý!þrþÉþ>ÿºÿ7³vÆ6RT>á¡]ÿŠ“ÿÿ–þ'þ¶ýZýýÚüÙü÷ü$ýpýßýbþüþ£ÿ?Üjïvæ,Ug]@ÍhçO·!|ÿËþ%þ‘ýý«üaü8ü3üEüzüÓüFýÆýTþõþœÿT"“cœ­žt2è„ö\· jÿÑþCþ¿ýRýÿüÉü¯üŸü´üíü8ý£ý þ—þÿ®ÿ9ÂX×3x¨ÍÙÁ‘Sý?¿7ÅÿRÿÞþƒþ=þþýÇý«ý¯ýÏýöý,þ„þçþSÿÒÿ?”øW±ÉÍ¡q:ó Lôÿ—ÿLÿÿ´þuþLþ2þ5þOþlþ”þÍþÿnÿÕÿ?¦Ožè.:6Þš9ÉWæÿoÿíþlþtkabber/splash.tcl000064400000000000000000000220461477701321300140530ustar00nobodynobody# splash.tcl -- # # This file is a part of the Tkabber XMPP client. It implements # Tkabebr splash window which is shown while Tkabber starts. # BWidget's Button overrides this option, so set its priority to # 30 instead of widgetDefault (20) option add *ErrorDialog.function.text [::msgcat::mc "Save To Log"] 30 # Wrapper around bgerror which hides splash window. It's useful when # error window is small auto_load bgerror rename bgerror bgerror_default proc bgerror {msg} { if {[winfo exists .bgerrorDialog]} { # If there's another error message around then don't report the # next error (questionnable). return } if {[winfo exists .splash]} { wm withdraw .splash } bgerror_default $msg if {[winfo exists .splash]} { wm deiconify .splash update } } if {[catch {package require tksvg}]} { create_image tkabber/logo1 \ -file [fullpath pixmaps default tkabber tkabber-logo.gif] } else { create_image tkabber/logo1 \ -file [fullpath pixmaps default tkabber tkabber-logo.svg] \ -scale 1 \ -format [list svg -dpi [expr {[tk scaling]*72}]] } if {[info exists show_splash_window] && !$show_splash_window} { return } proc splash_start {} { global splash_count splash_image splash_info splash_max splash_text global tkabber_version toolkit_version set splash_info "" set splash_count 0 set splash_max 250 array set splash_text [list \ custom [::msgcat::mc "customization"] \ utils [::msgcat::mc "utilities"] \ plugins [::msgcat::mc "plugin management"] \ pixmaps [::msgcat::mc "pixmaps management"] \ balloon [::msgcat::mc "balloon help"] \ presence [::msgcat::mc "xmpp presence"] \ iq [::msgcat::mc "xmpp iq"] \ plugins:iq [::msgcat::mc "xmpp iq"] \ roster [::msgcat::mc "xmpp roster"] \ itemedit [::msgcat::mc "xmpp roster"] \ messages [::msgcat::mc "xmpp messages"] \ chats [::msgcat::mc "xmpp chat/muc"] \ plugins:chat [::msgcat::mc "xmpp chat/muc"] \ joingrdialog [::msgcat::mc "xmpp chat/muc"] \ muc [::msgcat::mc "xmpp chat/muc"] \ emoticons [::msgcat::mc "emoticons"] \ aniemoticons [::msgcat::mc "emoticons"] \ login [::msgcat::mc "connections"] \ proxy [::msgcat::mc "connections"] \ browser [::msgcat::mc "browsing"] \ disco [::msgcat::mc "service discovery"] \ userinfo [::msgcat::mc "presence"] \ datagathering [::msgcat::mc "utilities"] \ negotiate [::msgcat::mc "negotiation"] \ search [::msgcat::mc "searching"] \ register [::msgcat::mc "xmpp registration"] \ si [::msgcat::mc "file transfer"] \ plugins:si [::msgcat::mc "file transfer"] \ filetransfer [::msgcat::mc "file transfer"] \ plugins:filetransfer [::msgcat::mc "file transfer"] \ privacy [::msgcat::mc "privacy rules"] \ gpgme [::msgcat::mc "cryptographics"] \ ifacetk [::msgcat::mc "user interface"] \ plugins:general [::msgcat::mc "general plugins"] \ plugins:roster [::msgcat::mc "roster plugins"] \ plugins:search [::msgcat::mc "search plugins"] \ plugins:unix [::msgcat::mc "unix plugins"] \ plugins:windows [::msgcat::mc "windows plugins"] \ plugins:macintosh [::msgcat::mc "macintosh plugins"] \ iface [::msgcat::mc "user interface"] \ autoaway [::msgcat::mc "auto-away"] \ avatars [::msgcat::mc "avatars"] \ bwidget_workarounds [::msgcat::mc "bwidget workarounds"] \ config [::msgcat::mc "configuration"] \ dockingtray [::msgcat::mc "kde"] \ hooks [::msgcat::mc "extension management"] \ tclxmpp [::msgcat::mc "xmpp library"] \ plugins [::msgcat::mc "plugin management"] \ sound [::msgcat::mc "sound"] \ wmdock [::msgcat::mc "wmaker"] \ ] wm withdraw . set w [toplevel .splash] wm withdraw $w wm overrideredirect $w 1 catch { if {"-topmost" in [wm attributes $w]} { wm attributes $w -topmost 1 } } catch { if {"-alpha" in [wm attributes $w]} { wm attributes $w -alpha 0.7 } } Frame $w.frame Frame $w.frame.spacer -width 4m Label $w.frame.image -image tkabber/logo1 Label $w.frame.msg \ -anchor nw \ -justify left \ -text \ "Tkabber $tkabber_version ($toolkit_version) Copyright \u00a9 2002-2025 [::msgcat::mc {Alexey Shchepin}] [::msgcat::mc Authors:] [::msgcat::mc {Alexey Shchepin}] [::msgcat::mc {Marshall T. Rose}] [::msgcat::mc {Sergei Golovan}] [::msgcat::mc {Michail Litvak}] [::msgcat::mc {Konstantin Khomoutov}] http://tkabber.jabber.ru/" grid $w.frame.spacer -row 0 -column 0 -sticky e -pady 4m grid $w.frame.image -row 0 -column 1 -sticky e -pady 4m grid $w.frame.msg -row 0 -column 2 -sticky w -padx 4m -pady 4m Progressbar $w.frame.bar \ -variable splash_count \ -maximum $splash_max Label $w.frame.info -textvariable splash_info grid $w.frame.bar -row 2 -column 0 -sticky sew -columnspan 3 -padx 1m grid $w.frame.info -row 3 -column 0 -sticky s -columnspan 3 pack $w.frame -anchor nw if {[info commands splash_source] eq ""} { rename source splash_source rename splash_progress source } BWidget::place $w 0 0 center wm deiconify $w } proc splash_progress {args} { global rootdir splash_count splash_max splash_info splash_text if {([winfo exists .splash]) && ([llength $args] == 1)} { set lrootdir [string tolower $rootdir] set filepath [string tolower [lindex $args 0]] set homedir [string tolower $::configdir] if {[catch { set globhomedir [file normalize $homedir] }]} { set plugins [lindex [glob -nocomplain \ [file join $homedir plugins]] 0] set globhomedir \ [file join [lrange [file split $plugins] 0 end-1]] } set globhomedir [string tolower $globhomedir] if {[string first $lrootdir $filepath] == 0} { set log 1 set root $lrootdir } elseif {[string first $homedir $filepath] == 0} { set log 1 set root $homedir } elseif {$globhomedir ne "" && [string first $globhomedir $filepath] == 0} { set log 1 set root $globhomedir } else { set log 0 } if {$log} { set srelpath [lrange [file split $filepath] \ [llength [file split $root]] end] if {[llength $srelpath] > 1} { set name [join [lrange $srelpath 0 end-1] :] } else { set name [file rootname [lindex $srelpath 0]] } if {![string equal -nocase \ [lindex $srelpath end] "pkgIndex.tcl"]} { if {[info exists splash_text($name)]} { set splash_info $splash_text($name) } else { # Process plugins separately set nlist [split $name :] if {[lindex $nlist 0] == "plugins"} { set splash_info \ [::msgcat::mc "%s plugin" \ [join [lrange $nlist 1 end] :]] } } incr splash_count if {$name eq "iface"} { set splash_count $splash_max } update } } } uplevel 1 splash_source $args } proc splash_done {} { global splash_count splash_max if {![winfo exists .splash]} { return } set splash_count $splash_max update after 100 destroy .splash rename source splash_progress rename splash_source source } hook::add finload_hook splash_done 99 splash_start # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/tk000075500000000000000000000000001477701321300124105ustar00nobodynobodytkabber/tk/bwidget.tcl000064400000000000000000000375101477701321300146260ustar00nobodynobody# bwidget.tcl -- # # This file is a part of the Tkabber XMPP client. It contains all sorts # of hacks around BWidget bugs or inconveniencies. auto_load Button rename Button::create Button::create#orig proc Button::create {path args} { Button::create#orig $path {*}[dict remove $args -background -bg] } ########################################################################## rename menu menu#orig proc menu {path args} { menu#orig $path {*}[dict remove $args -background -bg] } ########################################################################## auto_load Tree proc Tree::_see {path idn {side "none"}} { set bbox [$path.c bbox $idn] set scrl [$path.c cget -scrollregion] set ymax [lindex $scrl 3] set dy [$path.c cget -yscrollincrement] set yv [$path yview] set yv0 [expr {round([lindex $yv 0]*$ymax/$dy)}] set yv1 [expr {int([lindex $yv 1]*$ymax/$dy + 0.1)}] set y [expr {int([lindex [$path.c coords $idn] 1]/$dy)}] if { $y < $yv0 } { $path.c yview scroll [expr {$y-$yv0}] units } elseif { $y >= $yv1 } { $path.c yview scroll [expr {$y-$yv1+1}] units } set xmax [lindex $scrl 2] set dx [$path.c cget -xscrollincrement] set xv [$path xview] if { ![string compare $side "none"] } { set x0 [expr {int([lindex $bbox 0]/$dx)}] set xv0 [expr {round([lindex $xv 0]*$xmax/$dx)}] set xv1 [expr {round([lindex $xv 1]*$xmax/$dx)}] if { $x0 >= $xv1 || $x0 < $xv0 } { $path.c xview scroll [expr {$x0-$xv0}] units } } elseif { ![string compare $side "right"] } { set xv1 [expr {round([lindex $xv 1]*$xmax/$dx)}] set x1 [expr {int([lindex $bbox 2]/$dx)}] if { $x1 >= $xv1 } { $path.c xview scroll [expr {$x1-$xv1+1}] units } } else { set xv0 [expr {round([lindex $xv 0]*$xmax/$dx)}] set x0 [expr {int([lindex $bbox 0]/$dx)}] if { $x0 < $xv0 } { $path.c xview scroll [expr {$x0-$xv0}] units } } } proc Tree::tag {path command args} { variable $path upvar 0 $path data switch -- $command { configure { set args [lassign $args tag] foreach {key val} $args { dict set data(tags) $tag $key $val } # TODO: reconfigure existing items } bind { lassign $args tag event script $path.c bind tag:$tag $event $script } } } proc Tree::item {path item args} { switch -- [llength $args] { 1 { set key [lindex $args 0] switch -- $key { -text - -image - -open { return [$path itemcget $item $key] } -values { return [lindex [$path itemcget $item -data] 0] } -tags { return [lindex [$path itemcget $item -data] 1] } } } default { foreach {key val} $args { switch -- $key { -text - -image - -open { $path itemconfigure $item $key $val } -values { $path itemconfigure $item \ -data [lreplace [$path itemcget $item -data] \ 0 0 $val] } -tags { $path itemconfigure $item \ -data [lreplace [$path itemcget $item -data] \ 1 1 $val] Tree::_itemconf $path $item $val } } } } } } proc Tree::_itemconf {path item tags} { variable $path upvar 0 $path data foreach tag $tags { if {[info exists data(tags)] && [dict exists $data(tags) $tag]} { foreach {key val} [dict get $data(tags) $tag] { switch -- $key { -foreground { $path itemconfigure $item -fill $val } -font { $path itemconfigure $item -font $val } } } } } } proc Tree::children {path item args} { switch -- [llength $args] { 0 { if {$item eq {}} { set item root } return [$path nodes $item] } 1 { set newchildren [lindex $args 0] if {$item eq {}} { set item root } return [$path reorder $item $newchildren] } } } rename Tree::parent Tree::parent:old proc Tree::parent {path item} { set parent [Tree::parent:old $path $item] if {$parent eq "root"} { return {} } else { return $parent } } rename Tree::insert Tree::insert:old proc Tree::insert {path parent index args} { if {$parent eq {}} { set parent root } if {[dict exists $args -id]} { set item [dict get $args -id] set args [dict remove $args -id] } else { set item i[expr {1000000*rand()}] } set data {{} {}} if {[dict exists $args -values]} { set data [lreplace $data 0 0 [dict get $args -values]] set args [dict remove $args -values] } set tags {} if {[dict exists $args -tags]} { set tags [dict get $args -tags] set data [lreplace $data 1 1 $tags] set args [dict remove $args -tags] } set res [Tree::insert:old $path $index $parent $item -data $data {*}$args] Tree::_itemconf $path $item $tags return $res } rename Tree::selection Tree::selection:old proc Tree::selection {path args} { if {[llength $args] == 0} { return [Tree::selection:old $path get] } else { return [Tree::selection:old $path {*}$args] } } rename Tree::move Tree::move:old proc Tree::move {path item parent index} { Tree::move:old $path $parent $item $index } rename Tree::_get_node_tags Tree::_get_node_tags:old proc Tree::_get_node_tags {path node {tags ""}} { set newtags [Tree::_get_node_tags:old $path $node $tags] foreach tag [$path item $node -tags] { lappend newtags tag:$tag } return $newtags } proc Tree::identify {path what x y} { # TODO: not item $what $path find @$x,$y } create_image tree/opennode -data "R0lGODlhCQAJAIABAAAAAP///yH+EUNyZWF0ZWQgd2l0aCBHSU1QACwAAAAACQAJAAACEISPoRvG614D80x5ZXyogwIAOw==" create_image tree/closenode -data "R0lGODlhCQAJAIABAAAAAP///yH+EUNyZWF0ZWQgd2l0aCBHSU1QACwAAAAACQAJAAACEYSPoRu28KCSDSJLc44s3lMAADs=" proc MyTree {path args} { set args \ [dict replace $args \ -deltax [expr {int(1.2*[font measure $::ChatFont M])}] \ -deltay [expr {int(1.2*[font metrics $::ChatFont -linespace])}] \ -padx [expr {20*$::icons_scale}] \ -crossopenimage tree/opennode \ -crosscloseimage tree/closenode \ -selectfill 1] Tree::create $path {*}$args # TODO: Make tree lines thicker for displays with higher DPI Tree::bindText $path [list $path selection set] Tree::bindImage $path [list $path selection set] bind $path <> {event generate %W <>} bindscroll $path.c return $path } ########################################################################## interp alias {} PanedWin {} panedwindow proc PanedWinAdd {path args} { set newargs {} foreach {key val} $args { switch -- $key { -weight { if {$val == 0} { lappend newargs -stretch never } else { lappend newargs -stretch always } } default { lappend newargs $key $val } } } set idx [llength [$path panes]] set f [frame $path.frame$idx] $path add $f {*}$newargs return $f } proc PanedWinSashXPos {path index args} { if {[llength $args] == 1} { $path sash place $index [lindex $args 0] 0 } return [lindex [$path sash coord $index] 0] } ########################################################################## auto_load ComboBox interp alias {} Combobox {} ComboBox option add *ComboBox.arrowButtonWidth 2.5m widgetDefault option add *ComboBox.listRelief ridge widgetDefault option add *ComboBox.listBorder 0.5m widgetDefault rename ComboBox::_create_popup ComboBox::_create_popup_old proc ComboBox::_create_popup {path args} { ComboBox::_create_popup_old $path {*}$args $path.shell configure \ -relief [option get $path listRelief ComboBox] \ -border [option get $path listBorder ComboBox] } rename ComboBox::create ComboBox::create_old proc ComboBox::create {path args} { entry .fake_entry set hlthick [lindex [.fake_entry configure -highlightthickness] 4] destroy .fake_entry set newargs {} foreach {opt arg} $args { switch -- $opt { -highlightthickness { set hlthick $arg } -command { set cmd $arg } default { lappend newargs $opt $arg } } } ComboBox::create_old $path {*}$newargs -highlightthickness 0 $path:cmd configure -highlightthickness $hlthick $path.a configure -width [winfo pixels $path [option get $path arrowButtonWidth ComboBox]] if {[info exists cmd]} { ::bind $path.e [double% $cmd] } proc ::$path {cmd args} "ComboBox::_proc $path \$cmd {*}\$args" return $path } proc ComboBox::_proc {path cmd args} { switch -- $cmd { set { return [_set $path [lindex $args 0]] } current { return [getvalue $path] } default { return [$cmd $path {*}$args] } } } proc ComboBox::_set {path value} { $path.e configure -text $value } ########################################################################## auto_load NoteBook if {![catch {rename NoteBook::_get_page_name NoteBook::_get_page_name:old}]} { proc NoteBook::_get_page_name {path {item current} {tagindex end-1}} { set pagename [NoteBook::_get_page_name:old $path $item $tagindex] if {[catch { NoteBook::_test_page $path $pagename }]} { return [string range [lindex [$path.c gettags $item] 1] 2 end] } else { return $pagename } } } proc Notebook {path args} { NoteBook $path {*}$args if {![dict exists $args -bd] && ![dict exists $args -borderwidth]} { set bd [winfo pixels $path 0.25m] if {$bd < 1} { set bd 1 } elseif {$bd > 2} { set bd 2 } $path configure -borderwidth $bd } if {![dict exists $args -ibd] && ![dict exists $args -internalborderwidth]} { $path configure -internalborderwidth [winfo pixels $path 2m] } return $path } ########################################################################## proc Spinbox {path from to incr textvar args} { spinbox $path -from $from \ -to $to \ -increment $incr \ -buttoncursor left_ptr \ -textvariable $textvar \ {*}$args } ########################################################################## if {$::tcl_platform(platform) ne "unix" || $::aquaP} { auto_load SelectFont rename SelectFont::create SelectFont::create:old proc SelectFont::create {path args} { SelectFont::create:old $path {*}$args foreach style {bold italic underline overstrike} { if {![catch { set bd [option get $path.$style \ borderWidth Button] }]} { if {$bd ne ""} { $path.$style configure -borderwidth $bd } } } return $path } } ########################################################################## proc BWidget::bindMouseWheel {widget} {} ########################################################################## auto_load ButtonBox rename ButtonBox::create ButtonBox::create:old proc ButtonBox::create {path args} { toplevel $path wm withdraw $path set parent [winfo parent $path] destroy $path set spacing 0 set newargs {} foreach {key val} $args { switch -- $key { -spacing { lappend newargs -spacing [winfo pixels $parent $val] set spacing 1 } default { lappend newargs $key $val } } } if {!$spacing} { lappend newargs -spacing [winfo pixels $parent 2.5m] } ButtonBox::create:old $path {*}$newargs } ########################################################################## auto_load Dialog rename Dialog::create Dialog::create:old proc Dialog::create {path args} { toplevel $path wm withdraw $path set parent [winfo parent $path] destroy $path set spacing 0 set padx 0 set transient 1 set newargs {} foreach {key val} $args { switch -- $key { -parent { set parent $val lappend newargs -parent $val } -transient { set transient $val } -spacing { lappend newargs -spacing [winfo pixels $parent $val] set spacing 1 } -padx { lappend newargs -padx $val set padx 1 } default { lappend newargs $key $val } } } if {!$spacing} { lappend newargs -spacing [winfo pixels $parent 2.5m] } if {!$padx} { lappend newargs -padx [winfo pixels $parent 2.5m] } # Do not make a dialog window transient if its parent isn't vewable. # Otherwise it leads to hang of a whole application. if {$parent == ""} { set parent . } if {![winfo viewable [winfo toplevel $parent]] } { set transient 0 } set res [Dialog::create:old $path -transient $transient {*}$newargs] $path.frame configure -padx 0.5m -pady 0.5m return $res } ########################################################################## proc Labelframe {path args} { if {[dict exists $args -padding]} { lassign [dict get $args -padding] padx pady set args [dict remove $args -padding] set args [dict replace $args -padx $padx -pady $pady] } labelframe $path {*}$args } ########################################################################## proc Wrapped {w} { return $w } ########################################################################## proc Progressbar {path args} { if {[dict exists $args -mode]} { switch -- [dict get $args -mode] { determinate { dict set args -type normal } indeterminate { dict set args -type nonincremental_infinite } } set args [dict remove $args -mode] } ProgressBar $path {*}$args } ########################################################################## interp alias {} Checkbutton {} checkbutton interp alias {} Radiobutton {} radiobutton interp alias {} Message {} message interp alias {} Listbox {} listbox interp alias {} Toplevel {} toplevel interp alias {} Text {} text interp alias {} Canvas {} canvas interp alias {} Frame {} frame interp alias {} Menubutton {} menubutton interp alias {} MenuToolbutton {} menubutton interp alias {} Scale {} scale interp alias {} Scrollbar {} scrollbar # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/tk/default.xrdb000064400000000000000000000010261477701321300147730ustar00nobodynobody! default.xrdb -- ! ! Default resources for the Tk interface. *Panedwindow*showHandle: 0 *Panedwindow*sashWidth: 0.5m *Panedwindow*sashPad: 0.25m *mainframe*topf*ButtonBox*Button*highlightThickness: 0 *mainframe*topf*ButtonBox*Button*borderWidth: 0.25m *mainframe*topf*ButtonBox*Button*padX: 0.25m *mainframe*topf*ButtonBox*Button*padY: 0.25m ! vim:ft=xdefaults:ts=8:sw=4:sts=4:et tkabber/tk/mclistbox.tcl000064400000000000000000002672761477701321300152230ustar00nobodynobody# mclistbox.tcl -- # # A multicolumn listbox written in pure Tcl. # # Copyright (c) 1999, Bryan Oakley # All Rights Reservered # Modifications by Sergei Golovan # # # Bryan Oakley # oakley@channelpoint.com # # mclistbox v1.02 March 30, 1999 # # this code is freely distributable without restriction, but is # provided as-is with no waranty expressed or implied. # # basic usage: # # mclistbox::mclistbox .listbox # .listbox column add col1 -label "Column 1" # .listbox column add col2 -label "Column 2" # .listbox insert end [list "some stuff" "some more stuff"] # .listbox insert end [list "a second row of stuff" "blah blah blah"] # # see the documentation for more, uh, documentation. # # Something to think about: implement a "-optimize" option, with two # values: speed and memory. If set to speed, keep a copy of the data # in our hidden listbox so retrieval of data doesn't require us to # do all the getting and splitting and so forth. If set to "memory", # bag saving a duplicate copy of the data, which means data retrieval # will be slower, but memory requirements will be reduced. package require Tk 8.0- package provide mclistbox 1.02 namespace eval ::mclistbox { # this is the public interface namespace export mclistbox # these contain references to available options variable widgetOptions variable columnOptions # these contain references to available commands and subcommands variable widgetCommands variable columnCommands variable labelCommands } # ::mclistbox::Init -- # # Initialize the global (well, namespace) variables. This should # only be called once, immediately prior to creating the first # instance of the widget # # Results: # # All state variables are set to their default values; all of # the option database entries will exist. # # Returns: # # empty string proc ::mclistbox::Init {} { variable widgetOptions variable columnOptions variable widgetCommands variable columnCommands variable labelCommands # here we match up command line options with option database names # and classes. As it turns out, this is a handy reference of all of the # available options. Note that if an item has a value with only one # item (like -bd, for example) it is a synonym and the value is the # actual item. array set widgetOptions [list \ -background {background Background} \ -bd -borderwidth \ -bg -background \ -borderwidth {borderWidth BorderWidth} \ -columnbd -columnborderwidth \ -columnborderwidth {columnBorderWidth BorderWidth} \ -columnrelief {columnRelief Relief} \ -cursor {cursor Cursor} \ -exportselection {exportSelection ExportSelection} \ -fg -foreground \ -fillcolumn {fillColumn FillColumn} \ -font {font Font} \ -foreground {foreground Foreground} \ -height {height Height} \ -highlightbackground {highlightBackground HighlightBackground} \ -highlightcolor {highlightColor HighlightColor} \ -highlightthickness {highlightThickness HighlightThickness} \ -labelanchor {labelAnchor Anchor} \ -labelactivebackground {labelActiveBackground ActiveBackground} \ -labelactiveforeground {labelActiveForeground ActiveForeground} \ -labelbackground {labelBackground Background} \ -labelbd -labelborderwidth \ -labelbg -labelbackground \ -labelborderwidth {labelBorderWidth BorderWidth} \ -labelfg -labelforeground \ -labelfont {labelFont Font} \ -labelforeground {labelForeground Foreground} \ -labelheight {labelHeight Height} \ -labelimage {labelImage Image} \ -labelrelief {labelRelief Relief} \ -labels {labels Labels} \ -relief {relief Relief} \ -resizablecolumns {resizableColumns ResizableColumns} \ -resizeonecolumn {resizeOneColumn ResizeOneColumn} \ -selectbackground {selectBackground Foreground} \ -selectborderwidth {selectBorderWidth BorderWidth} \ -selectcommand {selectCommand Command} \ -selectforeground {selectForeground Background} \ -selectmode {selectMode SelectMode} \ -setgrid {setGrid SetGrid} \ -state {state State} \ -takefocus {takeFocus TakeFocus} \ -width {width Width} \ -xscrollcommand {xScrollCommand ScrollCommand} \ -yscrollcommand {yScrollCommand ScrollCommand} \ ] # and likewise for column-specific stuff. array set columnOptions [list \ -background {background Background} \ -bitmap {bitmap Bitmap} \ -command {command Command} \ -compound {compound Compound} \ -font {font Font} \ -foreground {foreground Foreground} \ -image {image Image} \ -label {label Label} \ -position {position Position} \ -resizable {resizable Resizable} \ -visible {visible Visible} \ -width {width Width} \ ] # this defines the valid widget commands. It's important to # list them here; we use this list to validate commands and # expand abbreviations. set widgetCommands [list \ activate bbox cget column configure \ curselection delete get index insert \ label nearest scan see selection \ size show xview yview find ] set columnCommands [list add cget configure delete names nearest] set labelCommands [list bind] ###################################################################### #- this initializes the option database. Kinda gross, but it works #- (I think). ###################################################################### set packages [package names] # why check for the Tk package? This lets us be sourced into # an interpreter that doesn't have Tk loaded, such as the slave # interpreter used by pkg_mkIndex. In theory it should have no # side effects when run if {"Tk" in $packages} { # compute a widget name we can use to create a temporary widget set tmpWidget ".__tmp__" set count 0 while {[winfo exists $tmpWidget] == 1} { set tmpWidget ".__tmp__$count" incr count } # steal options from the listbox # we want darn near all options, so we'll go ahead and do # them all. No harm done in adding the one or two that we # don't use. listbox $tmpWidget foreach foo [$tmpWidget configure] { if {[llength $foo] == 5} { set option [lindex $foo 1] set value [lindex $foo 4] option add *Mclistbox.$option $value widgetDefault # these options also apply to the individual columns... if {[string compare $option "foreground"] == 0 \ || [string compare $option "background"] == 0 \ || [string compare $option "font"] == 0} { option add *Mclistbox*MclistboxColumn.$option $value \ widgetDefault } } } destroy $tmpWidget # steal some options from label widgets; we only want a subset # so we'll use a slightly different method. No harm in *not* # adding in the one or two that we don't use... :-) label $tmpWidget foreach option [list Background Font Foreground Height Image] { set values [$tmpWidget configure -[string tolower $option]] option add *Mclistbox.label$option [lindex $values 4] widgetDefault } option add *Mclistbox.labelAnchor w widgetDefault set values [$tmpWidget configure -foreground] option add *Mclistbox.labelActiveForeground [lindex $values 4] \ widgetDefault set values [$tmpWidget configure -background] option add *Mclistbox.labelActiveBackground [lindex $values 4] \ widgetDefault destroy $tmpWidget # these are unique to us... option add *Mclistbox.columnBorderWidth 0 widgetDefault option add *Mclistbox.columnRelief flat widgetDefault option add *Mclistbox.labelBorderWidth 0.25m widgetDefault option add *Mclistbox.labelRelief raised widgetDefault option add *Mclistbox.labels 1 widgetDefault option add *Mclistbox.resizableColumns 1 widgetDefault option add *Mclistbox.resizeOneColumn 1 widgetDefault option add *Mclistbox.selectcommand {} widgetDefault option add *Mclistbox.fillcolumn {} widgetDefault # column options option add *Mclistbox*MclistboxColumn.visible 1 widgetDefault option add *Mclistbox*MclistboxColumn.resizable 1 widgetDefault option add *Mclistbox*MclistboxColumn.position end widgetDefault option add *Mclistbox*MclistboxColumn.label "" widgetDefault option add *Mclistbox*MclistboxColumn.width 0 widgetDefault option add *Mclistbox*MclistboxColumn.bitmap "" widgetDefault option add *Mclistbox*MclistboxColumn.image "" widgetDefault option add *Mclistbox*MclistboxColumn.compound right widgetDefault option add *Mclistbox*MclistboxColumn.command "" widgetDefault } ###################################################################### # define the class bindings ###################################################################### SetClassBindings } # ::mclistbox::mclistbox -- # # This is the command that gets exported. It creates a new # mclistbox widget. # # Arguments: # # w path of new widget to create # args additional option/value pairs (eg: -background white, etc.) # # Results: # # It creates the widget and sets up all of the default bindings # # Returns: # # The name of the newly create widget proc ::mclistbox::mclistbox {args} { variable widgetOptions # perform a one time initialization if {![info exists widgetOptions]} { Init } # make sure we at least have a widget name if {[llength $args] == 0} { error "wrong # args: should be \"mclistbox pathName ?options?\"" } # ... and make sure a widget doesn't already exist by that name if {[winfo exists [lindex $args 0]]} { error "window name \"[lindex $args 0]\" already exists" } # and check that all of the args are valid foreach {name value} [lrange $args 1 end] { Canonize [lindex $args 0] option $name } # build it... set w [eval Build $args] # set some bindings... SetBindings $w # and we are done! return $w } # ::mclistbox::Build -- # # This does all of the work necessary to create the basic # mclistbox. # # Arguments: # # w widget name # args additional option/value pairs # # Results: # # Creates a new widget with the given name. Also creates a new # namespace patterened after the widget name, as a child namespace # to ::mclistbox # # Returns: # # the name of the widget proc ::mclistbox::Build {w args} { variable widgetOptions # create the namespace for this instance, and define a few # variables namespace eval ::mclistbox::$w { variable options variable widgets variable misc } # this gives us access to the namespace variables within # this proc upvar ::mclistbox::${w}::widgets widgets upvar ::mclistbox::${w}::options options upvar ::mclistbox::${w}::misc misc # initially we start out with no columns set misc(columns) {} # this is our widget -- a frame of class Mclistbox. Naturally, # it will contain other widgets. We create it here because # we need it to be able to set our default options. set widgets(this) [frame $w -class Mclistbox -takefocus 1] # this defines all of the default options. We get the # values from the option database. Note that if an array # value is a list of length one it is an alias to another # option, so we just ignore it foreach name [array names widgetOptions] { if {[llength $widgetOptions($name)] == 1} continue set optName [lindex $widgetOptions($name) 0] set optClass [lindex $widgetOptions($name) 1] set options($name) [option get $w $optName $optClass] } # now apply any of the options supplied on the command # line. This may overwrite our defaults, which is OK if {[llength $args] > 0} { array set options $args } # the columns all go into a text widget since it has the # ability to scroll. set widgets(text) [text $w.text \ -width 0 \ -height 0 \ -padx 0 \ -pady 0 \ -wrap none \ -borderwidth 0 \ -highlightthickness 0 \ -takefocus 0 \ -cursor {} \ ] $widgets(text) configure -state disabled # here's the tricky part (shhhh... don't tell anybody!) # we are going to create column that completely fills # the base frame. We will use it to control the sizing # of the widget. The trick is, we'll pack it in the frame # and then place the text widget over it so it is never # seen. set columnWidgets [NewColumn $w {__hidden__}] set widgets(hiddenFrame) [lindex $columnWidgets 0] set widgets(hiddenListbox) [lindex $columnWidgets 1] set widgets(hiddenLabel) [lindex $columnWidgets 2] # by default geometry propagation is turned off, but for this # super-secret widget we want it turned on. The idea is, we # resize the listbox which resizes the frame which resizes the # whole shibang. pack propagate $widgets(hiddenFrame) on pack $widgets(hiddenFrame) -side top -fill both -expand y place $widgets(text) -x 0 -y 0 -relwidth 1.0 -relheight 1.0 raise $widgets(text) # we will later rename the frame's widget proc to be our # own custom widget proc. We need to keep track of this # new name, so we'll define and store it here... set widgets(frame) ::mclistbox::${w}::$w # this moves the original frame widget proc into our # namespace and gives it a handy name rename ::$w $widgets(frame) # now, create our widget proc. Obviously (?) it goes in # the global namespace. All mclistbox widgets will actually # share the same widget proc to cut down on the amount of # bloat. proc ::$w {command args} \ "eval ::mclistbox::WidgetProc {$w} \$command \$args" # ok, the thing exists... let's do a bit more configuration. if {[catch "Configure $widgets(this) [array get options]" error]} { catch {destroy $w} } # and be prepared to handle selections.. (this, for -exportselection # support) selection handle $w [list ::mclistbox::SelectionHandler $w get] return $w } # ::mclistbox::SelectionHandler -- # # handle reqests to set or retrieve the primary selection. This is # the "guts" of the implementation of the -exportselection option. # What a pain! Note that this command is *not* called as a result # of the widget's "selection" command, but rather as a result of # the global selection being set or cleared. # # If I read the ICCCM correctly (which is doubtful; who has time to # read that thing thoroughly?), this should return each row as a tab # separated list of values, and the whole as a newline separated # list of rows. # # Arguments: # # w pathname of the widget # type one of "own", "lose" or "get" # offset only used if type is "get"; offset into the selection # buffer where the returned data should begin # length number of bytes to return # proc ::mclistbox::SelectionHandler {w type {offset ""} {length ""}} { upvar ::mclistbox::${w}::options options upvar ::mclistbox::${w}::misc misc upvar ::mclistbox::${w}::widgets widgets switch -exact -- $type { own { selection own \ -command [list ::mclistbox::SelectionHandler $w lose] \ -selection PRIMARY \ $w } lose { if {$options(-exportselection)} { foreach id $misc(columns) { $widgets(listbox$id) selection clear 0 end } } } get { set end [expr {$length + $offset - 1}] set column [lindex $misc(columns) 0] set curselection [$widgets(listbox$column) curselection] # this is really, really slow (relatively speaking). # but the only way I can think of to speed this up # is to duplicate all the data in our hidden listbox, # which I really don't want to do because of memory # considerations. set data "" foreach index $curselection { set rowdata [join [::mclistbox::WidgetProc-get $w $index] "\t"] lappend data $rowdata } set data [join $data "\n"] return [string range $data $offset $end] } } } # ::mclistbox::convert -- # # public routine to convert %x, %y and %W binding substitutions. # Given an x, y and or %W value relative to a given widget, this # routine will convert the values to be relative to the mclistbox # widget. For example, it could be used in a binding like this: # # bind .mclistbox {doSomething [::mclistbox::convert %W -x %x]} # # Note that this procedure is *not* exported, but is indented for # public use. It is not exported because the name could easily # clash with existing commands. # # Arguments: # # w a widget path; typically the actual result of a %W # substitution in a binding. It should be either a # mclistbox widget or one of its subwidgets # # args should one or more of the following arguments or # pairs of arguments: # # -x will convert the value ; typically will # be the result of a %x substitution # -y will convert the value ; typically will # be the result of a %y substitution # -W (or -w) will return the name of the mclistbox widget # which is the parent of $w # # Returns: # # a list of the requested values. For example, a single -w will # result in a list of one items, the name of the mclistbox widget. # Supplying "-x 10 -y 20 -W" (in any order) will return a list of # three values: the converted x and y values, and the name of # the mclistbox widget. proc ::mclistbox::convert {w args} { set result {} if {![winfo exists $w]} { error "window \"$w\" doesn't exist" } while {[llength $args] > 0} { set option [lindex $args 0] set args [lrange $args 1 end] switch -exact -- $option { -x { set value [lindex $args 0] set args [lrange $args 1 end] set win $w while {[winfo class $win] != "Mclistbox"} { incr value [winfo x $win] set win [winfo parent $win] if {$win == "."} break } lappend result $value } -y { set value [lindex $args 0] set args [lrange $args 1 end] set win $w while {[winfo class $win] != "Mclistbox"} { incr value [winfo y $win] set win [winfo parent $win] if {$win == "."} break } lappend result $value } -w - -W { set win $w while {[winfo class $win] != "Mclistbox"} { set win [winfo parent $win] if {$win == "."} break; } lappend result $win } } } return $result } # ::mclistbox::SetBindings -- # # Sets up the default bindings for the named widget # # Arguments: # # w the widget pathname for which the bindings should be assigned # # Results: # # The named widget will inheirit all of the default Mclistbox # bindings. proc ::mclistbox::SetBindings {w} { upvar ::mclistbox::${w}::widgets widgets upvar ::mclistbox::${w}::options options upvar ::mclistbox::${w}::misc misc # we must do this so that the columns fill the text widget in # the y direction bind $widgets(text) \ [list ::mclistbox::AdjustColumns $w %h] } # ::mclistbox::SetClassBindings -- # # Sets up the default bindings for the widget class # # Arguments: # # none # proc ::mclistbox::SetClassBindings {} { # this allows us to clean up some things when we go away bind Mclistbox [list ::mclistbox::DestroyHandler %W] # steal all of the standard listbox bindings. Note that if a user # clicks in a column, %W will return that column. This is bad, # so we have to make a substitution in all of the bindings to # compute the real widget name (ie: the name of the topmost # frame) foreach event [bind Listbox] { set binding [bind Listbox $event] regsub -all {%W} $binding {[::mclistbox::convert %W -W]} binding regsub -all {%x} $binding {[::mclistbox::convert %W -x %x]} binding regsub -all {%y} $binding {[::mclistbox::convert %W -y %y]} binding bind Mclistbox $event $binding } # these define bindings for the column labels for resizing. Note # that we need both the name of this widget (calculated by $this) # as well as the specific widget that the event occured over. # Also note that $this is a constant string that gets evaluated # when the binding fires. # What a pain. set this {[::mclistbox::convert %W -W]} bind MclistboxMouseBindings \ "::mclistbox::ResizeEvent $this buttonpress %W %x %X %Y" bind MclistboxMouseBindings \ "::mclistbox::ResizeEvent $this buttonrelease %W %x %X %Y" bind MclistboxMouseBindings \ "::mclistbox::ResizeEvent $this leave %W %x %X %Y" bind MclistboxMouseBindings \ "::mclistbox::ResizeEvent $this motion %W %x %X %Y" bind MclistboxMouseBindings \ "::mclistbox::ResizeEvent $this motion %W %x %X %Y" bind MclistboxMouseBindings \ "::mclistbox::ResizeEvent $this drag %W %x %X %Y" } # ::mclistbox::NewColumn -- # # Adds a new column to the mclistbox widget # # Arguments: # # w the widget pathname # id the id for the new column # # Results: # # Creates a set of widgets which defines the column. Adds # appropriate entries to the global array widgets for the # new column. # # Note that this column is not added to the listbox by # this proc. # # Returns: # # A list of three elements: the path to the column frame, # the path to the column listbox, and the path to the column # label, in that order. proc ::mclistbox::NewColumn {w id} { upvar ::mclistbox::${w}::widgets widgets upvar ::mclistbox::${w}::options options upvar ::mclistbox::${w}::misc misc upvar ::mclistbox::${w}::columnID columnID # the columns are all children of the text widget we created... set frame \ [frame $w.frame$id \ -takefocus 0 \ -highlightthickness 0 \ -class MclistboxColumn \ -background $options(-background) \ ] set listbox \ [listbox $frame.listbox \ -takefocus 0 \ -bd 0 \ -setgrid $options(-setgrid) \ -exportselection false \ -selectmode $options(-selectmode) \ -highlightthickness 0 \ ] set label \ [label $frame.label \ -takefocus 0 \ -highlightthickness 0 \ ] # define mappings from widgets to columns set columnID($label) $id set columnID($frame) $id set columnID($listbox) $id # we're going to associate a new bindtag for the label to # handle our resize bindings. Why? We want the bindings to # be specific to this widget but we don't want to use the # widget name. If we use the widget name then the bindings # could get mixed up with user-supplied bindigs (via the # "label bind" command). set tag MclistboxLabel bindtags $label [list MclistboxMouseBindings $label] # reconfigure the label based on global options foreach option [list bd image height relief font anchor \ background foreground borderwidth] { if {[info exists options(-label$option)] \ && $options(-label$option) != ""} { $label configure -$option $options(-label$option) } } # reconfigure the column based on global options foreach option [list borderwidth relief] { if {[info exists options(-column$option)] \ && $options(-column$option) != ""} { $frame configure -$option $options(-column$option) } } # geometry propagation must be off so we can control the size # of the listbox by setting the size of the containing frame pack propagate $frame off pack $label -side top -fill x -expand n pack $listbox -side top -fill both -expand y -pady 0.5m # any events that happen in the listbox gets handled by the class # bindings. This has the unfortunate side effect bindtags $listbox [list $w Mclistbox all] # return a list of the widgets we created. return [list $frame $listbox $label] } # ::mclistbox::Column-add -- # # Implements the "column add" widget command # # Arguments: # # w the widget pathname # args additional option/value pairs which define the column # # Results: # # A column gets created and added to the listbox proc ::mclistbox::Column-add {w args} { upvar ::mclistbox::${w}::widgets widgets upvar ::mclistbox::${w}::options options upvar ::mclistbox::${w}::misc misc variable widgetOptions set id "column-[llength $misc(columns)]" ;# a suitable default # if the first argument doesn't have a "-" as the first # character, it is an id to associate with this column if {![string match {-*} [lindex $args 0]]} { # the first arg must be an id. set id [lindex $args 0] set args [lrange $args 1 end] if {$id in $misc(columns)} { error "column \"$id\" already exists" } } # define some reasonable defaults, then add any specific # values supplied by the user set opts(-bitmap) {} set opts(-compound) right set opts(-command) "" set opts(-image) {} set opts(-visible) 1 set opts(-resizable) 1 set opts(-position) "end" set opts(-width) 20 set opts(-background) $options(-background) set opts(-foreground) $options(-foreground) set opts(-font) $options(-font) set opts(-label) $id if {[expr {[llength $args]%2}] == 1} { # hmmm. An odd number of elements in args # if the last item is a valid option we'll give a different # error than if its not set option \ [::mclistbox::Canonize $w "column option" [lindex $args end]] error "value for \"[lindex $args end]\" missing" } array set opts $args # figure out if we have any data in the listbox yet; we'll need # this information in a minute... if {[llength $misc(columns)] > 0} { set col0 [lindex $misc(columns) 0] set existingRows [$widgets(listbox$col0) size] } else { set existingRows 0 } # create the widget and assign the associated paths to our array set widgetlist [NewColumn $w $id] set widgets(frame$id) [lindex $widgetlist 0] set widgets(listbox$id) [lindex $widgetlist 1] set widgets(label$id) [lindex $widgetlist 2] # add this column to the list of known columns lappend misc(columns) $id # configure the options. As a side effect, it will be inserted # in the text widget eval ::mclistbox::Column-configure {$w} {$id} [array get opts] # now, if there is any data already in the listbox, we need to # add a corresponding number of blank items. At least, I *think* # that's the right thing to do. if {$existingRows > 0} { set blanks {} for {set i 0} {$i < $existingRows} {incr i} { lappend blanks {} } eval {$widgets(listbox$id)} insert end $blanks } InvalidateScrollbars $w return $id } # ::mclistbox::Column-configure -- # # Implements the "column configure" widget command # # Arguments: # # w widget pathname # id column identifier # args list of option/value pairs proc ::mclistbox::Column-configure {w id args} { variable widgetOptions variable columnOptions upvar ::mclistbox::${w}::widgets widgets upvar ::mclistbox::${w}::options options upvar ::mclistbox::${w}::misc misc # bail if they gave us a bogus id set index [CheckColumnID $w $id] # define some shorthand set listbox $widgets(listbox$id) set frame $widgets(frame$id) set label $widgets(label$id) if {[llength $args] == 0} { # hmmm. User must be wanting all configuration information # note that if the value of an array element is of length # one it is an alias, which needs to be handled slightly # differently set results {} foreach opt [lsort [array names columnOptions]] { if {[llength $columnOptions($opt)] == 1} { set alias $columnOptions($opt) set optName $columnOptions($alias) lappend results [list $opt $optName] } else { set optName [lindex $columnOptions($opt) 0] set optClass [lindex $columnOptions($opt) 1] set default [option get $frame $optName $optClass] lappend results [list $opt $optName $optClass \ $default $options($id:$opt)] } } return $results } elseif {[llength $args] == 1} { # the user must be querying something... I need to get this # to return a bona fide list like the "real" configure # command, but it's not a priority at the moment. I still # have to work on the option database support foo. set option [::mclistbox::Canonize $w "column option" [lindex $args 0]] set value $options($id:$option) set optName [lindex $columnOptions($option) 0] set optClass [lindex $columnOptions($option) 1] set default [option get $frame $optName $optClass] set results [list $option $optName $optClass $default $value] return $results } # if we have an odd number of values, bail. if {[expr {[llength $args]%2}] == 1} { # hmmm. An odd number of elements in args error "value for \"[lindex $args end]\" missing" } # Great. An even number of options. Let's make sure they # are all valid before we do anything. Note that Canonize # will generate an error if it finds a bogus option; otherwise # it returns the canonical option name foreach {name value} $args { set name [::mclistbox::Canonize $w "column option" $name] set opts($name) $value } # if we get to here, the user is wanting to set some options foreach option [array names opts] { set value $opts($option) set options($id:$option) $value switch -- $option { -label { $label configure -text [Untrim $value] } -compound - -image - -bitmap { $label configure $option $value } -command { WidgetProc $w label bind $id <1> [string map {% %%} $value] } -width { set font [$listbox cget -font] set factor [font measure $options(-font) "0"] set width [expr {$value * $factor}] $widgets(frame$id) configure -width $width set misc(min-$widgets(frame$id)) $width AdjustColumns $w } -font - -foreground - -background { if {[string length $value] == 0} {set value $options($option)} $listbox configure $option $value } -resizable { if {[catch { if {$value} { set options($id:-resizable) 1 } else { set options($id:-resizable) 0 } } msg]} { error "expected boolean but got \"$value\"" } } -visible { if {[catch { if {$value} { set options($id:-visible) 1 $widgets(text) configure -state normal $widgets(text) window configure 1.$index -window $frame $widgets(text) configure -state disabled } else { set options($id:-visible) 0 $widgets(text) configure -state normal $widgets(text) window configure 1.$index -window {} $widgets(text) configure -state disabled } InvalidateScrollbars $w } msg]} { error "expected boolean but got \"$value\"" } } -position { if {[string compare $value "start"] == 0} { set position 0 } elseif {[string compare $value "end"] == 0} { set position [expr {[llength $misc(columns)] -1}] } else { # ought to check for a legal value here, but I'm # lazy set position $value } if {$position >= [llength $misc(columns)]} { set max [expr {[llength $misc(columns)] -1}] error "bad position; must be in the range of 0-$max" } # rearrange misc(columns) to reflect the new ordering set current [lsearch -exact $misc(columns) $id] set misc(columns) [lreplace $misc(columns) $current $current] set misc(columns) [linsert $misc(columns) $position $id] set frame $widgets(frame$id) $widgets(text) configure -state normal $widgets(text) window create 1.$position \ -window $frame -stretch 1 $widgets(text) configure -state disabled } } } } # ::mclistbox::DestroyHandler {w} -- # # Cleans up after a mclistbox widget is destroyed # # Arguments: # # w widget pathname # # Results: # # The namespace that was created for the widget is deleted, # and the widget proc is removed. proc ::mclistbox::DestroyHandler {w} { # kill off any idle event we might have pending if {[info exists ::mclistbox::${w}::misc(afterid)]} { catch { after cancel $::mclistbox::${w}::misc(afterid) unset ::mclistbox::${w}::misc(afterid) } } # if the widget actually being destroyed is of class Mclistbox, # crush the namespace and kill the proc. Get it? Crush. Kill. # Destroy. Heh. Danger Will Robinson! Oh, man! I'm so funny it # brings tears to my eyes. if {[string compare [winfo class $w] "Mclistbox"] == 0} { namespace delete ::mclistbox::$w rename $w {} } } # ::mclistbox::MassageIndex -- # # this proc massages indicies of the form @x,y such that # the coordinates are relative to the first listbox rather # than relative to the topmost frame. # # Arguments: # # w widget pathname # index an index of the form @x,y # # Results: # # Returns a new index with translated coordinates. This index # may be used directly by an internal listbox. proc ::mclistbox::MassageIndex {w index} { upvar ::mclistbox::${w}::widgets widgets upvar ::mclistbox::${w}::misc misc if {[regexp {@([0-9]+),([0-9]+)} $index matchvar x y]} { set id [lindex $misc(columns) 0] incr y -[winfo y $widgets(listbox$id)] incr y -[winfo y $widgets(frame$id)] incr x [winfo x $widgets(listbox$id)] incr x [winfo x $widgets(frame$id)] set index @${x},${y} } return $index } # ::mclistbox::WidgetProc -- # # This gets uses as the widgetproc for an mclistbox widget. # Notice where the widget is created and you'll see that the # actual widget proc merely evals this proc with all of the # arguments intact. # # Note that some widget commands are defined "inline" (ie: # within this proc), and some do most of their work in # separate procs. This is merely because sometimes it was # easier to do it one way or the other. # # Arguments: # # w widget pathname # command widget subcommand # args additional arguments; varies with the subcommand # # Results: # # Performs the requested widget command proc ::mclistbox::WidgetProc {w command args} { variable widgetOptions upvar ::mclistbox::${w}::widgets widgets upvar ::mclistbox::${w}::options options upvar ::mclistbox::${w}::misc misc upvar ::mclistbox::${w}::columnID columnID set command [::mclistbox::Canonize $w command $command] # some commands have subcommands. We'll check for that here # and mung the command and args so that we can treat them as # distinct commands in the following switch statement if {[string compare $command "column"] == 0} { set subcommand [::mclistbox::Canonize $w "column command" \ [lindex $args 0]] set command "$command-$subcommand" set args [lrange $args 1 end] } elseif {[string compare $command "label"] == 0} { set subcommand [::mclistbox::Canonize $w "label command" \ [lindex $args 0]] set command "$command-$subcommand" set args [lrange $args 1 end] } set result "" catch {unset priorSelection} # here we go. Error checking be damned! switch -- $command { xview { # note that at present, "xview " is broken. I'm # not even sure how to do it. Unless I attach our hidden # listbox to the scrollbar and use it. Hmmm..... I'll # try that later. (FIXME) set result [eval {$widgets(text)} xview $args] set frame $widgets(frame$options(-fillcolumn)) set minwidth $misc(min-$frame) if {([lindex [$widgets(text) xview] 1] == 1) || ([$frame cget -width] <= $minwidth)} { InvalidateScrollbars $w } else { AdjustColumns $w } } yview { if {[llength $args] == 0} { # length of zero means to fetch the yview; we can # get this from a single listbox set result [$widgets(hiddenListbox) yview] } else { # if it's one argument, it's an index. We'll pass that # index through the index command to properly translate # @x,y indicies, and place the value back in args if {[llength $args] == 1} { set index [::mclistbox::MassageIndex $w [lindex $args 0]] set args [list $index] } # run the yview command on every column. foreach id $misc(columns) { eval {$widgets(listbox$id)} yview $args } eval {$widgets(hiddenListbox)} yview $args InvalidateScrollbars $w set result "" } } activate { if {[llength $args] != 1} { error "wrong \# of args: should be $w activate index" } set index [::mclistbox::MassageIndex $w [lindex $args 0]] foreach id $misc(columns) { $widgets(listbox$id) activate $index } set result "" } bbox { if {[llength $args] != 1} { error "wrong \# of args: should be $w bbox index" } # get a real index. This will adjust @x,y indicies # to account for the label, if any. set index [::mclistbox::MassageIndex $w [lindex $args 0]] set id [lindex $misc(columns) 0] # we can get the x, y, and height from the first # column. set bbox [$widgets(listbox$id) bbox $index] if {[string length $bbox] == 0} {return ""} foreach {x y w h} $bbox {} # the x and y coordinates have to be adjusted for the # fact that the listbox is inside a frame, and the # frame is inside a text widget. All of those add tiny # offsets. Feh. incr y [winfo y $widgets(listbox$id)] incr y [winfo y $widgets(frame$id)] incr x [winfo x $widgets(listbox$id)] incr x [winfo x $widgets(frame$id)] # we can get the width by looking at the relative x # coordinate of the right edge of the last column set id [lindex $misc(columns) end] set w [expr {[winfo width $widgets(frame$id)] + \ [winfo x $widgets(frame$id)]}] set bbox [list $x $y [expr {$x + $w}] $h] set result $bbox } label-bind { # we are just too clever for our own good. (that's a # polite way of saying this is more complex than it # needs to be) set id [lindex $args 0] set index [CheckColumnID $w $id] set args [lrange $args 1 end] if {[llength $args] == 0} { set result [bind $widgets(label$id)] } else { # when we create a binding, we'll actually have the # binding run our own command with the user's command # as an argument. This way we can do some sanity checks # before running the command. So, when querying a binding # we need to only return the user's code set sequence [lindex $args 0] if {[llength $args] == 1} { set result [lindex [bind $widgets(label$id) $sequence] end] } else { # replace %W with our toplevel frame, then # do the binding set code [lindex $args 1] regsub -all {%W} $code $w code set result [bind $widgets(label$id) $sequence \ [list ::mclistbox::LabelEvent $w $id $code]] } } } column-add { eval ::mclistbox::Column-add {$w} $args AdjustColumns $w set result "" } column-delete { foreach id $args { set index [CheckColumnID $w $id] # remove the reference from our list of columns set misc(columns) [lreplace $misc(columns) $index $index] # whack the widget destroy $widgets(frame$id) # clear out references to the individual widgets unset widgets(frame$id) unset widgets(listbox$id) unset widgets(label$id) } InvalidateScrollbars $w set result "" } column-cget { if {[llength $args] != 2} { error \ "wrong # of args: should be \"$w column cget name option\"" } set id [::mclistbox::Canonize $w column [lindex $args 0]] set option [lindex $args 1] set data [::mclistbox::Column-configure $w $id $option] set result [lindex $data 4] } column-configure { set id [::mclistbox::Canonize $w column [lindex $args 0]] set args [lrange $args 1 end] set result [eval ::mclistbox::Column-configure {$w} {$id} $args] } column-names { if {[llength $args] != 0} { error "wrong # of args: should be \"$w column names\"" } set result $misc(columns) } column-nearest { if {[llength $args] != 1} { error "wrong # of args: should be \"$w column nearest x\"" } set x [lindex $args 0] set tmp [$widgets(text) index @$x,0] set tmp [split $tmp "."] set index [lindex $tmp 1] set result [lindex $misc(columns) $index] } cget { if {[llength $args] != 1} { error "wrong # args: should be $w cget option" } set opt [::mclistbox::Canonize $w option [lindex $args 0]] set result $options($opt) } configure { set result [eval ::mclistbox::Configure {$w} $args] } curselection { set id [lindex $misc(columns) 0] set result [$widgets(listbox$id) curselection] } delete { if {[llength $args] < 1 || [llength $args] > 2} { error "wrong \# of args: should be $w delete first ?last?" } # it's possible that the selection will change because # of something we do. So, grab the current selection before # we do anything. Just before returning we'll see if the # selection has changed. If so, we'll call our selectcommand if {$options(-selectcommand) != ""} { set col0 [lindex $misc(columns) 0] set priorSelection [$widgets(listbox$col0) curselection] } set index1 [::mclistbox::MassageIndex $w [lindex $args 0]] if {[llength $args] == 2} { set index2 [::mclistbox::MassageIndex $w [lindex $args 1]] } else { set index2 "" } # note we do an eval here to make index2 "disappear" if it # is set to an empty string. foreach id $misc(columns) { eval {$widgets(listbox$id)} delete $index1 $index2 } eval {$widgets(hiddenListbox)} delete $index1 $index2 InvalidateScrollbars $w set result "" } get { if {[llength $args] < 1 || [llength $args] > 2} { error "wrong \# of args: should be $w get first ?last?" } set index1 [::mclistbox::MassageIndex $w [lindex $args 0]] if {[llength $args] == 2} { set index2 [::mclistbox::MassageIndex $w [lindex $args 1]] } else { set index2 "" } set result [eval ::mclistbox::WidgetProc-get {$w} $index1 $index2] } index { if {[llength $args] != 1} { error "wrong \# of args: should be $w index index" } set index [::mclistbox::MassageIndex $w [lindex $args 0]] set id [lindex $misc(columns) 0] set result [$widgets(listbox$id) index $index] } insert { if {[llength $args] < 1} { error "wrong \# of args: should be $w insert ?element \ element...?" } # it's possible that the selection will change because # of something we do. So, grab the current selection before # we do anything. Just before returning we'll see if the # selection has changed. If so, we'll call our selectcommand if {$options(-selectcommand) != ""} { set col0 [lindex $misc(columns) 0] set priorSelection [$widgets(listbox$col0) curselection] } set index [::mclistbox::MassageIndex $w [lindex $args 0]] ::mclistbox::Insert $w $index [lrange $args 1 end] InvalidateScrollbars $w set result "" } find { if {[llength $args] != 2} { error "wrong \# of args: should be $w find x y" } # translate the y coordinate into listbox space set id [lindex $misc(columns) 0] set y [lindex $args 1] #incr y -[winfo y $widgets(listbox$id)] #incr y -[winfo y $widgets(frame$id)] set col0 [lindex $misc(columns) 0] set result [$widgets(listbox$col0) nearest $y] } nearest { if {[llength $args] != 1} { error "wrong \# of args: should be $w nearest y" } # translate the y coordinate into listbox space set id [lindex $misc(columns) 0] set y [lindex $args 0] incr y -[winfo y $widgets(listbox$id)] incr y -[winfo y $widgets(frame$id)] set col0 [lindex $misc(columns) 0] set result [$widgets(listbox$col0) nearest $y] } scan { foreach {subcommand x y} $args {} switch -- $subcommand { mark { # we have to treat scrolling in x and y differently; # scrolling in the y direction affects listboxes and # scrolling in the x direction affects the text widget. # to facilitate that, we need to keep a local copy # of the scan mark. set misc(scanmarkx) $x set misc(scanmarky) $y # set the scan mark for each column foreach id $misc(columns) { $widgets(listbox$id) scan mark $x $y } # we can't use the x coordinate given us, since it # is relative to whatever column we are over. So, # we'll just usr the results of [winfo pointerx]. $widgets(text) scan mark [winfo pointerx $w] $y } dragto { # we want the columns to only scan in the y direction, # so we'll force the x componant to remain constant foreach id $misc(columns) { $widgets(listbox$id) scan dragto $misc(scanmarkx) $y } # since the scan mark of the text widget was based # on the pointer location, so must be the x # coordinate to the dragto command. And since we # want the text widget to only scan in the x # direction, the y componant will remain constant $widgets(text) scan dragto \ [winfo pointerx $w] $misc(scanmarky) # make sure the scrollbars reflect the changes. InvalidateScrollbars $w } } set result "" } show - see { if {[llength $args] != 1} { error "wrong \# of args: should be $w see/show index" } set index [::mclistbox::MassageIndex $w [lindex $args 0]] foreach id $misc(columns) { $widgets(listbox$id) see $index } InvalidateScrollbars $w set result {} } selection { # it's possible that the selection will change because # of something we do. So, grab the current selection before # we do anything. Just before returning we'll see if the # selection has changed. If so, we'll call our selectcommand if {$options(-selectcommand) != ""} { set col0 [lindex $misc(columns) 0] set priorSelection [$widgets(listbox$col0) curselection] } set subcommand [lindex $args 0] set args [lrange $args 1 end] set prefix "wrong \# of args: should be $w" switch -- $subcommand { includes { if {[llength $args] != 1} { error "$prefix selection $subcommand index" } set index [::mclistbox::MassageIndex $w [lindex $args 0]] set id [lindex $misc(columns) 0] set result [$widgets(listbox$id) selection includes $index] } set { switch -- [llength $args] { 1 { set index1 [::mclistbox::MassageIndex $w \ [lindex $args 0]] set index2 "" } 2 { set index1 [::mclistbox::MassageIndex $w \ [lindex $args 0]] set index2 [::mclistbox::MassageIndex $w \ [lindex $args 1]] } default { error "$prefix selection set first ?last?" } } if {$options(-exportselection)} { SelectionHandler $w own } if {$index1 != ""} { foreach id $misc(columns) { eval {$widgets(listbox$id)} selection set \ $index1 $index2 } event generate $w <> } set result "" } anchor { if {[llength $args] != 1} { error "$prefix selection $subcommand index" } set index [::mclistbox::MassageIndex $w [lindex $args 0]] if {$options(-exportselection)} { SelectionHandler $w own } foreach id $misc(columns) { $widgets(listbox$id) selection anchor $index } set result "" } clear { switch -- [llength $args] { 1 { set index1 [::mclistbox::MassageIndex $w \ [lindex $args 0]] set index2 "" } 2 { set index1 [::mclistbox::MassageIndex $w \ [lindex $args 0]] set index2 [::mclistbox::MassageIndex $w \ [lindex $args 1]] } default { error "$prefix selection clear first ?last?" } } if {$options(-exportselection)} { SelectionHandler $w own } foreach id $misc(columns) { eval {$widgets(listbox$id)} selection clear \ $index1 $index2 } event generate $w <> set result "" } } } size { set id [lindex $misc(columns) 0] set result [$widgets(listbox$id) size] } } # if the user has a selectcommand defined and the selection changed, # run the selectcommand if {[info exists priorSelection] && $options(-selectcommand) != ""} { set column [lindex $misc(columns) 0] set currentSelection [$widgets(listbox$column) curselection] if {[string compare $priorSelection $currentSelection] != 0} { # this logic keeps us from getting into some sort of # infinite loop of the selectcommand changes the selection # (not particularly well tested, but it seems like the # right thing to do...) if {![info exists misc(skipRecursiveCall)]} { set misc(skipRecursiveCall) 1 uplevel \#0 $options(-selectcommand) $currentSelection catch {unset misc(skipRecursiveCall)} } } } return $result } # ::mclistbox::WidgetProc-get -- # # Implements the "get" widget command # # Arguments: # # w widget path # args additional arguments to the get command proc ::mclistbox::WidgetProc-get {w args} { upvar ::mclistbox::${w}::widgets widgets upvar ::mclistbox::${w}::options options upvar ::mclistbox::${w}::misc misc set returnType "list" # the listbox "get" command returns different things # depending on whether it has one or two args. Internally # we *always* want a valid list, so we'll force a second # arg which in turn forces the listbox to return a list, # even if its a list of one element if {[llength $args] == 1} { lappend args [lindex $args 0] set returnType "listOfLists" } # get all the data from each column foreach id $misc(columns) { set data($id) {} foreach str [eval {$widgets(listbox$id)} get $args] { lappend data($id) [Trim $str] } } # now join the data together one row at a time. Ugh. set result {} set rows [llength $data($id)] for {set i 0} {$i < $rows} {incr i} { set this {} foreach column $misc(columns) { lappend this [lindex $data($column) $i] } lappend result $this } # now to unroll the list if necessary. If the user gave # us only one indicie we want to return a single list # of values. If they gave use two indicies we want to return # a list of lists. if {[string compare $returnType "list"] == 0} { return $result } else { return [lindex $result 0] } } # ::mclistbox::CheckColumnID -- # # returns the index of the id within our list of columns, or # reports an error if the id is invalid # # Arguments: # # w widget pathname # id a column id # # Results: # # Will compute and return the index of the column within the # list of columns (which happens to be it's -position, as it # turns out) or returns an error if the named column doesn't # exist. proc ::mclistbox::CheckColumnID {w id} { upvar ::mclistbox::${w}::misc misc set id [::mclistbox::Canonize $w column $id] set index [lsearch -exact $misc(columns) $id] return $index } # ::mclistbox::LabelEvent -- # # Handle user events on the column labels for the Mclistbox # class. # # Arguments: # # w widget pathname # id a column identifier # code tcl code to be evaluated. # # Results: # # Executes the code associate with an event, but only if the # event wouldn't otherwise potentially trigger a resize event. # # We use the cursor of the label to let us know whether the # code should be executed. If it is set to the cursor of the # mclistbox widget, the code will be executed. It is assumed # that if it is not the same cursor, it is the resize cursor # which should only be set if the cursor is very near a border # of a label and the column is resizable. proc ::mclistbox::LabelEvent {w id code} { upvar ::mclistbox::${w}::widgets widgets upvar ::mclistbox::${w}::options options # only fire the binding if the cursor is our default cursor # (ie: if we aren't in a "resize zone") set cursor [$widgets(label$id) cget -cursor] if {[string compare $cursor $options(-cursor)] == 0} { uplevel \#0 $code } } # ::mclistbox::HumanizeList -- # # Returns a human-readable form of a list by separating items # by columns, but separating the last two elements with "or" # (eg: foo, bar or baz) # # Arguments: # # list a valid tcl list # # Results: # # A string which as all of the elements joined with ", " or # the word " or " proc ::mclistbox::HumanizeList {list} { if {[llength $list] == 1} { return [lindex $list 0] } else { set list [lsort $list] set secondToLast [expr {[llength $list] -2}] set most [lrange $list 0 $secondToLast] set last [lindex $list end] return "[join $most {, }] or $last" } } # ::mclistbox::Canonize -- # # takes a (possibly abbreviated) option or command name and either # returns the canonical name or an error # # Arguments: # # w widget pathname # object type of object to canonize; must be one of "command", # "option", "column" or "column option". # opt the option (or command) to be canonized # # Returns: # # Returns either the canonical form of an option or command, # or raises an error if the option or command is unknown or # ambiguous. proc ::mclistbox::Canonize {w object opt} { variable widgetOptions variable columnOptions variable widgetCommands variable columnCommands variable labelCommands switch -- $object { command { if {$opt in $widgetCommands} { return $opt } # command names aren't stored in an array, and there # isn't a way to get all the matches in a list, so # we'll stuff the columns in a temporary array so # we can use [array names] set list $widgetCommands foreach element $list { set tmp($element) "" } set matches [array names tmp ${opt}*] } {label command} { if {$opt in $labelCommands} { return $opt } # command names aren't stored in an array, and there # isn't a way to get all the matches in a list, so # we'll stuff the columns in a temporary array so # we can use [array names] set list $labelCommands foreach element $list { set tmp($element) "" } set matches [array names tmp ${opt}*] } {column command} { if {$opt in $columnCommands} { return $opt } # command names aren't stored in an array, and there # isn't a way to get all the matches in a list, so # we'll stuff the columns in a temporary array so # we can use [array names] set list $columnCommands foreach element $list { set tmp($element) "" } set matches [array names tmp ${opt}*] } option { if {[info exists widgetOptions($opt)] \ && [llength $widgetOptions($opt)] == 3} { return $opt } set list [array names widgetOptions] set matches [array names widgetOptions ${opt}*] } {column option} { if {[info exists columnOptions($opt)]} { return $opt } set list [array names columnOptions] set matches [array names columnOptions ${opt}*] } column { upvar ::mclistbox::${w}::misc misc if {$opt in $misc(columns)} { return $opt } # column names aren't stored in an array, and there # isn't a way to get all the matches in a list, so # we'll stuff the columns in a temporary array so # we can use [array names] set list $misc(columns) foreach element $misc(columns) { set tmp($element) "" } set matches [array names tmp ${opt}*] } } if {[llength $matches] == 0} { set choices [HumanizeList $list] error "unknown $object \"$opt\"; must be one of $choices" } elseif {[llength $matches] == 1} { # deal with option aliases set opt [lindex $matches 0] switch -- $object { option { if {[llength $widgetOptions($opt)] == 1} { set opt $widgetOptions($opt) } } {column option} { if {[llength $columnOptions($opt)] == 1} { set opt $columnOptions($opt) } } } return $opt } else { set choices [HumanizeList $list] error "ambiguous $object \"$opt\"; must be one of $choices" } } # ::mclistbox::Configure -- # # Implements the "configure" widget subcommand # # Arguments: # # w widget pathname # args zero or more option/value pairs (or a single option) # # Results: # # Performs typcial "configure" type requests on the widget proc ::mclistbox::Configure {w args} { variable widgetOptions upvar ::mclistbox::${w}::widgets widgets upvar ::mclistbox::${w}::options options upvar ::mclistbox::${w}::misc misc if {[llength $args] == 0} { # hmmm. User must be wanting all configuration information # note that if the value of an array element is of length # one it is an alias, which needs to be handled slightly # differently set results {} foreach opt [lsort [array names widgetOptions]] { if {[llength $widgetOptions($opt)] == 1} { set alias $widgetOptions($opt) set optName $widgetOptions($alias) lappend results [list $opt $optName] } else { set optName [lindex $widgetOptions($opt) 0] set optClass [lindex $widgetOptions($opt) 1] set default [option get $w $optName $optClass] lappend results [list $opt $optName $optClass \ $default $options($opt)] } } return $results } # one argument means we are looking for configuration # information on a single option if {[llength $args] == 1} { set opt [::mclistbox::Canonize $w option [lindex $args 0]] set optName [lindex $widgetOptions($opt) 0] set optClass [lindex $widgetOptions($opt) 1] set default [option get $w $optName $optClass] set results [list $opt $optName $optClass \ $default $options($opt)] return $results } # if we have an odd number of values, bail. if {[expr {[llength $args]%2}] == 1} { # hmmm. An odd number of elements in args error "value for \"[lindex $args end]\" missing" } # Great. An even number of options. Let's make sure they # are all valid before we do anything. Note that Canonize # will generate an error if it finds a bogus option; otherwise # it returns the canonical option name foreach {name value} $args { set name [::mclistbox::Canonize $w option $name] set opts($name) $value } # process all of the configuration options foreach option [array names opts] { set newValue $opts($option) if {[info exists options($option)]} { set oldValue $options($option) # set options($option) $newValue } switch -- $option { -exportselection { if {$newValue} { SelectionHandler $w own set options($option) 1 } else { set options($option) 0 } } -fillcolumn { # if the fill column changed, we need to adjust # the columns. AdjustColumns $w set options($option) $newValue } -takefocus { $widgets(frame) configure -takefocus $newValue set options($option) [$widgets(frame) cget $option] } -background { foreach id $misc(columns) { $widgets(listbox$id) configure -background $newValue $widgets(frame$id) configure -background $newValue } $widgets(frame) configure -background $newValue $widgets(text) configure -background $newValue set options($option) [$widgets(frame) cget $option] } # { the following all must be applied to each listbox } -foreground - -font - -selectborderwidth - -selectforeground - -selectbackground - -setgrid { foreach id $misc(columns) { $widgets(listbox$id) configure $option $newValue } $widgets(hiddenListbox) configure $option $newValue set options($option) [$widgets(hiddenListbox) cget $option] } # { the following all must be applied to each listbox and frame } -cursor { foreach id $misc(columns) { $widgets(listbox$id) configure $option $newValue $widgets(frame$id) configure -cursor $newValue } # -cursor also needs to be applied to the # frames of each column foreach id $misc(columns) { $widgets(frame$id) configure -cursor $newValue } $widgets(hiddenListbox) configure $option $newValue set options($option) [$widgets(hiddenListbox) cget $option] } # { this just requires to pack or unpack the labels } -labels { if {$newValue} { set newValue 1 foreach id $misc(columns) { pack $widgets(label$id) \ -side top -fill x -expand n \ -before $widgets(listbox$id) } pack $widgets(hiddenLabel) \ -side top -fill x -expand n \ -before $widgets(hiddenListbox) } else { set newValue foreach id $misc(columns) { pack forget $widgets(label$id) } pack forget $widgets(hiddenLabel) } set options($option) $newValue } -height { $widgets(hiddenListbox) configure -height $newValue InvalidateScrollbars $w set options($option) [$widgets(hiddenListbox) cget $option] } -width { if {$newValue == 0} { error "a -width of zero is not supported. " } $widgets(hiddenListbox) configure -width $newValue InvalidateScrollbars $w set options($option) [$widgets(hiddenListbox) cget $option] } # { the following all must be applied to each column frame } -columnborderwidth - -columnrelief { regsub {column} $option {} listboxoption foreach id $misc(columns) { $widgets(listbox$id) configure $listboxoption $newValue } $widgets(hiddenListbox) configure $listboxoption $newValue set options($option) [$widgets(hiddenListbox) cget \ $listboxoption] } -resizeonecolumn - -resizablecolumns { if {$newValue} { set options($option) 1 } else { set options($option) 0 } } # { the following all must be applied to each column header } -labelimage - -labelheight - -labelrelief - -labelfont - -labelanchor - -labelbackground - -labelforeground - -labelborderwidth { regsub {label} $option {} labeloption foreach id $misc(columns) { $widgets(label$id) configure $labeloption $newValue } $widgets(hiddenLabel) configure $labeloption $newValue set options($option) [$widgets(hiddenLabel) cget $labeloption] } -labelactiveforeground { set options($option) $newValue } -labelactivebackground { set options($option) $newValue } # { the following apply only to the topmost frame} -borderwidth - -highlightthickness - -highlightcolor - -highlightbackground - -relief { $widgets(frame) configure $option $newValue set options($option) [$widgets(frame) cget $option] } -selectmode { set options($option) $newValue } -selectcommand { set options($option) $newValue } -xscrollcommand { InvalidateScrollbars $w set options($option) $newValue } -yscrollcommand { InvalidateScrollbars $w set options($option) $newValue } } } } # ::mclistbox::UpdateScrollbars -- # # This proc does the work of actually update the scrollbars to # reflect the current view # # Arguments: # # w widget pathname # # Results: # # Potentially changes the size or placement of the scrollbars # (if any) based on changes to the widget proc ::mclistbox::UpdateScrollbars {w} { upvar ::mclistbox::${w}::widgets widgets upvar ::mclistbox::${w}::options options upvar ::mclistbox::${w}::misc misc if {![winfo ismapped $w]} { catch {unset misc(afterid)} return } update idletasks if {[llength $misc(columns)] > 0} { if {[string length $options(-yscrollcommand)] != 0} { set col0 [lindex $misc(columns) 0] set yview [$widgets(listbox$col0) yview] eval $options(-yscrollcommand) $yview } if {[string length $options(-xscrollcommand)] != 0} { set col0 [lindex $misc(columns) 0] set xview [$widgets(text) xview] eval $options(-xscrollcommand) $xview } } catch {unset misc(afterid)} } # ::mclistbox::InvalidateScrollbars -- # # Schedules the scrollbars to be updated the next time # we are idle. # # Arguments: # # w widget pathname # # Results: # # sets up a proc to be run in the idle event handler proc ::mclistbox::InvalidateScrollbars {w} { upvar ::mclistbox::${w}::widgets widgets upvar ::mclistbox::${w}::options options upvar ::mclistbox::${w}::misc misc if {![info exists misc(afterid)]} { set misc(afterid) \ [after idle "catch {::mclistbox::UpdateScrollbars $w}"] } } # ::mclistbox::Insert -- # # This implements the "insert" widget command; it arranges for # one or more elements to be inserted into the listbox. # # Arguments: # # w widget pathname # index a valid listbox index to designate where the data is # to be inserted # arglist A list of values to be inserted. Each element of the # list will itself be treated as a list, one element for # each column. # # Results: # # Inserts the data into the list and updates the scrollbars proc ::mclistbox::Insert {w index arglist} { upvar ::mclistbox::${w}::widgets widgets upvar ::mclistbox::${w}::options options upvar ::mclistbox::${w}::misc misc foreach list $arglist { # make sure we have enough elements for each column for {set i [llength $list]} {$i < [llength $misc(columns)]} {incr i} { lappend list {} } set column 0 foreach id $misc(columns) { $widgets(listbox$id) insert $index [Untrim [lindex $list $column]] incr column } # we also want to add a bogus item to the hidden listbox. Why? # For standard listboxes, if you specify a height of zero the # listbox will resize to be just big enough to hold all the lines. # Since we use a hidden listbox to regulate the size of the widget # and we want this same behavior, this listbox needs the same number # of elements as the visible listboxes # # (NB: we might want to make this listbox contain the contents # of all columns as a properly formatted list; then the get # command can query this listbox instead of having to query # each individual listbox. The disadvantage is that it doubles # the memory required to hold all the data) $widgets(hiddenListbox) insert $index "x" } return "" } # ::mclistbox::ColumnIsHidden -- # # Returns a boolean representing whether a column is visible or # not # # Arguments: # # w widget pathname # id a column identifier # # Results: # # returns 1 if the column is visible (ie: not hidden), or 0 # if invisible. Note that the result doesn't consider whether # the column is actually viewable. Even if it has been scrolled # off screen, 1 will be returned as long as the column hasn't # been hidden by turning the visibility off. proc ::mclistbox::ColumnIsHidden {w id} { upvar ::mclistbox::${w}::widgets widgets upvar ::mclistbox::${w}::misc misc set retval 1 set col [lsearch -exact $misc(columns) $id] if {$col != ""} { set index "1.$col" catch { set window [$widgets(text) window cget $index -window] if {[string length $window] > 0 && [winfo exists $window]} { set retval 0 } } } return $retval } # ::mclistbox::AdjustColumns -- # # Adjusts the height and width of the individual columns. # # Arguments: # # w widget pathname # height height, in pixels, that the columns should be adjusted # to. If null, the height will be the height of the text # widget that underlies our columns. # # Results: # # All columns will be adjusted to fill the text widget in the y # direction. Also, if a -fillcolumn is defined, that column will # be grown, if necessary, to fill the widget in the x direction. proc ::mclistbox::AdjustColumns {w {height ""}} { upvar ::mclistbox::${w}::widgets widgets upvar ::mclistbox::${w}::options options upvar ::mclistbox::${w}::misc misc if {[string length $height] == 0} { set height [winfo height $widgets(text)] } # resize the height of each column so it matches the height # of the text widget, minus a few pixels. incr height -4 foreach id $misc(columns) { $widgets(frame$id) configure -height $height } # if we have a fillcolumn, change its width accordingly if {$options(-fillcolumn) != ""} { # make sure the column has been defined. If not, bail (?) if {![info exists widgets(frame$options(-fillcolumn))]} { return } set frame $widgets(frame$options(-fillcolumn)) set minwidth $misc(min-$frame) # compute current width of all columns set colwidth 0 set col 0 foreach id $misc(columns) { if {![ColumnIsHidden $w $id] && $id != $options(-fillcolumn)} { incr colwidth [winfo reqwidth $widgets(frame$id)] } } # this is just shorthand for later use... set id $options(-fillcolumn) # compute optimal width set optwidth [expr {[winfo width $widgets(text)] - \ (2 * [$widgets(text) cget -padx])}] # compute the width of our fill column set newwidth [expr {$optwidth - $colwidth}] if {$newwidth < $minwidth} { # adjust the width of our fill column frame if {$options(-resizeonecolumn)} { set fullwidth [expr {$colwidth + [winfo reqwidth $frame]}] lassign [$widgets(text) xview] lb rb set h [expr {int(($rb * $fullwidth) - $colwidth)}] if {$h < $minwidth} { set newwidth $minwidth } else { set newwidth $h } } else { set newwidth $minwidth } } $widgets(frame$id) configure -width $newwidth } InvalidateScrollbars $w } # ::mclistbox::FindResizableNeighbor -- # # Returns the nearest resizable column to the left or right # of the named column. # # Arguments: # # w widget pathname # id column identifier # direction should be one of "right" or "left". Actually, anything # that doesn't match "right" will be treated as "left" # # Results: # # Will return the column identifier of the nearest resizable # column, or an empty string if none exists. proc ::mclistbox::FindResizableNeighbor {w id {direction right}} { upvar ::mclistbox::${w}::widgets widgets upvar ::mclistbox::${w}::options options upvar ::mclistbox::${w}::misc misc if {$direction == "right"} { set incr 1 set stop [llength $misc(columns)] set start [expr {[lsearch -exact $misc(columns) $id] + 1}] } else { set incr -1 set stop -1 set start [expr {[lsearch -exact $misc(columns) $id] - 1}] } for {set i $start} {$i != $stop} {incr i $incr} { set col [lindex $misc(columns) $i] if {![ColumnIsHidden $w $col] && $options($col:-resizable)} { return $col } } return "" } # ::mclistbox::ResizeEvent -- # # Handles the events which implement interactive column resizing # using the mouse. # # Arguments: # # w widget pathname # type type of event; must be one of "buttonpress", "drag", # "motion", or "buttonrelease" # widget the actual widget that the event occured over # x the x coordinate of the mouse, relative to $widget # X the root x coordinate of the mouse # Y the root y coordinate of the mouse # # The basic idea is this: # # whenever the cursor moves over the label, we examine it's x # coordinate to determine if its within a fixed amount of # pixels from the left or right edge. If it is, we reconfigure # the cursor to be a suitable "this thing is resizable" cursor. # # On a buttonclick, if the cursor is not the default cursor # (and thus, presumably the resize cursor), we set up some # state for an eventual resize. We figure out which columns # are to the left and right and base a maximum resize amount # for each direction. We also define the absolute X coordinate # of the buttonpress as a reference point for the drag. # # on a b1-motion, if the drag state exists, we look at the # absolute X value and use it to compute a delta value from # the reference (the X of the button press). We then resize the # left and right column frames by the delta amount. # # on a button release, we unset the state and the cursor, which # cancels all of the above. proc ::mclistbox::ResizeEvent {w type widget x X Y} { upvar ::mclistbox::${w}::widgets widgets upvar ::mclistbox::${w}::options options upvar ::mclistbox::${w}::misc misc upvar ::mclistbox::${w}::columnID columnID # if the widget doesn't allow resizable cursors, there's # nothing here to do... if {!$options(-resizablecolumns)} { return } # this lets us keep track of some internal state while # the user is dragging the mouse variable drag # this lets us define a small window around the edges of # the column. set threshold [expr {[winfo pixels $w $options(-labelborderwidth)] + 4}] # this is what we use for the "this is resizable" cursor set resizeCursor sb_h_double_arrow # if we aren't over an area that we care about, bail. if {![info exists columnID($widget)]} { return } # id refers to the column name set id $columnID($widget) switch -- $type { buttonpress { # we will do all the work of initiating a drag only if # the cursor is not the defined cursor. In theory this # will only be the case if the mouse moves over the area # in which a drag can happen. if {[$widgets(label$id) cget -cursor] == $resizeCursor} { if {$x <= $threshold} { set lid [::mclistbox::FindResizableNeighbor $w $id left] if {$lid == ""} return set drag(leftFrame) $widgets(frame$lid) set drag(rightFrame) $widgets(frame$id) set drag(leftListbox) $widgets(listbox$lid) set drag(rightListbox) $widgets(listbox$id) set rrid [lsearch -exact $misc(columns) $id] } else { set rid [::mclistbox::FindResizableNeighbor $w $id right] if {$rid == ""} return set drag(leftFrame) $widgets(frame$id) set drag(rightFrame) $widgets(frame$rid) set drag(leftListbox) $widgets(listbox$id) set drag(rightListbox) $widgets(listbox$rid) set rrid [lsearch -exact $misc(columns) $rid] } if {$options(-resizeonecolumn)} { for {set lastid [expr [llength $misc(columns)] - 1]} \ {$lastid >= $rrid} {incr $lastid -1} { set col [lindex $misc(columns) $lastid] if {![ColumnIsHidden $w $col] && $options($col:-resizable)} { break } } set drag(rightFrame) $widgets(frame$col) set drag(rightListbox) $widgets(listbox$col) } set drag(leftWidth) [winfo width $drag(leftFrame)] set drag(rightWidth) [winfo width $drag(rightFrame)] # it seems to be a fact that windows can never be # less than one pixel wide. So subtract that one pixel # from our max deltas... set drag(maxDelta) [expr {$drag(rightWidth) - 1}] set drag(minDelta) -[expr {$drag(leftWidth) - 1}] set drag(x) $X } } motion { if {[info exists drag(x)]} {return} # this is just waaaaay too much work for a motion # event, IMO. set resizable 0 # is the column the user is over resizable? if {!$options($id:-resizable)} {return} # did the user click on the left of a column? if {$x < $threshold} { set leftColumn [::mclistbox::FindResizableNeighbor $w $id left] if {$leftColumn != ""} { set resizable 1 } } elseif {$x > [winfo width $widget] - $threshold} { set rightColumn [::mclistbox::FindResizableNeighbor $w $id \ right] if {$rightColumn != ""} { set resizable 1 } } # if it's resizable, change the cursor set cursor [$widgets(label$id) cget -cursor] if {$resizable && $cursor != $resizeCursor} { $widgets(label$id) configure -cursor $resizeCursor $widgets(label$id) configure \ -background $options(-labelbackground) \ -foreground $options(-labelforeground) } elseif {!$resizable} { $widgets(label$id) configure \ -background $options(-labelactivebackground) \ -foreground $options(-labelactiveforeground) if {$cursor == $resizeCursor} { $widgets(label$id) configure -cursor $options(-cursor) } } } leave { $widgets(label$id) configure \ -background $options(-labelbackground) \ -foreground $options(-labelforeground) } drag { # if the state is set up, do the drag... if {[info exists drag(x)]} { if {$options(-resizeonecolumn)} { set delta [expr {$X - $drag(x)}] if {$delta <= $drag(minDelta)} { set delta $drag(minDelta) } set lwidth [expr {$drag(leftWidth) + $delta}] set rwidth [expr {$drag(rightWidth) - $delta}] $drag(leftFrame) configure -width $lwidth if {$misc(min-$drag(rightFrame)) < $rwidth} { $drag(rightFrame) configure -width $rwidth } set misc(min-$drag(leftFrame)) $lwidth AdjustColumns $w } else { set delta [expr {$X - $drag(x)}] if {$delta >= $drag(maxDelta)} { set delta $drag(maxDelta) } elseif {$delta <= $drag(minDelta)} { set delta $drag(minDelta) } set lwidth [expr {$drag(leftWidth) + $delta}] set rwidth [expr {$drag(rightWidth) - $delta}] $drag(leftFrame) configure -width $lwidth $drag(rightFrame) configure -width $rwidth } } } buttonrelease { set fillColumnID $options(-fillcolumn) if {[info exists drag(x)] && $fillColumnID != {}} { set fillColumnFrame $widgets(frame$fillColumnID) if {[string equal $drag(leftFrame) $fillColumnFrame] \ || [string equal $drag(rightFrame) $fillColumnFrame]} { set width [$fillColumnFrame cget -width] set misc(minFillColumnSize) $width } set misc(min-$drag(leftFrame)) [$drag(leftFrame) cget -width] if {!$options(-resizeonecolumn)} { set misc(min-$drag(rightFrame)) \ [$drag(rightFrame) cget -width] } } # reset the state and the cursor catch {unset drag} $widgets(label$id) configure -cursor $options(-cursor) } } } # HACK: listbox doesn't have any padding for it items, so text in the adjasent # columns looks too close, therefore we add spaces at both sides proc ::mclistbox::Untrim {str} { return " $str " } proc ::mclistbox::Trim {str} { string range $str 1 end-1 } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/tkabber-remote.tcl000075500000000000000000000047121477701321300154670ustar00nobodynobody#!/bin/sh # the next line restarts using the correct interpreter \ exec tclsh "$0" "$@" # tkabber-remote.tcl -- # # This file is a part of the Tkabber XMPP client. It's a runnable # script which executes commands at remote Tkabber instances. # It utilizes the plugins/general/comm plugin at the remote side. package require cmdline package require comm set options { {user.arg "" "Control Tkabber run by a specified user,\ default is the current user"} {pid.arg 0 "Control Tkabber with a specified pid,\ default is all PIDs"} {eval.secret "Evaluate arguments as a script"} {command.secret "Evaluate arguments as a command"} } set usage ":\ntkabber-remote ?options? -eval script\ ...\ntkabber-remote ?options? -command command ?arg?\ ...\noptions:" if {[catch { array set params [::cmdline::getoptions argv $options $usage] } msg]} { puts stderr $msg exit 1 } switch -- [llength $argv] { 0 { puts stderr [::cmdline::usage $options $usage] puts stderr "example:\n tkabber-remote -command list-commands" exit 1 } default {} } if {$params(eval) + $params(command) != 1} { puts stderr [::cmdline::usage $options $usage] exit 1 } if {[info exists env(TKABBER_HOME)]} { set configdir $env(TKABBER_HOME) } else { # TODO: make this work for non-UNIX platform if {[catch {file home}]} { set configdir [file join ~$params(user) .tkabber] } else { set configdir [file join [file tildeexpand ~$params(user)] .tkabber] } } if {$params(pid) != 0} { set files [list [file join $configdir comm.$params(pid)]] } else { set files [glob -nocomplain -directory $configdir comm.*] } ::comm::comm hook connected { global cookie puts $fid $cookie } set status 0 foreach file $files { set fd [open $file] set id_cookie [read $fd] close $fd set id [lindex $id_cookie 0] set cookie [lindex $id_cookie 1] if {$params(eval)} { set command ::plugins::comm::eval_script } else { set command ::plugins::comm::eval_command } set s [catch {::comm::comm send $id $command [list $argv]} res] if {$s != 0} { set res [list $s $res] } set status1 [lindex $res 0] if {$status1 > $status} { set status $status1 } puts "PID [string range [file extension $file] 1 end]" puts [lindex $res 1] } exit $status # vim:ts=8:sw=4:sts=4:et tkabber/tkabber.tcl000075500000000000000000000214041477701321300141730ustar00nobodynobody#!/bin/sh # the next line restarts using the correct interpreter \ exec wish "$0" -name tkabber "$@" # tkabber.tcl -- # # This file is a part of the Tkabber XMPP client. It's a main file. package require Tk 8.5- wm withdraw . set interface tk namespace eval ifacetk {} foreach {opt val} $argv { switch -- $opt/$val { -interface/ttk { set interface ttk } } } set aquaP 0 catch { switch -- [tk windowingsystem] { classic - aqua { set aquaP 1 set tk_modify Cmd set tk_close Cmd-W rename ::bind ::bind_orig proc ::bind {args} { if {[llength $args] < 2} { return [eval ::bind_orig $args] } if {[string first "= 0} { if {[regexp {(\d\d\d\d)-(\d\d)-(\d\d)} $line -> year month day]} { set snapshot "-$year$month$day" break } } close $fd return $snapshot } set tkabber_version "1.1.2[get_vcs][get_snapshot [fullpath ChangeLog]]" set toolkit_version "Tcl/Tk [info patchlevel]" proc quit {{status 0}} { hook::run quit_hook catch { bind $::ifacetk::mf {} } destroy . exit $status } namespace eval ifacetk {} namespace eval ssj {} load_source hooks.tcl # Give the starkit a chance to initialize things before # the bulk of the Tkabber code is loaded: if {[info commands starkit_init] != ""} starkit_init hook::add quit_hook logout 10 hook::add quit_hook { foreach chan [file channels] { if {[string first sock $chan] != -1} { catch { close $chan } res debugmsg tkabber "closed $chan '$res'" } } } 100 load_source default.tcl hook::add postload_hook postload hook::add finload_hook finload package require BWidget if {[info exists env(TKABBER_SITE_CONFIG)] && \ [file exists $env(TKABBER_SITE_CONFIG)]} { source $env(TKABBER_SITE_CONFIG) } if {[file exists [file join $configdir config.tcl]]} { source [file join $configdir config.tcl] } # Determine if the theme is light or dark, and also # fix the default foreground color if {$interface eq "ttk"} { # If a ttk theme has been applied in the config file # the actual theme will be changed only after crating # some ttk widget, so do that here (otherwise the # default text background and foreground will be # always white and black. ttk::button .tmpb update idletasks destroy .tmpb } set t [text .tmpt] set defaultforeground [$t cget -foreground] set defaultbackground [$t cget -background] lassign [winfo rgb $t $defaultforeground] r g b set meanfg [expr {($r+$g+$b)/3}] lassign [winfo rgb $t $defaultbackground] r g b set meanbg [expr {($r+$g+$b)/3}] if {$meanfg > $meanbg} { set darktheme 1 } else { set darktheme 0 } destroy $t # tk_scale: config variable to scale widgets # tk_scale is taken from env(GDK_SCALE) if the latter # is available # type: real > 0 if {![info exists tk_scale]} { if {[info exists env(GDK_SCALE)] && \ [string is integer -strict $env(GDK_SCALE)]} { set tk_scale $env(GDK_SCALE) } else { set tk_scale 1 } } tk scaling [expr {$tk_scale * [tk scaling]}] # icons_scale: config variable to scale the default icons # (icons 16x16). If it's not set in the config file, # heuristically compute it given that icons 16x16 are to # be used with 96 DPI # type: integer >= 1 if {![info exists icons_scale]} { set icons_scale [expr {([tk scaling]*72 + 32) / 96}] } set icons_scale [expr {int($icons_scale)}] if {$icons_scale<1} { set icons_scale 1 } proc create_image {image args} { if {[dict exists $args -scale]} { set scale [dict get $args -scale] set args [dict remove $args -scale] } else { set scale $::icons_scale } if {$scale > 1} { set zoom [list -zoom $scale $scale] } else { set zoom {} } image create photo __tmp {*}$args image create photo $image $image copy __tmp {*}$zoom return $image } if {$interface eq "ttk"} { Widget::theme 1 set load_default_xrdb 0 } option readfile [fullpath $interface default.xrdb] 21 if {![info exists load_default_xrdb] || $load_default_xrdb} { switch -- $tcl_platform(platform) { unix { source [fullpath ifacetk unix.tcl] } } } load_source trans.tcl ::trans::load [file join $rootdir trans] ::msgcat::mcload [file join $rootdir msgs] foreach pr [::msgcat::mcpreferences] { set f [file join $::BWIDGET::LIBRARY lang $pr.rc] if {[file exists $f]} { option readfile $f break } } foreach pr [::msgcat::mcpreferences] { set f [file join $rootdir msgs $pr.rc] if {[file exists $f]} { option readfile $f break } } unset pr f package require xmpp 0.3 package require xmpp::delay load_source xmppmime.tcl foreach {opt val} $argv { switch -- $opt { -mime {set mime_file $val} -user {set loginconf(user) $val} -password {set loginconf(password) $val} -resource {set loginconf(resource) $val} -port {set loginconf(port) $val} -autologin {set autologin $val} -chat {xmppmime::send_event [list chat $val]} -message {xmppmime::send_event [list message $val]} -conference {xmppmime::send_event [list groupchat $val]} -splash {set show_splash_window $val} } } if {[info exists mime_file]} { xmppmime::load $mime_file } if {[xmppmime::is_done]} exit load_source $interface bwidget.tcl load_source splash.tcl if {[catch { package require Img }]} { if {[catch { package require tkpng }]} { set msg "Unable to load the Img or tkpng package, so no PNG/JPEG image support!" } else { set msg "Unable to load the Img package, so no JPEG image support!" } debugmsg tkabber "$msg The IMG package is available at https://tkimg.sourceforge.net/" } load_source idna.tcl load_source namespaces.tcl load_source ifacetk default.tcl load_source custom.tcl load_source utils.tcl load_source plugins.tcl load_source pixmaps.tcl load_source balloon.tcl load_source presence.tcl load_source iq.tcl load_source disco.tcl load_source roster.tcl load_source messages.tcl load_source chats.tcl load_source muc.tcl load_source login.tcl load_source proxy.tcl load_source userinfo.tcl load_source datagathering.tcl load_source $interface mclistbox.tcl load_source search.tcl load_source register.tcl load_source si.tcl load_source filetransfer.tcl load_source privacy.tcl load_source pubsub.tcl load_source pep.tcl load_source richtext.tcl load_source ifacetk iface.tcl plugins::load [file join plugins general] plugins::load [file join plugins roster] plugins::load [file join plugins search] plugins::load [file join plugins richtext] plugins::load [file join plugins pep] plugins::load [file join plugins $tcl_platform(platform)] if {[info exists env(TKABBER_SITE_PLUGINS)]} { plugins::load_dir $env(TKABBER_SITE_PLUGINS) } plugins::load_dir [file join $configdir plugins] hook::run postload_hook load_source iface.tcl hook::run finload_hook # vim:ts=8:sw=4:sts=4:et tkabber/trans.tcl000064400000000000000000000037241477701321300137120ustar00nobodynobody# trans.tcl -- # # This file is a part of the Tkabber XMPP client. It implements message # translations in a way similar to the msgcat package, but these # messages are intended to be sent to the other XMPP users, so we have # have to load them for all languages simultaneously. namespace eval ::trans { variable trans array set trans {} } # Load message file. It must be in UTF-8 encoding. proc ::trans::loadfile {filepath} { set fd [open $filepath "r"] fconfigure $fd -encoding utf-8 uplevel #0 [read $fd] close $fd } # Load all message files in the directory. proc ::trans::load {dirpath} { foreach filepath [glob -nocomplain -directory $dirpath *.msg] { loadfile $filepath } } # Set translated message. proc ::trans::trset {lang msgfrom {msgto ""}} { variable trans if {$msgto != ""} { set trans($lang,$msgfrom) $msgto } } # ::trans::trans lang msg # ::trans::trans msg # Translate message 'msg' to language 'lang'. If there is only one # argument (no lang), then return unchanged message. proc ::trans::trans {args} { switch -- [llength $args] { 0 { return -code error "::trans::trans: Too few arguments" } 1 { # Dummy call for searching translations in the source. return [lindex $args 0] } 2 { lassign $args lang msg variable trans set langlist [split [string tolower $lang] -] set shortlang [lindex $langlist 0] set longlang [join $langlist _] if {[info exists trans($longlang,$msg)]} { return $trans($longlang,$msg) } elseif {[info exists trans($shortlang,$msg)]} { return $trans($shortlang,$msg) } else { return $msg } } default { return -code error "::trans::trans: Too many arguments" } } } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/trans000075500000000000000000000000001477701321300131215ustar00nobodynobodytkabber/trans/ca.msg000064400000000000000000000004631477701321300142760ustar00nobodynobody# ca.msg -- # # Catalan messages for replying to other client queries. # # Author: Luis Peralta # Revised by: Carles Bellver ::trans::trset ca "This message is encrypted." "Aquest missatge està\ xifrat." # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/trans/de.msg000064400000000000000000000073531477701321300143100ustar00nobodynobody# de.msg -- # # German messages for replying to other client queries. # # Author: Roger Sondermann # Last-Modified: 08.09.2007 # .../muc.tcl ::trans::trset de "Current rooms" "Derzeitige Räume" # .../plugins/filetransfer/http.tcl ::trans::trset de "File not found" "Datei nicht gefunden" # .../plugins/filetransfer/jidlink.tcl ::trans::trset de "File transfer is refused" "Datei-Übertragung verweigert" # .../plugins/filetransfer/si.tcl ::trans::trset de "Stream ID is in use" "'Stream'-ID wird benutzt" # .../plugins/general/gpgme.tcl ::trans::trset de "This message is encrypted." "Diese Nachricht ist\ verschlüsselt." # .../plugins/general/remote.tcl ::trans::trset de "%s at %s" "%s an %s" ::trans::trset de "%s: %s chat message(s)" "%s: %s Chat-Nachricht(en)" ::trans::trset de "%s: %s groupchat message(s)" \ "%s: %s Konferenz-Nachricht(en)" ::trans::trset de "%s: %s headline message(s)" \ "%s: %s Kopfzeilen-Nachricht(en)" ::trans::trset de "%s: %s normal message(s)" "%s: %s normale Nachricht(en)" ::trans::trset de "%s: %s unknown message(s)" "%s: %s unbekannte Nachricht(en)" ::trans::trset de "Available" "Anwesend" ::trans::trset de "Away" "Abwesend" ::trans::trset de "Change Status" "Status ändern" ::trans::trset de "Change status" "Status ändern" ::trans::trset de "Choose chats or groupchats from which you want to forward\ messages" "Chats oder Konferenzen auswählen, von denen weitergeleitet\ werden soll" ::trans::trset de "Choose groupchats you want to leave" \ "Zu verlassene Konferenzen auswählen" ::trans::trset de "Choose status, priority, and status message" \ "Priorität, Status und Status-Nachricht auswählen" ::trans::trset de "Do not disturb" "Bitte nicht stören" ::trans::trset de "Extended away" "Länger abwesend" ::trans::trset de "Forward all messages" "Alle Nachrichten weiterleiten" ::trans::trset de "Forward messages from" "Nachrichten weiterleiten von" ::trans::trset de "Forward Unread Messages" \ "Ungelesene Nachrichten weiterleiten" ::trans::trset de "Forward unread messages" \ "Ungelesene Nachrichten weiterleiten" ::trans::trset de "Free to chat" "Frei zum Chatten" ::trans::trset de "Groupchats" "Konferenzen" ::trans::trset de "Groupchats were left successfully" \ "Konferenzen wurden erfolgreich verlassen" ::trans::trset de "Leave Groupchats" "Konferenzen verlassen" ::trans::trset de "Leave groupchats" "Konferenzen verlassen" ::trans::trset de "Leave all groupchats" "Alle Konferenzen verlassen" ::trans::trset de "Message" "Nachricht" ::trans::trset de "No groupchats to leave" "Keine Konferenzen zu verlassen" ::trans::trset de "Priority" "Priorität" ::trans::trset de "Reason" "Grund" ::trans::trset de "Remote control" "Fernsteuerung" ::trans::trset de "Status" "Status" ::trans::trset de "Status was changed successfully" \ "Status wurde erfolgreich geändert" ::trans::trset de "There are no unread messages" \ "Keine ungelesenen Nachrichten vorhanden" ::trans::trset de "Unavailable" "Nicht verfügbar" ::trans::trset de "Unread messages were forwarded successfully" \ "Ungelesene Nachrichten wurden erfolgreich weitergeleitet" # .../plugins/si/iqibb.tcl ::trans::trset de "Cannot decode received data" \ "Empfangene Daten können nicht dekodiert werden" ::trans::trset de "File transfer is aborted" "Datei-Übertragung abgebrochen" ::trans::trset de "Stream ID has not been negotiated" \ "'Stream'-ID ist nicht verhandelt worden" ::trans::trset de "Unexpected packet sequence number" \ "Unerwartete Paket-Sequenz-Nummer" # .../plugins/si/socks5.tcl ::trans::trset de "Cannot connect to any of the streamhosts" \ "Verbindung zu jedem der 'Streamhosts' misslungen" # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/trans/eo.msg000064400000000000000000000004211477701321300143100ustar00nobodynobody# eo.msg -- # # Esperanto messages for replying to other client queries. # # Author: Mike Mintz ::trans::trset eo "This message is encrypted." "Tiu ĉi mesaÄo estas\ ĉifrita." # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/trans/es.msg000064400000000000000000000065641477701321300143320ustar00nobodynobody# es.msg -- # # Spanish messages for replying to other client queries. # # Author: Badlop ::trans::trset es "%s at %s" "%s en %s" ::trans::trset es "%s: %s chat message(s)" "%s: %s mensajes de charla" ::trans::trset es "%s: %s groupchat message(s)" \ "%s: %s mensajes de salas de charla" ::trans::trset es "%s: %s headline message(s)" "%s: %s titulares" ::trans::trset es "%s: %s normal message(s)" "%s: %s mensajes normales" ::trans::trset es "%s: %s unknown message(s)" "%s: %s mensajes desconocidos" ::trans::trset es "Available" "Disponible" ::trans::trset es "Away" "Ausente" ::trans::trset es "Cannot connect to any of the streamhosts" \ "No se puede conectar a ninguno de las máquinas" ::trans::trset es "Cannot decode received data" \ "No se puede decodificar los datos recibidos" ::trans::trset es "Change Status" "Cambiar Estado" ::trans::trset es "Change status" "Cambiar estado" ::trans::trset es "Choose chats or groupchats from which you want to forward\ messages" "Escoge de qué charlas o salas de charla quieres" ::trans::trset es "Choose groupchats you want to leave" \ "Escoge de qué salas de charla quieres salir" ::trans::trset es "Choose status, priority, and status message" \ "Escoge estado, prioridad y mensaje de estado" ::trans::trset es "Current rooms" "Salas actuales" ::trans::trset es "Do not disturb" "No molestar" ::trans::trset es "Extended away" "Muy ausente" ::trans::trset es "File not found" "Fichero no encontrado" ::trans::trset es "File transfer is aborted" \ "Transferencia de ficheros abortada" ::trans::trset es "File transfer is refused" \ "Transferencia de fichero rechazada" ::trans::trset es "Forward Unread Messages" "Redirigir mensajes no leídos" ::trans::trset es "Forward all messages" "Redirigir todos los mensajes" ::trans::trset es "Forward messages from" "Redirigir mensajes de" ::trans::trset es "Forward unread messages" "Redirigir mensajes no leídos" ::trans::trset es "Free to chat" "Disponible para charlar" ::trans::trset es "Groupchats were left successfully" \ "Has salido correctamente de las salas de charla" ::trans::trset es "Groupchats" "Salas de charla" ::trans::trset es "Leave Groupchats" "Salir de las salas de charla" ::trans::trset es "Leave all groupchats" "Salir de todas las salas de charla" ::trans::trset es "Leave groupchats" "Salir de las salas de charla" ::trans::trset es "Message" "Mensaje" ::trans::trset es "No groupchats to leave" "No estás en ninguna sala de charla" ::trans::trset es "Priority" "Prioridad" ::trans::trset es "Reason" "Razón" ::trans::trset es "Remote control" "Control remoto" ::trans::trset es "Status was changed successfully" \ "El estado se cambió correctamente" ::trans::trset es "Status" "Estado" ::trans::trset es "Stream ID has not been negotiated" \ "Stream ID no ha sido negociado" ::trans::trset es "Stream ID is in use" "Stream ID está en uso" ::trans::trset es "There are no unread messages" "No hay mensajes sin leer" ::trans::trset es "This message is encrypted." "Este mensaje está cifrado." ::trans::trset es "Unavailable" "Desconectado" ::trans::trset es "Unexpected packet sequence number" \ "Número de secuencia de paquete no esperado" ::trans::trset es "Unread messages were forwarded successfully" \ "Los mensajes sin leer fueron redireccionados correctamente" # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/trans/eu.msg000064400000000000000000000005111477701321300143160ustar00nobodynobody# eu.msg -- # # Basque messages for replying to other client queries. # # Author: Euskalerria.org # http://www.euskalerria.org/jalgitalki # JID: jalgitalki@jalgitalki.euskalerria.org ::trans::trset eu "This message is encrypted." "Mezu hau enkriptatuta dago." # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/trans/fr.msg000064400000000000000000000003521477701321300143170ustar00nobodynobody# fr.msg -- # # French messages for replying to other client queries. # # Author: Vincent Ricard ::trans::trset fr "This message is encrypted." "Ce message est crypté." # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/trans/nl.msg000064400000000000000000000003741477701321300143250ustar00nobodynobody# nl.msg -- # # Dutch messages for replying to other client queries. # # Author: Sander Devrieze ::trans::trset nl "This message is encrypted." "Dit bericht is versleuteld." # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/trans/pl.msg000064400000000000000000000077441477701321300143370ustar00nobodynobody# pl.msg -- # # Polish messages for replying to other client queries. # # Author: Irek Chmielowiec # plugins/general/gpgme.tcl ::trans::trset pl "This message is encrypted." "Ta wiadomość jest\ zaszyfrowana." # plugins/general/remote.tcl ::trans::trset pl "Change status" "ZmieÅ„ status" ::trans::trset pl "Change Status" "Zmiana statusu" ::trans::trset pl "Choose chats or groupchats from which you want to forward\ messages" "Wybierz rozmowy i konferencje" ::trans::trset pl "Choose groupchats you want to leave" \ "Wybierz rozmowy i konferencje, które chcesz zamknąć" ::trans::trset pl "Choose status, priority, and status message" \ "Wybierz status, priorytet i opis statusu" ::trans::trset pl "Forward all messages" "Przekaż wszystkie wiadomoÅ›ci" ::trans::trset pl "Forward messages from" "Przekaż wiadomoÅ›ci od" ::trans::trset pl "Forward unread messages" "Przekaż nieprzeczytane widomoÅ›ci" ::trans::trset pl "Forward Unread Messages" \ "Przekazywanie nieprzeczytanych wiadomoÅ›ci" ::trans::trset pl "Groupchats" "Konferencje" ::trans::trset pl "Groupchats were left successfully" \ "Konferencje zostaÅ‚y pomyÅ›lnie zamkniÄ™te" ::trans::trset pl "Leave all groupchats" "Zamknij wszystkie konferencje" ::trans::trset pl "Leave groupchats" "Zamknij konferencje" ::trans::trset pl "Leave Groupchats" "ZamkniÄ™cie konferencji" ::trans::trset pl "Message" "Opis statusu" ::trans::trset pl "No groupchats to leave" "Brak konferencji do zamkniÄ™cia" ::trans::trset pl "Priority" "Priorytet" ::trans::trset pl "Reason" "Powód" ::trans::trset pl "Remote control" "Zdalne sterowanie" ::trans::trset pl "%s at %s" "%s w %s" ::trans::trset pl "%s (%s)" ::trans::trset pl "%s: %s chat message(s)" "%s: %s wiadomość(i) w rozmowie" ::trans::trset pl "%s: %s groupchat message(s)" \ "%s: %s wiadomość(i) w konferencji" ::trans::trset pl "%s: %s headline message(s)" "%s: %s nagłówek(ów) widomoÅ›ci" ::trans::trset pl "%s: %s normal message(s)" "%s: %s zwykÅ‚a(e) wiadomość(i)" ::trans::trset pl "%s: %s unknown message(s)" \ "%s: %s wiadomość(i) nieznana(ych)" ::trans::trset pl "Status" "Status" ::trans::trset pl "Status was changed successfully" \ "Status zostaÅ‚ pomyÅ›lnie zmieniony" ::trans::trset pl "There are no unread messages" \ "Brak nieprzeczytanych wiadomoÅ›ci" ::trans::trset pl "Unread messages were forwarded successfully" \ "Nieprzeczytane wiadomoÅ›ci zostaÅ‚y pomyÅ›lnie przekazane" ::trans::trset pl "Available" "DostÄ™pny" ::trans::trset pl "Free to chat" "ChÄ™tny do rozmowy" ::trans::trset pl "Away" "Zaraz wracam" ::trans::trset pl "Extended away" "Nieobecny" ::trans::trset pl "Do not disturb" "Nie przeszkadzać" ::trans::trset pl "Unavailable" "Rozłączony" # muc.tcl ::trans::trset pl "Current rooms" "Aktywne konferencje" # plugins/si/socks5.tcl ::trans::trset pl "Stream ID has not been negotiated" \ "ID strumienia danych nie zostaÅ‚o wynegocjowane" # plugins/si/iqibb.tcl ::trans::trset pl "Cannot decode received data" \ "Nie można zdekodować odebranych danych" ::trans::trset pl "File transfer is aborted" \ "Transmisja pliku zostaÅ‚a przerwana" ::trans::trset pl "Unexpected packet sequence number" \ "Nieoczekiwany numer sekwencyjny pakietu" # plugins/filetransfer/si.tcl ::trans::trset pl "File transfer is refused" "Odmówiono transmisji pliku" ::trans::trset pl "Stream ID is in use" "ID strumienia jest w użyciu" # plugins/filetransfer/http.tcl ::trans::trset pl "File not found" "Nie znaleziono pliku" # plugins/filetransfer/jidlink.tcl ::trans::trset pl "File transfer is failed" "Transmisja pliku nie udaÅ‚a siÄ™" ::trans::trset pl "Invalid file ID" "NieprawidÅ‚owe ID pliku" ::trans::trset pl "Transfer is expired" "Transmisja pliku przedawniÅ‚a siÄ™" # plugins/si/socks5.tcl ::trans::trset pl "Cannot connect to any of the streamhosts" \ "Nie udaÅ‚o siÄ™ połączyć z żadnym poÅ›rednikiem strumienia danych" # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/trans/pt.msg000064400000000000000000000003551477701321300143360ustar00nobodynobody# pt.msg -- # # Portuguese messages for replying to other client queries. # # Author: Miguel ::trans::trset pt "This message is encrypted." "Esta mensagem está cifrada." # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/trans/ro.msg000064400000000000000000000003571477701321300143350ustar00nobodynobody# ro.msg -- # # Romanian messages for replying to other client queries. # # Author: Adrian Rapa (e-mail & JID: adrian@dtedu.net) ::trans::trset ro "This message is encrypted." "Acest mesaj e codat." # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/trans/ru.msg000064400000000000000000000104501477701321300143360ustar00nobodynobody# ru.msg -- # # Russian messages for replying to other client queries. # # Author: Sergei Golovan ::trans::trset ru "Cannot connect to any of the streamhosts" \ "Ðе удалоÑÑŒ подключитьÑÑ Ð½Ð¸ к одному из предложенных иÑточников" ::trans::trset ru "Cannot decode received data" \ "Ðе удалоÑÑŒ декодировать полученные данные" ::trans::trset ru "Change status" "Изменить ÑтатуÑ" ::trans::trset ru "Change Status" "Изменение ÑтатуÑа" ::trans::trset ru "Choose chats or groupchats from which you want to forward\ messages" "Выберите, из каких разговоров или конференций Ð’Ñ‹ хотите\ переÑлать ÑообщениÑ" ::trans::trset ru "Choose groupchats you want to leave" \ "Выберите конференции, из которых Ð’Ñ‹ хотите выйти" ::trans::trset ru "Choose status, priority, and status message" \ "Выберите ÑтатуÑ, приоритет и ÑтатуÑное Ñообщение" ::trans::trset ru "File not found" "Файл не найден" ::trans::trset ru "Forward all messages" "ПереÑлать вÑе ÑообщениÑ" ::trans::trset ru "Forward messages from" "ПереÑлать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸Ð·" ::trans::trset ru "File transfer is aborted" "Передача файла прервана" ::trans::trset ru "File transfer is refused" "Ð’ передаче файла отказано" ::trans::trset ru "Forward unread messages" "ПереÑлать непрочитанные ÑообщениÑ" ::trans::trset ru "Forward Unread Messages" "ПереÑылка непрочитанных Ñообщений" ::trans::trset ru "Groupchats" "Конференции" ::trans::trset ru "Groupchats were left successfully" \ "Ð’Ñ‹ уÑпешно вышли из конференций" ::trans::trset ru "Leave all groupchats" "Выйти из вÑех конференций" ::trans::trset ru "Leave groupchats" "Выйти из конференций" ::trans::trset ru "Leave Groupchats" "Выход из конференций" ::trans::trset ru "Message" "Сообщение" ::trans::trset ru "No groupchats to leave" \ "Конференций, из которых можно выйти, нет" ::trans::trset ru "Priority" "Приоритет" ::trans::trset ru "Reason" "Причина" ::trans::trset ru "Remote control" "Удалённое управление" ::trans::trset ru "%s at %s" "%s в %s" ::trans::trset ru "%s: %s chat message(s)" "%s: %s Ñообщений в разговоре" ::trans::trset ru "%s: %s groupchat message(s)" \ "%s: %s Ñообщений в конференции" ::trans::trset ru "%s: %s headline message(s)" "%s: %s новоÑтей" ::trans::trset ru "%s: %s normal message(s)" "%s: %s обычных Ñообщений" ::trans::trset ru "%s: %s unknown message(s)" \ "%s: %s Ñообщений неизвеÑтного типа" ::trans::trset ru "Status" "СтатуÑ" ::trans::trset ru "Status was changed successfully" "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½ уÑпешно" ::trans::trset ru "Stream ID has not been negotiated" "ID потока не ÑоглаÑован" ::trans::trset ru "Stream ID is in use" "ID потока уже иÑпользуетÑÑ" ::trans::trset ru "There are no unread messages" "Ðепрочитанных Ñообщений нет" ::trans::trset ru "This message is encrypted." "Это Ñообщение зашифровано." ::trans::trset ru "Unexpected packet sequence number" \ "Ðеожиданный номер поÑледовательноÑти пакетов" ::trans::trset ru "Unread messages were forwarded successfully" \ "Ðепрочитанные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÑланы уÑпешно" ::trans::trset ru "Available" "ДоÑтупен" ::trans::trset ru "Free to chat" "Свободен Ð´Ð»Ñ Ñ€Ð°Ð·Ð³Ð¾Ð²Ð¾Ñ€Ð°" ::trans::trset ru "Away" "Отошёл" ::trans::trset ru "Extended away" "Отошёл давно" ::trans::trset ru "Do not disturb" "Ðе беÑпокоить" ::trans::trset ru "Unavailable" "ÐедоÑтупен" ::trans::trset ru "Current rooms" "Текущие комнаты" # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/trans/uk.msg000064400000000000000000000105371477701321300143350ustar00nobodynobody# uk.msg -- # # Ukrainian messages for replying to other client queries. # # Author: Artem Bondarenko # Updated: Sergei Golovan # Last-Modified: 2015-12-13 ::trans::trset uk "Cannot connect to any of the streamhosts" \ "Ðе вдалоÑÑ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚Ð¸ÑÑ Ð´Ð¾ жодного з наданих джерел" ::trans::trset uk "Cannot decode received data" \ "Ðе вдалоÑÑ Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ñ‚Ð¸ отримані дані" ::trans::trset uk "Change status" "Змінити ÑтатуÑ" ::trans::trset uk "Change Status" "Зміна ÑтатуÑу" ::trans::trset uk "Choose chats or groupchats from which you want to forward\ messages" "Оберіть, з Ñких розмов чи конференцій Ви хочете" ::trans::trset uk "Choose groupchats you want to leave" "Оберіть конференції,\ з котрих Ви хочете вийти" ::trans::trset uk "Choose status, priority, and status message" "Оберіть\ ÑтатуÑ, пріоритет чи ÑтатуÑне повідомленнÑ" ::trans::trset uk "File not found" "Файл не знайдений" ::trans::trset uk "File transfer is aborted" "Передачу файлу перервано" ::trans::trset uk "File transfer is refused" "У передачі файлу відмовлено" ::trans::trset uk "Forward all messages" "ПереÑлати вÑÑ– повідомленнÑ" ::trans::trset uk "Forward messages from" "ПереÑлати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð·" ::trans::trset uk "Forward unread messages" \ "ПереÑлати непрочитані повідомленнÑ" ::trans::trset uk "Forward Unread Messages" \ "ПереÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½ÐµÐ¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ð½Ð¸Ñ… повідомлень" ::trans::trset uk "Groupchats" "Конференції" ::trans::trset uk "Groupchats were left successfully" \ "Ви уÑпішно вийшли з конференції" ::trans::trset uk "Leave all groupchats" "Вийти з уÑÑ–Ñ… конференцій" ::trans::trset uk "Leave groupchats" "Вийти з конференцій" ::trans::trset uk "Leave Groupchats" "Вихід з конференцій" ::trans::trset uk "Message" "ПовідомленнÑ" ::trans::trset uk "No groupchats to leave" \ "Конференцій, з Ñких можна вийти, нема" ::trans::trset uk "Priority" "Пріоритет" ::trans::trset uk "Reason" "Причина" ::trans::trset uk "Remote control" "Віддалене керуваннÑ" ::trans::trset uk "%s at %s" "%s в %s" ::trans::trset uk "%s: %s chat message(s)" "%s: %s повідомлень у розмові" ::trans::trset uk "%s: %s groupchat message(s)" \ "%s: %s повідомлень у конференції" ::trans::trset uk "%s: %s headline message(s)" "%s: %s новин" ::trans::trset uk "%s: %s normal message(s)" "%s: %s звичайних повідомлень" ::trans::trset uk "%s: %s unknown message(s)" \ "%s: %s повідомлень невÑтановленого типу" ::trans::trset uk "Status" "СтатуÑ" ::trans::trset uk "Status was changed successfully" "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð·Ð¼Ñ–Ð½ÐµÐ½Ð¾ уÑпішно" ::trans::trset uk "Stream ID has not been negotiated" "ID потоку не узгоджений" ::trans::trset uk "Stream ID is in use" "ID потоку вже викориÑтовуєтьÑÑ" ::trans::trset uk "There are no unread messages" \ "Ðепрочитаних повідомлень немає" ::trans::trset uk "Unexpected packet sequence number" \ "ÐеÑподіваний номер поÑлідовноÑті пакетів" ::trans::trset uk "Unread messages were forwarded successfully" \ "Ðепрочитані Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÑлані уÑпішно" ::trans::trset uk "Available" "ДоÑтупний" ::trans::trset uk "Free to chat" "Вільний Ð´Ð»Ñ Ñ€Ð¾Ð·Ð¼Ð¾Ð²Ð¸" ::trans::trset uk "Away" "Відійшов" ::trans::trset uk "Extended away" "Давно відійшов" ::trans::trset uk "Do not disturb" "Ðе турбувати" ::trans::trset uk "Unavailable" "ÐедоÑтупний" ::trans::trset uk "Current rooms" "Поточні кімнати" ::trans::trset uk "This message is encrypted." "Це Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð·Ð°ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ðµ." # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/ttk000075500000000000000000000000001477701321300125745ustar00nobodynobodytkabber/ttk/bwidget.tcl000064400000000000000000000417351477701321300150160ustar00nobodynobody# bwidget.tcl -- # # This file is a part of the Tkabber XMPP client. It contains all sorts # of hacks around BWidget bugs or inconveniencies. proc Combobox {path args} { if {[dict exists $args -editable]} { if {![dict get $args -editable]} { dict set args -state readonly } } if {[dict exists $args -command]} { set cmd [dict get $args -command] } if {[dict exists $args -modifycmd]} { set mcmd [dict get $args -modifycmd] } set args [dict remove $args -editable -modifycmd -command] ttk::combobox $path {*}$args if {[info exists cmd]} { bind $path [double% $cmd] } if {[info exists mcmd]} { bind $path <> [double% $mcmd] } return $path } ########################################################################## proc PanedWin {path args} { ttk::panedwindow $path {*}$args } proc PanedWinAdd {path args} { set idx [llength [$path panes]] set f [frame $path.frame$idx] $path add $f {*}$args return $f } proc PanedWinSashXPos {path index args} { if {[llength $args] == 1} { $path sashpos $index [lindex $args 0] } return [$path sashpos $index] } ########################################################################## proc Notebook {args} { set nb [ttk::notebook {*}$args] rename ::$nb ::$nb:cmd interp alias {} ::$nb {} Notebook:cmd $nb bind $nb "rename ::$nb {}" bind $nb <> {Notebook:tab_raised %W} return $nb } proc Notebook:tab_raised {nb} { global Notebook set fr [$nb:cmd select] set name [lindex [split $fr .] end] if {[info exists Notebook(raisecmd:$nb:$name)]} { {*}$Notebook(raisecmd:$nb:$name) } } proc Notebook:cleanup {nb} { global Notebook rename ::$nb {} array unset Notebook raisecmd:$nb:* } proc Notebook:cmd {nb cmd args} { switch -- $cmd { getframe { set name [lindex $args 0] return $nb.$name } raise { if {[llength $args] == 0} { set fr [$nb:cmd select] return [lindex [split $fr .] end] } else { set name [lindex $args 0] $nb:cmd select $nb.$name } } insert { set args [lassign $args pos name] if {[dict exists $args -raisecmd]} { global Notebook set Notebook(raisecmd:$nb:$name) [dict get $args -raisecmd] set args [dict remove $args -raisecmd] } Frame $nb.$name $nb:cmd insert $pos $nb.$name {*}[dict replace $args -padding 2m] return $nb.$name } pages { set res {} foreach fr [$nb:cmd tabs] { lappend res [lindex [split $fr .] end] } return $res } index { # There's a problem with this code. One cannot check if a # page exists with [$nb index page] >= 0. The command crashes. # A workaround: [winfo exists $nb.page] && [$nb index page] >= 0. set name [lindex $args 0] if {[winfo exists $nb.$name]} { set name $nb.$name } return [$nb:cmd index $name] } see { return "" } default { return [$nb:cmd $cmd {*}$args] } } } ########################################################################## proc Spinbox {path from to incr textvar args} { ttk::spinbox $path \ -from $from \ -to $to \ -increment $incr \ -textvariable $textvar \ {*}$args } ########################################################################## auto_load Dialog proc Dialog::frame {path args} { set newargs {} set padding 0 foreach {key val} $args { switch -- $key { -highlightthickness - -background {} -padding { lappend newargs $key $val set padding 1 } default { lappend newargs $key $val } } } if {!$padding} { lappend newargs -padding 0.5m } set f [ttk::frame $path {*}$newargs] rename ::$f ::$f:cmd1 interp alias {} ::$f {} Dialog::frame:cmd $f bind $f "rename ::$f {}" bind $f "+catch {rename ::$f:cmd {}}" return $f } proc Dialog::frame:cmd {f cmd args} { switch [llength $args] { 0 { return [$f:cmd1 $cmd] } 1 { set arg [lindex $args 0] switch -- $arg { -highlightthickness { return 0 } -background { return [ttk::style lookup . -background] } default { return [$f:cmd1 $cmd $arg] } } } default { set newargs {} foreach {key val} $args { switch -- $key { -highlightthickness - -background {} default { lappend newargs $key $val } } } return [$f:cmd1 $cmd {*}$newargs] } } } rename Dialog::create Dialog::create:old proc Dialog::create {path args} { toplevel $path wm withdraw $path set parent [winfo parent $path] destroy $path set spacing 0 set padx 0 set transient 1 set newargs {} foreach {key val} $args { switch -- $key { -parent { set parent $val lappend newargs -parent $val } -transient { set transient $val } -spacing { lappend newargs -spacing [winfo pixels $parent $val] set spacing 1 } -padx { lappend newargs -padx $val set padx 1 } default { lappend newargs $key $val } } } if {!$spacing} { lappend newargs -spacing [winfo pixels $parent 2.5m] } if {!$padx} { lappend newargs -padx [winfo pixels $parent 2.5m] } # Do not make a dialog window transient if its parent isn't vewable. # Otherwise it leads to hang of a whole application. if {$parent == ""} { set parent . } if {![winfo viewable [winfo toplevel $parent]] } { set transient 0 } set res [Dialog::create:old $path -transient $transient {*}$newargs] $path:cmd configure -background [ttk::style configure . -background] return $res } ########################################################################## auto_load ButtonBox rename ButtonBox::create ButtonBox::create:old proc ButtonBox::create {path args} { toplevel $path wm withdraw $path set parent [winfo parent $path] destroy $path set spacing 0 set newargs {} foreach {key val} $args { switch -- $key { -spacing { lappend newargs -spacing [winfo pixels $parent $val] set spacing 1 } default { lappend newargs $key $val } } } if {!$spacing} { lappend newargs -spacing [winfo pixels $parent 2.5m] } ButtonBox::create:old $path {*}$newargs } proc ButtonBox::frame {args} { Dialog::frame {*}$args } ########################################################################## proc tk_optionMenu {w varName firstValue args} { upvar #0 $varName var if {![info exists var]} { set var $firstValue } ttk::menubutton $w -textvariable $varName \ -menu $w.menu \ -direction flush menu $w.menu -tearoff 0 $w.menu add radiobutton -label $firstValue -variable $varName foreach i $args { $w.menu add radiobutton -label $i -variable $varName } return $w.menu } ########################################################################## auto_load MainFrame rename MainFrame::addindicator MainFrame::addindicator:old proc MainFrame::addindicator {path args} { set indic [MainFrame::addindicator:old $path {*}$args] catch { $indic configure -background [ttk::style lookup TFrame -background] } return $indic } ########################################################################## proc Listbox {path args} { if {![dict exists $args -selectmode]} { dict set args -selectmode browse } set args [dict remove $args -exportselection] set args [dict replace $args -show {} \ -columns {list} \ -displaycolumns {list}] ttk::treeview $path {*}$args rename ::$path ::$path:cmd interp alias {} $path {} Listbox:cmd $path bind $path <> [list event generate $path <>] return $path } proc Listbox:cmd {path cmd args} { switch -- $cmd { bbox { lassign $args idx if {[lsearch -exact [$path:cmd children {}] $idx] >= 0} { return [$path:cmd index {*}$args] } if {[regexp {^@(\d+),(\d+)$} $idx -> x y]} { set item [$path:cmd identify item $x $y] if {$item eq ""} { set item [lindex [$path:cmd children {}] end] } return [$path:cmd bbox $item] } else { set item [lindex [$path:cmd children {}] $idx] return [$path:cmd bbox $item] } } curselection { set res {} foreach item [$path:cmd select] { lappend res [$path:cmd index $item] } return $res } delete { lassign $args start end if {$end eq ""} { set end $start } set del [lrange [$path:cmd children {}] $start $end] $path:cmd delete $del } index { lassign $args idx if {[lsearch -exact [$path:cmd children {}] $idx] >= 0} { return [$path:cmd index $idx] } if {[regexp {^@(\d+),(\d+)$} $idx -> x y]} { set item [$path:cmd identify item $x $y] if {$item eq ""} { set item [lindex [$path:cmd children {}] end] } return [$path:cmd index $item] } elseif {$idx eq "end"} { return [llength [$path:cmd children {}]] } else { set item [lindex [$path:cmd children {}] $idx] return [$path:cmd index $item] } } insert { set items [lassign $args idx] foreach item $items { $path:cmd insert {} $idx -values [list $item] set idx [expr {$idx eq "end"? $idx : $idx+1}] } } get { set l 1 lassign $args start end if {$end eq ""} { set end $start set l 0 } set res {} foreach item [lrange [$path:cmd children {}] $start $end] { lappend res [lindex [$path:cmd item $item -values] 0] } if {$l} { return $res } else { return [lindex $res 0] } } nearest { lassign $args y set item [$path:cmd identify item 0 $y] if {$item ne {}} { return [lsearch -exact [$path:cmd children {}] $item] } else { return [expr {[llength [$path:cmd children {}]] - 1}] } } selection { set args [lassign $args subcommand] switch -- $subcommand { clear { lassign $args start end if {$end eq ""} { set end $start } set range [lrange [$path:cmd children {}] $start $end] $path:cmd selection remove $range } includes { lassign $args index set item [lindex [$path:cmd children {}] $index] return [expr {[lsearch -exact \ [$path:cmd selection] $item] >= 0}] } set { lassign $args start end if {![string is integer $start] && $start ne "end"} { return [$path:cmd selection set {*}$args] } if {$end eq ""} { set end $start } set range [lrange [$path:cmd children {}] $start $end] foreach item [$path:cmd selection] { lappend range $item } $path:cmd selection set $range } default { $path:cmd selection $subcommand {*}$args } } } see { lassign $args idx if {![string is integer $idx] && $idx ne "end"} { $path:cmd see $idx } else { $path:cmd see [lindex [$path:cmd children {}] $idx] } } size { return [llength [$path:cmd children {}]] } default { $path:cmd $cmd {*}$args } } } ########################################################################## proc BWidget::bindMouseWheel {widget} {} ########################################################################## proc Message {path args} { set args [dict remove $args -background] message $path {*}$args -background [ttk::style lookup . -background] } ########################################################################## proc Toplevel {path args} { set args [dict remove $args -background] toplevel $path {*}$args -background [ttk::style lookup . -background] } ########################################################################## namespace eval ::ttk { bind Wrapframe { %W#border state focus } bind Wrapframe { %W#border state !focus } } # wraps a plain Tk widget inside a ttk frame proc ::ttk::WrapWidget {class path args} { set bg [ttk::style lookup . -fieldbackground {} white] # handle the args set args [dict replace $args \ -background $bg \ -borderwidth 0 \ -highlightthickness 0] set args [dict remove $args -bg -bd] # real widget set rw $path.$class # create the container frame and the widget frame $path -style TEntry -class Wrapframe ::$class $rw {*}$args bindtags $rw [linsert [bindtags $rw] 0 $path] # rename the container widget cmd and install # a proxy cmd to the real one rename ::$path ::${path}#border interp alias {} $path {} ::ttk::WrapProxy $rw pack $rw -expand 1 -fill both -padx 0.5m -pady 0.5m # adjust the select{fore|back}ground with the theme bind $rw <> [list apply {rw { set sb [ttk::style configure . -selectbackground] set sf [ttk::style configure . -selectforeground] $rw configure -selectbackground $sb $rw configure -selectforeground $sf }} $rw] after idle [list after 0 [list GenThemeChanged $rw]] return $path } proc ::ttk::WrapProxy {w args} { # prevent the border window to take focus if {[lindex $args 0] eq "cget" && [lindex $args 1] eq "-takefocus"} { return 0 } uplevel 1 [linsert $args 0 $w] } proc Wrapped {w} { lindex [winfo children $w] 0 } proc GenThemeChanged {w} { if {[winfo exists $w]} { event generate $w <> } } ########################################################################## interp alias {} Labelframe {} ttk::labelframe interp alias {} Text {} ::ttk::WrapWidget text interp alias {} Canvas {} ::ttk::WrapWidget canvas interp alias {} Frame {} ::ttk::frame interp alias {} Menubutton {} ::ttk::menubutton interp alias {} Progressbar {} ::ttk::progressbar interp alias {} Checkbutton {} ::ttk::checkbutton interp alias {} Radiobutton {} ::ttk::radiobutton interp alias {} Scale {} ::ttk::scale interp alias {} Scrollbar {} ::ttk::scrollbar ########################################################################## proc MyTree {args} { set path [::ttk::treeview {*}$args -show {tree} \ -columns {} \ -displaycolumns {} \ -selectmode browse] bindscroll $path return $path } ########################################################################## proc MenuToolbutton {args} { ttk::menubutton {*}$args -style Toolbutton } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/ttk/default.xrdb000064400000000000000000000003621477701321300151610ustar00nobodynobody! default.xrdb -- ! ! Default resources for the Ttk interface. ! placeholder foreground is new in Tk 9 and it causes ! crashes when ttk is used, so define it here *placeholderForeground: #aaaaaa ! vim:ft=xdefaults:ts=8:sw=4:sts=4:et tkabber/ttk/mclistbox.tcl000064400000000000000000000150521477701321300153660ustar00nobodynobody# mclistbox.tcl -- # # This file is a part of the Tkabber XMPP client. It wraps ttk::treeview # into an interface similar to the Brian Oakley's mclistbox which is # used with plain Tk widgets. Not all mclistbox commands and options # are implemented. namespace eval ::mclistbox {} proc ::mclistbox::mclistbox {path args} { ttk::treeview $path -show {headings} -columns {} -displaycolumns {} bind $path <> {event generate %W <>} rename ::$path ::$path#orig proc ::$path {command args} \ "::mclistbox::WidgetProc $path \$command {*}\$args" return $path } proc ::mclistbox::WidgetProc {path command args} { switch -- $command { column { return [ColumnProc $path {*}$args] } label { return [LabelProc $path {*}$args] } insert { return [InsertProc $path {*}$args] } delete { return [DeleteProc $path {*}$args] } get { return [GetProc $path {*}$args] } find { return [FindProc $path {*}$args] } configure { return [ConfigureProc $path {*}$args] } curselection { return [CurselectionProc $path {*}$args] } sel { return [SelectionProc $path {*}$args] } show { return [ShowProc $path {*}$args] } size { return [SizeProc $path {*}$args] } default { return [$path#orig $command {*}$args] } } } proc ::mclistbox::ConfigureProc {path args} { foreach {key val} $args { switch -- $key { -fillcolumn { $path#orig column $val -stretch 1 -minwidth 0 } -xscrollcommand - -yscrollcommand - -height { $path#orig configure $key $val } } } } proc ::mclistbox::CgetProc {path option} { $path#orig cget $option } proc ::mclistbox::CurselectionProc {path args} { set items [$path#orig children {}] set res {} foreach item [$path#orig selection] { lappend res [lsearch -exact $items $item] } return $res } proc ::mclistbox::SelectionProc {path cmd args} { switch -- $cmd { set { lassign $args start end if {$end eq ""} { set end $start } $path#orig selection set \ [lrange [$path#orig children {}] $start $end] } clear { lassign $args start end if {$end eq ""} { set end $start } $path#orig selection remove \ [lrange [$path#orig children {}] $start $end] } includes { lassign $args index set item [lindex [$path#orig children {}] $index] return [expr {$item in [$path#orig selection]}] } } } proc ::mclistbox::ShowProc {path index} { $path#orig see [lindex [$path#orig children {}] $index] } proc ::mclistbox::SizeProc {path} { llength [$path#orig children {}] } proc ::mclistbox::InsertProc {path index args} { foreach row $args { $path#orig insert {} $index -values $row set index [expr {$index eq "end"? $index : $index + 1}] } } proc ::mclistbox::DeleteProc {path args} { lassign $args start end if {$end eq ""} { set end $start } $path#orig delete [lrange [$path#orig children {}] $start $end] } proc ::mclistbox::GetProc {path args} { set type list lassign $args start end if {$end eq ""} { set type item set end $start } set res {} foreach item [lrange [$path#orig children {}] $start $end] { lappend res [$path#orig item $item -values] } if {$type eq "list"} { return $res } else { return [lindex $res 0] } } proc ::mclistbox::FindProc {path x y} { set item [$path#orig identify item $x $y] if {$item eq ""} { return -1 } else { return [lsearch [$path#orig children {}] $item] } } proc ::mclistbox::ColumnProc {path command args} { switch -- $command { names { return [$path#orig cget -columns] } add { return [ColumnAddProc $path {*}$args] } configure { return [ColumnConfigureProc $path {*}$args] } cget { return [ColumnCgetProc $path {*}$args] } } } proc ::mclistbox::ColumnAddProc {path name args} { set cols [$path#orig cget -columns] # $path configure -columns {list} destroys the columns options, # so, store them and restore after the configure call foreach c $cols { set head($c) [dict remove [$path#orig heading $c] -id] set col($c) [dict remove [$path#orig column $c] -id] } set ncols $cols lappend ncols $name set dcols [$path#orig cget -displaycolumns] if {![dict exists $args -visible] || [dict get $args -visible]} { lappend dcols $name } $path#orig configure -columns $ncols -displaycolumns $dcols foreach c $cols { $path#orig heading $c {*}$head($c) $path#orig column $c {*}$col($c) } $path#orig heading $name -anchor w $path#orig column $name -stretch 0 ColumnConfigureProc $path $name {*}$args } proc ::mclistbox::ColumnConfigureProc {path name args} { foreach {key val} $args { switch -- $key { -label { $path#orig heading $name -text $val } -image - -command { $path#orig heading $name $key $val } -width { set font [ttk::style lookup Treeview -font {} TkDefaultFont] set factor [font measure $font "0"] set width [expr {$val * $factor}] $path#orig column $name -width $width } } } } proc ::mclistbox::ColumnCgetProc {path name option} { switch -- $option { -label { return [$path#orig heading $name -text] } -image - -command { return [$path#orig heading $name $option] } -width { set width [$path#orig column $name -width] set font [ttk::style lookup Treeview -font {} TkDefaultFont] set factor [font measure $font "0"] return [expr {int(ceil($width / $factor))}] } } } proc ::mclistbox::LabelProc {path command args} { return "" } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/userinfo.tcl000064400000000000000000001064231477701321300144150ustar00nobodynobody# userinfo.tcl -- # # This file is a part of the Tkabber XMPP client. It shows # basic user/service info window and provides infrastructure for # registering userinfo tabs. namespace eval userinfo { custom::defvar show_info_list {} \ [::msgcat::mc "List of users for userinfo."] \ -group Hidden } proc userinfo::show_info_dialog {} { variable show_info_jid variable show_info_list variable show_info_xlib if {[llength [connections]] == 0} return set gw .userinfo catch { destroy $gw } set xlib [lindex [connections] 0] set show_info_xlib [connection_jid $xlib] Dialog $gw -title [::msgcat::mc "Show user or service info"] \ -anchor e \ -default 0 \ -cancel 1 set gf [$gw getframe] grid columnconfigure $gf 1 -weight 1 set show_info_jid "" Label $gf.ljid -text [::msgcat::mc "JID:"] Combobox $gf.jid -textvariable [namespace current]::show_info_jid \ -values [linsert $show_info_list 0 ""] \ -width 35 grid $gf.ljid -row 0 -column 0 -sticky e grid $gf.jid -row 0 -column 1 -sticky ew if {[llength [connections]] > 1} { set connections {} foreach c [connections] { lappend connections [connection_jid $c] } Label $gf.lconnection -text [::msgcat::mc "Connection:"] Combobox $gf.connection \ -textvariable [namespace current]::show_info_xlib \ -values $connections grid $gf.lconnection -row 1 -column 0 -sticky e grid $gf.connection -row 1 -column 1 -sticky ew } $gw add -text [::msgcat::mc "Show"] \ -command "[namespace current]::show_info $gw" $gw add -text [::msgcat::mc "Cancel"] -command "destroy $gw" $gw draw $gf.jid } proc userinfo::show_info {gw} { variable show_info_jid variable show_info_list variable show_info_xlib destroy $gw foreach c [connections] { if {[connection_jid $c] == $show_info_xlib} { set xlib $c } } if {![info exists xlib]} { set xlib [lindex [connections] 0] } set show_info_list [update_combo_list $show_info_list $show_info_jid 10] userinfo::open $xlib $show_info_jid } proc userinfo::w_from_jid {jid} { return [win_id userinfo $jid] } proc userinfo::pack_frame {w text} { set tf [Labelframe $w -text $text -padding {2m 2m}] pack $tf -fill both -expand yes -padx 1m -pady 1m return $tf } proc userinfo::pack_entry {jid g row name text} { set w [w_from_jid $jid] Label $g.l$name -text $text upvar editable editable if {!$editable} { if {$::interface eq "ttk"} { set bg [ttk::style lookup TFrame -background] } else { set bg [lindex [$g configure -background] 4] } entry $g.$name -textvariable ::userinfo::userinfo($name,$jid) \ -borderwidth 0 -state readonly -takefocus 0 \ -highlightthickness 0 -readonlybackground $bg } else { if {![info exists ::userinfo::userinfo($name,$jid)]} { set ::userinfo::userinfo($name,$jid) "" } Entry $g.$name -textvariable ::userinfo::userinfo($name,$jid) } grid $g.l$name -row $row -column 0 -padx 0.5m -sticky e grid $g.$name -row $row -column 1 -padx 0.5m -sticky we grid columnconfig $g 1 -weight 1 -minsize 0 #grid rowconfig $g $row -weight 1 -minsize 0 } proc userinfo::pack_text_entry {jid g row name text} { variable userinfo set w [w_from_jid $jid] Label $g.l$name -text $text if {$::interface eq "ttk"} { set bg [ttk::style lookup TFrame -background] } else { set bg [lindex [$g configure -background] 4] } text $g.$name -height 1 -state disabled -borderwidth 0 -takefocus 0 \ -highlightthickness 0 -background $bg ::richtext::config $g.$name -using url fill_user_description $g.$name userinfo($name,$jid) 0 grid $g.l$name -row $row -column 0 -padx 0.5m -sticky e grid $g.$name -row $row -column 1 -padx 0.5m -sticky we grid columnconfig $g 1 -weight 1 -minsize 0 trace add variable [namespace current]::userinfo($name,$jid) write \ [list userinfo::fill_user_description $g.$name userinfo($name,$jid) 0] bind $g.$name \ +[double% [list \ trace remove variable [namespace current]::userinfo($name,$jid) write \ [list userinfo::fill_user_description $g.$name \ userinfo($name,$jid) 0]]] } proc userinfo::pack_spinbox {jid g row col name low high text} { label $g.l$name -text $text if {![info exists ::userinfo::userinfo($name,$jid)]} { set ::userinfo::userinfo($name,$jid) "" } Spinbox $g.$name $low $high 1 ::userinfo::userinfo($name,$jid) grid $g.l$name -row $row -column $col -padx 0.5m -sticky e grid $g.$name -row $row -column [expr {$col + 1}] -padx 0.5m -sticky we } proc userinfo::manage_focus {jid tab w editable} { variable userinfo if {$editable} { upvar $tab t set userinfo(focus_$tab,$jid) $w bind $t \ +[double% \ "focus \$[list [namespace current]::userinfo(focus_$tab,$jid)]"] bind $t \ +[double% \ "set [list [namespace current]::userinfo(focus_$tab,$jid)] \ \[focus\]"] } } proc userinfo::open_client {xlib jid args} { eval [list open $xlib $jid] $args -page client } proc userinfo::open {xlib jid args} { global tcl_platform variable userinfo set w [w_from_jid $jid] if {[winfo exists $w]} { #focus -force $w #return destroy $w } set editable 0 set top_page personal foreach {opt val} $args { switch -- $opt { -editable {set editable $val} -page {set top_page $val} } } if {$xlib == ""} { set xlib [lindex [connections] 0] } Toplevel $w wm withdraw $w wm group $w . set title [::msgcat::mc "%s info" $jid] wm title $w $title wm iconname $w $title if {$editable} { set bbox [ButtonBox $w.bbox -spacing 2m -padx 2m -default 0] $bbox add -text [::msgcat::mc "Update"] -command " userinfo::send_vcard [list $xlib] [list $jid] destroy [list $w] " $bbox add -text [::msgcat::mc "Cancel"] -command [list destroy $w] bind $w [list ButtonBox::invoke [double% $bbox] default] bind $w [list ButtonBox::invoke [double% $bbox] 1] pack $bbox -padx 1m -pady 1m -anchor e -side bottom } Frame $w.frame pack $w.frame -padx 1m -pady 1m -expand yes -fill both set tab [Notebook $w.frame.tab] pack $tab -expand yes -fill both set personal [$tab insert end personal -text [::msgcat::mc "Personal"]] set n [pack_frame $personal.n [::msgcat::mc "Name"]] pack_entry $jid $n 0 fn [::msgcat::mc "Full name:"] pack_entry $jid $n 1 family [::msgcat::mc "Family name:"] pack_entry $jid $n 2 name [::msgcat::mc "First name:"] pack_entry $jid $n 3 middle [::msgcat::mc "Middle name:"] pack_entry $jid $n 4 prefix [::msgcat::mc "Prefix:"] pack_entry $jid $n 5 suffix [::msgcat::mc "Suffix:"] pack_entry $jid $n 6 nickname [::msgcat::mc "Nickname:"] set c [pack_frame $personal.info [::msgcat::mc "Information"]] pack_entry $jid $c 0 email [::msgcat::mc "E-mail:"] if {$editable} { pack_entry $jid $c 1 url [::msgcat::mc "Web site:"] } else { pack_text_entry $jid $c 1 url [::msgcat::mc "Web site:"] } pack_entry $jid $c 2 jabberid [::msgcat::mc "JID:"] pack_entry $jid $c 3 uid [::msgcat::mc "UID:"] manage_focus $jid personal $n.fn $editable set phones [$tab insert end phones -text [::msgcat::mc "Phones"]] set t [pack_frame $phones.tel [::msgcat::mc "Telephone numbers"]] pack_entry $jid $t 0 tel_home [::msgcat::mc "Home:"] pack_entry $jid $t 1 tel_work [::msgcat::mc "Work:"] pack_entry $jid $t 2 tel_voice [::msgcat::mc "Voice:"] pack_entry $jid $t 3 tel_fax [::msgcat::mc "Fax:"] pack_entry $jid $t 4 tel_pager [::msgcat::mc "Pager:"] pack_entry $jid $t 5 tel_msg [::msgcat::mc "Message recorder:"] pack_entry $jid $t 6 tel_cell [::msgcat::mc "Cell:"] pack_entry $jid $t 7 tel_video [::msgcat::mc "Video:"] pack_entry $jid $t 8 tel_bbs [::msgcat::mc "BBS:"] pack_entry $jid $t 9 tel_modem [::msgcat::mc "Modem:"] pack_entry $jid $t 10 tel_isdn [::msgcat::mc "ISDN:"] pack_entry $jid $t 11 tel_pcs [::msgcat::mc "PCS:"] pack_entry $jid $t 12 tel_pref [::msgcat::mc "Preferred:"] manage_focus $jid phones $t.tel_home $editable set location [$tab insert end location -text [::msgcat::mc "Location"]] set l [pack_frame $location.address [::msgcat::mc "Address"]] pack_entry $jid $l 0 address [::msgcat::mc "Address:"] pack_entry $jid $l 1 address2 [::msgcat::mc "Address 2:"] pack_entry $jid $l 2 city [::msgcat::mc "City:"] pack_entry $jid $l 3 state [::msgcat::mc "State:"] pack_entry $jid $l 4 pcode [::msgcat::mc "Postal code:"] pack_entry $jid $l 5 country [::msgcat::mc "Country:"] set g [pack_frame $location.geo [::msgcat::mc "Geographical position"]] pack_entry $jid $g 0 geo_lat [::msgcat::mc "Latitude:"] pack_entry $jid $g 1 geo_lon [::msgcat::mc "Longitude:"] manage_focus $jid location $l.address $editable set organization \ [$tab insert end organization -text [::msgcat::mc "Organization"]] set d [pack_frame $organization.details [::msgcat::mc "Details"]] pack_entry $jid $d 0 orgname [string trim [::msgcat::mc "Name: "]] pack_entry $jid $d 1 orgunit [::msgcat::mc "Unit:"] set p [pack_frame $organization.personal \ [string trim [::msgcat::mc "Personal "]]] pack_entry $jid $p 0 title [::msgcat::mc "Title:"] pack_entry $jid $p 1 role [::msgcat::mc "Role:"] manage_focus $jid organization $d.orgname $editable # This strange trim is to distinguish different "about"s set about \ [$tab insert end about -text [string trim [::msgcat::mc "About "]]] set b [pack_frame $about.bday [::msgcat::mc "Birthday"]] if {!$editable} { pack_entry $jid $b 0 bday [::msgcat::mc "Birthday:"] } else { pack_spinbox $jid $b 0 0 bdayyear 1900 1000000 [::msgcat::mc "Year:"] grid [Label $b.space0 -text " "] -row 0 -column 2 pack_spinbox $jid $b 0 3 bdaymonth 0 12 [::msgcat::mc "Month:"] grid [Label $b.space1 -text " "] -row 0 -column 5 pack_spinbox $jid $b 0 6 bdayday 0 31 [::msgcat::mc "Day:"] } set a [pack_frame $about.about [string trim [::msgcat::mc "About "]]] set sw [ScrolledWindow $a.sw -scrollbar vertical] if {!$editable} { Text $a.text -height 12 -wrap word ::richtext::config $a.text -using {url emoticon} } else { textUndoable $a.text -height 12 -wrap word } $sw setwidget $a.text set text [Wrapped $a.text] if {$editable} { bind $text [bind Text ] bind $text +break bind $text " ButtonBox::invoke [double% $bbox] default break " } fill_user_description $a.text userinfo(desc,$jid) $editable pack $sw -fill both -expand yes pack $a -fill both -expand yes trace add variable [namespace current]::userinfo(desc,$jid) write \ [list userinfo::fill_user_description $a.text \ userinfo(desc,$jid) $editable] bind $text \ +[double% \ [list trace remove variable [namespace current]::userinfo(desc,$jid) write \ [list userinfo::fill_user_description $a.text \ userinfo(desc,$jid) $editable]]] set userinfo(descfield,$jid) $a.text manage_focus $jid about $b.bday[expr {$editable ? "year" : ""}] $editable if {!$editable} { set photo [$tab insert end photo -text [::msgcat::mc "Photo"]] if {[catch { $tab itemconfigure photo \ -raisecmd [list after idle \ [list [namespace current]::reconfigure_photo $jid]] }]} { bind $tab <> \ [list [namespace current]::reconfigure_photo $jid] } } else { set photo [$tab insert end photo -text [::msgcat::mc "Photo"]] } set p [pack_frame $photo.photo [::msgcat::mc "Photo"]] set photo_img photo_$jid if {$photo_img ni [image names]} { image create photo $photo_img } if {!$editable} { pack_text_entry $jid $p 0 photo_extval [::msgcat::mc "URL:"] set sw [ScrolledWindow $p.sw] grid $sw -row 1 -column 0 -sticky wens -columnspan 2 -pady 0.5m grid rowconfig $p 1 -weight 1 set sf [ScrollableFrame $p.sf] $sw setwidget $sf set l [label [$sf getframe].photo -image $photo_img -borderwidth 0] grid $l -row 0 -column 0 bindscroll $l $sf bindscroll $sf $sf } else { if {![info exists userinfo(photo_use,$jid)]} { set userinfo(photo_use,$jid) none } Radiobutton $p.use_url -text [::msgcat::mc "URL"] \ -value url -variable ::userinfo::userinfo(photo_use,$jid) \ -command [list [namespace current]::enable_active_photo $p $jid] Radiobutton $p.use_image -text [::msgcat::mc "Image"] \ -value image -variable ::userinfo::userinfo(photo_use,$jid) \ -command [list [namespace current]::enable_active_photo $p $jid] Radiobutton $p.use_none -text [::msgcat::mc "None"] \ -value none -variable ::userinfo::userinfo(photo_use,$jid) \ -command [list [namespace current]::enable_active_photo $p $jid] if {![info exists ::userinfo::userinfo(photo_extval,$jid)]} { set ::userinfo::userinfo(photo_extval,$jid) "" } Entry $p.photo_url -textvariable ::userinfo::userinfo(photo_extval,$jid) Label $p.photo -image $photo_img grid $p.use_url -row 1 -column 0 -sticky w grid $p.photo_url -row 1 -column 1 -sticky we grid $p.use_image -row 2 -column 0 -sticky w grid $p.photo -row 3 -column 1 -sticky we grid $p.use_none -row 0 -column 0 -sticky w Button $p.loadimage -text [::msgcat::mc "Load image"] \ -command [list userinfo::load_photo $jid $p.photo] grid $p.loadimage -row 2 -column 1 -sticky w grid columnconfig $p 1 -weight 1 -minsize 0 #grid rowconfig $p 0 -weight 1 grid rowconfig $p 1 #grid rowconfig $p 1 -weight 1 enable_active_photo $p $jid manage_focus $jid photo $p.use_none $editable trace add variable [namespace current]::userinfo(photo_use,$jid) write \ [list userinfo::enable_active_photo $p $jid] bind $p \ +[double% \ [list trace remove variable \ [namespace current]::userinfo(photo_use,$jid) write \ [list userinfo::enable_active_photo $p $jid]]] } if {!$editable} { $a.text configure -state disabled } hook::run userinfo_hook $tab $xlib $jid $editable set vjid [::xmpp::jid::stripResource $jid] if {[chat::is_groupchat [chat::chatid $xlib $vjid]]} { set vjid $jid } ::xmpp::sendIQ $xlib get \ -query [::xmpp::xml::create vCard -xmlns vcard-temp] \ -to $vjid \ -command [list userinfo::parse_vcard $jid] catch {$tab compute_size} bind $w [list ifacetk::tab_move [double% $tab] -1] bind $w [list ifacetk::tab_move [double% $tab] 1] $tab raise $top_page wm deiconify $w } proc userinfo::reconfigure_photo {jid} { set w [w_from_jid $jid] set tab $w.frame.tab if {![winfo exists $tab]} return if {[$tab raise] ne "photo"} return set p [$tab getframe photo].photo set sw $p.sw set sf $p.sf set l [$sf getframe].photo update if {![winfo exists $l]} return $sf configure \ -areawidth [::tcl::mathfunc::max [winfo width $l] [winfo width $sw]] \ -areaheight [::tcl::mathfunc::max [winfo height $l] [winfo height $sw]] } proc userinfo::client_page {tab xlib jid editable} { if {$editable} return set client [$tab insert end client -text [::msgcat::mc "Client"]] set c [pack_frame $client.client [::msgcat::mc "Client"]] pack_entry $jid $c 0 clientname [::msgcat::mc "Client:"] pack_entry $jid $c 1 clientversion [::msgcat::mc "Version:"] pack_entry $jid $c 2 os [::msgcat::mc "OS:"] set l [pack_frame $client.last [::msgcat::mc "Last activity or uptime"]] pack_entry $jid $l 0 lastseconds [::msgcat::mc "Interval:"] pack_entry $jid $l 1 lastdesc [::msgcat::mc "Description:"] set o [pack_frame $client.computer [::msgcat::mc "Time"]] pack_entry $jid $o 0 time [::msgcat::mc "Time:"] pack_entry $jid $o 1 tz [::msgcat::mc "Time zone:"] pack_entry $jid $o 2 utc [::msgcat::mc "UTC:"] # FIX -to ... request_iq version $xlib $jid request_iq time $xlib $jid request_iq last $xlib $jid } hook::add userinfo_hook [namespace current]::userinfo::client_page proc userinfo::enable_active_photo {p jid args} { switch -- $::userinfo::userinfo(photo_use,$jid) { url { $p.photo_url configure -state normal $p.loadimage configure -state disabled focus $p.use_url } image { $p.photo_url configure -state disabled $p.loadimage configure -state normal focus $p.use_image } none { $p.photo_url configure -state disabled $p.loadimage configure -state disabled focus $p.use_none } } } proc userinfo::fill_user_description {txt descvar editable args} { variable userinfo if {[info exists $descvar] && [winfo exists $txt]} { set state [$txt cget -state] $txt configure -state normal $txt delete 0.0 end if {$editable} { $txt insert 0.0 [set $descvar] } else { ::richtext::render_message $txt [set $descvar] "" $txt delete {end - 1 char} } $txt configure -state $state } } proc userinfo::load_photo {jid l} { variable userinfo set photo_img photo_$jid if {![catch { package require Img }]} { set types [list [list [::msgcat::mc "JPEG images"] {.jpg .jpeg}] \ [list [::msgcat::mc "PNG images"] {.png}] \ [list [::msgcat::mc "GIF images"] {.gif}] \ [list [::msgcat::mc "All files"] {*}]] } elseif {![catch { package require tkpng }]} { set types [list [list [::msgcat::mc "GIF images"] {.gif}] \ [list [::msgcat::mc "PNG images"] {.png}] \ [list [::msgcat::mc "All files"] {*}]] } else { set types [list [list [::msgcat::mc "GIF images"] {.gif}] \ [list [::msgcat::mc "All files"] {*}]] } set filename [tk_getOpenFile -filetypes $types] if {$filename != ""} { if {[catch {create_image $photo_img -file $filename} res]} { if {[winfo exists .load_photo_error]} { destroy .load_photo_error } NonmodalMessageDlg .load_photo_error -aspect 50000 -icon error \ -message [::msgcat::mc "Loading photo failed: %s." \ $res] } else { set f [::open $filename] fconfigure $f -translation binary set userinfo(photo_binval,$jid) [read $f] binary scan $userinfo(photo_binval,$jid) H4 binsig switch -- $binsig { ffd8 { set userinfo(photo_type,$jid) "image/jpeg" } 8950 { set userinfo(photo_type,$jid) "image/png" } 4749 { set userinfo(photo_type,$jid) "image/gif" } default { set userinfo(photo_type,$jid) "image" } } close $f set userinfo(photo_use_binval,$jid) 1 } } } proc userinfo::parse_vcard {jid status xml} { debugmsg userinfo "$status $xml" if {![string equal $status ok]} { return } ::xmpp::xml::split $xml tag xmlns attrs cdata subels foreach item $subels { parse_vcard_item $jid $item } } proc userinfo::parse_vcard_item {jid xml} { variable userinfo set w [w_from_jid $jid] ::xmpp::xml::split $xml tag xmlns attrs cdata subels # TODO: # VERSION, --- # ADR?, # LABEL?, # TEL?, +? # EMAIL?, # MAILER?, # TZ?, # LOGO?, # AGENT?, # CATEGORIES?, # NOTE?, # PRODID?, # REV?, # SORT-STRING?, # SOUND?, # UID?, # URL?, # CLASS?, # KEY?, switch -- $tag { FN {set userinfo(fn,$jid) $cdata} NICKNAME {set userinfo(nickname,$jid) $cdata} N {parse_vcard_n_item $jid $subels} PHOTO {parse_vcard_photo_item $jid $subels} ADR {parse_vcard_adr_item $jid $subels} TEL {parse_vcard_tel_item $jid $subels} TEL {set userinfo(telephone,$jid) $cdata} EMAIL { set userinfo(email,$jid) $cdata parse_vcard_email_item $jid $subels } JABBERID {set userinfo(jabberid,$jid) $cdata} GEO {parse_vcard_geo_item $jid $subels} ORG {parse_vcard_org_item $jid $subels} TITLE {set userinfo(title,$jid) $cdata} ROLE {set userinfo(role,$jid) $cdata} BDAY { set userinfo(bday,$jid) $cdata if {![catch {set bday [clock scan $cdata]}]} { set userinfo(bdayyear,$jid) [clock format $bday -format %Y] set userinfo(bdaymonth,$jid) [clock format $bday -format %m] set userinfo(bdayday,$jid) [clock format $bday -format %d] } } UID {set userinfo(uid,$jid) $cdata} URL {set userinfo(url,$jid) $cdata} DESC {set userinfo(desc,$jid) $cdata} default {debugmsg userinfo "Unknown vCard tag $tag"} } } proc userinfo::parse_vcard_email_item {jid items} { variable userinfo foreach item $items { ::xmpp::xml::split $item tag xmlns attrs cdata subels switch -- $tag { USERID {set userinfo(email,$jid) $cdata} } } } proc userinfo::parse_vcard_n_item {jid items} { variable userinfo set w [w_from_jid $jid] foreach item $items { ::xmpp::xml::split $item tag xmlns attrs cdata subels switch -- $tag { FAMILY {set userinfo(family,$jid) $cdata} GIVEN {set userinfo(name,$jid) $cdata} MIDDLE {set userinfo(middle,$jid) $cdata} PREFIX {set userinfo(prefix,$jid) $cdata} SUFFIX {set userinfo(suffix,$jid) $cdata} default {debugmsg userinfo "Unknown vCard subtag $tag"} } } } proc userinfo::parse_vcard_photo_item {jid items} { variable userinfo set w [w_from_jid $jid] foreach item $items { ::xmpp::xml::split $item tag xmlns attrs cdata subels switch -- $tag { BINVAL { catch { set userinfo(photo_binval,$jid) [base64::decode $cdata] set userinfo(photo_use,$jid) image create_image photo_$jid -data $userinfo(photo_binval,$jid) catch { reconfigure_photo $jid } } msg } EXTVAL { set userinfo(photo_extval,$jid) $cdata set userinfo(photo_use,$jid) url } TYPE { set userinfo(photo_type,$jid) $cdata } default {debugmsg userinfo "Unknown vCard subtag $tag"} } } } proc userinfo::parse_vcard_adr_item {jid items} { variable userinfo set w [w_from_jid $jid] foreach item $items { ::xmpp::xml::split $item tag xmlns attrs cdata subels # TODO: # HOME?, # WORK?, # POSTAL?, # PARCEL?, # (DOM | INTL)?, # PREF?, # POBOX?, # LOCALITY?, switch -- $tag { STREET {set userinfo(address,$jid) $cdata} EXTADD {set userinfo(address2,$jid) $cdata} LOCALITY {set userinfo(city,$jid) $cdata} REGION {set userinfo(state,$jid) $cdata} PCODE {set userinfo(pcode,$jid) $cdata} COUNTRY {set userinfo(country,$jid) $cdata} CTRY {set userinfo(country,$jid) $cdata} default {debugmsg userinfo "Unknown vCard subtag $tag"} } } } proc userinfo::parse_vcard_tel_item {jid items} { variable userinfo set w [w_from_jid $jid] set types {} foreach item $items { ::xmpp::xml::split $item tag xmlns attrs cdata subels # TODO: # HOME?, # WORK?, # VOICE?, # FAX?, # PAGER?, # MSG?, # CELL?, # VIDEO?, # BBS?, # MODEM?, # ISDN?, # PCS?, # PREF?, # NUMBER switch -- $tag { HOME {lappend types home} WORK {lappend types work} VOICE {lappend types voice} FAX {lappend types fax} PAGER {lappend types pager} MSG {lappend types msg} CELL {lappend types cell} VIDEO {lappend types video} BBS {lappend types bbs} MODEM {lappend types modem} ISDN {lappend types isdn} PCS {lappend types pcs} PREF {lappend types pref} NUMBER { foreach t $types { set userinfo(tel_$t,$jid) $cdata } } default {debugmsg userinfo "Unknown vCard subtag $tag"} } } } proc userinfo::parse_vcard_geo_item {jid items} { variable userinfo set w [w_from_jid $jid] foreach item $items { ::xmpp::xml::split $item tag xmlns attrs cdata subels switch -- $tag { LAT {set userinfo(geo_lat,$jid) $cdata} LON {set userinfo(geo_lon,$jid) $cdata} default {debugmsg userinfo "Unknown vCard subtag $tag"} } } } proc userinfo::parse_vcard_org_item {jid items} { variable userinfo set w [w_from_jid $jid] # TODO: foreach item $items { ::xmpp::xml::split $item tag xmlns attrs cdata subels switch -- $tag { ORGNAME {set userinfo(orgname,$jid) $cdata} ORGUNIT {set userinfo(orgunit,$jid) $cdata} default {debugmsg userinfo "Unknown vCard subtag $tag"} } } } proc userinfo::request_iq {type xlib jid} { if {[chat::is_groupchat [chat::chatid $xlib $jid]]} { set to $jid } else { set to [get_jid_of_user $xlib $jid] } ::xmpp::sendIQ $xlib get \ -query [::xmpp::xml::create query -xmlns jabber:iq:$type] \ -to $to \ -command [list userinfo::parse_iq$type $jid] } proc userinfo::parse_iqversion {jid status xml} { debugmsg userinfo "$status $xml" if {![string equal $status ok]} { return } ::xmpp::xml::split $xml tag xmlns attrs cdata subels if {[string equal $xmlns jabber:iq:version]} { userinfo::parse_iqversion_item $jid $subels } } proc userinfo::parse_iqversion_item {jid items} { variable userinfo foreach item $items { ::xmpp::xml::split $item tag xmlns attrs cdata subels switch -- $tag { name {set userinfo(clientname,$jid) $cdata} version {set userinfo(clientversion,$jid) $cdata} os {set userinfo(os,$jid) $cdata} default {debugmsg userinfo "Unknown iq:version tag '$tag'"} } } } proc userinfo::parse_iqtime {jid status xml} { debugmsg userinfo "$status $xml" if {![string equal $status ok]} { return } ::xmpp::xml::split $xml tag xmlns attrs cdata subels if {[string equal $xmlns jabber:iq:time]} { userinfo::parse_iqtime_item $jid $subels } } proc userinfo::parse_iqtime_item {jid items} { variable userinfo foreach item $items { ::xmpp::xml::split $item tag xmlns attrs cdata subels switch -- $tag { utc {set userinfo(utc,$jid) $cdata} display {set userinfo(time,$jid) $cdata} tz {set userinfo(tz,$jid) $cdata} default {debugmsg userinfo "Unknown iq:time tag '$tag'"} } } } proc userinfo::parse_iqlast {jid status xml} { variable userinfo debugmsg userinfo "$status $xml" if {![string equal $status ok]} { return } ::xmpp::xml::split $xml tag xmlns attrs cdata subels if {[string equal $xmlns jabber:iq:last]} { set seconds [::xmpp::xml::getAttr $attrs seconds] if {[string is integer -strict $seconds]} { set userinfo(lastseconds,$jid) [format_time $seconds] } else { set userinfo(lastseconds,$jid) "" } set userinfo(lastdesc,$jid) $cdata } } proc userinfo::append_tag {varname tag cdata {subtags {}}} { upvar $varname tags if {$cdata != "" || $subtags != {}} { lappend tags [::xmpp::xml::create $tag \ -cdata $cdata \ -subelements $subtags] } } proc userinfo::send_vcard {xlib jid} { variable userinfo set w [w_from_jid $jid] set tags {} append_tag tags FN $userinfo(fn,$jid) append_tag tags NICKNAME $userinfo(nickname,$jid) append_tag tags N "" [make_n_item $jid] append_tag tags PHOTO "" [make_photo_item $jid] append_tag tags ADR "" [make_adr_item $jid] eval lappend tags [make_tel_item $jid] eval lappend tags [make_email_item $jid] append_tag tags EMAIL $userinfo(email,$jid) append_tag tags JABBERID $userinfo(jabberid,$jid) append_tag tags GEO "" [make_geo_item $jid] append_tag tags ORG "" [make_org_item $jid] append_tag tags TITLE $userinfo(title,$jid) append_tag tags ROLE $userinfo(role,$jid) if {($userinfo(bdaymonth,$jid) > 0) && ($userinfo(bdayday,$jid) > 0)} { set userinfo(bday,$jid) [format "%d-%02d-%02d" \ [string trimleft $userinfo(bdayyear,$jid) "0"] \ [string trimleft $userinfo(bdaymonth,$jid) "0"] \ [string trimleft $userinfo(bdayday,$jid) "0"]] } else { set userinfo(bday,$jid) "" } append_tag tags BDAY $userinfo(bday,$jid) append_tag tags UID $userinfo(uid,$jid) append_tag tags URL $userinfo(url,$jid) append_tag tags DESC [$userinfo(descfield,$jid) get 0.0 "end -1 chars"] debugmsg userinfo $tags ::xmpp::sendIQ $xlib set \ -query [::xmpp::xml::create vCard \ -xmlns vcard-temp \ -subelements $tags] \ -to $jid \ -command [list [namespace current]::check_answer $xlib $jid] } proc userinfo::check_answer {xlib jid res xml} { # TODO } proc userinfo::make_n_item {jid} { variable userinfo set tags {} append_tag tags FAMILY $userinfo(family,$jid) append_tag tags GIVEN $userinfo(name,$jid) append_tag tags MIDDLE $userinfo(middle,$jid) append_tag tags PREFIX $userinfo(prefix,$jid) append_tag tags SUFFIX $userinfo(suffix,$jid) return $tags } proc userinfo::make_email_item {jid} { variable userinfo set tags {} if {$userinfo(email,$jid) != ""} { append_tag tags EMAIL "" \ [list [::xmpp::xml::create INTERNET] \ [::xmpp::xml::create USERID \ -cdata $userinfo(email,$jid)]] } return $tags } proc userinfo::make_photo_item {jid} { variable userinfo set tags {} switch -- $userinfo(photo_use,$jid) { url { append_tag tags EXTVAL $userinfo(photo_extval,$jid) } image { if {[info exists userinfo(photo_binval,$jid)]} { if {[info exists userinfo(photo_type,$jid)]} { append_tag tags TYPE $userinfo(photo_type,$jid) } append_tag tags \ BINVAL [base64::encode $userinfo(photo_binval,$jid)] } } } return $tags } proc userinfo::make_adr_item {jid} { variable userinfo set tags {} append_tag tags STREET $userinfo(address,$jid) append_tag tags EXTADD $userinfo(address2,$jid) append_tag tags LOCALITY $userinfo(city,$jid) append_tag tags REGION $userinfo(state,$jid) append_tag tags PCODE $userinfo(pcode,$jid) append_tag tags CTRY $userinfo(country,$jid) return $tags } proc userinfo::make_tel_item {jid} { variable userinfo set tags {} foreach t {home work voice fax pager msg cell \ video bbs modem isdn pcs pref} { if {$userinfo(tel_$t,$jid) != ""} { append_tag tags TEL "" \ [list [::xmpp::xml::create [string toupper $t]] \ [::xmpp::xml::create NUMBER \ -cdata $userinfo(tel_$t,$jid)]] } } return $tags } proc userinfo::make_geo_item {jid} { variable userinfo set tags {} append_tag tags LAT $userinfo(geo_lat,$jid) append_tag tags LON $userinfo(geo_lon,$jid) return $tags } proc userinfo::make_org_item {jid} { variable userinfo set tags {} append_tag tags ORGNAME $userinfo(orgname,$jid) append_tag tags ORGUNIT $userinfo(orgunit,$jid) return $tags } proc userinfo::add_menu_item {m xlib jid} { $m add command -label [::msgcat::mc "Show info"] \ -command [list userinfo::open $xlib $jid] } hook::add chat_create_user_menu_hook userinfo::add_menu_item 60 hook::add chat_create_conference_menu_hook userinfo::add_menu_item 60 hook::add roster_create_groupchat_user_menu_hook userinfo::add_menu_item 60 hook::add roster_conference_popup_menu_hook userinfo::add_menu_item 60 hook::add roster_service_popup_menu_hook userinfo::add_menu_item 60 hook::add roster_jid_popup_menu_hook userinfo::add_menu_item 60 hook::add message_dialog_menu_hook userinfo::add_menu_item 60 hook::add search_popup_menu_hook userinfo::add_menu_item 60 hook::add postload_hook \ [list disco::browser::register_feature_handler vcard-temp userinfo::open \ -desc [list user [::msgcat::mc "User info"] \ client [::msgcat::mc "User info"] \ * [::msgcat::mc "Service info"]]] hook::add postload_hook \ [list disco::browser::register_feature_handler jabber:iq:last \ userinfo::open_client \ -desc [list user [::msgcat::mc "Last activity"] \ client [::msgcat::mc "Last activity"] \ * [::msgcat::mc "Uptime"]]] hook::add postload_hook \ [list disco::browser::register_feature_handler jabber:iq:time \ userinfo::open_client \ -desc [list * [::msgcat::mc "Time"]]] hook::add postload_hook \ [list disco::browser::register_feature_handler jabber:iq:version \ userinfo::open_client \ -desc [list * [::msgcat::mc "Version"]]] # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/utils.tcl000064400000000000000000000430061477701321300137200ustar00nobodynobody# utils.tcl -- # # This file is a part of the Tkabber XMPP client. It provides a set # of useful auxiliary procedures. proc rand {num} { return [expr int(floor(rand()*$num))] } proc psuffix {xlib} { return [string map {: #} $xlib] } # my_jid - returns JID for inclusion in queries. If the recipient # is from some conference room then JID is a room JID. proc my_jid {xlib recipient} { set bare_recipient [::xmpp::jid::stripResource $recipient] set chatid [chat::chatid $xlib $bare_recipient] if {[chat::is_groupchat $chatid]} { set myjid [chat::our_jid $chatid] } else { set myjid [connection_jid $xlib] } } proc win_id {prefix key} { global wins if {![info exists wins(seq,$prefix)]} { set wins(seq,$prefix) 0 } if {![info exists wins(key,$prefix,$key)]} { set idx $wins(seq,$prefix) set wins(key,$prefix,$key) ".${prefix}_$idx" incr wins(seq,$prefix) } return $wins(key,$prefix,$key) } proc jid_to_tag {jid} { variable jidtag variable tagjid if {[info exists jidtag($jid)]} { return $jidtag($jid) } else { regsub -all {[^[:alnum:]]+} $jid {} prefix set tag $prefix[rand 1000000000] while {[info exists tagjid($tag)]} { set tag $prefix[rand 1000000000] } set jidtag($jid) $tag set tagjid($tag) $jid return $tag } } proc tag_to_jid {tag} { variable tagjid if {[info exists tagjid($tag)]} { return $tagjid($tag) } else { error "Unknown tag $tag" } } proc double% {str} { return [string map {% %%} $str] } proc error_type_condition {errmsg} { return [list [::xmpp::stanzaerror::type $errmsg] \ [::xmpp::stanzaerror::condition $errmsg]] } proc error_to_string {errmsg} { return [::xmpp::stanzaerror::message $errmsg] } proc get_group_nick {xlib jid} { global defaultnick if {[catch {set nick [connection_user $xlib]}]} { set nick "" } set tmp_pattern * foreach pattern [array names defaultnick] { if {[string equal $pattern $jid]} { return $defaultnick($pattern) } elseif {([string match $pattern $jid]) && ([string match $tmp_pattern $pattern])} { set nick $defaultnick($pattern) set tmp_pattern $pattern } } return $nick } proc check_message {nick body} { set personal 0 hook::run check_personal_message_hook personal $nick $body return $personal } proc personal_message_fallback {vpersonal nick body} { upvar 2 $vpersonal personal set prefixes {"" "2"} set suffixes {":" any " " any "" end} foreach pref $prefixes { foreach {suff pos} $suffixes { set str "$pref$nick$suff" if {$body eq $str || ([string equal -length [string length $str] $body $str] && $pos eq "any")} { set l [string length $pref] set personal 1 return } } } } hook::add check_personal_message_hook personal_message_fallback 100 proc format_time {t} { if {$t eq ""} { return } set sec [expr {$t % 60}] set secs \ [expr {($sec==1)?"[::msgcat::mc second]":"[::msgcat::mc seconds]"}] set t [expr {$t / 60}] set min [expr {$t % 60}] set mins \ [expr {($min==1)?"[::msgcat::mc minute]":"[::msgcat::mc minutes]"}] set t [expr {$t / 60}] set hour [expr {$t % 24}] set hours \ [expr {($hour==1)?"[::msgcat::mc hour]":"[::msgcat::mc hours]"}] set day [expr {$t / 24}] set days [expr {($day==1)?"[::msgcat::mc day]":"[::msgcat::mc days]"}] set flag 0 set message "" if {$day != 0} { set flag 1 set message "$day $days" } if {$flag || ($hour != 0)} { set flag 1 set message [concat $message "$hour $hours"] } if {$flag || ($min != 0)} { set message [concat $message "$min $mins"] } return [concat $message "$sec $secs"] } proc NonmodalMessageDlg {path args} { set icon "none" set title "" set message "" set opts {} set mopts {} foreach {option value} $args { switch -- $option { -icon { set icon $value } -title { set title $value } -aspect { lappend mopts $option $value } -message { lappend mopts -text $value } default { lappend opts $option $value } } } if {$icon == "none"} { set image "" } else { set image [Bitmap::get $icon] } if {$title == ""} { set frame [frame $path -class MessageDlg] set title [option get $frame "${icon}Title" MessageDlg] destroy $frame if { $title == "" } { set title "Message" } } eval [list Dialog::create $path \ -image $image \ -modal none \ -title $title \ -side bottom \ -anchor e \ -default 0 \ -cancel 0] $opts Dialog::add $path -text [::msgcat::mc "OK"] \ -name ok \ -command "destroy $path" set frame [Dialog::getframe $path] eval [list Message $frame.msg -relief flat \ -borderwidth 0 \ -highlightthickness 0] $mopts pack $frame.msg -side left -padx 3m -pady 1m -fill x -expand yes Dialog::draw $path } proc bindscroll {w {w1 ""}} { if {![string equal $w1 ""]} { set w1 [double% $w1] } else { set w1 [double% $w] } bind $w <> \ "if {\[lindex \[$w1 yview\] 0\] > 0} { $w1 yview scroll -5 units }" bind $w <> \ "if {\[lindex \[$w1 yview\] 1\] < 1} { $w1 yview scroll 5 units }" bind $w <> \ "if {\[lindex \[$w1 xview\] 0\] > 0} { $w1 xview scroll -10 units }" bind $w <> \ "if {\[lindex \[$w1 xview\] 1\] < 1} { $w1 xview scroll 10 units }" } ########################################################################### proc textUndoable {path args} { eval {Text $path -undo 1} $args bind [Wrapped $path] +[list %W edit separator] bind [Wrapped $path] <> \ [list text_context_menu %W %X %Y %x %y] hook::run text_on_create_hook [Wrapped $path] return $path } # There is an evil bug in Tk, which does not allow inserting symbols # using XIM if more than one bound script uses %A. # See http://sourceforge.net/tracker/index.php?func=detail&aid=1373712&group_id=12997&atid=112997 # Workaround overwrites existiong binding and uses hook to # simulate event with %A substituted. # Usage example see in plugins/unix/ispell.tcl. proc text_on_keypress {path sym} { tk::TextInsert $path $sym hook::run text_on_keypress_hook $path $sym } bind Text {text_on_keypress %W %A} proc text_context_menu {W X Y x y} { set m .input_popup if {[winfo exists $m]} { destroy $m } menu $m -tearoff 0 hook::run textinput_popup_menu_hook $m $W $x $y tk_popup $m $X $Y } proc text_add_copypaste_to_menu {m w x y} { $m add command -label [::msgcat::mc "Cut"] \ -command [list event generate $w <>] \ -accelerator Ctrl-X $m add command -label [::msgcat::mc "Copy"] \ -command [list event generate $w <>] \ -accelerator Ctrl-C $m add command -label [::msgcat::mc "Paste"] \ -command [list event generate $w <>] \ -accelerator Ctrl-V } hook::add textinput_popup_menu_hook text_add_copypaste_to_menu 30 ########################################################################### proc focus_next {path fr} { focus [Widget::focusNext $path] set widget [focus] if {[string first $fr $widget] == 0} { $fr see $widget } } proc focus_prev {path fr} { focus [Widget::focusPrev $path] $fr see [focus] } proc CbDialog {path title buttons var lnames lballoons args} { upvar #0 $var result array set names $lnames array set balloons $lballoons set modal none set radio 0 foreach {opt val} $args { switch -- $opt { -type { set radio [string equal $val radio] } -modal { set modal $val } -disabled { array set disabled $val } } } set len [llength $buttons] Dialog $path -title $title \ -modal $modal \ -anchor e \ -default 0 \ -cancel [expr {[llength $buttons]/2 - 1}] foreach {but com} $buttons { $path add -text $but -command $com } set m [Message [$path getframe].title -aspect 50000 -text $title] pack $m -expand no -fill x set sw [ScrolledWindow [$path getframe].sw] set sf [ScrollableFrame $sw.sf -constrainedwidth yes] pack $sw -expand yes -fill both $sw setwidget $sf set sff [$sf getframe] bind $path [list focus_prev %W [double% $sf]] bind $path [list focus_next %W [double% $sf]] bind $path [list focus_next %W [double% $sf]] bind $path [list focus_prev %W [double% $sf]] bind $path <> [list focus_prev %W [double% $sf]] bindscroll $sff $sf set temp {} foreach idx [array names names] { lappend temp [list $idx $names($idx)] } set i 0 foreach idxt [lsort -dictionary -index 1 $temp] { set idx [lindex $idxt 0] if {$radio} { set cb [Radiobutton $sff.cb$i -variable $var \ -text $names($idx) \ -value $idx] if {![info exists result] && $i == 0} { set result $idx } } else { if {![info exists result($idx)]} { set result($idx) 0 } set cb [Checkbutton $sff.cb$i -variable ${var}($idx) \ -text $names($idx)] } if {[info exists disabled($idx)] && $disabled($idx)} { $sff.cb$i configure -state disabled } bind $cb [list [double% $path] invoke 0] bind $cb +break bind $cb <1> [list focus %W] bindscroll $cb $sf if {[info exists balloons($idx)]} { balloon::setup $cb -text $balloons($idx) } pack $cb -anchor w incr i } $path draw $sff.cb0 } proc OptionMenu {path args} { set m [eval [list ::tk_optionMenu $path] $args] set bd [option get $path borderWidth ""] if {$bd != ""} { $path configure -borderwidth $bd } return $m } # Forces (string) $x to be interpreted as integer. # Useful to deal with strings representing decimal integers and # containing leading zeroes (so, normaly they would be interpreted # by Tcl as octal integers). # Contributed on c.l.t. by Kevin Kenny, see http://wiki.tcl.tk/498 proc force_integer {x} { set count [scan $x %lld%s n rest] if { $count <= 0 || ( $count == 2 && ![string is space $rest] ) } { return -code error "not an integer: $x" } return $n } # Excludes element $what from the list named $listVar: proc lexclude {listVar what} { upvar 1 $listVar list set at [lsearch $list $what] if {$at >= 0} { set list [lreplace $list $at $at] } } # Takes one or more lists and returns one list with only unique # members from all of the passed lists: proc lfuse {args} { lsort -unique [lconcat $args] } # Takes a list of lists and flattens them into one list. # NOTE that it takes ONE argument, which should be a list. proc lconcat {L} { foreach S $L { foreach E $S { lappend out $E } } set out } # List intersection. # For a number of lists, return only those elements # that are present in all lists. # (Richard Suchenwirth, from http://wiki.tcl.tk/43) proc lintersect {args} { set res {} foreach element [lindex $args 0] { set found 1 foreach list [lrange $args 1 end] { if {$element ni $list} { set found 0 break } } if {$found} {lappend res $element} } set res } proc lfilter {command list} { set newlist {} foreach elem $list { if {[eval $command [list $elem]]} { lappend newlist $elem } } return $newlist } # Removes $nth element from the list contained in a # variable named $listVar in the caller's scope, # then returns the value of the removed element. proc lpop {listVar {nth 0}} { upvar 1 $listVar L set v [lindex $L $nth] set L [lreplace $L $nth $nth] set v } # Returns a fully-qualified name of the command that has invoked # the caller of this procedure. # To put is simple: if ::one::bar has invoked ::two::foo, the # ::two::foo proc can use [caller] to know that its caller # is ::one::bar # If the caller of this proc has no caller (i.e. it was called # on level 0), this proc returns empty string. # You can specify 2, 3, etc as the argument to get info about # the caller of the caller and so on (think of [uplevel]). proc caller {{level 1}} { incr level if {[catch {info level -$level} prc]} { return "" } else { return [namespace which -command [lindex $prc 0]] } } # Splits a string given in $s at each occurence of # substring given in $by. # $sep contains a Unicode character used to replace # found substrings before actual splitting; # this character MUST NOT occur in $s. proc msplit {s by {sep \u0000}} { split [string map [list $by $sep] $s] $sep } ################################################################## proc get_prop {list prop {fallback ""}} { if {[dict exists $list $prop]} { return [dict get $list $prop] } else { return $fallback } } ################################################################## proc reverse_scroll {w} { set command [$w cget -yscrollcommand] $w configure -yscrollcommand [list store_scroll $w $command] bind $w {move_scroll %W} bind $w {+clean_scroll %W} } proc store_scroll {w command lo hi} { set ::lo($w) $lo set ::hi($w) $hi eval $command {$lo $hi} } proc move_scroll {w} { if {![info exists ::lo($w)] || ![info exists ::hi($w)]} return foreach {lo hi} [$w yview] break if {$::hi($w) < 1.0} { $w yview moveto [expr {$::hi($w) - ($hi - $lo)}] } else { $w yview moveto 1.0 } } proc clean_scroll {w} { catch {unset ::lo($w)} catch {unset ::hi($w)} } ################################################################## proc epath {} { global EPathNum if {![info exists EPathNum]} { set EPathNum 0 } else { incr EPathNum } return .errorpath$EPathNum } ################################################################## proc get_conf {w option} { if {[catch {lindex [$w configure $option] 4} res]} { return [ttk::style lookup {} $option] } else { return $res } } ################################################################## proc render_url {path url title args} { set t [eval [list Text $path \ -cursor left_ptr \ -height 1 \ -width 10 \ -borderwidth 0 \ -highlightthickness 0 \ -takefocus 0 \ -wrap none] $args] ::richtext::config $t -using url ::plugins::urls::render_url $t text $url {} -title $title $t delete {end - 1 char} $t configure -state disabled return $t } ################################################################## proc ecursor_entry {entry} { $entry icursor end return $entry } ################################################################## proc update_combo_list {list entry num} { set ind [lsearch -exact $list $entry] if {$ind >= 0} { set newlist [linsert [lreplace $list $ind $ind] 0 $entry] } else { set newlist [linsert $list 0 $entry] } if {[llength $newlist] > $num} { return [lreplace $newlist end end] } else { return $newlist } } ################################################################## proc wmstate {window args} { switch -- [llength $args] { 0 { set state [wm state $window] if {[string equal $state normal]} { if {![catch {wm attributes $window -zoomed} res]} { if {$res} { set state zoomed } } } return $state } 1 { set state [lindex $args 0] switch -- $state { zoomed { if {[catch {wm state $window zoomed}]} { wm state $window normal catch {wm attributes $window -zoomed 1} } } default { wm state $window $state catch {wm attributes $window -zoomed 0} } } return $state } } } # vim:ft=tcl:ts=8:sw=4:sts=4:et tkabber/xmppmime.tcl000064400000000000000000000066561477701321300144260ustar00nobodynobody# xmppmime.tcl -- # # Support for XMPP/Jabber MIME Type (XEP-0081) namespace eval ::xmppmime { variable used 0 variable handle 0 variable loaded 0 variable connected 0 variable queue {} } package require xmpp proc ::xmppmime::load {path} { # TODO: catch file errors set f [open $path] set content [read $f] close $f ::xmpp::xml::parseData $content ::xmppmime::parse } proc ::xmppmime::parse {xmldata} { ::xmpp::xml::split $xmldata tag xmlns attrs cdata subels set jid [::xmpp::xml::getAttr $attrs jid] switch -- $tag { message { send_event [list message $jid] } chat { send_event [list chat $jid] } groupchat { send_event [list groupchat $jid] } subscribe { send_event [list subscribe $jid] } vcard { send_event [list vcard $jid] } register { send_event [list register $jid] } disco { send_event [list groupchat $jid] } } } proc ::xmppmime::send_event {event} { variable handle variable used set used 1 if {!$handle} { if {[tk appname] == "tkabber"} { set handle 1 } } if {$handle} { recv_event $event } else { if {[catch {send tkabber [list ::xmppmime::recv_event $event]}]} { set handle 1 recv_event $event } } } proc ::xmppmime::recv_event {event} { variable queue variable loaded if {$loaded} { process_event $event } else { lappend queue $event } } proc ::xmppmime::process_event {event} { variable queue variable connected set rest [lassign $event type jid] set xlib [lindex [connections] 0] switch -- $type { message { message::send_dialog -to $jid } chat { chat::open_window [chat::chatid $xlib $jid] chat } groupchat { if {$connected} { muc::join $jid } else { lappend queue $event } } subscribe { message::send_subscribe_dialog $jid } vcard { if {$connected} { userinfo::open $xlib $jid } else { lappend queue $event } } register { if {$connected} { register::open $xlib $jid } else { lappend queue $event } } disco { if {$connected} { disco::browser::open_win $xlib $jid } else { lappend queue $event } } } } proc ::xmppmime::is_done {} { variable handle variable used return [expr {$used && !$handle}] } proc ::xmppmime::process_queue {} { variable queue variable loaded set loaded 1 set oldqueue $queue set queue {} foreach event $oldqueue { process_event $event } } hook::add finload_hook ::xmppmime::process_queue proc ::xmppmime::connected {xlib} { variable connected set connected 1 process_queue } hook::add connected_hook ::xmppmime::connected proc ::xmppmime::disconnected {xlib} { variable connected set connected [expr {[connections] != {}}] } hook::add disconnected_hook ::xmppmime::disconnected # vim:ft=tcl:ts=8:sw=4:sts=4:et