Commit Graph

5456 Commits

Author SHA1 Message Date
Usama Akkad 914dc4c4ec small fix 2016-02-07 12:52:27 +02:00
Usama Akkad 1ecf9c2206 applied @GLolol suggestions 2016-02-07 12:50:35 +02:00
Valentin Lorentz 61e5a29351 Fix scheme-matching regexp.
Old behavior allowed underscores and schemes starting with a digit,
and did not allow -+.
New behavior: https://tools.ietf.org/html/rfc3986\#section-3.1

Side effect: closes GH-1146
2016-02-07 09:44:08 +01:00
Valentin Lorentz e9b122c973 Later: Do not use ValueError for reporting full queues.
Someone on IRC reported a ValueError being raised from an other part of the code.
2016-01-31 12:11:04 +01:00
Valentin Lorentz ce0b788f2f Merge remote-tracking branch 'freeboson/patch-2' into testing 2016-01-27 14:27:32 +01:00
Sujeet Akula 26840f7a2e add desc for wizard — plugindownloader 2016-01-27 08:23:47 -05:00
Valentin Lorentz 6b3766dcd1 Remove trailing spaces. 2016-01-27 14:04:58 +01:00
Valentin Lorentz 638897671e Merge remote-tracking branch 'freeboson/patch-1' into testing 2016-01-27 14:04:14 +01:00
Sujeet Akula c44d2007c4 add desc for wizard 2016-01-27 08:03:05 -05:00
Usama Akkad 44a4d31b05 Add some explanation about Google plugin functions 2016-01-27 01:08:38 +02:00
Usama Akkad 8c191a8ce2 Add some explantation about Google plugin functions 2016-01-27 00:05:06 +02:00
Valentin Lorentz a4a0082c17 Later: use .tag() to set tags, as there is no IrcMsg.__setattr__. 2016-01-22 20:13:22 +00:00
Valentin Lorentz 4576874128 httpserver: Respond to HEAD requests. Closes GH-1203. 2016-01-05 18:25:35 +01:00
Valentin Lorentz 1010ea244b Filter: Extend outfilter to cover NOTICEs. Closes GH-1164. 2016-01-02 13:32:03 +01:00
Valentin Lorentz 715f9cd52d Merge pull request #1201 from GLolol/web/strip-newlines
Web: normalize whitespace in titles
2015-12-30 10:00:42 +01:00
James Lu e2dedcc5a4 Web: normalize whitespace in titles
Sample link: http://googleblog.blogspot.com/2015/08/android-wear-now-works-with-iphones.html
Before: <bot> 'Title: \nOfficial Google Blog: Android Wear now works with iPhones\n (at googleblog.blogspot.com)'
After: <bot> Title: Official Google Blog: Android Wear now works with iPhones (at googleblog.blogspot.com)
2015-12-29 17:12:26 -08:00
Valentin Lorentz f26716f2b8 Utilities: Add @let. 2015-12-29 18:00:05 +01:00
Valentin Lorentz f7943a6697 Plugin: make @plugins take non-first words into account. Closes GH-68. 2015-12-28 20:09:48 +01:00
Valentin Lorentz 8e427838cd Plugin: internationalize a string. 2015-12-28 20:04:31 +01:00
Valentin Lorentz f4d36cd087 Admin: internationalize a string. 2015-12-28 20:01:40 +01:00
Valentin Lorentz 857027a26f Fix tests for Python 2. 2015-12-27 12:43:35 +01:00
Valentin Lorentz b42437c711 Unix: Channel-specific list of files for @fortune.
Also forbid file names starting with a dash, because
arguments to the fortune argument could be used for
DoSing.
2015-12-27 12:32:09 +01:00
Valentin Lorentz 49ff291f61 Use utf-8 to encode files by default.
Should fix this bug in Seen:
Traceback (most recent call last):
  File "C:\Program Files\Python34\lib\site-packages\supybot\world.py", line 121, in flush
    f()
  File "C:\Program Files\Python34\lib\site-packages\supybot\plugins\__init__.py", line 271, in flush
    writer.writerow(L)
  File "C:\Program Files\Python34\lib\site-packages\supybot\utils\file.py", line 172, in write
    return self._fd.write(data)
  File "C:\Program Files\Python34\lib\encodings\cp1250.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u25c4' in position 33: character maps to <undefined>
