CSS : Various of modifications and several fixes;

Python : Improve caching system;
Python : Support XEP-0292: vCard4 Over XMPP (Thank you. Marvin W);
SVG    : Add new icons, including characters as temporary placeholders (Thank you. Tigase);
TOML   : Add more systems and modify properties of clients;
XHTML  : Improve design and add a new page of extended vcard.
This commit is contained in:
Schimon Jehudah, Adv. 2024-10-30 22:04:05 +02:00
parent 8675f295e6
commit 373b7b1f05
24 changed files with 2980 additions and 372 deletions

View file

@ -15,43 +15,46 @@
title = "Aparté" title = "Aparté"
about = """ about = """
Simple XMPP console client written in Rust and inspired by Profanity. Simple XMPP console client written in Rust and inspired by Profanity.
It supports OMEMO and can display images thanks to sixel.
""" """
posix = "https://github.com/paulfariello/aparte/releases" posix = "https://github.com/paulfariello/aparte/releases"
properties = ["chat", "console", "desktop", "featured"] properties = ["chat", "console", "desktop", "featured", "omemo"]
resources = [ resources = [
{ url = "xmpp:aparte@conference.fariello.eu?join", txt = "Support group chat" },
{ url = "https://github.com/paulfariello/aparte", txt = "Project repository" }, { url = "https://github.com/paulfariello/aparte", txt = "Project repository" },
] ]
#[atalk] [atalk]
#title = "aTalk" title = "aTalk"
#about = """ about = """
#XMPP/Jabber client with encrypted instant messaging and video calls. XMPP/Jabber client with encrypted instant messaging and video calls.
## #
#An encrypted instant messaging with video call and GPS features for Divest OS. An encrypted instant messaging with video call and GPS features for Divest OS.
#""" """
#android = "https://f-droid.org/packages/org.atalk.android/" android = "https://f-droid.org/packages/org.atalk.android/"
#properties = ["chat", "fdroid", "graphical", "mobile", "omemo", "otr", "zrtp"] properties = ["chat", "fdroid", "graphical", "mobile", "omemo", "otr", "zrtp"]
#resources = [ resources = [
# { url = "https://f-droid.org/en/packages/org.atalk.android", txt = "F-Droid package" }, { url = "https://f-droid.org/en/packages/org.atalk.android", txt = "F-Droid package" },
# { url = "https://atalk.sytes.net/atalk/", txt = "Project homepage" }, { url = "https://atalk.sytes.net/atalk/", txt = "Project homepage" },
#] ]
#[beagle] [beagle]
#title = "Beagle" title = "Beagle"
#about = """ about = """
#Beagle IM by Tigase, Inc. is a lightweight and powerful XMPP client for macOS. Beagle IM by Tigase, Inc. is a lightweight and powerful XMPP client for macOS.
#
#It provides an easy way to start using XMPP protocol (formelly known as \ It provides an easy way to start using XMPP protocol (formelly known as \
#Jabber) if you've never used it before. Jabber) if you've never used it before.
#
#Veterans of the protocol will find many features with which they are familiar \ Veterans of the protocol will find many features with which they are familiar \
#and a few enhancements. and a few enhancements.
#""" """
#apple = "https://beagle.im/#about" apple = "https://beagle.im/#about"
#properties = ["chat", "desktop", "graphical", "omemo"] properties = ["chat", "desktop", "graphical", "omemo"]
#resources = [ resources = [
# { url = "https://beagle.im", txt = "Project homepage" }, { url = "https://beagle.im", txt = "Project homepage" },
#] ]
[blabber] [blabber]
title = "blabber.im" title = "blabber.im"
@ -68,50 +71,50 @@ resources = [
{ url = "https://blabber.im", txt = "Project homepage" }, { url = "https://blabber.im", txt = "Project homepage" },
] ]
#[bruno] [bruno]
#title = "Bruno" title = "Bruno"
#about = """ about = """
#Bruno is the cutest Jabber/XMPP Instant Messaging (IM) app available. It is a \ Bruno is the cutest Jabber/XMPP Instant Messaging (IM) app available. It is a \
#themed version of the open source yaxim app. themed version of the open source yaxim app.
#
#You can use Bruno if the other IM apps are just not stylish enough.
#"""
#android = "https://yaxim.org/download/"
#properties = ["chat", "graphical", "mobile"]
#resources = [
# { url = "https://yaxim.org/bruno/", txt = "Project homepage" },
#]
#[candy] You can use Bruno if the other IM apps are just not stylish enough.
#title = "Candy" """
#about = """ android = "https://yaxim.org/download/"
#A JavaScript-based multi-user chat client. properties = ["chat", "graphical", "mobile"]
# resources = [
#There are plenty of HTML-based chat clients out there. Most of them are built \ { url = "https://yaxim.org/bruno/", txt = "Project homepage" },
#to emulate your instant messenger. They offer you tons of settings. They can \ ]
#join multiple networks, let you edit your profile, and even manage your \
#message history.
#
#Candy is different. It is built for your community.
#"""
#browser = "http://candy-chat.github.io/candy/"
#properties = ["chat", "desktop", "graphical", "mobile"]
#resources = [
# { url = "http://candy-chat.github.io/candy/", txt = "Project homepage" },
#]
#[chat-o-matic] [candy]
#title = "Chat-O-Matic" title = "Candy"
#about = """ about = """
#A multi-protocol chat program for Haiku A JavaScript-based multi-user chat client.
#
#Protocols natively supported include IRC and XMPP. There are plenty of HTML-based chat clients out there. Most of them are built \
#""" to emulate your instant messenger. They offer you tons of settings. They can \
#haiku = "https://github.com/JadedCtrl/Chat-O-Matic/releases" join multiple networks, let you edit your profile, and even manage your \
#properties = ["chat", "desktop", "graphical"] message history.
#resources = [
# { url = "https://github.com/JadedCtrl/Chat-O-Matic", txt = "Project homepage" }, Candy is different. It is built for your community.
#] """
browser = "http://candy-chat.github.io/candy/"
properties = ["chat", "desktop", "graphical", "mobile"]
resources = [
{ url = "http://candy-chat.github.io/candy/", txt = "Project homepage" },
]
[chat-o-matic]
title = "Chat-O-Matic"
about = """
A multi-protocol chat program for Haiku
Protocols natively supported include IRC and XMPP.
"""
haiku = "https://github.com/JadedCtrl/Chat-O-Matic/releases"
properties = ["chat", "desktop", "graphical"]
resources = [
{ url = "https://github.com/JadedCtrl/Chat-O-Matic", txt = "Project homepage" },
]
[chatsecure] [chatsecure]
title = "ChatSecure" title = "ChatSecure"
@ -194,33 +197,73 @@ resources = [
{ url = "https://conversejs.org", txt = "Project homepage" }, { url = "https://conversejs.org", txt = "Project homepage" },
] ]
#[coyim] [convo]
#title = "CoyIM" title = "Convo"
#about = """ about = """
#CoyIM is a standalone chat client for computers that focuses on safety and \ A Jabber/XMPP client for Project Pris / GerdaOS and KaiOS devices.
#security.
# Convo is a basic XMPP messaging client for KaiOS which supports sending of \
#It is a self-contained program that is safe from the moment it starts up. messages to existing contacts and joining to existing groupchats.
#
#CoyIM only supports one chat protocol - XMPP (sometimes known as Jabber). The app is a bit limited on its own, but works well along with a companion \
# desktop app.
#When creating CoyIM, we carefully evaluate and pick the features that are \
#necessary to create a good chat experience, while keeping the attack surface \ Convo is still at the state of "work in progress" and is currently under \
#of the system to a minimum. development.
# """
#At the same time, we want CoyIM to be part of an open ecosystem. You will not \ kaios = "https://git.disroot.org/badrihippo/convo/releases"
#be locked in by using CoyIM. You can talk to people using other XMPP and OTR \ properties = ["chat", "featured", "graphical", "mobile"]
#clients as well. CoyIM also allows you to use accounts you have already \ resources = [
#created with other software. { url = "bhackers:Convo", txt = "Install via the BananaHackers store" },
#""" { url = "https://store.bananahackers.net/#Convo", txt = "BananaHackers store package" },
#apple = "https://coy.im/#download-section" { url = "xmpp:convo@chat.disroot.org?join", txt = "Support group chat" },
#linux = "https://coy.im/#download-section" { url = "https://git.disroot.org/badrihippo/convo", txt = "Project repository" },
#windows = "https://coy.im/#download-section" ]
#properties = ["chat", "desktop", "graphical", "otr"]
#resources = [ [coyim]
# { url = "https://github.com/coyim/coyim", txt = "Project repository" }, title = "CoyIM"
# { url = "https://coy.im", txt = "Project homepage" }, about = """
#] CoyIM is a standalone chat client for computers that focuses on safety and \
security.
It is a self-contained program that is safe from the moment it starts up.
CoyIM only supports one chat protocol - XMPP (sometimes known as Jabber).
When creating CoyIM, we carefully evaluate and pick the features that are \
necessary to create a good chat experience, while keeping the attack surface \
of the system to a minimum.
At the same time, we want CoyIM to be part of an open ecosystem. You will not \
be locked in by using CoyIM. You can talk to people using other XMPP and OTR \
clients as well. CoyIM also allows you to use accounts you have already \
created with other software.
"""
apple = "https://coy.im/#download-section"
bsd = "https://www.freshports.org/net-im/coyim/"
linux = "https://coy.im/#download-section"
windows = "https://coy.im/#download-section"
properties = ["chat", "desktop", "graphical", "otr"]
resources = [
{ url = "https://github.com/coyim/coyim", txt = "Project repository" },
{ url = "https://coy.im", txt = "Project homepage" },
]
[dergchat]
title = "Dergchat"
about = """
Dergchat is a small chat client for the XMPP protocol. It is written in Rust, \
based on xmpp-rs and Dioxus.
Please note: this app is not really in a usable state. Do not try to use this \
at the moment.
"""
linux = "https://codeberg.org/Mizah/Dergchat"
properties = ["chat", "desktop", "graphical"]
resources = [
{ url = "xmpp:dergchat@conference.mizah.xyz?join", txt = "Support group chat" },
{ url = "https://codeberg.org/Mizah/Dergchat", txt = "Project repository" },
]
[dino] [dino]
title = "Dino" title = "Dino"
@ -236,6 +279,7 @@ notifications.
Dino fetches history from the server and synchronizes messages with other \ Dino fetches history from the server and synchronizes messages with other \
services. services.
""" """
bsd = "https://www.freshports.org/net-im/dino/"
linux = "https://dino.im/#download" linux = "https://dino.im/#download"
properties = ["chat", "desktop", "featured", "graphical", "mobile", "omemo", "openpgp"] properties = ["chat", "desktop", "featured", "graphical", "mobile", "omemo", "openpgp"]
resources = [ resources = [
@ -244,6 +288,24 @@ resources = [
{ url = "https://dino.im", txt = "Project homepage" }, { url = "https://dino.im", txt = "Project homepage" },
] ]
[freetalk]
title = "Freetalk"
about = """
GNU Freetalk is a console based chat client for Jabber and other XMPP servers.
It has context sensitive auto-completion for buddy names, commands, and even \
ordinary English words. Similar to GNU Emacs,
You can customize and extend GNU Freetalk with Scheme language.
"""
bsd = "https://www.freshports.org/net-im/freetalk/"
posix = "https://www.gnu.org/software/freetalk/"
properties = ["chat", "console", "desktop"]
resources = [
{ url = "https://lists.gnu.org/mailman/listinfo/freetalk-dev", txt = "Mailing list" },
{ url = "https://www.gnu.org/software/freetalk/", txt = "Project homepage" },
]
[gajim] [gajim]
title = "Gajim" title = "Gajim"
about = """ about = """
@ -256,9 +318,10 @@ Gajim integrates well with your other devices: simply continue conversations \
on your mobile device. on your mobile device.
""" """
apple = "https://gajim.org/download/#macos" apple = "https://gajim.org/download/#macos"
bsd = "https://www.freshports.org/net-im/gajim/"
linux = "https://gajim.org/download/#linux" linux = "https://gajim.org/download/#linux"
windows = "https://gajim.org/download/#windows" windows = "https://gajim.org/download/#windows"
properties = ["adhoc", "admin", "chat", "desktop", "featured", "graphical", "omemo", "openpgp"] properties = ["adhoc", "admin", "chat", "desktop", "featured", "graphical", "omemo", "openpgp", "plugin"]
resources = [ resources = [
{ url = "https://flathub.org/apps/org.gajim.Gajim", txt = "Flathub package" }, { url = "https://flathub.org/apps/org.gajim.Gajim", txt = "Flathub package" },
{ url = "https://apps.microsoft.com/detail/9pggf6hd43f9?hl=en-us&gl=US", txt = "Windows package" }, { url = "https://apps.microsoft.com/detail/9pggf6hd43f9?hl=en-us&gl=US", txt = "Windows package" },
@ -266,23 +329,6 @@ resources = [
{ url = "https://gajim.org", txt = "Project homepage" }, { url = "https://gajim.org", txt = "Project homepage" },
] ]
[freetalk]
title = "GNU Freetalk"
about = """
GNU Freetalk is a console based chat client for Jabber and other XMPP servers.
It has context sensitive auto-completion for buddy names, commands, and even \
ordinary English words. Similar to GNU Emacs,
You can customize and extend GNU Freetalk with Scheme language.
"""
posix = "https://www.gnu.org/software/freetalk/"
properties = ["chat", "console", "desktop"]
resources = [
{ url = "https://lists.gnu.org/mailman/listinfo/freetalk-dev", txt = "Mailing list" },
{ url = "https://www.gnu.org/software/freetalk/", txt = "Project homepage" },
]
[irssi] [irssi]
title = "Irssi" title = "Irssi"
about = """ about = """
@ -290,9 +336,10 @@ Irssi is a modular text mode chat client. It comes with IRC support built in.
irssi-xmpp is an Irssi plugin to connect to the XMPP network (jabber). irssi-xmpp is an Irssi plugin to connect to the XMPP network (jabber).
""" """
bsd = "https://www.freshports.org/irc/irssi-xmpp/"
haiku = "https://depot.haiku-os.org/irssi" haiku = "https://depot.haiku-os.org/irssi"
posix = "https://cybione.org/~irssi-xmpp/" posix = "https://cybione.org/~irssi-xmpp/"
properties = ["chat", "console", "desktop", "haikudepot"] properties = ["chat", "console", "desktop", "haikudepot", "plugin"]
resources = [ resources = [
{ url = "https://cybione.org/~irssi-xmpp/", txt = "irssi-xmpp project repository" }, { url = "https://cybione.org/~irssi-xmpp/", txt = "irssi-xmpp project repository" },
{ url = "https://irssi.org", txt = "Irssi homepage" }, { url = "https://irssi.org", txt = "Irssi homepage" },
@ -306,6 +353,8 @@ An XMPP client for Emacs
jabber.el is an XMPP client for Emacs. XMPP (also known as 'Jabber') is an \ jabber.el is an XMPP client for Emacs. XMPP (also known as 'Jabber') is an \
IETF-standard federated instant messaging protocol. IETF-standard federated instant messaging protocol.
""" """
bsd = "https://codeberg.org/emacs-jabber/emacs-jabber#how-to-install"
haiku = "https://codeberg.org/emacs-jabber/emacs-jabber#how-to-install"
posix = "https://codeberg.org/emacs-jabber/emacs-jabber#how-to-install" posix = "https://codeberg.org/emacs-jabber/emacs-jabber#how-to-install"
properties = ["admin", "chat", "console", "desktop"] properties = ["admin", "chat", "console", "desktop"]
resources = [ resources = [
@ -340,6 +389,7 @@ Unlike other chat apps, you are not dependent on one specific service \
provider, and your privacy is gauranteed more than ever before. provider, and your privacy is gauranteed more than ever before.
""" """
android = "https://kaidan.im/download/#android-experimental" android = "https://kaidan.im/download/#android-experimental"
bsd = "https://www.freshports.org/net-im/kaidan/"
linux = "https://kaidan.im/download/#linux" linux = "https://kaidan.im/download/#linux"
properties = ["chat", "desktop", "graphical", "mobile", "omemo"] properties = ["chat", "desktop", "graphical", "mobile", "omemo"]
resources = [ resources = [
@ -381,6 +431,7 @@ all of their instant messaging systems. The interface puts people first, and \
is integrated with the system address book to let you access your contacts \ is integrated with the system address book to let you access your contacts \
from other KDE applications. from other KDE applications.
""" """
bsd = "https://www.freshports.org/net-im/kopete/"
linux = "https://apps.kde.org/kopete/" linux = "https://apps.kde.org/kopete/"
properties = ["chat", "desktop", "graphical", "otr"] properties = ["chat", "desktop", "graphical", "otr"]
resources = [ resources = [
@ -391,21 +442,51 @@ resources = [
{ url = "https://userbase.kde.org/Kopete", txt = "Project homepage" }, { url = "https://userbase.kde.org/Kopete", txt = "Project homepage" },
] ]
#[mcabber] [leechcraft]
#title = "MCabber" title = "LeechCraft"
#about = """ about = """
#mcabber is a small XMPP (Jabber) console client. LeechCraft is a free open source cross-platform modular live environment.
#
#mcabber includes features such as SASL/SSL/TLS support, MUC (Multi-User Chat) \ It has modules for everything, which include an HTML browser; a multiprotocol \
#support, history logging, command completion, OpenPGP encryption, OTR (Off-the-\ modular IM client with support for encryption and audio calls; a \
#Record Messaging) support, dynamic modules and external action triggers. collection-oriented media player with social features like recommended artists \
#""" and nearby events; a BitTorrent client; a document viewer (ePUB, DjVu, PDF, \
#posix = "https://mcabber.com" MOBI, etc.); an RSS feed reader with extensive support for Broadcatching and \
#properties = ["admin", "chat", "console", "desktop", "openpgp", "otr"] podcasts ; a package manager with its own repository of plugins, themes, icons \
#resources = [ and much more.
# { url = "https://mcabber.com/hg/", txt = "Project repository" },
# { url = "https://mcabber.com", txt = "Project homepage" }, The Summary tab that displays all your downloads, updates and statuses (like \
#] new articles in news feeds).
LeechCraft is a modular system, and by installing different modules you can \
customize the feature set, keeping off the things you do not need and have a \
decent IM client, media player or a feed reader, for example.
"""
apple = "https://leechcraft.org/download#mac-os-x"
linux = "https://leechcraft.org/download#linux"
windows = "https://leechcraft.org/download#microsoft-windows"
properties = ["chat", "desktop", "graphical", "openpgp", "otr", "plugin", "pubsub"]
resources = [
{ url = "https://github.com/0xd34df00d/leechcraft", txt = "Project repository" },
{ url = "https://leechcraft.org", txt = "Project homepage" },
]
[mcabber]
title = "MCabber"
about = """
mcabber is a small XMPP (Jabber) console client.
mcabber includes features such as SASL/SSL/TLS support, MUC (Multi-User Chat) \
support, history logging, command completion, OpenPGP encryption, OTR (Off-the-\
Record Messaging) support, dynamic modules and external action triggers.
"""
bsd = "https://www.freshports.org/net-im/mcabber/"
posix = "https://mcabber.com"
properties = ["admin", "chat", "console", "desktop", "featured", "openpgp", "otr"]
resources = [
{ url = "https://mcabber.com/hg/", txt = "Project repository" },
{ url = "https://mcabber.com", txt = "Project homepage" },
]
[miranda] [miranda]
title = "Miranda NG" title = "Miranda NG"
@ -418,7 +499,7 @@ client Miranda IM.
It is very light on system resources and extremely fast. It is very light on system resources and extremely fast.
""" """
windows = "https://miranda-ng.org/downloads/" windows = "https://miranda-ng.org/downloads/"
properties = ["adhoc", "chat", "desktop", "featured", "graphical", "omemo", "openpgp", "otr"] properties = ["adhoc", "chat", "desktop", "featured", "graphical", "omemo", "openpgp", "otr", "plugin"]
resources = [ resources = [
{ url = "https://github.com/miranda-ng/miranda-ng", txt = "Project repository" }, { url = "https://github.com/miranda-ng/miranda-ng", txt = "Project repository" },
{ url = "https://miranda-ng.org", txt = "Project homepage" }, { url = "https://miranda-ng.org", txt = "Project homepage" },
@ -515,8 +596,10 @@ client optimized for business and organizations implemented as a cross-\
platform browser extension. platform browser extension.
""" """
browser = "https://igniterealtime.org/projects/pade/" browser = "https://igniterealtime.org/projects/pade/"
properties = ["chat", "desktop", "extension", "graphical", "mobile", "omemo"] properties = ["adhoc", "chat", "desktop", "extension", "graphical", "mobile", "omemo", "pwa"]
resources = [ resources = [
{ url = "https://discourse.igniterealtime.org/c/pade", txt = "Support forum" },
{ url = "xmpp:open_chat@conference.igniterealtime.org?join", txt = "Support group chat" },
{ url = "https://igniterealtime.org/projects/pade/", txt = "Project homepage" }, { url = "https://igniterealtime.org/projects/pade/", txt = "Project homepage" },
] ]
@ -535,9 +618,10 @@ Pidgin supports many features of these chat networks, such as file transfers, \
away messages, buddy icons, custom smileys, and typing notifications. Numerous \ away messages, buddy icons, custom smileys, and typing notifications. Numerous \
plugins also extend functionality above and beyond the standard features. plugins also extend functionality above and beyond the standard features.
""" """
bsd = "https://www.freshports.org/net-im/pidgin/"
linux = "https://pidgin.im/install/" linux = "https://pidgin.im/install/"
windows = "https://pidgin.im/install/" windows = "https://pidgin.im/install/"
properties = ["chat", "desktop", "openpgp", "otr"] properties = ["chat", "desktop", "openpgp", "otr", "plugin"]
resources = [ resources = [
{ url = "https://flathub.org/apps/im.pidgin.Pidgin", txt = "Flathub package" }, { url = "https://flathub.org/apps/im.pidgin.Pidgin", txt = "Flathub package" },
{ url = "https://pidgin.im", txt = "Project homepage" }, { url = "https://pidgin.im", txt = "Project homepage" },
@ -560,7 +644,7 @@ anonymous spirit of IRC while using a powerful, standard and open protocol.
""" """
haiku = "https://depot.haiku-os.org/poezio" haiku = "https://depot.haiku-os.org/poezio"
posix = "https://poez.io/en/#download" posix = "https://poez.io/en/#download"
properties = ["adhoc", "chat", "console", "desktop", "featured", "haikudepot", "omemo", "openpgp", "otr"] properties = ["adhoc", "chat", "console", "desktop", "featured", "haikudepot", "omemo", "openpgp", "otr", "plugin"]
resources = [ resources = [
{ url = "https://flathub.org/apps/io.poez.Poezio", txt = "Flathub package" }, { url = "https://flathub.org/apps/io.poez.Poezio", txt = "Flathub package" },
{ url = "https://codeberg.org/poezio/poezio", txt = "Project repository" }, { url = "https://codeberg.org/poezio/poezio", txt = "Project repository" },
@ -581,8 +665,9 @@ It supports XMPP chat services, MUC chat room, OTR, PGP and OMEMO encryption, \
roster management, including flexible resource and priority settings, desktop \ roster management, including flexible resource and priority settings, desktop \
notifications, and it has a plugins system in Python and C. notifications, and it has a plugins system in Python and C.
""" """
bsd = "https://www.freshports.org/net-im/profanity/"
posix = "https://profanity-im.github.io" posix = "https://profanity-im.github.io"
properties = ["adhoc", "chat", "console", "desktop", "featured", "omemo", "openpgp", "otr"] properties = ["adhoc", "chat", "console", "desktop", "featured", "omemo", "openpgp", "otr", "plugin"]
resources = [ resources = [
{ url = "https://github.com/profanity-im/profanity", txt = "Project repository" }, { url = "https://github.com/profanity-im/profanity", txt = "Project repository" },
{ url = "https://profanity-im.github.io/plugins.html", txt = "Plugins list" }, { url = "https://profanity-im.github.io/plugins.html", txt = "Plugins list" },
@ -617,7 +702,7 @@ supported operating system.
apple = "https://psi-im.org" apple = "https://psi-im.org"
linux = "https://psi-im.org" linux = "https://psi-im.org"
windows = "https://psi-im.org" windows = "https://psi-im.org"
properties = ["adhoc", "admin", "chat", "desktop", "graphical", "omemo", "openpgp", "otr"] properties = ["adhoc", "admin", "chat", "desktop", "graphical", "omemo", "openpgp", "otr", "plugin"]
resources = [ resources = [
{ url = "https://github.com/psi-im/psi", txt = "Project repository" }, { url = "https://github.com/psi-im/psi", txt = "Project repository" },
{ url = "xmpp:psi-dev@conference.jabber.ru?join", txt = "Support group chat" }, { url = "xmpp:psi-dev@conference.jabber.ru?join", txt = "Support group chat" },
@ -637,7 +722,7 @@ apple = "https://psi-plus.com/wiki/en:downloads#macos"
haiku = "https://depot.haiku-os.org/psi_plus" haiku = "https://depot.haiku-os.org/psi_plus"
linux = "https://psi-plus.com/wiki/en:downloads#linux" linux = "https://psi-plus.com/wiki/en:downloads#linux"
windows = "https://psi-plus.com/wiki/en:downloads#ms_windows" windows = "https://psi-plus.com/wiki/en:downloads#ms_windows"
properties = ["adhoc", "admin", "chat", "desktop", "featured", "graphical", "haikudepot", "omemo", "openpgp", "otr"] properties = ["adhoc", "admin", "chat", "desktop", "featured", "graphical", "haikudepot", "omemo", "openpgp", "otr", "plugin"]
resources = [ resources = [
{ url = "https://github.com/psi-plus/main", txt = "Project repository" }, { url = "https://github.com/psi-plus/main", txt = "Project repository" },
{ url = "xmpp:psi-dev@conference.jabber.ru?join", txt = "Support group chat" }, { url = "xmpp:psi-dev@conference.jabber.ru?join", txt = "Support group chat" },
@ -673,38 +758,40 @@ resources = [
{ url = "https://pulkomandy.tk/projects/renga", txt = "Project homepage" }, { url = "https://pulkomandy.tk/projects/renga", txt = "Project homepage" },
] ]
#[siskin] [siskin]
#title = "Siskin" title = "Siskin"
#about = """ about = """
#Siskin IM by Tigase, Inc. is a lightweight and powerful XMPP client for iPhone \ Siskin IM by Tigase, Inc. is a lightweight and powerful XMPP client for iPhone \
#and iPad. It provides an easy way to talk and share moments with your friends. and iPad. It provides an easy way to talk and share moments with your friends.
#""" """
#apple = "https://siskin.im/#about" apple = "https://siskin.im/#about"
#properties = ["chat", "graphical", "mobile", "omemo"] properties = ["chat", "graphical", "mobile", "omemo"]
#resources = [ resources = [
# { url = "https://itunes.apple.com/us/app/tigase-messenger/id1153516838", txt = "iOS package" }, { url = "https://itunes.apple.com/us/app/tigase-messenger/id1153516838", txt = "iOS package" },
# { url = "https://siskin.im", txt = "Project homepage" }, { url = "https://siskin.im", txt = "Project homepage" },
#] ]
#[spark] [spark]
#title = "Spark" title = "Spark"
#about = """ about = """
#Spark is an Open Source, cross-platform IM client optimized for businesses and \ Spark is an Open Source, cross-platform IM client optimized for businesses and \
#organizations. organizations.
#
#It features built-in support for group chat, telephony integration, and strong \ It features built-in support for group chat, telephony integration, and strong \
#security. security.
#
#It also offers a great end-user experience with features like in-line spell \ It also offers a great end-user experience with features like in-line spell \
#checking, group chat room bookmarks, and tabbed conversations. checking, group chat room bookmarks, and tabbed conversations.
#""" """
#apple = "https://igniterealtime.org/projects/spark/" apple = "https://igniterealtime.org/projects/spark/"
#linux = "https://igniterealtime.org/projects/spark/" linux = "https://igniterealtime.org/projects/spark/"
#windows = "https://igniterealtime.org/projects/spark/" windows = "https://igniterealtime.org/projects/spark/"
#properties = ["chat", "desktop", "graphical", "omemo"] properties = ["chat", "desktop", "graphical", "omemo"]
#resources = [ resources = [
# { url = "https://igniterealtime.org/projects/spark/", txt = "Project homepage" }, { url = "https://discourse.igniterealtime.org/c/spark", txt = "Support forum" },
#] { url = "xmpp:open_chat@conference.igniterealtime.org?join", txt = "Support group chat" },
{ url = "https://igniterealtime.org/projects/spark/", txt = "Project homepage" },
]
#[speeqe] #[speeqe]
#title = "Speeqe" #title = "Speeqe"
@ -777,7 +864,6 @@ linux = "https://swift.im/downloads.html"
windows = "https://swift.im/downloads.html" windows = "https://swift.im/downloads.html"
properties = ["chat", "desktop", "graphical"] properties = ["chat", "desktop", "graphical"]
resources = [ resources = [
{ url = "xmpp:swift@rooms.swift.im?join", txt = "Support group chat" },
{ url = "https://swift.im", txt = "Project homepage" }, { url = "https://swift.im", txt = "Project homepage" },
] ]
@ -813,7 +899,7 @@ currently has a minimal but ideally maximal set of XEPs.
""" """
haiku = "https://depot.haiku-os.org/weechat" haiku = "https://depot.haiku-os.org/weechat"
posix = "https://github.com/bqv/weechat-xmpp" posix = "https://github.com/bqv/weechat-xmpp"
properties = ["chat", "console", "desktop", "omemo", "openpgp"] properties = ["chat", "console", "desktop", "omemo", "openpgp", "plugin"]
resources = [ resources = [
{ url = "https://github.com/bqv/weechat-xmpp", txt = "weechat-xmpp project repository" }, { url = "https://github.com/bqv/weechat-xmpp", txt = "weechat-xmpp project repository" },
{ url = "https://weechat.org", txt = "WeeChat homepage" }, { url = "https://weechat.org", txt = "WeeChat homepage" },
@ -831,24 +917,31 @@ interoperable open standards.
""" """
browser = "https://xabber.com" browser = "https://xabber.com"
android = "https://xabber.com" android = "https://xabber.com"
properties = ["chat", "desktop", "featured", "graphical", "omemo", "mobile"] properties = ["chat", "desktop", "featured", "graphical", "mobile"]
resources = [ resources = [
{ url = "https://www.xabber.com/rel/client/android/last/xabber.apk", txt = "Nightly package" },
{ url = "https://f-droid.org/packages/com.xabber.android", txt = "F-Droid package" }, { url = "https://f-droid.org/packages/com.xabber.android", txt = "F-Droid package" },
{ url = "https://play.google.com/store/apps/details?id=com.xabber.android", txt = "Play package" },
{ url = "https://web.xabber.com", txt = "Xabber Web" }, { url = "https://web.xabber.com", txt = "Xabber Web" },
{ url = "https://xabber.com", txt = "Project homepage" }, { url = "https://xabber.com", txt = "Project homepage" },
] ]
#[xmpp-web] [xmpp-web]
#title = "XMPP Web" title = "XMPP Web"
#about = """ about = """
#Lightweight HTML chat client for XMPP servers. A lightweight HTML chat client for XMPP servers.
#"""
#browser = "https://github.com/nioc/xmpp-web/releases" It supports WebSocket, groupchat, roster, bookmarks, file transfer, password \
#properties = ["chat", "desktop", "graphical", "mobile", "pwa"] protected rooms, chat state notifications, formatting of messages, stickers, \
#resources = [ room creation and configuration, message moderation, vCard information.
# { url = "https://github.com/nioc/xmpp-web", txt = "Project homepage" },
#] It is lightweight (600 KB gzipped at the first loading and then less than 10 KB)
Guest access /guest?join={jid} (joining a MUC anonymously as described in RFC 4505)
"""
browser = "https://github.com/nioc/xmpp-web/releases"
properties = ["chat", "desktop", "graphical", "mobile", "pwa"]
resources = [
{ url = "https://github.com/nioc/xmpp-web", txt = "Project repository" },
]
[yaxim] [yaxim]
title = "yaxim" title = "yaxim"

View file

@ -2,7 +2,9 @@
#action, #action,
#action-bar, #action-bar,
#graphics, #graphics,
#input { #input,
.vcard-link,
.system-menu {
user-select: none; user-select: none;
} }
@ -138,7 +140,7 @@ label,
#number-of-pages > a, #number-of-pages > a,
#number-of-pages .inactive { #number-of-pages .inactive {
display: inline-block; display: inline-block;
font-size: 1.2em; /* font-size: 1.2em; */
min-width: 90px; min-width: 90px;
padding: 0.5em; padding: 0.5em;
width: 15%; width: 15%;
@ -151,13 +153,20 @@ label,
} }
#download, #download,
#input { #input,
.vcard-link,
.system-menu {
border-radius: 2em; border-radius: 2em;
font-size: 1.34em; font-size: 1.34em;
padding: 0.5em; padding: 0.5em;
} }
#profile-top { #system-title > * {
width: 18%;
}
#profile-top,
#system-title {
align-items: center; align-items: center;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
@ -207,6 +216,23 @@ label,
text-transform: uppercase; text-transform: uppercase;
} }
.system-menu {
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
white-space: nowrap;
}
.system-menu:first-child {
padding-left: 2em;
text-align: left;
}
.system-menu:last-child {
padding-right: 2em;
text-align: right;
}
#action > a, #action > a,
#action-bar > a { #action-bar > a {
padding-left: 1em; padding-left: 1em;
@ -245,9 +271,14 @@ h1 {
text-overflow: ellipsis; text-overflow: ellipsis;
} }
/*
#count { #count {
margin: 1em; margin: 1em;
/* min-height: 1.5em; */
}
/*
#count > a:before {
content: ' • ';
} }
*/ */
@ -282,6 +313,22 @@ h1 {
*/ */
} }
#vcard-links-extra {
display: grid;
}
#vcard-links {
padding-bottom: 1em;
}
.vcard-link {
filter: drop-shadow(0 0 0 black);
margin: 1em;
outline: solid;
outline-color: #cfcfcf;
text-decoration: none;
}
#profile #photo { #profile #photo {
/* object-fit: scale-down; */ /* object-fit: scale-down; */
} }
@ -421,6 +468,30 @@ h1 {
display: block; /* Show details upon checked checkbox */ display: block; /* Show details upon checked checkbox */
} }
#vcard-note-full {
color: #505050;
margin-left: 5em;
margin-right: 5em;
padding: 0 2em 2em 2em;
text-align: center;
}
#vcard-note {
color: #505050;
margin-left: 5em;
margin-right: 5em;
/* overflow: hidden; */
padding: 2em;
text-align: center;
/* text-overflow: ellipsis;
white-space: nowrap; */
}
#vcard-note:hover {
overflow: unset;
white-space: unset;
}
.plain-note { .plain-note {
display: block; display: block;
justify-content: center; justify-content: center;
@ -469,7 +540,7 @@ h1 {
margin: 1em; margin: 1em;
padding: 1.5em; padding: 1.5em;
text-decoration: none; text-decoration: none;
width: 20%; width: 5em;
} }
/* /*
#software > .system:hover { #software > .system:hover {
@ -608,11 +679,6 @@ h1 {
text-decoration: none; text-decoration: none;
} }
.permalink {
padding-right: 0.8em;
text-decoration: none;
}
#count > a, #count > a,
#preview { #preview {
color: #5c5656; color: #5c5656;

668
fasi.py
View file

@ -3,6 +3,7 @@
from asyncio import TimeoutError from asyncio import TimeoutError
from datetime import datetime from datetime import datetime
from dateutil import parser
from email.utils import parseaddr from email.utils import parseaddr
from fastapi import FastAPI, Form, HTTPException, Request, Response from fastapi import FastAPI, Form, HTTPException, Request, Response
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
@ -11,7 +12,6 @@ from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates from fastapi.templating import Jinja2Templates
import glob import glob
#import logging #import logging
#from os import mkdir
#from os.path import getsize, exists #from os.path import getsize, exists
import os import os
import qrcode import qrcode
@ -215,9 +215,118 @@ class HttpInstance:
response.headers['Content-Type'] = 'application/xhtml+xml' response.headers['Content-Type'] = 'application/xhtml+xml'
return response return response
# NOTE Was /b/ @self.app.get('/c/{jid}')
async def c_jid_get(request: Request, jid):
"""Display entries of a vCard4"""
jid_path = urlsplit(jid).path
if parseaddr(jid_path)[1] == jid_path:
jid_bare = jid_path.lower()
else:
jid_bare = jid
note = 'Jabber ID appears to be malformed'
if jid_bare == jabber_id:
raise HTTPException(status_code=403, detail='access-denied')
node_name_vcard4 = 'urn:xmpp:vcard4'
item_id_vcard4 = 'current'
#try:
if True:
entries = []
exception = jid_vcard = note = node_items = node_note = \
number_of_pages = page_number = previous = selection = \
title = None
directory = 'xep_0060/{}/{}/'.format(jid_bare, node_name_vcard4)
filename = directory + item_id_vcard4 + '.xml'
if os.path.exists(filename) and os.path.getsize(filename) > 0:
jid_details = Data.open_file_xml(filename)
else:
await FileUtilities.cache_vcard_data(
jabber_id, password, jid_bare, node_name_vcard4, item_id_vcard4)
xml_data = Data.open_file_xml(filename)
root_element = xml_data.getroot()
child_element = root_element[0]
#vcard_info = Syndication.extract_vcard_items(child_element)
vcard_info = Syndication.extract_vcard4_items(child_element)
# Action and instance type
action = 'Profile'
# Query URI links
print('Query URI links')
jid_kind = 'account'
xmpp_uri = XmppUtilities.get_xmpp_uri(jid_bare, jid_kind, node_name_vcard4)
# Graphic files
#filename, filepath, filetype, selection = FileUtilities.handle_photo(jid_bare, jid_vcard, link_href)
#except Exception as e:
else:
exception = str(e)
action = 'Error'
title = 'Slixmpp error'
xmpp_uri = note = jid
filename = jid_bare = link_href = link_tex = node_note = \
node_title = number_of_pages = page_number = previous = \
selection = url = None
if 'fn' in vcard_info and vcard_info['fn']:
title = vcard_info['fn']
elif 'alias' in vcard_info and vcard_info['alias']:
title = vcard_info['alias']
else:
title = jid_bare.split('@')[0]
if 'alias' in vcard_info and vcard_info['alias']:
alias = vcard_info['alias']
else:
alias = jid_bare.split('@')[0]
#if title == 'remote-server-timeout':
# raise HTTPException(status_code=408, detail='remote-server-timeout')
#else:
template_file = 'vcard.xhtml'
template_dict = {
'action' : action,
'alias' : alias,
'brand_name' : brand_name,
'brand_site' : brand_site,
'chat_client' : chat_client,
'entries' : entries,
'exception' : exception,
#'filename' : filename,
'jid_bare' : jid,
'jid_note' : note,
#'jid_title' : title,
#'node_title' : node_title,
'node_name' : node_name_vcard4,
'number_of_pages' : number_of_pages,
'page_number' : page_number,
'previous' : previous,
'request' : request,
'title' : title,
'url' : request.url._url,
'vcard_info' : vcard_info,
'xmpp_uri' : xmpp_uri}
response = templates.TemplateResponse(template_file, template_dict)
response.headers['Content-Type'] = 'application/xhtml+xml'
return response
@self.app.get('/b/{jid}')
async def b_jid_get(request: Request, jid):
response = await browse_jid_node_get(request, jid, 'urn:xmpp:microblog:0')
return response
# TODO Change to /p/ for pubsub
@self.app.get('/d/{jid}/{node_name}') @self.app.get('/d/{jid}/{node_name}')
@self.app.get('/d/{jid}/{node_name}/{item_id}') @self.app.get('/d/{jid}/{node_name}/{item_id}')
async def d_jid_node_get(request: Request, jid, node_name, item_id=None):
response = await browse_jid_node_get(request, jid, node_name, item_id=None)
return response
async def browse_jid_node_get(request: Request, jid, node_name, item_id=None): async def browse_jid_node_get(request: Request, jid, node_name, item_id=None):
"""Browse items of a pubsub node""" """Browse items of a pubsub node"""
jid_path = urlsplit(jid).path jid_path = urlsplit(jid).path
@ -232,9 +341,8 @@ class HttpInstance:
#try: #try:
if True: if True:
entries = [] exception = jid_vcard = note = node_items = node_note = \
exception = jid_vcard = note = node_note = number_of_pages = \ number_of_pages = page_number = previous = selection = None
page_number = previous = selection = None
filename = 'details/{}.toml'.format(jid_bare) filename = 'details/{}.toml'.format(jid_bare)
if os.path.exists(filename) and os.path.getsize(filename) > 0: if os.path.exists(filename) and os.path.getsize(filename) > 0:
@ -243,30 +351,20 @@ class HttpInstance:
jid_details = await FileUtilities.cache_jid_data( jid_details = await FileUtilities.cache_jid_data(
jabber_id, password, jid_bare, node_name, item_id) jabber_id, password, jid_bare, node_name, item_id)
xmpp_instance = XmppInstance(jabber_id, password, jid_bare)
xmpp_instance.connect()
# Node item IDs # Node item IDs
nodes = jid_details['nodes'] nodes = jid_details['nodes']
items = jid_details['items'] #items = jid_details['items']
if node_name not in nodes: # for item in items:
nodes[node_name] = {} # if item[1] == node_name:
node_item_ids = await XmppXep0060.get_node_item_ids( # nodes[node_name]['title'] = item[2]
xmpp_instance, jid_bare, node_name) # break
#node_item_ids = await XmppUtilities.get_item_ids_of_node( supdirectory = 'xep_0060/{}/'.format(jid_bare)
# jabber_id, password, jid_bare, node_name, nodes) if not os.path.exists(supdirectory): os.mkdir(supdirectory)
if isinstance(node_item_ids['iq'], stanza.iq.Iq): directory = 'xep_0060/{}/{}/'.format(jid_bare, node_name)
iq = node_item_ids['iq'] if not os.path.exists(directory):
iq_disco_items_items = iq['disco_items']['items'] os.mkdir(directory)
for item in items: await FileUtilities.cache_node_data(
if item[1] == node_name: jabber_id, password, jid_bare, node_name)
nodes[node_name]['title'] = item[2]
break
nodes[node_name]['count'] = len(iq_disco_items_items)
nodes[node_name]['item_ids'] = []
for item in iq_disco_items_items:
nodes[node_name]['item_ids'].append(
[item[0] or '', item[1] or '', item[2] or ''])
count = jid_details['count'] count = jid_details['count']
jid_info = { jid_info = {
@ -279,7 +377,8 @@ class HttpInstance:
'note' : jid_details['note'], 'note' : jid_details['note'],
'type' : jid_details['image_type']} 'type' : jid_details['image_type']}
messages = jid_details['messages'] messages = jid_details['messages']
node_title = nodes[node_name]['title'] #node_title = nodes[node_name]['title'] if 'title' in nodes[node_name] else jid_details['name']
node_title = node_name
note = jid_details['note'] note = jid_details['note']
#title = nodes[node_name]['title'] if node_name else jid_details['name'] #title = nodes[node_name]['title'] if node_name else jid_details['name']
title = jid_details['name'] title = jid_details['name']
@ -290,16 +389,10 @@ class HttpInstance:
#xmpp_uri = '{}?;node={}'.format(jid_bare, node_name) #xmpp_uri = '{}?;node={}'.format(jid_bare, node_name)
# Node items # Node items
if item_id: entries = []
previous = True node_items = os.listdir(directory)
node_items = await XmppXep0060.get_node_items( if 'urn:xmpp:avatar:metadata.xml' in node_items:
xmpp_instance, jid_bare, node_name, item_ids=[item_id]) node_items.remove('urn:xmpp:avatar:metadata.xml')
else:
item_ids = []
for item in nodes[node_name]['item_ids']:
item_ids.append(item[2])
# NOTE Consider to neglect the reversal of order, because, then, items can be found at the same page.
item_ids.reverse()
page_number = request.query_params.get('page', '') page_number = request.query_params.get('page', '')
if page_number: if page_number:
try: try:
@ -311,29 +404,21 @@ class HttpInstance:
else: else:
ix = 0 ix = 0
page_number = 1 page_number = 1
item_ids_10 = item_ids[ix:][:10] item_ids_10 = node_items[ix:][:10]
number_of_pages = int(len(item_ids) / 10) number_of_pages = int(len(node_items) / 10)
if number_of_pages < len(item_ids) / 10: number_of_pages += 1 if number_of_pages < len(node_items) / 10: number_of_pages += 1
node_items = await XmppXep0060.get_node_items( if node_items:
xmpp_instance, jid_bare, node_name, item_ids=item_ids_10) for item in item_ids_10:
filename = directory + item
if isinstance(node_items['iq'], stanza.iq.Iq): xml_data = Data.open_file_xml(filename)
#title = title or node_name root_element = xml_data.getroot()
if not node_title: node_title = node_name child_element = root_element[0]
#node_note = nodes[node_name]['title'] if node_name else jid_details['name'] entry = Syndication.extract_atom_items(child_element)
#node_note = xmpp_uri # jid_bare if entry:
iq = node_items['iq'] filename_without_file_extension = item[:len(item)-4]
for item in iq['pubsub']['items']: entry['id'] = filename_without_file_extension
item_payload = item['payload']
entry = Syndication.extract_items(item_payload)
if entry: entry['id'] = item['id']
entries.append(entry) entries.append(entry)
#if len(entries) > 10: break #if len(entries) > 10: break
else:
message = '{}: {} (XEP-0060)'.format(node_items['condition'], node_items['text'])
if entries: entries.reverse()
xmpp_instance.disconnect()
if jid_kind: if jid_kind:
# Action and instance type # Action and instance type
@ -540,9 +625,9 @@ class HttpInstance:
#try: #try:
if True: if True:
action = count = exception = instance = jid_vcard = \ action = alias = count_item = count_message = exception = \
jid_info = link_href = message = note = selection = title = \ instance = jid_vcard = jid_info = link_href = message = note = \
view_href = xmpp_uri = None selection = title = vcard4 = view_href = xmpp_uri = None
#node_name = 'urn:xmpp:microblog:0' #node_name = 'urn:xmpp:microblog:0'
filename = 'details/{}.toml'.format(jid_bare) filename = 'details/{}.toml'.format(jid_bare)
@ -555,19 +640,13 @@ class HttpInstance:
# Set node name to 'urn:xmpp:microblog:0' # Set node name to 'urn:xmpp:microblog:0'
jid_kind = jid_details['kind'] jid_kind = jid_details['kind']
nodes = jid_details['nodes'] nodes = jid_details['nodes']
count_message = jid_details['messages']
if (jid_kind not in ('conference', 'mix', 'muc') and if (jid_kind not in ('conference', 'mix', 'muc') and
'@' in jid_bare and '@' in jid_bare and
not node_name and not node_name and
'urn:xmpp:microblog:0' in nodes): 'urn:xmpp:microblog:0' in nodes):
node_name = 'urn:xmpp:microblog:0' node_name = 'urn:xmpp:microblog:0'
if ('@' in jid_bare and
'urn:xmpp:microblog:0' not in nodes and
jid_kind not in ('conference', 'mix', 'muc')):
count = 0
else:
count = nodes[node_name]['count'] if node_name in nodes else jid_details['count']
items = jid_details['items'] items = jid_details['items']
jid_info = { jid_info = {
'error' : jid_details['error'], 'error' : jid_details['error'],
@ -581,20 +660,49 @@ class HttpInstance:
#note = nodes[node_name]['title'] if node_name in nodes else jid_details['note'] #note = nodes[node_name]['title'] if node_name in nodes else jid_details['note']
note = jid_details['note'] note = jid_details['note']
# TODO Append results to file # vCard4
node_name_vcard4 = 'urn:xmpp:vcard4'
item_id_vcard4 = 'current'
directory = 'xep_0060/{}/{}/'.format(jid_bare, node_name_vcard4)
filename = directory + item_id_vcard4 + '.xml'
if os.path.exists(filename) and os.path.getsize(filename) > 0:
xml_data = Data.open_file_xml(filename)
root_element = xml_data.getroot()
child_element = root_element[0]
#vcard_info = Syndication.extract_vcard_items(child_element)
vcard_info = Syndication.extract_vcard4_items(child_element)
title = vcard_info['fn']
alias = vcard_info['alias']
note = vcard_info['note']
else:
await FileUtilities.cache_vcard_data(
jabber_id, password, jid_bare, node_name_vcard4, item_id_vcard4)
if os.path.exists(filename) and os.path.getsize(filename) > 0:
vcard4 = True
# Node item IDs # Node item IDs
if node_name not in nodes: supdirectory = 'xep_0060/{}/'.format(jid_bare)
nodes[node_name] = await XmppUtilities.get_item_ids_of_node( if not os.path.exists(supdirectory): os.mkdir(supdirectory)
jabber_id, password, jid_bare, node_name, nodes) directory = 'xep_0060/{}/{}/'.format(jid_bare, node_name)
if isinstance(nodes[node_name]['iq'], stanza.iq.Iq): if not os.path.exists(directory):
iq = nodes[node_name]['iq'] os.mkdir(directory)
iq_disco_items = iq['disco_items'] await FileUtilities.cache_node_data(
if iq_disco_items['items']: jabber_id, password, jid_bare, node_name)
count = len(nodes[node_name]['iq']['disco_items']['items'])
else: # Node items
count = 0 entries = []
else: node_items = os.listdir(directory)
count = 0 if 'urn:xmpp:avatar:metadata.xml' in node_items:
node_items.remove('urn:xmpp:avatar:metadata.xml')
count_item = len(node_items)
# if ('@' in jid_bare and
# 'urn:xmpp:microblog:0' not in nodes and
# jid_kind not in ('conference', 'mix', 'muc')):
# count_item = 0
# else:
# count_item = len(node_items)
if jid_kind == 'pubsub' and node_name: if jid_kind == 'pubsub' and node_name:
items = jid_details['items'] items = jid_details['items']
@ -616,7 +724,7 @@ class HttpInstance:
else: # jid_info['error'] else: # jid_info['error']
action = 'Contact' action = 'Contact'
instance = view_href = '' instance = view_href = ''
message = '{}: {} (XEP-0030)'.format(jid_info['text'], jid_info['condition']) if jid_info['condition']: message = '{}: {} (XEP-0030)'.format(jid_info['text'], jid_info['condition'])
xmpp_uri = jid_bare xmpp_uri = jid_bare
link_href = XmppUtilities.get_link_href(jid_bare, jid_kind, node_name) link_href = XmppUtilities.get_link_href(jid_bare, jid_kind, node_name)
@ -635,8 +743,12 @@ class HttpInstance:
action = 'Error' action = 'Error'
title = 'Slixmpp error' title = 'Slixmpp error'
xmpp_uri = jid xmpp_uri = jid
count = filename = jid_bare = jid_vcard = jid_kind = links = \ alias = count_item = count_message = filename = jid_bare = \
message = selection = url = None jid_vcard = jid_kind = links = message = selection = url = \
vcard4 = None
note_500 = note[:500]
note = note_500 + '' if note_500 < note else note_500
# NOTE Handling of variables "title" and "note" in case of '/j/{jid}/{node_name}' is confusing. # NOTE Handling of variables "title" and "note" in case of '/j/{jid}/{node_name}' is confusing.
# TODO Add new keys that are of 'node' and be utilized for nodes, instead of reusing a variable for several roles. # TODO Add new keys that are of 'node' and be utilized for nodes, instead of reusing a variable for several roles.
@ -645,10 +757,12 @@ class HttpInstance:
template_file = 'jid.xhtml' template_file = 'jid.xhtml'
template_dict = { template_dict = {
'action' : action, 'action' : action,
'alias' : alias,
'brand_name' : brand_name, 'brand_name' : brand_name,
'brand_site' : brand_site, 'brand_site' : brand_site,
'chat_client' : chat_client, 'chat_client' : chat_client,
'count' : count, 'count_item' : count_item,
'count_message' : count_message,
'instance' : instance, 'instance' : instance,
'exception' : exception, 'exception' : exception,
'filename' : filename, 'filename' : filename,
@ -656,11 +770,13 @@ class HttpInstance:
'jid_kind' : jid_kind, 'jid_kind' : jid_kind,
'links' : links, 'links' : links,
'message' : message, 'message' : message,
'news_client' : news_client,
'note' : note, # TODO node_note or title of PubSub JID 'note' : note, # TODO node_note or title of PubSub JID
'request' : request, 'request' : request,
'selection' : selection, 'selection' : selection,
'title' : title, # TODO node_title 'title' : title, # TODO node_title
'url' : request.url._url, 'url' : request.url._url,
'vcard4' : vcard4,
'view_href' : view_href, 'view_href' : view_href,
'xmpp_uri' : xmpp_uri} 'xmpp_uri' : xmpp_uri}
response = templates.TemplateResponse(template_file, template_dict) response = templates.TemplateResponse(template_file, template_dict)
@ -710,6 +826,8 @@ class HttpInstance:
user_agent = request.headers.get("user-agent") user_agent = request.headers.get("user-agent")
user_agent_lower = user_agent.lower() user_agent_lower = user_agent.lower()
match user_agent_lower: match user_agent_lower:
case _ if 'bsd' in user_agent_lower:
software = 'bsd'
case _ if 'linux' in user_agent_lower: case _ if 'linux' in user_agent_lower:
software = 'linux' software = 'linux'
case _ if 'haiku' in user_agent_lower: case _ if 'haiku' in user_agent_lower:
@ -722,14 +840,18 @@ class HttpInstance:
software = 'apple' software = 'apple'
name = software.title() name = software.title()
if software == 'bsd': name = 'BSD'
if software == 'posix': name = 'POSIX' if software == 'posix': name = 'POSIX'
if software == 'ubports': name = 'UBports' if software == 'ubports': name = 'UBports'
if name.endswith('os'): name = name.replace('os', 'OS')
filename_clients = 'clients.toml' filename_clients = 'clients.toml'
clients = Data.open_file_toml(filename_clients) clients = Data.open_file_toml(filename_clients)
client_selection = [] client_selection = []
clients_software = 0
for client in clients: for client in clients:
if software in clients[client]: if software in clients[client]:
clients_software += 1
if featured and 'featured' not in clients[client]['properties']: if featured and 'featured' not in clients[client]['properties']:
skipped = True skipped = True
continue continue
@ -742,12 +864,15 @@ class HttpInstance:
'resources' : clients[client]['resources'] if 'resources' in clients[client] else ''} 'resources' : clients[client]['resources'] if 'resources' in clients[client] else ''}
client_selection.append(client_selected) client_selection.append(client_selected)
skipped = False if len(client_selection) == clients_software else True
template_file = 'download.xhtml' template_file = 'download.xhtml'
template_dict = { template_dict = {
'brand_name' : brand_name, 'brand_name' : brand_name,
'brand_site' : brand_site, 'brand_site' : brand_site,
'chat_client' : chat_client, 'chat_client' : chat_client,
'client_selection' : client_selection, 'client_selection' : client_selection,
'featured' : featured,
'skipped' : skipped, 'skipped' : skipped,
'request' : request, 'request' : request,
'software' : software, 'software' : software,
@ -824,9 +949,81 @@ class Data:
data_as_string = tomli_w.dumps(data) data_as_string = tomli_w.dumps(data)
fn.write(data_as_string) fn.write(data_as_string)
def open_file_xml(filename: str) -> ET.ElementTree:
data = ET.parse(filename)
return data
def save_to_file(filename: str, data: str) -> None:
with open(filename, 'w') as fn:
fn.write(data)
class FileUtilities: class FileUtilities:
async def cache_jid_data(jabber_id, password, jid_bare, node_name=None, item_id=None, alias=None): async def cache_vcard_data(
jabber_id, password, jid_bare, node_name_vcard4, item_id_vcard4):
# Start an XMPP instance and retrieve information
xmpp_instance = XmppInstance(jabber_id, password, jid_bare)
xmpp_instance.connect()
vcard4_data = await XmppXep0060.get_node_items(
xmpp_instance, jid_bare, node_name_vcard4, item_ids=[item_id_vcard4])
xmpp_instance.disconnect()
if vcard4_data:
supdirectory = 'xep_0060/{}/'.format(jid_bare)
if not os.path.exists(supdirectory): os.mkdir(supdirectory)
directory = 'xep_0060/{}/{}/'.format(jid_bare, node_name_vcard4)
if not os.path.exists(directory): os.mkdir(directory)
if isinstance(vcard4_data['iq'], stanza.iq.Iq):
iq = vcard4_data['iq']
for item in iq['pubsub']['items']:
filename = directory + item_id_vcard4 + '.xml'
xml_item_as_string = str(item)
Data.save_to_file(filename, xml_item_as_string)
#item_payload = item['payload']
#vcard4_info = Syndication.extract_vcard4_items(item_payload)
async def cache_node_data(
jabber_id, password, jid_bare, node_name):
# Start an XMPP instance and retrieve information
xmpp_instance = XmppInstance(jabber_id, password, jid_bare)
xmpp_instance.connect()
node_items = await XmppXep0060.get_node_items(
xmpp_instance, jid_bare, node_name)
xmpp_instance.disconnect()
if node_items:
supdirectory = 'xep_0060/{}/'.format(jid_bare)
if not os.path.exists(supdirectory): os.mkdir(supdirectory)
directory = 'xep_0060/{}/{}/'.format(jid_bare, node_name)
if not os.path.exists(directory): os.mkdir(directory)
if isinstance(node_items['iq'], stanza.iq.Iq):
iq = node_items['iq']
namespace = '{http://www.w3.org/2005/Atom}'
for item in iq['pubsub']['items']:
item_payload = item['payload']
date_element = item_payload.find(namespace + 'updated')
if not date_element: date_element = item_payload.find(namespace + 'published')
if isinstance(date_element, ET.Element):
date = date_element.text
modification_time = parser.parse(date).timestamp()
filename = directory + item['id'] + '.xml'
xml_item_as_string = str(item)
Data.save_to_file(filename, xml_item_as_string)
if isinstance(date_element, ET.Element):
file_statistics = os.stat(filename)
access_time = file_statistics.st_atime
os.utime(filename, (access_time, modification_time))
#item_payload = item['payload']
#entry = Syndication.extract_atom_items(item_payload)
async def cache_jid_data(
jabber_id, password, jid_bare, node_name=None, item_id=None, alias=None):
iq_disco_items_list = iq_disco_items_items_list = node_note = node_title = title = '' iq_disco_items_list = iq_disco_items_items_list = node_note = node_title = title = ''
jid_vcard = { jid_vcard = {
@ -849,6 +1046,28 @@ class FileUtilities:
jid_info_iq = jid_info['iq'] jid_info_iq = jid_info['iq']
jid_kind = jid_info['kind'] jid_kind = jid_info['kind']
# Set node name to 'urn:xmpp:microblog:0' if JID is an account
if jid_kind == 'account' and not node_name: node_name = 'urn:xmpp:microblog:0'
# vCard4 data
node_name_vcard4 = 'urn:xmpp:vcard4'
item_id_vcard4 = 'current'
vcard4_data = await XmppXep0060.get_node_items(
xmpp_instance, jid_bare, node_name_vcard4, item_ids=[item_id_vcard4])
if vcard4_data:
supdirectory = 'xep_0060/{}/'.format(jid_bare)
if not os.path.exists(supdirectory): os.mkdir(supdirectory)
directory = 'xep_0060/{}/{}/'.format(jid_bare, node_name_vcard4)
if not os.path.exists(directory): os.mkdir(directory)
if isinstance(vcard4_data['iq'], stanza.iq.Iq):
iq = vcard4_data['iq']
for item in iq['pubsub']['items']:
filename = directory + item_id_vcard4 + '.xml'
xml_item_as_string = str(item)
Data.save_to_file(filename, xml_item_as_string)
#item_payload = item['payload']
#vcard4_info = Syndication.extract_vcard4_items(item_payload)
# JID info # JID info
print('JID info') print('JID info')
# NOTE Group chat of Psi+ Project at jabber.ru has a note in its vCard. # NOTE Group chat of Psi+ Project at jabber.ru has a note in its vCard.
@ -976,6 +1195,38 @@ class FileUtilities:
nodes[node_name]['item_ids'].append( nodes[node_name]['item_ids'].append(
[item_id[0] or '', item_id[1] or '', item_id[2] or '']) [item_id[0] or '', item_id[1] or '', item_id[2] or ''])
item_ids = []
for item in nodes[node_name]['item_ids']:
item_ids.append(item[2])
node_items = await XmppXep0060.get_node_items(
xmpp_instance, jid_bare, node_name)
if node_items:
supdirectory = 'xep_0060/{}/'.format(jid_bare)
if not os.path.exists(supdirectory): os.mkdir(supdirectory)
directory = 'xep_0060/{}/{}/'.format(jid_bare, node_name)
if not os.path.exists(directory): os.mkdir(directory)
if isinstance(node_items['iq'], stanza.iq.Iq):
iq = node_items['iq']
namespace = '{http://www.w3.org/2005/Atom}'
for item in iq['pubsub']['items']:
item_payload = item['payload']
date_element = item_payload.find(namespace + 'updated')
if not date_element: date_element = item_payload.find(namespace + 'published')
if isinstance(date_element, ET.Element):
date = date_element.text
modification_time = parser.parse(date).timestamp()
filename = directory + item['id'] + '.xml'
xml_item_as_string = str(item)
Data.save_to_file(filename, xml_item_as_string)
if isinstance(date_element, ET.Element):
file_statistics = os.stat(filename)
access_time = file_statistics.st_atime
os.utime(filename, (access_time, modification_time))
#item_payload = item['payload']
#entry = Syndication.extract_atom_items(item_payload)
xmpp_instance.disconnect() xmpp_instance.disconnect()
# Notes # Notes
@ -1175,36 +1426,202 @@ class Graphics:
class Syndication: class Syndication:
def extract_items(item_payload, limit=False): # def extract_vcard_items(xml_data):
# namespace = '{urn:ietf:params:xml:ns:vcard-4.0}'
# title = xml_data.find(namespace + 'title')
#
# entry = {'fn' : content_text,
# 'note' : link_href,
# 'email' : published_text,
# 'impp' : summary_text,
# 'url' : tags}
# return entry
def extract_vcard_items(xml_data):
"""Extracts all items from a vCard XML ElementTree.
Args:
xml_data (ElementTree): The vCard XML as an ElementTree object.
Returns:
dict: A dictionary where keys are item names and values are their text content.
"""
items = {}
for item in xml_data.iter():
# Skip the root element (vcard)
if item.tag == '{urn:ietf:params:xml:ns:vcard-4.0}vcard':
continue
# Extract item name and text content
item_name = item.tag.split('}')[1]
# Check for any direct text content or child elements
item_text = []
if item.text:
item_text.append(item.text)
for child in item:
if child.text:
item_text.append(child.text)
# Join text elements if multiple found
if item_text:
items[item_name] = ' '.join(item_text).strip() # Strip extra spaces
else:
items[item_name] = None
return items
def extract_vcard4_items(xml_data):
namespace = '{urn:ietf:params:xml:ns:vcard-4.0}'
vcard = {}
element_em = xml_data.find(namespace + 'email')
element_fn = xml_data.find(namespace + 'fn')
element_nn = xml_data.find(namespace + 'nickname')
element_nt = xml_data.find(namespace + 'note')
element_og = xml_data.find(namespace + 'org')
element_im = xml_data.find(namespace + 'impp')
element_ul = xml_data.find(namespace + 'url')
if isinstance(element_em, ET.Element):
for i in element_em:
text = i.text
if text:
email = text
break
else:
email = ''
else:
email = ''
if isinstance(element_fn, ET.Element):
for i in element_fn:
text = i.text
if text:
title = text
break
else:
title = ''
else:
title = ''
if isinstance(element_nn, ET.Element):
for i in element_nn:
text = i.text
if text:
alias = text
break
else:
alias = ''
else:
alias = ''
if isinstance(element_nt, ET.Element):
for i in element_nt:
text = i.text
if text:
note = text
break
else:
note = ''
else:
note = ''
if isinstance(element_og, ET.Element):
for i in element_og:
text = i.text
if text:
org = text
break
else:
org = ''
else:
org = ''
if isinstance(element_im, ET.Element):
for i in element_im:
text = i.text
if text:
impp = text
break
else:
impp = ''
else:
impp = ''
if isinstance(element_ul, ET.Element):
for i in element_ul:
text = i.text
if text:
url = text
break
else:
url = ''
else:
url = ''
extra_resources = {
'code' : [],
'gallery' : [],
'journal' : [],
'movim' : [],
'peertube' : [],
}
for res in extra_resources:
try:
count = len(xml_data.findall(namespace + 'group[@name="' + res + '"]/' + namespace + 'x-ablabel'))
except:
breakpoint()
for p in range(count):
position = str(p + 1)
print(res, position)
for i in xml_data.find(namespace + 'group[@name="' + res + '"]/' + namespace + 'x-ablabel[' + position + ']'):
txt = i.text
for i in xml_data.find(namespace + 'group[@name="' + res + '"]/' + namespace + 'url[' + position + ']'):
uri = i.text
extra_resources[res].append({'label' : txt, 'uri' : uri})
vcard[res] = extra_resources[res]
vcard['alias'] = alias
vcard['email'] = email
vcard['fn'] = title
vcard['note'] = note
vcard['org'] = org
vcard['impp'] = impp
vcard['url'] = url
return vcard
def extract_atom_items(xml_data, limit=False):
# NOTE
# `.//` was not needded when node item payload was passed directly.
# Now that item is saved as xml, it is required to use `.//`.
# Perhaps navigating a level down (i.e. to "child"), or removing the root from the file would solve this.
#namespace = './/{http://www.w3.org/2005/Atom}'
namespace = '{http://www.w3.org/2005/Atom}' namespace = '{http://www.w3.org/2005/Atom}'
title = item_payload.find(namespace + 'title') title = xml_data.find(namespace + 'title')
links = item_payload.find(namespace + 'link') links = xml_data.find(namespace + 'link')
if (not isinstance(title, ET.Element) and if (not isinstance(title, ET.Element) and
not isinstance(links, ET.Element)): return None not isinstance(links, ET.Element)): return None
title_text = '' if title == None else title.text title_text = '' if title == None else title.text
link_href = '' link_href = ''
if isinstance(links, ET.Element): if isinstance(links, ET.Element):
for link in item_payload.findall(namespace + 'link'): for link in xml_data.findall(namespace + 'link'):
link_href = link.attrib['href'] if 'href' in link.attrib else '' link_href = link.attrib['href'] if 'href' in link.attrib else ''
if link_href: break if link_href: break
contents = item_payload.find(namespace + 'content') contents = xml_data.find(namespace + 'content')
content_text = '' content_text = ''
if isinstance(contents, ET.Element): if isinstance(contents, ET.Element):
for content in item_payload.findall(namespace + 'content'): for content in xml_data.findall(namespace + 'content'):
content_text = content.text or '' content_text = content.text or ''
if content_text: break if content_text: break
summaries = item_payload.find(namespace + 'summary') summaries = xml_data.find(namespace + 'summary')
summary_text = '' summary_text = ''
if isinstance(summaries, ET.Element): if isinstance(summaries, ET.Element):
for summary in item_payload.findall(namespace + 'summary'): for summary in xml_data.findall(namespace + 'summary'):
summary_text = summary.text or '' summary_text = summary.text or ''
if summary_text: break if summary_text: break
published = item_payload.find(namespace + 'published') published = xml_data.find(namespace + 'published')
published_text = '' if published == None else published.text published_text = '' if published == None else published.text
categories = item_payload.find(namespace + 'category') categories = xml_data.find(namespace + 'category')
tags = [] tags = []
if isinstance(categories, ET.Element): if isinstance(categories, ET.Element):
for category in item_payload.findall(namespace + 'category'): for category in xml_data.findall(namespace + 'category'):
if 'term' in category.attrib and category.attrib['term']: if 'term' in category.attrib and category.attrib['term']:
category_term = category.attrib['term'] category_term = category.attrib['term']
if len(category_term) < 20: if len(category_term) < 20:
@ -1214,7 +1631,7 @@ class Syndication:
if limit and len(tags) > 4: break if limit and len(tags) > 4: break
identifier = item_payload.find(namespace + 'id') identifier = xml_data.find(namespace + 'id')
if identifier and identifier.attrib: print(identifier.attrib) if identifier and identifier.attrib: print(identifier.attrib)
identifier_text = '' if identifier == None else identifier.text identifier_text = '' if identifier == None else identifier.text
@ -1231,13 +1648,6 @@ class Syndication:
class XmppUtilities: class XmppUtilities:
async def get_item_ids_of_node(jabber_id, password, jid_bare, node_name, nodes):
xmpp_instance = XmppInstance(jabber_id, password, jid_bare)
xmpp_instance.connect()
node_item_ids = await XmppXep0060.get_node_item_ids(xmpp_instance, jid_bare, node_name)
xmpp_instance.disconnect()
return node_item_ids
def set_action_instance_type(jid_kind, node_name=None): def set_action_instance_type(jid_kind, node_name=None):
if jid_kind in ('conference', 'server'): if jid_kind in ('conference', 'server'):
action = 'Discover' action = 'Discover'
@ -1363,13 +1773,13 @@ class XmppXep0030:
async def get_jid_items(self, jid_bare): async def get_jid_items(self, jid_bare):
try: try:
condition = text = None condition = text = ''
error = False error = False
iq = await self['xep_0030'].get_items(jid=jid_bare) iq = await self['xep_0030'].get_items(jid=jid_bare)
except (IqError, IqTimeout) as e: except (IqError, IqTimeout) as e:
#logger.warning('Chat type could not be determined for {}'.format(jid_bare)) #logger.warning('Chat type could not be determined for {}'.format(jid_bare))
#logger.error(e) #logger.error(e)
iq = None iq = ''
error = True error = True
condition = e.iq['error']['condition'] condition = e.iq['error']['condition']
text = e.iq['error']['text'] or 'Error' text = e.iq['error']['text'] or 'Error'
@ -1393,7 +1803,7 @@ class XmppXep0030:
jid_kind = None jid_kind = None
try: try:
error = False error = False
condition = text = None condition = text = ''
iq = await self['xep_0030'].get_info(jid=jid_bare) iq = await self['xep_0030'].get_info(jid=jid_bare)
iq_disco_info = iq['disco_info'] iq_disco_info = iq['disco_info']
if iq_disco_info: if iq_disco_info:
@ -1410,17 +1820,8 @@ class XmppXep0030:
'muc_unmoderated' in features or 'muc_unmoderated' in features or
'muc_unsecured' in features): 'muc_unsecured' in features):
jid_kind = 'muc' jid_kind = 'muc'
else: elif '@' in jid_bare:
for identity in iq_disco_info['identities']: for identity in iq_disco_info['identities']:
if identity[0] == 'pubsub' and identity[1] == 'service':
#if 'http://jabber.org/protocol/pubsub' in features:
#if 'http://jabber.org/protocol/pubsub#access-authorize' in features:
#if 'http://jabber.org/protocol/rsm' in features:
jid_kind = 'pubsub'
break
if identity[0] == 'server' and identity[1] == 'im':
jid_kind = 'server'
break
#if identity[0] == 'pubsub' and identity[1] == 'pep': #if identity[0] == 'pubsub' and identity[1] == 'pep':
if identity[0] == 'account': if identity[0] == 'account':
#if 'urn:xmpp:bookmarks:1#compat-pep' in features: #if 'urn:xmpp:bookmarks:1#compat-pep' in features:
@ -1436,14 +1837,25 @@ class XmppXep0030:
break break
if identity[0] == 'client' and identity[1] == 'bot': if identity[0] == 'client' and identity[1] == 'bot':
jid_kind = 'bot' jid_kind = 'bot'
else:
for identity in iq_disco_info['identities']:
if identity[0] == 'pubsub' and identity[1] == 'service':
#if 'http://jabber.org/protocol/pubsub' in features:
#if 'http://jabber.org/protocol/pubsub#access-authorize' in features:
#if 'http://jabber.org/protocol/rsm' in features:
jid_kind = 'pubsub'
break
if identity[0] == 'server' and identity[1] == 'im':
jid_kind = 'server'
break
#logger.info('Jabber ID: {}\n' #logger.info('Jabber ID: {}\n'
# 'Chat Type: {}'.format(jid_bare, result)) # 'Chat Type: {}'.format(jid_bare, result))
else: else:
iq = condition = text = None iq = condition = text = ''
except (IqError, IqTimeout) as e: except (IqError, IqTimeout) as e:
#logger.warning('Chat type could not be determined for {}'.format(jid_bare)) #logger.warning('Chat type could not be determined for {}'.format(jid_bare))
#logger.error(e) #logger.error(e)
iq = None iq = ''
error = True error = True
condition = e.iq['error']['condition'] condition = e.iq['error']['condition']
text = e.iq['error']['text'] or 'Error' text = e.iq['error']['text'] or 'Error'
@ -1472,7 +1884,7 @@ class XmppXep0045:
if not seconds: seconds = 864000 if not seconds: seconds = 864000
try: try:
error = False error = False
condition = text = None condition = text = ''
#since = datetime.fromtimestamp(time.time()-seconds) #since = datetime.fromtimestamp(time.time()-seconds)
iq = await self['xep_0045'].join_muc_wait( iq = await self['xep_0045'].join_muc_wait(
jid, jid,
@ -1519,7 +1931,7 @@ class XmppXep0054:
async def get_vcard_data(self, jid_bare): async def get_vcard_data(self, jid_bare):
try: try:
error = False error = False
condition = text = None condition = text = ''
iq = await self['xep_0054'].get_vcard(jid_bare) iq = await self['xep_0054'].get_vcard(jid_bare)
except (IqError, IqTimeout) as e: except (IqError, IqTimeout) as e:
error = True error = True
@ -1530,7 +1942,7 @@ class XmppXep0054:
text = 'Could not retrieve vCard' text = 'Could not retrieve vCard'
else: else:
text = 'Unknown Error' text = 'Unknown Error'
iq = None iq = ''
result = { result = {
'error' : error, 'error' : error,
'condition' : condition, 'condition' : condition,
@ -1543,7 +1955,7 @@ class XmppXep0060:
async def get_node_items(self, jid_bare, node_name, item_ids=None, max_items=None): async def get_node_items(self, jid_bare, node_name, item_ids=None, max_items=None):
try: try:
error = False error = False
condition = text = None condition = text = ''
if max_items: if max_items:
iq = await self['xep_0060'].get_items( iq = await self['xep_0060'].get_items(
jid_bare, node_name, timeout=5) jid_bare, node_name, timeout=5)
@ -1561,7 +1973,7 @@ class XmppXep0060:
result = iq result = iq
except (IqError, IqTimeout) as e: except (IqError, IqTimeout) as e:
error = True error = True
iq = None iq = ''
condition = e.iq['error']['condition'] condition = e.iq['error']['condition']
text = e.iq['error']['text'] text = e.iq['error']['text']
if not text: if not text:
@ -1579,7 +1991,7 @@ class XmppXep0060:
async def get_node_item_ids(self, jid_bare, node_name): async def get_node_item_ids(self, jid_bare, node_name):
try: try:
error = False error = False
condition = text = None condition = text = ''
iq = await self['xep_0030'].get_items( iq = await self['xep_0030'].get_items(
jid_bare, node_name) jid_bare, node_name)
# Broken. See https://codeberg.org/poezio/slixmpp/issues/3548 # Broken. See https://codeberg.org/poezio/slixmpp/issues/3548
@ -1587,7 +1999,7 @@ class XmppXep0060:
# jid_bare, node_name, timeout=5) # jid_bare, node_name, timeout=5)
except (IqError, IqTimeout) as e: except (IqError, IqTimeout) as e:
error = True error = True
iq = None iq = ''
condition = e.iq['error']['condition'] condition = e.iq['error']['condition']
text = e.iq['error']['text'] text = e.iq['error']['text']
if not text: if not text:

351
img/atalk.svg Normal file
View file

@ -0,0 +1,351 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
viewBox="0 0 600 600"
version="1.1"
id="svg4"
sodipodi:docname="atalk_036.svg"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
inkscape:export-filename="icon-64.png"
inkscape:export-xdpi="10.24"
inkscape:export-ydpi="10.24"
width="600"
height="600"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs8">
<rect
x="319.08493"
y="50.624052"
width="200.96215"
height="133.46341"
id="rect1" />
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow"
id="filter58"
x="-0.15668301"
y="-0.17402648"
width="1.3803737"
height="1.4224778"
inkscape:menu-tooltip="Shadowy outer bevel"
inkscape:menu="Shadows and Glows">
<feColorMatrix
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 "
id="feColorMatrix55" />
<feColorMatrix
type="hueRotate"
values="48"
result="colormatrix2"
id="feColorMatrix56" />
<feColorMatrix
in="colormatrix2"
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0 "
result="colormatrix3"
id="feColorMatrix57" />
<feBlend
in="colormatrix3"
in2="colormatrix2"
mode="lighten"
result="blend1"
id="feBlend57" />
<feBlend
in2="blend1"
mode="multiply"
result="blend2"
id="feBlend58" />
<feComposite
in2="SourceGraphic"
operator="in"
id="feComposite58"
result="fbSourceGraphic" />
<feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix118" />
<feOffset
id="feOffset118"
dy="3"
dx="3"
in="fbSourceGraphic" />
<feGaussianBlur
id="feGaussianBlur118"
stdDeviation="3"
result="blur" />
<feFlood
id="feFlood118"
flood-color="rgb(0,0,0)"
flood-opacity="1"
result="flood" />
<feComposite
id="feComposite118"
in="flood"
in2="fbSourceGraphic"
operator="in"
result="composite" />
<feBlend
id="feBlend118"
in="blur"
in2="composite"
mode="normal"
result="fbSourceGraphic" />
<feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix119" />
<feMorphology
id="feMorphology119"
result="result1"
in="fbSourceGraphicAlpha"
operator="dilate"
radius="3.6" />
<feGaussianBlur
id="feGaussianBlur119"
stdDeviation="3.6"
in="result1"
result="result0" />
<feDiffuseLighting
id="feDiffuseLighting119"
surfaceScale="-5">
<feDistantLight
id="feDistantLight119"
elevation="45"
azimuth="225" />
</feDiffuseLighting>
<feComposite
id="feComposite119"
in2="result0"
operator="in"
result="result91" />
<feComposite
id="feComposite120"
in="fbSourceGraphic"
in2="result91"
result="fbSourceGraphic" />
<feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix144" />
<feFlood
id="feFlood144"
result="flood"
in="fbSourceGraphic"
flood-opacity="0.501961"
flood-color="rgb(255,255,255)" />
<feGaussianBlur
id="feGaussianBlur144"
result="blur"
in="fbSourceGraphic"
stdDeviation="13.000000" />
<feOffset
id="feOffset144"
result="offset"
in="blur"
dx="16.000000"
dy="16.000000" />
<feComposite
id="feComposite144"
result="comp1"
operator="out"
in="flood"
in2="offset" />
<feComposite
id="feComposite145"
result="fbSourceGraphic"
operator="atop"
in="comp1"
in2="fbSourceGraphic" />
<feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix148" />
<feFlood
id="feFlood148"
result="flood"
in="fbSourceGraphic"
flood-opacity="0.501961"
flood-color="rgb(3,3,3)" />
<feGaussianBlur
id="feGaussianBlur148"
result="blur"
in="fbSourceGraphic"
stdDeviation="13.000000" />
<feOffset
id="feOffset148"
result="offset"
in="blur"
dx="16.000000"
dy="16.000000" />
<feComposite
id="feComposite148"
result="comp1"
operator="in"
in="flood"
in2="offset" />
<feComposite
id="feComposite149"
result="comp2"
operator="over"
in="fbSourceGraphic"
in2="comp1" />
</filter>
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow"
id="filter11"
x="-0.1765346"
y="-0.17398394"
width="1.4435998"
height="1.4371904">
<feFlood
result="flood"
in="SourceGraphic"
flood-opacity="0.501961"
flood-color="rgb(3,3,3)"
id="feFlood10" />
<feGaussianBlur
result="blur"
in="SourceGraphic"
stdDeviation="13.000000"
id="feGaussianBlur10" />
<feOffset
result="offset"
in="blur"
dx="16.000000"
dy="16.000000"
id="feOffset10" />
<feComposite
result="comp1"
operator="out"
in="flood"
in2="offset"
id="feComposite10" />
<feComposite
result="comp2"
operator="atop"
in="comp1"
in2="SourceGraphic"
id="feComposite11" />
</filter>
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow"
id="filter321"
x="-0.43201944"
y="-1.1298296"
width="1.8843038"
height="3.256447">
<feFlood
result="flood"
in="SourceGraphic"
flood-opacity="0.960784"
flood-color="rgb(188,246,230)"
id="feFlood320" />
<feGaussianBlur
result="blur"
in="SourceGraphic"
stdDeviation="23.179838"
id="feGaussianBlur320" />
<feOffset
result="offset"
in="blur"
dx="2.609541"
dy="-0.158615"
id="feOffset320" />
<feComposite
result="comp1"
operator="in"
in="flood"
in2="offset"
id="feComposite320" />
<feComposite
result="fbSourceGraphic"
operator="over"
in="SourceGraphic"
in2="comp1"
id="feComposite321" />
<feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix34" />
<feFlood
id="feFlood34"
result="flood"
in="fbSourceGraphic"
flood-opacity="1.000000"
flood-color="rgb(141,49,49)" />
<feGaussianBlur
id="feGaussianBlur34"
result="blur"
in="fbSourceGraphic"
stdDeviation="23.179838" />
<feOffset
id="feOffset34"
result="offset"
in="blur"
dx="2.609541"
dy="-0.158615" />
<feComposite
id="feComposite34"
result="comp1"
operator="out"
in="flood"
in2="offset" />
<feComposite
id="feComposite35"
result="comp2"
operator="atop"
in="comp1"
in2="fbSourceGraphic" />
</filter>
</defs>
<sodipodi:namedview
id="namedview6"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="false"
inkscape:zoom="0.92187499"
inkscape:cx="264.67797"
inkscape:cy="199.59322"
inkscape:window-width="1916"
inkscape:window-height="1032"
inkscape:window-x="0"
inkscape:window-y="22"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. -->
<path
id="path2"
style="fill:#8ce74f;fill-opacity:1;filter:url(#filter58)"
d="m 300.01516,76 c -59.62279,0 -378.025346,49.63448 -225.284482,373.02537 41.684092,74.17265 61.062702,119.18402 135.403712,86.35509 20.22694,-22.72178 -0.0849,-43.90291 -14.21884,-61.28085 C 227.71546,485.59958 262.91528,492 300.01516,492 c 141.39958,0 256,-93.10033 256,-208 0,-114.89967 -114.60042,-208 -256,-208 z"
sodipodi:nodetypes="scccsss" />
<path
style="fill:#006698;fill-opacity:1;stroke-width:1.92353;filter:url(#filter11)"
d="m 124.14035,365.85704 c -27.449562,-9.00155 -42.961559,-29.0499 -48.9111,-63.21472 -7.865315,-45.166 6.341115,-88.63235 34.26759,-104.84599 28.55325,-16.57753 53.10174,-10.23666 71.26795,18.40852 l 7.01626,11.06347 3.4721,-16.14247 3.4721,-16.14245 18.57456,-0.75353 c 18.38262,-0.74574 18.57458,-0.68615 18.57458,5.76602 0,3.58576 -4.8885,27.00716 -10.86334,52.04755 -5.97483,25.0404 -10.7376,50.4123 -10.58389,56.38202 0.33137,12.86973 6.702,23.76944 13.89274,23.76944 5.25342,0 5.96234,-1.10074 8.67148,-13.46467 1.26457,-5.77115 2.93486,-7.05293 9.19067,-7.05293 7.12723,0 7.64428,0.65163 7.63093,9.61763 -0.0344,23.11555 -14.65035,46.80578 -28.87741,46.80578 -8.38609,0 -18.18451,-8.00687 -23.49594,-19.19988 l -4.30902,-9.0806 -6.59774,7.84097 c -3.62875,4.31249 -11.27397,10.22658 -16.98942,13.14238 -11.29781,5.76371 -35.14374,8.41781 -45.4031,5.05346 z m 28.80848,-28.4386 c 7.79124,-6.12858 15.82173,-24.18381 20.18015,-45.37175 3.07914,-14.96881 2.89211,-16.74401 -3.62303,-34.3907 -3.77837,-10.23393 -9.79895,-23.60544 -13.37905,-29.71442 -11.128,-18.98851 -25.76761,-17.469 -35.10685,3.64389 -6.6191,14.96358 -9.18871,59.17224 -4.69408,80.75864 5.50464,26.43715 21.21548,37.1938 36.62286,25.07434 z"
id="path1"
transform="matrix(1.3872184,0,0,1.3872184,-30.31737,-98.981594)" />
<text
xml:space="preserve"
style="font-size:128.258px;line-height:1.25;font-family:McDonalds;-inkscape-font-specification:'McDonalds, Normal';text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;text-anchor:middle;fill:#ebbe04;fill-opacity:1;stroke-width:1.70987;filter:url(#filter321);stop-color:#000000"
x="386.4335"
y="320.24927"
id="text2"
transform="matrix(0.78555009,0,0,0.78555009,108.62159,64.609475)"><tspan
id="tspan2"
x="386.4335"
y="320.24927"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:Sans;-inkscape-font-specification:'Sans Bold';text-align:center;baseline-shift:baseline;text-anchor:middle;fill:#ebbe04;fill-opacity:1;stroke-width:1.70987"
sodipodi:role="line">Talk</tspan></text>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

1
img/beagle.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 12 KiB

1
img/bruno.svg Normal file
View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><text y=".9em" font-size="80">🐻️</text></svg>

After

Width:  |  Height:  |  Size: 113 B

109
img/bsd.svg Normal file
View file

@ -0,0 +1,109 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
viewBox="0 0 191 208"
style="fill:#d10000;stroke:#000000;stroke-linecap:round;stroke-linejoin:round"
id="svg2">
<path
d="m 112,135 c 4,37 38,38 53,42 44,9 22,26 4,26 l 1,3 -38,1 31,-18 3,8 c 5,2 38,-10 -15,-15 -22,-4 -36,-9 -44,-19 L 80,179 C 73,163 52,157 61,136"
id="path4" />
<path
d="m 106,157 c 2,1 5,-3 4,-5 L 37,98 c 0,-3 7,-9 -3,-17 l 1,-2 -13,-6 c 2,4 4,5 6,12 l 4,-2 c 4,5 4,9 0,11 l -7,-5 c 0,-1 1,-2 1,-3 0,0 -1,-1 -4,-1 -2,0 -6,-4 -9,-4 0,3 5,8 5,13 l 3,-2 c 3,1 5,3 7,6 -3,4 -7,6 -15,2 0,-2 2,-3 2,-5 -4,0 -9,-3 -14,-6 2,7 8,15 14,17 10,4 14,-3 19,-3 z"
style="fill:#ffd700"
id="path6" />
<path
d="M 78,92 48,55 C 50,50 49,43 48,40 43,23.5 54,16 64,8 72,2 76,1 78,2 c 2,2 -8,8 -10,15 0,0 -2,11 5,6 6,-3 14,-5 23,-3 7,1 18,5 25,13 21,-4 9,-17 7,-25 7,-6 43.5,31 -1,55 0,14 -3,23 -12,31 -11,9 -4,13 -2,19 5,17 3,28 -17,31 -14,2 -16,8 -27,0"
id="path8" />
<path
d="m 73,32 c 1,-4 -9,-11 -20,10 -1,3 -5,11 -5,11 -1,4 -2,9 -4,11 -10,10 -5,23 8,28 3,1 12,8 18,11 3,2 0,9 -5,8 -27,-6 -28,13 -17,16 l 39,-2"
id="path10" />
<path
d="m 79,31 c 4,-4 11,-4 14,2 1,2 1,4 2,5"
style="fill:none"
id="path12" />
<path
d="m 50,85 c 5,1 5,4 11,9 10,8 22,1 25,-1 4,-2 4,-5 8,-3"
style="stroke-width:1.5"
id="path14" />
<path
d="m 63,71 c -12,-7 -15,4 -10,9 1,1 4,1 6,2 2,1 3,-3 8,-0.5 4,2.5 6,-2.5 2,-4.5"
id="path16" />
<path
d="m 70,37 c 0,-3 -6,-5 -13,6 -8,13 -7,20 -3,23 3,2 6,1 9,-8 2,-5 7,-18 7,-21 z"
style="fill:#ffffff"
id="path18" />
<path
d="M 82,36 C 92,34 91,71 75,72 57,73 69,39 82,36 Z"
style="fill:#ffffff"
id="path20" />
<g
style="stroke:none;fill:#000000"
id="g30">
<path
d="m 77,54 c 5,4 -1,20 -8,14 -5,-5 2,-19 8,-14 z"
id="path22" />
<path
d="m 60,52 c 5,4 -3,17 -6,11 -3,-4 0,-15 6,-11 z"
id="path24" />
<path
d="m 57,53 c 1,0 1,6 0,6 -3,0 -2,-6 0,-6 z"
style="fill:#ffffff"
id="path26" />
<path
d="m 73,57 c 1,0 1,4 -1,4 -1,0 -2,-4 1,-4 z"
style="fill:#ffffff"
id="path28" />
</g>
<path
d="m 75,144 c -5,0 -8,1 -14,-6"
id="path32" />
<path
d="m 70,138 c -26,2 -6,-35 14,-19 4,3 8,4 14,2"
id="path34" />
<path
d="m 66,120 c 3,5 -7,13 -13,8 -6,-5 10,-12 13,-8 z"
id="path36" />
<path
d="m 60,110 c -23,-3 -22,14 -12,17 11,3 23,-13 12,-17 z"
id="path38" />
<path
d="m 54,115 c 1,7 -14,11 -17,1 -2,-7 15,-17 17,-1 z"
id="path40" />
<path
d="m 57,101 c 6,8 -9,12 -13,7 -8,-9 8,-13 13,-7 z"
id="path42" />
<path
d="m 36,176 c 13,-1 35,-1 29,-11 -2,-3 -1,-5 -1,-7 2,8 18,3 17,13 l -19,26 z"
style="fill:#00b000"
id="path44" />
<path
d="m 94,166 c 4,-2 8,0 12,-3 7,7 7,17 9,19 L 81,196 59,185 c 10,-12 21,-7 22,-14 2,-12 8,-9 13,-4 0,0 1,10 -2,10 -7,1 -22,7 -22,7"
style="fill:#00b000"
id="path46" />
<path
d="m 19,181 c 2,-3 30,-11 30,1 l -17,9 z"
style="fill:#ffffff"
id="path48" />
<path
d="m 108,173 c 0,7 -6,6 -7,3 -2,-7 7,-8 7,-3 z"
style="fill:#f4fff4"
id="path50" />
<path
d="m 42,191 c -25,3 -25,-4 -25,-4 0,-5 0,-5 2,-6 3,4 20,6 28,2"
style="fill:#ffffff"
id="path52" />
<path
d="m 78,192 c 0,-18 -29,-16 -35,-5 l 13,10 z"
style="fill:#ffffff"
id="path54" />
<path
d="m 114,181 c 2,-1 1,3 1,7 -20,13 -62,14 -73,5 0,-4 0,-5 1,-7 6,10 63,6 71,-5 z"
style="fill:#ffffff"
id="path56" />
<path
d="m 67,169 10,1 m -12,2 10,2 m -15,0 8,2 m -16,0 12,2 m 18,-8 12,1 m -13,2 12,2 m -16,1 7,1 m -13,1 8,1"
style="stroke:#00ffff"
id="path58" />
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

1
img/candy.svg Normal file
View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><text y=".9em" font-size="80">🍭️</text></svg>

After

Width:  |  Height:  |  Size: 113 B

1
img/chat-o-matic.svg Normal file
View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><text y=".9em" font-size="80">💬️</text></svg>

After

Width:  |  Height:  |  Size: 113 B

43
img/convo.svg Normal file
View file

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
viewBox="0 0 600 600"
version="1.1"
id="svg4"
sodipodi:docname="icon.svg"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
inkscape:export-filename="icon-64.png"
inkscape:export-xdpi="10.24"
inkscape:export-ydpi="10.24"
width="600"
height="600"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs8" />
<sodipodi:namedview
id="namedview6"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="false"
inkscape:zoom="0.65186406"
inkscape:cx="304.51134"
inkscape:cy="246.21698"
inkscape:window-width="1366"
inkscape:window-height="700"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. -->
<path
id="path2"
style="fill:#6800a5;fill-opacity:1"
d="M 300.01516,76 C 158.61558,76 44.015164,169.10033 44.015164,284 c 0,45.09985 17.69931,86.8009 47.69922,120.80078 -1.89999,24.49994 -11.39846,46.2985 -21.39843,62.89844 -5.59999,9.19997 -11.10119,16.60159 -15.20118,21.60156 -2.09999,2.6 -3.80039,4.49922 -4.90039,5.69922 -0.59999,0.7 -0.99883,1.10039 -1.29882,1.40039 l -0.30079,0.29883 c -4.49998,4.59997 -5.90038,11.40042 -3.40039,17.40039 2.5,5.99997 8.3008,9.90039 14.80078,9.90039 28.69992,0 57.599686,-8.90081 81.599606,-19.30078 22.99994,-9.99997 42.40081,-21.89964 54.30078,-30.59961 C 227.71546,485.59958 262.91528,492 300.01516,492 c 141.39958,0 256,-93.10033 256,-208 0,-114.89967 -114.60042,-208 -256,-208 z M 136.01712,187.12695 c 0.24553,-0.0116 0.49445,-0.0101 0.74414,0.006 0.57072,0.0366 1.15112,0.14543 1.72851,0.33789 l 86.96289,28.98633 c 2.69618,0.90095 4.47893,3.40874 4.55273,6.24609 2.42723,101.41241 82.0881,177.84744 135.29883,183.2129 3.3551,0.34291 5.83594,3.26732 5.83594,6.64257 v 0.21485 c 0,3.77866 -3.11869,6.90637 -6.89062,6.73828 -116.96416,-5.20422 -226.13025,-141.19171 -234.62891,-225.0353 -0.40263,-3.97112 2.71348,-7.17559 6.39649,-7.34961 z m 308.87109,0.0215 c 3.6866,0.16878 6.78452,3.37064 6.39843,7.34179 -5.64785,55.7389 -55.80613,134.54128 -123.24414,182.61524 -9.6148,-6.18577 -19.29615,-14.25405 -28.37304,-23.73438 28.17199,-32.67682 49.95492,-78.33078 51.23242,-130.64062 0.0673,-2.89116 1.88283,-5.37983 4.57226,-6.25391 l 86.9375,-28.97851 c 0.57992,-0.19331 1.16065,-0.30437 1.73243,-0.3418 0.25015,-0.0164 0.49836,-0.0191 0.74414,-0.008 z M 252.46828,393.10742 c 7.26153,4.84102 14.65816,9.41307 22.25586,13.44727 -18.82617,7.46322 -38.32514,12.10248 -58.02539,12.97656 -3.83247,0.13448 -6.92578,-2.95856 -6.92578,-6.79102 v -0.20117 c 0,-3.36181 2.48779,-6.25364 5.84961,-6.58984 11.43018,-1.143 24.00356,-5.58027 36.8457,-12.8418 z" />
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

1
img/coyim.svg Normal file
View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><text y=".9em" font-size="80">🐠️</text></svg>

After

Width:  |  Height:  |  Size: 113 B

295
img/dergchat.svg Normal file
View file

@ -0,0 +1,295 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="100mm"
height="100mm"
viewBox="0 0 100 100"
version="1.1"
id="svg5"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="icon.svg"
inkscape:export-filename="icon.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
showgrid="true"
inkscape:zoom="1.2300419"
inkscape:cx="251.61744"
inkscape:cy="183.73357"
inkscape:window-width="1920"
inkscape:window-height="1008"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1">
<inkscape:grid
type="xygrid"
id="grid1854"
units="mm"
spacingx="0.99999999"
spacingy="0.99999999" />
</sodipodi:namedview>
<defs
id="defs2">
<linearGradient
inkscape:collect="always"
id="linearGradient10006">
<stop
style="stop-color:#71c837;stop-opacity:1;"
offset="0"
id="stop10002" />
<stop
style="stop-color:#5ba12c;stop-opacity:1;"
offset="1"
id="stop10004" />
</linearGradient>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath8209">
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#008000;fill-opacity:1;stroke:#004c00;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 83.71656,46.122451 c -4.141638,-5.786928 -24.602339,4.880624 -18.073725,15.731657 5.049359,8.392398 15.885237,16.809425 22.338369,13.26227 7.185491,-3.949718 2.459381,-19.59874 -4.264644,-28.993927 z"
id="path8211"
sodipodi:nodetypes="ssss" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath8344">
<path
style="fill:#008000;stroke:#004c00;stroke-width:1;stroke-dasharray:none;stroke-opacity:1"
d="m 18.85781,74.554798 c -0.753459,4.71305 11.543233,-6.563683 17.316015,-9.846957 0,0 15.455353,2.53462 19.460788,-0.676051 8.39054,-6.725682 14.151464,-0.01966 14.151464,-0.01966 l 9.999995,-9.999998 c 0,0 -9.748164,-27.556223 -33.042252,-14.738282 C 21.200823,53.329286 19.906013,67.998055 18.85781,74.554801 Z"
id="path8346"
sodipodi:nodetypes="scsccss" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath9934">
<path
id="path9936"
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#008000;fill-opacity:1;stroke:#004c00;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 39.448556,56.246421 c -10.398519,1.505504 -1.448632,15.919371 -0.785472,17.810285 0.829183,2.364316 8.992991,2.190922 7.000708,-3.072397 -1.992285,-5.26332 -0.773413,-15.525759 -6.215236,-14.737888 z m 16.781543,-3.376253 c -5.367345,1.433359 -1.013527,15.819473 -0.785472,17.810285 0.298893,2.609216 8.992991,2.19092 7.000708,-3.072397 -1.992285,-5.26332 -0.902846,-16.156573 -6.215236,-14.737888 z" />
</clipPath>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient10006"
id="radialGradient10008"
cx="52.043739"
cy="47.423241"
fx="52.043739"
fy="47.423241"
r="47.5"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.5929284,0.03742092,-0.03034147,1.2915708,-29.072985,-15.889365)" />
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath11179">
<rect
style="font-variation-settings:normal;opacity:1;fill:#9dda75;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
id="rect11181"
width="23.999998"
height="20"
x="115"
y="69.999992"
ry="1.9999994" />
</clipPath>
</defs>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<rect
style="font-variation-settings:normal;opacity:1;fill:url(#radialGradient10008);fill-opacity:1;stroke:#447821;stroke-width:5.26316;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
id="rect8067"
width="94.736839"
height="94.736839"
x="2.6315789"
y="2.6315789"
ry="21.052631" />
<g
id="g10217"
transform="matrix(0.69369492,-0.26819043,0.26819043,0.69369492,-29.470144,52.699155)">
<rect
style="font-variation-settings:normal;opacity:1;fill:#9dda75;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
id="rect10105"
width="23.999998"
height="20"
x="115"
y="70"
ry="1.9999993" />
<path
style="font-variation-settings:normal;opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
d="m 115,74.999999 10,6.999999 c 1,0.699999 4,0.666667 5,0 l 9,-5.999999"
id="path10213"
sodipodi:nodetypes="cssc" />
<g
id="g11962">
<path
style="font-variation-settings:normal;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.68914;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
d="m 115.89911,69.889704 c 0,0 1.03455,11.302999 1.14876,15.742368 0.0451,1.754783 1.30359,2.300595 2.2137,2.355096 2.86978,0.171856 22.27725,0.394848 22.27725,0.394848 l -1.33212,3.019662 -27.47627,0.573604 z"
id="path11143"
sodipodi:nodetypes="csscccc"
clip-path="url(#clipPath11179)" />
<path
style="font-variation-settings:normal;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.68914;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
d="m 115.34453,75.440603 10.2355,6.945123 3.70805,-0.01909 9.28996,-5.468139 0.36251,1.302173 -9.42751,5.623366 c -1.49081,0.889242 -4.13381,0.206164 -5.51291,-0.848024 l -8.72892,-6.597569 z"
id="path11958"
sodipodi:nodetypes="cccccsscc" />
</g>
</g>
<g
id="g8013"
transform="matrix(0.88023637,0,0,0.88023637,4.0016682,7.1036)">
<use
x="0"
y="0"
xlink:href="#g3356"
id="use7725"
transform="rotate(57.325012,58.0811,51.730676)"
inkscape:transform-center-x="23.11366"
inkscape:transform-center-y="-20.321275" />
<path
style="fill:#008000;stroke:#004c00;stroke-width:1;stroke-dasharray:none;stroke-opacity:1"
d="m 18.85781,74.554799 c -0.753459,4.713049 11.543233,-6.563685 17.316016,-9.846959 0,0 15.455353,2.534622 19.460787,-0.67605 8.39054,-6.725682 14.151463,-0.01966 14.151463,-0.01966 l 9.999997,-9.999998 c 0,0 -9.748166,-27.556225 -33.042254,-14.738283 C 21.200823,53.329284 19.906013,67.998051 18.85781,74.554799 Z"
id="path2273"
sodipodi:nodetypes="scsccss" />
<path
style="font-variation-settings:normal;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;stroke-width:5.68028;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
d="m 67.594995,57.872933 c -13.607376,-0.89011 -12.158217,9.262458 -36.197942,1.275272 l 1.728803,3.007215 c 0,0 -4.854141,5.590188 -8.492098,7.576329 -3.637957,1.986145 -7.798788,4.036957 -7.798788,4.036957 l 1.347534,6.41359 35.977215,-12.679535 12.838386,-2.615705 z"
id="path8338"
clip-path="url(#clipPath8344)"
sodipodi:nodetypes="cccsccccc" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#004c00;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 36.173825,64.707838 C 31.347092,61.651482 31.363796,58.907426 31.363796,58.907426"
id="path4588"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#004c00;stroke-width:1;stroke-dasharray:none;stroke-opacity:1"
d="m 18.85781,74.554799 c -0.753459,4.713049 11.543233,-6.563685 17.316016,-9.846959 0,0 15.455353,2.534622 19.460787,-0.67605 8.39054,-6.725682 14.151463,-0.01966 14.151463,-0.01966 l 9.999997,-9.999998 c 0,0 -9.748166,-27.556225 -33.042254,-14.738283 C 21.200823,53.329284 19.906013,67.998051 18.85781,74.554799 Z"
id="path8340"
sodipodi:nodetypes="scsccss" />
<path
id="path7484"
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#008000;fill-opacity:1;stroke:#004c00;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 39.448556,56.246421 c -10.398519,1.505505 -1.448632,15.919372 -0.785473,17.810285 0.829185,2.364316 8.992991,2.190922 7.000708,-3.072397 C 43.671507,65.72099 44.890378,55.45855 39.448556,56.246421 Z m 16.781543,-3.376254 c -5.367344,1.433359 -1.013527,15.819475 -0.785473,17.810285 0.298895,2.609218 8.992991,2.190922 7.000708,-3.072397 C 60.45305,62.344736 61.54249,51.451483 56.230099,52.870167 Z" />
<g
id="g3356"
transform="translate(4.7860765,4.0121292)">
<path
style="fill:#88aa00;stroke:#009100;stroke-width:2;stroke-dasharray:none;stroke-opacity:1"
d="m 5,69.999999 c -1.5952371,-16.344298 2.7313479,-31.481559 14.999999,-45 14.535824,0.703796 28.396545,2.418473 34.999999,15 -8.151845,0.523112 -15.206319,2.12096 -18.89888,5.624524 -7.075517,1.919785 -11.710211,4.312603 -14.267113,8.930108 C 14.930307,55.426605 10.270667,63.176202 5,69.999999 Z"
id="path2275"
sodipodi:nodetypes="cccccc" />
<g
id="g3300">
<path
style="fill:none;stroke:#008000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
d="m 5,69.999999 c -1.5952371,-16.344298 2.7313479,-31.481559 14.999999,-45 14.535824,0.703796 28.396545,2.418473 34.999999,15 l 0.558521,1.049828"
id="path2485"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#008000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
d="m 19.999999,24.999999 c -4.999999,20 2.502612,30.690283 2.502612,30.690283"
id="path2541"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#008000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
d="m 19.999999,24.999999 c 0,15 17.412568,21.159772 17.412568,21.159772"
id="path2543"
sodipodi:nodetypes="cc" />
</g>
</g>
<g
id="g9120">
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#f2f2f2;fill-opacity:1;stroke:#999999;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 70.53091,48.515346 C 63.972875,41.576666 58.808595,41.835987 58.808595,41.835987 l 8.150429,8.81355 z"
id="path7944" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#f2f2f2;fill-opacity:1;stroke:#999999;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 80.124742,45.961739 C 74.892231,37.975881 69.763084,37.32099 69.763084,37.32099 l 6.469552,10.112025 z"
id="path7834" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#008000;fill-opacity:1;stroke:#004c00;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 83.716559,46.12245 c -4.141637,-5.786928 -24.602337,4.880625 -18.073723,15.731657 5.049357,8.392399 15.885236,16.809425 22.338368,13.26227 7.185491,-3.949717 2.459381,-19.59874 -4.264645,-28.993927 z"
id="path3302"
sodipodi:nodetypes="ssss" />
<circle
style="font-variation-settings:normal;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
id="path3426"
cx="72.029579"
cy="58.315758"
r="3.3357258" />
<ellipse
style="font-variation-settings:normal;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
id="path3534"
cx="26.504004"
cy="88.710434"
rx="0.6068185"
ry="0.94321293"
transform="rotate(-35.519505)" />
<ellipse
style="font-variation-settings:normal;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
id="ellipse3588"
cx="26.504004"
cy="88.710434"
rx="0.6068185"
ry="0.94321293"
transform="rotate(-35.519505)" />
<circle
style="font-variation-settings:normal;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
id="circle3590"
cx="81.910553"
cy="52.568935"
r="3.3357258" />
<ellipse
style="font-variation-settings:normal;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
id="ellipse3592"
cx="37.885094"
cy="89.773643"
rx="0.6068185"
ry="0.94321293"
transform="rotate(-35.519505)" />
<path
style="font-variation-settings:normal;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;stroke-width:5.68028;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
d="M 89.264729,56.351358 C 91.351501,66.637094 89.571418,73.211886 81.471213,71.177742 72.369744,68.892157 63.425016,56.586027 63.425016,56.586027 l -1.05837,5.945025 12.183522,17.196601 C 75.81006,82.989632 98.042713,73.827834 97.114825,72.190992 96.844229,71.713647 92.247089,51.413663 92.247089,51.413663 Z"
id="path8175"
sodipodi:nodetypes="cscccscc"
clip-path="url(#clipPath8209)" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#004c00;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 83.716559,46.12245 c -4.141637,-5.786928 -24.602337,4.880625 -18.073723,15.731657 5.049357,8.392399 15.885236,16.809425 22.338368,13.26227 7.185491,-3.949717 2.459381,-19.59874 -4.264645,-28.993927 z"
id="path8204"
sodipodi:nodetypes="ssss" />
<path
style="font-variation-settings:normal;opacity:0.3;fill:none;fill-opacity:1;stroke:none;stroke-width:5.68028;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
d="m 66.966809,56.898966 c -0.318969,-0.143904 -0.624772,-0.321554 -0.95691,-0.431711 -0.338978,-0.112427 -0.703115,-0.132217 -1.045869,-0.23254 -0.324316,-0.09493 -0.626612,-0.256324 -0.950748,-0.351858 -0.330138,-0.0973 -0.683102,-0.110762 -1.007644,-0.225358 -0.211294,-0.07461 -0.385154,-0.229387 -0.582231,-0.336033 -0.187464,-0.101444 -0.389608,-0.175946 -0.570937,-0.287994 -0.118592,-0.07328 -0.198872,-0.202743 -0.323694,-0.264816 -0.173863,-0.08646 -0.373933,-0.106135 -0.556309,-0.172793 -1.376861,-0.503255 0.284396,0.07313 -0.761861,-0.368095 -0.122662,-0.05173 -0.295779,0.0077 -0.389909,-0.0864 -0.02035,-0.02035 0.01939,-0.06511 0,-0.0864 -0.04735,-0.05196 -0.416319,0.01888 -0.472963,0 -0.03864,-0.0129 -0.0459,-0.08206 -0.0864,-0.0864 -0.06648,-0.0071 0.0389,0.365973 0.0864,0.647871 0.09322,0.553324 0.193316,0.917146 -0.241738,1.356209 -0.08451,0.08529 -0.127013,0.169573 -0.250841,0.169573"
id="path8336" />
</g>
<path
id="path9203"
style="font-variation-settings:normal;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;stroke-width:5.68028;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
d="m 55.411114,51.425246 c 0.645788,10.095843 -0.814631,17.621113 2.948681,18.041354 3.763313,0.420241 5.686813,-0.758631 5.686813,-0.758631 l -0.620179,5.197832 -10.075778,1.213186 -3.082447,-19.41105 z m -19.788048,4.399985 c 0.995964,9.019988 3.426876,17.57629 7.520756,17.324883 4.093884,-0.25141 5.922139,-1.552925 5.922139,-1.552925 l -3.506414,5.997882 -7.014598,0.262995 -8.800976,-18.076232 z"
clip-path="url(#clipPath9934)" />
<path
id="path9938"
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#004c00;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 39.448556,56.246421 c -10.398519,1.505505 -1.448632,15.919372 -0.785473,17.810285 0.829185,2.364316 8.992991,2.190922 7.000708,-3.072397 C 43.671507,65.72099 44.890378,55.45855 39.448556,56.246421 Z m 16.781543,-3.376254 c -5.367344,1.433359 -1.013527,15.819475 -0.785473,17.810285 0.298895,2.609218 8.992991,2.190922 7.000708,-3.072397 C 60.45305,62.344736 61.54249,51.451483 56.230099,52.870167 Z" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 20 KiB

724
img/leechcraft.svg Normal file
View file

@ -0,0 +1,724 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.0"
width="96"
height="96"
id="svg2408"
inkscape:version="0.48.1 r9760"
sodipodi:docname="main.svg"
inkscape:export-filename="/home/buckstabu/Dropbox/Public/lcicons/lcproto2.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1020"
id="namedview68"
showgrid="false"
inkscape:zoom="6.6666666"
inkscape:cx="53.537878"
inkscape:cy="36.716849"
inkscape:window-x="-8"
inkscape:window-y="-4"
inkscape:window-maximized="1"
inkscape:current-layer="svg2408" />
<defs
id="defs2410">
<linearGradient
id="linearGradient4017">
<stop
style="stop-color:#ff6600;stop-opacity:1;"
offset="0"
id="stop4019" />
<stop
style="stop-color:#ff1e00;stop-opacity:1;"
offset="1"
id="stop4021" />
</linearGradient>
<linearGradient
id="linearGradient4145">
<stop
style="stop-color:#ff5d00;stop-opacity:1;"
offset="0"
id="stop4147" />
<stop
style="stop-color:#00b1ff;stop-opacity:0;"
offset="1"
id="stop4149" />
</linearGradient>
<linearGradient
id="linearGradient3224">
<stop
id="stop3226"
style="stop-color:#42394b;stop-opacity:1"
offset="0" />
<stop
id="stop3228"
style="stop-color:#000000;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3465">
<stop
id="stop3467"
style="stop-color:#919191;stop-opacity:1"
offset="0" />
<stop
id="stop3469"
style="stop-color:#fdfdfd;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3187">
<stop
id="stop3189"
style="stop-color:#b4b4b4;stop-opacity:1"
offset="0" />
<stop
id="stop3191"
style="stop-color:#e6e6e6;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="45.447727"
y1="92.539597"
x2="45.447727"
y2="7.0165396"
id="ButtonShadow"
gradientUnits="userSpaceOnUse"
gradientTransform="scale(1.0058652,0.994169)">
<stop
id="stop3750"
style="stop-color:#000000;stop-opacity:1"
offset="0" />
<stop
id="stop3752"
style="stop-color:#000000;stop-opacity:0.58823532"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3737">
<stop
id="stop3739"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop3741"
style="stop-color:#ffffff;stop-opacity:0"
offset="1" />
</linearGradient>
<filter
color-interpolation-filters="sRGB"
id="filter3174">
<feGaussianBlur
id="feGaussianBlur3176"
stdDeviation="1.71" />
</filter>
<linearGradient
x1="36.357143"
y1="6"
x2="36.357143"
y2="63.893143"
id="linearGradient3188"
xlink:href="#linearGradient3737"
gradientUnits="userSpaceOnUse" />
<linearGradient
x1="48"
y1="90"
x2="48"
y2="5.9877172"
id="linearGradient3427"
xlink:href="#linearGradient3187"
gradientUnits="userSpaceOnUse" />
<radialGradient
cx="47.098362"
cy="78.286942"
r="38.957481"
fx="47.098362"
fy="78.286942"
id="radialGradient3205"
xlink:href="#linearGradient3224"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3830053,-1.0350102e-8,0,1.3123934,-18.038924,-24.218731)" />
<linearGradient
x1="43.17857"
y1="13"
x2="43.17857"
y2="83.294571"
id="linearGradient3279"
xlink:href="#linearGradient3465"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0294118,0,0,1.0294118,-1.4117647,-1.411765)" />
<linearGradient
id="linearGradient3737-7">
<stop
id="stop3739-2"
style="stop-color:#ffffff;stop-opacity:1;"
offset="0" />
<stop
id="stop3741-7"
style="stop-color:#ffffff;stop-opacity:0"
offset="1" />
</linearGradient>
<radialGradient
cx="48"
cy="90.171875"
r="42"
fx="48"
fy="90.171875"
id="radialGradient2874"
xlink:href="#linearGradient3737-7"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)" />
<linearGradient
id="linearGradient3737-4">
<stop
id="stop3739-8"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop3741-71"
style="stop-color:#ffffff;stop-opacity:0"
offset="1" />
</linearGradient>
<clipPath
id="clipPath3613">
<rect
width="84"
height="84"
rx="6"
ry="6"
x="6"
y="6"
id="rect3615"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</clipPath>
<filter
x="-0.192"
y="-0.192"
width="1.3839999"
height="1.3839999"
color-interpolation-filters="sRGB"
id="filter3794">
<feGaussianBlur
id="feGaussianBlur3796"
stdDeviation="5.28" />
</filter>
<linearGradient
x1="48"
y1="20.220806"
x2="48"
y2="138.66119"
id="linearGradient2908"
xlink:href="#linearGradient3737-4"
gradientUnits="userSpaceOnUse" />
<linearGradient
x1="45.447727"
y1="92.539597"
x2="45.447727"
y2="7.0165396"
id="ButtonShadow-0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)">
<stop
id="stop3750-8"
style="stop-color:#000000;stop-opacity:1"
offset="0" />
<stop
id="stop3752-5"
style="stop-color:#000000;stop-opacity:0.58823532"
offset="1" />
</linearGradient>
<linearGradient
x1="32.251034"
y1="6.1317081"
x2="32.251034"
y2="90.238609"
id="linearGradient3780"
xlink:href="#ButtonShadow-0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)" />
<linearGradient
x1="32.251034"
y1="6.1317081"
x2="32.251034"
y2="90.238609"
id="linearGradient3772"
xlink:href="#ButtonShadow-0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)" />
<linearGradient
x1="32.251034"
y1="6.1317081"
x2="32.251034"
y2="90.238609"
id="linearGradient3725"
xlink:href="#ButtonShadow-0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)" />
<linearGradient
x1="32.251034"
y1="6.1317081"
x2="32.251034"
y2="90.238609"
id="linearGradient3721"
xlink:href="#ButtonShadow-0"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(0,-97)" />
<linearGradient
x1="32.251034"
y1="6.1317081"
x2="32.251034"
y2="90.238609"
id="linearGradient3224-3"
xlink:href="#ButtonShadow-0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0238095,0,0,1.0119048,-1.1428571,-98.071429)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3737-4"
id="linearGradient3053"
gradientUnits="userSpaceOnUse"
x1="48"
y1="20.220806"
x2="48"
y2="138.66119" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3224"
id="radialGradient3071"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3830053,-1.0350102e-8,0,1.3123934,-17.140614,-23.729195)"
cx="47.098362"
cy="78.286942"
fx="47.098362"
fy="78.286942"
r="38.957481" />
<linearGradient
id="linearGradient3304">
<stop
id="stop3306"
style="stop-color:#ff8313;stop-opacity:1"
offset="0" />
<stop
id="stop3308"
style="stop-color:#ffe400;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3304"
id="linearGradient3023"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.2146893,0,0,1.2146893,-90.000003,-246.69493)"
x1="143.75"
y1="334.5"
x2="143.75"
y2="276" />
<linearGradient
id="linearGradient3045">
<stop
id="stop3047"
style="stop-color:#ff8313;stop-opacity:1"
offset="0" />
<stop
id="stop3049"
style="stop-color:#ffe400;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3737"
id="linearGradient3894"
x1="49.010517"
y1="48.650372"
x2="73.444344"
y2="48.650372"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(2.1,0)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3737"
id="linearGradient3896"
x1="23.037859"
y1="48.650372"
x2="47.471485"
y2="48.650372"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(2.1,0)" />
<radialGradient
inkscape:collect="always"
xlink:href="#ButtonShadow-0"
id="radialGradient3908"
cx="61.227432"
cy="48.650372"
fx="61.227432"
fy="48.650372"
r="12.216913"
gradientTransform="translate(2.1,7.9644297e-6)"
gradientUnits="userSpaceOnUse" />
<radialGradient
inkscape:collect="always"
xlink:href="#ButtonShadow-0"
id="radialGradient3910"
cx="35.254673"
cy="48.650372"
fx="35.254673"
fy="48.650372"
r="12.216814"
gradientTransform="translate(2.1,-5.9733707e-6)"
gradientUnits="userSpaceOnUse" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3224"
id="radialGradient3955"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.4908884,-1.1072317e-8,0,1.4039702,-22.221992,-28.734351)"
cx="47.098362"
cy="78.286942"
fx="47.098362"
fy="78.286942"
r="38.957481" />
<radialGradient
cx="47.098362"
cy="78.286942"
r="38.957481"
fx="47.098362"
fy="78.286942"
id="radialGradient3205-1"
xlink:href="#linearGradient3224-6"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3830053,-1.0350102e-8,0,1.3123934,-18.038924,-24.218731)" />
<linearGradient
id="linearGradient3224-6">
<stop
id="stop3226-2"
style="stop-color:#42394b;stop-opacity:1"
offset="0" />
<stop
id="stop3228-1"
style="stop-color:#000000;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="48"
y1="90"
x2="48"
y2="5.9877172"
id="linearGradient3427-0"
xlink:href="#linearGradient3187-5"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3187-5">
<stop
id="stop3189-3"
style="stop-color:#b4b4b4;stop-opacity:1"
offset="0" />
<stop
id="stop3191-2"
style="stop-color:#e6e6e6;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="36.357143"
y1="6"
x2="36.357143"
y2="63.893143"
id="linearGradient3188-1"
xlink:href="#linearGradient3737-9"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3737-9">
<stop
id="stop3739-7"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop3741-6"
style="stop-color:#ffffff;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
x1="43.17857"
y1="13"
x2="43.17857"
y2="83.294571"
id="linearGradient3279-8"
xlink:href="#linearGradient3465-2"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0294118,0,0,1.0294118,-1.4117647,-1.411765)" />
<linearGradient
id="linearGradient3465-2">
<stop
id="stop3467-0"
style="stop-color:#919191;stop-opacity:1"
offset="0" />
<stop
id="stop3469-6"
style="stop-color:#fdfdfd;stop-opacity:1"
offset="1" />
</linearGradient>
<radialGradient
cx="48"
cy="90.171875"
r="42"
fx="48"
fy="90.171875"
id="radialGradient2874-4"
xlink:href="#linearGradient3737-7-3"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)" />
<linearGradient
id="linearGradient3737-7-3">
<stop
id="stop3739-2-3"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop3741-7-6"
style="stop-color:#ffffff;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
x1="48"
y1="20.220806"
x2="48"
y2="138.66119"
id="linearGradient2908-9"
xlink:href="#linearGradient3737-4-0"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3737-4-0">
<stop
id="stop3739-8-4"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop3741-71-8"
style="stop-color:#ffffff;stop-opacity:0"
offset="1" />
</linearGradient>
<clipPath
id="clipPath3613-5">
<rect
width="84"
height="84"
rx="6"
ry="6"
x="6"
y="6"
id="rect3615-1"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</clipPath>
<filter
x="-0.192"
y="-0.192"
width="1.3839999"
height="1.3839999"
color-interpolation-filters="sRGB"
id="filter3794-2">
<feGaussianBlur
id="feGaussianBlur3796-9"
stdDeviation="5.28" />
</filter>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3187-5"
id="linearGradient4094"
gradientUnits="userSpaceOnUse"
x1="48"
y1="90"
x2="48"
y2="5.9877172" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3737-9"
id="linearGradient4096"
gradientUnits="userSpaceOnUse"
x1="36.357143"
y1="6"
x2="36.357143"
y2="63.893143" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3465-2"
id="linearGradient4098"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0294118,0,0,1.0294118,-1.4117647,-1.411765)"
x1="43.17857"
y1="13"
x2="43.17857"
y2="83.294571" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3737-7-3"
id="radialGradient4100"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)"
cx="48"
cy="90.171875"
fx="48"
fy="90.171875"
r="42" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3737-4-0"
id="linearGradient4102"
gradientUnits="userSpaceOnUse"
x1="48"
y1="20.220806"
x2="48"
y2="138.66119" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3224-6"
id="radialGradient4104"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3830053,-1.0350102e-8,0,1.3123934,-18.038924,-24.218731)"
cx="47.098362"
cy="78.286942"
fx="47.098362"
fy="78.286942"
r="38.957481" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3224-6"
id="radialGradient4113"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3830053,-1.0350102e-8,0,1.3123934,-17.140614,-23.729195)"
cx="47.098362"
cy="78.286942"
fx="47.098362"
fy="78.286942"
r="38.957481" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4017"
id="linearGradient4023"
x1="48.732876"
y1="37.021988"
x2="48.609169"
y2="60.526169"
gradientUnits="userSpaceOnUse" />
</defs>
<metadata
id="metadata2413">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<path
style="opacity:0.6;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect3977-9"
inkscape:connector-curvature="0"
d="m 17.89831,14.489536 c -1.662,0 -3,1.338 -3,3 l 0,62 c 0,1.662 1.338,3 3,3 l 62,0 c 1.662,0 3,-1.338 3,-3 l 0,-62 c 0,-1.662 -1.338,-3 -3,-3 l -62,0 z m 0,0.96875 62,0 c 1.140081,0 2.03125,0.891169 2.03125,2.03125 l 0,62 c 0,1.140081 -0.891169,2.03125 -2.03125,2.03125 l -62,0 c -1.140081,0 -2.03125,-0.891169 -2.03125,-2.03125 l 0,-62 c 0,-1.140081 0.891169,-2.03125 2.03125,-2.03125 z" />
<g
id="layer2"
style="display:none">
<rect
width="86"
height="85"
rx="6"
ry="6"
x="5"
y="7"
id="rect3745"
style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)" />
</g>
<rect
style="fill:url(#radialGradient4113);fill-opacity:1;stroke:none"
id="rect3461-7"
y="8.743969"
x="9.0391903"
ry="6.1732869"
rx="5.8527675"
height="78.516495"
width="77.914963" />
<path
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:0.15;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Abandoned Bitplane;-inkscape-font-specification:Abandoned Bitplane"
id="rect3222-3-8"
inkscape:connector-curvature="0"
d="m 19.89831,13.489536 c -3.289406,0 -6,2.710594 -6,6 l 0,58 c 0,3.289406 2.710594,6 6,6 l 58,0 c 3.289406,0 6,-2.710594 6,-6 l 0,-58 c 0,-3.289406 -2.710594,-6 -6,-6 l -58,0 z m 0,4 58,0 c 1.142594,0 2,0.857406 2,2 l 0,58 c 0,1.142594 -0.857406,2 -2,2 l -58,0 c -1.142594,0 -2,-0.857406 -2,-2 l 0,-58 c 0,-1.142594 0.857406,-2 2,-2 z" />
<path
style="opacity:0.3;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect3981-0"
inkscape:connector-curvature="0"
d="m 17.89831,14.489536 c -1.662,0 -3,1.338 -3,3 l 0,62 c 0,1.662 1.338,3 3,3 l 62,0 c 1.662,0 3,-1.338 3,-3 l 0,-62 c 0,-1.662 -1.338,-3 -3,-3 l -62,0 z m 0,1.9375 62,0 c 0.618163,0 1.0625,0.444337 1.0625,1.0625 l 0,62 c 0,0.618163 -0.444337,1.0625 -1.0625,1.0625 l -62,0 c -0.618163,0 -1.0625,-0.444337 -1.0625,-1.0625 l 0,-62 c 0,-0.618163 0.444337,-1.0625 1.0625,-1.0625 z" />
<g
id="g3912"
style="fill:url(#linearGradient4023);fill-opacity:1.0;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
transform="matrix(1.2125503,0,0,1.2125503,-13.04106,-10.991024)">
<path
d="m 26.099813,37.395511 0,22.509723 22.50972,0 0,-7.118459 -15.198872,0 0,-15.391264 -7.310848,0 z"
id="rect3294"
style="fill:url(#linearGradient4023);fill-opacity:1.0;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
inkscape:connector-curvature="0" />
<path
d="m 52.072568,37.395511 0,22.509723 22.509727,0 0,-7.310849 -15.583656,0 0,-7.888025 15.583656,0 0,-7.310849 -22.509727,0 z"
id="rect3298"
style="fill:url(#linearGradient4023);fill-opacity:1.0;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
inkscape:connector-curvature="0" />
</g>
<path
style="opacity:0.07999998;fill:#d9c6ed;fill-opacity:1;stroke:none"
id="rect3256-3"
inkscape:connector-curvature="0"
d="m 14.89831,8.7395363 c -3.242433,0 -5.8437503,2.7674997 -5.8437503,6.1874997 l 0,49.0625 C 27.878614,50.130638 54.866224,40.195879 86.96081,42.208286 l 0,-27.28125 c 0,-3.420001 -2.63257,-6.1874997 -5.875,-6.1874997 l -66.1875,0 z" />
<g
id="layer1"
style="display:inline">
<path
d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 5,7 62,0 c 2.216001,0 4,1.784 4,4 l 0,62 c 10e-7,2.216001 -1.784,4 -4,4 l -62,0 c -2.215999,10e-7 -4,-1.784 -4,-4 l 0,-62 c 0,-2.215999 1.784,-4 4,-4 z"
inkscape:connector-curvature="0"
id="rect2419"
style="fill:url(#linearGradient4094);fill-opacity:1;fill-rule:nonzero;stroke:none" />
<path
d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.71875,-0.375 -0.00741,-0.0044 -0.023866,0.0045 -0.03125,0 -0.031933,-0.0193 -0.062293,-0.04251 -0.09375,-0.0625 -0.120395,-0.0767 -0.2310226,-0.163513 -0.34375,-0.25 -0.1061728,-0.0808 -0.2132809,-0.161112 -0.3125,-0.25 C 8.4783201,88.557317 8.3087904,88.373362 8.15625,88.1875 8.0486711,88.057245 7.9378561,87.922215 7.84375,87.78125 7.818661,87.74287 7.805304,87.69538 7.78125,87.65625 7.716487,87.553218 7.6510225,87.451733 7.59375,87.34375 7.4927417,87.149044 7.3880752,86.928049 7.3125,86.71875 7.30454,86.69694 7.288911,86.6782 7.28125,86.65625 7.2494249,86.5643 7.2454455,86.469419 7.21875,86.375 7.1884177,86.268382 7.1483606,86.171969 7.125,86.0625 7.0521214,85.720988 7,85.364295 7,85 L 7,83 7,15 7,13 C 7,10.218152 9.2181517,8 12,8 l 2,0 68,0 2,0 c 2.781848,0 5,2.218152 5,5 l 0,2 0,68 0,2 c 0,0.364295 -0.05212,0.720988 -0.125,1.0625 -0.04415,0.206893 -0.08838,0.397658 -0.15625,0.59375 -0.0077,0.02195 -0.0233,0.04069 -0.03125,0.0625 -0.06274,0.173739 -0.138383,0.367449 -0.21875,0.53125 -0.04158,0.0828 -0.07904,0.169954 -0.125,0.25 -0.0546,0.09721 -0.126774,0.18835 -0.1875,0.28125 -0.09411,0.140965 -0.204921,0.275995 -0.3125,0.40625 -0.143174,0.17445 -0.303141,0.346998 -0.46875,0.5 -0.01117,0.0102 -0.01998,0.02115 -0.03125,0.03125 -0.138386,0.125556 -0.285091,0.234436 -0.4375,0.34375 -0.102571,0.07315 -0.204318,0.153364 -0.3125,0.21875 -0.0074,0.0045 -0.02384,-0.0044 -0.03125,0 -0.232039,0.138728 -0.462548,0.274778 -0.71875,0.375 0.301527,-0.0968 0.596455,-0.204138 0.875,-0.34375 0.55709,-0.279224 1.060053,-0.665694 1.5,-1.09375 0.219973,-0.214028 0.409366,-0.441865 0.59375,-0.6875 0.184384,-0.245635 0.355408,-0.507743 0.5,-0.78125 0.14012,-0.265048 0.276135,-0.524729 0.375,-0.8125 0.01041,-0.03078 0.02133,-0.06274 0.03125,-0.09375 0.09046,-0.278085 0.1388,-0.579404 0.1875,-0.875 C 89.95865,84.6507 90,84.334721 90,84 l 0,-2 0,-68 0,-2 C 90,8.676 87.324,6 84,6 L 12,6 z"
inkscape:connector-curvature="0"
id="rect3728"
style="opacity:0.5;fill:url(#linearGradient4096);fill-opacity:1;fill-rule:nonzero;stroke:none" />
<path
d="m 17,12 c -2.752703,0 -5,2.247297 -5,5 l 0,62 c 0,2.752703 2.247298,5 5,5 l 62,0 c 2.752703,0 5.000001,-2.247297 5,-5 l 0,-62 c 0,-2.752703 -2.247297,-5 -5,-5 l -62,0 z m 0,2 62,0 c 1.679298,0 3,1.320703 3,3 l 0,62 c 10e-7,1.679297 -1.320703,3 -3,3 l -62,0 c -1.679296,0 -3,-1.320703 -3,-3 l 0,-62 c 0,-1.679297 1.320703,-3 3,-3 z"
inkscape:connector-curvature="0"
id="rect3425"
style="fill:url(#linearGradient4098);fill-opacity:1;fill-rule:nonzero;stroke:none" />
<path
d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.6695391,6.580022 9.4375,6.71875 c -0.00741,0.0044 -0.023866,-0.0045 -0.03125,0 -0.031933,0.0193 -0.062293,0.04251 -0.09375,0.0625 -0.120395,0.0767 -0.2310226,0.163513 -0.34375,0.25 -0.1061728,0.0808 -0.2132809,0.161112 -0.3125,0.25 C 8.4783201,7.442683 8.3087904,7.626638 8.15625,7.8125 8.0486711,7.942755 7.9378561,8.077785 7.84375,8.21875 7.818661,8.25713 7.805304,8.30462 7.78125,8.34375 7.716487,8.446782 7.6510225,8.548267 7.59375,8.65625 7.4927417,8.850956 7.3880752,9.071951 7.3125,9.28125 7.30454,9.30306 7.288911,9.3218 7.28125,9.34375 7.2494249,9.4357 7.2454455,9.530581 7.21875,9.625 7.1884177,9.731618 7.1483606,9.828031 7.125,9.9375 7.0521214,10.279012 7,10.635705 7,11 l 0,2 0,68 0,2 c 0,2.781848 2.2181517,5 5,5 l 2,0 68,0 2,0 c 2.781848,0 5,-2.218152 5,-5 l 0,-2 0,-68 0,-2 C 89,10.635705 88.94788,10.279012 88.875,9.9375 88.83085,9.730607 88.78662,9.539842 88.71875,9.34375 88.71105,9.3218 88.69545,9.30306 88.6875,9.28125 88.62476,9.107511 88.549117,8.913801 88.46875,8.75 88.42717,8.6672 88.38971,8.580046 88.34375,8.5 88.28915,8.40279 88.216976,8.31165 88.15625,8.21875 88.06214,8.077785 87.951329,7.942755 87.84375,7.8125 87.700576,7.63805 87.540609,7.465502 87.375,7.3125 87.36383,7.3023 87.35502,7.29135 87.34375,7.28125 87.205364,7.155694 87.058659,7.046814 86.90625,6.9375 86.803679,6.86435 86.701932,6.784136 86.59375,6.71875 c -0.0074,-0.0045 -0.02384,0.0044 -0.03125,0 -0.232039,-0.138728 -0.462548,-0.274778 -0.71875,-0.375 0.301527,0.0968 0.596455,0.204138 0.875,0.34375 0.55709,0.279224 1.060053,0.665694 1.5,1.09375 0.219973,0.214028 0.409366,0.441865 0.59375,0.6875 0.184384,0.245635 0.355408,0.507743 0.5,0.78125 0.14012,0.265048 0.276135,0.524729 0.375,0.8125 0.01041,0.03078 0.02133,0.06274 0.03125,0.09375 0.09046,0.278085 0.1388,0.579404 0.1875,0.875 C 89.95865,11.3493 90,11.665279 90,12 l 0,2 0,68 0,2 c 0,3.324 -2.676,6 -6,6 l -72,0 z"
inkscape:connector-curvature="0"
id="path3615"
style="opacity:0.4;fill:url(#radialGradient4100);fill-opacity:1;fill-rule:nonzero;stroke:none" />
<rect
width="66"
height="66"
rx="12"
ry="12"
x="15"
y="15"
clip-path="url(#clipPath3613-5)"
id="rect3171"
style="opacity:0.1;fill:url(#linearGradient4102);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794-2)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 28 KiB

1
img/mcabber.svg Normal file
View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><text y=".9em" font-size="80">💻️</text></svg>

After

Width:  |  Height:  |  Size: 113 B

237
img/profanity_logo.svg Normal file
View file

@ -0,0 +1,237 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.1"
id="svg1"
width="495"
height="320"
viewBox="0 0 495 320"
sodipodi:docname="profanity_logo.svg"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1">
<linearGradient
id="linearGradient17"
inkscape:collect="always">
<stop
style="stop-color:#150000;stop-opacity:1"
offset="0"
id="stop17" />
<stop
style="stop-color:#8e2215;stop-opacity:1"
offset="1"
id="stop18" />
</linearGradient>
<linearGradient
id="linearGradient14"
inkscape:collect="always">
<stop
style="stop-color:#711406;stop-opacity:1"
offset="0"
id="stop14" />
<stop
style="stop-color:#b63224;stop-opacity:1"
offset="1"
id="stop15" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient14"
id="linearGradient15"
x1="5.3097906"
y1="139.09752"
x2="212.27319"
y2="263.68884"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient17"
id="linearGradient18"
x1="5.9335938"
y1="139.64258"
x2="228.09921"
y2="90.950676"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="namedview1"
pagecolor="#65ffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="true"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="1.0485179"
inkscape:cx="329.98959"
inkscape:cy="172.62461"
inkscape:window-width="1366"
inkscape:window-height="761"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="g1"
showgrid="false" />
<g
inkscape:groupmode="layer"
inkscape:label="Image"
id="g1">
<path
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.709875px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 60.73069,250.65131 71.03842,251.64031 C 71.03842,251.64031 73.05201,254.58097 76.51478,257.37485 78.60021,259.05744 80.95875,260.57601 83.38434,262.25437 87.51594,263.47442 94.70191,264.80769 98.73039,266.95324 102.17412,268.78734 101.8324,272.20842 103.64453,272.86767 110.35639,273.1909 113.43605,272.32978 120.8346,271.41729 125.84465,270.79939 127.64087,272.98699 129.96364,273.11454 133.39716,273.30309 137.81427,272.28686 142.35399,270.39442 148.26459,267.9305 152.49117,263.22479 155.86806,259.27458 157.51489,256.00672 156.44159,248.17895 158.74622,243.46714 161.56426,237.70569 169.49502,229.58201 169.49502,229.58201 L 181.17559,230.0878 C 181.17559,230.0878 176.7141,238.8299 174.81258,242.6347 172.7667,246.72835 170.14783,250.17713 167.61712,253.99013 164.19421,259.14736 157.66692,267.92041 157.66692,267.92041 157.66692,267.92041 153.14677,273.1849 150.10039,275.34092 147.36212,277.27887 141.60057,279.14112 141.60057,279.14112 141.60057,279.14112 134.30054,282.58715 129.62644,282.93002 124.01084,283.34194 116.86597,283.20716 111.37964,281.94027 105.91077,280.67741 101.4538,278.45194 96.38132,276.04918 92.26252,274.09816 89.32673,272.5631 85.54298,270.0226 81.64819,267.40755 76.77802,264.27232 73.18726,261.25333 69.42267,258.08819 60.73069,250.65131 60.73069,250.65131 Z"
id="path32"
sodipodi:nodetypes="ccscscssscsccsscscsssssc" />
<path
id="path1"
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.709875px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 145.53906 39.345703 C 139.13672 39.260904 132.40329 40.497624 125.82227 40.871094 C 120.59817 41.167559 118.17021 40.921785 110.13477 41.4375 C 104.00582 42.066343 97.865755 41.538786 91.734375 43.162109 C 91.734375 43.162109 79.121799 45.670672 73.162109 47.994141 C 68.956139 49.633903 65.149558 52.159969 61.205078 54.355469 C 56.490288 56.979732 51.374374 59.058894 47.214844 62.496094 C 44.527554 64.716715 42.088193 67.361528 40.345703 70.380859 C 38.777403 73.098358 37.292969 79.285156 37.292969 79.285156 L 45.433594 84.882812 L 55.355469 76.488281 L 63.240234 81.576172 C 63.240234 81.576172 69.042743 79.014291 71.126953 76.742188 C 72.793263 74.925669 74.433594 70.126953 74.433594 70.126953 C 74.433594 70.126953 82.115046 66.779531 85.628906 64.53125 C 88.373136 62.775402 93.259766 58.425781 93.259766 58.425781 L 97.839844 54.863281 C 102.21495 57.774011 106.42899 60.98194 111.57617 60.714844 C 116.66718 60.450662 121.0951 56.990219 126.07812 55.880859 C 126.07812 55.880859 136.00588 60.858351 141.3418 62.240234 C 147.95052 63.951742 161.69336 64.53125 161.69336 64.53125 C 161.69336 64.53125 173.28393 66.650944 178.99219 68.091797 C 185.00104 69.608522 196.80078 73.435547 196.80078 73.435547 C 196.80078 73.435547 202.51412 76.289728 205.19531 78.013672 C 207.33514 79.389537 211.30078 82.59375 211.30078 82.59375 C 211.30078 82.59375 212.72657 83.459622 214.41602 84.589844 L 227.76367 76.876953 C 225.04526 72.677576 220.45898 65.802734 220.45898 65.802734 C 220.45898 65.802734 209.55787 57.065906 203.66797 53.337891 C 198.7956 50.253924 193.87195 47.029109 188.4043 45.197266 C 180.67104 42.606369 164.23633 41.380859 164.23633 41.380859 C 164.23633 41.380859 151.9414 39.430503 145.53906 39.345703 z " />
<g
id="g16"
style="display:inline;fill:none;fill-opacity:1">
<path
style="display:inline;fill:none;fill-opacity:1;stroke:none;stroke-width:0.709875px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 60.730693,250.65131 71.038422,251.64031 C 71.038422,251.64031 73.052017,254.58097 76.514787,257.37485 78.600217,259.05744 80.958757,260.57601 83.384347,262.25437 87.515947,263.47442 94.701911,264.80769 98.730391,266.95324 102.17412,268.78734 101.8324,272.20842 103.64453,272.86767 110.35639,273.1909 113.43605,272.32978 120.8346,271.41729 125.84465,270.79939 127.64087,272.98699 129.96364,273.11454 133.39717,273.30309 137.81428,272.28686 142.35399,270.39442 148.2646,267.9305 152.49117,263.22479 155.86806,259.27458 157.51489,256.00672 156.4416,248.17895 158.74623,243.46714 161.56427,237.70569 169.49502,229.58201 169.49502,229.58201 L 181.17559,230.0878 C 181.17559,230.0878 176.7141,238.8299 174.81258,242.6347 172.7667,246.72835 170.14784,250.17713 167.61712,253.99013 164.19422,259.14736 157.66692,267.92041 157.66692,267.92041 157.66692,267.92041 153.14677,273.1849 150.10039,275.34092 147.36212,277.27887 141.60057,279.14112 141.60057,279.14112 141.60057,279.14112 134.30054,282.58715 129.62645,282.93002 124.01084,283.34194 116.86597,283.20716 111.37965,281.94027 105.91077,280.67741 101.45381,278.45194 96.38133,276.04918 92.26253,274.09816 89.326737,272.5631 85.542987,270.0226 81.648197,267.40755 76.778024,264.27232 73.187264,261.25333 69.422674,258.08819 60.730693,250.65131 60.730693,250.65131 Z"
id="path3"
sodipodi:nodetypes="ccscscssccsccsscscsssssc" />
<path
style="display:inline;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.0732;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="M 62.37503,56.15363 C 62.37503,56.15363 64.19532,60.591588 66.31808,63.19795 68.68167,66.099998 74.43445,70.127435 74.43445,70.127435"
id="path4"
sodipodi:nodetypes="csc" />
<path
style="display:inline;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.0732;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="M 93.2599,58.425131 C 93.2599,58.425131 93.21384,53.902869 93.03122,51.325443 92.90169,49.497253 92.31168,45.209304 92.31168,45.209304"
id="path5"
sodipodi:nodetypes="csc" />
<path
style="display:inline;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.0732;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="M 124.76956,56.226134 124.69124,49.256749 124.51135,43.14061"
id="path6"
sodipodi:nodetypes="ccc" />
<path
style="display:inline;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.0732;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="M 162.76498,64.729313 C 162.76498,64.729313 163.53744,56.431057 163.7266,52.269848 163.87434,49.019946 163.86152,42.511007 163.86152,42.511007"
id="path7"
sodipodi:nodetypes="csc" />
<path
style="display:inline;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.0732;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="M 196.79984,73.434606 C 196.79984,73.434606 197.7543,67.48519 198.17486,64.502127 198.60316,61.464233 199.34413,55.372889 199.34413,55.372889"
id="path8"
sodipodi:nodetypes="csc" />
<path
style="display:inline;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.0732;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="M 212.08975,83.080977 C 212.08975,83.080977 214.78855,78.792348 215.75877,76.464578 216.52165,74.634251 217.42271,70.753183 217.42271,70.753183"
id="path9"
sodipodi:nodetypes="csc" />
</g>
<path
id="path2"
style="display:inline;fill:#b01219;fill-opacity:1;stroke:none;stroke-width:0.709875px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 136.89062,0 C 88.330554,0 67.168814,11.624842 35.505859,57.664062 18.936431,81.756685 7.730009,111.39339 0,140.5957 9.4414169,179.49607 15.336571,214.28619 34.400391,246.66797 45.758671,265.96112 57.520646,287.12772 75.197266,300.86719 95.375476,316.55107 117.36255,320.13665 140.60742,318.62891 162.66286,317.19832 183.21919,293.62925 193.91602,270.63867 200.63276,256.20245 202.34774,240.08692 204.49609,222.75195 L 191.69922,229.37109 182.35352,226.96289 181.17578,230.08789 C 181.17578,230.08789 176.71402,238.82997 174.8125,242.63477 172.76662,246.72842 170.14791,250.17723 167.61719,253.99023 164.19429,259.14746 157.66602,267.91992 157.66602,267.91992 157.66602,267.91992 153.14599,273.18578 150.09961,275.3418 147.36134,277.27975 141.59961,279.14063 141.59961,279.14062 141.59961,279.14062 134.30104,282.58682 129.62695,282.92969 124.01134,283.34161 116.86523,283.20634 111.37891,281.93945 105.91003,280.67659 101.45334,278.45159 96.380859,276.04883 92.262059,274.09781 89.326719,272.56394 85.542969,270.02344 81.648179,267.40839 76.77826,264.2729 73.1875,261.25391 69.42291,258.08877 60.730469,250.65039 60.730469,250.65039 60.730469,250.65039 35.923507,223.83498 26.658203,206.86523 L 21.935547,206.00586 24.246094,202.10547 C 14.409287,180.43237 5.9335938,139.64258 5.9335938,139.64258 5.9335938,139.64258 12.796219,118.62414 21.203125,101.64844 29.61003,84.67273 39.561553,71.739609 40.345703,70.380859 42.088194,67.361528 44.527554,64.716715 47.214844,62.496094 51.374374,59.058894 56.490288,56.979732 61.205078,54.355469 65.149558,52.159969 68.956139,49.633903 73.162109,47.994141 79.121799,45.670672 91.734375,43.162109 91.734375,43.162109 97.865755,41.538786 104.00582,42.066343 110.13477,41.4375 118.17021,40.921785 120.59817,41.167559 125.82227,40.871094 132.40329,40.497624 139.13672,39.260904 145.53906,39.345703 151.9414,39.430503 164.23633,41.380859 164.23633,41.380859 164.23633,41.380859 180.67104,42.606369 188.4043,45.197266 193.87195,47.029109 198.7956,50.253924 203.66797,53.337891 209.55787,57.065906 220.45898,65.802734 220.45898,65.802734 220.45898,65.802734 225.04522,72.677534 227.76367,76.876953 L 227.94141,76.775391 241.29297,81.066406 247.5,76.298828 249.06836,76.302734 C 249.64454,65.712905 248.1825,55.970769 242.66211,48.402344 225.29682,24.594622 159.43535,0 136.89062,0 Z" />
<path
id="path13"
style="display:inline;fill:#980f16;fill-opacity:1;stroke:none;stroke-width:0.709875px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 78.53268,258.90623 C 80.61811,260.58882 80.958757,260.57601 83.384347,262.25437 87.515947,263.47442 94.701911,264.80769 98.730391,266.95324 102.17412,268.78734 101.8324,272.20842 103.64453,272.86767 110.35639,273.1909 113.43605,272.32978 120.8346,271.41729 125.84465,270.79939 127.64087,272.98699 129.96364,273.11454 133.39717,273.30309 137.81428,272.28686 142.35399,270.39442 148.2646,267.9305 152.49117,263.22479 155.86806,259.27458 157.51489,256.00672 156.4416,248.17895 158.74623,243.46714 161.56427,237.70569 169.49502,229.58201 169.49502,229.58201 L 181.17559,230.0878 182.28574,227.14419 158.81812,222.37909 C 158.81812,222.37909 159.47232,228.32513 159.15531,231.27587 158.78905,234.685 156.59121,241.2374 156.59121,241.2374 156.59121,241.2374 153.99026,248.76946 151.40418,251.66475 147.116,256.46565 141.33318,260.23 135.19082,262.15575 130.63805,263.58313 124.23216,263.10392 118.73902,263.10947 113.04752,263.11522 107.35555,262.71062 101.69116,262.15575 93.933176,261.3958 78.53268,258.90623 78.53268,258.90623 Z"
sodipodi:nodetypes="ccscssscsccccscsssscc" />
<path
id="path10"
style="display:inline;mix-blend-mode:normal;fill:url(#linearGradient15);stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 5.9335938,139.64258 C 5.9335938,139.64258 14.409287,180.43237 24.246094,202.10547 L 29.566406,193.12891 30.519531,178.82422 26.705078,167.37891 33.857422,156.41211 31.949219,143.05859 33.449219,141.68945 Z M 51.023438,199.32812 37.671875,208.86719 26.611328,206.85547 C 35.889354,223.82684 60.730469,250.65039 60.730469,250.65039 L 71.039062,251.64062 C 71.039062,251.64062 73.052855,254.58112 76.515625,257.375 77.165487,257.89933 77.848254,258.40593 78.544922,258.9082 78.565751,258.91157 93.938663,261.39681 101.69141,262.15625 107.3558,262.71112 113.04678,263.11513 118.73828,263.10938 124.23142,263.10383 130.63864,263.58363 135.19141,262.15625 141.33377,260.2305 147.11612,256.46496 151.4043,251.66406 153.99038,248.76877 156.5918,241.23828 156.5918,241.23828 156.5918,241.23828 158.78999,234.68452 159.15625,231.27539 159.47326,228.32465 158.81836,222.37891 158.81836,222.37891 L 182.28516,227.14453 182.43359,226.98242 145.44336,217.44922 133.52148,216.49609 122.55469,206.95898 109.20117,208.86719 84.880859,202.66797 73.4375,211.72656 Z" />
<path
id="path15"
style="display:inline;fill:url(#linearGradient18);stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 97.839844,54.863281 93.259766,58.425781 C 93.259766,58.425781 88.373136,62.775402 85.628906,64.53125 82.115046,66.779531 74.433594,70.126953 74.433594,70.126953 74.433594,70.126953 72.793263,74.925668 71.126953,76.742188 69.042743,79.014291 63.240234,81.576172 63.240234,81.576172 L 55.355469,76.488281 45.433594,84.882812 37.292969,79.285156 C 37.292969,79.285156 38.777403,73.098358 40.345703,70.380859 40.345703,70.380859 26.691124,90.729776 21.203125,101.64844 15.0734,113.84385 5.9335938,139.64258 5.9335938,139.64258 L 33.449219,141.68945 42.917969,133.04492 40.056641,122.07617 41.964844,114.44727 49.59375,100.14062 61.992188,101.0957 74.390625,108.72461 86.3125,106.81836 97.279297,93.464844 109.67773,95.373047 122.07617,99.1875 132.0918,88.697266 145.44336,97.757812 160.22656,96.802734 168.33203,88.220703 184.54688,87.265625 193.12891,84.404297 206.48242,89.173828 214.41602,84.589844 C 212.72659,83.459999 211.30078,82.59375 211.30078,82.59375 211.30078,82.59375 207.33514,79.389537 205.19531,78.013672 202.51412,76.289728 196.80078,73.435547 196.80078,73.435547 196.80078,73.435547 185.00104,69.608522 178.99219,68.091797 173.28393,66.650944 161.69336,64.53125 161.69336,64.53125 161.69336,64.53125 147.95052,63.951742 141.3418,62.240234 136.00588,60.858351 126.07812,55.880859 126.07812,55.880859 121.09511,56.990219 116.66718,60.450662 111.57617,60.714844 106.42899,60.98194 102.21495,57.774011 97.839844,54.863281 Z" />
<g
id="g20"
inkscape:label="PR%F@N!TY"
style="display:inline">
<path
id="path20"
style="fill:#253536;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 69.383649,154.5038 C 69.383649,154.5038 76.088872,150.61054 79.874647,144.25123 82.924864,139.12751 84.545263,136.20454 86.312306,129.23002 86.593818,128.11889 85.153575,126.40874 84.404851,126.36885 81.316757,126.20434 78.578834,128.62844 76.059739,130.42219 74.594811,131.46531 72.24483,134.23709 72.24483,134.23709 L 65.56874,174.7705 64.838982,177.81226 C 64.838982,177.81226 65.524231,181.74056 65.525351,183.11561 65.526445,184.45976 62.945991,186.21522 62.945991,186.21522 62.945991,186.21522 60.684955,187.22608 59.76208,186.66316 57.40363,185.22459 54.735609,184.81154 51.698789,183.04578 50.483436,182.33911 50.272049,180.77952 50.366959,179.53913 50.4478,178.48262 51.009421,177.98889 51.192999,176.94531 54.001945,160.97743 57.875134,144.43908 61.276968,125.79823 61.522916,124.45052 60.772278,121.71943 60.772278,121.71943 60.772278,121.71943 60.198267,119.11372 60.772278,118.02373 61.361378,116.90508 62.470214,116.58689 63.899718,116.72083 65.884303,116.90679 69.383649,118.26216 69.383649,118.26216 H 73.31335 L 77.013466,117.30844 C 77.013466,117.30844 83.760388,114.9569 86.927365,115.99706 89.486442,116.83757 89.789639,120.04049 91.677021,121.60021 93.048652,122.73372 95.176077,122.86543 96.32644,124.22296 97.529253,125.64238 98.233895,129.46846 98.233895,129.46846 98.233895,129.46846 97.220703,136.28627 96.207225,139.48259 94.657868,144.36897 92.465226,148.75282 89.650351,152.83478 85.947302,158.20472 82.970931,162.56993 77.609546,165.94852 76.000633,166.96241 73.302988,166.81703 71.913979,166.27973 70.279309,165.6474 67.568599,162.6285 67.568599,162.6285 L 69.383649,154.5038"
sodipodi:nodetypes="csssscccscssssscsscccssscsssscc"
inkscape:label="P" />
<path
style="fill:#253536;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 106.89032,119.36649 C 106.89032,119.36649 109.41092,118.74363 110.76805,118.6921 113.2198,118.59901 114.99491,119.95486 117.17473,120.20947 118.01202,120.30727 118.87565,120.36754 119.70368,120.20947 122.85069,119.60873 125.55792,117.5462 128.63931,116.66894 130.34163,116.1843 132.09717,115.66278 133.8658,115.73154 135.20063,115.78343 136.78964,115.87086 137.74353,116.74312 142.90311,121.46116 144.21077,122.6111 147.52214,126.78474 148.61002,128.1559 148.26598,130.2772 148.02793,132.01124 147.77385,133.86202 146.44198,135.79367 145.49898,137.40634 143.62475,140.61154 138.92371,145.83617 138.92371,145.83617 138.92371,145.83617 134.10644,150.7934 131.33685,152.83478 130.02968,153.79825 127.12194,155.27759 127.12194,155.27759 L 126.11035,155.95198 C 138.76212,169.8689 135.43748,167.75029 139.93529,171.46288 140.79011,172.16847 142.11724,172.27679 142.80143,173.14884 143.1636,173.61046 143.55617,174.30351 143.30722,174.83481 141.97369,177.68073 140.57384,179.26415 138.92371,181.07289 137.16622,182.99931 135.71027,184.36019 133.19142,185.7936 132.40384,186.24179 131.25593,185.94674 130.49387,185.4564 129.77247,184.99222 129.1451,183.26465 129.1451,183.26465 129.1451,183.26465 128.78296,181.1703 128.13351,180.14561 126.5924,177.71406 123.55918,174.88135 121.55825,172.81165 118.48799,169.63587 113.06857,163.68256 113.06857,163.68256 L 115.89683,148.27142 C 115.89683,148.27142 123.4799,143.4105 126.78474,140.44107 129.21509,138.25738 131.20579,136.05997 132.76992,133.19142 133.7234,131.44278 136.55318,129.18077 135.55177,127.45913 135.05829,126.61074 133.05329,127.09738 131.50545,127.45913 129.18305,128.00189 125.83866,129.74558 123.41281,131.33685 121.69201,132.46563 118.35491,134.87738 118.35491,134.87738 L 110.09367,179.89271 C 110.09367,179.89271 110.96368,182.22037 110.93665,183.43324 110.91842,184.25131 110.82032,185.19515 110.26226,185.7936 109.56912,186.53691 107.819,186.7509 106.80603,186.83371 102.80923,186.86858 99.580393,185.48671 95.762943,184.44482 95.762943,184.44482 94.932895,183.74792 94.919959,183.26465 94.900351,182.53217 96.100137,181.41008 96.100137,181.41008 Z"
id="path21"
inkscape:label="R"
sodipodi:nodetypes="cssssssssscsccsssssscssccsssssccssscscc" />
<g
id="g22"
inkscape:label="%">
<path
id="path22"
style="fill:#253536;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 169.52148,116.5625 C 168.04085,116.53624 166.59002,116.76865 165.4707,117.39453 157.82422,121.67017 153.20608,128.44466 153.07227,132.0918 152.96541,135.00461 154.78605,138.49036 157.39453,139.79102 161.81634,141.99587 167.314,139.82875 171.43164,137.09766 174.62802,134.97761 177.04365,131.30622 177.86914,127.56055 178.55516,124.44771 177.92536,119.61823 175.80859,118.20898 174.54412,117.36716 171.98921,116.60627 169.52148,116.5625 Z M 170.16992,122.54297 C 170.26571,122.54533 170.35912,122.55512 170.45117,122.57031 171.27828,122.70678 171.90292,123.68302 172.05273,124.50781 171.74147,126.97893 170.02669,128.58261 168.42773,130.41016 166.90769,132.14751 166.25289,133.19565 164.71875,133.94922 163.54522,134.52565 161.72729,135.50297 160.8418,134.54102 159.60935,133.20215 161.28853,130.85459 162.10547,129.22852 162.53108,128.38135 167.20037,122.46973 170.16992,122.54297 Z" />
<path
style="fill:#253536;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 204.71414,124.16511 C 204.71414,124.16511 191.6428,139.05574 185.1772,146.65001 176.82247,156.46317 168.90579,166.05601 160.5242,176.55874 159.51604,177.82204 158.79557,181.08894 158.79557,181.08894 158.79557,181.08894 157.31888,184.69039 156.0536,184.98651 154.97139,185.23979 153.78582,184.39142 152.76976,183.83091 150.75219,182.71792 147.35084,179.53913 147.35084,179.53913 147.35084,179.53913 146.30111,178.02942 146.09907,177.15481 145.94696,176.4963 146.15868,175.12814 146.15868,175.12814 146.15868,175.12814 167.04744,149.12984 177.71718,136.26377 182.631,130.33845 190.65229,121.50922 192.23562,118.85825 192.89401,117.7559 194.65584,117.47445 195.8121,117.42765 196.62195,117.39487 198.78228,118.76795 198.78228,118.76795 Z"
id="path23"
sodipodi:nodetypes="csscsscscssscc" />
<path
id="path24"
style="fill:#253536;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 189.79688,159.08203 C 187.45506,159.02557 185.03571,159.84952 182.87695,160.76172 180.50462,161.76417 178.46785,163.49989 176.61914,165.29297 174.72773,167.12746 172.68611,169.07256 171.79102,171.55078 171.23043,173.10288 171.33254,174.87349 171.61133,176.5 171.86752,177.99466 172.43507,179.47205 173.28125,180.73047 174.30852,182.25821 175.69851,183.59353 177.27344,184.54688 178.49361,185.28547 179.91066,186.07662 181.32812,185.91797 184.84674,185.52414 187.78524,182.77262 190.38867,180.37305 192.86675,178.08901 195.06366,175.32296 196.34766,172.20703 197.1517,170.25584 197.45934,168.05376 197.30273,165.94922 197.21785,164.80855 196.96438,163.59311 196.28906,162.66992 195.11754,161.06842 193.33803,159.69905 191.40039,159.27148 190.87227,159.15495 190.33729,159.09506 189.79688,159.08203 Z M 187.99219,165.56641 C 188.32339,165.56034 188.64961,165.60308 188.95703,165.71094 189.52726,165.91099 190.06116,166.43554 190.20898,167.02148 190.46602,168.04038 189.79265,169.09629 189.375,170.06055 188.63415,171.77101 187.62516,173.38065 186.45312,174.83008 185.03923,176.57861 183.93502,178.10449 181.80484,178.82478 180.93391,179.11927 179.62217,179.56325 179.00304,178.8836 178.11982,177.91405 178.48299,176.52919 178.76367,175.24805 178.98031,174.25921 179.56316,173.38048 180.07617,172.50781 180.75548,171.35226 181.50835,170.22708 182.40039,169.22656 183.43041,168.07129 184.45208,166.77549 185.85742,166.12695 186.5082,165.82663 187.26355,165.57976 187.99219,165.56641 Z"
sodipodi:nodetypes="ssssssssssssssssssssssssss" />
</g>
<path
style="fill:#253536;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 217.82698,151.22982 220.78165,134.37159 C 220.78165,134.37159 230.21518,127.74488 235.72716,127.29053 237.3573,127.15616 238.5375,127.17652 240.44787,128.03372 241.9542,128.70962 243.2534,126.84667 244.25575,125.53473 245.05446,124.48934 245.73222,123.1178 245.48531,121.8256 245.02477,119.41532 242.798,119.0457 240.95366,117.42707 239.42229,116.08312 238.40705,114.07421 236.37262,113.96292 235.29322,113.90388 234.69624,115.08616 233.7449,115.59951 232.05164,116.5132 230.1889,116.60656 228.44857,117.42707 226.31521,118.43288 224.22769,120.18144 221.8733,120.04087 219.44729,119.89602 217.71391,117.48581 215.46662,116.56052 214.54645,116.18166 213.59511,115.75628 212.60048,115.7254 211.33376,115.68608 211.07922,115.85879 210.0239,116.56052 209.29764,117.04344 208.17204,117.93992 208.20849,118.81132 208.24849,119.76752 209.34259,119.93365 209.22854,120.88386 206.8503,140.69909 202.33292,159.07929 199.11274,178.03815 198.96665,178.89827 199.33294,179.82221 199.78713,180.5671 200.94103,182.45955 202.99847,183.62923 204.71414,185.03256 205.99874,186.08329 207.06482,186.95754 208.72275,187.03162 210.0363,187.09031 211.14345,186.84622 212.09469,185.93847 212.82289,185.24356 213.40517,184.36715 213.78065,183.43324 214.27006,182.21597 214.16847,181.21273 213.73974,179.97278 213.49267,179.25821 212.77483,178.79421 212.76907,178.03815 212.72696,172.50888 215.12943,165.56199 215.12943,165.56199 215.12943,165.56199 218.61175,163.69893 220.66244,162.86444 222.1612,162.25455 223.31092,161.65614 224.8569,161.17847 226.40648,160.69969 228.3798,160.6268 229.87565,160 230.96933,159.54172 232.51527,159.10585 233.20843,158.14373 233.64671,157.53538 233.69402,156.6952 233.595,155.95198 233.35921,154.18205 231.48331,151.22982 231.48331,151.22982 231.48331,151.22982 229.35219,146.9413 227.30755,146.15467 226.72101,145.92901 226.03203,146.21383 225.44276,146.43225 222.62949,147.47502 217.82698,151.22982 217.82698,151.22982 Z"
id="path25"
sodipodi:nodetypes="ccsssssssssssssssssssssscssssscssc"
inkscape:label="F" />
<path
style="fill:#253536;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 280.37636,171.29428 C 279.58927,170.57055 278.09893,170.92808 277.17303,171.46288 274.52889,172.99014 272.16727,174.53894 269.41758,175.5092 265.90739,176.74781 262.15921,178.18001 258.46786,177.70095 255.17512,177.27362 251.3419,175.97737 249.35456,173.31744 245.73802,168.47691 245.72084,161.96702 246.31982,156.20488 246.81779,151.41452 249.08447,146.83581 251.71492,142.80143 255.18784,137.47493 259.93149,132.93937 265.03406,129.1451 268.54384,126.53523 272.30355,123.37253 276.66724,123.07561 281.43955,122.75089 286.40538,123.46941 290.82936,124.93018 293.43333,125.79 295.62434,128.49924 297.06744,130.83106 298.85395,133.71777 299.80553,137.04869 299.93358,140.44108 300.06452,143.91016 298.89244,147.44942 297.23604,150.50032 296.03349,152.71528 294.62856,154.85139 292.85252,156.62636 291.48449,157.99356 290.06,159.84892 288.13181,160 287.00403,160.08837 285.78711,159.37733 285.09707,158.48092 284.25667,157.38919 284.44845,155.8969 284.25409,154.4346 283.92796,151.98088 284.81551,150.55156 284.59128,147.01635 284.51624,145.83321 284.75924,144.54833 284.25409,143.47582 283.84771,142.61301 282.98266,142.03959 282.23093,141.45266 281.71435,141.04933 281.17657,140.61602 280.54496,140.44108 278.86601,139.97604 277.02919,140.11162 275.31846,140.44108 274.12974,140.67001 273.131,141.29322 272.45232,142.29564 271.19205,144.1571 272.3448,146.32133 271.94653,148.53372 271.48971,151.07135 270.42869,153.49066 269.24898,155.78338 268.1008,158.01483 267.16601,159.07393 265.45555,161.00988 264.67414,161.89431 262.39155,162.78722 261.49353,162.02146 260.41086,161.09825 260.70982,159.22518 260.81914,157.80654 261.01579,155.25476 262.06773,152.80558 263.1795,150.50032 264.45915,147.84697 266.13702,145.36258 268.0688,143.13862 269.84391,141.09503 271.21852,139.81689 273.2953,138.08072 274.06297,137.43896 275.55301,136.30033 276.49864,135.97327 277.50777,135.62425 278.86035,136.5461 279.70198,135.88897 280.06726,135.60377 279.88227,133.99189 279.87057,133.52861 279.83648,132.17793 279.17869,131.73208 278.3532,130.66247 277.82908,129.98336 276.828,130.01546 275.99285,129.81948 274.78421,129.53585 273.27836,130.313 272.11513,130.74677 270.04002,131.52058 269.25075,132.0946 267.56301,133.52861 265.0192,135.68999 262.57811,138.01185 260.48195,140.60967 258.59266,142.95111 257.11673,145.60252 255.59264,148.19653 254.14072,150.66771 253.25588,153.05138 252.3893,155.78338 251.56736,158.37468 250.46238,161.15844 250.53474,163.87602 250.59401,166.10201 250.99452,168.14517 252.30501,169.9455 253.42952,171.49033 255.03351,172.36994 256.94142,172.47445 260.56766,172.6731 263.97811,171.27463 266.88862,169.10252 269.35756,167.25995 270.74971,164.30018 272.62091,161.85286 273.59719,160.576 275.48706,157.97514 275.48706,157.97514 275.48706,157.97514 276.80757,163.47368 278.6061,165.56199 279.90221,167.06693 281.277,168.1426 283.24251,168.42813 286.2235,168.86118 289.46362,168.38521 292.17813,167.07936 295.90517,165.28642 301.28236,158.64952 301.28236,158.64952 301.28236,158.64952 305.64504,150.8985 306.84605,146.51056 307.84186,142.87235 308.66092,138.9577 308.19482,135.21458 307.73581,131.52839 306.35183,127.7851 304.3171,124.67728 302.68094,122.17823 300.667,120.18361 298.07902,118.6921 295.04566,116.94391 291.60668,115.74765 288.13181,115.32016 284.04626,114.81754 279.84104,115.43187 275.82425,116.33174 271.6073,117.27646 268.44687,118.72196 264.61257,120.71526 261.16874,122.50558 258.12442,124.84491 255.25545,127.45913 251.96202,130.46012 249.77189,133.23624 247.5,137.06914 245.52737,140.39717 242.31378,144.81074 241.26192,148.53372 239.75718,153.85961 239.19858,159.35716 239.40736,164.8876 239.53642,168.30638 239.2885,171.83023 240.92473,174.83481 242.46522,177.66358 244.81054,180.14334 247.5,181.91587 250.29032,183.75487 254.47564,184.6503 257.7844,185.11921 261.40804,185.63275 264.1454,184.75373 267.73161,184.02333 270.53578,183.45221 271.61438,181.97581 274.47548,181.91588 275.2397,181.89987 277.13118,182.26719 277.84742,182.00017 278.84097,181.62976 279.46878,180.7054 279.87057,179.72412 280.26323,178.76514 280.44799,177.72108 280.54496,176.68937 280.71333,174.89802 281.70081,172.51211 280.37636,171.29428 Z"
id="path26"
sodipodi:nodetypes="sssssssssssssssssssssssssssssssssssssssssssssscssscssssssssssssssssssss"
inkscape:label="@" />
<path
style="fill:#253536;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 350.97158,186.22652 C 353.66809,184.25591 351.47537,179.68628 351.92531,176.43952 354.38629,158.68116 361.46258,123.50766 361.46258,123.50766 L 364.08533,119.21589 C 364.08533,119.21589 359.31627,116.67522 356.69394,116.33178 353.44275,115.90598 348.1104,118.85766 348.1104,118.85766 V 124.10374 L 343.34177,154.98066 H 341.67275 L 337.6194,131.13748 C 337.6194,131.13748 337.55937,123.46583 335.47352,120.40805 334.52841,119.02254 333.08835,117.6005 331.42018,117.42707 327.88514,117.05955 326.58833,115.7357 322.83664,116.45099 320.68659,116.86092 318.63536,118.48256 318.30643,120.64648 315.66125,138.04823 312.34305,155.3131 308.32914,172.50888 307.79978,174.7767 308.32914,176.73844 305.90798,179.06227 305.26116,179.68309 305.70192,181.28455 306.50406,181.68501 309.18705,183.02448 311.26367,183.36981 313.5378,183.96141 316.12484,184.63441 318.50433,186.01287 320.69075,184.55749 321.76251,183.84408 322.12849,182.95156 322.35978,181.68501 322.75247,179.53459 321.52526,175.12814 321.52526,175.12814 L 326.65154,150.2062 332.85077,177.15481 C 332.85077,177.15481 332.10299,180.19097 332.37391,181.68502 332.50075,182.38448 332.78982,183.12761 333.32763,183.59247 335.35357,185.34361 338.31602,185.66707 340.95745,186.1073 344.25031,186.65611 348.20043,188.25167 350.97158,186.22652 Z"
id="path27"
sodipodi:nodetypes="ssccscccccsssssssssscccssss"
inkscape:label="N" />
<g
id="g28"
inkscape:label="!">
<path
style="fill:#253536;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 372.66888,118.5006 C 371.26489,129.41158 368.98391,139.28784 367.06573,149.49673 366.92498,150.24585 366.83938,151.01325 366.58887,151.73314 366.23562,152.74829 365.42322,153.58131 365.15828,154.62301 364.90342,155.62507 365.83738,157.21938 366.41004,158.08027 367.68705,160 368.72154,160.13982 370.6422,161.06067 372.49342,161.94823 374.09411,163.37997 376.12614,163.08734 377.04353,162.95523 377.3585,162.0819 377.85477,161.2991 378.28244,160.62451 378.28786,159.46837 378.39124,158.67635 380.16775,145.0658 382.33701,133.95093 385.30576,119.2099 385.53872,118.05315 382.89062,116.79583 381.8485,116.24235 380.51161,115.53231 380.02383,116.20891 378.51045,116.24235 377.22736,116.2707 375.68096,115.58896 374.57633,116.24235 373.56194,116.84236 372.81929,117.33167 372.66888,118.5006 Z"
id="path28"
sodipodi:nodetypes="ssssssssssssss"
inkscape:label="|" />
<path
style="fill:#253536;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 372.85167,186.72088 C 374.35003,184.28342 373.77842,182.27441 374.3747,179.55551 374.87349,177.28114 375.89268,174.53258 376.22361,171.80007 376.32406,170.97067 374.55927,170.07541 373.77895,169.7769 370.96982,168.70229 370.26131,168.20279 367.70947,168.00664 366.62714,167.92345 365.32612,167.46313 364.50682,168.17524 363.76904,168.8165 363.86292,170.25309 363.66315,171.20998 363.15002,173.66792 363.36568,175.94038 362.48297,178.29104 362.07989,179.36444 361.0232,180.07427 360.45981,181.07289 359.45537,182.37136 359.81167,183.19709 360.9656,184.19193 362.4688,185.39175 364.40571,185.92384 366.1921,186.63658 367.18248,187.03173 368.16122,187.61015 369.22684,187.64816 370.47323,187.69262 372.19853,187.78337 372.85167,186.72088 Z"
id="path29"
sodipodi:nodetypes="sssssssssssss"
inkscape:label="." />
</g>
<path
style="fill:#253536;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 412.24855,179.3007 C 412.32136,177.47417 411.80416,175.58991 412.24855,173.81677 415.71134,160 420.1168,131.37591 420.1168,131.37591 420.1168,131.37591 423.28866,129.12075 425.66034,128.63395 426.82815,128.39424 428.23674,128.21824 429.41564,128.39551 430.48463,128.55626 431.73367,129.29462 432.81329,129.34924 433.62277,129.3902 435.19367,128.9857 435.8533,128.51473 436.75189,127.87313 436.4907,125.17761 436.74742,124.10374 437.37681,121.47103 436.90386,121.59976 437.16468,118.85824 437.24501,118.01381 436.36454,116.31608 435.61487,115.91921 434.84221,115.51017 433.86637,115.91921 432.99212,115.91921 432.11787,115.91921 430.22383,116.40932 429.35603,116.51529 422.52853,117.34905 410.3411,120.88491 410.3411,120.88491 410.3411,120.88491 401.51536,123.26657 396.98892,123.7461 394.58,123.68994 393.33423,123.38209 391.40871,125.10685 390.52218,126.13569 389.78543,127.40879 389.97812,128.75316 390.20365,130.32662 391.45815,131.1323 392.41781,132.39947 393.44469,133.7554 393.31817,135.86787 394.84303,136.62141 395.84056,137.11436 398.54709,136.09376 399.61415,135.77843 402.41198,134.95163 404.85717,134.71396 404.85717,134.71396 404.85717,134.71396 404.96694,136.31112 404.85717,137.09828 403.0837,149.81567 401.42181,157.97333 399.28912,174.94504 399.25694,175.20111 398.41161,177.47666 398.3599,177.72762 398.08231,179.07482 396.61721,178.65048 396.03519,179.89678 395.36512,181.3316 396.63781,183.13824 398.06187,183.8309 401.8911,185.69344 401.45453,185.23037 404.67834,185.31647 406.84391,185.3743 409.46798,186.13256 410.81796,184.43828 412.06243,182.87641 412.16901,181.29615 412.24855,179.3007 Z"
id="path30"
sodipodi:nodetypes="sscssssssssscsssssscssssssss"
inkscape:label="T" />
<path
style="fill:#253536;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 460.77487,181.57868 C 461.2121,179.48836 460.77487,175.172 460.77487,175.172 460.77487,175.172 476.75012,145.59355 487.58175,129.81948 488.68745,128.20926 492.79874,127.15086 492.79874,127.15086 L 492.97684,121.44502 C 492.97684,121.44502 490.3673,117.61096 487.61915,116.57192 485.8141,115.88946 481.89037,115.73741 481.89037,115.73741 L 461.79492,146.67916 C 461.79492,146.67916 459.93963,145.06192 459.73435,143.93719 458.36268,136.42157 457.61244,125.18059 457.61244,125.18059 457.61244,125.18059 459.00795,118.40473 457.05375,116.57193 455.42647,115.04573 451.88604,116.25235 449.83302,117.16801 445.96485,118.89321 444.49901,120.77042 441.50159,123.8244 443.24587,126.21797 443.80054,130.79675 444.76168,135.02407 446.89766,144.41864 452.33305,163.8414 452.33305,163.8414 452.33305,163.8414 447.95532,171.48788 444.38358,177.72762 443.46544,179.3316 445.093,181.15997 446.36584,182.49997 448.23593,184.46874 450.89046,184.95053 453.54215,185.5352 455.33897,185.93139 456.85582,186.94759 458.30026,186.2505 460.09371,185.38497 460.38918,183.42257 460.77487,181.57868 Z"
id="path31"
sodipodi:nodetypes="scsccsccscsscscsssss"
inkscape:label="Y" />
</g>
<path
style="display:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 247.5,76.298171 241.29296,81.066806 227.94078,76.775034 206.48192,89.173487 193.12974,84.404851 184.5462,87.266033 168.33284,88.21976 160.22616,96.803304 145.44339,97.757031 132.09121,88.696623 122.07707,99.187622 109.67862,95.372713 97.280168,93.465259 86.312305,106.81744 74.390716,108.72489 61.992264,101.09508 49.593811,100.14135 41.963994,114.44726 40.05654,122.07707 42.917721,133.04493 31.949859,143.05907 33.857313,156.41125 26.70436,167.37911 30.519268,178.82384 29.565541,193.12974 21.935724,206.00506 37.672222,208.86624 51.024402,199.32897 73.436989,211.72742 84.881715,202.66702 109.20176,208.86624 122.55394,206.95879 133.5218,216.49606 145.44339,217.44979 191.69915,229.37138 205.5282,222.21842 495,222.54768 V 76.880109 Z"
id="path36"
sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 38 KiB

136
img/siskin.svg Normal file
View file

@ -0,0 +1,136 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_2" data-name="Layer 2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 484.03 474.84">
<defs>
<style>
.cls-1 {
fill: #e5cf62;
}
.cls-2 {
fill: #392e1f;
}
.cls-3 {
fill: #feffff;
}
.cls-4 {
fill: #c4b62f;
}
.cls-5 {
fill: #baab9a;
}
.cls-6 {
clip-path: url(#clippath-1);
}
.cls-7 {
stroke: url(#linear-gradient-2);
}
.cls-7, .cls-8, .cls-9, .cls-10 {
fill: none;
}
.cls-7, .cls-8, .cls-10 {
stroke-miterlimit: 10;
stroke-width: 4px;
}
.cls-11 {
fill: #c1b66e;
}
.cls-12 {
fill: #2e2130;
}
.cls-13 {
fill: #cab01c;
}
.cls-8 {
stroke: url(#linear-gradient-3);
}
.cls-14 {
fill: #212121;
}
.cls-15 {
clip-path: url(#clippath);
}
.cls-16 {
fill: #000805;
}
.cls-10 {
stroke: url(#linear-gradient);
}
.cls-17 {
fill: #a19a42;
}
.cls-18 {
fill: #e8d96d;
}
</style>
<clipPath id="clippath">
<path class="cls-9" d="m155.97,474.84c7.81-22.57,14.87-41.17,20.32-55,7.75-19.68,11.14-26.91,14.04-32.69,5.91-11.79,5.69-9.39,18.17-32.42,0,0,6.98-12.89,12.99-21.62,3.1-4.5,6.45-8.9,6.45-8.9,0,0,1.62-2.13,3.39-4.34,19.7-24.71,37.39-42.47,37.39-42.47,16.07-16.13,29.3-26.98,33.86-30.66,1.39-1.13,2.09-1.69,3.04-2.43,10.94-8.46,23.07-17.66,41.13-23.66,16.54-5.49,32.93-11.11,47.57-2.97,15.11,8.4,23.96,26.19,22.79,45.59,2.7,2.4,8.44,8.2,11.15,17.59,1.82,6.32,1.55,11.79,1.11,15.11-5.31-2.37-9.53-4.76-12.64-6.69-3.8-2.36-4.42-2.86-6.57-3.96-7.69-3.97-15.14-4.23-17.15-4.25-4-.05-12.02.48-20.11,5.4-1.81,1.1-5.49,3.55-9.89,8.76-7.98,9.47-6.36,13.87-12.6,24.54-8.59,14.68-22.3,24.5-30.92,30.71-.42.3-.95.68-1.6,1.13-6.32,4.37-21.12,13.79-47.95,21.66-28.58,8.38-56.07,10.71-69.13,11.48,20.68-10.52,48.58-28.44,72.96-58.1,7.25-8.82,28.21-35.77,35.57-69.33,2.12-9.69,2.61-17.76,1.49-26.01-2.16-15.83-9.62-27.43-15.61-35.43-35.45-47.32-79.28-74.32-79.28-74.32-33.41-20.09-41.33-16.6-86.45-39.71-29.69-15.21-52.46-30.15-66.66-40.06,3.77,5.61,10.25,14.8,19.32,25.27,8.86,10.23,29.39,32.29,98.99,76.27,9.78,6.18,24.06,15.02,41.73,25.3-4.86-1.48-11.52-3.61-19.32-6.44-37.63-13.67-64.07-30-72.96-35.68-16.44-10.5-36.81-25.42-57.85-46.08,8.9,21.52,24.08,48.86,51.16,70.98,16.71,13.65,41.42,24.83,60.29,34.01,11.17,5.43,20.63,9.61,27.28,12.44-5.29.29-10.84.29-16.62-.08-38.61-2.48-68.4-20.46-86.56-34.48,5.64,10.12,18.27,29.63,41.99,45.34,23.61,15.63,46.4,19.67,57.9,20.93-6.41,1.48-14.13,2.62-22.87,2.6-23.51-.03-41.67-8.36-51.64-14,8.02,9.49,21.04,22.6,40.13,33.69,14.6,8.48,28.24,13.17,38.65,15.86-4.31,1.64-9.74,3.15-16.1,3.72-18.09,1.61-32.18-5.49-38.4-9.17,6.82,8.07,17.07,18.41,31.46,27.75,10.85,7.04,21.12,11.61,29.48,14.62-3.65,1.16-8.12,2.17-13.25,2.48-14.71.89-26.17-4.48-31.83-7.68,5.49,8.3,17.27,23.2,37.16,29.98,3.91,1.33,7.68,2.2,11.2,2.73"/>
</clipPath>
<clipPath id="clippath-1">
<path class="cls-9" d="m357.86,36.48c-3.83,12.38-7.82,30.95-5.23,52.83,1.84,15.53,6.17,25.77,8.37,32.3,6.36,18.9,9.05,48.9-9.42,96.51-13.39,7.26-26.79,14.51-40.18,21.77-.76-6.82-2.35-16.97-6.11-28.83-3.27-10.29-5.94-14.51-7.76-20.37-2.96-9.53-4.54-24.24,3.06-45.93,1.02,8.26,3.21,14.35,4.97,18.31,2.64,5.95,6.03,9.15,8.63,16.74,1.41,4.12,2.03,7.66,2.33,9.92,1.58-1.71,3.98-4.69,5.61-8.9,5.91-15.24-5.9-28.41-8.98-46.27-1.6-9.27-1.41-22.94,7.51-41.1-1.47,14.83,1.32,25.22,4.26,32.08,3.33,7.76,7.48,12.45,10.98,23.41,2.38,7.44,3.23,13.91,3.56,18.27,2-2.59,4.64-6.62,6.38-11.99,2.75-8.52,1.31-14.53-2.48-34-4.61-23.65-5.96-32.74-4.4-44.61.21-1.59.46-4.02,1.27-7.18,3.85-15.02,11.71-26.05,17.65-32.95Z"/>
</clipPath>
<linearGradient id="linear-gradient" x1="268.88" y1="386.34" x2="283.69" y2="386.34" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#000"/>
<stop offset="1" stop-color="#000"/>
</linearGradient>
<linearGradient id="linear-gradient-2" x1="287.9" y1="375.66" x2="304.37" y2="375.66" xlink:href="#linear-gradient"/>
<linearGradient id="linear-gradient-3" x1="268.98" y1="393.87" x2="313.02" y2="393.87" xlink:href="#linear-gradient"/>
</defs>
<g id="Layer_1-2" data-name="Layer 1">
<g>
<g class="cls-15">
<g>
<ellipse class="cls-11" cx="227.21" cy="287.64" rx="167.4" ry="77.79" transform="translate(-56.17 55.13) rotate(-12.33)"/>
<path class="cls-1" d="m354.43,167.55c6.99,35.51-67.81,92.56-136.54,95.53-17.09.74-17.95-2.55-61.92-8.64-94.28-13.06-122.42-2.73-128.62-15.42-9.38-19.19,56.45-91.96,146.94-111.73,76.91-16.81,172.92,3.53,180.15,40.26Z"/>
<path class="cls-12" d="m337.67,94.75c1.22,12.05-13.76,14.9-65.79,63.92-40.48,38.14-42.7,47.05-61.28,52.98-22.89,7.3-36.62-.78-91.72-15.39-85.29-22.61-103.83-16.89-108.29-30.04C.98,137.94,73.66,72.89,157.53,54.49c84.57-18.55,177.19,11.07,180.15,40.26Z"/>
<path class="cls-4" d="m327.83,45.82c.9,16.43-34.14,17.8-65.3,61.01-27.45,38.08-15.85,58.66-37.44,73.44-14.79,10.13-31.85,8.42-145.44-28.08C11.15,130.18,3.22,126.27.75,117.29-8.33,84.38,66.87,23,147.68,5.56c87.18-18.81,178.72,13.99,180.15,40.26Z"/>
</g>
</g>
<g class="cls-6">
<g>
<ellipse class="cls-1" cx="290.17" cy="178.71" rx="167.4" ry="77.79" transform="translate(-31.46 66.06) rotate(-12.33)"/>
<path class="cls-11" d="m483.71,246.33c6.16,46.65-77.97,96.66-146.94,111.73-90.32,19.74-170.98,1.71-180.15-40.26-6.6-30.21,59.19-64.87,146.94-111.73,32.11-17.15,48.95-23.4,69.92-23.91,48.33-1.18,105.51,28.42,110.23,64.17Z"/>
<path class="cls-12" d="m413.75,76.82c.88,8.85-6.55,14.86-38.83,41.98-95.16,79.97-93.16,80.38-101.76,84-70.46,29.68-179.32-8.41-186.5-54.51-6.75-43.37,76.07-96.53,146.94-111.73,82.85-17.77,177.17,10.38,180.15,40.26Z"/>
<path class="cls-4" d="m400,50.06c-.01,5.23-5.62,6.9-22.68,29.86-9.98,13.43-15.61,23.03-18.34,27.27-12.89,20.03-54.43,65.83-96.38,82.17-72.52,28.25-183.99-16.79-189.69-67.83-5.23-46.94,79.17-97.42,146.94-111.73,89.76-18.96,180.2,19.23,180.15,40.26Z"/>
</g>
</g>
<path class="cls-17" d="m311.4,239.89c0,1.34-.06,3.35-.27,5.78-.61,6.93-2.12,12.06-3,15-5.05,16.86-7.57,25.29-9.24,29.4-8.68,21.31-26.85,39.38-39.61,51.89-12.6,12.35-30.87,28.2-55.49,43.57l-4.44.41c-11.98,16.33-23.96,32.65-35.94,48.97-2.88,1.6-5.76,3.2-8.64,4.8,18.15-21.67,29.13-40.12,35.86-53.17,4.42-8.57,11.41-23.36,24-42.96,4.75-7.39,8.79-13.14,11-16.26,10.43-14.78,17.15-24.27,27.06-34.49,4.43-4.56,12.89-12.78,18.34-17.89.6-.56,1.8-1.68,3.76-3.53,7.29-6.85,8.62-8.17,11.03-10.39,4.23-3.9,7.45-6.58,11.37-9.85,3.91-3.25,8.67-7.09,14.21-11.28Z"/>
<path class="cls-13" d="m203.79,385.53c7.63-4.77,17.18-11.19,27.69-19.44,19.05-14.95,31.58-28.32,34.68-31.66,9.56-10.33,21.21-24.49,32.51-42.78-.36,1.86-3.26,18.24,8.62,31.6,11.6,13.03,27.67,12.39,29.67,12.27-9.99,8.22-22.35,16.91-37.24,24.73-37.49,19.69-73.05,24.38-95.93,25.29Z"/>
<path class="cls-18" d="m402.98,282.1c2.27-1.04,6-3.11,9.44-6.97,2.93-3.28,4.51-6.58,5.36-8.78.33-7.5.2-27.92-13.42-40.77-19.36-18.27-60.49-16.06-92.97,14.31-4.47,17.97-8.94,35.94-13.4,53.92-.36,2.45-2.1,16.03,7.25,27.94,11.64,14.84,30.11,13.87,31.71,13.76,11.2-10.91,17.72-21.2,21.66-28.85,4.02-7.79,4.71-11.59,8.74-15.84,8.97-9.45,23.88-9.96,35.62-8.72Z"/>
<g>
<path class="cls-14" d="m417.86,264.27c-5.99,1.04-11.99,2.08-17.98,3.12-8.69,0-25.87-.87-28.93-8.82-1.6-4.15.11-11.62-1.98-16.77-.18-.44-1.07-2.55-.4-4.78.16-.54.49-1.57,1.4-1.97,1-.44,2.22.1,2.9.69,1.22,1.05.81,2.26,1.56,2.86,1.68,1.34,8.04-1.25,8.71-5,.72-4.07-5.47-8.43-10.07-10.04-1.26-.44-3.77-.7-8.74-1.22-6.26-.65-9.4-1.07-10.73-.93-.16.02-.3.03-.44.05-1.49.2-2.56.42-2.88.48-2.63.52-4.95.15-4.95.15-.38-.04-.84-.12-1.35-.3-1.16-.42-1.91-1.15-2.29-1.59,1.54-.63,3.82-1.52,6.62-2.44,11.95-3.91,25.14-8.22,39.06-3.42,9.13,3.15,16,9.33,19.68,13.85,1.79,2.19,3.18,4.43,3.37,4.73,3.59,5.81,4.92,10.95,5.74,14.12,1.79,7,1.93,13.06,1.71,17.22Z"/>
<path class="cls-14" d="m372.89,286.46c1.28-3.15,3.24-7,6.31-10.92,6.75-8.6,15.04-12.64,19.56-14.43l5.1,7.48c2.04,5.7,1.91,11.31-.89,13.51-3.01,2.38-10.22.91-12.52.46-.52-.1-1.88-.41-3.72-.39-1.62.02-2.99.28-4.51.68-3.78,1.01-7.23,2.56-9.33,3.6Z"/>
</g>
<g>
<circle class="cls-16" cx="385.54" cy="247.87" r="7.95"/>
<circle class="cls-3" cx="387.05" cy="245.08" r="2.79"/>
</g>
<path class="cls-5" d="m426.99,293.81c.88-2.4,2.22-7.14,1.25-12.95-1.64-9.81-8.66-15.31-10.38-16.59-1.51,3.49-3.02,6.97-4.54,10.46-3.89,2.17-7.77,4.35-11.66,6.52,8.44,4.19,16.88,8.37,25.33,12.56Z"/>
<g>
<path class="cls-5" d="m417.86,264.27c3.09,4.69,6.52,10.91,9.19,18.6,1.51,4.35,2.51,8.41,3.19,12.04-1.07-.34-2.38-.8-3.86-1.43,0,0-1.62-.69-3.2-1.52-3.71-1.94-7.24-4.8-9.36-6.21-2.26-1.5-5.74-3.24-10.95-4.02-.48-1.16-.93-2.54-1.22-4.12-.64-3.57-.19-6.73.45-9.09.27-1,.58-1.85.85-2.53,1.77-.38,3.66-.72,5.66-1,3.33-.46,6.43-.67,9.25-.73Z"/>
<path class="cls-2" d="m402.95,266c-.18.49-.36.98-.53,1.47,3.49,2.64,7.32,5.87,11.23,9.79,4.24,4.25,7.69,8.41,10.46,12.15,1.18,1.21,2.36,2.42,3.54,3.63-3.27-4.91-7.48-10.45-12.84-16.11-4.09-4.32-8.13-7.93-11.86-10.94Z"/>
</g>
<g>
<path class="cls-10" d="m270.73,372.87l11.11,26.94"/>
<path class="cls-7" d="m289.62,364.79c4.34,7.25,8.69,14.5,13.03,21.75"/>
<line class="cls-8" x1="269.93" y1="405.27" x2="312.07" y2="382.47"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.5 KiB

1
img/spark.svg Normal file
View file

@ -0,0 +1 @@
<svg height="165" width="165" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><path style="fill:#f8b80c;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M843 1218s-256-165-270-339a403 403 0 0 0 421-453C964 179 746 2 476 0A456 456 0 0 0 0 476c9 414 459 682 843 742" transform="matrix(.13333 0 0 -.13333 16 164)"/><path style="fill:#f1501d;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M619 692s-144-92-152-188a223 223 0 0 0 235-251C685 117 563 19 413 18a253 253 0 0 0-266 263c6 229 257 377 472 411" transform="matrix(.13333 0 0 -.13333 16 164)"/></svg>

After

Width:  |  Height:  |  Size: 562 B

1
img/xmpp-web.svg Normal file
View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><text y=".9em" font-size="80">🕸️</text></svg>

After

Width:  |  Height:  |  Size: 113 B

View file

@ -2,6 +2,7 @@ systems = [
{ name = "Android", id = "android" }, { name = "Android", id = "android" },
{ name = "Apple", id = "apple" }, { name = "Apple", id = "apple" },
{ name = "Browser", id = "browser" }, { name = "Browser", id = "browser" },
{ name = "BSD", id = "bsd" },
{ name = "Haiku", id = "haiku" }, { name = "Haiku", id = "haiku" },
{ name = "KaiOS", id = "kaios" }, { name = "KaiOS", id = "kaios" },
{ name = "Linux", id = "linux" }, { name = "Linux", id = "linux" },

1
xep_0060/README Normal file
View file

@ -0,0 +1 @@
This directory caches PubSub node items.

View file

@ -32,7 +32,17 @@
</div> </div>
<div id="container-of-selection"> <div id="container-of-selection">
{% if client_selection %} {% if client_selection %}
<div id="system-title">
<a class="system-menu" href="/selection">&lt; Systems</a>
<h1>{{title}}</h1> <h1>{{title}}</h1>
{% if skipped %}
<a class="system-menu" href="/download/{{software}}/all">All clients &gt;</a>
{% elif not featured %}
<a class="system-menu" href="/download/{{software}}">Featured &gt;</a>
{% else %}
<span class="system-menu" />
{% endif %}
</div>
<div id="software-menu"> <div id="software-menu">
{% for client in client_selection %} {% for client in client_selection %}
<a class="system" href="#{{client['iden']}}"> <a class="system" href="#{{client['iden']}}">
@ -158,16 +168,6 @@
</span> </span>
</div> </div>
{% endif %} {% endif %}
<div class="plain-note">
XMPP clients of other devices and systems can be found at the
<a href="/selection">main selection</a> page.
</div>
{% if skipped %}
<div class="plain-note">
Display the <a href="/download/{{software}}/all">
complete list</a> of XMPP clients for {{title}}.
</div>
{% endif %}
<br/> <br/>
<hr/> <hr/>
<dl id="selection"> <dl id="selection">
@ -201,6 +201,9 @@
{% if 'otr' in client['properties'] %} {% if 'otr' in client['properties'] %}
<span>🔏️ OTR</span> <span>🔏️ OTR</span>
{% endif %} {% endif %}
{% if 'plugin' in client['properties'] %}
<span>🧩️ Plugins</span>
{% endif %}
{% if 'pubsub' in client['properties'] %} {% if 'pubsub' in client['properties'] %}
<span>📡️ PubSub</span> <span>📡️ PubSub</span>
{% endif %} {% endif %}

View file

@ -6,15 +6,15 @@
<html xmlns="http://www.w3.org/1999/xhtml"> <html xmlns="http://www.w3.org/1999/xhtml">
<head> <head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
<title>{{brand_name}}: {{action}} {{title}}</title> <title>{{brand_name}}: {{action}} {% if alias %}{{alias}}{% else %}{{title}}{% endif %}</title>
<meta name="description" content="{{action}} {{title}}" /> <meta name="description" content="{{action}} {% if alias %}{{alias}}{% else %}{{title}}{% endif %}" />
<meta name="generator" content="Fast And Sleek Invite" /> <meta name="generator" content="Fast And Sleek Invite" />
<meta name="uri" content="{{xmpp_uri}}" /> <meta name="uri" content="{{xmpp_uri}}" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<meta property="og:description" content="{{action}} {{title}}" /> <meta property="og:description" content="{{action}} {% if alias %}{{alias}}{% else %}{{title}}{% endif %}" />
<meta property="og:image" content="/photo/{{filename}}" /> <meta property="og:image" content="/photo/{{filename}}" />
<meta property="og:site_name" content="{{brand_name}}" /> <meta property="og:site_name" content="{{brand_name}}" />
<meta property="og:title" content="{{title}}" /> <meta property="og:title" content="{% if alias %}{{alias}}{% else %}{{title}}{% endif %}" />
<meta property="og:type" content="website" /> <meta property="og:type" content="website" />
<meta property="og:url" content="{{url}}" /> <meta property="og:url" content="{{url}}" />
<link rel="alternate icon" href="/img/favicon.ico" type="image/x-icon" /> <link rel="alternate icon" href="/img/favicon.ico" type="image/x-icon" />
@ -77,12 +77,12 @@
<!-- /a --> <!-- /a -->
</div> </div>
{% endif %} {% endif %}
{% if note %} <div id="vcard-note">
<h3>{{note}}</h3> {% if note %}{{note}}{% endif %}
{% endif %}
<div>
<pre id="xmpp-uri">{{xmpp_uri}}</pre>
</div> </div>
<!-- div>
<pre id="xmpp-uri">{{xmpp_uri}}</pre>
</div -->
{% if exception %} {% if exception %}
<div> <div>
<code>{{exception}}</code> <code>{{exception}}</code>
@ -102,20 +102,18 @@
Preview journal OR Preview group chat Preview journal OR Preview group chat
</a> </a>
</div --> </div -->
{% if count or jid_kind in ('conference', 'mix', 'muc') %}
<div id="count"> <div id="count">
<a href="{{view_href}}"> {% if count_item or count_message %}
{% if count %} <a href="{{view_href}}">{% if count_item %}{{count_item}} {{instance}}{% elif count_message %}Preview{% endif %}</a>
{{count}} {{instance}} <span></span>
{% elif jid_kind in ('conference', 'mix', 'muc') %} {% endif %}
Preview {% if vcard4 %}
<a href="/c/{{jid_bare}}">my profile</a>
{% endif %} {% endif %}
</a>
</div> </div>
{% endif %}
</div> </div>
<div id="notice"> <div id="notice">
If you already have <strong>{% if chat_client %}{{chat_client}}{% else %}an XMPP Client{% endif %}</strong> you can If you already have <strong>{% if news_client and jid_kind == 'pubsub' %}{{news_client}}{% elif chat_client %}{{chat_client}}{% else %}an XMPP Client{% endif %}</strong> you can
<br/> <br/>
{% if jid_kind in ('conference', 'mix', 'muc') %} {% if jid_kind in ('conference', 'mix', 'muc') %}
join to join to

View file

@ -76,14 +76,10 @@
</div> </div>
{% endif %} {% endif %}
<div class="link"> <div class="link">
<a href="{{entry['href']}}">Source</a>
<a href="/d/{{jid_bare}}/{{node_name}}/{{entry['id']}}" <a href="/d/{{jid_bare}}/{{node_name}}/{{entry['id']}}"
title="Permalink (i.e. permanent link)" title="Permalink (i.e. permanent link)"
class="permalink"> class="permalink">Permalink</a>
🔗️
</a>
<a href="{{entry['href']}}">
{{entry['title']}}
</a>
</div> </div>
</div> </div>
{% endfor %} {% endfor %}

135
xhtml/vcard.xhtml Normal file
View file

@ -0,0 +1,135 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!-- Kayla (Céile) XMPP Invite -->
<!-- Zenya (Xenia) XMPP Invite -->
<!-- Fast And Sleek Invite (FASI) -->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
<title>{{brand_name}}: {{action}} {% if alias %}{{alias}}{% else %}{{title}}{% endif %}</title>
<meta name="description" content="{{action}} {% if alias %}{{alias}}{% else %}{{title}}{% endif %}" />
<meta name="generator" content="Fast And Sleek Invite" />
<meta name="uri" content="{{xmpp_uri}}" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta property="og:description" content="{{action}} {% if alias %}{{alias}}{% else %}{{title}}{% endif %}" />
<meta property="og:image" content="/photo/{{filename}}" />
<meta property="og:site_name" content="{{brand_name}}" />
<meta property="og:title" content="{% if alias %}{{alias}}{% else %}{{title}}{% endif %}" />
<meta property="og:type" content="website" />
<meta property="og:url" content="{{url}}" />
<link rel="alternate icon" href="/img/favicon.ico" type="image/x-icon" />
<link rel="icon" href="/img/favicon.svg" type="image/svg+xml" />
<link rel="stylesheet" href="/css/stylesheet.css" media="screen" type="text/css" />
</head>
<body>
<div id="overlay">
<div id="bar">
<a href="{{brand_site}}">
<img id="logo" src="/img/logo-wordmark-horizontal.svg" />
</a>
<a id="download" href="/download">
Download
</a>
</div>
<div id="container">
<div id="profile">
<h1>
{% if 'fn' in vcard_info and vcard_info['fn'] %}
{{vcard_info['fn']}}
{% else %}
{{jid_bare}}
{% endif %}
</h1>
{% if 'org' in vcard_info and vcard_info['org'] %}
<h2>{{vcard_info['org']}}</h2>
{% endif %}
{% if 'note' in vcard_info and vcard_info['note'] %}
<div id="vcard-note-full">{{vcard_info['note']}}</div>
{% endif %}
<div id="vcard-links">
{% if 'email' in vcard_info and vcard_info['email'] %}
<a class="vcard-link" href="mailto:{{vcard_info['email']}}">✉️</a>
{% endif %}
{% if 'impp' in vcard_info and vcard_info['impp'] %}
<a class="vcard-link" href="{{vcard_info['impp']}}">💬️</a>
{% endif %}
<a class="vcard-link" href="xmpp:{{xmpp_uri}}">💡️</a>
{% if 'url' in vcard_info and vcard_info['url'] %}
<a class="vcard-link" href="{{vcard_info['url']}}">🔗️</a>
{% endif %}
</div>
<div id="vcard-links-extra">
{% if 'movim' in vcard_info and vcard_info['movim'] %}
<h3>Movim</h3>
{% for i in vcard_info['movim'] %}
<a href="{{i['uri']}}">{{i['label']}}</a>
{% endfor %}
{% endif %}
{% if 'journal' in vcard_info and vcard_info['journal'] %}
<h3>Journal</h3>
{% for i in vcard_info['journal'] %}
<a href="{{i['uri']}}">{{i['label']}}</a>
{% endfor %}
{% endif %}
{% if 'gallery' in vcard_info and vcard_info['gallery'] %}
<h3>Gallery</h3>
{% for i in vcard_info['gallery'] %}
<a href="{{i['uri']}}">{{i['label']}}</a>
{% endfor %}
{% endif %}
{% if 'peertube' in vcard_info and vcard_info['peertube'] %}
<h3>PeerTube</h3>
{% for i in vcard_info['peertube'] %}
<a href="{{i['uri']}}">{{i['label']}}</a>
{% endfor %}
{% endif %}
{% if 'code' in vcard_info and vcard_info['code'] %}
<h3>Code</h3>
{% for i in vcard_info['code'] %}
<a href="{{i['uri']}}">{{i['label']}}</a>
{% endfor %}
{% endif %}
</div>
<div>
{% for i in vcard_info %}
<!-- a href="{{vcard_info[i]}}">{{i}}</a -->
{% endfor %}
</div>
{% if exception %}
<div>
<code>{{exception}}</code>
</div>
{% endif %}
{% if links %}
<div id="action">
{% for link in links %}
<a href="{{link['href']}}" id="{{link['iden']}}">
{{link['name']}}
</a>
{% endfor %}
</div>
{% endif %}
<!-- div>
<a id="preview" href="/view/{{jid_bare}}">
Preview journal OR Preview group chat
</a>
</div -->
{% if count or jid_kind in ('conference', 'mix', 'muc') %}
<div id="count">
<a href="{{view_href}}">
{% if count %}
{{count}} {{instance}}
{% elif jid_kind in ('conference', 'mix', 'muc') %}
Preview
{% endif %}
</a>
</div>
{% endif %}
</div>
</div>
{% if message %}
<div id="xmpp-message">{{message}}</div>
{% endif %}
</div>
</body>
</html>