*** slaweq has joined #openstack-release | 00:10 | |
*** slaweq has quit IRC | 00:15 | |
*** slaweq has joined #openstack-release | 00:19 | |
*** tosky has quit IRC | 00:22 | |
*** slaweq has quit IRC | 00:24 | |
*** slaweq has joined #openstack-release | 00:37 | |
*** slaweq has quit IRC | 00:42 | |
*** slaweq has joined #openstack-release | 00:44 | |
*** slaweq has quit IRC | 00:48 | |
*** slaweq has joined #openstack-release | 00:50 | |
*** slaweq has quit IRC | 00:55 | |
*** slaweq has joined #openstack-release | 00:56 | |
*** slaweq has quit IRC | 01:01 | |
*** slaweq has joined #openstack-release | 01:02 | |
*** slaweq has quit IRC | 01:13 | |
*** slaweq has joined #openstack-release | 01:16 | |
*** slaweq has quit IRC | 01:21 | |
*** slaweq has joined #openstack-release | 01:27 | |
*** slaweq has quit IRC | 01:32 | |
*** dave-mccowan has joined #openstack-release | 01:34 | |
*** dave-mccowan has quit IRC | 01:42 | |
*** armax has quit IRC | 01:48 | |
*** tetsuro_ has joined #openstack-release | 01:50 | |
*** slaweq has joined #openstack-release | 01:50 | |
*** tetsuro has quit IRC | 01:52 | |
*** ricolin has joined #openstack-release | 01:55 | |
*** slaweq has quit IRC | 01:55 | |
*** slaweq has joined #openstack-release | 01:58 | |
*** slaweq has quit IRC | 02:10 | |
*** slaweq has joined #openstack-release | 02:22 | |
*** slaweq has quit IRC | 02:30 | |
*** slaweq has joined #openstack-release | 02:30 | |
*** slaweq has quit IRC | 02:35 | |
*** slaweq has joined #openstack-release | 02:47 | |
*** slaweq has quit IRC | 02:52 | |
*** udesale has joined #openstack-release | 03:53 | |
*** armax has joined #openstack-release | 03:59 | |
*** armax has quit IRC | 04:10 | |
*** udesale has quit IRC | 06:15 | |
*** udesale has joined #openstack-release | 06:16 | |
*** lpetrut has quit IRC | 06:21 | |
*** slaweq has joined #openstack-release | 06:39 | |
*** udesale has quit IRC | 06:39 | |
*** udesale has joined #openstack-release | 06:39 | |
*** slaweq has quit IRC | 06:44 | |
*** pcaruana has joined #openstack-release | 07:27 | |
*** tosky has joined #openstack-release | 07:31 | |
*** rpittau|afk is now known as rpittau | 08:20 | |
*** hberaud|gone is now known as hberaud | 08:41 | |
*** slaweq has joined #openstack-release | 08:44 | |
*** priteau has joined #openstack-release | 09:03 | |
*** ricolin has quit IRC | 09:22 | |
openstackgerrit | Dougal Matthews proposed openstack/releases master: Feature release for Mistral Rocky https://review.opendev.org/695375 | 09:24 |
---|---|---|
*** priteau has quit IRC | 10:07 | |
openstackgerrit | Merged openstack/releases master: Fix ssh host addr link. https://review.opendev.org/695162 | 10:07 |
*** e0ne has joined #openstack-release | 10:10 | |
openstackgerrit | Merged openstack/releases master: Drop the "estimated" if date is "TBD" https://review.opendev.org/694961 | 10:11 |
openstackgerrit | Merged openstack/releases master: Mark queens as extended maintainance https://review.opendev.org/694962 | 10:11 |
*** priteau has joined #openstack-release | 10:12 | |
openstackgerrit | Merged openstack/releases master: Change horizon release model to cycle-with-intermediary https://review.opendev.org/694772 | 10:14 |
*** d0ugal has joined #openstack-release | 10:15 | |
d0ugal | ttx: thanks for looking at the mistral releases. I wasn't sure what to do as I found lots ofunreleased changed in the stable branches | 10:16 |
d0ugal | I asked Renat to take a look | 10:16 |
openstackgerrit | Merged openstack/releases master: Release horizon 17.0.0 (ussuri) https://review.opendev.org/694777 | 10:17 |
openstackgerrit | Merged openstack/releases master: Release rally 2.1.0 https://review.opendev.org/694983 | 10:20 |
openstackgerrit | Merged openstack/releases master: Bugfix release for Mistral Train https://review.opendev.org/694781 | 10:20 |
*** dtantsur|afk is now known as dtantsur | 10:49 | |
*** hberaud is now known as hberaud|lunch | 11:02 | |
*** rpittau is now known as rpittau|bbl | 11:11 | |
*** udesale has quit IRC | 11:14 | |
*** hberaud|lunch is now known as hberaud | 12:13 | |
*** ricolin has joined #openstack-release | 12:27 | |
*** tetsuro_ has quit IRC | 12:29 | |
*** slaweq has quit IRC | 12:39 | |
*** olivierbourdon38 has joined #openstack-release | 12:56 | |
*** ekcs has joined #openstack-release | 12:58 | |
*** olivierbourdon38 has quit IRC | 12:58 | |
*** ekcs has quit IRC | 13:08 | |
*** rpittau|bbl is now known as rpittau | 13:12 | |
*** slaweq has joined #openstack-release | 13:17 | |
*** armax has joined #openstack-release | 13:23 | |
openstackgerrit | Dmitriy Rabotyagov (noonedeadpunk) proposed openstack/releases master: Release OpenStack-Ansible Rocky https://review.opendev.org/695433 | 13:37 |
*** udesale has joined #openstack-release | 13:37 | |
openstackgerrit | Dmitriy Rabotyagov (noonedeadpunk) proposed openstack/releases master: Release OpenStack-Ansible Stein https://review.opendev.org/695438 | 13:47 |
*** tosky_ has joined #openstack-release | 14:31 | |
*** tosky has quit IRC | 14:32 | |
*** jtomasek has quit IRC | 14:32 | |
*** tosky_ is now known as tosky | 14:33 | |
*** hberaud has quit IRC | 14:34 | |
*** jtomasek has joined #openstack-release | 14:35 | |
*** hberaud has joined #openstack-release | 14:42 | |
*** tosky has quit IRC | 14:54 | |
*** tosky has joined #openstack-release | 14:57 | |
*** pcaruana has quit IRC | 15:02 | |
*** pcaruana has joined #openstack-release | 15:20 | |
*** priteau has quit IRC | 15:23 | |
openstackgerrit | Thierry Carrez proposed openstack/releases master: Introduce tool to check PTL/liaison approval https://review.opendev.org/695457 | 15:25 |
openstackgerrit | Ben Nemec proposed openstack/releases master: Oslo releases for 2019-11-18 https://review.opendev.org/694844 | 15:30 |
*** jtomasek has quit IRC | 15:38 | |
ttx | why does flake8 hate me | 15:44 |
*** priteau has joined #openstack-release | 15:51 | |
*** mlavalle has joined #openstack-release | 15:53 | |
evrardjp | why don't you check before proposing patches? :p | 15:57 |
evrardjp | oh wait you mean "it's not you it's me" flake8 hate? | 15:58 |
*** smcginnis_ has joined #openstack-release | 15:59 | |
smcginnis_ | #startmeeting releaseteam | 16:00 |
openstack | Meeting started Thu Nov 21 16:00:11 2019 UTC and is due to finish in 60 minutes. The chair is smcginnis_. Information about MeetBot at http://wiki.debian.org/MeetBot. | 16:00 |
openstack | Useful Commands: #action #agreed #help #info #idea #link #topic #startvote. | 16:00 |
*** openstack changes topic to " (Meeting topic: releaseteam)" | 16:00 | |
openstack | The meeting name has been set to 'releaseteam' | 16:00 |
hberaud | o/ | 16:00 |
smcginnis_ | Ping ttx armstrong diablo_rojo, diablo_rojo_phon | 16:00 |
smcginnis_ | o/ hberaud | 16:00 |
smcginnis_ | #link https://etherpad.openstack.org/p/ussuri-relmgt-tracking Agenda | 16:00 |
ttx | o/ | 16:00 |
smcginnis_ | I'm guessing it will just be us, so I'll get going. | 16:01 |
smcginnis_ | Light agenda anyway. | 16:01 |
smcginnis_ | #topic Stuck reviews | 16:02 |
*** openstack changes topic to "Stuck reviews (Meeting topic: releaseteam)" | 16:02 | |
smcginnis_ | #link https://review.opendev.org/#/c/694297/ | 16:02 |
smcginnis_ | ttx: I think this is probably long enough - I can just approve. | 16:02 |
ttx | ack | 16:02 |
smcginnis_ | No one has commented with issues. And it's just a process doc update that we can easily update. | 16:03 |
ttx | evrardjp: well my check used a modern flake8 which does not have a bug with f-strings | 16:03 |
ttx | Granted I should have tested with the pre-2016 one OpenStack uses | 16:03 |
*** mlavalle has quit IRC | 16:03 | |
smcginnis_ | Which check is that? | 16:04 |
* fungi is around, not that it probably helps ;) | 16:04 | |
smcginnis_ | fungi: It always helps to have you around. :) | 16:04 |
evrardjp | o/ | 16:04 |
*** udesale has quit IRC | 16:04 | |
ttx | flake8 not happy with my use of f-strings in https://review.opendev.org/695457 failing with AttributeError: 'FlakesChecker' object has no attribute 'JOINEDSTR' | 16:04 |
evrardjp | oh sorry it seems I have missed that patch | 16:05 |
ttx | I'm trying to find a solution that does not involve me rewriting all my f-strings | 16:05 |
ttx | because I like f-strings | 16:05 |
fungi | that sounds like a flake8 bug? | 16:05 |
ttx | fungi: yes, long fixed | 16:06 |
fungi | ahh | 16:06 |
fungi | we're just pinned to an old version? any reason not to update? | 16:06 |
ttx | I suspect there is a very good reason not to update | 16:06 |
smcginnis_ | We can probably try updating and see if anything breaks. | 16:07 |
evrardjp | could we just try? | 16:07 |
evrardjp | haha | 16:07 |
evrardjp | I like your style smcginnis_ | 16:07 |
ttx | which is why I was trying to workaround the failure by tweaking my code, but nothing short of removing my f-strings seems to work :) | 16:07 |
smcginnis_ | I think in other projects it highlighted some new issues, but easy enough to fix things up. | 16:07 |
smcginnis_ | evrardjp: ;) | 16:07 |
fungi | ideally you can just add exclusions in tox.ini for any new checks which they added and solve them later (or not) | 16:07 |
smcginnis_ | We shouldn't need to support <3.6, so no reason we shouldn't take advantage of newer functionality. | 16:07 |
smcginnis_ | True | 16:07 |
ttx | Having trouble to see where that pin is | 16:08 |
evrardjp | (also I think of the joke on style for a flake8 failure is priceless) | 16:08 |
ttx | probably https://opendev.org/openstack/hacking/src/branch/master/requirements.txt#L6 | 16:08 |
smcginnis_ | I thought we stopped using global-requirements for releases since we don't need to be coinstallable with other OpenStack services. | 16:09 |
fungi | this is the time in the cycle where everyone should be up-revving static analysis tools anyway | 16:09 |
ttx | Fix is in flake8 1.3.1 / 1.4.0 https://github.com/PyCQA/pyflakes/pull/80 | 16:09 |
smcginnis_ | fungi: ++ | 16:09 |
evrardjp | fungi: agreed | 16:09 |
*** mlavalle has joined #openstack-release | 16:09 | |
smcginnis_ | We could propose a requirements update. | 16:09 |
evrardjp | bump to latest, see what fails? | 16:09 |
ttx | smcginnis_: it does not appear in requirements. Only in hacking deps | 16:09 |
smcginnis_ | Especially as others may start wanting to use 3.6+ functionality. | 16:09 |
smcginnis_ | Ah | 16:10 |
ttx | oh well, let's not derail the meetnig | 16:10 |
smcginnis_ | Seems like there are just some things to work through. | 16:10 |
smcginnis_ | It's not super time critical, so my preference would be to get things moving forward. | 16:11 |
evrardjp | ttx: derailing would be to drop hacking to support black instead | 16:11 |
smcginnis_ | No!! :D | 16:11 |
evrardjp | sorry! :p | 16:11 |
evrardjp | anyway... | 16:11 |
fungi | #link https://review.opendev.org/520377 it's been almost 2 years since openstack updated their use of flake8 | 16:11 |
ttx | ouch | 16:11 |
fungi | looong overdue | 16:12 |
smcginnis_ | Time to get up to date I think. | 16:12 |
ttx | Just tried upgrading to latest flake8 and it's.... noisy | 16:12 |
fungi | yeah, blacklist checks in tox.ini and worry about them later | 16:12 |
smcginnis_ | I would expect a little cleanup work, but nothing serious. | 16:12 |
ttx | like it reports about 40 issues in releases (in other code) when I try to run the current version | 16:12 |
smcginnis_ | Wow. | 16:13 |
smcginnis_ | I like fungi's plan. Let's just blacklist some checks to start, then cleanup things as we go. | 16:13 |
ttx | W504 line break after binary operator looks like a favorite | 16:13 |
smcginnis_ | I like that one. ;) | 16:13 |
ttx | W605 invalid escape sequence too | 16:13 |
ttx | like wtf | 16:14 |
ttx | ./openstack_releases/tests/fixtures.py:41:44: W605 invalid escape sequence '\s' | 16:14 |
ttx | gnupg_version_re = re.compile('^gpg\s.*\s([\d+])\.([\d+])\.([\d+])') | 16:14 |
smcginnis_ | Just need to make it a raw string. | 16:14 |
fungi | in my opinion, most style checks are predominantly wtf territory, but my opinion is not a common one it seems | 16:14 |
smcginnis_ | We've had to fix a lot of other places where those have been generating deprecation warnings. | 16:14 |
smcginnis_ | I few of the checks at least are early warning signs for future issues | 16:15 |
fungi | gnupg_version_re = re.compile(r'^gpg\s.*\s([\d+])\.([\d+])\.([\d+])') | 16:15 |
smcginnis_ | Anyway... | 16:15 |
fungi | but yeah | 16:15 |
smcginnis_ | Any other, any other reviews we should highlight? | 16:15 |
smcginnis_ | Lag is killing me. :D | 16:16 |
smcginnis_ | OK | 16:16 |
smcginnis_ | #topic Review days | 16:16 |
*** openstack changes topic to "Review days (Meeting topic: releaseteam)" | 16:16 | |
openstackgerrit | Merged openstack/releases master: Update process for R+1 week https://review.opendev.org/694297 | 16:16 |
smcginnis_ | We probably should have discussed this at the PTG. | 16:16 |
smcginnis_ | Anyone want to update or change review days? | 16:16 |
smcginnis_ | ttx: Seems like Monday's have been good review days for you. | 16:17 |
ttx | My review day is Thursday | 16:18 |
ttx | I'm doing Mondays when nobody else does :) | 16:18 |
evrardjp | I will be less active, as I said. | 16:18 |
evrardjp | I am currently listed on Wednesday, and I am trying my best. | 16:18 |
smcginnis_ | Any reviews are appreciated. | 16:19 |
smcginnis_ | Very appreciated. | 16:19 |
evrardjp | yeah please ping if urgent things, I probably won't have that much of a look as I used to | 16:19 |
smcginnis_ | +1 | 16:19 |
evrardjp | (end also end of year holidays are early for me, so... just ping.) | 16:20 |
smcginnis_ | Well, if anyone wants to change their review day, feel free to update the etherpad. | 16:20 |
smcginnis_ | I just try to take a look whenever I can, so any day I am down for can be switched if anyone else wants that day. | 16:20 |
smcginnis_ | I think it's hard for all of us right now to declare a designated day to do reviews. | 16:21 |
smcginnis_ | So best effort by everyone is appreciated. | 16:21 |
evrardjp | thanks for being understanding | 16:21 |
smcginnis_ | It's just the new reality. ;) | 16:22 |
smcginnis_ | #topic AOB | 16:22 |
*** openstack changes topic to "AOB (Meeting topic: releaseteam)" | 16:22 | |
smcginnis_ | ttx: We don't have a countdown email yet, right? | 16:22 |
* smcginnis_ looks | 16:22 | |
smcginnis_ | OK, yeah. Next one the week before milestone 1. | 16:23 |
ttx | yes | 16:23 |
smcginnis_ | Other than that, I think we've gotten all caught up with -em tagging and stable reviews. | 16:24 |
smcginnis_ | At least last I checked the review dashboard. | 16:24 |
smcginnis_ | Nice to finally see that dashboard down to a smaller list again. | 16:24 |
ttx | \o/ | 16:24 |
smcginnis_ | Thanks team for getting those through. | 16:25 |
smcginnis_ | I don't really have anything else. Anyone got anything? | 16:25 |
fungi | nothing coming up infra-wise which needs warning | 16:26 |
smcginnis_ | That's good. | 16:26 |
smcginnis_ | Hopefully a quiet time for infra too. | 16:26 |
fungi | i hope so ;) | 16:26 |
evrardjp | I had a question for fungi for signing releases and rotation of gpg keys relatively to intermediary -- that can wait for the end of the meeting | 16:26 |
smcginnis_ | Alright, guess I'll end it. Suppose I should get to keynotes. | 16:27 |
smcginnis_ | Thanks everyone. All your work is very appreciated. | 16:28 |
evrardjp | haha enjoy smcginnis_! | 16:28 |
fungi | thanks smcginnis_! | 16:28 |
smcginnis_ | #endmeeting | 16:28 |
*** openstack changes topic to "OpenStack Release Managers office - Come here to discuss how to release OpenStack components - Logged at http://eavesdrop.openstack.org/irclogs/%23openstack-release/" | 16:28 | |
openstack | Meeting ended Thu Nov 21 16:28:13 2019 UTC. Information about MeetBot at http://wiki.debian.org/MeetBot . (v 0.1.4) | 16:28 |
openstack | Minutes: http://eavesdrop.openstack.org/meetings/releaseteam/2019/releaseteam.2019-11-21-16.00.html | 16:28 |
openstack | Minutes (text): http://eavesdrop.openstack.org/meetings/releaseteam/2019/releaseteam.2019-11-21-16.00.txt | 16:28 |
openstack | Log: http://eavesdrop.openstack.org/meetings/releaseteam/2019/releaseteam.2019-11-21-16.00.log.html | 16:28 |
fungi | evrardjp: it's a thoroughly documented process, i'll get you a link, just a sec... | 16:28 |
evrardjp | yeah it's a question | 16:28 |
evrardjp | not about the process | 16:28 |
evrardjp | I suppose you are talkiung about https://docs.openstack.org/infra/system-config/signing.html | 16:28 |
fungi | oh, yep. what was the question then? | 16:29 |
evrardjp | my concern is about early projects in cycle (for example the c-w-i released early in the cycle) or late projects (cycle-trailing projects) | 16:29 |
evrardjp | how do we ensure they are done with the right keys ? | 16:29 |
fungi | we don't. the keys are (roughly) tied to a specific time period, not a set of deliverables | 16:30 |
evrardjp | ok | 16:30 |
evrardjp | maybe having x Cycle key here https://releases.openstack.org/#cryptographic-signatures is misleading | 16:30 |
fungi | which is why we tie them to development cycles rather than releases | 16:30 |
evrardjp | the dates though are correct | 16:30 |
fungi | "key is created corresponding to each development cycle" | 16:31 |
evrardjp | maybe it's just me being overly pedantic, but I wasn't sure it was only linked with date not with the set of deliverables, as I thought deliverables -> cycle | 16:31 |
fungi | so the train releases of cycle-trailing projects happen early in the ussuri cycle, and therefore use the ussuri cycle key | 16:31 |
evrardjp | yeah correct that was my confusion | 16:32 |
evrardjp | but I think it's fine | 16:32 |
evrardjp | it was just to make sure that it was okay | 16:32 |
evrardjp | sorry for me being overly cautious :) | 16:32 |
evrardjp | it's all about the message | 16:32 |
fungi | which is why we consider them to be cycle-trailing (their releases trail the cycle to which they correspond, rather than happening during or at the end of the cycle) | 16:32 |
evrardjp | do you mean it's my knowledge of the language of Shakespeare which is holding me back? :p | 16:33 |
evrardjp | (joking!) | 16:34 |
evrardjp | anyway, good, it's settled! thanks for clarifications | 16:34 |
fungi | anyway, the plan going forward for opendev is to provide annual keys instead, as a project-agnostic means of offering provenance attestation for artifacts built in it | 16:34 |
fungi | per-project keys are still possible, but would be on those projects to manage themselves | 16:34 |
evrardjp | project as openstack project, or zuul tenant? | 16:34 |
fungi | project as anyone whose software is hosted in opendev | 16:34 |
evrardjp | got it | 16:35 |
fungi | could even be things which aren't osf-supported projects but happen to be in opendev anyway | 16:35 |
fungi | anyway, there are some prerequisite tasks to tackle before we start doing generic opendev signing keys, so it may not happen for 2020 depending on how much time i find | 16:36 |
fungi | mostly logistical things like having a general opendev contact e-mail, and thus adding a place to host that which isn't itself in some proprietary service | 16:37 |
smcginnis_ | That sounds like a good plan. | 16:39 |
*** ricolin has quit IRC | 16:39 | |
fungi | yeah, if you check out the current key management process as written, it doesn't ultimately require special access and could be performed anywhere | 16:40 |
fungi | all that zuul needs is an unencrypted export of a private signing subkey reencrypted as a zuul secret | 16:41 |
fungi | so anyone could do that for any signing keys they wanted a job to use | 16:41 |
fungi | most of the logistical challenges around key management belong to the folks who are generating and vetting the master keys | 16:42 |
fungi | as opendev doesn't have an access-controlled space for them to coordinate that | 16:43 |
fungi | so they'd need to work out a solution suitable for their team, which likely differs from team to team anyway | 16:43 |
*** _mlavalle_1 has joined #openstack-release | 16:49 | |
*** mlavalle has quit IRC | 16:52 | |
*** armstrong_ has joined #openstack-release | 16:54 | |
openstackgerrit | Thierry Carrez proposed openstack/releases master: Introduce tool to check PTL/liaison approval https://review.opendev.org/695457 | 16:56 |
*** e0ne has quit IRC | 16:56 | |
*** rpittau is now known as rpittau|afk | 17:06 | |
*** dtantsur is now known as dtantsur|afk | 17:10 | |
ttx | I bailed and reverted to %s-format ^ | 17:13 |
ttx | But I raised the thread to -discuss since it's likely to come back... | 17:13 |
*** priteau has quit IRC | 17:20 | |
*** priteau has joined #openstack-release | 17:22 | |
*** priteau has quit IRC | 17:22 | |
*** pcaruana has quit IRC | 17:51 | |
*** hberaud is now known as hberaud|lunch | 18:03 | |
*** weshay is now known as weshay|ruck | 18:08 | |
*** pcaruana has joined #openstack-release | 18:14 | |
*** armax has quit IRC | 18:20 | |
*** tosky has quit IRC | 18:29 | |
*** gmann is now known as gmann_afk | 18:38 | |
*** pcaruana has quit IRC | 18:42 | |
*** smcginnis_ has quit IRC | 18:58 | |
*** armax has joined #openstack-release | 19:01 | |
*** pcaruana has joined #openstack-release | 19:06 | |
*** armstrong_ has quit IRC | 19:41 | |
*** openstackstatus has quit IRC | 19:50 | |
*** dtroyer has quit IRC | 19:50 | |
*** dtroyer has joined #openstack-release | 19:51 | |
*** smcginnis_ has joined #openstack-release | 19:51 | |
*** openstackstatus has joined #openstack-release | 19:51 | |
*** ChanServ sets mode: +v openstackstatus | 19:51 | |
*** ianw has quit IRC | 20:20 | |
*** ianw has joined #openstack-release | 20:27 | |
*** e0ne has joined #openstack-release | 20:36 | |
*** gmann_afk is now known as gmann | 20:45 | |
*** openstack has joined #openstack-release | 21:15 | |
*** ChanServ sets mode: +o openstack | 21:15 | |
*** dave-mccowan has joined #openstack-release | 21:21 | |
*** pcaruana has quit IRC | 21:25 | |
*** e0ne has quit IRC | 21:33 | |
*** e0ne has joined #openstack-release | 22:29 | |
*** e0ne has quit IRC | 22:30 | |
*** tosky has joined #openstack-release | 22:35 | |
*** lennyb has joined #openstack-release | 22:41 | |
*** slaweq has quit IRC | 23:17 | |
*** slaweq has joined #openstack-release | 23:26 | |
*** slaweq has quit IRC | 23:32 | |
*** slaweq has joined #openstack-release | 23:35 | |
*** slaweq has quit IRC | 23:40 | |
*** slaweq has joined #openstack-release | 23:44 | |
*** slaweq has quit IRC | 23:48 |
Generated by irclog2html.py 2.15.3 by Marius Gedminas - find it at mg.pov.lt!