2015-12-23 15:22:19 +01:00
Valentin Lorentz 2364cf176d Status: Fix sort on Python3 (dict_items, not list). Closes GH-1199. 2015-12-20 10:09:39 +01:00
James Lu 45c5e29849 Channel: fix help text in "cycle" command
Closes #1197.
2015-12-19 09:01:29 -08:00
Valentin Lorentz 65abedcca1 ChannelStats: Don't crash on messages with no argument, eg. AWAY. 2015-12-19 00:13:42 +01:00
Valentin Lorentz 856d275697 Status: Fix output of @cpu if the amount of memory is unknown. 2015-12-07 16:32:53 +01:00
Valentin Lorentz b0ee589702 Seen: Fix handling of MODE and TOPIC. 2015-12-05 21:29:07 +00:00
Valentin Lorentz 4d3fa77018 Fix typo. 2015-12-04 13:39:28 +01:00
Valentin Lorentz 2937152dc1 ChannelLogger && ChannelStats && Limiter && Relay && Seen: Use new QUIT and NICK 'channels' tag instead of copying the state. 2015-12-04 13:30:07 +01:00
Valentin Lorentz 1493adc041 Merge pull request #1194 from GLolol/filter/rainbow-stripcolor
Strip colour before applying new colour in Filter.rainbow and colorize
2015-12-02 09:41:56 +01:00
Valentin Lorentz 56d4cbec08 Aka: Fix Python 2 compatibility. 2015-12-02 09:06:34 +01:00
Valentin Lorentz 3fde279e50 Aka: Fix database name. 2015-12-02 07:55:00 +00:00
jacksonmj 61f2df5cc3 Strip colour before applying new colour in Filter.rainbow and colorize
This makes them work much better when the input text already contains colour.

(cherry picked from commit jacksonmj/Limnoria@be83befabf)
2015-12-01 18:20:01 -08:00
Valentin Lorentz bc19a9fc7f Web: fix syntax. 2015-11-30 07:45:05 +00:00
Valentin Lorentz eaf9e40dc2 Web: increase subprocess memory limit and catch MemoryError appropriately. 2015-11-29 18:34:54 +00:00
Valentin Lorentz a070b658a0 Web: Fix title fetching. 2015-11-29 17:59:57 +00:00
Valentin Lorentz ad8883a724 Network: Perform susbstitution in quit message. 2015-11-18 12:18:46 +01:00
Valentin Lorentz b69e6e22bb Conditional: Rename @iferror to @cerror and simplify its logic to just return a boolean. 2015-11-14 19:28:05 +01:00
Valentin Lorentz 5f361ef180 Conditional: Add command @iferror. Closes GH-1114. 2015-11-14 19:20:25 +01:00
Valentin Lorentz 534fb5c78f ShrinkUrl: Fix previous commit. 2015-11-11 12:20:44 +00:00
Valentin Lorentz c65762544c ShrinkUrl: Preven crash for commands with no arguments. 2015-11-11 12:15:55 +00:00
Valentin Lorentz b3dbde18b8 Conditional: Don't import * from commands and remove the hack for any/all. 2015-11-09 19:10:19 +01:00
Valentin Lorentz 8bdab5e23e Condition: Add support for integers (casted to booleans). 2015-11-07 18:44:33 +01:00
Valentin Lorentz e1d0c232ea Aka: Deprecate SQLAlchemy backend. 2015-11-07 18:29:43 +01:00
Valentin Lorentz 3f66dbc3d5 Channel & Dunno & Misc & RSS & Scheduler: Let the logging facility perform string templating to avoid extra format chars in argument. 2015-11-03 17:25:13 +01:00
Valentin Lorentz a8748c3b73 GPG: Fix test crash since 57b77a6725. 2015-10-25 16:27:57 +01:00
Valentin Lorentz 1f57c31665 Web: Fix NameError with snarferShowTargetDomain. Closes GH-1177. 2015-10-25 16:20:31 +01:00
Valentin Lorentz e3ff413734 Web & core: Merge features of Web's title parser and utils.web.HtmlToText + don't unescape HTML twice. Closes GH-1176. 2015-10-23 07:41:36 +02:00
Jussi Timperi 1f96471d93 Web: Correct capitalization in testTitle. 2015-10-22 17:19:03 +03:00
Jussi Timperi 5cf1b34f55 Web: Use title instead of parser.title. 2015-10-22 17:13:47 +03:00
Jussi Timperi df7689cc2e Web & utils.web: Force HTMLParser to process all buffered data.
Python issue 23144.
2015-10-22 16:56:53 +03:00
Valentin Lorentz 526ffb0ccb Web: Fix code factorization (576a96fb71). Closes GH-1173. 2015-10-17 15:41:20 +02:00
Valentin Lorentz fb52b16429 RSS: Allow @announce add to take URLs as feed names. 2015-10-10 20:40:25 +02:00
Valentin Lorentz d397b4706d Merge pull request #1172 from GLolol/web/strip-titles
Web: actually return a whitespace-stripped title
2015-10-04 22:05:08 +02:00
James Lu 6e96f8f8bf Web: actually return the whitespace-stripped title 2015-10-04 12:54:41 -07:00
Jussi Timperi 67e5b55c1a Google: Handle empty results in translate. 2015-10-03 01:06:18 +03:00
Valentin Lorentz 27b878ff7c Math: Add comment about security. 2015-09-28 18:59:29 +02:00
Valentin Lorentz 0371480bd6 Math: add the 'round' function. 2015-09-28 18:57:46 +02:00
Valentin Lorentz 532309ecff Merge pull request #1170 from GLolol/badwords-1
BadWords: truly fix the bot kicking people when badwords list is empty
2015-09-26 08:57:16 +02:00
James Lu 96dc860313 BadWords: truly fix kicks when badwords list is empty (#989) 2015-09-25 20:51:15 -07:00
Valentin Lorentz 4498548cb3 RSS: Add supybot.plugins.RSS.notice. Closes GH-1151. 2015-09-23 11:27:20 +02:00
Valentin Lorentz 1002ec5d30 Later: Allow multiple targets. Closes GH-1169. 2015-09-23 11:23:21 +02:00
Valentin Lorentz 82332ff87c RSS: Add feed-specific waitPeriod. 2015-09-23 11:05:25 +02:00
Valentin Lorentz 685bedcd74 Add config variable supybot.abuse.flood.command.notify. 2015-09-16 21:32:25 +02:00
Valentin Lorentz 2e7df9cfc2 Service: Actually allow 0. 2015-09-15 21:00:31 +02:00
Valentin Lorentz e54ae6dc77 Service: Don't ghost if ghostDelay is set to 0. 2015-09-15 20:59:26 +02:00
James Lu f5146e8af4 Filter: more efficient _squish code 2015-09-10 06:57:40 -07:00
James Lu ed493e6504 Filter: strip spaces in "unbinary" (Closes #1166)
This makes _squish() a shared function to prevent code duplication. Also, remove duplicate testUnbinary function, and add tests for this.
2015-09-09 19:32:15 -07:00
Valentin Lorentz b51075969f Google: Move the main code of translate to a separate function (usable by other plugins). 2015-09-09 21:24:47 +02:00
Valentin Lorentz 1c218592af RSS: Add fallback on sorting by update timestamp + add outdatedFirst and updatedFirst sorts. Closes GH-1139. 2015-09-02 10:04:04 +02:00
Valentin Lorentz 29ca3eb5e4 RSS: Sort on time tuples instead of formatted dates. 2015-09-02 09:43:29 +02:00
Valentin Lorentz c81d5d3151 Make the 'command flood' banmask follow supybot.protocols.irc.banmask. 2015-09-01 20:40:32 +02:00
Valentin Lorentz 6d60616597 Merge pull request #1161 from jacksonmj/private-user-list
Send User.list response in private
2015-08-31 15:16:25 +02:00
jacksonmj 5914499766 Change User.listInPrivate config value from global to channel-specific 2015-08-31 13:04:33 +00:00
Valentin Lorentz 69358681f7 ChannelLogger: Fix 'dictionary changed size during iteration'. 2015-08-31 08:40:30 +00:00
Valentin Lorentz c01a956a8b utils: Remove dependency on parent package. 2015-08-30 17:33:39 +02:00
jacksonmj 3b1c56bbcd User.list: add config value plugins.User.listInPrivate to force user list response to be sent in private
This prevents mass-highlights of people who use their IRC nick as their bot username.
2015-08-30 00:48:29 +00:00
James Lu dbd12e9c0c Aka: allow filtering 'list' by Aka lock status
This adds two mutually incompatible options to Aka list: --locked and --unlocked
2015-08-29 17:21:17 -07:00
Valentin Lorentz e5d8315e64 Language. 2015-08-29 21:46:47 +02:00
Valentin Lorentz 20ef13ef9f Web: Ignore SVG titles. Closes GH-1147. 2015-08-29 21:08:35 +02:00
Valentin Lorentz 576a96fb71 Web: Factorize the code of the title snarfer and the title command. 2015-08-29 21:04:38 +02:00
Valentin Lorentz 8033e6ae14 Merge pull request #1159 from jacksonmj/math
Prevent untrusted users from freezing the bot with Math.rpn, and allow factorial calculation for smaller numbers
2015-08-29 08:09:12 +02:00
jacksonmj 97c7d0a9c3 Math.calc: allow factorial for smallish numbers 2015-08-29 01:27:50 +00:00
jacksonmj 1aeb847509 Math.rpn should use _mathSafeEnv, otherwise untrusted users can freeze the bot 2015-08-29 01:26:45 +00:00
Valentin Lorentz b8f5423130 Unix: Skip tests instead of ignoring them if a dep is missing + use ls instead of ping. 2015-08-26 23:09:55 +02:00
Valentin Lorentz 4d6bd84d00 Time: skip tests if dependencies are not available. 2015-08-26 22:45:33 +02:00
Valentin Lorentz 33e8966e4b ChannelLogger & core: Use IRCv3.2 extension invite-notify if available. 2015-08-22 18:24:32 +02:00
jacksonmj 9eafe29c30 Alias: fix tests 2015-08-22 14:36:00 +00:00
jacksonmj ff4040f479 Alias: prevent "RuntimeError: dictionary changed size during iteration" for invalid aliases 2015-08-22 13:24:19 +00:00
jacksonmj f5c66afe4f Alias: add hard-coded check that alias names are valid registry names 2015-08-22 13:24:01 +00:00
jacksonmj 4507771ce7 Alias: clearer description for list command, as suggested by ProgVal 2015-08-22 12:54:06 +00:00
jacksonmj 92acea7785 Alias: refactor some of the registry access 2015-08-22 12:48:59 +00:00
jacksonmj d9b21dc5be Alias: more relaxed valid name regex (printable characters instead of "a-z0-9 and some symbols") 2015-08-22 11:37:13 +00:00
jacksonmj 963a17c817 Alias: make regex for valid alias names configurable 2015-08-22 11:37:13 +00:00
jacksonmj 54e9b4be09 Alias: add a list command to list aliases, optionally filtered by locked status
("list Alias" includes Alias plugin commands as well as aliases, and cannot be filtered by locked status)
2015-08-22 11:37:12 +00:00
jacksonmj fd53d8c410 Alias: correct unescaping of alias names when creating registry entries in Alias.__init__
Only a problem when the rules on allowed alias names were relaxed, in which case backslashes were duplicated
every time the bot restarted.

Also factor out '.' and '|' checks into needsEscaping function
2015-08-22 11:37:12 +00:00
jacksonmj 711572b5b2 Alias: fix locking and unlocking for escaped aliases 2015-08-22 11:37:12 +00:00
Valentin Lorentz d4c49d8215 Factoids: Fix help of requireVoice. Closes GH-1153. 2015-08-17 18:22:36 +02:00
Valentin Lorentz aa98d987a7 Fix imports to minisix. 2015-08-11 17:01:58 +02:00
Valentin Lorentz c3a2c800f1 Remove need for 2to3. 2015-08-11 16:50:23 +02:00
Valentin Lorentz 054953891f Web: check URL whitelist in snarfer. 2015-08-11 14:46:47 +00:00
Valentin Lorentz f305ff3c02 Remove fix_basestring. 2015-08-10 20:24:11 +02:00
Valentin Lorentz 2c380a4c3a Remove fix_xrange. 2015-08-10 19:36:07 +02:00
Valentin Lorentz 23ddfbc7e3 Filter & Google: Fix Python 3.2 compatibility. 2015-08-10 19:14:22 +02:00
Valentin Lorentz 8ad16701ce MoobotFactoids: Fix Python 3.2 support. 2015-08-10 19:02:50 +02:00
Valentin Lorentz be6bc1a734 Remove need for fix_unicode. 2015-08-10 18:52:51 +02:00
Valentin Lorentz 6ceec0c541 Web: HTMLParseError is deprecated/unused since Python 3.3 and removed in Python 3.5. 2015-08-10 18:16:02 +02:00
Valentin Lorentz 34d384bd67 Remove need for fix_methodattrs. 2015-08-10 18:09:52 +02:00
Valentin Lorentz c0ac84bb53 Remove need for fix_import, fix_types, and fix_urllib. 2015-08-10 17:55:25 +02:00
Valentin Lorentz 17bf893437 Fix imports. 2015-08-09 09:21:12 +02:00
Valentin Lorentz 5b9e07ecd2 Fix previous commit. 2015-08-09 00:47:50 +02:00
Valentin Lorentz 216c5d213f Replace sys.version_info[0] usages with minisix.PY{2,3}. 2015-08-09 00:23:03 +02:00
Valentin Lorentz 5a82cefd51 Remove use of fix_long fixer. 2015-08-08 23:08:49 +02:00
Valentin Lorentz be118c3338 Remove use of fix_dict fixer. 2015-08-08 23:08:49 +02:00
Valentin Lorentz 7d7945e719 Topic: Factorize capability checks + make requireManageCapability actually channel-specific. 2015-07-08 11:35:56 +02:00
Valentin Lorentz 1bdb9e38e3 Relay: Clarify the doc of Relay.channels.joinOnAllNetworks. Closes GH-1133. 2015-07-07 06:59:33 +00:00
Jussi Timperi 7410c1657f Google: restore test for translate 2015-07-04 03:13:53 +03:00
Jussi Timperi a6d1909bd6 Google: restore translate 2015-07-04 02:42:01 +03:00
Valentin Lorentz 451ec28163 Merge pull request #1131 from GLolol/allow-unregistered-db-add
Allow unregistered users to use 'add', 'remove', etc. in ChannelIdDatabasePlugin plugins
2015-06-28 23:54:22 +02:00
James Lu 8e51209c3f Fixes to ChannelIdDatabasePlugin as pointed out by @ProgVal
- Quote: factorize tests
- Make supybot.databases.plugins channel specific
2015-06-28 14:36:27 -07:00
James Lu 1fe663ddb2 Quote: test unauthenticated DB 'add' 2015-06-28 11:24:42 -07:00
Valentin Lorentz 9d93bc6991 Merge pull request #1124 from nyuszika7h/print-function
Add missing future imports for print_function
2015-06-13 00:49:40 +02:00
nyuszika7h 9f059b91ba Add missing future imports for print_function
There are some places where `print()` is used to print a blank line.
However, unless the future feature `print_function` is imported,
that will print `()` in Python 2.
2015-06-12 22:22:16 +02:00
nyuszika7h 59489ab560 NickCapture: Attempt NickServ release on 437 numeric 2015-06-12 15:15:54 +02:00
Valentin Lorentz 8b401249b8 Revert "ShrinkUrl plugin, add BitLy support."
This reverts commit 147cccdf6c.

I prefer not to have APIs with authentication in Limnoria's
officiel plugins, as discussed on GH-361.
2015-06-11 11:31:21 +02:00
Michael Telatynski 147cccdf6c ShrinkUrl plugin, add BitLy support.
Login+ApiKey required for it to function.
2015-06-08 17:57:13 +01:00
Valentin Lorentz 7c4a28d7fd RSS: Remove illegal characters from entries. 2015-06-01 19:32:40 +02:00
Valentin Lorentz f85395d8b1 Revert ban description-related commits.
Squashed commit of the following:

commit ea4743caa8bdc7abba99635898ae09a9497c43d3
Author: Valentin Lorentz <progval@progval.net>
Date:   Sun May 24 01:07:49 2015 +0200

    Revert "Channel & core: Add support for ban descriptions. Closes GH-1092."

    This reverts commit 6efea561a5.

    Conflicts:
    	src/ircdb.py

commit d43b9229fe926869852c4abda1da1b18a0093938
Author: Valentin Lorentz <progval@progval.net>
Date:   Sun May 24 01:06:30 2015 +0200

    Revert "Fix import of channel database."

    This reverts commit 8ed5522da0.

commit 6c453d9acb3dc37711cb4d51abd9fe216ca65c08
Author: Valentin Lorentz <progval@progval.net>
Date:   Sun May 24 01:06:27 2015 +0200

    Revert "Fix previous commit."

    This reverts commit 394f1554f7.
2015-05-24 01:08:54 +02:00
Valentin Lorentz ac0e6b86c0 RSS: Fix typo. 2015-05-23 11:48:32 +02:00
Valentin Lorentz 34138b9185 RSS: Don't crash on load if there is an invalid feed name. Closes GH-1116. 2015-05-23 11:40:26 +02:00
Valentin Lorentz cdb144f500 Fix various debuild warnings. 2015-05-20 20:56:54 +02:00
Michael Telatynski 2334b54792 Add ser_berry's Repository to PluginDownloader 2015-05-19 20:50:40 +01:00
Valentin Lorentz 10a9bc578b Owner: Don't crash on "upkeep high" on Python 3.
Python 3's except statement removes the need for sys.exc_clear,
see https://www.python.org/dev/peps/pep-3100/
2015-05-19 19:10:00 +02:00
Valentin Lorentz 5952b486f5 Later: Don't make Misc raise AssertionErrors. 2015-05-19 00:50:34 +02:00
James Lu 97228afb7d Aka.search: be case insensitive and handle "not found" errors correctly
Closes #1110.
2015-05-18 14:53:30 -07:00
Valentin Lorentz 7e1634f085 PluginDownloader: Add t3chguy's repo. 2015-05-18 15:24:18 +02:00
Valentin Lorentz db09100772 GPG: Fix previous commit. 2015-05-18 13:01:12 +02:00
Valentin Lorentz c6697350b3 GPG: Create plugin by moving code from User. 2015-05-18 12:38:18 +02:00
James Lu 24c1caac43 Praise: make tests channel specific
This should fix build errors in Travis CI.
(cherry picked from commit 8dc2996e3597e6a641be089188816b44505366c5)
2015-05-15 17:04:03 -07:00
Valentin Lorentz b405f998a5 NickAuth: Add support for account-tag (not tested). 2015-05-15 20:46:18 +02:00
Valentin Lorentz 59d542bb70 NickCapture & core: Add support for MONITOR. Closes GH-842. 2015-05-15 19:24:24 +02:00
Valentin Lorentz ed37fb6646 String & core: Add support for G flag in matchers. Closes GH-1072. 2015-05-15 16:48:00 +02:00
Valentin Lorentz 487f8c8af5 Merge remote-tracking branch 'supybot/master' into testing
Conflicts:
	.mailmap
	README
	docs/FAQ.rst
	plugins/Ctcp/plugin.py
	plugins/Misc/plugin.py
	plugins/Network/plugin.py
	plugins/QuoteGrabs/plugin.py
	plugins/RSS/README.txt
	plugins/Relay/plugin.py
	plugins/ShrinkUrl/config.py
	plugins/ShrinkUrl/plugin.py
	plugins/ShrinkUrl/test.py
	setup.py
	src/callbacks.py
	src/commands.py
	src/conf.py
	test/test_commands.py
2015-05-15 14:41:08 +02:00
Valentin Lorentz 6efea561a5 Channel & core: Add support for ban descriptions. Closes GH-1092. 2015-05-15 13:43:26 +02:00
Valentin Lorentz a81d3ddae6 Web: add option for having titlesnarfer immune to defaultignore. Closes GH-1101 2015-05-15 12:39:30 +02:00
Valentin Lorentz 2008956968 RSS: Reove broken (and probably irrelevant) link in the README. 2015-05-10 09:57:11 +00:00
James Lu 308eea922e Aka: add a 'search' command.
Closes ProgVal/Limnoria#1081.
2015-04-26 22:20:24 -07:00
Valentin Lorentz a7b1e65bd9 AutoMode: Set supybot.plugins.AutoMode.alternativeCapabilities to True by default. 2015-04-22 09:25:38 +02:00
Valentin Lorentz f293cfaeda ShrinkUrl: Remove goo.gl (buggy) and fix tests. 2015-04-19 12:56:39 +02:00