Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a91f8d0e3f | ||
|
|
5976ecd163 | ||
|
|
784c175ba3 | ||
|
|
f58a726604 | ||
|
|
400788252f | ||
|
|
5b5ca862dd | ||
|
|
d0f1885ac5 | ||
|
|
0d311cc94f | ||
|
|
c3c1ccc837 | ||
|
|
0506b0f364 | ||
|
|
590066f454 | ||
|
|
484b12611b | ||
|
|
6bba38bb1c | ||
|
|
4cb9f66e0f | ||
|
|
2431089e50 | ||
|
|
febf6c632d | ||
|
|
999d83ba8b | ||
|
|
5d664fa055 | ||
|
|
d014bc4b91 | ||
|
|
76341750c0 | ||
|
|
7c69926211 | ||
|
|
1bf1f06a21 | ||
|
|
525716e88e | ||
|
|
1b272e994b | ||
|
|
933330cd87 | ||
|
|
1197b9de5c | ||
|
|
b0d36ca51d | ||
|
|
9a8251ec66 | ||
|
|
2f045c73de | ||
|
|
34a89c4909 | ||
|
|
f7e877ebcc | ||
|
|
e528fe0e34 | ||
|
|
d3ac2942bb | ||
|
|
826ea9d2a9 | ||
|
|
15bc21c56b | ||
|
|
d0bb51e433 | ||
|
|
d5f9f1a73e | ||
|
|
f2267b98b9 | ||
|
|
32511c2b2b | ||
|
|
d00c062c0e | ||
|
|
411fa38c50 | ||
|
|
4cfe0fa945 | ||
|
|
cf0c99bd78 | ||
|
|
b05d220fa4 | ||
|
|
f69b08ea59 | ||
|
|
ebdbc1e7ad | ||
|
|
2830080c0f | ||
|
|
ed2060c2a2 | ||
|
|
12d4760156 | ||
|
|
b4ad2fb3c4 | ||
|
|
59c02bd7f3 | ||
|
|
f75053c931 | ||
|
|
7f89abe1af | ||
|
|
e3a2895531 | ||
|
|
6e9ba0fce5 | ||
|
|
669379818e | ||
|
|
478a15bc90 | ||
|
|
2c25a1f343 | ||
|
|
d61762dc7a | ||
|
|
8fc709676f | ||
|
|
ea4a187a1a | ||
|
|
3000597fbc | ||
|
|
7b1974c85f | ||
|
|
c421e14e6c | ||
|
|
9f573f6c6f | ||
|
|
c9e84bffd8 | ||
|
|
3c2b901439 | ||
|
|
9e48fb09f6 | ||
|
|
1ea658ad1d | ||
|
|
7b0bd77d16 | ||
|
|
5ac24eb29e | ||
|
|
48120c9144 | ||
|
|
ce95488420 | ||
|
|
2bcf0d1f57 | ||
|
|
2d608f44b1 | ||
|
|
94d93260a8 | ||
|
|
c592818587 |
@@ -19,6 +19,8 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: 'true'
|
||||
- name: Set Build Variables
|
||||
id: vars
|
||||
run: |
|
||||
@@ -61,4 +63,7 @@ jobs:
|
||||
path: output/${{ steps.vars.outputs.tgz }}
|
||||
- name: Regression Test
|
||||
run: |
|
||||
make test-qeneth
|
||||
rc=true
|
||||
make test-qeneth || rc=false
|
||||
cat test/.log/last/result.md >> $GITHUB_STEP_SUMMARY
|
||||
eval $rc
|
||||
|
||||
@@ -78,6 +78,7 @@ jobs:
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/download-artifact@v3
|
||||
- name: Extract ChangeLog entry ...
|
||||
run: |
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
#
|
||||
# SYNC_FORK = 'true'
|
||||
#
|
||||
# You also need a GH_SYNC_REPO token allowed to update workflows. For
|
||||
# more information on variables and secrets, see the GitHub docs.
|
||||
# See https://docs.github.com/en/actions/learn-github-actions/variables
|
||||
name: Synchronize your fork of Infix with upstream
|
||||
|
||||
@@ -18,9 +20,9 @@ jobs:
|
||||
steps:
|
||||
- uses: TobKed/github-forks-sync-action@master
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
github_token: ${{ secrets.GH_SYNC_REPO }}
|
||||
upstream_repository: KernelKit/infix
|
||||
upstream_branch: main
|
||||
target_branch: main
|
||||
force: true
|
||||
force: false
|
||||
tags: true
|
||||
|
||||
@@ -6,4 +6,5 @@
|
||||
/output*
|
||||
/x-*
|
||||
/test/.venv
|
||||
/test/.log
|
||||
/local.mk
|
||||
|
||||
@@ -19,7 +19,47 @@
|
||||
Infix is a Linux Network Operating System (NOS) based on [Buildroot][1],
|
||||
and [sysrepo][2]. A powerful mix that ease porting to different
|
||||
platforms, simplify long-term maintenance, and provide made-easy
|
||||
management using NETCONF[^1].
|
||||
management using NETCONF[^1] (remote) or the built-in [CLI][3].
|
||||
|
||||
<details><summary><b>Example CLI Session</b></summary>
|
||||
|
||||
The CLI configure context is automatically generated from the loaded
|
||||
YANG models and their corresponding [sysrepo][2] plugins. The following
|
||||
is brief example of how to set the IP address of an interface:
|
||||
|
||||
```
|
||||
admin@infix-12-34-56:/> configure
|
||||
admin@infix-12-34-56:/config/> edit interfaces interface eth0
|
||||
admin@infix-12-34-56:/config/interfaces/interface/eth0/> set ipv4 <TAB>
|
||||
address autoconf bind-ni-name enabled
|
||||
forwarding mtu neighbor
|
||||
admin@infix-12-34-56:/config/interfaces/interface/eth0/> set ipv4 address 192.168.2.200 prefix-length 24
|
||||
admin@infix-12-34-56:/config/interfaces/interface/eth0/> show
|
||||
type ethernetCsmacd;
|
||||
ipv4 address 192.168.2.200 prefix-length 24;
|
||||
ipv6 enabled true;
|
||||
admin@infix-12-34-56:/config/interfaces/interface/eth0/> diff
|
||||
interfaces {
|
||||
interface eth0 {
|
||||
+ ipv4 {
|
||||
+ address 192.168.2.200 {
|
||||
+ prefix-length 24;
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
}
|
||||
admin@infix-12-34-56:/config/interfaces/interface/eth0/> leave
|
||||
admin@infix-12-34-56:/> show interfaces brief
|
||||
lo UNKNOWN 00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
|
||||
eth0 UP 52:54:00:12:34:56 <BROADCAST,MULTICAST,UP,LOWER_UP>
|
||||
admin@infix-12-34-56:/> show ip brief
|
||||
lo UNKNOWN 127.0.0.1/8 ::1/128
|
||||
eth0 UP 192.168.2.200/24 fe80::5054:ff:fe12:3456/64
|
||||
admin@infix-12-34-56:/> copy running-config startup-config
|
||||
```
|
||||
|
||||
[Click here][3] for more details.
|
||||
</details>
|
||||
|
||||
Infix can run on many different types of architectures and boards, much
|
||||
thanks to Linux and Buildroot. Currently the focus is on 64-bit ARM
|
||||
@@ -40,8 +80,9 @@ more information, see: [Infix in Virtual Environments](doc/virtual.md).
|
||||
>
|
||||
> For *customer specific builds* of Infix, see your product repository.
|
||||
|
||||
[^1]: or RESTCONF, <https://datatracker.ietf.org/doc/html/rfc8040>, for
|
||||
mode information, see [Infix Variants](doc/variant.md).
|
||||
[^1]: NETCONF or RESTCONF, <https://datatracker.ietf.org/doc/html/rfc8040>,
|
||||
for more information, see [Infix Variants](doc/variant.md).
|
||||
|
||||
[1]: https://buildroot.org/
|
||||
[2]: https://www.sysrepo.org/
|
||||
[3]: doc/cli/introduction.md
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
#!/bin/sh
|
||||
|
||||
# This file is part of avahi.
|
||||
#
|
||||
# avahi is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU Lesser General Public License as
|
||||
# published by the Free Software Foundation; either version 2 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# avahi is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
# License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with avahi; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||
# USA.
|
||||
|
||||
set -e
|
||||
|
||||
# Command line arguments:
|
||||
# $1 event that happened:
|
||||
# BIND: Successfully claimed address
|
||||
# CONFLICT: An IP address conflict happened
|
||||
# UNBIND: The IP address is no longer needed
|
||||
# STOP: The daemon is terminating
|
||||
# $2 interface name
|
||||
# $3 IP adddress
|
||||
|
||||
PATH="$PATH:/usr/bin:/usr/sbin:/bin:/sbin"
|
||||
|
||||
# Use a different metric for each interface, so that we can set
|
||||
# identical routes to multiple interfaces.
|
||||
|
||||
METRIC=$((1000 + `cat "/sys/class/net/$2/ifindex" 2>/dev/null || echo 0`))
|
||||
|
||||
if [ -x /bin/ip -o -x /sbin/ip ] ; then
|
||||
|
||||
# We have the Linux ip tool from the iproute package
|
||||
|
||||
case "$1" in
|
||||
BIND)
|
||||
ip addr flush dev "$2" label "$2:avahi"
|
||||
ip addr add "$3"/16 brd 169.254.255.255 label "$2:avahi" scope link dev "$2" proto 6
|
||||
ip route add default dev "$2" metric "$METRIC" scope link ||:
|
||||
;;
|
||||
|
||||
CONFLICT|UNBIND|STOP)
|
||||
ip route del default dev "$2" metric "$METRIC" scope link ||:
|
||||
ip addr del "$3"/16 brd 169.254.255.255 label "$2:avahi" scope link dev "$2"
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Unknown event $1" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
elif [ -x /bin/ifconfig -o -x /sbin/ifconfig ] ; then
|
||||
|
||||
# We have the old ifconfig tool
|
||||
|
||||
case "$1" in
|
||||
BIND)
|
||||
ifconfig "$2:avahi" inet "$3" netmask 255.255.0.0 broadcast 169.254.255.255 up
|
||||
route add default dev "$2:avahi" metric "$METRIC" ||:
|
||||
;;
|
||||
|
||||
CONFLICT|STOP|UNBIND)
|
||||
route del default dev "$2:avahi" metric "$METRIC" ||:
|
||||
ifconfig "$2:avahi" down
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Unknown event $1" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
else
|
||||
|
||||
echo "No network configuration tool found." >&2
|
||||
exit 1
|
||||
|
||||
fi
|
||||
|
||||
exit 0
|
||||
@@ -0,0 +1,3 @@
|
||||
4 static
|
||||
5 dhcp
|
||||
6 random
|
||||
@@ -0,0 +1,134 @@
|
||||
#!/bin/sh
|
||||
|
||||
# udhcpc script edited by Tim Riker <Tim@Rikers.org>
|
||||
|
||||
[ -z "$1" ] && echo "Error: should be called from udhcpc" && exit 1
|
||||
|
||||
ACTION="$1"
|
||||
RESOLV_CONF="/etc/resolv.conf"
|
||||
[ -e $RESOLV_CONF ] || touch $RESOLV_CONF
|
||||
[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"
|
||||
[ -n "$subnet" ] && NETMASK="$subnet"
|
||||
# Handle stateful DHCPv6 like DHCPv4
|
||||
[ -n "$ipv6" ] && ip="$ipv6/128"
|
||||
|
||||
if [ -z "${IF_WAIT_DELAY}" ]; then
|
||||
IF_WAIT_DELAY=10
|
||||
fi
|
||||
|
||||
wait_for_ipv6_default_route() {
|
||||
printf "Waiting for IPv6 default route to appear"
|
||||
while [ $IF_WAIT_DELAY -gt 0 ]; do
|
||||
if ip -6 route list | grep -q default; then
|
||||
printf "\n"
|
||||
return
|
||||
fi
|
||||
sleep 1
|
||||
printf "."
|
||||
: $((IF_WAIT_DELAY -= 1))
|
||||
done
|
||||
printf " timeout!\n"
|
||||
}
|
||||
|
||||
flush_dhcp_addresses() {
|
||||
addrs=$(ip -j addr show dev $interface | jq -c \
|
||||
'.[0].addr_info[] | select(.family == "inet") | select(.protocol == "dhcp")')
|
||||
|
||||
for addr in $addrs; do
|
||||
ip="$(echo "$addr" | jq -r '."local"')"
|
||||
prefix="$(echo "$addr" | jq -r '."prefixlen"')"
|
||||
ip addr del "$ip/$prefix" dev "$interface"
|
||||
done
|
||||
}
|
||||
|
||||
case "$ACTION" in
|
||||
deconfig)
|
||||
flush_dhcp_addresses
|
||||
|
||||
/bin/ip link set dev $interface up
|
||||
|
||||
# drop info from this interface
|
||||
# resolv.conf may be a symlink to /tmp/, so take care
|
||||
TMPFILE=$(mktemp)
|
||||
grep -vE "# $interface\$" $RESOLV_CONF > $TMPFILE
|
||||
cat $TMPFILE > $RESOLV_CONF
|
||||
rm -f $TMPFILE
|
||||
|
||||
if [ -x /usr/sbin/avahi-autoipd ]; then
|
||||
/usr/sbin/avahi-autoipd -c $interface && /usr/sbin/avahi-autoipd -k $interface
|
||||
fi
|
||||
;;
|
||||
|
||||
leasefail|nak)
|
||||
if [ -x /usr/sbin/avahi-autoipd ]; then
|
||||
/usr/sbin/avahi-autoipd -c $interface || /usr/sbin/avahi-autoipd -wD $interface --no-chroot
|
||||
fi
|
||||
;;
|
||||
|
||||
renew|bound)
|
||||
if [ -x /usr/sbin/avahi-autoipd ]; then
|
||||
/usr/sbin/avahi-autoipd -c $interface && /usr/sbin/avahi-autoipd -k $interface
|
||||
fi
|
||||
/bin/ip addr add dev $interface $ip/$NETMASK $BROADCAST proto 5
|
||||
if [ -n "$ipv6" ] ; then
|
||||
wait_for_ipv6_default_route
|
||||
fi
|
||||
|
||||
# RFC3442: If the DHCP server returns both a Classless
|
||||
# Static Routes option and a Router option, the DHCP
|
||||
# client MUST ignore the Router option.
|
||||
if [ -n "$staticroutes" ]; then
|
||||
echo "deleting routers"
|
||||
route -n | while read dest gw mask flags metric ref use iface; do
|
||||
[ "$iface" != "$interface" -o "$gw" = "0.0.0.0" ] || \
|
||||
route del -net "$dest" netmask "$mask" gw "$gw" dev "$interface"
|
||||
done
|
||||
|
||||
# format: dest1/mask gw1 ... destn/mask gwn
|
||||
set -- $staticroutes
|
||||
while [ -n "$1" -a -n "$2" ]; do
|
||||
route add -net "$1" gw "$2" dev "$interface"
|
||||
shift 2
|
||||
done
|
||||
elif [ -n "$router" ] ; then
|
||||
echo "deleting routers"
|
||||
while route del default gw 0.0.0.0 dev $interface 2> /dev/null; do
|
||||
:
|
||||
done
|
||||
|
||||
for i in $router ; do
|
||||
route add default gw $i dev $interface
|
||||
done
|
||||
fi
|
||||
|
||||
# drop info from this interface
|
||||
# resolv.conf may be a symlink to /tmp/, so take care
|
||||
TMPFILE=$(mktemp)
|
||||
grep -vE "# $interface\$" $RESOLV_CONF > $TMPFILE
|
||||
cat $TMPFILE > $RESOLV_CONF
|
||||
rm -f $TMPFILE
|
||||
|
||||
# prefer rfc3397 domain search list (option 119) if available
|
||||
if [ -n "$search" ]; then
|
||||
search_list=$search
|
||||
elif [ -n "$domain" ]; then
|
||||
search_list=$domain
|
||||
fi
|
||||
|
||||
[ -n "$search_list" ] &&
|
||||
echo "search $search_list # $interface" >> $RESOLV_CONF
|
||||
|
||||
for i in $dns ; do
|
||||
echo adding dns $i
|
||||
echo "nameserver $i # $interface" >> $RESOLV_CONF
|
||||
done
|
||||
;;
|
||||
esac
|
||||
|
||||
HOOK_DIR="$0.d"
|
||||
for hook in "${HOOK_DIR}/"*; do
|
||||
[ -f "${hook}" -a -x "${hook}" ] || continue
|
||||
"${hook}" "$ACTION"
|
||||
done
|
||||
|
||||
exit 0
|
||||
@@ -0,0 +1,244 @@
|
||||
#!/usr/bin/env python3
|
||||
import json
|
||||
import sys
|
||||
import argparse
|
||||
|
||||
parser = argparse.ArgumentParser(description="JSON CLI Pretty Printer")
|
||||
parser.add_argument("module", help="IETF Module")
|
||||
parser.add_argument("-n", "--name", help="Focus on specific name")
|
||||
args = parser.parse_args()
|
||||
|
||||
class Pad:
|
||||
iface = 16
|
||||
proto = 11
|
||||
state = 12
|
||||
data = 41
|
||||
|
||||
class Decore():
|
||||
@staticmethod
|
||||
def decorate(sgr, txt, restore="0"):
|
||||
return f"\033[{sgr}m{txt}\033[{restore}m"
|
||||
|
||||
@staticmethod
|
||||
def invert(txt):
|
||||
return Decore.decorate("7", txt)
|
||||
|
||||
@staticmethod
|
||||
def red(txt):
|
||||
return Decore.decorate("31", txt, "39")
|
||||
|
||||
@staticmethod
|
||||
def green(txt):
|
||||
return Decore.decorate("32", txt, "39")
|
||||
|
||||
class Iface:
|
||||
def __init__(self, data):
|
||||
self.data = data
|
||||
self.name = data.get('name', '')
|
||||
self.index = data.get('if-index', '')
|
||||
self.oper_status = data.get('oper-status', '')
|
||||
self.phys_address = data.get('phys-address', '')
|
||||
|
||||
if data.get('statistics'):
|
||||
self.in_octets = data.get('statistics').get('in-octets', '')
|
||||
self.out_octets = data.get('statistics').get('out-octets', '')
|
||||
else:
|
||||
self.in_octets = ''
|
||||
self.out_octets = ''
|
||||
|
||||
self.parent = data.get('ietf-if-extensions:parent-interface', None)
|
||||
|
||||
if self.data.get('ietf-ip:ipv4'):
|
||||
self.mtu = self.data.get('ietf-ip:ipv4').get('mtu', '')
|
||||
self.ipv4_addr = self.data.get('ietf-ip:ipv4').get('address', '')
|
||||
else:
|
||||
self.mtu = ''
|
||||
self.ipv4_addr = []
|
||||
|
||||
if self.data.get('ietf-ip:ipv6'):
|
||||
self.ipv6_addr = self.data.get('ietf-ip:ipv6').get('address', '')
|
||||
else:
|
||||
self.ipv6_addr = []
|
||||
|
||||
if self.data.get('infix-interfaces:bridge-port'):
|
||||
self.bridge = self.data.get('infix-interfaces:bridge-port').get('bridge', None)
|
||||
else:
|
||||
self.bridge = ''
|
||||
|
||||
def is_vlan(self):
|
||||
return self.data['type'] == "infix-if-type:vlan"
|
||||
|
||||
def is_bridge(self):
|
||||
return self.data['type'] == "infix-if-type:bridge"
|
||||
|
||||
def pr_name(self, pipe=""):
|
||||
print(f"{pipe}{self.name:<{Pad.iface - len(pipe)}}", end="")
|
||||
|
||||
|
||||
def pr_proto_ipv4(self, pipe=''):
|
||||
for addr in self.ipv4_addr:
|
||||
origin = f"({addr['origin']})" if addr.get('origin') else ""
|
||||
|
||||
row = f"{pipe:<{Pad.iface}}"
|
||||
row += f"{'ipv4':<{Pad.proto}}"
|
||||
row += f"{'':<{Pad.state}}{addr['ip']}/{addr['prefix-length']} {origin}"
|
||||
print(row)
|
||||
|
||||
def pr_proto_ipv6(self, pipe=''):
|
||||
for addr in self.ipv6_addr:
|
||||
origin = f"({addr['origin']})" if addr.get('origin') else ""
|
||||
|
||||
row = f"{pipe:<{Pad.iface}}"
|
||||
row += f"{'ipv6':<{Pad.proto}}"
|
||||
row += f"{'':<{Pad.state}}{addr['ip']}/{addr['prefix-length']} {origin}"
|
||||
print(row)
|
||||
|
||||
def pr_proto_eth(self):
|
||||
row = f"{'ethernet':<{Pad.proto}}"
|
||||
dec = Decore.green if self.data['oper-status'] == "up" else Decore.red
|
||||
row += dec(f"{self.data['oper-status'].upper():<{Pad.state}}")
|
||||
row += f"{self.data['phys-address']:<{Pad.data}}"
|
||||
print(row)
|
||||
|
||||
def pr_bridge(self, _ifaces):
|
||||
self.pr_name(pipe="")
|
||||
self.pr_proto_eth()
|
||||
|
||||
|
||||
lowers = []
|
||||
for _iface in [Iface(data) for data in _ifaces]:
|
||||
if _iface.bridge and _iface.bridge == self.name:
|
||||
lowers.append(_iface)
|
||||
|
||||
if lowers:
|
||||
self.pr_proto_ipv4(pipe='│')
|
||||
self.pr_proto_ipv6(pipe='│')
|
||||
else:
|
||||
self.pr_proto_ipv4()
|
||||
self.pr_proto_ipv6()
|
||||
|
||||
for i, lower in enumerate(lowers):
|
||||
pipe = '└ ' if (i == len(lowers) -1) else '├ '
|
||||
lower.pr_name(pipe)
|
||||
lower.pr_proto_eth()
|
||||
|
||||
def pr_vlan(self, _ifaces):
|
||||
self.pr_name(pipe="")
|
||||
self.pr_proto_eth()
|
||||
|
||||
if self.parent:
|
||||
self.pr_proto_ipv4(pipe='│')
|
||||
self.pr_proto_ipv6(pipe='│')
|
||||
else:
|
||||
self.pr_proto_ipv4()
|
||||
self.pr_proto_ipv6()
|
||||
return
|
||||
|
||||
parent = find_iface(_ifaces, self.parent)
|
||||
if not parent:
|
||||
print(f"Error, didn't find parent interface for vlan {self.name}")
|
||||
sys.exit(1)
|
||||
parent.pr_name(pipe='└ ')
|
||||
parent.pr_proto_eth()
|
||||
|
||||
def pr_iface(self):
|
||||
print(f"{'name':<{20}}: {self.name}")
|
||||
print(f"{'index':<{20}}: {self.index}")
|
||||
if self.mtu:
|
||||
print(f"{'mtu':<{20}}: {self.mtu}")
|
||||
if self.oper_status:
|
||||
print(f"{'operational status':<{20}}: {self.oper_status}")
|
||||
if self.phys_address:
|
||||
print(f"{'physical address':<{20}}: {self.phys_address}")
|
||||
|
||||
if self.ipv4_addr:
|
||||
first = True
|
||||
for addr in self.ipv4_addr:
|
||||
origin = f"({addr['origin']})" if addr.get('origin') else ""
|
||||
key = 'ipv4 addresses' if first else ''
|
||||
colon = ':' if first else ' '
|
||||
row = f"{key:<{20}}{colon} "
|
||||
row += f"{addr['ip']}/{addr['prefix-length']} {origin}"
|
||||
print(row)
|
||||
first = False
|
||||
else:
|
||||
print(f"{'ipv4 addresses':<{20}}:")
|
||||
|
||||
if self.ipv6_addr:
|
||||
first = True
|
||||
for addr in self.ipv6_addr:
|
||||
origin = f"({addr['origin']})" if addr.get('origin') else ""
|
||||
key = 'ipv6 addresses' if first else ''
|
||||
colon = ':' if first else ' '
|
||||
row = f"{key:<{20}}{colon} "
|
||||
row += f"{addr['ip']}/{addr['prefix-length']} {origin}"
|
||||
print(row)
|
||||
first = False
|
||||
else:
|
||||
print(f"{'ipv6 addresses':<{20}}:")
|
||||
|
||||
if self.in_octets and self.out_octets:
|
||||
print(f"{'in-octets':<{20}}: {self.in_octets}")
|
||||
print(f"{'out-octets':<{20}}: {self.out_octets}")
|
||||
|
||||
|
||||
def find_iface(_ifaces, name):
|
||||
for _iface in [Iface(data) for data in _ifaces]:
|
||||
if _iface.name == name:
|
||||
return _iface
|
||||
|
||||
return False
|
||||
|
||||
|
||||
def pr_interface_list(json):
|
||||
hdr = (f"{'INTERFACE':<{Pad.iface}}"
|
||||
f"{'PROTOCOL':<{Pad.proto}}"
|
||||
f"{'STATE':<{Pad.state}}"
|
||||
f"{'DATA':<{Pad.data}}")
|
||||
|
||||
print(Decore.invert(hdr))
|
||||
|
||||
ifaces = sorted(json["ietf-interfaces:interfaces"]["interface"], key=lambda x: x['name'])
|
||||
|
||||
for iface in [Iface(data) for data in ifaces]:
|
||||
if iface.is_bridge():
|
||||
iface.pr_bridge(ifaces)
|
||||
continue
|
||||
|
||||
if iface.is_vlan():
|
||||
iface.pr_vlan(ifaces)
|
||||
continue
|
||||
|
||||
# These interfaces are printed by there parent, such as bridge
|
||||
if iface.parent:
|
||||
continue
|
||||
if iface.bridge:
|
||||
continue
|
||||
|
||||
iface.pr_name()
|
||||
iface.pr_proto_eth()
|
||||
iface.pr_proto_ipv4()
|
||||
iface.pr_proto_ipv6()
|
||||
|
||||
def ietf_interfaces(json, name):
|
||||
if not json or not json.get("ietf-interfaces:interfaces"):
|
||||
print(f"Error, top level \"ietf-interfaces:interfaces\" missing")
|
||||
sys.exit(1)
|
||||
|
||||
if not name:
|
||||
return pr_interface_list(json)
|
||||
|
||||
iface = find_iface(json["ietf-interfaces:interfaces"]["interface"], name)
|
||||
if not iface:
|
||||
print(f"Interface {name} not found")
|
||||
sys.exit(1)
|
||||
return iface.pr_iface()
|
||||
|
||||
|
||||
json = json.load(sys.stdin)
|
||||
|
||||
if args.module == "ietf-interfaces":
|
||||
sys.exit(ietf_interfaces(json, args.name))
|
||||
else:
|
||||
print(f"Error, unknown module {args.module}")
|
||||
sys.exit(1)
|
||||
@@ -1,127 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
CYAN='\033[0;36m' # Used in headers
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
GREY_BG="\e[48;5;235m"
|
||||
RESET="\e[0m"
|
||||
|
||||
HEADER_WIDHT=80
|
||||
declare -A IETF_TYPE_MAP
|
||||
|
||||
IETF_TYPE_MAP["iana-if-type:softwareLoopback"]="loopback"
|
||||
IETF_TYPE_MAP["iana-if-type:ethernetCsmacd"]="ethernet"
|
||||
IETF_TYPE_MAP["iana-if-type:l2vlan"]="vlan"
|
||||
IETF_TYPE_MAP["infix-if-type:veth"]="veth"
|
||||
IETF_TYPE_MAP["iana-if-type:bridge"]="bridge"
|
||||
|
||||
usage() {
|
||||
printf "Please provide a valid base field as the first argument\n"
|
||||
exit 1
|
||||
}
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
usage
|
||||
fi
|
||||
|
||||
json=$(cat)
|
||||
|
||||
show_ietf_interface() {
|
||||
name="$1"
|
||||
shift
|
||||
|
||||
iface=$(echo "$json" | jq --arg name "$name" \
|
||||
'.["ietf-interfaces:interfaces"].interface[] | select(.name == $name)')
|
||||
if [ -z "$iface" ]; then
|
||||
printf "Error, interface named \"$name\" not found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
printf "%-20s : %s\n" "name" "$name"
|
||||
printf "%-20s : %s\n" "interface-index" "$(echo "$iface" | jq -r '.["if-index"]')"
|
||||
printf "%-20s : %s\n" "operational-status" "$(echo "$iface" | jq -r '.["oper-status"]')"
|
||||
printf "%-20s : %s\n" "physical-address" "$(echo "$iface" | jq -r '.["phys-address"]')"
|
||||
|
||||
# MTU isn't set for loopback
|
||||
mtu="$(echo "$iface" | jq -r '.["ietf-ip:ipv4"] | select(.mtu != null) | .mtu')"
|
||||
if [ -n "$mtu" ]; then
|
||||
printf "%-20s : %s\n" "mtu" "$mtu"
|
||||
fi
|
||||
|
||||
printf "\n${CYAN}%-5s${NC}\n" "ipv4:"
|
||||
addresses=$(echo "$iface" | jq -c --arg field "$field" '.["ietf-ip:ipv4"].address[]' 2>/dev/null)
|
||||
for addr in $addresses; do
|
||||
ip="$(echo "$addr" | jq -r '."ip"')"
|
||||
prefix="$(echo "$addr" | jq -r '."prefix-length"')"
|
||||
printf "%-5s %s/%s\n" "" "$ip" "$prefix"
|
||||
done
|
||||
|
||||
printf "\n${CYAN}%-5s %5s\n${NC}" "in:" "octets"
|
||||
printf "%-5s %s\n" "" "$(echo "$iface" | jq -r '.statistics["in-octets"]')"
|
||||
|
||||
printf "\n${CYAN}%-5s %5s${NC}\n" "out:" "octets"
|
||||
printf "%-5s %s\n" "" "$(echo "$iface" | jq -r '.statistics["out-octets"]')"
|
||||
}
|
||||
|
||||
show_ietf_interfaces() {
|
||||
field="ietf-interfaces:interfaces"
|
||||
|
||||
if [ $# -ne 0 ]; then
|
||||
show_ietf_interface "$1"
|
||||
return
|
||||
fi
|
||||
|
||||
interfaces=$(echo "$json" | jq -c --arg field "$field" '.[$field].interface[]')
|
||||
|
||||
HEADER=$(printf "%-15s %-14s %-25s %s\n" "INTERFACE" "STATE" "PROTOCOL/ADDRESS" "SOURCE")
|
||||
HEADER_LEN=${#HEADER}
|
||||
RIGHT_PADDING=$(( HEADER_WIDHT - HEADER_LEN ))
|
||||
|
||||
printf "${GREY_BG}%s%${RIGHT_PADDING}s${RESET}\n" "$HEADER" ""
|
||||
|
||||
for iface in $interfaces; do
|
||||
name="$(echo "$iface" | jq -r '.["name"]')"
|
||||
state="$(echo "$iface" | jq -r '.["oper-status"]')"
|
||||
mac="$(echo "$iface" | jq -r '.["phys-address"]')"
|
||||
type="$(echo "$iface" | jq -r '.["type"]')"
|
||||
state_color=""
|
||||
|
||||
if [[ -v IETF_TYPE_MAP["$type"] ]]; then
|
||||
src="${IETF_TYPE_MAP["$type"]}"
|
||||
else
|
||||
src="unknown"
|
||||
fi
|
||||
|
||||
if [ "$state" = "up" ]; then
|
||||
state_color="$GREEN"
|
||||
elif [ "$state" = "down" ]; then
|
||||
state_color="$RED"
|
||||
fi
|
||||
printf "%-15s ${state_color}%-15s${NC}%s" "$name" "$state"
|
||||
|
||||
addresses=$(echo "$iface" | jq -c --arg field "$field" '.["ietf-ip:ipv4"].address[]' 2>/dev/null)
|
||||
printf "%-25s %s\n" "$mac" "$src"
|
||||
for addr in $addresses; do
|
||||
ip="$(echo "$addr" | jq -r '."ip"')"
|
||||
prefix="$(echo "$addr" | jq -r '."prefix-length"')"
|
||||
printf "%-30s %s/%s\n" "" "$ip" "$prefix"
|
||||
done
|
||||
if [ -n "$addresses" ]; then
|
||||
printf "\n"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
field="$1"
|
||||
shift
|
||||
|
||||
case "$field" in
|
||||
"ietf-interfaces")
|
||||
show_ietf_interfaces $*
|
||||
;;
|
||||
*)
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
@@ -1,5 +1,5 @@
|
||||
test-dir := $(BR2_EXTERNAL_INFIX_PATH)/test
|
||||
INFIX_TESTS ?= $(test-dir)/case/all.yaml
|
||||
INFIX_TESTS ?= $(test-dir)/case/all-unit.yaml $(test-dir)/case/all.yaml
|
||||
|
||||
test-env = $(test-dir)/env \
|
||||
-f $(BINARIES_DIR)/infix-x86_64.img \
|
||||
|
||||
@@ -118,6 +118,8 @@ BR2_PACKAGE_FINIT_PLUGIN_URANDOM=y
|
||||
BR2_PACKAGE_KLISH_PLUGIN_INFIX=y
|
||||
BR2_PACKAGE_LOWDOWN=y
|
||||
BR2_PACKAGE_NET=y
|
||||
BR2_PACKAGE_PYTHON3=y
|
||||
BR2_PACKAGE_PYTHON3_PYC_ONLY=y
|
||||
BR2_PACKAGE_TETRIS=y
|
||||
BR2_PACKAGE_QUERIERD=y
|
||||
GNS3_APPLIANCE_RAM=512
|
||||
|
||||
@@ -122,6 +122,8 @@ BR2_PACKAGE_FINIT_PLUGIN_URANDOM=y
|
||||
BR2_PACKAGE_KLISH_PLUGIN_INFIX=y
|
||||
BR2_PACKAGE_LOWDOWN=y
|
||||
BR2_PACKAGE_NET=y
|
||||
BR2_PACKAGE_PYTHON3=y
|
||||
BR2_PACKAGE_PYTHON3_PYC_ONLY=y
|
||||
BR2_PACKAGE_TETRIS=y
|
||||
BR2_PACKAGE_QUERIERD=y
|
||||
GNS3_APPLIANCE_RAM=512
|
||||
|
||||
@@ -4,6 +4,83 @@ Change Log
|
||||
All notable changes to the project are documented in this file.
|
||||
|
||||
|
||||
[v23.09.0][] - 2023-10-02
|
||||
-------------------------
|
||||
|
||||
> **Note:** upcoming releases will lock the `root` user for system-only
|
||||
> services. Instead an `admin` user will be the only default user with
|
||||
> the CLI as its login shell. This user is already available, so please
|
||||
> consider updating any guidelines or documentation you may have.
|
||||
|
||||
### YANG Status
|
||||
|
||||
- [ietf-system][]:
|
||||
- [infix-system][]: MotD (Message of the Day) augment
|
||||
- [infix-system][]: user login shell augment, default: `/bin/false`
|
||||
- [infix-system-software][]: system-state/software augment for
|
||||
remotely querying firmware version information
|
||||
- [infix-system-software][]: firmware upgrade with `install-bundle` RPC
|
||||
- [infix-system][]: timezone-name deviation, replaced with IANA timezones
|
||||
- [infix-system][]: username deviation, clarifying Linux restrictions
|
||||
- [infix-system][]: deviations for unsupported features, e.g. RADIUS
|
||||
- [ietf-interfaces][]:
|
||||
- [infix-interfaces][]: deviation for `if:phys-address` to allow read-write
|
||||
- [ietf-ip][]: augmented with IPv4LL similar to standardized IPv6LL
|
||||
- [infix-ip][]: deviations (`not-supported`) added for IPv4 and IPv6:
|
||||
- `/if:interfaces/if:interface/ip:ipv4/ip:address/ip:subnet/ip:netmask`
|
||||
- `/if:interfaces/if:interface/ip:ipv6/ip:address/ip:status`
|
||||
- `/if:interfaces/if:interface/ip:ipv4/ip:mtu`
|
||||
- `/if:interfaces/if:interface/ip:ipv6/ip:mtu`
|
||||
- `/if:interfaces/if:interface/ip:ipv4/ip:neighbor`
|
||||
- `/if:interfaces/if:interface/ip:ipv6/ip:neighbor`
|
||||
- [ietf-if-vlan-encapsulation][]: Linux VLAN interfaces, e.g. `eth0.10`
|
||||
- [infix-if-bridge][]: Linux bridge interfaces with native VLAN support
|
||||
- [infix-if-veth][]: Linux VETH pairs
|
||||
- [infix-if-type][]: deviation for interface types, limiting number
|
||||
to supported types only. New identities are derived from default
|
||||
IANA interface types, ensuring compatibility with other standard
|
||||
models, e.g., `ieee802-ethernet-interface.yang`
|
||||
- Configurable services:
|
||||
- [ieee802-dot1ab-lldp][]: stripped down to an `enabled` setting
|
||||
- [infix-services][]: support for enabling mDNS and SSDP discovery
|
||||
|
||||
[br2023.02.2]: https://git.busybox.net/buildroot/tag/?h=2023.02.2
|
||||
[ieee802-dot1ab-lldp]: https://github.com/kernelkit/infix/tree/50a550b/src/confd/yang/ieee802-dot1ab-lldp%402022-03-15.yang
|
||||
[ietf-system]: https://www.rfc-editor.org/rfc/rfc7317.html
|
||||
[ietf-interfaces]: https://www.rfc-editor.org/rfc/rfc7223.html
|
||||
[ietf-ip]: https://www.rfc-editor.org/rfc/rfc8344.html
|
||||
[ietf-if-vlan-encapsulation]: https://www.ietf.org/id/draft-ietf-netmod-sub-intf-vlan-model-08.html
|
||||
[infix-if-bridge]: https://github.com/kernelkit/infix/tree/784c175/src/confd/yang/infix-if-bridge%402023-08-21.yang
|
||||
[infix-if-type]: https://github.com/kernelkit/infix/tree/784c175/src/confd/yang/infix-if-type%402023-08-21.yang
|
||||
[infix-if-veth]: https://github.com/kernelkit/infix/tree/784c175/src/confd/yang/infix-if-veth%402023-06-05.yang
|
||||
[infix-interfaces]: https://github.com/kernelkit/infix/tree/784c175/src/confd/yang/infix-interfaces%402023-09-19.yang
|
||||
[infix-ip]: https://github.com/kernelkit/infix/tree/784c175/src/confd/yang/infix-ip%402023-09-14.yang
|
||||
[infix-services]: https://github.com/kernelkit/infix/tree/784c175/src/confd/yang/infix-services%402023-08-22.yang
|
||||
[infix-system]: https://github.com/kernelkit/infix/tree/784c175/src/confd/yang/infix-system%402023-08-15.yang
|
||||
[infix-system-software]: https://github.com/kernelkit/infix/tree/784c175/src/confd/yang/infix-system-software%402023-06-27.yang
|
||||
|
||||
### Changes
|
||||
|
||||
- The following new NETCONF interface operational status have been added:
|
||||
- admin-status
|
||||
- IP address origin (dhcp, static, link-layer, random, other)
|
||||
- bridge
|
||||
- parent-interface
|
||||
- basic statistics (`in_octets`, `out_octets`)
|
||||
- Support for custom interface `phys-address` (MAC address)
|
||||
- The CLI admin-exec command `show interfaces` now fully uses NETCONF
|
||||
operational data to display both available interfaces and all of their
|
||||
IP addresses. Displaying an individual interface will show more info.
|
||||
- The CLI admin-exec command `password encrypt` now default to SHA512
|
||||
|
||||
### Fixes
|
||||
|
||||
- Fix #136: IPv6 autoconf `create-global-addresses true` does not bite
|
||||
- Fix #138: Not possible to have static IP and DHCP at the same time
|
||||
- Minor fixes and updates to documentation (faulty links, references)
|
||||
- The `sync-fork.yml` workflow has finally been fixed.
|
||||
|
||||
|
||||
[v23.08.0][] - 2023-08-31
|
||||
-------------------------
|
||||
|
||||
@@ -140,6 +217,7 @@ Supported YANG models in addition to those used by sysrepo and netopeer:
|
||||
|
||||
[buildroot]: https://buildroot.org/
|
||||
[UNRELEASED]: https://github.com/kernelkit/infix/compare/v23.08.0...HEAD
|
||||
[v23.09.0]: https://github.com/kernelkit/infix/compare/v23.08.0...v23.09.0
|
||||
[v23.08.0]: https://github.com/kernelkit/infix/compare/v23.06.0...v23.08.0
|
||||
[v23.06.0]: https://github.com/kernelkit/infix/compare/BASE...v23.06.0
|
||||
[sysrepo]: https://www.sysrepo.org/
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
variant.md
|
||||
@@ -88,7 +88,7 @@ admin@infix-12-34-56:/config/interfaces/interface/eth0/> leave
|
||||
admin@infix-12-34-56:/> show interfaces brief
|
||||
lo UNKNOWN 00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
|
||||
eth0 UP 52:54:00:12:34:56 <BROADCAST,MULTICAST,UP,LOWER_UP>
|
||||
admin@infix-12-34-56:exec> show ip brief
|
||||
admin@infix-12-34-56:/> show ip brief
|
||||
lo UNKNOWN 127.0.0.1/8 ::1/128
|
||||
eth0 UP 192.168.2.200/24 fe80::5054:ff:fe12:3456/64
|
||||
admin@infix-12-34-56:/> copy running-config startup-config
|
||||
|
||||
@@ -51,7 +51,7 @@ Enter the configure context from admin-exec by typing `configure`
|
||||
followed by Enter. Available commands, press `?` at the prompt:
|
||||
|
||||
```
|
||||
admin@host:/>
|
||||
admin@host:/> configure
|
||||
admin@host:/config/>
|
||||
abort Abandon candidate
|
||||
check Validate candidate
|
||||
|
||||
@@ -4,8 +4,9 @@ Developer's Guide
|
||||
Cloning
|
||||
-------
|
||||
|
||||
Please see the [Contributing](#contributing) section, below, for details
|
||||
on how to fork and clone when contributing to Infix.
|
||||
When [pre-built releases][0] are not enough, for instance when you want
|
||||
to add or modify some Open Source components, you can clone the Infix
|
||||
tree to your PC:
|
||||
|
||||
```bash
|
||||
$ mkdir ~/Projects; cd ~/Projects
|
||||
@@ -14,6 +15,10 @@ $ cd infix/
|
||||
$ git submodule update --init
|
||||
```
|
||||
|
||||
> Please see the [Contributing](#contributing) section, below, for
|
||||
> details on how to fork and clone when contributing to Infix.
|
||||
|
||||
|
||||
### Customer Builds
|
||||
|
||||
Customer builds add product specific device trees, more OSS packages,
|
||||
@@ -39,12 +44,21 @@ Building
|
||||
--------
|
||||
|
||||
Buildroot is almost stand-alone, it needs a few locally installed tools
|
||||
to bootstrap itself. For details, see the [excellent manual][manual].
|
||||
to bootstrap itself. The most common ones are usually part of the base
|
||||
install of the OS, but specific ones for building need the following.
|
||||
The instructions here are for Debian/Ubuntu based systems (YMMV):
|
||||
|
||||
> **Note:** installation for Debian/Ubuntu based systems: <kbd>sudo apt
|
||||
> install make libssl-dev</kbd>
|
||||
```bash
|
||||
$ sudo apt install bc binutils build-essential bzip2 cpio \
|
||||
diffutils file findutils git gzip \
|
||||
libncurses-dev libssl-dev perl patch \
|
||||
python rsync sed tar unzip wget
|
||||
```
|
||||
|
||||
Briefly, to build an Infix image; select the target and then make:
|
||||
> For details, see the Getting Started and System Requirements sections
|
||||
> of the [excellent manual][1].
|
||||
|
||||
To build an Infix image; select the target and then make:
|
||||
|
||||
make x86_64_defconfig
|
||||
make
|
||||
@@ -58,6 +72,32 @@ To see available defconfigs for supported targets, use:
|
||||
make list-defconfigs
|
||||
|
||||
|
||||
Development
|
||||
-----------
|
||||
|
||||
When changing a package, locally kept sources, or when using `local.mk`,
|
||||
you only want to rebuild the parts you have modified:
|
||||
|
||||
make foo-rebuild
|
||||
|
||||
or
|
||||
|
||||
make foo-reconfigure
|
||||
|
||||
or, when nothing seems to bite:
|
||||
|
||||
make foo-dirclean foo-rebuild
|
||||
|
||||
As shown here, you can combine multiple build targets and steps in one
|
||||
go, like this:
|
||||
|
||||
make foo-rebuild bar-rebuild all run
|
||||
|
||||
This rebuilds (and installs) `foo` and `bar`, the `all` target calls
|
||||
on Buildroot to finalize the target filesystem and generate the images.
|
||||
The final `run` argument is explained below.
|
||||
|
||||
|
||||
Testing
|
||||
-------
|
||||
|
||||
@@ -105,5 +145,6 @@ $ git submodule update --init
|
||||
is highly recommended as a baseline and reference. For integration
|
||||
of local changes another company-specific branch can be used instead.
|
||||
|
||||
[0]: https://github.com/kernelkit/infix/releases
|
||||
[1]: https://buildroot.org/downloads/manual/manual.html
|
||||
[2]: https://github.com/wkz/qeneth
|
||||
|
||||
|
After Width: | Height: | Size: 135 KiB |
@@ -0,0 +1,566 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="249.12pt"
|
||||
height="73.919998pt"
|
||||
viewBox="0 0 249.12 73.919998"
|
||||
version="1.1"
|
||||
id="svg230"
|
||||
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="defs94">
|
||||
<g
|
||||
id="g89">
|
||||
<g
|
||||
id="glyph-0-0">
|
||||
<path
|
||||
d="M 1.125 0 L 1.125 -5.625 L 5.625 -5.625 L 5.625 0 Z M 1.265625 -0.140625 L 5.484375 -0.140625 L 5.484375 -5.484375 L 1.265625 -5.484375 Z M 1.265625 -0.140625 "
|
||||
id="path2" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-1">
|
||||
<path
|
||||
d="M 3.34375 -1.484375 L 4.578125 -1.28125 C 4.421875 -0.832031 4.171875 -0.488281 3.828125 -0.25 C 3.484375 -0.0078125 3.054688 0.109375 2.546875 0.109375 C 1.734375 0.109375 1.132813 -0.15625 0.75 -0.6875 C 0.4375 -1.113281 0.28125 -1.648438 0.28125 -2.296875 C 0.28125 -3.066406 0.484375 -3.671875 0.890625 -4.109375 C 1.296875 -4.546875 1.804688 -4.765625 2.421875 -4.765625 C 3.117188 -4.765625 3.664063 -4.535156 4.0625 -4.078125 C 4.46875 -3.617188 4.660156 -2.921875 4.640625 -1.984375 L 1.546875 -1.984375 C 1.554688 -1.609375 1.65625 -1.316406 1.84375 -1.109375 C 2.039063 -0.910156 2.28125 -0.8125 2.5625 -0.8125 C 2.757813 -0.8125 2.921875 -0.863281 3.046875 -0.96875 C 3.179688 -1.082031 3.28125 -1.253906 3.34375 -1.484375 Z M 3.421875 -2.734375 C 3.410156 -3.085938 3.316406 -3.359375 3.140625 -3.546875 C 2.960938 -3.734375 2.75 -3.828125 2.5 -3.828125 C 2.226563 -3.828125 2.003906 -3.726563 1.828125 -3.53125 C 1.648438 -3.332031 1.566406 -3.066406 1.578125 -2.734375 Z M 3.421875 -2.734375 "
|
||||
id="path5" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-2">
|
||||
<path
|
||||
d="M 0.046875 0 L 1.734375 -2.40625 L 0.125 -4.671875 L 1.625 -4.671875 L 2.453125 -3.390625 L 3.328125 -4.671875 L 4.78125 -4.671875 L 3.1875 -2.453125 L 4.921875 0 L 3.40625 0 L 2.453125 -1.453125 L 1.5 0 Z M 0.046875 0 "
|
||||
id="path8" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-3">
|
||||
<path
|
||||
d="M 1.5625 -3.25 L 0.453125 -3.453125 C 0.578125 -3.898438 0.789063 -4.226563 1.09375 -4.4375 C 1.40625 -4.65625 1.863281 -4.765625 2.46875 -4.765625 C 3.019531 -4.765625 3.429688 -4.695313 3.703125 -4.5625 C 3.972656 -4.4375 4.160156 -4.273438 4.265625 -4.078125 C 4.378906 -3.878906 4.4375 -3.507813 4.4375 -2.96875 L 4.421875 -1.53125 C 4.421875 -1.125 4.441406 -0.820313 4.484375 -0.625 C 4.523438 -0.425781 4.597656 -0.21875 4.703125 0 L 3.484375 0 C 3.453125 -0.0820313 3.410156 -0.203125 3.359375 -0.359375 C 3.335938 -0.429688 3.320313 -0.484375 3.3125 -0.515625 C 3.101563 -0.304688 2.878906 -0.148438 2.640625 -0.046875 C 2.398438 0.0546875 2.144531 0.109375 1.875 0.109375 C 1.394531 0.109375 1.015625 -0.0195313 0.734375 -0.28125 C 0.460938 -0.539063 0.328125 -0.875 0.328125 -1.28125 C 0.328125 -1.539063 0.390625 -1.773438 0.515625 -1.984375 C 0.640625 -2.191406 0.8125 -2.347656 1.03125 -2.453125 C 1.257813 -2.566406 1.585938 -2.664063 2.015625 -2.75 C 2.597656 -2.851563 3 -2.953125 3.21875 -3.046875 L 3.21875 -3.171875 C 3.21875 -3.410156 3.160156 -3.578125 3.046875 -3.671875 C 2.929688 -3.773438 2.707031 -3.828125 2.375 -3.828125 C 2.15625 -3.828125 1.984375 -3.78125 1.859375 -3.6875 C 1.742188 -3.601563 1.644531 -3.457031 1.5625 -3.25 Z M 3.21875 -2.234375 C 3.0625 -2.179688 2.8125 -2.117188 2.46875 -2.046875 C 2.125 -1.972656 1.898438 -1.90625 1.796875 -1.84375 C 1.640625 -1.726563 1.5625 -1.582031 1.5625 -1.40625 C 1.5625 -1.226563 1.625 -1.078125 1.75 -0.953125 C 1.875 -0.828125 2.035156 -0.765625 2.234375 -0.765625 C 2.460938 -0.765625 2.675781 -0.835938 2.875 -0.984375 C 3.03125 -1.097656 3.128906 -1.234375 3.171875 -1.390625 C 3.203125 -1.492188 3.21875 -1.695313 3.21875 -2 Z M 3.21875 -2.234375 "
|
||||
id="path11" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-4">
|
||||
<path
|
||||
d="M 0.546875 -4.671875 L 1.6875 -4.671875 L 1.6875 -4.03125 C 2.09375 -4.519531 2.578125 -4.765625 3.140625 -4.765625 C 3.441406 -4.765625 3.703125 -4.703125 3.921875 -4.578125 C 4.140625 -4.460938 4.320313 -4.28125 4.46875 -4.03125 C 4.664063 -4.28125 4.882813 -4.460938 5.125 -4.578125 C 5.363281 -4.703125 5.617188 -4.765625 5.890625 -4.765625 C 6.234375 -4.765625 6.519531 -4.695313 6.75 -4.5625 C 6.988281 -4.425781 7.171875 -4.222656 7.296875 -3.953125 C 7.378906 -3.753906 7.421875 -3.429688 7.421875 -2.984375 L 7.421875 0 L 6.1875 0 L 6.1875 -2.671875 C 6.1875 -3.128906 6.144531 -3.425781 6.0625 -3.5625 C 5.945313 -3.738281 5.769531 -3.828125 5.53125 -3.828125 C 5.351563 -3.828125 5.1875 -3.773438 5.03125 -3.671875 C 4.882813 -3.566406 4.773438 -3.410156 4.703125 -3.203125 C 4.640625 -3.003906 4.609375 -2.679688 4.609375 -2.234375 L 4.609375 0 L 3.375 0 L 3.375 -2.5625 C 3.375 -3.007813 3.351563 -3.300781 3.3125 -3.4375 C 3.269531 -3.570313 3.203125 -3.671875 3.109375 -3.734375 C 3.015625 -3.796875 2.890625 -3.828125 2.734375 -3.828125 C 2.535156 -3.828125 2.359375 -3.773438 2.203125 -3.671875 C 2.054688 -3.566406 1.945313 -3.414063 1.875 -3.21875 C 1.8125 -3.03125 1.78125 -2.710938 1.78125 -2.265625 L 1.78125 0 L 0.546875 0 Z M 0.546875 -4.671875 "
|
||||
id="path14" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-5">
|
||||
<path
|
||||
d="M 0.609375 -4.671875 L 1.765625 -4.671875 L 1.765625 -3.984375 C 1.910156 -4.210938 2.109375 -4.398438 2.359375 -4.546875 C 2.617188 -4.691406 2.90625 -4.765625 3.21875 -4.765625 C 3.757813 -4.765625 4.21875 -4.550781 4.59375 -4.125 C 4.96875 -3.707031 5.15625 -3.117188 5.15625 -2.359375 C 5.15625 -1.578125 4.960938 -0.96875 4.578125 -0.53125 C 4.203125 -0.101563 3.742188 0.109375 3.203125 0.109375 C 2.953125 0.109375 2.71875 0.0546875 2.5 -0.046875 C 2.289063 -0.148438 2.070313 -0.328125 1.84375 -0.578125 L 1.84375 1.78125 L 0.609375 1.78125 Z M 1.828125 -2.40625 C 1.828125 -1.882813 1.929688 -1.5 2.140625 -1.25 C 2.347656 -1 2.601563 -0.875 2.90625 -0.875 C 3.1875 -0.875 3.421875 -0.988281 3.609375 -1.21875 C 3.804688 -1.445313 3.90625 -1.820313 3.90625 -2.34375 C 3.90625 -2.832031 3.804688 -3.195313 3.609375 -3.4375 C 3.410156 -3.675781 3.171875 -3.796875 2.890625 -3.796875 C 2.585938 -3.796875 2.332031 -3.675781 2.125 -3.4375 C 1.925781 -3.207031 1.828125 -2.863281 1.828125 -2.40625 Z M 1.828125 -2.40625 "
|
||||
id="path17" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-6">
|
||||
<path
|
||||
d="M 0.640625 0 L 0.640625 -6.4375 L 1.875 -6.4375 L 1.875 0 Z M 0.640625 0 "
|
||||
id="path20" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-7">
|
||||
<path
|
||||
d="M 0.65625 -6.4375 L 3.03125 -6.4375 C 3.5625 -6.4375 3.96875 -6.394531 4.25 -6.3125 C 4.632813 -6.207031 4.957031 -6.007813 5.21875 -5.71875 C 5.488281 -5.4375 5.691406 -5.085938 5.828125 -4.671875 C 5.972656 -4.265625 6.046875 -3.757813 6.046875 -3.15625 C 6.046875 -2.625 5.984375 -2.164063 5.859375 -1.78125 C 5.691406 -1.3125 5.457031 -0.9375 5.15625 -0.65625 C 4.9375 -0.4375 4.632813 -0.265625 4.25 -0.140625 C 3.957031 -0.046875 3.570313 0 3.09375 0 L 0.65625 0 Z M 1.953125 -5.359375 L 1.953125 -1.078125 L 2.921875 -1.078125 C 3.285156 -1.078125 3.546875 -1.097656 3.703125 -1.140625 C 3.921875 -1.191406 4.097656 -1.28125 4.234375 -1.40625 C 4.367188 -1.539063 4.476563 -1.75 4.5625 -2.03125 C 4.65625 -2.320313 4.703125 -2.71875 4.703125 -3.21875 C 4.703125 -3.71875 4.65625 -4.097656 4.5625 -4.359375 C 4.476563 -4.628906 4.359375 -4.835938 4.203125 -4.984375 C 4.046875 -5.140625 3.847656 -5.242188 3.609375 -5.296875 C 3.421875 -5.335938 3.0625 -5.359375 2.53125 -5.359375 Z M 1.953125 -5.359375 "
|
||||
id="path23" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-8">
|
||||
<path
|
||||
d="M 0.65625 0 L 0.65625 -6.4375 L 1.953125 -6.4375 L 1.953125 -3.90625 L 4.515625 -3.90625 L 4.515625 -6.4375 L 5.8125 -6.4375 L 5.8125 0 L 4.515625 0 L 4.515625 -2.8125 L 1.953125 -2.8125 L 1.953125 0 Z M 0.65625 0 "
|
||||
id="path26" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-9">
|
||||
<path
|
||||
d="M 4.78125 -2.375 L 6.03125 -1.96875 C 5.84375 -1.269531 5.523438 -0.75 5.078125 -0.40625 C 4.628906 -0.0625 4.054688 0.109375 3.359375 0.109375 C 2.503906 0.109375 1.800781 -0.179688 1.25 -0.765625 C 0.695313 -1.347656 0.421875 -2.148438 0.421875 -3.171875 C 0.421875 -4.234375 0.695313 -5.0625 1.25 -5.65625 C 1.8125 -6.25 2.539063 -6.546875 3.4375 -6.546875 C 4.226563 -6.546875 4.867188 -6.316406 5.359375 -5.859375 C 5.648438 -5.578125 5.867188 -5.179688 6.015625 -4.671875 L 4.734375 -4.359375 C 4.660156 -4.691406 4.5 -4.953125 4.25 -5.140625 C 4.007813 -5.335938 3.71875 -5.4375 3.375 -5.4375 C 2.894531 -5.4375 2.503906 -5.265625 2.203125 -4.921875 C 1.910156 -4.578125 1.765625 -4.023438 1.765625 -3.265625 C 1.765625 -2.453125 1.910156 -1.867188 2.203125 -1.515625 C 2.492188 -1.171875 2.875 -1 3.34375 -1 C 3.695313 -1 3.992188 -1.109375 4.234375 -1.328125 C 4.484375 -1.546875 4.664063 -1.894531 4.78125 -2.375 Z M 4.78125 -2.375 "
|
||||
id="path29" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-10">
|
||||
<path
|
||||
d="M 0.65625 0 L 0.65625 -6.4375 L 2.75 -6.4375 C 3.53125 -6.4375 4.046875 -6.40625 4.296875 -6.34375 C 4.660156 -6.25 4.96875 -6.039063 5.21875 -5.71875 C 5.46875 -5.394531 5.59375 -4.972656 5.59375 -4.453125 C 5.59375 -4.066406 5.519531 -3.738281 5.375 -3.46875 C 5.226563 -3.195313 5.046875 -2.984375 4.828125 -2.828125 C 4.609375 -2.671875 4.382813 -2.566406 4.15625 -2.515625 C 3.84375 -2.460938 3.390625 -2.4375 2.796875 -2.4375 L 1.953125 -2.4375 L 1.953125 0 Z M 1.953125 -5.359375 L 1.953125 -3.53125 L 2.671875 -3.53125 C 3.179688 -3.53125 3.519531 -3.5625 3.6875 -3.625 C 3.863281 -3.695313 4 -3.800781 4.09375 -3.9375 C 4.195313 -4.082031 4.25 -4.25 4.25 -4.4375 C 4.25 -4.675781 4.179688 -4.867188 4.046875 -5.015625 C 3.910156 -5.171875 3.734375 -5.269531 3.515625 -5.3125 C 3.359375 -5.34375 3.046875 -5.359375 2.578125 -5.359375 Z M 1.953125 -5.359375 "
|
||||
id="path32" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-11">
|
||||
<path
|
||||
d="M 0.328125 -2.09375 L 1.59375 -2.21875 C 1.664063 -1.789063 1.816406 -1.476563 2.046875 -1.28125 C 2.285156 -1.082031 2.601563 -0.984375 3 -0.984375 C 3.414063 -0.984375 3.726563 -1.070313 3.9375 -1.25 C 4.15625 -1.425781 4.265625 -1.632813 4.265625 -1.875 C 4.265625 -2.019531 4.21875 -2.144531 4.125 -2.25 C 4.039063 -2.363281 3.882813 -2.460938 3.65625 -2.546875 C 3.507813 -2.597656 3.164063 -2.691406 2.625 -2.828125 C 1.925781 -2.992188 1.4375 -3.203125 1.15625 -3.453125 C 0.757813 -3.804688 0.5625 -4.238281 0.5625 -4.75 C 0.5625 -5.082031 0.648438 -5.390625 0.828125 -5.671875 C 1.015625 -5.960938 1.285156 -6.179688 1.640625 -6.328125 C 1.992188 -6.472656 2.414063 -6.546875 2.90625 -6.546875 C 3.71875 -6.546875 4.328125 -6.367188 4.734375 -6.015625 C 5.140625 -5.660156 5.351563 -5.1875 5.375 -4.59375 L 4.078125 -4.546875 C 4.023438 -4.878906 3.90625 -5.113281 3.71875 -5.25 C 3.539063 -5.394531 3.265625 -5.46875 2.890625 -5.46875 C 2.515625 -5.46875 2.222656 -5.394531 2.015625 -5.25 C 1.867188 -5.144531 1.796875 -5.007813 1.796875 -4.84375 C 1.796875 -4.6875 1.863281 -4.554688 2 -4.453125 C 2.15625 -4.316406 2.550781 -4.171875 3.1875 -4.015625 C 3.820313 -3.867188 4.289063 -3.710938 4.59375 -3.546875 C 4.894531 -3.390625 5.128906 -3.171875 5.296875 -2.890625 C 5.472656 -2.617188 5.5625 -2.28125 5.5625 -1.875 C 5.5625 -1.507813 5.457031 -1.164063 5.25 -0.84375 C 5.050781 -0.519531 4.765625 -0.28125 4.390625 -0.125 C 4.015625 0.03125 3.546875 0.109375 2.984375 0.109375 C 2.171875 0.109375 1.546875 -0.078125 1.109375 -0.453125 C 0.671875 -0.828125 0.410156 -1.375 0.328125 -2.09375 Z M 0.328125 -2.09375 "
|
||||
id="path35" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-12">
|
||||
<path
|
||||
d="M 1.828125 0 L 0.59375 0 L 0.59375 -4.671875 L 1.734375 -4.671875 L 1.734375 -4 C 1.929688 -4.3125 2.109375 -4.515625 2.265625 -4.609375 C 2.421875 -4.710938 2.597656 -4.765625 2.796875 -4.765625 C 3.078125 -4.765625 3.347656 -4.691406 3.609375 -4.546875 L 3.234375 -3.46875 C 3.023438 -3.601563 2.832031 -3.671875 2.65625 -3.671875 C 2.476563 -3.671875 2.328125 -3.617188 2.203125 -3.515625 C 2.085938 -3.421875 1.992188 -3.25 1.921875 -3 C 1.859375 -2.75 1.828125 -2.226563 1.828125 -1.4375 Z M 1.828125 0 "
|
||||
id="path38" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-13">
|
||||
<path
|
||||
d="M 1.921875 0 L 0.046875 -4.671875 L 1.34375 -4.671875 L 2.21875 -2.28125 L 2.484375 -1.484375 C 2.546875 -1.691406 2.585938 -1.828125 2.609375 -1.890625 C 2.648438 -2.023438 2.691406 -2.15625 2.734375 -2.28125 L 3.625 -4.671875 L 4.890625 -4.671875 L 3.046875 0 Z M 1.921875 0 "
|
||||
id="path41" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-0">
|
||||
<path
|
||||
d="M 1.125 0 L 1.125 -5.625 L 5.625 -5.625 L 5.625 0 Z M 1.265625 -0.140625 L 5.484375 -0.140625 L 5.484375 -5.484375 L 1.265625 -5.484375 Z M 1.265625 -0.140625 "
|
||||
id="path44" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-1">
|
||||
<path
|
||||
d="M 3.78125 -1.5 L 4.609375 -1.40625 C 4.472656 -0.925781 4.226563 -0.550781 3.875 -0.28125 C 3.53125 -0.0195313 3.085938 0.109375 2.546875 0.109375 C 1.867188 0.109375 1.328125 -0.0976563 0.921875 -0.515625 C 0.523438 -0.941406 0.328125 -1.535156 0.328125 -2.296875 C 0.328125 -3.078125 0.53125 -3.679688 0.9375 -4.109375 C 1.34375 -4.546875 1.867188 -4.765625 2.515625 -4.765625 C 3.140625 -4.765625 3.644531 -4.550781 4.03125 -4.125 C 4.425781 -3.707031 4.625 -3.113281 4.625 -2.34375 C 4.625 -2.289063 4.625 -2.21875 4.625 -2.125 L 1.140625 -2.125 C 1.171875 -1.613281 1.316406 -1.222656 1.578125 -0.953125 C 1.835938 -0.679688 2.164063 -0.546875 2.5625 -0.546875 C 2.851563 -0.546875 3.097656 -0.617188 3.296875 -0.765625 C 3.503906 -0.921875 3.664063 -1.164063 3.78125 -1.5 Z M 1.1875 -2.78125 L 3.796875 -2.78125 C 3.765625 -3.175781 3.664063 -3.472656 3.5 -3.671875 C 3.25 -3.972656 2.921875 -4.125 2.515625 -4.125 C 2.148438 -4.125 1.84375 -4 1.59375 -3.75 C 1.351563 -3.507813 1.21875 -3.1875 1.1875 -2.78125 Z M 1.1875 -2.78125 "
|
||||
id="path47" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-2">
|
||||
<path
|
||||
d="M 2.328125 -0.703125 L 2.4375 -0.015625 C 2.207031 0.0351563 2.007813 0.0625 1.84375 0.0625 C 1.550781 0.0625 1.328125 0.015625 1.171875 -0.078125 C 1.015625 -0.171875 0.898438 -0.289063 0.828125 -0.4375 C 0.765625 -0.582031 0.734375 -0.890625 0.734375 -1.359375 L 0.734375 -4.046875 L 0.15625 -4.046875 L 0.15625 -4.671875 L 0.734375 -4.671875 L 0.734375 -5.828125 L 1.53125 -6.296875 L 1.53125 -4.671875 L 2.328125 -4.671875 L 2.328125 -4.046875 L 1.53125 -4.046875 L 1.53125 -1.328125 C 1.53125 -1.097656 1.539063 -0.953125 1.5625 -0.890625 C 1.59375 -0.828125 1.640625 -0.773438 1.703125 -0.734375 C 1.765625 -0.691406 1.851563 -0.671875 1.96875 -0.671875 C 2.0625 -0.671875 2.179688 -0.679688 2.328125 -0.703125 Z M 2.328125 -0.703125 "
|
||||
id="path50" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-3">
|
||||
<path
|
||||
d="M 0.59375 0 L 0.59375 -6.4375 L 1.390625 -6.4375 L 1.390625 -4.125 C 1.753906 -4.550781 2.21875 -4.765625 2.78125 -4.765625 C 3.125 -4.765625 3.421875 -4.695313 3.671875 -4.5625 C 3.929688 -4.425781 4.113281 -4.238281 4.21875 -4 C 4.332031 -3.757813 4.390625 -3.410156 4.390625 -2.953125 L 4.390625 0 L 3.609375 0 L 3.609375 -2.953125 C 3.609375 -3.347656 3.519531 -3.632813 3.34375 -3.8125 C 3.175781 -4 2.9375 -4.09375 2.625 -4.09375 C 2.382813 -4.09375 2.160156 -4.03125 1.953125 -3.90625 C 1.742188 -3.789063 1.597656 -3.628906 1.515625 -3.421875 C 1.429688 -3.210938 1.390625 -2.921875 1.390625 -2.546875 L 1.390625 0 Z M 0.59375 0 "
|
||||
id="path53" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-4">
|
||||
<path
|
||||
d="M 0.375 -3.171875 C 0.375 -3.929688 0.453125 -4.546875 0.609375 -5.015625 C 0.765625 -5.484375 0.992188 -5.84375 1.296875 -6.09375 C 1.609375 -6.34375 2 -6.46875 2.46875 -6.46875 C 2.820313 -6.46875 3.128906 -6.394531 3.390625 -6.25 C 3.648438 -6.113281 3.863281 -5.914063 4.03125 -5.65625 C 4.195313 -5.394531 4.328125 -5.078125 4.421875 -4.703125 C 4.523438 -4.328125 4.578125 -3.816406 4.578125 -3.171875 C 4.578125 -2.421875 4.5 -1.8125 4.34375 -1.34375 C 4.1875 -0.882813 3.953125 -0.523438 3.640625 -0.265625 C 3.335938 -0.015625 2.945313 0.109375 2.46875 0.109375 C 1.851563 0.109375 1.367188 -0.113281 1.015625 -0.5625 C 0.585938 -1.09375 0.375 -1.960938 0.375 -3.171875 Z M 1.1875 -3.171875 C 1.1875 -2.117188 1.304688 -1.414063 1.546875 -1.0625 C 1.796875 -0.71875 2.101563 -0.546875 2.46875 -0.546875 C 2.832031 -0.546875 3.140625 -0.71875 3.390625 -1.0625 C 3.640625 -1.414063 3.765625 -2.117188 3.765625 -3.171875 C 3.765625 -4.234375 3.640625 -4.9375 3.390625 -5.28125 C 3.140625 -5.632813 2.832031 -5.8125 2.46875 -5.8125 C 2.101563 -5.8125 1.8125 -5.660156 1.59375 -5.359375 C 1.320313 -4.960938 1.1875 -4.234375 1.1875 -3.171875 Z M 1.1875 -3.171875 "
|
||||
id="path56" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-5">
|
||||
<path
|
||||
d="M 0.6875 0 L 0.6875 -6.4375 L 3.125 -6.4375 C 3.550781 -6.4375 3.878906 -6.414063 4.109375 -6.375 C 4.421875 -6.320313 4.679688 -6.222656 4.890625 -6.078125 C 5.109375 -5.929688 5.28125 -5.722656 5.40625 -5.453125 C 5.539063 -5.191406 5.609375 -4.898438 5.609375 -4.578125 C 5.609375 -4.023438 5.429688 -3.5625 5.078125 -3.1875 C 4.734375 -2.8125 4.109375 -2.625 3.203125 -2.625 L 1.546875 -2.625 L 1.546875 0 Z M 1.546875 -3.375 L 3.21875 -3.375 C 3.757813 -3.375 4.144531 -3.476563 4.375 -3.6875 C 4.613281 -3.894531 4.734375 -4.179688 4.734375 -4.546875 C 4.734375 -4.816406 4.664063 -5.046875 4.53125 -5.234375 C 4.394531 -5.429688 4.210938 -5.5625 3.984375 -5.625 C 3.847656 -5.664063 3.582031 -5.6875 3.1875 -5.6875 L 1.546875 -5.6875 Z M 1.546875 -3.375 "
|
||||
id="path59" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-6">
|
||||
<path
|
||||
d="M 0.296875 -2.328125 C 0.296875 -3.191406 0.535156 -3.832031 1.015625 -4.25 C 1.421875 -4.59375 1.910156 -4.765625 2.484375 -4.765625 C 3.128906 -4.765625 3.65625 -4.554688 4.0625 -4.140625 C 4.46875 -3.722656 4.671875 -3.144531 4.671875 -2.40625 C 4.671875 -1.800781 4.578125 -1.328125 4.390625 -0.984375 C 4.210938 -0.640625 3.953125 -0.367188 3.609375 -0.171875 C 3.265625 0.015625 2.890625 0.109375 2.484375 0.109375 C 1.828125 0.109375 1.296875 -0.0976563 0.890625 -0.515625 C 0.492188 -0.941406 0.296875 -1.546875 0.296875 -2.328125 Z M 1.109375 -2.328125 C 1.109375 -1.734375 1.238281 -1.285156 1.5 -0.984375 C 1.757813 -0.691406 2.085938 -0.546875 2.484375 -0.546875 C 2.878906 -0.546875 3.207031 -0.691406 3.46875 -0.984375 C 3.726563 -1.285156 3.859375 -1.742188 3.859375 -2.359375 C 3.859375 -2.929688 3.726563 -3.367188 3.46875 -3.671875 C 3.207031 -3.972656 2.878906 -4.125 2.484375 -4.125 C 2.085938 -4.125 1.757813 -3.972656 1.5 -3.671875 C 1.238281 -3.378906 1.109375 -2.929688 1.109375 -2.328125 Z M 1.109375 -2.328125 "
|
||||
id="path62" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-7">
|
||||
<path
|
||||
d="M 0.578125 0 L 0.578125 -6.4375 L 1.359375 -6.4375 L 1.359375 0 Z M 0.578125 0 "
|
||||
id="path65" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-8">
|
||||
<path
|
||||
d="M 0.8125 -3.765625 L 0.8125 -4.671875 L 1.71875 -4.671875 L 1.71875 -3.765625 Z M 0.8125 0 L 0.8125 -0.90625 L 1.71875 -0.90625 L 1.71875 0 Z M 0.8125 0 "
|
||||
id="path68" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-9">
|
||||
<path
|
||||
d="M 3.359375 0 L 2.5625 0 L 2.5625 -5.046875 C 2.375 -4.859375 2.125 -4.671875 1.8125 -4.484375 C 1.5 -4.304688 1.222656 -4.175781 0.984375 -4.09375 L 0.984375 -4.859375 C 1.421875 -5.054688 1.804688 -5.300781 2.140625 -5.59375 C 2.472656 -5.894531 2.707031 -6.1875 2.84375 -6.46875 L 3.359375 -6.46875 Z M 3.359375 0 "
|
||||
id="path71" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-10">
|
||||
<path
|
||||
d="M 0.8125 0 L 0.8125 -0.90625 L 1.71875 -0.90625 L 1.71875 0 Z M 0.8125 0 "
|
||||
id="path74" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-11">
|
||||
<path
|
||||
d="M 4.53125 -0.765625 L 4.53125 0 L 0.265625 0 C 0.265625 -0.1875 0.296875 -0.367188 0.359375 -0.546875 C 0.472656 -0.835938 0.648438 -1.125 0.890625 -1.40625 C 1.128906 -1.6875 1.472656 -2.007813 1.921875 -2.375 C 2.617188 -2.957031 3.085938 -3.414063 3.328125 -3.75 C 3.578125 -4.082031 3.703125 -4.398438 3.703125 -4.703125 C 3.703125 -5.015625 3.585938 -5.273438 3.359375 -5.484375 C 3.140625 -5.703125 2.851563 -5.8125 2.5 -5.8125 C 2.113281 -5.8125 1.804688 -5.695313 1.578125 -5.46875 C 1.347656 -5.238281 1.234375 -4.921875 1.234375 -4.515625 L 0.421875 -4.609375 C 0.472656 -5.210938 0.679688 -5.671875 1.046875 -5.984375 C 1.410156 -6.304688 1.898438 -6.46875 2.515625 -6.46875 C 3.128906 -6.46875 3.613281 -6.296875 3.96875 -5.953125 C 4.332031 -5.609375 4.515625 -5.1875 4.515625 -4.6875 C 4.515625 -4.425781 4.460938 -4.171875 4.359375 -3.921875 C 4.253906 -3.671875 4.078125 -3.40625 3.828125 -3.125 C 3.585938 -2.851563 3.1875 -2.476563 2.625 -2 C 2.144531 -1.601563 1.835938 -1.332031 1.703125 -1.1875 C 1.566406 -1.039063 1.457031 -0.898438 1.375 -0.765625 Z M 4.53125 -0.765625 "
|
||||
id="path77" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-12">
|
||||
<path
|
||||
d="M 0.28125 -1.9375 L 0.28125 -2.734375 L 2.71875 -2.734375 L 2.71875 -1.9375 Z M 0.28125 -1.9375 "
|
||||
id="path80" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-13">
|
||||
<path
|
||||
d="M 0 0.109375 L 1.875 -6.546875 L 2.5 -6.546875 L 0.640625 0.109375 Z M 0 0.109375 "
|
||||
id="path83" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-14">
|
||||
<path
|
||||
d="M 2.90625 0 L 2.90625 -1.546875 L 0.109375 -1.546875 L 0.109375 -2.265625 L 3.046875 -6.4375 L 3.703125 -6.4375 L 3.703125 -2.265625 L 4.578125 -2.265625 L 4.578125 -1.546875 L 3.703125 -1.546875 L 3.703125 0 Z M 2.90625 -2.265625 L 2.90625 -5.171875 L 0.890625 -2.265625 Z M 2.90625 -2.265625 "
|
||||
id="path86" />
|
||||
</g>
|
||||
</g>
|
||||
<clipPath
|
||||
id="clip-0">
|
||||
<path
|
||||
clip-rule="nonzero"
|
||||
d="M 0 56 L 176 56 L 176 72 L 0 72 Z M 0 56 "
|
||||
id="path91" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(100%, 94.898987%, 79.998779%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(83.918762%, 71.369934%, 33.729553%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 1 1 L 81.000003 1 L 81.000003 49.500002 L 1 49.500002 Z M 1 1 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0.375, 0.375)"
|
||||
id="path96" />
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g112">
|
||||
<use
|
||||
xlink:href="#glyph-0-1"
|
||||
x="12.738281"
|
||||
y="17.999998"
|
||||
id="use98" />
|
||||
<use
|
||||
xlink:href="#glyph-0-2"
|
||||
x="17.743652"
|
||||
y="17.999998"
|
||||
id="use100" />
|
||||
<use
|
||||
xlink:href="#glyph-0-3"
|
||||
x="22.749022"
|
||||
y="17.999998"
|
||||
id="use102" />
|
||||
<use
|
||||
xlink:href="#glyph-0-4"
|
||||
x="27.754393"
|
||||
y="17.999998"
|
||||
id="use104" />
|
||||
<use
|
||||
xlink:href="#glyph-0-5"
|
||||
x="35.756832"
|
||||
y="17.999998"
|
||||
id="use106" />
|
||||
<use
|
||||
xlink:href="#glyph-0-6"
|
||||
x="41.254395"
|
||||
y="17.999998"
|
||||
id="use108" />
|
||||
<use
|
||||
xlink:href="#glyph-0-1"
|
||||
x="43.754883"
|
||||
y="17.999998"
|
||||
id="use110" />
|
||||
</g>
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g122">
|
||||
<use
|
||||
xlink:href="#glyph-1-1"
|
||||
x="21.234373"
|
||||
y="33"
|
||||
id="use114" />
|
||||
<use
|
||||
xlink:href="#glyph-1-2"
|
||||
x="26.239744"
|
||||
y="33"
|
||||
id="use116" />
|
||||
<use
|
||||
xlink:href="#glyph-1-3"
|
||||
x="28.740232"
|
||||
y="33"
|
||||
id="use118" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="33.745605"
|
||||
y="33"
|
||||
id="use120" />
|
||||
</g>
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(0%, 0%, 0%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 41.000002 89.500004 L 41.000002 49.500002 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0.375, 0.375)"
|
||||
id="path124" />
|
||||
<g
|
||||
clip-path="url(#clip-0)"
|
||||
id="g128">
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="#000000"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="m 1,89.500004 219.00001,1.5"
|
||||
transform="matrix(0.75,0,0,0.75,0.375,0.375)"
|
||||
id="path126" />
|
||||
</g>
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(100%, 100%, 100%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(0%, 0%, 0%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 140.000006 1 L 220.000009 1 L 220.000009 51.000002 L 140.000006 51.000002 Z M 140.000006 1 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0.375, 0.375)"
|
||||
id="path130" />
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g140">
|
||||
<use
|
||||
xlink:href="#glyph-0-7"
|
||||
x="122.23827"
|
||||
y="17.249998"
|
||||
id="use132" />
|
||||
<use
|
||||
xlink:href="#glyph-0-8"
|
||||
x="128.73779"
|
||||
y="17.249998"
|
||||
id="use134" />
|
||||
<use
|
||||
xlink:href="#glyph-0-9"
|
||||
x="135.2373"
|
||||
y="17.249998"
|
||||
id="use136" />
|
||||
<use
|
||||
xlink:href="#glyph-0-10"
|
||||
x="141.73682"
|
||||
y="17.249998"
|
||||
id="use138" />
|
||||
</g>
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g154">
|
||||
<use
|
||||
xlink:href="#glyph-0-11"
|
||||
x="120.98437"
|
||||
y="28.499998"
|
||||
id="use142" />
|
||||
<use
|
||||
xlink:href="#glyph-0-1"
|
||||
x="126.9873"
|
||||
y="28.499998"
|
||||
id="use144" />
|
||||
<use
|
||||
xlink:href="#glyph-0-12"
|
||||
x="131.99268"
|
||||
y="28.499998"
|
||||
id="use146" />
|
||||
<use
|
||||
xlink:href="#glyph-0-13"
|
||||
x="135.49512"
|
||||
y="28.499998"
|
||||
id="use148" />
|
||||
<use
|
||||
xlink:href="#glyph-0-1"
|
||||
x="140.50049"
|
||||
y="28.499998"
|
||||
id="use150" />
|
||||
<use
|
||||
xlink:href="#glyph-0-12"
|
||||
x="145.50586"
|
||||
y="28.499998"
|
||||
id="use152" />
|
||||
</g>
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g166">
|
||||
<use
|
||||
xlink:href="#glyph-1-5"
|
||||
x="174"
|
||||
y="12.749999"
|
||||
id="use156" />
|
||||
<use
|
||||
xlink:href="#glyph-1-6"
|
||||
x="180.00291"
|
||||
y="12.749999"
|
||||
id="use158" />
|
||||
<use
|
||||
xlink:href="#glyph-1-6"
|
||||
x="185.00829"
|
||||
y="12.749999"
|
||||
id="use160" />
|
||||
<use
|
||||
xlink:href="#glyph-1-7"
|
||||
x="190.01366"
|
||||
y="12.749999"
|
||||
id="use162" />
|
||||
<use
|
||||
xlink:href="#glyph-1-8"
|
||||
x="192.01318"
|
||||
y="12.749999"
|
||||
id="use164" />
|
||||
</g>
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g196">
|
||||
<use
|
||||
xlink:href="#glyph-1-9"
|
||||
x="174"
|
||||
y="23.999998"
|
||||
id="use168" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="179.00537"
|
||||
y="23.999998"
|
||||
id="use170" />
|
||||
<use
|
||||
xlink:href="#glyph-1-10"
|
||||
x="184.01073"
|
||||
y="23.999998"
|
||||
id="use172" />
|
||||
<use
|
||||
xlink:href="#glyph-1-9"
|
||||
x="186.51123"
|
||||
y="23.999998"
|
||||
id="use174" />
|
||||
<use
|
||||
xlink:href="#glyph-1-10"
|
||||
x="191.51659"
|
||||
y="23.999998"
|
||||
id="use176" />
|
||||
<use
|
||||
xlink:href="#glyph-1-11"
|
||||
x="194.01707"
|
||||
y="23.999998"
|
||||
id="use178" />
|
||||
<use
|
||||
xlink:href="#glyph-1-10"
|
||||
x="199.02245"
|
||||
y="23.999998"
|
||||
id="use180" />
|
||||
<use
|
||||
xlink:href="#glyph-1-9"
|
||||
x="201.52293"
|
||||
y="23.999998"
|
||||
id="use182" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="206.52831"
|
||||
y="23.999998"
|
||||
id="use184" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="211.53368"
|
||||
y="23.999998"
|
||||
id="use186" />
|
||||
<use
|
||||
xlink:href="#glyph-1-12"
|
||||
x="216.53905"
|
||||
y="23.999998"
|
||||
id="use188" />
|
||||
<use
|
||||
xlink:href="#glyph-1-9"
|
||||
x="219.53612"
|
||||
y="23.999998"
|
||||
id="use190" />
|
||||
<use
|
||||
xlink:href="#glyph-1-11"
|
||||
x="224.54149"
|
||||
y="23.999998"
|
||||
id="use192" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="229.54686"
|
||||
y="23.999998"
|
||||
id="use194" />
|
||||
</g>
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g220">
|
||||
<use
|
||||
xlink:href="#glyph-1-9"
|
||||
x="60.726559"
|
||||
y="62.249996"
|
||||
id="use198" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="65.731934"
|
||||
y="62.249996"
|
||||
id="use200" />
|
||||
<use
|
||||
xlink:href="#glyph-1-10"
|
||||
x="70.737305"
|
||||
y="62.249996"
|
||||
id="use202" />
|
||||
<use
|
||||
xlink:href="#glyph-1-9"
|
||||
x="73.237793"
|
||||
y="62.249996"
|
||||
id="use204" />
|
||||
<use
|
||||
xlink:href="#glyph-1-10"
|
||||
x="78.243164"
|
||||
y="62.249996"
|
||||
id="use206" />
|
||||
<use
|
||||
xlink:href="#glyph-1-11"
|
||||
x="80.743652"
|
||||
y="62.249996"
|
||||
id="use208" />
|
||||
<use
|
||||
xlink:href="#glyph-1-10"
|
||||
x="85.749023"
|
||||
y="62.249996"
|
||||
id="use210" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="88.249512"
|
||||
y="62.249996"
|
||||
id="use212" />
|
||||
<use
|
||||
xlink:href="#glyph-1-13"
|
||||
x="93.254883"
|
||||
y="62.249996"
|
||||
id="use214" />
|
||||
<use
|
||||
xlink:href="#glyph-1-11"
|
||||
x="95.755363"
|
||||
y="62.249996"
|
||||
id="use216" />
|
||||
<use
|
||||
xlink:href="#glyph-1-14"
|
||||
x="100.76073"
|
||||
y="62.249996"
|
||||
id="use218" />
|
||||
</g>
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(0%, 0%, 0%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 182.000008 90.500004 L 182.000008 50.500002 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0.375, 0.375)"
|
||||
id="path222" />
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g228">
|
||||
<use
|
||||
xlink:href="#glyph-1-10"
|
||||
x="138.73828"
|
||||
y="49.499996"
|
||||
id="use224" />
|
||||
<use
|
||||
xlink:href="#glyph-1-9"
|
||||
x="141.23877"
|
||||
y="49.499996"
|
||||
id="use226" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 29 KiB |
@@ -0,0 +1,294 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="145.919998pt"
|
||||
height="73.919998pt"
|
||||
viewBox="0 0 145.919998 73.919998"
|
||||
version="1.1"
|
||||
id="svg119"
|
||||
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="defs55">
|
||||
<g
|
||||
id="g53">
|
||||
<g
|
||||
id="glyph-0-0">
|
||||
<path
|
||||
d="M 1.125 0 L 1.125 -5.640625 L 5.640625 -5.640625 L 5.640625 0 Z M 1.265625 -0.140625 L 5.5 -0.140625 L 5.5 -5.5 L 1.265625 -5.5 Z M 1.265625 -0.140625 "
|
||||
id="path2" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-1">
|
||||
<path
|
||||
d="M 3.359375 -1.484375 L 4.59375 -1.28125 C 4.4375 -0.832031 4.1875 -0.488281 3.84375 -0.25 C 3.5 -0.0078125 3.070313 0.109375 2.5625 0.109375 C 1.75 0.109375 1.144531 -0.15625 0.75 -0.6875 C 0.4375 -1.113281 0.28125 -1.65625 0.28125 -2.3125 C 0.28125 -3.082031 0.484375 -3.6875 0.890625 -4.125 C 1.296875 -4.5625 1.8125 -4.78125 2.4375 -4.78125 C 3.132813 -4.78125 3.679688 -4.550781 4.078125 -4.09375 C 4.484375 -3.632813 4.675781 -2.929688 4.65625 -1.984375 L 1.5625 -1.984375 C 1.5625 -1.617188 1.65625 -1.332031 1.84375 -1.125 C 2.039063 -0.914063 2.285156 -0.8125 2.578125 -0.8125 C 2.765625 -0.8125 2.925781 -0.863281 3.0625 -0.96875 C 3.195313 -1.082031 3.296875 -1.253906 3.359375 -1.484375 Z M 3.4375 -2.75 C 3.425781 -3.101563 3.332031 -3.375 3.15625 -3.5625 C 2.976563 -3.75 2.765625 -3.84375 2.515625 -3.84375 C 2.242188 -3.84375 2.019531 -3.742188 1.84375 -3.546875 C 1.664063 -3.347656 1.578125 -3.082031 1.578125 -2.75 Z M 3.4375 -2.75 "
|
||||
id="path5" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-2">
|
||||
<path
|
||||
d="M 0.046875 0 L 1.734375 -2.40625 L 0.125 -4.6875 L 1.640625 -4.6875 L 2.46875 -3.390625 L 3.34375 -4.6875 L 4.796875 -4.6875 L 3.203125 -2.46875 L 4.9375 0 L 3.421875 0 L 2.46875 -1.453125 L 1.5 0 Z M 0.046875 0 "
|
||||
id="path8" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-3">
|
||||
<path
|
||||
d="M 1.578125 -3.25 L 0.453125 -3.453125 C 0.578125 -3.910156 0.789063 -4.242188 1.09375 -4.453125 C 1.40625 -4.671875 1.867188 -4.78125 2.484375 -4.78125 C 3.035156 -4.78125 3.445313 -4.710938 3.71875 -4.578125 C 3.988281 -4.453125 4.175781 -4.289063 4.28125 -4.09375 C 4.394531 -3.894531 4.453125 -3.523438 4.453125 -2.984375 L 4.4375 -1.53125 C 4.4375 -1.125 4.457031 -0.820313 4.5 -0.625 C 4.539063 -0.425781 4.613281 -0.21875 4.71875 0 L 3.5 0 C 3.457031 -0.0820313 3.414063 -0.203125 3.375 -0.359375 C 3.351563 -0.429688 3.335938 -0.484375 3.328125 -0.515625 C 3.117188 -0.304688 2.890625 -0.148438 2.640625 -0.046875 C 2.398438 0.0546875 2.144531 0.109375 1.875 0.109375 C 1.394531 0.109375 1.015625 -0.0195313 0.734375 -0.28125 C 0.460938 -0.539063 0.328125 -0.875 0.328125 -1.28125 C 0.328125 -1.539063 0.390625 -1.773438 0.515625 -1.984375 C 0.640625 -2.191406 0.816406 -2.347656 1.046875 -2.453125 C 1.273438 -2.566406 1.601563 -2.664063 2.03125 -2.75 C 2.601563 -2.863281 3.003906 -2.96875 3.234375 -3.0625 L 3.234375 -3.171875 C 3.234375 -3.410156 3.171875 -3.582031 3.046875 -3.6875 C 2.929688 -3.789063 2.710938 -3.84375 2.390625 -3.84375 C 2.171875 -3.84375 2 -3.796875 1.875 -3.703125 C 1.75 -3.617188 1.648438 -3.46875 1.578125 -3.25 Z M 3.234375 -2.25 C 3.078125 -2.195313 2.828125 -2.132813 2.484375 -2.0625 C 2.140625 -1.988281 1.910156 -1.914063 1.796875 -1.84375 C 1.640625 -1.726563 1.5625 -1.582031 1.5625 -1.40625 C 1.5625 -1.226563 1.625 -1.078125 1.75 -0.953125 C 1.882813 -0.828125 2.050781 -0.765625 2.25 -0.765625 C 2.46875 -0.765625 2.679688 -0.835938 2.890625 -0.984375 C 3.035156 -1.097656 3.132813 -1.234375 3.1875 -1.390625 C 3.21875 -1.503906 3.234375 -1.707031 3.234375 -2 Z M 3.234375 -2.25 "
|
||||
id="path11" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-4">
|
||||
<path
|
||||
d="M 0.5625 -4.6875 L 1.703125 -4.6875 L 1.703125 -4.046875 C 2.109375 -4.535156 2.59375 -4.78125 3.15625 -4.78125 C 3.457031 -4.78125 3.71875 -4.71875 3.9375 -4.59375 C 4.15625 -4.476563 4.335938 -4.296875 4.484375 -4.046875 C 4.679688 -4.296875 4.898438 -4.476563 5.140625 -4.59375 C 5.378906 -4.71875 5.632813 -4.78125 5.90625 -4.78125 C 6.25 -4.78125 6.539063 -4.710938 6.78125 -4.578125 C 7.019531 -4.441406 7.195313 -4.238281 7.3125 -3.96875 C 7.394531 -3.769531 7.4375 -3.445313 7.4375 -3 L 7.4375 0 L 6.203125 0 L 6.203125 -2.671875 C 6.203125 -3.140625 6.160156 -3.441406 6.078125 -3.578125 C 5.960938 -3.753906 5.785156 -3.84375 5.546875 -3.84375 C 5.367188 -3.84375 5.203125 -3.785156 5.046875 -3.671875 C 4.898438 -3.566406 4.789063 -3.410156 4.71875 -3.203125 C 4.65625 -3.003906 4.625 -2.6875 4.625 -2.25 L 4.625 0 L 3.390625 0 L 3.390625 -2.5625 C 3.390625 -3.019531 3.363281 -3.3125 3.3125 -3.4375 C 3.269531 -3.570313 3.203125 -3.671875 3.109375 -3.734375 C 3.023438 -3.804688 2.898438 -3.84375 2.734375 -3.84375 C 2.546875 -3.84375 2.375 -3.789063 2.21875 -3.6875 C 2.070313 -3.582031 1.960938 -3.429688 1.890625 -3.234375 C 1.828125 -3.046875 1.796875 -2.726563 1.796875 -2.28125 L 1.796875 0 L 0.5625 0 Z M 0.5625 -4.6875 "
|
||||
id="path14" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-5">
|
||||
<path
|
||||
d="M 0.609375 -4.6875 L 1.765625 -4.6875 L 1.765625 -4 C 1.921875 -4.226563 2.125 -4.414063 2.375 -4.5625 C 2.632813 -4.707031 2.921875 -4.78125 3.234375 -4.78125 C 3.773438 -4.78125 4.234375 -4.566406 4.609375 -4.140625 C 4.992188 -3.722656 5.1875 -3.132813 5.1875 -2.375 C 5.1875 -1.582031 4.992188 -0.96875 4.609375 -0.53125 C 4.222656 -0.101563 3.757813 0.109375 3.21875 0.109375 C 2.957031 0.109375 2.722656 0.0546875 2.515625 -0.046875 C 2.304688 -0.148438 2.085938 -0.328125 1.859375 -0.578125 L 1.859375 1.78125 L 0.609375 1.78125 Z M 1.84375 -2.421875 C 1.84375 -1.890625 1.945313 -1.5 2.15625 -1.25 C 2.363281 -1 2.617188 -0.875 2.921875 -0.875 C 3.203125 -0.875 3.4375 -0.988281 3.625 -1.21875 C 3.820313 -1.445313 3.921875 -1.828125 3.921875 -2.359375 C 3.921875 -2.847656 3.820313 -3.210938 3.625 -3.453125 C 3.425781 -3.691406 3.179688 -3.8125 2.890625 -3.8125 C 2.585938 -3.8125 2.335938 -3.691406 2.140625 -3.453125 C 1.941406 -3.222656 1.84375 -2.878906 1.84375 -2.421875 Z M 1.84375 -2.421875 "
|
||||
id="path17" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-6">
|
||||
<path
|
||||
d="M 0.640625 0 L 0.640625 -6.46875 L 1.890625 -6.46875 L 1.890625 0 Z M 0.640625 0 "
|
||||
id="path20" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-0">
|
||||
<path
|
||||
d="M 1.125 0 L 1.125 -5.640625 L 5.640625 -5.640625 L 5.640625 0 Z M 1.265625 -0.140625 L 5.5 -0.140625 L 5.5 -5.5 L 1.265625 -5.5 Z M 1.265625 -0.140625 "
|
||||
id="path23" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-1">
|
||||
<path
|
||||
d="M 3.796875 -1.515625 L 4.625 -1.40625 C 4.488281 -0.925781 4.242188 -0.550781 3.890625 -0.28125 C 3.546875 -0.0195313 3.101563 0.109375 2.5625 0.109375 C 1.875 0.109375 1.328125 -0.0976563 0.921875 -0.515625 C 0.523438 -0.941406 0.328125 -1.535156 0.328125 -2.296875 C 0.328125 -3.085938 0.53125 -3.695313 0.9375 -4.125 C 1.34375 -4.5625 1.867188 -4.78125 2.515625 -4.78125 C 3.140625 -4.78125 3.648438 -4.566406 4.046875 -4.140625 C 4.441406 -3.722656 4.640625 -3.125 4.640625 -2.34375 C 4.640625 -2.300781 4.640625 -2.234375 4.640625 -2.140625 L 1.15625 -2.140625 C 1.175781 -1.617188 1.316406 -1.222656 1.578125 -0.953125 C 1.847656 -0.679688 2.175781 -0.546875 2.5625 -0.546875 C 2.851563 -0.546875 3.101563 -0.617188 3.3125 -0.765625 C 3.519531 -0.921875 3.679688 -1.171875 3.796875 -1.515625 Z M 1.1875 -2.796875 L 3.8125 -2.796875 C 3.769531 -3.179688 3.671875 -3.472656 3.515625 -3.671875 C 3.253906 -3.984375 2.925781 -4.140625 2.53125 -4.140625 C 2.164063 -4.140625 1.859375 -4.015625 1.609375 -3.765625 C 1.359375 -3.523438 1.21875 -3.203125 1.1875 -2.796875 Z M 1.1875 -2.796875 "
|
||||
id="path26" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-2">
|
||||
<path
|
||||
d="M 2.328125 -0.703125 L 2.4375 -0.015625 C 2.21875 0.0351563 2.019531 0.0625 1.84375 0.0625 C 1.550781 0.0625 1.328125 0.015625 1.171875 -0.078125 C 1.015625 -0.171875 0.898438 -0.289063 0.828125 -0.4375 C 0.765625 -0.582031 0.734375 -0.894531 0.734375 -1.375 L 0.734375 -4.0625 L 0.15625 -4.0625 L 0.15625 -4.6875 L 0.734375 -4.6875 L 0.734375 -5.84375 L 1.53125 -6.3125 L 1.53125 -4.6875 L 2.328125 -4.6875 L 2.328125 -4.0625 L 1.53125 -4.0625 L 1.53125 -1.328125 C 1.53125 -1.097656 1.539063 -0.953125 1.5625 -0.890625 C 1.59375 -0.828125 1.640625 -0.773438 1.703125 -0.734375 C 1.765625 -0.691406 1.859375 -0.671875 1.984375 -0.671875 C 2.066406 -0.671875 2.179688 -0.679688 2.328125 -0.703125 Z M 2.328125 -0.703125 "
|
||||
id="path29" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-3">
|
||||
<path
|
||||
d="M 0.59375 0 L 0.59375 -6.46875 L 1.390625 -6.46875 L 1.390625 -4.140625 C 1.753906 -4.566406 2.222656 -4.78125 2.796875 -4.78125 C 3.140625 -4.78125 3.4375 -4.710938 3.6875 -4.578125 C 3.945313 -4.441406 4.128906 -4.253906 4.234375 -4.015625 C 4.347656 -3.773438 4.40625 -3.425781 4.40625 -2.96875 L 4.40625 0 L 3.609375 0 L 3.609375 -2.96875 C 3.609375 -3.363281 3.519531 -3.648438 3.34375 -3.828125 C 3.175781 -4.015625 2.9375 -4.109375 2.625 -4.109375 C 2.394531 -4.109375 2.175781 -4.046875 1.96875 -3.921875 C 1.757813 -3.796875 1.609375 -3.628906 1.515625 -3.421875 C 1.429688 -3.210938 1.390625 -2.925781 1.390625 -2.5625 L 1.390625 0 Z M 0.59375 0 "
|
||||
id="path32" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-4">
|
||||
<path
|
||||
d="M 0.375 -3.1875 C 0.375 -3.945313 0.453125 -4.5625 0.609375 -5.03125 C 0.765625 -5.5 1 -5.859375 1.3125 -6.109375 C 1.625 -6.359375 2.015625 -6.484375 2.484375 -6.484375 C 2.828125 -6.484375 3.128906 -6.414063 3.390625 -6.28125 C 3.648438 -6.144531 3.863281 -5.941406 4.03125 -5.671875 C 4.207031 -5.410156 4.34375 -5.09375 4.4375 -4.71875 C 4.539063 -4.34375 4.59375 -3.832031 4.59375 -3.1875 C 4.59375 -2.425781 4.515625 -1.8125 4.359375 -1.34375 C 4.203125 -0.882813 3.96875 -0.523438 3.65625 -0.265625 C 3.34375 -0.015625 2.953125 0.109375 2.484375 0.109375 C 1.859375 0.109375 1.367188 -0.113281 1.015625 -0.5625 C 0.585938 -1.09375 0.375 -1.96875 0.375 -3.1875 Z M 1.1875 -3.1875 C 1.1875 -2.125 1.3125 -1.414063 1.5625 -1.0625 C 1.8125 -0.71875 2.117188 -0.546875 2.484375 -0.546875 C 2.847656 -0.546875 3.15625 -0.71875 3.40625 -1.0625 C 3.65625 -1.414063 3.78125 -2.125 3.78125 -3.1875 C 3.78125 -4.25 3.65625 -4.953125 3.40625 -5.296875 C 3.15625 -5.648438 2.84375 -5.828125 2.46875 -5.828125 C 2.101563 -5.828125 1.8125 -5.675781 1.59375 -5.375 C 1.320313 -4.976563 1.1875 -4.25 1.1875 -3.1875 Z M 1.1875 -3.1875 "
|
||||
id="path35" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-5">
|
||||
<path
|
||||
d="M 3.359375 0 L 2.578125 0 L 2.578125 -5.0625 C 2.378906 -4.875 2.125 -4.6875 1.8125 -4.5 C 1.507813 -4.320313 1.234375 -4.1875 0.984375 -4.09375 L 0.984375 -4.875 C 1.429688 -5.082031 1.816406 -5.332031 2.140625 -5.625 C 2.472656 -5.925781 2.710938 -6.210938 2.859375 -6.484375 L 3.359375 -6.484375 Z M 3.359375 0 "
|
||||
id="path38" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-6">
|
||||
<path
|
||||
d="M 0.8125 0 L 0.8125 -0.90625 L 1.71875 -0.90625 L 1.71875 0 Z M 0.8125 0 "
|
||||
id="path41" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-7">
|
||||
<path
|
||||
d="M 0 0.109375 L 1.875 -6.578125 L 2.515625 -6.578125 L 0.640625 0.109375 Z M 0 0.109375 "
|
||||
id="path44" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-8">
|
||||
<path
|
||||
d="M 4.546875 -0.765625 L 4.546875 0 L 0.265625 0 C 0.265625 -0.1875 0.296875 -0.367188 0.359375 -0.546875 C 0.472656 -0.835938 0.648438 -1.125 0.890625 -1.40625 C 1.128906 -1.6875 1.472656 -2.015625 1.921875 -2.390625 C 2.628906 -2.960938 3.101563 -3.414063 3.34375 -3.75 C 3.59375 -4.09375 3.71875 -4.414063 3.71875 -4.71875 C 3.71875 -5.03125 3.601563 -5.289063 3.375 -5.5 C 3.15625 -5.71875 2.863281 -5.828125 2.5 -5.828125 C 2.125 -5.828125 1.820313 -5.710938 1.59375 -5.484375 C 1.363281 -5.253906 1.242188 -4.9375 1.234375 -4.53125 L 0.421875 -4.625 C 0.472656 -5.226563 0.679688 -5.6875 1.046875 -6 C 1.410156 -6.320313 1.898438 -6.484375 2.515625 -6.484375 C 3.140625 -6.484375 3.628906 -6.3125 3.984375 -5.96875 C 4.347656 -5.625 4.53125 -5.203125 4.53125 -4.703125 C 4.53125 -4.441406 4.476563 -4.1875 4.375 -3.9375 C 4.269531 -3.6875 4.09375 -3.421875 3.84375 -3.140625 C 3.601563 -2.867188 3.195313 -2.488281 2.625 -2 C 2.144531 -1.601563 1.835938 -1.332031 1.703125 -1.1875 C 1.578125 -1.050781 1.46875 -0.910156 1.375 -0.765625 Z M 4.546875 -0.765625 "
|
||||
id="path47" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-9">
|
||||
<path
|
||||
d="M 2.921875 0 L 2.921875 -1.546875 L 0.109375 -1.546875 L 0.109375 -2.28125 L 3.0625 -6.46875 L 3.71875 -6.46875 L 3.71875 -2.28125 L 4.59375 -2.28125 L 4.59375 -1.546875 L 3.71875 -1.546875 L 3.71875 0 Z M 2.921875 -2.28125 L 2.921875 -5.1875 L 0.890625 -2.28125 Z M 2.921875 -2.28125 "
|
||||
id="path50" />
|
||||
</g>
|
||||
</g>
|
||||
</defs>
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(100%, 94.898987%, 79.998779%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(83.918762%, 71.369934%, 33.729553%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 1.000054 1.000054 L 81.001187 1.000054 L 81.001187 51.000113 L 1.000054 51.000113 Z M 1.000054 1.000054 "
|
||||
transform="matrix(0.752577, 0, 0, 0.752577, 0.376289, 0.376289)"
|
||||
id="path57" />
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g73">
|
||||
<use
|
||||
xlink:href="#glyph-0-1"
|
||||
x="12.782054"
|
||||
y="18.81443"
|
||||
id="use59" />
|
||||
<use
|
||||
xlink:href="#glyph-0-2"
|
||||
x="17.804625"
|
||||
y="18.81443"
|
||||
id="use61" />
|
||||
<use
|
||||
xlink:href="#glyph-0-3"
|
||||
x="22.827196"
|
||||
y="18.81443"
|
||||
id="use63" />
|
||||
<use
|
||||
xlink:href="#glyph-0-4"
|
||||
x="27.849768"
|
||||
y="18.81443"
|
||||
id="use65" />
|
||||
<use
|
||||
xlink:href="#glyph-0-5"
|
||||
x="35.879707"
|
||||
y="18.81443"
|
||||
id="use67" />
|
||||
<use
|
||||
xlink:href="#glyph-0-6"
|
||||
x="41.396156"
|
||||
y="18.81443"
|
||||
id="use69" />
|
||||
<use
|
||||
xlink:href="#glyph-0-1"
|
||||
x="43.905239"
|
||||
y="18.81443"
|
||||
id="use71" />
|
||||
</g>
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g83">
|
||||
<use
|
||||
xlink:href="#glyph-1-1"
|
||||
x="21.307343"
|
||||
y="33.865974"
|
||||
id="use75" />
|
||||
<use
|
||||
xlink:href="#glyph-1-2"
|
||||
x="26.329914"
|
||||
y="33.865974"
|
||||
id="use77" />
|
||||
<use
|
||||
xlink:href="#glyph-1-3"
|
||||
x="28.838995"
|
||||
y="33.865974"
|
||||
id="use79" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="33.861565"
|
||||
y="33.865974"
|
||||
id="use81" />
|
||||
</g>
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(0%, 0%, 0%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 40.998025 90.998084 L 40.998025 51.000113 "
|
||||
transform="matrix(0.752577, 0, 0, 0.752577, 0.376289, 0.376289)"
|
||||
id="path85" />
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(0%, 0%, 0%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 1.000054 90.998084 L 190.998203 90.998084 "
|
||||
transform="matrix(0.752577, 0, 0, 0.752577, 0.376289, 0.376289)"
|
||||
id="path87" />
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g111">
|
||||
<use
|
||||
xlink:href="#glyph-1-5"
|
||||
x="66.955856"
|
||||
y="62.463909"
|
||||
id="use89" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="71.978424"
|
||||
y="62.463909"
|
||||
id="use91" />
|
||||
<use
|
||||
xlink:href="#glyph-1-6"
|
||||
x="77.000999"
|
||||
y="62.463909"
|
||||
id="use93" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="79.510078"
|
||||
y="62.463909"
|
||||
id="use95" />
|
||||
<use
|
||||
xlink:href="#glyph-1-6"
|
||||
x="84.532654"
|
||||
y="62.463909"
|
||||
id="use97" />
|
||||
<use
|
||||
xlink:href="#glyph-1-5"
|
||||
x="87.041733"
|
||||
y="62.463909"
|
||||
id="use99" />
|
||||
<use
|
||||
xlink:href="#glyph-1-6"
|
||||
x="92.064301"
|
||||
y="62.463909"
|
||||
id="use101" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="94.57338"
|
||||
y="62.463909"
|
||||
id="use103" />
|
||||
<use
|
||||
xlink:href="#glyph-1-7"
|
||||
x="99.595955"
|
||||
y="62.463909"
|
||||
id="use105" />
|
||||
<use
|
||||
xlink:href="#glyph-1-8"
|
||||
x="102.10503"
|
||||
y="62.463909"
|
||||
id="use107" />
|
||||
<use
|
||||
xlink:href="#glyph-1-9"
|
||||
x="107.1276"
|
||||
y="62.463909"
|
||||
id="use109" />
|
||||
</g>
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g117">
|
||||
<use
|
||||
xlink:href="#glyph-1-6"
|
||||
x="18.802671"
|
||||
y="48.917519"
|
||||
id="use113" />
|
||||
<use
|
||||
xlink:href="#glyph-1-5"
|
||||
x="21.311752"
|
||||
y="48.917519"
|
||||
id="use115" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 16 KiB |
@@ -0,0 +1,507 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="168pt"
|
||||
height="71.040001pt"
|
||||
viewBox="0 0 168 71.040001"
|
||||
version="1.1"
|
||||
id="svg207"
|
||||
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="defs97">
|
||||
<g
|
||||
id="g92">
|
||||
<g
|
||||
id="glyph-0-0">
|
||||
<path
|
||||
d="M 1.125 0 L 1.125 -5.625 L 5.625 -5.625 L 5.625 0 Z M 1.265625 -0.140625 L 5.484375 -0.140625 L 5.484375 -5.484375 L 1.265625 -5.484375 Z M 1.265625 -0.140625 "
|
||||
id="path2" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-1">
|
||||
<path
|
||||
d="M 3.34375 -1.484375 L 4.578125 -1.28125 C 4.421875 -0.832031 4.171875 -0.488281 3.828125 -0.25 C 3.484375 -0.0078125 3.054688 0.109375 2.546875 0.109375 C 1.734375 0.109375 1.132813 -0.15625 0.75 -0.6875 C 0.4375 -1.113281 0.28125 -1.648438 0.28125 -2.296875 C 0.28125 -3.066406 0.484375 -3.671875 0.890625 -4.109375 C 1.296875 -4.546875 1.804688 -4.765625 2.421875 -4.765625 C 3.117188 -4.765625 3.664063 -4.535156 4.0625 -4.078125 C 4.46875 -3.617188 4.660156 -2.921875 4.640625 -1.984375 L 1.546875 -1.984375 C 1.554688 -1.609375 1.65625 -1.316406 1.84375 -1.109375 C 2.039063 -0.910156 2.28125 -0.8125 2.5625 -0.8125 C 2.757813 -0.8125 2.921875 -0.863281 3.046875 -0.96875 C 3.179688 -1.082031 3.28125 -1.253906 3.34375 -1.484375 Z M 3.421875 -2.734375 C 3.410156 -3.085938 3.316406 -3.359375 3.140625 -3.546875 C 2.960938 -3.734375 2.75 -3.828125 2.5 -3.828125 C 2.226563 -3.828125 2.003906 -3.726563 1.828125 -3.53125 C 1.648438 -3.332031 1.566406 -3.066406 1.578125 -2.734375 Z M 3.421875 -2.734375 "
|
||||
id="path5" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-2">
|
||||
<path
|
||||
d="M 0.046875 0 L 1.734375 -2.40625 L 0.125 -4.671875 L 1.625 -4.671875 L 2.453125 -3.390625 L 3.328125 -4.671875 L 4.78125 -4.671875 L 3.1875 -2.453125 L 4.921875 0 L 3.40625 0 L 2.453125 -1.453125 L 1.5 0 Z M 0.046875 0 "
|
||||
id="path8" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-3">
|
||||
<path
|
||||
d="M 1.5625 -3.25 L 0.453125 -3.453125 C 0.578125 -3.898438 0.789063 -4.226563 1.09375 -4.4375 C 1.40625 -4.65625 1.863281 -4.765625 2.46875 -4.765625 C 3.019531 -4.765625 3.429688 -4.695313 3.703125 -4.5625 C 3.972656 -4.4375 4.160156 -4.273438 4.265625 -4.078125 C 4.378906 -3.878906 4.4375 -3.507813 4.4375 -2.96875 L 4.421875 -1.53125 C 4.421875 -1.125 4.441406 -0.820313 4.484375 -0.625 C 4.523438 -0.425781 4.597656 -0.21875 4.703125 0 L 3.484375 0 C 3.453125 -0.0820313 3.410156 -0.203125 3.359375 -0.359375 C 3.335938 -0.429688 3.320313 -0.484375 3.3125 -0.515625 C 3.101563 -0.304688 2.878906 -0.148438 2.640625 -0.046875 C 2.398438 0.0546875 2.144531 0.109375 1.875 0.109375 C 1.394531 0.109375 1.015625 -0.0195313 0.734375 -0.28125 C 0.460938 -0.539063 0.328125 -0.875 0.328125 -1.28125 C 0.328125 -1.539063 0.390625 -1.773438 0.515625 -1.984375 C 0.640625 -2.191406 0.8125 -2.347656 1.03125 -2.453125 C 1.257813 -2.566406 1.585938 -2.664063 2.015625 -2.75 C 2.597656 -2.851563 3 -2.953125 3.21875 -3.046875 L 3.21875 -3.171875 C 3.21875 -3.410156 3.160156 -3.578125 3.046875 -3.671875 C 2.929688 -3.773438 2.707031 -3.828125 2.375 -3.828125 C 2.15625 -3.828125 1.984375 -3.78125 1.859375 -3.6875 C 1.742188 -3.601563 1.644531 -3.457031 1.5625 -3.25 Z M 3.21875 -2.234375 C 3.0625 -2.179688 2.8125 -2.117188 2.46875 -2.046875 C 2.125 -1.972656 1.898438 -1.90625 1.796875 -1.84375 C 1.640625 -1.726563 1.5625 -1.582031 1.5625 -1.40625 C 1.5625 -1.226563 1.625 -1.078125 1.75 -0.953125 C 1.875 -0.828125 2.035156 -0.765625 2.234375 -0.765625 C 2.460938 -0.765625 2.675781 -0.835938 2.875 -0.984375 C 3.03125 -1.097656 3.128906 -1.234375 3.171875 -1.390625 C 3.203125 -1.492188 3.21875 -1.695313 3.21875 -2 Z M 3.21875 -2.234375 "
|
||||
id="path11" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-4">
|
||||
<path
|
||||
d="M 0.546875 -4.671875 L 1.6875 -4.671875 L 1.6875 -4.03125 C 2.09375 -4.519531 2.578125 -4.765625 3.140625 -4.765625 C 3.441406 -4.765625 3.703125 -4.703125 3.921875 -4.578125 C 4.140625 -4.460938 4.320313 -4.28125 4.46875 -4.03125 C 4.664063 -4.28125 4.882813 -4.460938 5.125 -4.578125 C 5.363281 -4.703125 5.617188 -4.765625 5.890625 -4.765625 C 6.234375 -4.765625 6.519531 -4.695313 6.75 -4.5625 C 6.988281 -4.425781 7.171875 -4.222656 7.296875 -3.953125 C 7.378906 -3.753906 7.421875 -3.429688 7.421875 -2.984375 L 7.421875 0 L 6.1875 0 L 6.1875 -2.671875 C 6.1875 -3.128906 6.144531 -3.425781 6.0625 -3.5625 C 5.945313 -3.738281 5.769531 -3.828125 5.53125 -3.828125 C 5.351563 -3.828125 5.1875 -3.773438 5.03125 -3.671875 C 4.882813 -3.566406 4.773438 -3.410156 4.703125 -3.203125 C 4.640625 -3.003906 4.609375 -2.679688 4.609375 -2.234375 L 4.609375 0 L 3.375 0 L 3.375 -2.5625 C 3.375 -3.007813 3.351563 -3.300781 3.3125 -3.4375 C 3.269531 -3.570313 3.203125 -3.671875 3.109375 -3.734375 C 3.015625 -3.796875 2.890625 -3.828125 2.734375 -3.828125 C 2.535156 -3.828125 2.359375 -3.773438 2.203125 -3.671875 C 2.054688 -3.566406 1.945313 -3.414063 1.875 -3.21875 C 1.8125 -3.03125 1.78125 -2.710938 1.78125 -2.265625 L 1.78125 0 L 0.546875 0 Z M 0.546875 -4.671875 "
|
||||
id="path14" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-5">
|
||||
<path
|
||||
d="M 0.609375 -4.671875 L 1.765625 -4.671875 L 1.765625 -3.984375 C 1.910156 -4.210938 2.109375 -4.398438 2.359375 -4.546875 C 2.617188 -4.691406 2.90625 -4.765625 3.21875 -4.765625 C 3.757813 -4.765625 4.21875 -4.550781 4.59375 -4.125 C 4.96875 -3.707031 5.15625 -3.117188 5.15625 -2.359375 C 5.15625 -1.578125 4.960938 -0.96875 4.578125 -0.53125 C 4.203125 -0.101563 3.742188 0.109375 3.203125 0.109375 C 2.953125 0.109375 2.71875 0.0546875 2.5 -0.046875 C 2.289063 -0.148438 2.070313 -0.328125 1.84375 -0.578125 L 1.84375 1.78125 L 0.609375 1.78125 Z M 1.828125 -2.40625 C 1.828125 -1.882813 1.929688 -1.5 2.140625 -1.25 C 2.347656 -1 2.601563 -0.875 2.90625 -0.875 C 3.1875 -0.875 3.421875 -0.988281 3.609375 -1.21875 C 3.804688 -1.445313 3.90625 -1.820313 3.90625 -2.34375 C 3.90625 -2.832031 3.804688 -3.195313 3.609375 -3.4375 C 3.410156 -3.675781 3.171875 -3.796875 2.890625 -3.796875 C 2.585938 -3.796875 2.332031 -3.675781 2.125 -3.4375 C 1.925781 -3.207031 1.828125 -2.863281 1.828125 -2.40625 Z M 1.828125 -2.40625 "
|
||||
id="path17" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-6">
|
||||
<path
|
||||
d="M 0.640625 0 L 0.640625 -6.4375 L 1.875 -6.4375 L 1.875 0 Z M 0.640625 0 "
|
||||
id="path20" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-7">
|
||||
<path
|
||||
d="M 0.609375 0 L 0.609375 -6.4375 L 1.921875 -6.4375 L 1.921875 0 Z M 0.609375 0 "
|
||||
id="path23" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-8">
|
||||
<path
|
||||
d="M 0.65625 0 L 0.65625 -6.4375 L 2.75 -6.4375 C 3.53125 -6.4375 4.046875 -6.40625 4.296875 -6.34375 C 4.660156 -6.25 4.96875 -6.039063 5.21875 -5.71875 C 5.46875 -5.394531 5.59375 -4.972656 5.59375 -4.453125 C 5.59375 -4.066406 5.519531 -3.738281 5.375 -3.46875 C 5.226563 -3.195313 5.046875 -2.984375 4.828125 -2.828125 C 4.609375 -2.671875 4.382813 -2.566406 4.15625 -2.515625 C 3.84375 -2.460938 3.390625 -2.4375 2.796875 -2.4375 L 1.953125 -2.4375 L 1.953125 0 Z M 1.953125 -5.359375 L 1.953125 -3.53125 L 2.671875 -3.53125 C 3.179688 -3.53125 3.519531 -3.5625 3.6875 -3.625 C 3.863281 -3.695313 4 -3.800781 4.09375 -3.9375 C 4.195313 -4.082031 4.25 -4.25 4.25 -4.4375 C 4.25 -4.675781 4.179688 -4.867188 4.046875 -5.015625 C 3.910156 -5.171875 3.734375 -5.269531 3.515625 -5.3125 C 3.359375 -5.34375 3.046875 -5.359375 2.578125 -5.359375 Z M 1.953125 -5.359375 "
|
||||
id="path26" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-9">
|
||||
<path
|
||||
d="M 1.921875 0 L 0.046875 -4.671875 L 1.34375 -4.671875 L 2.21875 -2.28125 L 2.484375 -1.484375 C 2.546875 -1.691406 2.585938 -1.828125 2.609375 -1.890625 C 2.648438 -2.023438 2.691406 -2.15625 2.734375 -2.28125 L 3.625 -4.671875 L 4.890625 -4.671875 L 3.046875 0 Z M 1.921875 0 "
|
||||
id="path29" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-10">
|
||||
<path
|
||||
d="M 4.5625 -4.859375 L 3.375 -4.734375 C 3.34375 -4.984375 3.265625 -5.164063 3.140625 -5.28125 C 3.015625 -5.394531 2.851563 -5.453125 2.65625 -5.453125 C 2.394531 -5.453125 2.175781 -5.332031 2 -5.09375 C 1.820313 -4.863281 1.707031 -4.378906 1.65625 -3.640625 C 1.96875 -4.003906 2.351563 -4.1875 2.8125 -4.1875 C 3.320313 -4.1875 3.757813 -3.988281 4.125 -3.59375 C 4.5 -3.195313 4.6875 -2.691406 4.6875 -2.078125 C 4.6875 -1.410156 4.492188 -0.878906 4.109375 -0.484375 C 3.722656 -0.0859375 3.222656 0.109375 2.609375 0.109375 C 1.960938 0.109375 1.425781 -0.140625 1 -0.640625 C 0.582031 -1.148438 0.375 -1.984375 0.375 -3.140625 C 0.375 -4.316406 0.59375 -5.164063 1.03125 -5.6875 C 1.46875 -6.207031 2.035156 -6.46875 2.734375 -6.46875 C 3.222656 -6.46875 3.628906 -6.328125 3.953125 -6.046875 C 4.273438 -5.773438 4.476563 -5.378906 4.5625 -4.859375 Z M 1.765625 -2.171875 C 1.765625 -1.765625 1.859375 -1.453125 2.046875 -1.234375 C 2.234375 -1.023438 2.441406 -0.921875 2.671875 -0.921875 C 2.898438 -0.921875 3.085938 -1.007813 3.234375 -1.1875 C 3.390625 -1.363281 3.46875 -1.65625 3.46875 -2.0625 C 3.46875 -2.476563 3.382813 -2.785156 3.21875 -2.984375 C 3.0625 -3.179688 2.859375 -3.28125 2.609375 -3.28125 C 2.378906 -3.28125 2.179688 -3.1875 2.015625 -3 C 1.847656 -2.8125 1.765625 -2.535156 1.765625 -2.171875 Z M 1.765625 -2.171875 "
|
||||
id="path32" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-11">
|
||||
<path
|
||||
d="M 0.65625 0 L 0.65625 -6.4375 L 3.390625 -6.4375 C 4.085938 -6.4375 4.585938 -6.378906 4.890625 -6.265625 C 5.203125 -6.148438 5.453125 -5.941406 5.640625 -5.640625 C 5.828125 -5.347656 5.921875 -5.015625 5.921875 -4.640625 C 5.921875 -4.148438 5.78125 -3.75 5.5 -3.4375 C 5.21875 -3.125 4.796875 -2.925781 4.234375 -2.84375 C 4.515625 -2.675781 4.742188 -2.492188 4.921875 -2.296875 C 5.109375 -2.109375 5.359375 -1.757813 5.671875 -1.25 L 6.453125 0 L 4.890625 0 L 3.953125 -1.40625 C 3.617188 -1.90625 3.390625 -2.21875 3.265625 -2.34375 C 3.140625 -2.476563 3.007813 -2.566406 2.875 -2.609375 C 2.738281 -2.660156 2.519531 -2.6875 2.21875 -2.6875 L 1.953125 -2.6875 L 1.953125 0 Z M 1.953125 -3.71875 L 2.921875 -3.71875 C 3.546875 -3.71875 3.9375 -3.742188 4.09375 -3.796875 C 4.25 -3.847656 4.367188 -3.9375 4.453125 -4.0625 C 4.546875 -4.195313 4.59375 -4.359375 4.59375 -4.546875 C 4.59375 -4.765625 4.53125 -4.941406 4.40625 -5.078125 C 4.289063 -5.210938 4.128906 -5.296875 3.921875 -5.328125 C 3.816406 -5.347656 3.5 -5.359375 2.96875 -5.359375 L 1.953125 -5.359375 Z M 1.953125 -3.71875 "
|
||||
id="path35" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-12">
|
||||
<path
|
||||
d="M 0.359375 -2.40625 C 0.359375 -2.8125 0.457031 -3.207031 0.65625 -3.59375 C 0.863281 -3.976563 1.148438 -4.269531 1.515625 -4.46875 C 1.890625 -4.664063 2.304688 -4.765625 2.765625 -4.765625 C 3.472656 -4.765625 4.050781 -4.535156 4.5 -4.078125 C 4.945313 -3.617188 5.171875 -3.039063 5.171875 -2.34375 C 5.171875 -1.632813 4.941406 -1.046875 4.484375 -0.578125 C 4.035156 -0.117188 3.460938 0.109375 2.765625 0.109375 C 2.335938 0.109375 1.929688 0.015625 1.546875 -0.171875 C 1.160156 -0.367188 0.863281 -0.65625 0.65625 -1.03125 C 0.457031 -1.40625 0.359375 -1.863281 0.359375 -2.40625 Z M 1.625 -2.328125 C 1.625 -1.867188 1.734375 -1.515625 1.953125 -1.265625 C 2.171875 -1.023438 2.441406 -0.90625 2.765625 -0.90625 C 3.085938 -0.90625 3.359375 -1.023438 3.578125 -1.265625 C 3.796875 -1.515625 3.90625 -1.875 3.90625 -2.34375 C 3.90625 -2.800781 3.796875 -3.148438 3.578125 -3.390625 C 3.359375 -3.640625 3.085938 -3.765625 2.765625 -3.765625 C 2.441406 -3.765625 2.171875 -3.640625 1.953125 -3.390625 C 1.734375 -3.148438 1.625 -2.796875 1.625 -2.328125 Z M 1.625 -2.328125 "
|
||||
id="path38" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-13">
|
||||
<path
|
||||
d="M 3.71875 0 L 3.71875 -0.703125 C 3.550781 -0.453125 3.328125 -0.253906 3.046875 -0.109375 C 2.765625 0.0351563 2.472656 0.109375 2.171875 0.109375 C 1.859375 0.109375 1.578125 0.0390625 1.328125 -0.09375 C 1.078125 -0.238281 0.894531 -0.4375 0.78125 -0.6875 C 0.675781 -0.9375 0.625 -1.28125 0.625 -1.71875 L 0.625 -4.671875 L 1.859375 -4.671875 L 1.859375 -2.515625 C 1.859375 -1.859375 1.878906 -1.457031 1.921875 -1.3125 C 1.960938 -1.164063 2.039063 -1.046875 2.15625 -0.953125 C 2.28125 -0.867188 2.4375 -0.828125 2.625 -0.828125 C 2.832031 -0.828125 3.019531 -0.882813 3.1875 -1 C 3.363281 -1.125 3.476563 -1.269531 3.53125 -1.4375 C 3.59375 -1.613281 3.625 -2.035156 3.625 -2.703125 L 3.625 -4.671875 L 4.859375 -4.671875 L 4.859375 0 Z M 3.71875 0 "
|
||||
id="path41" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-14">
|
||||
<path
|
||||
d="M 2.78125 -4.671875 L 2.78125 -3.6875 L 1.9375 -3.6875 L 1.9375 -1.796875 C 1.9375 -1.421875 1.941406 -1.203125 1.953125 -1.140625 C 1.972656 -1.078125 2.007813 -1.023438 2.0625 -0.984375 C 2.125 -0.941406 2.195313 -0.921875 2.28125 -0.921875 C 2.394531 -0.921875 2.5625 -0.957031 2.78125 -1.03125 L 2.890625 -0.078125 C 2.597656 0.046875 2.269531 0.109375 1.90625 0.109375 C 1.6875 0.109375 1.488281 0.0703125 1.3125 0 C 1.132813 -0.0820313 1.003906 -0.179688 0.921875 -0.296875 C 0.835938 -0.410156 0.78125 -0.570313 0.75 -0.78125 C 0.71875 -0.925781 0.703125 -1.210938 0.703125 -1.640625 L 0.703125 -3.6875 L 0.140625 -3.6875 L 0.140625 -4.671875 L 0.703125 -4.671875 L 0.703125 -5.59375 L 1.9375 -6.3125 L 1.9375 -4.671875 Z M 2.78125 -4.671875 "
|
||||
id="path44" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-15">
|
||||
<path
|
||||
d="M 1.828125 0 L 0.59375 0 L 0.59375 -4.671875 L 1.734375 -4.671875 L 1.734375 -4 C 1.929688 -4.3125 2.109375 -4.515625 2.265625 -4.609375 C 2.421875 -4.710938 2.597656 -4.765625 2.796875 -4.765625 C 3.078125 -4.765625 3.347656 -4.691406 3.609375 -4.546875 L 3.234375 -3.46875 C 3.023438 -3.601563 2.832031 -3.671875 2.65625 -3.671875 C 2.476563 -3.671875 2.328125 -3.617188 2.203125 -3.515625 C 2.085938 -3.421875 1.992188 -3.25 1.921875 -3 C 1.859375 -2.75 1.828125 -2.226563 1.828125 -1.4375 Z M 1.828125 0 "
|
||||
id="path47" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-0">
|
||||
<path
|
||||
d="M 1.125 0 L 1.125 -5.625 L 5.625 -5.625 L 5.625 0 Z M 1.265625 -0.140625 L 5.484375 -0.140625 L 5.484375 -5.484375 L 1.265625 -5.484375 Z M 1.265625 -0.140625 "
|
||||
id="path50" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-1">
|
||||
<path
|
||||
d="M 3.78125 -1.5 L 4.609375 -1.40625 C 4.472656 -0.925781 4.226563 -0.550781 3.875 -0.28125 C 3.53125 -0.0195313 3.085938 0.109375 2.546875 0.109375 C 1.867188 0.109375 1.328125 -0.0976563 0.921875 -0.515625 C 0.523438 -0.941406 0.328125 -1.535156 0.328125 -2.296875 C 0.328125 -3.078125 0.53125 -3.679688 0.9375 -4.109375 C 1.34375 -4.546875 1.867188 -4.765625 2.515625 -4.765625 C 3.140625 -4.765625 3.644531 -4.550781 4.03125 -4.125 C 4.425781 -3.707031 4.625 -3.113281 4.625 -2.34375 C 4.625 -2.289063 4.625 -2.21875 4.625 -2.125 L 1.140625 -2.125 C 1.171875 -1.613281 1.316406 -1.222656 1.578125 -0.953125 C 1.835938 -0.679688 2.164063 -0.546875 2.5625 -0.546875 C 2.851563 -0.546875 3.097656 -0.617188 3.296875 -0.765625 C 3.503906 -0.921875 3.664063 -1.164063 3.78125 -1.5 Z M 1.1875 -2.78125 L 3.796875 -2.78125 C 3.765625 -3.175781 3.664063 -3.472656 3.5 -3.671875 C 3.25 -3.972656 2.921875 -4.125 2.515625 -4.125 C 2.148438 -4.125 1.84375 -4 1.59375 -3.75 C 1.351563 -3.507813 1.21875 -3.1875 1.1875 -2.78125 Z M 1.1875 -2.78125 "
|
||||
id="path53" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-2">
|
||||
<path
|
||||
d="M 2.328125 -0.703125 L 2.4375 -0.015625 C 2.207031 0.0351563 2.007813 0.0625 1.84375 0.0625 C 1.550781 0.0625 1.328125 0.015625 1.171875 -0.078125 C 1.015625 -0.171875 0.898438 -0.289063 0.828125 -0.4375 C 0.765625 -0.582031 0.734375 -0.890625 0.734375 -1.359375 L 0.734375 -4.046875 L 0.15625 -4.046875 L 0.15625 -4.671875 L 0.734375 -4.671875 L 0.734375 -5.828125 L 1.53125 -6.296875 L 1.53125 -4.671875 L 2.328125 -4.671875 L 2.328125 -4.046875 L 1.53125 -4.046875 L 1.53125 -1.328125 C 1.53125 -1.097656 1.539063 -0.953125 1.5625 -0.890625 C 1.59375 -0.828125 1.640625 -0.773438 1.703125 -0.734375 C 1.765625 -0.691406 1.851563 -0.671875 1.96875 -0.671875 C 2.0625 -0.671875 2.179688 -0.679688 2.328125 -0.703125 Z M 2.328125 -0.703125 "
|
||||
id="path56" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-3">
|
||||
<path
|
||||
d="M 0.59375 0 L 0.59375 -6.4375 L 1.390625 -6.4375 L 1.390625 -4.125 C 1.753906 -4.550781 2.21875 -4.765625 2.78125 -4.765625 C 3.125 -4.765625 3.421875 -4.695313 3.671875 -4.5625 C 3.929688 -4.425781 4.113281 -4.238281 4.21875 -4 C 4.332031 -3.757813 4.390625 -3.410156 4.390625 -2.953125 L 4.390625 0 L 3.609375 0 L 3.609375 -2.953125 C 3.609375 -3.347656 3.519531 -3.632813 3.34375 -3.8125 C 3.175781 -4 2.9375 -4.09375 2.625 -4.09375 C 2.382813 -4.09375 2.160156 -4.03125 1.953125 -3.90625 C 1.742188 -3.789063 1.597656 -3.628906 1.515625 -3.421875 C 1.429688 -3.210938 1.390625 -2.921875 1.390625 -2.546875 L 1.390625 0 Z M 0.59375 0 "
|
||||
id="path59" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-4">
|
||||
<path
|
||||
d="M 0.375 -3.171875 C 0.375 -3.929688 0.453125 -4.546875 0.609375 -5.015625 C 0.765625 -5.484375 0.992188 -5.84375 1.296875 -6.09375 C 1.609375 -6.34375 2 -6.46875 2.46875 -6.46875 C 2.820313 -6.46875 3.128906 -6.394531 3.390625 -6.25 C 3.648438 -6.113281 3.863281 -5.914063 4.03125 -5.65625 C 4.195313 -5.394531 4.328125 -5.078125 4.421875 -4.703125 C 4.523438 -4.328125 4.578125 -3.816406 4.578125 -3.171875 C 4.578125 -2.421875 4.5 -1.8125 4.34375 -1.34375 C 4.1875 -0.882813 3.953125 -0.523438 3.640625 -0.265625 C 3.335938 -0.015625 2.945313 0.109375 2.46875 0.109375 C 1.851563 0.109375 1.367188 -0.113281 1.015625 -0.5625 C 0.585938 -1.09375 0.375 -1.960938 0.375 -3.171875 Z M 1.1875 -3.171875 C 1.1875 -2.117188 1.304688 -1.414063 1.546875 -1.0625 C 1.796875 -0.71875 2.101563 -0.546875 2.46875 -0.546875 C 2.832031 -0.546875 3.140625 -0.71875 3.390625 -1.0625 C 3.640625 -1.414063 3.765625 -2.117188 3.765625 -3.171875 C 3.765625 -4.234375 3.640625 -4.9375 3.390625 -5.28125 C 3.140625 -5.632813 2.832031 -5.8125 2.46875 -5.8125 C 2.101563 -5.8125 1.8125 -5.660156 1.59375 -5.359375 C 1.320313 -4.960938 1.1875 -4.234375 1.1875 -3.171875 Z M 1.1875 -3.171875 "
|
||||
id="path62" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-5">
|
||||
<path
|
||||
d="M 0.8125 -3.765625 L 0.8125 -4.671875 L 1.71875 -4.671875 L 1.71875 -3.765625 Z M 0.8125 0 L 0.8125 -0.90625 L 1.71875 -0.90625 L 1.71875 0 Z M 0.8125 0 "
|
||||
id="path65" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-6">
|
||||
<path
|
||||
d="M 3.359375 0 L 2.5625 0 L 2.5625 -5.046875 C 2.375 -4.859375 2.125 -4.671875 1.8125 -4.484375 C 1.5 -4.304688 1.222656 -4.175781 0.984375 -4.09375 L 0.984375 -4.859375 C 1.421875 -5.054688 1.804688 -5.300781 2.140625 -5.59375 C 2.472656 -5.894531 2.707031 -6.1875 2.84375 -6.46875 L 3.359375 -6.46875 Z M 3.359375 0 "
|
||||
id="path68" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-7">
|
||||
<path
|
||||
d="M 4.53125 -0.765625 L 4.53125 0 L 0.265625 0 C 0.265625 -0.1875 0.296875 -0.367188 0.359375 -0.546875 C 0.472656 -0.835938 0.648438 -1.125 0.890625 -1.40625 C 1.128906 -1.6875 1.472656 -2.007813 1.921875 -2.375 C 2.617188 -2.957031 3.085938 -3.414063 3.328125 -3.75 C 3.578125 -4.082031 3.703125 -4.398438 3.703125 -4.703125 C 3.703125 -5.015625 3.585938 -5.273438 3.359375 -5.484375 C 3.140625 -5.703125 2.851563 -5.8125 2.5 -5.8125 C 2.113281 -5.8125 1.804688 -5.695313 1.578125 -5.46875 C 1.347656 -5.238281 1.234375 -4.921875 1.234375 -4.515625 L 0.421875 -4.609375 C 0.472656 -5.210938 0.679688 -5.671875 1.046875 -5.984375 C 1.410156 -6.304688 1.898438 -6.46875 2.515625 -6.46875 C 3.128906 -6.46875 3.613281 -6.296875 3.96875 -5.953125 C 4.332031 -5.609375 4.515625 -5.1875 4.515625 -4.6875 C 4.515625 -4.425781 4.460938 -4.171875 4.359375 -3.921875 C 4.253906 -3.671875 4.078125 -3.40625 3.828125 -3.125 C 3.585938 -2.851563 3.1875 -2.476563 2.625 -2 C 2.144531 -1.601563 1.835938 -1.332031 1.703125 -1.1875 C 1.566406 -1.039063 1.457031 -0.898438 1.375 -0.765625 Z M 4.53125 -0.765625 "
|
||||
id="path71" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-8">
|
||||
<path
|
||||
d="M 3.625 0 L 3.625 -0.59375 C 3.320313 -0.125 2.882813 0.109375 2.3125 0.109375 C 1.945313 0.109375 1.609375 0.00390625 1.296875 -0.203125 C 0.984375 -0.410156 0.738281 -0.695313 0.5625 -1.0625 C 0.394531 -1.425781 0.3125 -1.847656 0.3125 -2.328125 C 0.3125 -2.796875 0.390625 -3.21875 0.546875 -3.59375 C 0.703125 -3.976563 0.929688 -4.269531 1.234375 -4.46875 C 1.546875 -4.664063 1.894531 -4.765625 2.28125 -4.765625 C 2.5625 -4.765625 2.8125 -4.707031 3.03125 -4.59375 C 3.25 -4.476563 3.425781 -4.320313 3.5625 -4.125 L 3.5625 -6.4375 L 4.359375 -6.4375 L 4.359375 0 Z M 1.125 -2.328125 C 1.125 -1.734375 1.25 -1.285156 1.5 -0.984375 C 1.75 -0.691406 2.046875 -0.546875 2.390625 -0.546875 C 2.734375 -0.546875 3.023438 -0.6875 3.265625 -0.96875 C 3.515625 -1.25 3.640625 -1.679688 3.640625 -2.265625 C 3.640625 -2.898438 3.515625 -3.367188 3.265625 -3.671875 C 3.015625 -3.972656 2.710938 -4.125 2.359375 -4.125 C 2.003906 -4.125 1.707031 -3.976563 1.46875 -3.6875 C 1.238281 -3.394531 1.125 -2.941406 1.125 -2.328125 Z M 1.125 -2.328125 "
|
||||
id="path74" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-9">
|
||||
<path
|
||||
d="M 1.328125 0 L 0.59375 0 L 0.59375 -6.4375 L 1.375 -6.4375 L 1.375 -4.140625 C 1.707031 -4.554688 2.132813 -4.765625 2.65625 -4.765625 C 2.945313 -4.765625 3.21875 -4.707031 3.46875 -4.59375 C 3.726563 -4.476563 3.941406 -4.316406 4.109375 -4.109375 C 4.273438 -3.898438 4.40625 -3.644531 4.5 -3.34375 C 4.59375 -3.050781 4.640625 -2.738281 4.640625 -2.40625 C 4.640625 -1.601563 4.441406 -0.984375 4.046875 -0.546875 C 3.648438 -0.109375 3.175781 0.109375 2.625 0.109375 C 2.070313 0.109375 1.640625 -0.117188 1.328125 -0.578125 Z M 1.3125 -2.375 C 1.3125 -1.8125 1.390625 -1.40625 1.546875 -1.15625 C 1.796875 -0.75 2.128906 -0.546875 2.546875 -0.546875 C 2.898438 -0.546875 3.203125 -0.695313 3.453125 -1 C 3.703125 -1.300781 3.828125 -1.75 3.828125 -2.34375 C 3.828125 -2.945313 3.707031 -3.394531 3.46875 -3.6875 C 3.226563 -3.976563 2.9375 -4.125 2.59375 -4.125 C 2.238281 -4.125 1.9375 -3.972656 1.6875 -3.671875 C 1.4375 -3.367188 1.3125 -2.9375 1.3125 -2.375 Z M 1.3125 -2.375 "
|
||||
id="path77" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-10">
|
||||
<path
|
||||
d="M 1.59375 -3.5 C 1.257813 -3.613281 1.015625 -3.78125 0.859375 -4 C 0.703125 -4.226563 0.625 -4.5 0.625 -4.8125 C 0.625 -5.28125 0.789063 -5.671875 1.125 -5.984375 C 1.46875 -6.304688 1.914063 -6.46875 2.46875 -6.46875 C 3.03125 -6.46875 3.484375 -6.300781 3.828125 -5.96875 C 4.171875 -5.644531 4.34375 -5.25 4.34375 -4.78125 C 4.34375 -4.488281 4.265625 -4.226563 4.109375 -4 C 3.953125 -3.78125 3.710938 -3.613281 3.390625 -3.5 C 3.785156 -3.363281 4.085938 -3.148438 4.296875 -2.859375 C 4.503906 -2.578125 4.609375 -2.238281 4.609375 -1.84375 C 4.609375 -1.289063 4.410156 -0.828125 4.015625 -0.453125 C 3.628906 -0.078125 3.117188 0.109375 2.484375 0.109375 C 1.847656 0.109375 1.332031 -0.078125 0.9375 -0.453125 C 0.550781 -0.828125 0.359375 -1.296875 0.359375 -1.859375 C 0.359375 -2.273438 0.460938 -2.625 0.671875 -2.90625 C 0.890625 -3.195313 1.195313 -3.394531 1.59375 -3.5 Z M 1.4375 -4.828125 C 1.4375 -4.523438 1.53125 -4.273438 1.71875 -4.078125 C 1.914063 -3.890625 2.171875 -3.796875 2.484375 -3.796875 C 2.796875 -3.796875 3.046875 -3.890625 3.234375 -4.078125 C 3.429688 -4.273438 3.53125 -4.515625 3.53125 -4.796875 C 3.53125 -5.078125 3.429688 -5.316406 3.234375 -5.515625 C 3.035156 -5.710938 2.785156 -5.8125 2.484375 -5.8125 C 2.179688 -5.8125 1.929688 -5.710938 1.734375 -5.515625 C 1.535156 -5.328125 1.4375 -5.097656 1.4375 -4.828125 Z M 1.171875 -1.859375 C 1.171875 -1.628906 1.222656 -1.410156 1.328125 -1.203125 C 1.441406 -0.992188 1.601563 -0.832031 1.8125 -0.71875 C 2.019531 -0.601563 2.25 -0.546875 2.5 -0.546875 C 2.875 -0.546875 3.179688 -0.664063 3.421875 -0.90625 C 3.671875 -1.144531 3.796875 -1.453125 3.796875 -1.828125 C 3.796875 -2.210938 3.671875 -2.53125 3.421875 -2.78125 C 3.171875 -3.03125 2.851563 -3.15625 2.46875 -3.15625 C 2.09375 -3.15625 1.78125 -3.03125 1.53125 -2.78125 C 1.289063 -2.53125 1.171875 -2.222656 1.171875 -1.859375 Z M 1.171875 -1.859375 "
|
||||
id="path80" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-11">
|
||||
<path
|
||||
d="M 0 0.109375 L 1.875 -6.546875 L 2.5 -6.546875 L 0.640625 0.109375 Z M 0 0.109375 "
|
||||
id="path83" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-12">
|
||||
<path
|
||||
d="M 4.484375 -4.859375 L 3.6875 -4.796875 C 3.625 -5.109375 3.523438 -5.335938 3.390625 -5.484375 C 3.179688 -5.703125 2.921875 -5.8125 2.609375 -5.8125 C 2.347656 -5.8125 2.125 -5.742188 1.9375 -5.609375 C 1.6875 -5.421875 1.488281 -5.15625 1.34375 -4.8125 C 1.207031 -4.46875 1.132813 -3.972656 1.125 -3.328125 C 1.3125 -3.609375 1.539063 -3.816406 1.8125 -3.953125 C 2.09375 -4.097656 2.382813 -4.171875 2.6875 -4.171875 C 3.21875 -4.171875 3.664063 -3.976563 4.03125 -3.59375 C 4.40625 -3.207031 4.59375 -2.707031 4.59375 -2.09375 C 4.59375 -1.6875 4.503906 -1.304688 4.328125 -0.953125 C 4.148438 -0.609375 3.910156 -0.34375 3.609375 -0.15625 C 3.304688 0.0195313 2.960938 0.109375 2.578125 0.109375 C 1.921875 0.109375 1.382813 -0.128906 0.96875 -0.609375 C 0.550781 -1.097656 0.34375 -1.898438 0.34375 -3.015625 C 0.34375 -4.253906 0.570313 -5.160156 1.03125 -5.734375 C 1.425781 -6.222656 1.96875 -6.46875 2.65625 -6.46875 C 3.15625 -6.46875 3.566406 -6.320313 3.890625 -6.03125 C 4.210938 -5.75 4.410156 -5.359375 4.484375 -4.859375 Z M 1.25 -2.09375 C 1.25 -1.8125 1.304688 -1.546875 1.421875 -1.296875 C 1.535156 -1.054688 1.695313 -0.867188 1.90625 -0.734375 C 2.113281 -0.609375 2.332031 -0.546875 2.5625 -0.546875 C 2.894531 -0.546875 3.179688 -0.675781 3.421875 -0.9375 C 3.660156 -1.207031 3.78125 -1.578125 3.78125 -2.046875 C 3.78125 -2.492188 3.660156 -2.84375 3.421875 -3.09375 C 3.191406 -3.351563 2.894531 -3.484375 2.53125 -3.484375 C 2.175781 -3.484375 1.875 -3.351563 1.625 -3.09375 C 1.375 -2.84375 1.25 -2.507813 1.25 -2.09375 Z M 1.25 -2.09375 "
|
||||
id="path86" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-13">
|
||||
<path
|
||||
d="M 2.90625 0 L 2.90625 -1.546875 L 0.109375 -1.546875 L 0.109375 -2.265625 L 3.046875 -6.4375 L 3.703125 -6.4375 L 3.703125 -2.265625 L 4.578125 -2.265625 L 4.578125 -1.546875 L 3.703125 -1.546875 L 3.703125 0 Z M 2.90625 -2.265625 L 2.90625 -5.171875 L 0.890625 -2.265625 Z M 2.90625 -2.265625 "
|
||||
id="path89" />
|
||||
</g>
|
||||
</g>
|
||||
<clipPath
|
||||
id="clip-0">
|
||||
<path
|
||||
clip-rule="nonzero"
|
||||
d="M 0 56 L 168 56 L 168 69.75 L 0 69.75 Z M 0 56 "
|
||||
id="path94" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(100%, 94.898987%, 79.998779%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(83.918762%, 71.369934%, 33.729553%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 1 0.5 L 81.000003 0.5 L 81.000003 49.000002 L 1 49.000002 Z M 1 0.5 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0.375, 0.375)"
|
||||
id="path99" />
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g115">
|
||||
<use
|
||||
xlink:href="#glyph-0-1"
|
||||
x="12.738281"
|
||||
y="17.249998"
|
||||
id="use101" />
|
||||
<use
|
||||
xlink:href="#glyph-0-2"
|
||||
x="17.743652"
|
||||
y="17.249998"
|
||||
id="use103" />
|
||||
<use
|
||||
xlink:href="#glyph-0-3"
|
||||
x="22.749022"
|
||||
y="17.249998"
|
||||
id="use105" />
|
||||
<use
|
||||
xlink:href="#glyph-0-4"
|
||||
x="27.754393"
|
||||
y="17.249998"
|
||||
id="use107" />
|
||||
<use
|
||||
xlink:href="#glyph-0-5"
|
||||
x="35.756832"
|
||||
y="17.249998"
|
||||
id="use109" />
|
||||
<use
|
||||
xlink:href="#glyph-0-6"
|
||||
x="41.254395"
|
||||
y="17.249998"
|
||||
id="use111" />
|
||||
<use
|
||||
xlink:href="#glyph-0-1"
|
||||
x="43.754883"
|
||||
y="17.249998"
|
||||
id="use113" />
|
||||
</g>
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g125">
|
||||
<use
|
||||
xlink:href="#glyph-1-1"
|
||||
x="21.234373"
|
||||
y="32.25"
|
||||
id="use117" />
|
||||
<use
|
||||
xlink:href="#glyph-1-2"
|
||||
x="26.239744"
|
||||
y="32.25"
|
||||
id="use119" />
|
||||
<use
|
||||
xlink:href="#glyph-1-3"
|
||||
x="28.740232"
|
||||
y="32.25"
|
||||
id="use121" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="33.745605"
|
||||
y="32.25"
|
||||
id="use123" />
|
||||
</g>
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(0%, 0%, 0%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 41.000002 89.000004 L 41.000002 49.000002 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0.375, 0.375)"
|
||||
id="path127" />
|
||||
<g
|
||||
clip-path="url(#clip-0)"
|
||||
id="g131">
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="#000000"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="m 1,89.000004 219.00001,1.5"
|
||||
transform="matrix(0.75,0,0,0.75,0.375,0.375)"
|
||||
id="path129" />
|
||||
</g>
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(100%, 100%, 100%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(0%, 0%, 0%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 140.000006 0.5 L 220.000009 0.5 L 220.000009 50.500002 L 140.000006 50.500002 Z M 140.000006 0.5 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0.375, 0.375)"
|
||||
id="path133" />
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g143">
|
||||
<use
|
||||
xlink:href="#glyph-0-7"
|
||||
x="125.73046"
|
||||
y="16.499998"
|
||||
id="use135" />
|
||||
<use
|
||||
xlink:href="#glyph-0-8"
|
||||
x="128.23096"
|
||||
y="16.499998"
|
||||
id="use137" />
|
||||
<use
|
||||
xlink:href="#glyph-0-9"
|
||||
x="134.23389"
|
||||
y="16.499998"
|
||||
id="use139" />
|
||||
<use
|
||||
xlink:href="#glyph-0-10"
|
||||
x="139.23926"
|
||||
y="16.499998"
|
||||
id="use141" />
|
||||
</g>
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g157">
|
||||
<use
|
||||
xlink:href="#glyph-0-11"
|
||||
x="120.49218"
|
||||
y="27.749998"
|
||||
id="use145" />
|
||||
<use
|
||||
xlink:href="#glyph-0-12"
|
||||
x="126.99169"
|
||||
y="27.749998"
|
||||
id="use147" />
|
||||
<use
|
||||
xlink:href="#glyph-0-13"
|
||||
x="132.48926"
|
||||
y="27.749998"
|
||||
id="use149" />
|
||||
<use
|
||||
xlink:href="#glyph-0-14"
|
||||
x="137.98682"
|
||||
y="27.749998"
|
||||
id="use151" />
|
||||
<use
|
||||
xlink:href="#glyph-0-1"
|
||||
x="140.98389"
|
||||
y="27.749998"
|
||||
id="use153" />
|
||||
<use
|
||||
xlink:href="#glyph-0-15"
|
||||
x="145.98926"
|
||||
y="27.749998"
|
||||
id="use155" />
|
||||
</g>
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(0%, 0%, 0%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 182.000008 90.000004 L 182.000008 50.000002 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0.375, 0.375)"
|
||||
id="path159" />
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g167">
|
||||
<use
|
||||
xlink:href="#glyph-1-5"
|
||||
x="138.99609"
|
||||
y="49.499996"
|
||||
id="use161" />
|
||||
<use
|
||||
xlink:href="#glyph-1-5"
|
||||
x="141.49658"
|
||||
y="49.499996"
|
||||
id="use163" />
|
||||
<use
|
||||
xlink:href="#glyph-1-6"
|
||||
x="143.99707"
|
||||
y="49.499996"
|
||||
id="use165" />
|
||||
</g>
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g205">
|
||||
<use
|
||||
xlink:href="#glyph-1-7"
|
||||
x="52.464844"
|
||||
y="60.749996"
|
||||
id="use169" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="57.470211"
|
||||
y="60.749996"
|
||||
id="use171" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="62.475582"
|
||||
y="60.749996"
|
||||
id="use173" />
|
||||
<use
|
||||
xlink:href="#glyph-1-6"
|
||||
x="67.480957"
|
||||
y="60.749996"
|
||||
id="use175" />
|
||||
<use
|
||||
xlink:href="#glyph-1-5"
|
||||
x="72.486328"
|
||||
y="60.749996"
|
||||
id="use177" />
|
||||
<use
|
||||
xlink:href="#glyph-1-8"
|
||||
x="74.986816"
|
||||
y="60.749996"
|
||||
id="use179" />
|
||||
<use
|
||||
xlink:href="#glyph-1-9"
|
||||
x="79.992188"
|
||||
y="60.749996"
|
||||
id="use181" />
|
||||
<use
|
||||
xlink:href="#glyph-1-10"
|
||||
x="84.997559"
|
||||
y="60.749996"
|
||||
id="use183" />
|
||||
<use
|
||||
xlink:href="#glyph-1-5"
|
||||
x="90.00293"
|
||||
y="60.749996"
|
||||
id="use185" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="92.50341"
|
||||
y="60.749996"
|
||||
id="use187" />
|
||||
<use
|
||||
xlink:href="#glyph-1-5"
|
||||
x="97.508781"
|
||||
y="60.749996"
|
||||
id="use189" />
|
||||
<use
|
||||
xlink:href="#glyph-1-6"
|
||||
x="100.00927"
|
||||
y="60.749996"
|
||||
id="use191" />
|
||||
<use
|
||||
xlink:href="#glyph-1-5"
|
||||
x="105.01464"
|
||||
y="60.749996"
|
||||
id="use193" />
|
||||
<use
|
||||
xlink:href="#glyph-1-5"
|
||||
x="107.51513"
|
||||
y="60.749996"
|
||||
id="use195" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="110.01562"
|
||||
y="60.749996"
|
||||
id="use197" />
|
||||
<use
|
||||
xlink:href="#glyph-1-11"
|
||||
x="115.02099"
|
||||
y="60.749996"
|
||||
id="use199" />
|
||||
<use
|
||||
xlink:href="#glyph-1-12"
|
||||
x="117.52148"
|
||||
y="60.749996"
|
||||
id="use201" />
|
||||
<use
|
||||
xlink:href="#glyph-1-13"
|
||||
x="122.52685"
|
||||
y="60.749996"
|
||||
id="use203" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 33 KiB |
@@ -0,0 +1,338 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="145.919998pt"
|
||||
height="73.919998pt"
|
||||
viewBox="0 0 145.919998 73.919998"
|
||||
version="1.1"
|
||||
id="svg139"
|
||||
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="defs67">
|
||||
<g
|
||||
id="g65">
|
||||
<g
|
||||
id="glyph-0-0">
|
||||
<path
|
||||
d="M 1.125 0 L 1.125 -5.640625 L 5.640625 -5.640625 L 5.640625 0 Z M 1.265625 -0.140625 L 5.5 -0.140625 L 5.5 -5.5 L 1.265625 -5.5 Z M 1.265625 -0.140625 "
|
||||
id="path2" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-1">
|
||||
<path
|
||||
d="M 3.359375 -1.484375 L 4.59375 -1.28125 C 4.4375 -0.832031 4.1875 -0.488281 3.84375 -0.25 C 3.5 -0.0078125 3.070313 0.109375 2.5625 0.109375 C 1.75 0.109375 1.144531 -0.15625 0.75 -0.6875 C 0.4375 -1.113281 0.28125 -1.65625 0.28125 -2.3125 C 0.28125 -3.082031 0.484375 -3.6875 0.890625 -4.125 C 1.296875 -4.5625 1.8125 -4.78125 2.4375 -4.78125 C 3.132813 -4.78125 3.679688 -4.550781 4.078125 -4.09375 C 4.484375 -3.632813 4.675781 -2.929688 4.65625 -1.984375 L 1.5625 -1.984375 C 1.5625 -1.617188 1.65625 -1.332031 1.84375 -1.125 C 2.039063 -0.914063 2.285156 -0.8125 2.578125 -0.8125 C 2.765625 -0.8125 2.925781 -0.863281 3.0625 -0.96875 C 3.195313 -1.082031 3.296875 -1.253906 3.359375 -1.484375 Z M 3.4375 -2.75 C 3.425781 -3.101563 3.332031 -3.375 3.15625 -3.5625 C 2.976563 -3.75 2.765625 -3.84375 2.515625 -3.84375 C 2.242188 -3.84375 2.019531 -3.742188 1.84375 -3.546875 C 1.664063 -3.347656 1.578125 -3.082031 1.578125 -2.75 Z M 3.4375 -2.75 "
|
||||
id="path5" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-2">
|
||||
<path
|
||||
d="M 0.046875 0 L 1.734375 -2.40625 L 0.125 -4.6875 L 1.640625 -4.6875 L 2.46875 -3.390625 L 3.34375 -4.6875 L 4.796875 -4.6875 L 3.203125 -2.46875 L 4.9375 0 L 3.421875 0 L 2.46875 -1.453125 L 1.5 0 Z M 0.046875 0 "
|
||||
id="path8" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-3">
|
||||
<path
|
||||
d="M 1.578125 -3.25 L 0.453125 -3.453125 C 0.578125 -3.910156 0.789063 -4.242188 1.09375 -4.453125 C 1.40625 -4.671875 1.867188 -4.78125 2.484375 -4.78125 C 3.035156 -4.78125 3.445313 -4.710938 3.71875 -4.578125 C 3.988281 -4.453125 4.175781 -4.289063 4.28125 -4.09375 C 4.394531 -3.894531 4.453125 -3.523438 4.453125 -2.984375 L 4.4375 -1.53125 C 4.4375 -1.125 4.457031 -0.820313 4.5 -0.625 C 4.539063 -0.425781 4.613281 -0.21875 4.71875 0 L 3.5 0 C 3.457031 -0.0820313 3.414063 -0.203125 3.375 -0.359375 C 3.351563 -0.429688 3.335938 -0.484375 3.328125 -0.515625 C 3.117188 -0.304688 2.890625 -0.148438 2.640625 -0.046875 C 2.398438 0.0546875 2.144531 0.109375 1.875 0.109375 C 1.394531 0.109375 1.015625 -0.0195313 0.734375 -0.28125 C 0.460938 -0.539063 0.328125 -0.875 0.328125 -1.28125 C 0.328125 -1.539063 0.390625 -1.773438 0.515625 -1.984375 C 0.640625 -2.191406 0.816406 -2.347656 1.046875 -2.453125 C 1.273438 -2.566406 1.601563 -2.664063 2.03125 -2.75 C 2.601563 -2.863281 3.003906 -2.96875 3.234375 -3.0625 L 3.234375 -3.171875 C 3.234375 -3.410156 3.171875 -3.582031 3.046875 -3.6875 C 2.929688 -3.789063 2.710938 -3.84375 2.390625 -3.84375 C 2.171875 -3.84375 2 -3.796875 1.875 -3.703125 C 1.75 -3.617188 1.648438 -3.46875 1.578125 -3.25 Z M 3.234375 -2.25 C 3.078125 -2.195313 2.828125 -2.132813 2.484375 -2.0625 C 2.140625 -1.988281 1.910156 -1.914063 1.796875 -1.84375 C 1.640625 -1.726563 1.5625 -1.582031 1.5625 -1.40625 C 1.5625 -1.226563 1.625 -1.078125 1.75 -0.953125 C 1.882813 -0.828125 2.050781 -0.765625 2.25 -0.765625 C 2.46875 -0.765625 2.679688 -0.835938 2.890625 -0.984375 C 3.035156 -1.097656 3.132813 -1.234375 3.1875 -1.390625 C 3.21875 -1.503906 3.234375 -1.707031 3.234375 -2 Z M 3.234375 -2.25 "
|
||||
id="path11" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-4">
|
||||
<path
|
||||
d="M 0.5625 -4.6875 L 1.703125 -4.6875 L 1.703125 -4.046875 C 2.109375 -4.535156 2.59375 -4.78125 3.15625 -4.78125 C 3.457031 -4.78125 3.71875 -4.71875 3.9375 -4.59375 C 4.15625 -4.476563 4.335938 -4.296875 4.484375 -4.046875 C 4.679688 -4.296875 4.898438 -4.476563 5.140625 -4.59375 C 5.378906 -4.71875 5.632813 -4.78125 5.90625 -4.78125 C 6.25 -4.78125 6.539063 -4.710938 6.78125 -4.578125 C 7.019531 -4.441406 7.195313 -4.238281 7.3125 -3.96875 C 7.394531 -3.769531 7.4375 -3.445313 7.4375 -3 L 7.4375 0 L 6.203125 0 L 6.203125 -2.671875 C 6.203125 -3.140625 6.160156 -3.441406 6.078125 -3.578125 C 5.960938 -3.753906 5.785156 -3.84375 5.546875 -3.84375 C 5.367188 -3.84375 5.203125 -3.785156 5.046875 -3.671875 C 4.898438 -3.566406 4.789063 -3.410156 4.71875 -3.203125 C 4.65625 -3.003906 4.625 -2.6875 4.625 -2.25 L 4.625 0 L 3.390625 0 L 3.390625 -2.5625 C 3.390625 -3.019531 3.363281 -3.3125 3.3125 -3.4375 C 3.269531 -3.570313 3.203125 -3.671875 3.109375 -3.734375 C 3.023438 -3.804688 2.898438 -3.84375 2.734375 -3.84375 C 2.546875 -3.84375 2.375 -3.789063 2.21875 -3.6875 C 2.070313 -3.582031 1.960938 -3.429688 1.890625 -3.234375 C 1.828125 -3.046875 1.796875 -2.726563 1.796875 -2.28125 L 1.796875 0 L 0.5625 0 Z M 0.5625 -4.6875 "
|
||||
id="path14" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-5">
|
||||
<path
|
||||
d="M 0.609375 -4.6875 L 1.765625 -4.6875 L 1.765625 -4 C 1.921875 -4.226563 2.125 -4.414063 2.375 -4.5625 C 2.632813 -4.707031 2.921875 -4.78125 3.234375 -4.78125 C 3.773438 -4.78125 4.234375 -4.566406 4.609375 -4.140625 C 4.992188 -3.722656 5.1875 -3.132813 5.1875 -2.375 C 5.1875 -1.582031 4.992188 -0.96875 4.609375 -0.53125 C 4.222656 -0.101563 3.757813 0.109375 3.21875 0.109375 C 2.957031 0.109375 2.722656 0.0546875 2.515625 -0.046875 C 2.304688 -0.148438 2.085938 -0.328125 1.859375 -0.578125 L 1.859375 1.78125 L 0.609375 1.78125 Z M 1.84375 -2.421875 C 1.84375 -1.890625 1.945313 -1.5 2.15625 -1.25 C 2.363281 -1 2.617188 -0.875 2.921875 -0.875 C 3.203125 -0.875 3.4375 -0.988281 3.625 -1.21875 C 3.820313 -1.445313 3.921875 -1.828125 3.921875 -2.359375 C 3.921875 -2.847656 3.820313 -3.210938 3.625 -3.453125 C 3.425781 -3.691406 3.179688 -3.8125 2.890625 -3.8125 C 2.585938 -3.8125 2.335938 -3.691406 2.140625 -3.453125 C 1.941406 -3.222656 1.84375 -2.878906 1.84375 -2.421875 Z M 1.84375 -2.421875 "
|
||||
id="path17" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-6">
|
||||
<path
|
||||
d="M 0.640625 0 L 0.640625 -6.46875 L 1.890625 -6.46875 L 1.890625 0 Z M 0.640625 0 "
|
||||
id="path20" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-0">
|
||||
<path
|
||||
d="M 1.125 0 L 1.125 -5.640625 L 5.640625 -5.640625 L 5.640625 0 Z M 1.265625 -0.140625 L 5.5 -0.140625 L 5.5 -5.5 L 1.265625 -5.5 Z M 1.265625 -0.140625 "
|
||||
id="path23" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-1">
|
||||
<path
|
||||
d="M 3.796875 -1.515625 L 4.625 -1.40625 C 4.488281 -0.925781 4.242188 -0.550781 3.890625 -0.28125 C 3.546875 -0.0195313 3.101563 0.109375 2.5625 0.109375 C 1.875 0.109375 1.328125 -0.0976563 0.921875 -0.515625 C 0.523438 -0.941406 0.328125 -1.535156 0.328125 -2.296875 C 0.328125 -3.085938 0.53125 -3.695313 0.9375 -4.125 C 1.34375 -4.5625 1.867188 -4.78125 2.515625 -4.78125 C 3.140625 -4.78125 3.648438 -4.566406 4.046875 -4.140625 C 4.441406 -3.722656 4.640625 -3.125 4.640625 -2.34375 C 4.640625 -2.300781 4.640625 -2.234375 4.640625 -2.140625 L 1.15625 -2.140625 C 1.175781 -1.617188 1.316406 -1.222656 1.578125 -0.953125 C 1.847656 -0.679688 2.175781 -0.546875 2.5625 -0.546875 C 2.851563 -0.546875 3.101563 -0.617188 3.3125 -0.765625 C 3.519531 -0.921875 3.679688 -1.171875 3.796875 -1.515625 Z M 1.1875 -2.796875 L 3.8125 -2.796875 C 3.769531 -3.179688 3.671875 -3.472656 3.515625 -3.671875 C 3.253906 -3.984375 2.925781 -4.140625 2.53125 -4.140625 C 2.164063 -4.140625 1.859375 -4.015625 1.609375 -3.765625 C 1.359375 -3.523438 1.21875 -3.203125 1.1875 -2.796875 Z M 1.1875 -2.796875 "
|
||||
id="path26" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-2">
|
||||
<path
|
||||
d="M 2.328125 -0.703125 L 2.4375 -0.015625 C 2.21875 0.0351563 2.019531 0.0625 1.84375 0.0625 C 1.550781 0.0625 1.328125 0.015625 1.171875 -0.078125 C 1.015625 -0.171875 0.898438 -0.289063 0.828125 -0.4375 C 0.765625 -0.582031 0.734375 -0.894531 0.734375 -1.375 L 0.734375 -4.0625 L 0.15625 -4.0625 L 0.15625 -4.6875 L 0.734375 -4.6875 L 0.734375 -5.84375 L 1.53125 -6.3125 L 1.53125 -4.6875 L 2.328125 -4.6875 L 2.328125 -4.0625 L 1.53125 -4.0625 L 1.53125 -1.328125 C 1.53125 -1.097656 1.539063 -0.953125 1.5625 -0.890625 C 1.59375 -0.828125 1.640625 -0.773438 1.703125 -0.734375 C 1.765625 -0.691406 1.859375 -0.671875 1.984375 -0.671875 C 2.066406 -0.671875 2.179688 -0.679688 2.328125 -0.703125 Z M 2.328125 -0.703125 "
|
||||
id="path29" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-3">
|
||||
<path
|
||||
d="M 0.59375 0 L 0.59375 -6.46875 L 1.390625 -6.46875 L 1.390625 -4.140625 C 1.753906 -4.566406 2.222656 -4.78125 2.796875 -4.78125 C 3.140625 -4.78125 3.4375 -4.710938 3.6875 -4.578125 C 3.945313 -4.441406 4.128906 -4.253906 4.234375 -4.015625 C 4.347656 -3.773438 4.40625 -3.425781 4.40625 -2.96875 L 4.40625 0 L 3.609375 0 L 3.609375 -2.96875 C 3.609375 -3.363281 3.519531 -3.648438 3.34375 -3.828125 C 3.175781 -4.015625 2.9375 -4.109375 2.625 -4.109375 C 2.394531 -4.109375 2.175781 -4.046875 1.96875 -3.921875 C 1.757813 -3.796875 1.609375 -3.628906 1.515625 -3.421875 C 1.429688 -3.210938 1.390625 -2.925781 1.390625 -2.5625 L 1.390625 0 Z M 0.59375 0 "
|
||||
id="path32" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-4">
|
||||
<path
|
||||
d="M 0.375 -3.1875 C 0.375 -3.945313 0.453125 -4.5625 0.609375 -5.03125 C 0.765625 -5.5 1 -5.859375 1.3125 -6.109375 C 1.625 -6.359375 2.015625 -6.484375 2.484375 -6.484375 C 2.828125 -6.484375 3.128906 -6.414063 3.390625 -6.28125 C 3.648438 -6.144531 3.863281 -5.941406 4.03125 -5.671875 C 4.207031 -5.410156 4.34375 -5.09375 4.4375 -4.71875 C 4.539063 -4.34375 4.59375 -3.832031 4.59375 -3.1875 C 4.59375 -2.425781 4.515625 -1.8125 4.359375 -1.34375 C 4.203125 -0.882813 3.96875 -0.523438 3.65625 -0.265625 C 3.34375 -0.015625 2.953125 0.109375 2.484375 0.109375 C 1.859375 0.109375 1.367188 -0.113281 1.015625 -0.5625 C 0.585938 -1.09375 0.375 -1.96875 0.375 -3.1875 Z M 1.1875 -3.1875 C 1.1875 -2.125 1.3125 -1.414063 1.5625 -1.0625 C 1.8125 -0.71875 2.117188 -0.546875 2.484375 -0.546875 C 2.847656 -0.546875 3.15625 -0.71875 3.40625 -1.0625 C 3.65625 -1.414063 3.78125 -2.125 3.78125 -3.1875 C 3.78125 -4.25 3.65625 -4.953125 3.40625 -5.296875 C 3.15625 -5.648438 2.84375 -5.828125 2.46875 -5.828125 C 2.101563 -5.828125 1.8125 -5.675781 1.59375 -5.375 C 1.320313 -4.976563 1.1875 -4.25 1.1875 -3.1875 Z M 1.1875 -3.1875 "
|
||||
id="path35" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-5">
|
||||
<path
|
||||
d="M 4.546875 -0.765625 L 4.546875 0 L 0.265625 0 C 0.265625 -0.1875 0.296875 -0.367188 0.359375 -0.546875 C 0.472656 -0.835938 0.648438 -1.125 0.890625 -1.40625 C 1.128906 -1.6875 1.472656 -2.015625 1.921875 -2.390625 C 2.628906 -2.960938 3.101563 -3.414063 3.34375 -3.75 C 3.59375 -4.09375 3.71875 -4.414063 3.71875 -4.71875 C 3.71875 -5.03125 3.601563 -5.289063 3.375 -5.5 C 3.15625 -5.71875 2.863281 -5.828125 2.5 -5.828125 C 2.125 -5.828125 1.820313 -5.710938 1.59375 -5.484375 C 1.363281 -5.253906 1.242188 -4.9375 1.234375 -4.53125 L 0.421875 -4.625 C 0.472656 -5.226563 0.679688 -5.6875 1.046875 -6 C 1.410156 -6.320313 1.898438 -6.484375 2.515625 -6.484375 C 3.140625 -6.484375 3.628906 -6.3125 3.984375 -5.96875 C 4.347656 -5.625 4.53125 -5.203125 4.53125 -4.703125 C 4.53125 -4.441406 4.476563 -4.1875 4.375 -3.9375 C 4.269531 -3.6875 4.09375 -3.421875 3.84375 -3.140625 C 3.601563 -2.867188 3.195313 -2.488281 2.625 -2 C 2.144531 -1.601563 1.835938 -1.332031 1.703125 -1.1875 C 1.578125 -1.050781 1.46875 -0.910156 1.375 -0.765625 Z M 4.546875 -0.765625 "
|
||||
id="path38" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-6">
|
||||
<path
|
||||
d="M 3.359375 0 L 2.578125 0 L 2.578125 -5.0625 C 2.378906 -4.875 2.125 -4.6875 1.8125 -4.5 C 1.507813 -4.320313 1.234375 -4.1875 0.984375 -4.09375 L 0.984375 -4.875 C 1.429688 -5.082031 1.816406 -5.332031 2.140625 -5.625 C 2.472656 -5.925781 2.710938 -6.210938 2.859375 -6.484375 L 3.359375 -6.484375 Z M 3.359375 0 "
|
||||
id="path41" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-7">
|
||||
<path
|
||||
d="M 0.8125 -3.78125 L 0.8125 -4.6875 L 1.71875 -4.6875 L 1.71875 -3.78125 Z M 0.8125 0 L 0.8125 -0.90625 L 1.71875 -0.90625 L 1.71875 0 Z M 0.8125 0 "
|
||||
id="path44" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-8">
|
||||
<path
|
||||
d="M 3.640625 0 L 3.640625 -0.59375 C 3.335938 -0.125 2.898438 0.109375 2.328125 0.109375 C 1.953125 0.109375 1.609375 0.00390625 1.296875 -0.203125 C 0.984375 -0.410156 0.738281 -0.695313 0.5625 -1.0625 C 0.394531 -1.4375 0.3125 -1.863281 0.3125 -2.34375 C 0.3125 -2.800781 0.390625 -3.222656 0.546875 -3.609375 C 0.703125 -3.992188 0.9375 -4.285156 1.25 -4.484375 C 1.5625 -4.679688 1.90625 -4.78125 2.28125 -4.78125 C 2.570313 -4.78125 2.828125 -4.722656 3.046875 -4.609375 C 3.265625 -4.492188 3.441406 -4.335938 3.578125 -4.140625 L 3.578125 -6.46875 L 4.375 -6.46875 L 4.375 0 Z M 1.125 -2.34375 C 1.125 -1.738281 1.25 -1.285156 1.5 -0.984375 C 1.757813 -0.691406 2.0625 -0.546875 2.40625 -0.546875 C 2.75 -0.546875 3.039063 -0.6875 3.28125 -0.96875 C 3.519531 -1.25 3.640625 -1.679688 3.640625 -2.265625 C 3.640625 -2.910156 3.515625 -3.378906 3.265625 -3.671875 C 3.023438 -3.972656 2.722656 -4.125 2.359375 -4.125 C 2.003906 -4.125 1.707031 -3.976563 1.46875 -3.6875 C 1.238281 -3.40625 1.125 -2.957031 1.125 -2.34375 Z M 1.125 -2.34375 "
|
||||
id="path47" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-9">
|
||||
<path
|
||||
d="M 1.328125 0 L 0.59375 0 L 0.59375 -6.46875 L 1.390625 -6.46875 L 1.390625 -4.15625 C 1.722656 -4.570313 2.148438 -4.78125 2.671875 -4.78125 C 2.953125 -4.78125 3.222656 -4.722656 3.484375 -4.609375 C 3.742188 -4.492188 3.957031 -4.332031 4.125 -4.125 C 4.289063 -3.914063 4.421875 -3.660156 4.515625 -3.359375 C 4.609375 -3.066406 4.65625 -2.75 4.65625 -2.40625 C 4.65625 -1.601563 4.457031 -0.984375 4.0625 -0.546875 C 3.664063 -0.109375 3.1875 0.109375 2.625 0.109375 C 2.070313 0.109375 1.640625 -0.125 1.328125 -0.59375 Z M 1.3125 -2.375 C 1.3125 -1.8125 1.390625 -1.40625 1.546875 -1.15625 C 1.796875 -0.75 2.132813 -0.546875 2.5625 -0.546875 C 2.90625 -0.546875 3.203125 -0.695313 3.453125 -1 C 3.710938 -1.300781 3.84375 -1.75 3.84375 -2.34375 C 3.84375 -2.957031 3.71875 -3.410156 3.46875 -3.703125 C 3.226563 -3.992188 2.9375 -4.140625 2.59375 -4.140625 C 2.25 -4.140625 1.945313 -3.988281 1.6875 -3.6875 C 1.4375 -3.382813 1.3125 -2.945313 1.3125 -2.375 Z M 1.3125 -2.375 "
|
||||
id="path50" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-10">
|
||||
<path
|
||||
d="M 1.59375 -3.5 C 1.269531 -3.625 1.023438 -3.796875 0.859375 -4.015625 C 0.703125 -4.242188 0.625 -4.515625 0.625 -4.828125 C 0.625 -5.296875 0.789063 -5.6875 1.125 -6 C 1.46875 -6.320313 1.921875 -6.484375 2.484375 -6.484375 C 3.046875 -6.484375 3.5 -6.320313 3.84375 -6 C 4.1875 -5.675781 4.359375 -5.273438 4.359375 -4.796875 C 4.359375 -4.503906 4.28125 -4.242188 4.125 -4.015625 C 3.96875 -3.796875 3.726563 -3.625 3.40625 -3.5 C 3.800781 -3.375 4.101563 -3.164063 4.3125 -2.875 C 4.519531 -2.59375 4.625 -2.25 4.625 -1.84375 C 4.625 -1.289063 4.425781 -0.828125 4.03125 -0.453125 C 3.644531 -0.078125 3.132813 0.109375 2.5 0.109375 C 1.851563 0.109375 1.332031 -0.078125 0.9375 -0.453125 C 0.550781 -0.828125 0.359375 -1.300781 0.359375 -1.875 C 0.359375 -2.289063 0.460938 -2.640625 0.671875 -2.921875 C 0.890625 -3.203125 1.195313 -3.394531 1.59375 -3.5 Z M 1.4375 -4.84375 C 1.4375 -4.539063 1.535156 -4.289063 1.734375 -4.09375 C 1.929688 -3.90625 2.1875 -3.8125 2.5 -3.8125 C 2.800781 -3.8125 3.050781 -3.90625 3.25 -4.09375 C 3.445313 -4.289063 3.546875 -4.53125 3.546875 -4.8125 C 3.546875 -5.101563 3.441406 -5.347656 3.234375 -5.546875 C 3.035156 -5.742188 2.785156 -5.84375 2.484375 -5.84375 C 2.179688 -5.84375 1.929688 -5.742188 1.734375 -5.546875 C 1.535156 -5.347656 1.4375 -5.113281 1.4375 -4.84375 Z M 1.1875 -1.859375 C 1.1875 -1.640625 1.238281 -1.421875 1.34375 -1.203125 C 1.445313 -0.992188 1.601563 -0.832031 1.8125 -0.71875 C 2.03125 -0.601563 2.257813 -0.546875 2.5 -0.546875 C 2.882813 -0.546875 3.195313 -0.664063 3.4375 -0.90625 C 3.6875 -1.15625 3.8125 -1.46875 3.8125 -1.84375 C 3.8125 -2.21875 3.679688 -2.53125 3.421875 -2.78125 C 3.171875 -3.03125 2.859375 -3.15625 2.484375 -3.15625 C 2.109375 -3.15625 1.796875 -3.03125 1.546875 -2.78125 C 1.304688 -2.539063 1.1875 -2.234375 1.1875 -1.859375 Z M 1.1875 -1.859375 "
|
||||
id="path53" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-11">
|
||||
<path
|
||||
d="M 0 0.109375 L 1.875 -6.578125 L 2.515625 -6.578125 L 0.640625 0.109375 Z M 0 0.109375 "
|
||||
id="path56" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-12">
|
||||
<path
|
||||
d="M 4.5 -4.875 L 3.703125 -4.8125 C 3.628906 -5.125 3.53125 -5.351563 3.40625 -5.5 C 3.1875 -5.726563 2.921875 -5.84375 2.609375 -5.84375 C 2.359375 -5.84375 2.132813 -5.769531 1.9375 -5.625 C 1.6875 -5.445313 1.488281 -5.179688 1.34375 -4.828125 C 1.207031 -4.472656 1.132813 -3.972656 1.125 -3.328125 C 1.320313 -3.617188 1.554688 -3.832031 1.828125 -3.96875 C 2.109375 -4.113281 2.398438 -4.1875 2.703125 -4.1875 C 3.234375 -4.1875 3.679688 -3.992188 4.046875 -3.609375 C 4.421875 -3.222656 4.609375 -2.71875 4.609375 -2.09375 C 4.609375 -1.6875 4.519531 -1.3125 4.34375 -0.96875 C 4.164063 -0.625 3.925781 -0.359375 3.625 -0.171875 C 3.320313 0.015625 2.972656 0.109375 2.578125 0.109375 C 1.921875 0.109375 1.382813 -0.128906 0.96875 -0.609375 C 0.550781 -1.097656 0.34375 -1.90625 0.34375 -3.03125 C 0.34375 -4.28125 0.570313 -5.1875 1.03125 -5.75 C 1.4375 -6.238281 1.976563 -6.484375 2.65625 -6.484375 C 3.164063 -6.484375 3.582031 -6.34375 3.90625 -6.0625 C 4.226563 -5.78125 4.425781 -5.382813 4.5 -4.875 Z M 1.25 -2.09375 C 1.25 -1.820313 1.304688 -1.5625 1.421875 -1.3125 C 1.535156 -1.0625 1.695313 -0.867188 1.90625 -0.734375 C 2.125 -0.609375 2.347656 -0.546875 2.578125 -0.546875 C 2.910156 -0.546875 3.195313 -0.679688 3.4375 -0.953125 C 3.675781 -1.222656 3.796875 -1.585938 3.796875 -2.046875 C 3.796875 -2.492188 3.675781 -2.847656 3.4375 -3.109375 C 3.195313 -3.367188 2.898438 -3.5 2.546875 -3.5 C 2.179688 -3.5 1.875 -3.367188 1.625 -3.109375 C 1.375 -2.847656 1.25 -2.507813 1.25 -2.09375 Z M 1.25 -2.09375 "
|
||||
id="path59" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-13">
|
||||
<path
|
||||
d="M 2.921875 0 L 2.921875 -1.546875 L 0.109375 -1.546875 L 0.109375 -2.28125 L 3.0625 -6.46875 L 3.71875 -6.46875 L 3.71875 -2.28125 L 4.59375 -2.28125 L 4.59375 -1.546875 L 3.71875 -1.546875 L 3.71875 0 Z M 2.921875 -2.28125 L 2.921875 -5.1875 L 0.890625 -2.28125 Z M 2.921875 -2.28125 "
|
||||
id="path62" />
|
||||
</g>
|
||||
</g>
|
||||
</defs>
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(100%, 94.898987%, 79.998779%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(83.918762%, 71.369934%, 33.729553%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 1.000054 1.000054 L 81.001187 1.000054 L 81.001187 51.000113 L 1.000054 51.000113 Z M 1.000054 1.000054 "
|
||||
transform="matrix(0.752577, 0, 0, 0.752577, 0.376289, 0.376289)"
|
||||
id="path69" />
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g85">
|
||||
<use
|
||||
xlink:href="#glyph-0-1"
|
||||
x="12.782054"
|
||||
y="18.81443"
|
||||
id="use71" />
|
||||
<use
|
||||
xlink:href="#glyph-0-2"
|
||||
x="17.804625"
|
||||
y="18.81443"
|
||||
id="use73" />
|
||||
<use
|
||||
xlink:href="#glyph-0-3"
|
||||
x="22.827196"
|
||||
y="18.81443"
|
||||
id="use75" />
|
||||
<use
|
||||
xlink:href="#glyph-0-4"
|
||||
x="27.849768"
|
||||
y="18.81443"
|
||||
id="use77" />
|
||||
<use
|
||||
xlink:href="#glyph-0-5"
|
||||
x="35.879707"
|
||||
y="18.81443"
|
||||
id="use79" />
|
||||
<use
|
||||
xlink:href="#glyph-0-6"
|
||||
x="41.396156"
|
||||
y="18.81443"
|
||||
id="use81" />
|
||||
<use
|
||||
xlink:href="#glyph-0-1"
|
||||
x="43.905239"
|
||||
y="18.81443"
|
||||
id="use83" />
|
||||
</g>
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g95">
|
||||
<use
|
||||
xlink:href="#glyph-1-1"
|
||||
x="21.307343"
|
||||
y="33.865974"
|
||||
id="use87" />
|
||||
<use
|
||||
xlink:href="#glyph-1-2"
|
||||
x="26.329914"
|
||||
y="33.865974"
|
||||
id="use89" />
|
||||
<use
|
||||
xlink:href="#glyph-1-3"
|
||||
x="28.838995"
|
||||
y="33.865974"
|
||||
id="use91" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="33.861565"
|
||||
y="33.865974"
|
||||
id="use93" />
|
||||
</g>
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(0%, 0%, 0%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 40.998025 90.998084 L 40.998025 51.000113 "
|
||||
transform="matrix(0.752577, 0, 0, 0.752577, 0.376289, 0.376289)"
|
||||
id="path97" />
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(0%, 0%, 0%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 1.000054 90.998084 L 190.998203 90.998084 "
|
||||
transform="matrix(0.752577, 0, 0, 0.752577, 0.376289, 0.376289)"
|
||||
id="path99" />
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g129">
|
||||
<use
|
||||
xlink:href="#glyph-1-5"
|
||||
x="59.430084"
|
||||
y="62.463909"
|
||||
id="use101" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="64.452652"
|
||||
y="62.463909"
|
||||
id="use103" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="69.475227"
|
||||
y="62.463909"
|
||||
id="use105" />
|
||||
<use
|
||||
xlink:href="#glyph-1-6"
|
||||
x="74.497795"
|
||||
y="62.463909"
|
||||
id="use107" />
|
||||
<use
|
||||
xlink:href="#glyph-1-7"
|
||||
x="79.52037"
|
||||
y="62.463909"
|
||||
id="use109" />
|
||||
<use
|
||||
xlink:href="#glyph-1-8"
|
||||
x="82.029449"
|
||||
y="62.463909"
|
||||
id="use111" />
|
||||
<use
|
||||
xlink:href="#glyph-1-9"
|
||||
x="87.052017"
|
||||
y="62.463909"
|
||||
id="use113" />
|
||||
<use
|
||||
xlink:href="#glyph-1-10"
|
||||
x="92.074593"
|
||||
y="62.463909"
|
||||
id="use115" />
|
||||
<use
|
||||
xlink:href="#glyph-1-7"
|
||||
x="97.09716"
|
||||
y="62.463909"
|
||||
id="use117" />
|
||||
<use
|
||||
xlink:href="#glyph-1-7"
|
||||
x="99.606239"
|
||||
y="62.463909"
|
||||
id="use119" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="102.11533"
|
||||
y="62.463909"
|
||||
id="use121" />
|
||||
<use
|
||||
xlink:href="#glyph-1-11"
|
||||
x="107.13789"
|
||||
y="62.463909"
|
||||
id="use123" />
|
||||
<use
|
||||
xlink:href="#glyph-1-12"
|
||||
x="109.64697"
|
||||
y="62.463909"
|
||||
id="use125" />
|
||||
<use
|
||||
xlink:href="#glyph-1-13"
|
||||
x="114.66955"
|
||||
y="62.463909"
|
||||
id="use127" />
|
||||
</g>
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g137">
|
||||
<use
|
||||
xlink:href="#glyph-1-7"
|
||||
x="17.556215"
|
||||
y="48.917519"
|
||||
id="use131" />
|
||||
<use
|
||||
xlink:href="#glyph-1-7"
|
||||
x="20.065296"
|
||||
y="48.917519"
|
||||
id="use133" />
|
||||
<use
|
||||
xlink:href="#glyph-1-6"
|
||||
x="22.574377"
|
||||
y="48.917519"
|
||||
id="use135" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 23 KiB |
@@ -0,0 +1,478 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="234pt"
|
||||
height="155.039993pt"
|
||||
viewBox="0 0 234 155.039993"
|
||||
version="1.1"
|
||||
id="svg141"
|
||||
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="defs53">
|
||||
<g
|
||||
id="g48">
|
||||
<g
|
||||
id="glyph-0-0" />
|
||||
<g
|
||||
id="glyph-0-1">
|
||||
<path
|
||||
d="M 4.078125 0.15625 C 3.578125 0.15625 3.117188 0.078125 2.703125 -0.078125 C 2.296875 -0.234375 1.945313 -0.460938 1.65625 -0.765625 C 1.363281 -1.066406 1.132813 -1.4375 0.96875 -1.875 C 0.8125 -2.320313 0.734375 -2.832031 0.734375 -3.40625 C 0.734375 -3.988281 0.816406 -4.503906 0.984375 -4.953125 C 1.148438 -5.398438 1.375 -5.773438 1.65625 -6.078125 C 1.9375 -6.390625 2.269531 -6.625 2.65625 -6.78125 C 3.039063 -6.9375 3.453125 -7.015625 3.890625 -7.015625 C 4.273438 -7.015625 4.632813 -6.945313 4.96875 -6.8125 C 5.3125 -6.6875 5.609375 -6.488281 5.859375 -6.21875 C 6.109375 -5.957031 6.304688 -5.625 6.453125 -5.21875 C 6.597656 -4.8125 6.671875 -4.328125 6.671875 -3.765625 C 6.671875 -3.679688 6.664063 -3.597656 6.65625 -3.515625 C 6.65625 -3.429688 6.648438 -3.347656 6.640625 -3.265625 L 1.765625 -3.265625 C 1.785156 -2.828125 1.859375 -2.445313 1.984375 -2.125 C 2.117188 -1.800781 2.289063 -1.535156 2.5 -1.328125 C 2.707031 -1.117188 2.945313 -0.960938 3.21875 -0.859375 C 3.5 -0.765625 3.796875 -0.71875 4.109375 -0.71875 C 4.347656 -0.71875 4.570313 -0.742188 4.78125 -0.796875 C 4.988281 -0.859375 5.1875 -0.945313 5.375 -1.0625 C 5.5625 -1.175781 5.726563 -1.316406 5.875 -1.484375 L 6.484375 -0.90625 C 6.285156 -0.675781 6.0625 -0.476563 5.8125 -0.3125 C 5.570313 -0.15625 5.304688 -0.0390625 5.015625 0.03125 C 4.734375 0.113281 4.421875 0.15625 4.078125 0.15625 Z M 1.8125 -4.109375 L 5.578125 -4.109375 C 5.578125 -4.429688 5.535156 -4.71875 5.453125 -4.96875 C 5.367188 -5.226563 5.25 -5.445313 5.09375 -5.625 C 4.9375 -5.8125 4.75 -5.953125 4.53125 -6.046875 C 4.320313 -6.140625 4.082031 -6.1875 3.8125 -6.1875 C 3.570313 -6.1875 3.34375 -6.144531 3.125 -6.0625 C 2.914063 -5.988281 2.71875 -5.863281 2.53125 -5.6875 C 2.351563 -5.519531 2.203125 -5.304688 2.078125 -5.046875 C 1.953125 -4.785156 1.863281 -4.472656 1.8125 -4.109375 Z M 1.8125 -4.109375 "
|
||||
id="path3" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-2">
|
||||
<path
|
||||
d="M 4.484375 0.109375 C 4.046875 0.109375 3.6875 0.0351563 3.40625 -0.109375 C 3.125 -0.265625 2.90625 -0.5 2.75 -0.8125 C 2.601563 -1.132813 2.507813 -1.535156 2.46875 -2.015625 C 2.425781 -2.492188 2.414063 -3.0625 2.4375 -3.71875 L 2.609375 -8.609375 L 3.734375 -8.75 L 3.890625 -8.765625 L 3.90625 -8.65625 C 3.851563 -8.582031 3.804688 -8.507813 3.765625 -8.4375 C 3.734375 -8.375 3.707031 -8.253906 3.6875 -8.078125 L 3.5625 -6.390625 L 3.59375 -6.125 L 3.5 -3.640625 C 3.46875 -2.878906 3.484375 -2.289063 3.546875 -1.875 C 3.617188 -1.46875 3.742188 -1.1875 3.921875 -1.03125 C 4.109375 -0.875 4.351563 -0.796875 4.65625 -0.796875 C 4.976563 -0.796875 5.265625 -0.859375 5.515625 -0.984375 C 5.773438 -1.117188 6.046875 -1.285156 6.328125 -1.484375 L 6.65625 -0.625 C 6.320313 -0.375 5.972656 -0.1875 5.609375 -0.0625 C 5.242188 0.0507813 4.867188 0.109375 4.484375 0.109375 Z M 1.046875 -6.859375 L 5.984375 -6.859375 L 5.984375 -5.96875 L 1.046875 -5.96875 Z M 1.046875 -6.859375 "
|
||||
id="path6" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-3">
|
||||
<path
|
||||
d="M 1.09375 -9.96875 L 2.28125 -9.96875 L 2.28125 -9.875 C 2.21875 -9.8125 2.175781 -9.742188 2.15625 -9.671875 C 2.144531 -9.597656 2.140625 -9.476563 2.140625 -9.3125 L 2.140625 -5.640625 C 2.328125 -5.921875 2.539063 -6.160156 2.78125 -6.359375 C 3.03125 -6.566406 3.289063 -6.726563 3.5625 -6.84375 C 3.832031 -6.957031 4.109375 -7.015625 4.390625 -7.015625 C 4.804688 -7.015625 5.171875 -6.921875 5.484375 -6.734375 C 5.796875 -6.546875 6.039063 -6.238281 6.21875 -5.8125 C 6.394531 -5.394531 6.484375 -4.84375 6.484375 -4.15625 L 6.484375 0 L 5.4375 0 L 5.4375 -4.125 C 5.4375 -4.601563 5.378906 -4.984375 5.265625 -5.265625 C 5.148438 -5.554688 5 -5.765625 4.8125 -5.890625 C 4.625 -6.015625 4.410156 -6.078125 4.171875 -6.078125 C 3.992188 -6.078125 3.804688 -6.046875 3.609375 -5.984375 C 3.421875 -5.921875 3.238281 -5.828125 3.0625 -5.703125 C 2.894531 -5.585938 2.738281 -5.441406 2.59375 -5.265625 C 2.457031 -5.097656 2.347656 -4.898438 2.265625 -4.671875 C 2.179688 -4.453125 2.140625 -4.207031 2.140625 -3.9375 L 2.140625 0 L 1.09375 0 Z M 1.09375 -9.96875 "
|
||||
id="path9" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-4">
|
||||
<path
|
||||
d="M 1.609375 -2.3125 L 5.609375 -7.453125 L 5.953125 -6.75 L 1.953125 -1.671875 Z M 3.75 0.171875 C 3.125 0.171875 2.597656 -0.0078125 2.171875 -0.375 C 1.742188 -0.75 1.414063 -1.296875 1.1875 -2.015625 C 0.96875 -2.734375 0.859375 -3.601563 0.859375 -4.625 C 0.859375 -5.613281 0.96875 -6.460938 1.1875 -7.171875 C 1.414063 -7.890625 1.742188 -8.441406 2.171875 -8.828125 C 2.597656 -9.210938 3.125 -9.40625 3.75 -9.40625 C 4.375 -9.40625 4.898438 -9.210938 5.328125 -8.828125 C 5.753906 -8.441406 6.078125 -7.890625 6.296875 -7.171875 C 6.523438 -6.460938 6.640625 -5.613281 6.640625 -4.625 C 6.640625 -3.601563 6.523438 -2.734375 6.296875 -2.015625 C 6.078125 -1.296875 5.753906 -0.75 5.328125 -0.375 C 4.898438 -0.0078125 4.375 0.171875 3.75 0.171875 Z M 3.75 -0.75 C 4.125 -0.75 4.445313 -0.898438 4.71875 -1.203125 C 4.988281 -1.503906 5.195313 -1.941406 5.34375 -2.515625 C 5.488281 -3.085938 5.5625 -3.789063 5.5625 -4.625 C 5.5625 -5.414063 5.488281 -6.097656 5.34375 -6.671875 C 5.195313 -7.242188 4.988281 -7.6875 4.71875 -8 C 4.445313 -8.320313 4.125 -8.484375 3.75 -8.484375 C 3.375 -8.484375 3.050781 -8.320313 2.78125 -8 C 2.507813 -7.6875 2.300781 -7.242188 2.15625 -6.671875 C 2.007813 -6.097656 1.9375 -5.414063 1.9375 -4.625 C 1.9375 -3.789063 2.007813 -3.085938 2.15625 -2.515625 C 2.300781 -1.941406 2.507813 -1.503906 2.78125 -1.203125 C 3.050781 -0.898438 3.375 -0.75 3.75 -0.75 Z M 3.75 -0.75 "
|
||||
id="path12" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-5">
|
||||
<path
|
||||
d="M 1.5 0 L 1.5 -0.875 L 3.25 -0.875 L 3.25 -5.984375 L 1.59375 -5.984375 L 1.59375 -6.859375 L 4.328125 -6.859375 L 4.328125 -0.875 L 5.9375 -0.875 L 5.9375 0 Z M 3.734375 -8.296875 C 3.523438 -8.296875 3.34375 -8.367188 3.1875 -8.515625 C 3.039063 -8.671875 2.96875 -8.851563 2.96875 -9.0625 C 2.96875 -9.28125 3.039063 -9.460938 3.1875 -9.609375 C 3.332031 -9.765625 3.515625 -9.84375 3.734375 -9.84375 C 3.941406 -9.84375 4.125 -9.765625 4.28125 -9.609375 C 4.4375 -9.453125 4.515625 -9.269531 4.515625 -9.0625 C 4.515625 -8.851563 4.4375 -8.671875 4.28125 -8.515625 C 4.125 -8.367188 3.941406 -8.296875 3.734375 -8.296875 Z M 3.734375 -8.296875 "
|
||||
id="path15" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-6">
|
||||
<path
|
||||
d="M 0.90625 2.5 L 0.90625 -6.859375 L 2 -6.859375 L 2 -5.5 C 2.101563 -5.851563 2.257813 -6.140625 2.46875 -6.359375 C 2.675781 -6.578125 2.914063 -6.738281 3.1875 -6.84375 C 3.457031 -6.945313 3.753906 -7 4.078125 -7 C 4.460938 -7 4.828125 -6.925781 5.171875 -6.78125 C 5.515625 -6.632813 5.816406 -6.414063 6.078125 -6.125 C 6.347656 -5.84375 6.554688 -5.476563 6.703125 -5.03125 C 6.859375 -4.59375 6.9375 -4.078125 6.9375 -3.484375 C 6.9375 -2.878906 6.851563 -2.347656 6.6875 -1.890625 C 6.53125 -1.429688 6.3125 -1.046875 6.03125 -0.734375 C 5.757813 -0.429688 5.453125 -0.203125 5.109375 -0.046875 C 4.765625 0.109375 4.410156 0.1875 4.046875 0.1875 C 3.773438 0.1875 3.507813 0.140625 3.25 0.046875 C 3 -0.0351563 2.769531 -0.15625 2.5625 -0.3125 C 2.351563 -0.476563 2.171875 -0.675781 2.015625 -0.90625 L 2.015625 2.5 Z M 3.875 -0.78125 C 4.113281 -0.78125 4.347656 -0.820313 4.578125 -0.90625 C 4.804688 -0.988281 5.015625 -1.128906 5.203125 -1.328125 C 5.390625 -1.535156 5.535156 -1.8125 5.640625 -2.15625 C 5.753906 -2.5 5.8125 -2.925781 5.8125 -3.4375 C 5.8125 -3.988281 5.742188 -4.457031 5.609375 -4.84375 C 5.472656 -5.226563 5.269531 -5.523438 5 -5.734375 C 4.738281 -5.941406 4.414063 -6.054688 4.03125 -6.078125 C 3.75 -6.097656 3.484375 -6.054688 3.234375 -5.953125 C 2.992188 -5.859375 2.78125 -5.691406 2.59375 -5.453125 C 2.40625 -5.222656 2.257813 -4.921875 2.15625 -4.546875 C 2.050781 -4.171875 2 -3.71875 2 -3.1875 C 2.007813 -2.875 2.039063 -2.585938 2.09375 -2.328125 C 2.15625 -2.066406 2.238281 -1.835938 2.34375 -1.640625 C 2.457031 -1.441406 2.585938 -1.28125 2.734375 -1.15625 C 2.890625 -1.03125 3.0625 -0.9375 3.25 -0.875 C 3.445313 -0.8125 3.65625 -0.78125 3.875 -0.78125 Z M 3.875 -0.78125 "
|
||||
id="path18" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-7">
|
||||
<path
|
||||
d="M 1.1875 0 L 1.1875 -0.875 L 3.203125 -0.875 L 3.203125 -9.109375 L 1.28125 -9.109375 L 1.28125 -9.96875 L 4.3125 -9.96875 L 4.3125 -0.875 L 6.3125 -0.875 L 6.3125 0 Z M 1.1875 0 "
|
||||
id="path21" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-0-8">
|
||||
<path
|
||||
d="M 3.75 0.125 C 3.125 0.125 2.570313 -0.0234375 2.09375 -0.328125 C 1.625 -0.640625 1.253906 -1.0625 0.984375 -1.59375 C 0.710938 -2.132813 0.578125 -2.75 0.578125 -3.4375 C 0.578125 -4.132813 0.710938 -4.75 0.984375 -5.28125 C 1.253906 -5.820313 1.625 -6.242188 2.09375 -6.546875 C 2.570313 -6.847656 3.125 -7 3.75 -7 C 4.375 -7 4.921875 -6.847656 5.390625 -6.546875 C 5.867188 -6.242188 6.242188 -5.820313 6.515625 -5.28125 C 6.785156 -4.75 6.921875 -4.132813 6.921875 -3.4375 C 6.921875 -2.75 6.785156 -2.132813 6.515625 -1.59375 C 6.242188 -1.0625 5.867188 -0.640625 5.390625 -0.328125 C 4.921875 -0.0234375 4.375 0.125 3.75 0.125 Z M 3.75 -0.78125 C 4.144531 -0.78125 4.492188 -0.894531 4.796875 -1.125 C 5.097656 -1.351563 5.335938 -1.664063 5.515625 -2.0625 C 5.691406 -2.46875 5.78125 -2.929688 5.78125 -3.453125 C 5.78125 -3.972656 5.691406 -4.429688 5.515625 -4.828125 C 5.335938 -5.234375 5.097656 -5.546875 4.796875 -5.765625 C 4.492188 -5.992188 4.144531 -6.109375 3.75 -6.109375 C 3.363281 -6.109375 3.015625 -5.992188 2.703125 -5.765625 C 2.398438 -5.546875 2.160156 -5.234375 1.984375 -4.828125 C 1.804688 -4.429688 1.71875 -3.972656 1.71875 -3.453125 C 1.71875 -2.929688 1.804688 -2.46875 1.984375 -2.0625 C 2.160156 -1.664063 2.398438 -1.351563 2.703125 -1.125 C 3.015625 -0.894531 3.363281 -0.78125 3.75 -0.78125 Z M 3.75 -0.78125 "
|
||||
id="path24" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-0">
|
||||
<path
|
||||
d="M 1.6875 0 L 1.6875 -8.4375 L 8.4375 -8.4375 L 8.4375 0 Z M 1.90625 -0.21875 L 8.234375 -0.21875 L 8.234375 -8.234375 L 1.90625 -8.234375 Z M 1.90625 -0.21875 "
|
||||
id="path27" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-1">
|
||||
<path
|
||||
d="M 5.015625 -2.234375 L 6.875 -1.921875 C 6.632813 -1.242188 6.257813 -0.726563 5.75 -0.375 C 5.238281 -0.0195313 4.597656 0.15625 3.828125 0.15625 C 2.609375 0.15625 1.707031 -0.238281 1.125 -1.03125 C 0.65625 -1.664063 0.421875 -2.472656 0.421875 -3.453125 C 0.421875 -4.609375 0.722656 -5.515625 1.328125 -6.171875 C 1.941406 -6.828125 2.710938 -7.15625 3.640625 -7.15625 C 4.679688 -7.15625 5.5 -6.8125 6.09375 -6.125 C 6.695313 -5.4375 6.988281 -4.382813 6.96875 -2.96875 L 2.328125 -2.96875 C 2.335938 -2.414063 2.484375 -1.984375 2.765625 -1.671875 C 3.054688 -1.367188 3.414063 -1.21875 3.84375 -1.21875 C 4.132813 -1.21875 4.378906 -1.296875 4.578125 -1.453125 C 4.773438 -1.617188 4.921875 -1.878906 5.015625 -2.234375 Z M 5.125 -4.09375 C 5.113281 -4.632813 4.972656 -5.039063 4.703125 -5.3125 C 4.441406 -5.59375 4.125 -5.734375 3.75 -5.734375 C 3.34375 -5.734375 3.007813 -5.585938 2.75 -5.296875 C 2.488281 -5.003906 2.359375 -4.601563 2.359375 -4.09375 Z M 5.125 -4.09375 "
|
||||
id="path30" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-2">
|
||||
<path
|
||||
d="M 0.078125 0 L 2.609375 -3.609375 L 0.1875 -7 L 2.453125 -7 L 3.6875 -5.078125 L 4.984375 -7 L 7.171875 -7 L 4.796875 -3.6875 L 7.390625 0 L 5.109375 0 L 3.6875 -2.171875 L 2.25 0 Z M 0.078125 0 "
|
||||
id="path33" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-3">
|
||||
<path
|
||||
d="M 2.359375 -4.859375 L 0.671875 -5.171875 C 0.859375 -5.847656 1.179688 -6.347656 1.640625 -6.671875 C 2.109375 -6.992188 2.796875 -7.15625 3.703125 -7.15625 C 4.523438 -7.15625 5.140625 -7.054688 5.546875 -6.859375 C 5.953125 -6.671875 6.238281 -6.425781 6.40625 -6.125 C 6.570313 -5.820313 6.65625 -5.269531 6.65625 -4.46875 L 6.625 -2.296875 C 6.625 -1.679688 6.65625 -1.226563 6.71875 -0.9375 C 6.78125 -0.644531 6.890625 -0.332031 7.046875 0 L 5.21875 0 C 5.164063 -0.125 5.109375 -0.304688 5.046875 -0.546875 C 5.015625 -0.660156 4.992188 -0.734375 4.984375 -0.765625 C 4.660156 -0.453125 4.316406 -0.21875 3.953125 -0.0625 C 3.597656 0.0820313 3.21875 0.15625 2.8125 0.15625 C 2.09375 0.15625 1.523438 -0.0351563 1.109375 -0.421875 C 0.691406 -0.816406 0.484375 -1.3125 0.484375 -1.90625 C 0.484375 -2.300781 0.578125 -2.65625 0.765625 -2.96875 C 0.953125 -3.28125 1.210938 -3.515625 1.546875 -3.671875 C 1.890625 -3.835938 2.382813 -3.984375 3.03125 -4.109375 C 3.894531 -4.273438 4.492188 -4.425781 4.828125 -4.5625 L 4.828125 -4.75 C 4.828125 -5.101563 4.738281 -5.351563 4.5625 -5.5 C 4.382813 -5.65625 4.054688 -5.734375 3.578125 -5.734375 C 3.242188 -5.734375 2.984375 -5.671875 2.796875 -5.546875 C 2.617188 -5.421875 2.472656 -5.191406 2.359375 -4.859375 Z M 4.828125 -3.359375 C 4.585938 -3.285156 4.210938 -3.191406 3.703125 -3.078125 C 3.191406 -2.960938 2.859375 -2.851563 2.703125 -2.75 C 2.453125 -2.582031 2.328125 -2.367188 2.328125 -2.109375 C 2.328125 -1.847656 2.421875 -1.617188 2.609375 -1.421875 C 2.804688 -1.234375 3.054688 -1.140625 3.359375 -1.140625 C 3.691406 -1.140625 4.007813 -1.253906 4.3125 -1.484375 C 4.539063 -1.648438 4.691406 -1.851563 4.765625 -2.09375 C 4.804688 -2.25 4.828125 -2.550781 4.828125 -3 Z M 4.828125 -3.359375 "
|
||||
id="path36" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-4">
|
||||
<path
|
||||
d="M 0.828125 -7 L 2.53125 -7 L 2.53125 -6.046875 C 3.144531 -6.785156 3.875 -7.15625 4.71875 -7.15625 C 5.164063 -7.15625 5.550781 -7.0625 5.875 -6.875 C 6.207031 -6.695313 6.484375 -6.421875 6.703125 -6.046875 C 7.003906 -6.421875 7.332031 -6.695313 7.6875 -6.875 C 8.050781 -7.0625 8.429688 -7.15625 8.828125 -7.15625 C 9.347656 -7.15625 9.785156 -7.050781 10.140625 -6.84375 C 10.492188 -6.632813 10.757813 -6.328125 10.9375 -5.921875 C 11.0625 -5.628906 11.125 -5.144531 11.125 -4.46875 L 11.125 0 L 9.28125 0 L 9.28125 -4 C 9.28125 -4.695313 9.210938 -5.144531 9.078125 -5.34375 C 8.910156 -5.601563 8.648438 -5.734375 8.296875 -5.734375 C 8.035156 -5.734375 7.789063 -5.65625 7.5625 -5.5 C 7.332031 -5.34375 7.164063 -5.109375 7.0625 -4.796875 C 6.96875 -4.492188 6.921875 -4.015625 6.921875 -3.359375 L 6.921875 0 L 5.0625 0 L 5.0625 -3.84375 C 5.0625 -4.519531 5.023438 -4.957031 4.953125 -5.15625 C 4.890625 -5.351563 4.789063 -5.5 4.65625 -5.59375 C 4.519531 -5.6875 4.332031 -5.734375 4.09375 -5.734375 C 3.8125 -5.734375 3.554688 -5.65625 3.328125 -5.5 C 3.097656 -5.351563 2.929688 -5.132813 2.828125 -4.84375 C 2.734375 -4.550781 2.6875 -4.070313 2.6875 -3.40625 L 2.6875 0 L 0.828125 0 Z M 0.828125 -7 "
|
||||
id="path39" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-5">
|
||||
<path
|
||||
d="M 0.921875 -7 L 2.640625 -7 L 2.640625 -5.96875 C 2.867188 -6.320313 3.171875 -6.609375 3.546875 -6.828125 C 3.929688 -7.046875 4.359375 -7.15625 4.828125 -7.15625 C 5.640625 -7.15625 6.328125 -6.835938 6.890625 -6.203125 C 7.460938 -5.566406 7.75 -4.679688 7.75 -3.546875 C 7.75 -2.367188 7.460938 -1.457031 6.890625 -0.8125 C 6.316406 -0.164063 5.625 0.15625 4.8125 0.15625 C 4.425781 0.15625 4.078125 0.0820313 3.765625 -0.0625 C 3.453125 -0.21875 3.117188 -0.484375 2.765625 -0.859375 L 2.765625 2.65625 L 0.921875 2.65625 Z M 2.75 -3.625 C 2.75 -2.832031 2.90625 -2.25 3.21875 -1.875 C 3.53125 -1.5 3.910156 -1.3125 4.359375 -1.3125 C 4.785156 -1.3125 5.140625 -1.484375 5.421875 -1.828125 C 5.710938 -2.171875 5.859375 -2.738281 5.859375 -3.53125 C 5.859375 -4.257813 5.710938 -4.800781 5.421875 -5.15625 C 5.128906 -5.519531 4.765625 -5.703125 4.328125 -5.703125 C 3.867188 -5.703125 3.488281 -5.523438 3.1875 -5.171875 C 2.894531 -4.816406 2.75 -4.300781 2.75 -3.625 Z M 2.75 -3.625 "
|
||||
id="path42" />
|
||||
</g>
|
||||
<g
|
||||
id="glyph-1-6">
|
||||
<path
|
||||
d="M 0.96875 0 L 0.96875 -9.65625 L 2.828125 -9.65625 L 2.828125 0 Z M 0.96875 0 "
|
||||
id="path45" />
|
||||
</g>
|
||||
</g>
|
||||
<clipPath
|
||||
id="clip-0">
|
||||
<path
|
||||
clip-rule="nonzero"
|
||||
d="M 72 118 L 94 118 L 94 153 L 72 153 Z M 72 118 "
|
||||
id="path50" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(100%, 94.898987%, 79.998779%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(83.918762%, 71.369934%, 33.729553%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 40.000002 1 L 310.000013 1 L 310.000013 201.000008 L 40.000002 201.000008 Z M 40.000002 1 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0.375, 0.375)"
|
||||
id="path55" />
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(97.24884%, 80.778503%, 79.998779%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(72.158813%, 32.939148%, 31.369019%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 70.000003 122.000005 L 150.000006 122.000005 L 150.000006 162.000007 L 70.000003 162.000007 Z M 70.000003 122.000005 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0, 0)"
|
||||
id="path57" />
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g67">
|
||||
<use
|
||||
xlink:href="#glyph-0-1"
|
||||
x="67.5"
|
||||
y="111.74999"
|
||||
id="use59" />
|
||||
<use
|
||||
xlink:href="#glyph-0-2"
|
||||
x="75"
|
||||
y="111.74999"
|
||||
id="use61" />
|
||||
<use
|
||||
xlink:href="#glyph-0-3"
|
||||
x="82.5"
|
||||
y="111.74999"
|
||||
id="use63" />
|
||||
<use
|
||||
xlink:href="#glyph-0-4"
|
||||
x="89.999992"
|
||||
y="111.74999"
|
||||
id="use65" />
|
||||
</g>
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(97.24884%, 80.778503%, 79.998779%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(72.158813%, 32.939148%, 31.369019%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 120.000005 112.000005 L 140.000006 112.000005 L 140.000006 122.000005 L 120.000005 122.000005 Z M 120.000005 112.000005 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0, 0)"
|
||||
id="path69" />
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(97.24884%, 80.778503%, 79.998779%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(72.158813%, 32.939148%, 31.369019%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 85.000005 116.999996 C 91.666672 116.999996 95.000006 120.333329 95.000006 126.999996 C 95.000006 133.666663 91.666672 136.999997 85.000005 136.999997 Z M 85.000005 116.999996 "
|
||||
transform="matrix(0, 0.75, -0.75, 0, 162.749993, 27.749999)"
|
||||
id="path71" />
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(72.158813%, 32.939148%, 31.369019%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 80.000003 167.000007 L 140.000006 167.000007 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0, 0)"
|
||||
id="path73" />
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(96.078491%, 96.078491%, 96.078491%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 110.000005 76.000003 C 110.000005 77.312503 109.869796 78.614587 109.614588 79.901045 C 109.35938 81.187503 108.979171 82.442712 108.479171 83.656253 C 107.973963 84.864587 107.359379 86.020837 106.630213 87.109379 C 105.901046 88.203129 105.072921 89.213545 104.140629 90.140629 C 103.213546 91.07292 102.203129 91.901045 101.109379 92.630212 C 100.020838 93.359379 98.864587 93.973962 97.656254 94.479171 C 96.442712 94.979171 95.187504 95.359379 93.901046 95.614587 C 92.614587 95.869796 91.312504 96.000004 90.000004 96.000004 C 88.687504 96.000004 87.38542 95.869796 86.098962 95.614587 C 84.812504 95.359379 83.557295 94.979171 82.343753 94.479171 C 81.13542 93.973962 79.97917 93.359379 78.890628 92.630212 C 77.796878 91.901045 76.786462 91.07292 75.859378 90.140629 C 74.927086 89.213545 74.098961 88.203129 73.369795 87.109379 C 72.640628 86.020837 72.026045 84.864587 71.520836 83.656253 C 71.020836 82.442712 70.640628 81.187503 70.38542 79.901045 C 70.130211 78.614587 70.000003 77.312503 70.000003 76.000003 C 70.000003 74.687503 70.130211 73.38542 70.38542 72.098961 C 70.640628 70.812503 71.020836 69.557295 71.520836 68.343753 C 72.026045 67.135419 72.640628 65.979169 73.369795 64.890628 C 74.098961 63.796878 74.927086 62.786461 75.859378 61.859378 C 76.786462 60.927086 77.796878 60.098961 78.890628 59.369794 C 79.97917 58.640627 81.13542 58.026044 82.343753 57.520836 C 83.557295 57.020836 84.812504 56.640627 86.098962 56.385419 C 87.38542 56.130211 88.687504 56.000002 90.000004 56.000002 C 91.312504 56.000002 92.614587 56.130211 93.901046 56.385419 C 95.187504 56.640627 96.442712 57.020836 97.656254 57.520836 C 98.864587 58.026044 100.020838 58.640627 101.109379 59.369794 C 102.203129 60.098961 103.213546 60.927086 104.140629 61.859378 C 105.072921 62.786461 105.901046 63.796878 106.630213 64.890628 C 107.359379 65.979169 107.973963 67.135419 108.479171 68.343753 C 108.979171 69.557295 109.35938 70.812503 109.614588 72.098961 C 109.869796 73.38542 110.000005 74.687503 110.000005 76.000003 Z M 110.000005 76.000003 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0, 0)"
|
||||
id="path75" />
|
||||
<g
|
||||
fill="#333333"
|
||||
fill-opacity="1"
|
||||
id="g81">
|
||||
<use
|
||||
xlink:href="#glyph-0-5"
|
||||
x="59.999996"
|
||||
y="62.249996"
|
||||
id="use77" />
|
||||
<use
|
||||
xlink:href="#glyph-0-6"
|
||||
x="67.5"
|
||||
y="62.249996"
|
||||
id="use79" />
|
||||
</g>
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(96.078491%, 96.078491%, 96.078491%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 85.000004 87.999996 C 91.666671 87.999996 95.000004 91.333329 95.000004 97.999996 C 95.000004 104.666663 91.666671 107.999997 85.000004 107.999997 Z M 85.000004 87.999996 "
|
||||
transform="matrix(0, 0.75, -0.75, 0, 140.999994, 6)"
|
||||
id="path83" />
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 90.000004 103.000004 L 89.828129 119.000005 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0, 0)"
|
||||
id="path85" />
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 92.802087 122.000005 C 92.802087 122.395838 92.723962 122.781255 92.572921 123.145838 C 92.421879 123.51563 92.203129 123.838547 91.921879 124.119797 C 91.640629 124.401047 91.317712 124.619797 90.94792 124.770839 C 90.578129 124.92188 90.19792 125.000005 89.802087 125.000005 C 89.401045 125.000005 89.020837 124.92188 88.651045 124.770839 C 88.286462 124.619797 87.958337 124.401047 87.677087 124.119797 C 87.395837 123.838547 87.182295 123.51563 87.026045 123.145838 C 86.875004 122.781255 86.802087 122.395838 86.802087 122.000005 C 86.802087 121.604172 86.875004 121.218755 87.026045 120.854172 C 87.182295 120.48438 87.395837 120.161463 87.677087 119.880213 C 87.958337 119.598963 88.286462 119.380213 88.651045 119.229172 C 89.020837 119.07813 89.401045 119.000005 89.802087 119.000005 C 90.19792 119.000005 90.578129 119.07813 90.94792 119.229172 C 91.317712 119.380213 91.640629 119.598963 91.921879 119.880213 C 92.203129 120.161463 92.421879 120.48438 92.572921 120.854172 C 92.723962 121.218755 92.802087 121.604172 92.802087 122.000005 Z M 92.802087 122.000005 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0, 0)"
|
||||
id="path87" />
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(96.078491%, 96.078491%, 96.078491%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 190.000008 122.000005 L 270.000011 122.000005 L 270.000011 162.000007 L 190.000008 162.000007 Z M 190.000008 122.000005 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0, 0)"
|
||||
id="path89" />
|
||||
<g
|
||||
fill="#333333"
|
||||
fill-opacity="1"
|
||||
id="g95">
|
||||
<use
|
||||
xlink:href="#glyph-0-7"
|
||||
x="165"
|
||||
y="111.74999"
|
||||
id="use91" />
|
||||
<use
|
||||
xlink:href="#glyph-0-8"
|
||||
x="172.5"
|
||||
y="111.74999"
|
||||
id="use93" />
|
||||
</g>
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(96.078491%, 96.078491%, 96.078491%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 240.00001 112.000005 L 260.000011 112.000005 L 260.000011 122.000005 L 240.00001 122.000005 Z M 240.00001 112.000005 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0, 0)"
|
||||
id="path97" />
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(96.078491%, 96.078491%, 96.078491%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 205.000005 116.999991 C 211.666672 116.999991 215.000006 120.333324 215.000006 126.999991 C 215.000006 133.666658 211.666672 136.999992 205.000005 136.999992 Z M 205.000005 116.999991 "
|
||||
transform="matrix(0, 0.75, -0.75, 0, 252.749989, -62.249997)"
|
||||
id="path99" />
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 210.000009 162.000007 L 210.000009 182.000008 L 250.00001 182.000008 L 250.00001 170.23959 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0, 0)"
|
||||
id="path101" />
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 250.00001 164.23959 L 254.000011 172.239591 L 250.00001 170.23959 L 246.00001 172.239591 Z M 250.00001 164.23959 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0, 0)"
|
||||
id="path103" />
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(96.078491%, 96.078491%, 96.078491%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 230.00001 76.000003 C 230.00001 77.312503 229.869801 78.614587 229.614593 79.901045 C 229.359385 81.187503 228.979176 82.442712 228.479176 83.656253 C 227.973968 84.864587 227.359384 86.020837 226.630218 87.109379 C 225.901051 88.203129 225.072926 89.213545 224.140634 90.140629 C 223.213551 91.07292 222.203134 91.901045 221.109384 92.630212 C 220.020843 93.359379 218.864592 93.973962 217.656259 94.479171 C 216.442717 94.979171 215.187509 95.359379 213.901051 95.614587 C 212.614592 95.869796 211.312509 96.000004 210.000009 96.000004 C 208.687509 96.000004 207.385425 95.869796 206.098967 95.614587 C 204.812509 95.359379 203.5573 94.979171 202.343758 94.479171 C 201.135425 93.973962 199.979175 93.359379 198.890633 92.630212 C 197.796883 91.901045 196.786467 91.07292 195.859383 90.140629 C 194.927091 89.213545 194.098966 88.203129 193.3698 87.109379 C 192.640633 86.020837 192.02605 84.864587 191.520841 83.656253 C 191.020841 82.442712 190.640633 81.187503 190.385425 79.901045 C 190.130216 78.614587 190.000008 77.312503 190.000008 76.000003 C 190.000008 74.687503 190.130216 73.38542 190.385425 72.098961 C 190.640633 70.812503 191.020841 69.557295 191.520841 68.343753 C 192.02605 67.135419 192.640633 65.979169 193.3698 64.890628 C 194.098966 63.796878 194.927091 62.786461 195.859383 61.859378 C 196.786467 60.927086 197.796883 60.098961 198.890633 59.369794 C 199.979175 58.640627 201.135425 58.026044 202.343758 57.520836 C 203.5573 57.020836 204.812509 56.640627 206.098967 56.385419 C 207.385425 56.130211 208.687509 56.000002 210.000009 56.000002 C 211.312509 56.000002 212.614592 56.130211 213.901051 56.385419 C 215.187509 56.640627 216.442717 57.020836 217.656259 57.520836 C 218.864592 58.026044 220.020843 58.640627 221.109384 59.369794 C 222.203134 60.098961 223.213551 60.927086 224.140634 61.859378 C 225.072926 62.786461 225.901051 63.796878 226.630218 64.890628 C 227.359384 65.979169 227.973968 67.135419 228.479176 68.343753 C 228.979176 69.557295 229.359385 70.812503 229.614593 72.098961 C 229.869801 73.38542 230.00001 74.687503 230.00001 76.000003 Z M 230.00001 76.000003 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0, 0)"
|
||||
id="path105" />
|
||||
<g
|
||||
fill="#333333"
|
||||
fill-opacity="1"
|
||||
id="g111">
|
||||
<use
|
||||
xlink:href="#glyph-0-5"
|
||||
x="150"
|
||||
y="62.249996"
|
||||
id="use107" />
|
||||
<use
|
||||
xlink:href="#glyph-0-6"
|
||||
x="157.5"
|
||||
y="62.249996"
|
||||
id="use109" />
|
||||
</g>
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(96.078491%, 96.078491%, 96.078491%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 205.000004 87.999991 C 211.666671 87.999991 215.000004 91.333324 215.000004 97.999991 C 215.000004 104.666658 211.666671 107.999992 205.000004 107.999992 Z M 205.000004 87.999991 "
|
||||
transform="matrix(0, 0.75, -0.75, 0, 230.99999, -83.999997)"
|
||||
id="path113" />
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 210.000009 103.000004 L 209.828134 119.000005 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0, 0)"
|
||||
id="path115" />
|
||||
<path
|
||||
fill-rule="nonzero"
|
||||
fill="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
fill-opacity="1"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(39.99939%, 39.99939%, 39.99939%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="4"
|
||||
d="M 212.802092 122.000005 C 212.802092 122.395838 212.723967 122.781255 212.572926 123.145838 C 212.421884 123.51563 212.203134 123.838547 211.921884 124.119797 C 211.640634 124.401047 211.317717 124.619797 210.947925 124.770839 C 210.578134 124.92188 210.197925 125.000005 209.802092 125.000005 C 209.40105 125.000005 209.020842 124.92188 208.65105 124.770839 C 208.286467 124.619797 207.958342 124.401047 207.677092 124.119797 C 207.395842 123.838547 207.1823 123.51563 207.02605 123.145838 C 206.875009 122.781255 206.802092 122.395838 206.802092 122.000005 C 206.802092 121.604172 206.875009 121.218755 207.02605 120.854172 C 207.1823 120.48438 207.395842 120.161463 207.677092 119.880213 C 207.958342 119.598963 208.286467 119.380213 208.65105 119.229172 C 209.020842 119.07813 209.40105 119.000005 209.802092 119.000005 C 210.197925 119.000005 210.578134 119.07813 210.947925 119.229172 C 211.317717 119.380213 211.640634 119.598963 211.921884 119.880213 C 212.203134 120.161463 212.421884 120.48438 212.572926 120.854172 C 212.723967 121.218755 212.802092 121.604172 212.802092 122.000005 Z M 212.802092 122.000005 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0, 0)"
|
||||
id="path117" />
|
||||
<g
|
||||
fill="#000000"
|
||||
fill-opacity="1"
|
||||
id="g133">
|
||||
<use
|
||||
xlink:href="#glyph-1-1"
|
||||
x="44.226562"
|
||||
y="23.999998"
|
||||
id="use119" />
|
||||
<use
|
||||
xlink:href="#glyph-1-2"
|
||||
x="51.734615"
|
||||
y="23.999998"
|
||||
id="use121" />
|
||||
<use
|
||||
xlink:href="#glyph-1-3"
|
||||
x="59.242672"
|
||||
y="23.999998"
|
||||
id="use123" />
|
||||
<use
|
||||
xlink:href="#glyph-1-4"
|
||||
x="66.750732"
|
||||
y="23.999998"
|
||||
id="use125" />
|
||||
<use
|
||||
xlink:href="#glyph-1-5"
|
||||
x="78.754395"
|
||||
y="23.999998"
|
||||
id="use127" />
|
||||
<use
|
||||
xlink:href="#glyph-1-6"
|
||||
x="87.000732"
|
||||
y="23.999998"
|
||||
id="use129" />
|
||||
<use
|
||||
xlink:href="#glyph-1-1"
|
||||
x="90.751457"
|
||||
y="23.999998"
|
||||
id="use131" />
|
||||
</g>
|
||||
<g
|
||||
clip-path="url(#clip-0)"
|
||||
id="g137">
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="#000000"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="m 110.00001,201.00001 -0.23959,-29"
|
||||
transform="matrix(0.75,0,0,0.75,0.375,0.375)"
|
||||
id="path135" />
|
||||
</g>
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke="rgb(72.158813%, 32.939148%, 31.369019%)"
|
||||
stroke-opacity="1"
|
||||
stroke-miterlimit="10"
|
||||
d="M 90.000004 172.000007 L 130.000005 172.000007 "
|
||||
transform="matrix(0.75, 0, 0, 0.75, 0, 0)"
|
||||
id="path139" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 77 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 416 KiB After Width: | Height: | Size: 416 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
@@ -0,0 +1,317 @@
|
||||
# Linux Networking
|
||||
|
||||
## Interface LEGO®
|
||||
|
||||

|
||||
|
||||
| **Type** | **Yang Model** | **Description** |
|
||||
| -------- | ----------------- | ------------------------------------------------------------- |
|
||||
| bridge | infix-if-bridge | SW implementation of an IEEE 802.1Q bridge |
|
||||
| ip | ietf-ip, infix-ip | IP address to the subordinate interface |
|
||||
| vlan | ietf-vlan-encap | Capture all traffic belonging to a specific 802.1Q VID |
|
||||
| lag[^1] | infix-if-lag | Bonds multiple interfaces into one, creating a link aggregate |
|
||||
| lo | ietf-interfaces | Software loopback interface |
|
||||
| eth | ietf-interfaces | Physical Ethernet device/port |
|
||||
| veth | infix-if-veth | Virtual Ethernet pair, typically one end is in a container |
|
||||
|
||||
## Data Plane
|
||||
|
||||
The blocks you ctose, and how you connect them, defines your data plane. Here we see an example of how to bridge a virtual port with a physical LAN.
|
||||
|
||||

|
||||
|
||||
Depending on the (optional) VLAN filtering of the bridge, the container may have full or limited connectivity with outside ports, as well as the internal CPU.
|
||||
|
||||
In fact the virtual port connected to the bridge can be member of several VLANs, with each VLAN being an interface with an IP address inside the container.
|
||||
|
||||
Thanks to Linux, and technologies like switchdev, that allow you to split a switching fabric into unique (isolated) ports, the full separation and virtualization of all Ethernet layer properties are possible to share with a container. Meaning, all the building blocks used on the left hand side can also be used freely on the right hand side as well.
|
||||
|
||||
### Bridging
|
||||
|
||||
This is the most central part of the system. A bridge is a switch, and a switch is a bridge. In Linux, setting up a bridge with ports connected to physical switch fabric, means you manage the actual switch fabric!
|
||||
|
||||
In Infix ports are by default not switch ports, unless the customer specific factory config sets it up this way. To enable switching between ports you create a bridge and then add ports to that bridge. That's it.
|
||||
|
||||
```
|
||||
admin@example:/> configure
|
||||
admin@example:/config/> edit interfaces interface br0
|
||||
admin@example:/config/interfaces/interface/br0/> up
|
||||
admin@example:/config/interfaces/> set interface eth0 bridge-port bridge br0
|
||||
admin@example:/config/interfaces/> set interface eth1 bridge-port bridge br0
|
||||
admin@example:/config/interfaces/> leave
|
||||
```
|
||||
|
||||
Here we add two ports to bridge `br0`: `eth0` and `eth1`.
|
||||
|
||||
> **Note:** Infix has many built-in helpers controlled by convention. E.g., if you name your bridge `brN`, where `N` is a number, Infix will set the interface type automatically for you, and unlock all bridge features for you.
|
||||
|
||||
#### VLAN Filtering Bridge
|
||||
|
||||
By default bridges in Linux do not filter based on VLAN tags. It can be enabled in Infix when creating a bridge by adding a port to a VLAN as a tagged or untagged member:
|
||||
|
||||
```
|
||||
admin@example:/config/> edit interfaces interface br0
|
||||
admin@example:/config/interfaces/interface/br0/> up
|
||||
admin@example:/config/interfaces/> set interface eth0 bridge-port bridge br0
|
||||
admin@example:/config/interfaces/> set interface eth1 bridge-port bridge br0
|
||||
admin@example:/config/interfaces/> edit interface br0
|
||||
admin@example:/config/interfaces/interface/br0/> set bridge vlans vlan 10 untagged eth0
|
||||
admin@example:/config/interfaces/interface/br0/> set bridge vlans vlan 20 untagged eth1
|
||||
```
|
||||
|
||||
This sets `eth0` as an untagged member of VLAN 10 and `eth1` as an
|
||||
untagged member of VLAN 20. Switching between these ports is thus
|
||||
prohibited.
|
||||
|
||||
### VLAN Interfaces
|
||||
|
||||
Creating a VLAN can be done in many ways. This section assumes VLAN interfaces created atop another Linux interface. E.g., the VLAN interfaces created on top of the bridge in the picture above.
|
||||
|
||||
A VLAN interface is basically a filtering abstraction. When you run `tcpdump` on a VLAN interface you will only see the frames matching the VLAN ID of the interface, compared to *all* the VLAN IDs if you run `tcpdump` on the parent interface.
|
||||
|
||||
```
|
||||
admin@example:/> configure
|
||||
admin@example:/config/> edit interfaces interface eth0.20
|
||||
admin@example:/config/interfaces/interface/eth0.20/> set encapsulation dot1q-vlan outer-tag tag-type c-vlan vlan-id 20
|
||||
admin@example:/config/interfaces/interface/eth0.20/> set parent-interface eth0
|
||||
admin@example:/config/interfaces/interface/eth0.20/> leave
|
||||
```
|
||||
|
||||
> **Note:** If you name your VLAN interface `foo0.N`, where `N` is a number, Infix will set the interface type automatically for you.
|
||||
|
||||
## Management Plane
|
||||
|
||||
This section details IP Addresses And Other Per-Interface IP settings.
|
||||
|
||||
Infix support several network interface types, each can be assigned one or more IP addresses, both IPv4 and IPv6 are supported.
|
||||
|
||||

|
||||
|
||||
### IPv4 Address Assignment
|
||||
|
||||
Multiple address assignment methods are available:
|
||||
|
||||
| **Type** | **Yang Model** | **Description** |
|
||||
|:---------- |:----------------- |:-------------------------------------------------------------- |
|
||||
| static | ietf-ip | Static assignment of IPv4 address, e.g., *10.0.1.1/24* |
|
||||
| link-local | infix-ip | Auto-assignment of IPv4 address in 169.254.x.x/16 range |
|
||||
| dhcp | infix-dhcp-client | Assignment of IPv4 address by DHCP server, e.g., *10.0.1.1/24* |
|
||||
|
||||
DHCP address method is only available for *LAN* interfaces (ethernet, virtual ethernet (veth), bridge, etc.)
|
||||
|
||||
### IPv6 Address Assignment
|
||||
|
||||
Multiple address assignment methods are available:
|
||||
|
||||
| **Type** | **Yang Model** | **Description** |
|
||||
|:---------------- |:-------------- |:------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| static | ietf-ip | Static assignment of IPv6 address, e.g., *2001:db8:0:1::1/64* |
|
||||
| link-local | ietf-ip[^2] | (RFC4862) Auto-configured link-local IPv6 address (*fe80::0* prefix + interface identifier, e.g., *fe80::ccd2:82ff:fe52:728b/64*) |
|
||||
| global auto-conf | ietf-ip | (RFC4862) Auto-configured (stateless) global IPv6 address (prefix from router + interface identifier, e.g., *2001:db8:0:1:ccd2:82ff:fe52:728b/64* |
|
||||
|
||||
Both for *link-local* and *global auto-configuration*, it is possible
|
||||
to auto-configure using a random suffix instead of the interface
|
||||
identifier.
|
||||
|
||||
|
||||
### Examples
|
||||
|
||||

|
||||
|
||||
root@infix-00-00-00:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv6 fe80::ff:fe00:0/64 (link-layer)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
root@infix-00-00-00:/>
|
||||
|
||||
To illustrate IP address configuration, the examples below uses a
|
||||
switch with a single Ethernet interface (eth0) and a loopback
|
||||
interface (lo). As shown above, these examples assume *eth0* has an
|
||||
IPv6 link-local address and *lo* has static IPv4 and IPv6 addresses by
|
||||
default.
|
||||
|
||||
#### Static and link-local IPv4 addresses
|
||||
|
||||

|
||||
|
||||
root@example:/> configure
|
||||
root@example:/config/> edit interfaces interface eth0 ipv4
|
||||
root@example:/config/interfaces/interface/eth0/ipv4/> set address 10.0.1.1 prefix-length 24
|
||||
root@example:/config/interfaces/interface/eth0/ipv4/> set autoconf enabled true
|
||||
root@infix-example:/config/interfaces/interface/eth0/ipv4/> diff
|
||||
+interfaces {
|
||||
+ interface eth0 {
|
||||
+ ipv4 {
|
||||
+ address 10.0.1.1 {
|
||||
+ prefix-length 24;
|
||||
+ }
|
||||
+ autoconf {
|
||||
+ enabled true;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
root@infix-example:/config/interfaces/interface/eth0/ipv4/> leave
|
||||
root@infix-example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv4 10.0.1.1/24 (static)
|
||||
ipv6 fe80::ff:fe00:0/64 (link-layer)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
root@infix-example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv4 169.254.1.3/16 (random)
|
||||
ipv4 10.0.1.1/24 (static)
|
||||
ipv6 fe80::ff:fe00:0/64 (link-layer)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
root@infix-example:/>
|
||||
|
||||
As shown, the link-local IPv4 address is configured with `set autconf
|
||||
enabled true`. The resulting address (169.254.1.3/16) is of type
|
||||
*random* ([IETF ip-yang][ietf-ip-yang]).
|
||||
|
||||
#### Use of DHCP for IPv4 address assignment
|
||||
|
||||

|
||||
|
||||
root@example:/> configure
|
||||
root@example:/config/> edit dhcp-client
|
||||
root@example:/config/dhcp-client/> set client-if eth0
|
||||
root@example:/config/dhcp-client/> set enabled true
|
||||
root@example:/config/dhcp-client/> leave
|
||||
root@example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv4 10.1.2.100/24 (dhcp)
|
||||
ipv6 fe80::ff:fe00:0/64 (link-layer)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
|
||||
root@example:/>
|
||||
|
||||
The resulting address (10.1.2.100/24) is of type *dhcp*.
|
||||
|
||||
|
||||
#### Disabling IPv6 link-local address(es)
|
||||
|
||||
The (only) way to disable IPv6 link-local addresses is by disabling IPv6 on the interface.
|
||||
|
||||
```(disabling
|
||||
root@example:/> configure
|
||||
root@example:/config/> edit interfaces interface eth0 ipv6
|
||||
root@example:/config/interfaces/interface/eth0/ipv6/> set enabled false
|
||||
root@example:/config/interfaces/interface/eth0/ipv6/> leave
|
||||
root@example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
root@example:/>
|
||||
```
|
||||
|
||||
#### Static IPv6 address
|
||||
|
||||

|
||||
|
||||
root@example:/> configure
|
||||
root@example:/config/> edit interfaces interface eth0 ipv6
|
||||
root@example:/config/interfaces/interface/eth0/ipv6/> set address 2001:db8::1 prefix-length 64
|
||||
root@example:/config/interfaces/interface/eth0/ipv6/> leave
|
||||
root@example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv6 2001:db8::1/64 (static)
|
||||
ipv6 fe80::ff:fe00:0/64 (link-layer)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
root@example:/>
|
||||
|
||||
#### Stateless Auto-configuration of Global IPv6 Address
|
||||
|
||||

|
||||
|
||||
Stateless address auto-configuration of global addresses is enabled by
|
||||
default. The address is formed by concatenating the network prefix
|
||||
advertised by the router (here 2001:db8:0:1::0/64) and the interface
|
||||
identifier. The resulting address is of type *other*.
|
||||
|
||||
root@infix-example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv6 2001:db8:0:1:0:ff:fe00:0/64 (other)
|
||||
ipv6 fe80::ff:fe00:0/64 (link-layer)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
root@infix-example:/>
|
||||
|
||||
Disabling auto-configuration of global IPv6 addresses can be done as shown
|
||||
below.
|
||||
|
||||
root@infix-00-00-00:/> configure
|
||||
root@infix-00-00-00:/config/> edit interfaces interface eth0 ipv6
|
||||
root@infix-00-00-00:/config/interfaces/interface/eth0/ipv6/> set autoconf create-global-addresses false
|
||||
root@infix-00-00-00:/config/interfaces/interface/eth0/ipv6/> leave
|
||||
root@infix-00-00-00:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv6 fe80::ff:fe00:0/64 (link-layer)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
root@infix-00-00-00:/>
|
||||
|
||||
#### Random Link Identifiers for IPv6 Stateless Autoconfiguration
|
||||
|
||||

|
||||
|
||||
By default, the auto-configured link-local and global IPv6 addresses
|
||||
are formed from a link-identifier based on the MAC address.
|
||||
|
||||
root@infix-example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv6 2001:db8:0:1:0:ff:fe00:0/64 (other)
|
||||
ipv6 fe80::ff:fe00:0/64 (link-layer)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
root@infix-example:/>
|
||||
|
||||
To avoid revealing identity information in the IPv6 address, it is
|
||||
possible to specify use of a random identifier ([ietf-ip][ietf-ip-yang] YANG and [RFC8981][ietf-ipv6-privacy]).
|
||||
|
||||
root@infix-example:/> configure
|
||||
root@infix-example:/config/> edit interfaces interface eth0 ipv6
|
||||
root@infix-example:/config/interfaces/interface/eth0/ipv6/> set autoconf create-temporary-addresses true
|
||||
root@infix-example:/config/interfaces/interface/eth0/ipv6/> leave
|
||||
root@infix-example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv6 2001:db8:0:1:fba2:f413:dd22:13ad/64 (other)
|
||||
ipv6 fe80::b886:6849:18dc:19ef/64 (random)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
root@infix-example:/>
|
||||
|
||||
The link-local address has changed type to *random*.
|
||||
|
||||
[ietf-ip-yang]: https://www.rfc-editor.org/rfc/rfc8344.html
|
||||
[ietf-ipv6-privacy]: https://www.rfc-editor.org/rfc/rfc8981.html
|
||||
|
||||
[^1]: Please note, link aggregates are not yet supported in Infix.
|
||||
[^2]: Link-local IPv6 addresses are implicitly enabled when enabling IPv6. IPv6 can be enabled/disabled per interface in [ietf-ip][ietf-ip-yang] YANG model.
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ Tenets
|
||||
Architectural Overview
|
||||
----------------------
|
||||
|
||||

|
||||

|
||||
|
||||
The test system is made up of several independent components, which
|
||||
are typically used in concert to run a full test suite.
|
||||
@@ -140,7 +140,7 @@ DHCP server, and the other two as DHCP clients - with all three having
|
||||
a management connection to the host PC running the test. In other
|
||||
words, the test requires a _logical_ topology like the one below.
|
||||
|
||||
<img align="right" src="testing-log.dot.svg" alt="Example Logical Topology">
|
||||
<img align="right" src="img/testing-log.dot.svg" alt="Example Logical Topology">
|
||||
|
||||
```dot
|
||||
graph "dhcp-client-server" {
|
||||
@@ -187,7 +187,7 @@ degrees), we can deploy well-known algorithms to find such subgraphs.
|
||||
Continuing our example, let's say we want to run our DHCP test on the
|
||||
_physical_ topology below.
|
||||
|
||||
<img align="right" src="testing-phy.dot.svg" alt="Example Physical Topology">
|
||||
<img align="right" src="img/testing-phy.dot.svg" alt="Example Physical Topology">
|
||||
|
||||
```dot
|
||||
graph "quad-ring" {
|
||||
|
||||
@@ -0,0 +1,267 @@
|
||||
From bdb8d8549ed97a02935c8fb00ece05030f2f91ad Mon Sep 17 00:00:00 2001
|
||||
From: Petr Machata <petrm@nvidia.com>
|
||||
Date: Mon, 27 Mar 2023 18:12:05 +0200
|
||||
Subject: ip: Support IP address protocol
|
||||
|
||||
IPv4 and IPv6 addresses can be assigned a protocol value that indicates the
|
||||
provenance of the IP address. The attribute is modeled after ip route
|
||||
protocols, and essentially allows the administrator or userspace stack to
|
||||
tag addresses in some way that makes sense to the actor in question.
|
||||
Support for this feature was merged with commit 47f0bd503210 ("net: Add new
|
||||
protocol attribute to IP addresses"), for kernel 5.18.
|
||||
|
||||
In this patch, add support for setting the protocol attribute at IP address
|
||||
addition, replacement, and listing requests.
|
||||
|
||||
An example session with the feature in action:
|
||||
|
||||
# ip address add dev d 192.0.2.1/28 proto 0xab
|
||||
# ip address show dev d
|
||||
26: d: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default qlen 1000
|
||||
link/ether 06:29:74:fd:1f:eb brd ff:ff:ff:ff:ff:ff
|
||||
inet 192.0.2.1/28 scope global proto 0xab d
|
||||
valid_lft forever preferred_lft forever
|
||||
|
||||
# ip address replace dev d 192.0.2.1/28 proto 0x11
|
||||
# ip address show dev d
|
||||
26: d: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default qlen 1000
|
||||
link/ether 06:29:74:fd:1f:eb brd ff:ff:ff:ff:ff:ff
|
||||
inet 192.0.2.1/28 scope global proto 0x11 d
|
||||
valid_lft forever preferred_lft forever
|
||||
|
||||
A JSON dump. The protocol value is always provided as a string, even in
|
||||
numeric mode, to provide a consistent interface.
|
||||
|
||||
# ip -j address show dev d | jq
|
||||
[
|
||||
{
|
||||
"ifindex": 26,
|
||||
"ifname": "d",
|
||||
"flags": [
|
||||
"BROADCAST",
|
||||
"NOARP"
|
||||
],
|
||||
"mtu": 1500,
|
||||
"qdisc": "noop",
|
||||
"operstate": "DOWN",
|
||||
"group": "default",
|
||||
"txqlen": 1000,
|
||||
"link_type": "ether",
|
||||
"address": "06:29:74:fd:1f:eb",
|
||||
"broadcast": "ff:ff:ff:ff:ff:ff",
|
||||
"addr_info": [
|
||||
{
|
||||
"family": "inet",
|
||||
"local": "192.0.2.1",
|
||||
"prefixlen": 28,
|
||||
"scope": "global",
|
||||
"protocol": "0x11",
|
||||
"label": "d",
|
||||
"valid_life_time": 4294967295,
|
||||
"preferred_life_time": 4294967295
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
Signed-off-by: Petr Machata <petrm@nvidia.com>
|
||||
Signed-off-by: David Ahern <dsahern@kernel.org>
|
||||
---
|
||||
include/rt_names.h | 2 ++
|
||||
ip/ip_common.h | 2 ++
|
||||
ip/ipaddress.c | 34 ++++++++++++++++++++++++++++--
|
||||
lib/rt_names.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
4 files changed, 98 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/include/rt_names.h b/include/rt_names.h
|
||||
index 6358650db..e96d80f30 100644
|
||||
--- a/include/rt_names.h
|
||||
+++ b/include/rt_names.h
|
||||
@@ -5,6 +5,7 @@
|
||||
#include <asm/types.h>
|
||||
|
||||
const char *rtnl_rtprot_n2a(int id, char *buf, int len);
|
||||
+const char *rtnl_addrprot_n2a(int id, char *buf, int len);
|
||||
const char *rtnl_rtscope_n2a(int id, char *buf, int len);
|
||||
const char *rtnl_rttable_n2a(__u32 id, char *buf, int len);
|
||||
const char *rtnl_rtrealm_n2a(int id, char *buf, int len);
|
||||
@@ -13,6 +14,7 @@ const char *rtnl_dsfield_get_name(int id);
|
||||
const char *rtnl_group_n2a(int id, char *buf, int len);
|
||||
|
||||
int rtnl_rtprot_a2n(__u32 *id, const char *arg);
|
||||
+int rtnl_addrprot_a2n(__u32 *id, const char *arg);
|
||||
int rtnl_rtscope_a2n(__u32 *id, const char *arg);
|
||||
int rtnl_rttable_a2n(__u32 *id, const char *arg);
|
||||
int rtnl_rtrealm_a2n(__u32 *id, const char *arg);
|
||||
diff --git a/ip/ip_common.h b/ip/ip_common.h
|
||||
index c4cb1bcb1..4a20ec3cb 100644
|
||||
--- a/ip/ip_common.h
|
||||
+++ b/ip/ip_common.h
|
||||
@@ -28,6 +28,8 @@ struct link_filter {
|
||||
char *kind;
|
||||
char *slave_kind;
|
||||
int target_nsid;
|
||||
+ bool have_proto;
|
||||
+ int proto;
|
||||
};
|
||||
|
||||
const char *get_ip_lib_dir(void);
|
||||
diff --git a/ip/ipaddress.c b/ip/ipaddress.c
|
||||
index 9ba814380..41055c43e 100644
|
||||
--- a/ip/ipaddress.c
|
||||
+++ b/ip/ipaddress.c
|
||||
@@ -57,11 +57,13 @@ static void usage(void)
|
||||
" ip address [ show [ dev IFNAME ] [ scope SCOPE-ID ] [ master DEVICE ]\n"
|
||||
" [ nomaster ]\n"
|
||||
" [ type TYPE ] [ to PREFIX ] [ FLAG-LIST ]\n"
|
||||
- " [ label LABEL ] [up] [ vrf NAME ] ]\n"
|
||||
+ " [ label LABEL ] [up] [ vrf NAME ]\n"
|
||||
+ " [ proto ADDRPROTO ] ]\n"
|
||||
" ip address {showdump|restore}\n"
|
||||
"IFADDR := PREFIX | ADDR peer PREFIX\n"
|
||||
" [ broadcast ADDR ] [ anycast ADDR ]\n"
|
||||
" [ label IFNAME ] [ scope SCOPE-ID ] [ metric METRIC ]\n"
|
||||
+ " [ proto ADDRPROTO ]\n"
|
||||
"SCOPE-ID := [ host | link | global | NUMBER ]\n"
|
||||
"FLAG-LIST := [ FLAG-LIST ] FLAG\n"
|
||||
"FLAG := [ permanent | dynamic | secondary | primary |\n"
|
||||
@@ -70,7 +72,9 @@ static void usage(void)
|
||||
"CONFFLAG-LIST := [ CONFFLAG-LIST ] CONFFLAG\n"
|
||||
"CONFFLAG := [ home | nodad | mngtmpaddr | noprefixroute | autojoin ]\n"
|
||||
"LIFETIME := [ valid_lft LFT ] [ preferred_lft LFT ]\n"
|
||||
- "LFT := forever | SECONDS\n");
|
||||
+ "LFT := forever | SECONDS\n"
|
||||
+ "ADDRPROTO := [ NAME | NUMBER ]\n"
|
||||
+ );
|
||||
iplink_types_usage();
|
||||
|
||||
exit(-1);
|
||||
@@ -1568,6 +1572,9 @@ int print_addrinfo(struct nlmsghdr *n, void *arg)
|
||||
|
||||
if (filter.family && filter.family != ifa->ifa_family)
|
||||
return 0;
|
||||
+ if (filter.have_proto && rta_tb[IFA_PROTO] &&
|
||||
+ filter.proto != rta_getattr_u8(rta_tb[IFA_PROTO]))
|
||||
+ return 0;
|
||||
|
||||
if (ifa_label_match_rta(ifa->ifa_index, rta_tb[IFA_LABEL]))
|
||||
return 0;
|
||||
@@ -1675,6 +1682,14 @@ int print_addrinfo(struct nlmsghdr *n, void *arg)
|
||||
|
||||
print_ifa_flags(fp, ifa, ifa_flags);
|
||||
|
||||
+ if (rta_tb[IFA_PROTO]) {
|
||||
+ __u8 proto = rta_getattr_u8(rta_tb[IFA_PROTO]);
|
||||
+
|
||||
+ if (proto || is_json_context())
|
||||
+ print_string(PRINT_ANY, "protocol", "proto %s ",
|
||||
+ rtnl_addrprot_n2a(proto, b1, sizeof(b1)));
|
||||
+ }
|
||||
+
|
||||
if (rta_tb[IFA_LABEL])
|
||||
print_string(PRINT_ANY,
|
||||
"label",
|
||||
@@ -2196,6 +2211,14 @@ static int ipaddr_list_flush_or_save(int argc, char **argv, int action)
|
||||
} else {
|
||||
filter.kind = *argv;
|
||||
}
|
||||
+ } else if (strcmp(*argv, "proto") == 0) {
|
||||
+ __u8 proto;
|
||||
+
|
||||
+ NEXT_ARG();
|
||||
+ if (get_u8(&proto, *argv, 0))
|
||||
+ invarg("\"proto\" value is invalid\n", *argv);
|
||||
+ filter.have_proto = true;
|
||||
+ filter.proto = proto;
|
||||
} else {
|
||||
if (strcmp(*argv, "dev") == 0)
|
||||
NEXT_ARG();
|
||||
@@ -2520,6 +2543,13 @@ static int ipaddr_modify(int cmd, int flags, int argc, char **argv)
|
||||
} else {
|
||||
ifa_flags |= flag_data->mask;
|
||||
}
|
||||
+ } else if (strcmp(*argv, "proto") == 0) {
|
||||
+ __u8 proto;
|
||||
+
|
||||
+ NEXT_ARG();
|
||||
+ if (get_u8(&proto, *argv, 0))
|
||||
+ invarg("\"proto\" value is invalid\n", *argv);
|
||||
+ addattr8(&req.n, sizeof(req), IFA_PROTO, proto);
|
||||
} else {
|
||||
if (strcmp(*argv, "local") == 0)
|
||||
NEXT_ARG();
|
||||
diff --git a/lib/rt_names.c b/lib/rt_names.c
|
||||
index 2432224ac..51d11fd05 100644
|
||||
--- a/lib/rt_names.c
|
||||
+++ b/lib/rt_names.c
|
||||
@@ -226,6 +226,68 @@ int rtnl_rtprot_a2n(__u32 *id, const char *arg)
|
||||
}
|
||||
|
||||
|
||||
+static char *rtnl_addrprot_tab[256] = {
|
||||
+ [IFAPROT_UNSPEC] = "unspec",
|
||||
+ [IFAPROT_KERNEL_LO] = "kernel_lo",
|
||||
+ [IFAPROT_KERNEL_RA] = "kernel_ra",
|
||||
+ [IFAPROT_KERNEL_LL] = "kernel_ll",
|
||||
+};
|
||||
+static bool rtnl_addrprot_tab_initialized;
|
||||
+
|
||||
+static void rtnl_addrprot_initialize(void)
|
||||
+{
|
||||
+ rtnl_tab_initialize(CONFDIR "/rt_addrprotos",
|
||||
+ rtnl_addrprot_tab,
|
||||
+ ARRAY_SIZE(rtnl_addrprot_tab));
|
||||
+ rtnl_addrprot_tab_initialized = true;
|
||||
+}
|
||||
+
|
||||
+const char *rtnl_addrprot_n2a(int id, char *buf, int len)
|
||||
+{
|
||||
+ if (id < 0 || id >= 256 || numeric)
|
||||
+ goto numeric;
|
||||
+ if (!rtnl_addrprot_tab_initialized)
|
||||
+ rtnl_addrprot_initialize();
|
||||
+ if (rtnl_addrprot_tab[id])
|
||||
+ return rtnl_addrprot_tab[id];
|
||||
+numeric:
|
||||
+ snprintf(buf, len, "%#x", id);
|
||||
+ return buf;
|
||||
+}
|
||||
+
|
||||
+int rtnl_addrprot_a2n(__u32 *id, const char *arg)
|
||||
+{
|
||||
+ static char *cache;
|
||||
+ static unsigned long res;
|
||||
+ char *end;
|
||||
+ int i;
|
||||
+
|
||||
+ if (cache && strcmp(cache, arg) == 0) {
|
||||
+ *id = res;
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ if (!rtnl_addrprot_tab_initialized)
|
||||
+ rtnl_addrprot_initialize();
|
||||
+
|
||||
+ for (i = 0; i < 256; i++) {
|
||||
+ if (rtnl_addrprot_tab[i] &&
|
||||
+ strcmp(rtnl_addrprot_tab[i], arg) == 0) {
|
||||
+ cache = rtnl_addrprot_tab[i];
|
||||
+ res = i;
|
||||
+ *id = res;
|
||||
+ return 0;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ res = strtoul(arg, &end, 0);
|
||||
+ if (!end || end == arg || *end || res > 255)
|
||||
+ return -1;
|
||||
+ *id = res;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+
|
||||
static char *rtnl_rtscope_tab[256] = {
|
||||
[RT_SCOPE_UNIVERSE] = "global",
|
||||
[RT_SCOPE_NOWHERE] = "nowhere",
|
||||
--
|
||||
cgit
|
||||
@@ -56,6 +56,7 @@ sysrepoctl -s $SEARCH \
|
||||
-i ietf-interfaces@2018-02-20.yang -g wheel -p 0660 \
|
||||
-e if-mib \
|
||||
-i ietf-ip@2018-02-22.yang -g wheel -p 0660 \
|
||||
-e ipv6-privacy-autoconf \
|
||||
-i ietf-network-instance@2019-01-21.yang -g wheel -p 0660 \
|
||||
-i ietf-netconf-monitoring@2010-10-04.yang -g wheel -p 0660 \
|
||||
-i ietf-netconf-nmda@2019-01-07.yang -g wheel -p 0660 \
|
||||
@@ -75,9 +76,9 @@ sysrepoctl -s $SEARCH \
|
||||
-i ieee802-dot1q-types@2022-10-29.yang -g wheel -p 0660 \
|
||||
-i ietf-if-vlan-encapsulation@2023-01-26.yang \
|
||||
-g wheel -p 0660 \
|
||||
-i infix-ip@2023-04-24.yang -g wheel -p 0660 \
|
||||
-i infix-ip@2023-09-14.yang -g wheel -p 0660 \
|
||||
-i infix-if-type@2023-08-21.yang -g wheel -p 0660 \
|
||||
-i infix-interfaces@2023-08-21.yang -g wheel -p 0660 \
|
||||
-i infix-interfaces@2023-09-19.yang -g wheel -p 0660 \
|
||||
-e vlan-filtering \
|
||||
-i ieee802-dot1ab-lldp@2022-03-15.yang -g wheel -p 0660 \
|
||||
-i infix-lldp@2023-08-23.yang -g wheel -p 0660 \
|
||||
|
||||
@@ -381,7 +381,7 @@ static int netdag_gen_diff_addr(FILE *ip, const char *ifname,
|
||||
is_std_lo_addr(ifname, adrd.new, pfxd.new))
|
||||
addcmd = "replace";
|
||||
|
||||
fprintf(ip, "address %s %s/%s dev %s\n", addcmd,
|
||||
fprintf(ip, "address %s %s/%s dev %s proto 4\n", addcmd,
|
||||
adrd.new, pfxd.new, ifname);
|
||||
return 0;
|
||||
}
|
||||
@@ -416,6 +416,43 @@ static int netdag_set_conf_addrs(FILE *ip, const char *ifname,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int netdag_gen_link_addr(FILE *ip, struct lyd_node *cif, struct lyd_node *dif)
|
||||
{
|
||||
const char *ifname = lydx_get_cattr(dif, "name");
|
||||
const char *mac = NULL;
|
||||
struct lyd_node *node;
|
||||
char buf[32];
|
||||
|
||||
node = lydx_get_child(dif, "phys-address");
|
||||
if (lydx_get_op(node) == LYDX_OP_DELETE) {
|
||||
FILE *fp;
|
||||
|
||||
/*
|
||||
* Only physical interfaces support this, virtual ones
|
||||
* we remove, see netdag_must_del() for details.
|
||||
*/
|
||||
fp = popenf("r", "ip -d -j link show dev %s |jq -rM .[].permaddr", ifname);
|
||||
if (fp) {
|
||||
if (fgets(buf, sizeof(buf), fp))
|
||||
mac = chomp(buf);
|
||||
pclose(fp);
|
||||
|
||||
if (mac && !strcmp(mac, "null"))
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
mac = lyd_get_value(node);
|
||||
}
|
||||
|
||||
if (!mac || !strlen(mac)) {
|
||||
DEBUG("No change in %s phys-address, skipping ...", ifname);
|
||||
return 0;
|
||||
}
|
||||
|
||||
fprintf(ip, "link set %s address %s\n", ifname, mac);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int netdag_gen_ip_addrs(FILE *ip, const char *proto,
|
||||
struct lyd_node *cif, struct lyd_node *dif)
|
||||
{
|
||||
@@ -435,37 +472,45 @@ static int netdag_gen_ip_addrs(FILE *ip, const char *proto,
|
||||
return netdag_gen_diff_addrs(ip, ifname, ipdiff);
|
||||
}
|
||||
|
||||
static int netdag_gen_ipv6_autoconf(FILE *ip, struct lyd_node *cif,
|
||||
struct lyd_node *dif)
|
||||
static int netdag_gen_ipv6_autoconf(struct dagger *net, struct lyd_node *cif,
|
||||
struct lyd_node *dif, FILE *ip)
|
||||
{
|
||||
const char *preferred_lft = "86400", *valid_lft = "604800";
|
||||
struct lyd_node *ipconf = lydx_get_child(cif, "ipv6");
|
||||
struct lyd_node *ipdiff = lydx_get_child(dif, "ipv6");
|
||||
const char *ifname = lydx_get_cattr(dif, "name");
|
||||
int global = 0, random = 0;
|
||||
struct lyd_node *node;
|
||||
struct lydx_diff nd;
|
||||
FILE *fp;
|
||||
|
||||
if (!ipconf || !lydx_is_enabled(ipconf, "enabled"))
|
||||
goto disable;
|
||||
|
||||
if (lydx_get_op(lydx_get_child(ipdiff, "enabled")) == LYDX_OP_REPLACE) {
|
||||
node = lydx_get_child(ipconf, "autoconf");
|
||||
if (node && lydx_is_enabled(node, "create-global-addresses"))
|
||||
goto enable;
|
||||
goto disable;
|
||||
}
|
||||
|
||||
node = lydx_get_descendant(lydx_get_child(ipdiff, "autoconf"),
|
||||
"create-global-addresses", NULL);
|
||||
if (!node || !lydx_get_diff(node, &nd))
|
||||
return 0;
|
||||
|
||||
if (!nd.new || !strcmp(nd.val, "true")) {
|
||||
enable:
|
||||
fputs(" addrgenmode eui64", ip);
|
||||
} else {
|
||||
disable:
|
||||
if (!ipconf || !lydx_is_enabled(ipconf, "enabled")) {
|
||||
fputs(" addrgenmode none", ip);
|
||||
return 0;
|
||||
}
|
||||
|
||||
node = lydx_get_child(ipconf, "autoconf");
|
||||
if (node) {
|
||||
global = lydx_is_enabled(node, "create-global-addresses");
|
||||
random = lydx_is_enabled(node, "create-temporary-addresses");
|
||||
|
||||
preferred_lft = lydx_get_cattr(node, "temporary-preferred-lifetime");
|
||||
valid_lft = lydx_get_cattr(node, "temporary-valid-lifetime");
|
||||
}
|
||||
|
||||
fp = dagger_fopen_next(net, "init", ifname, 45, "init.sysctl");
|
||||
if (fp) {
|
||||
/* Autoconfigure addresses using Prefix Information in Router Advertisements */
|
||||
fprintf(fp, "net.ipv6.conf.%s.autoconf = %d\n", ifname, global);
|
||||
/* The amount of Duplicate Address Detection probes to send. */
|
||||
fprintf(fp, "net.ipv6.conf.%s.dad_transmits = %s\n", ifname,
|
||||
lydx_get_cattr(ipconf, "dup-addr-detect-transmits"));
|
||||
/* Preferred and valid lifetimes for temporary (random) addresses */
|
||||
fprintf(fp, "net.ipv6.conf.%s.temp_prefered_lft = %s\n", ifname, preferred_lft);
|
||||
fprintf(fp, "net.ipv6.conf.%s.temp_valid_lft = %s\n", ifname, valid_lft);
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
fprintf(ip, " addrgenmode %s", random ? "random" : "eui64");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -827,7 +872,13 @@ static int netdag_gen_vlan(struct dagger *net, struct lyd_node *dif,
|
||||
"outer-tag",
|
||||
NULL);
|
||||
if (!otag) {
|
||||
ERROR("%s: missing mandatory outer-tag", ifname);
|
||||
/*
|
||||
* Note: this is only an error if outer-tag is missing
|
||||
* from cif, otherwise it just means the interface had a
|
||||
* a change that was not related to the VLAN config.
|
||||
*/
|
||||
if (!dif)
|
||||
ERROR("%s: missing mandatory outer-tag", ifname);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -892,21 +943,49 @@ static int netdag_gen_afspec_set(struct dagger *net, struct lyd_node *dif,
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static bool is_phys_addr_deleted(struct lyd_node *dif)
|
||||
{
|
||||
struct lyd_node *node;
|
||||
|
||||
node = lydx_get_child(dif, "phys-address");
|
||||
if (node && lydx_get_op(node) == LYDX_OP_DELETE)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool netdag_must_del(struct lyd_node *dif, struct lyd_node *cif)
|
||||
{
|
||||
const char *iftype = lydx_get_cattr(cif, "type");
|
||||
|
||||
if (!strcmp(iftype, "infix-if-type:bridge"))
|
||||
return 0;
|
||||
if (!strcmp(iftype, "infix-if-type:vlan"))
|
||||
return lydx_get_cattr(dif, "parent-interface") ||
|
||||
lydx_get_descendant(lyd_child(dif),
|
||||
"encapsulation",
|
||||
"dot1q-vlan",
|
||||
"outer-tag",
|
||||
NULL);
|
||||
if (!strcmp(iftype, "infix-if-type:veth"))
|
||||
return lydx_get_descendant(lyd_child(dif), "peer", NULL);
|
||||
if (!strcmp(iftype, "infix-if-type:bridge")) {
|
||||
if (is_phys_addr_deleted(dif))
|
||||
return true;
|
||||
} else if (!strcmp(iftype, "infix-if-type:vlan")) {
|
||||
if (is_phys_addr_deleted(dif))
|
||||
return true;
|
||||
|
||||
if (lydx_get_cattr(dif, "parent-interface") ||
|
||||
lydx_get_descendant(lyd_child(dif),
|
||||
"encapsulation",
|
||||
"dot1q-vlan",
|
||||
"outer-tag",
|
||||
NULL))
|
||||
return true;
|
||||
} else if (!strcmp(iftype, "infix-if-type:veth")) {
|
||||
if (is_phys_addr_deleted(dif))
|
||||
return true;
|
||||
|
||||
if (lydx_get_descendant(lyd_child(dif), "peer", NULL))
|
||||
return true;
|
||||
/*
|
||||
} else if (!strcmp(iftype, "infix-if-type:lag")) {
|
||||
if (is_phys_addr_deleted(dif))
|
||||
return true;
|
||||
|
||||
... REMEMBER WHEN ADDING BOND SUPPORT ...
|
||||
*/
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -996,7 +1075,7 @@ static sr_error_t netdag_gen_iface(struct dagger *net,
|
||||
|
||||
/* Set generic link attributes */
|
||||
err = err ? : netdag_gen_ipv4_autoconf(net, cif, dif);
|
||||
err = err ? : netdag_gen_ipv6_autoconf(ip, cif, dif);
|
||||
err = err ? : netdag_gen_ipv6_autoconf(net, cif, dif, ip);
|
||||
if (err)
|
||||
goto err_close_ip;
|
||||
|
||||
@@ -1014,6 +1093,7 @@ static sr_error_t netdag_gen_iface(struct dagger *net,
|
||||
}
|
||||
|
||||
/* Set Addresses */
|
||||
err = err ? : netdag_gen_link_addr(ip, cif, dif);
|
||||
err = err ? : netdag_gen_ip_addrs(ip, "ipv4", cif, dif);
|
||||
err = err ? : netdag_gen_ip_addrs(ip, "ipv6", cif, dif);
|
||||
if (err)
|
||||
|
||||
@@ -41,7 +41,6 @@ static int svc_change(sr_session_ctx_t *session, sr_event_t event, const char *x
|
||||
}
|
||||
|
||||
snprintf(path, sizeof(path), "%s//.", xpath);
|
||||
ERROR("HELO getting data from %s", path);
|
||||
err = sr_get_data(session, path, 0, 0, 0, &cfg);
|
||||
if (err) {
|
||||
ERROR("no data for %s", path);
|
||||
@@ -59,8 +58,6 @@ static int svc_change(sr_session_ctx_t *session, sr_event_t event, const char *x
|
||||
}
|
||||
|
||||
ena = lydx_is_enabled(srv, "enabled");
|
||||
ERROR("Service %s (%s) is %s", name, svc, ena ? "enabled" : "disabled");
|
||||
|
||||
if (systemf("initctl -nbq %s %s", ena ? "enable" : "disable", svc))
|
||||
ERROR("Failed %s %s", ena ? "enabling" : "disabling", name);
|
||||
|
||||
|
||||
@@ -18,6 +18,11 @@ module infix-interfaces {
|
||||
contact "kernelkit@googlegroups.com";
|
||||
description "Linux bridge and lag extensions for ietf-interfaces.";
|
||||
|
||||
revision 2023-09-19 {
|
||||
description "Add deviation to allow setting phys-address on links.";
|
||||
reference "internal";
|
||||
}
|
||||
|
||||
revision 2023-08-21 {
|
||||
description "Move port augment to submodule for infix-if-bridge and
|
||||
infix-if-lag (later) which reference it.
|
||||
@@ -46,7 +51,14 @@ module infix-interfaces {
|
||||
}
|
||||
}
|
||||
|
||||
deviation "/if:interfaces/if:interface/if:phys-address" {
|
||||
deviate replace {
|
||||
config true;
|
||||
}
|
||||
}
|
||||
|
||||
deviation "/if:interfaces-state" {
|
||||
deviate not-supported;
|
||||
description "Deprecated";
|
||||
}
|
||||
}
|
||||
@@ -19,6 +19,11 @@ module infix-ip {
|
||||
description
|
||||
"This module augments ietf-ip with an IPv4 link-local autoconf";
|
||||
|
||||
revision 2023-09-14 {
|
||||
description
|
||||
"Added deviations for unsupported parts of ietf-ip.";
|
||||
}
|
||||
|
||||
revision 2023-04-24 {
|
||||
description
|
||||
"Initial revision.";
|
||||
@@ -44,4 +49,28 @@ module infix-ip {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
deviation "/if:interfaces/if:interface/ip:ipv4/ip:mtu" {
|
||||
deviate not-supported;
|
||||
}
|
||||
|
||||
deviation "/if:interfaces/if:interface/ip:ipv4/ip:address/ip:subnet/ip:netmask" {
|
||||
deviate not-supported;
|
||||
}
|
||||
|
||||
deviation "/if:interfaces/if:interface/ip:ipv4/ip:neighbor" {
|
||||
deviate not-supported;
|
||||
}
|
||||
|
||||
deviation "/if:interfaces/if:interface/ip:ipv6/ip:mtu" {
|
||||
deviate not-supported;
|
||||
}
|
||||
|
||||
deviation "/if:interfaces/if:interface/ip:ipv6/ip:address/ip:status" {
|
||||
deviate not-supported;
|
||||
}
|
||||
|
||||
deviation "/if:interfaces/if:interface/ip:ipv6/ip:neighbor" {
|
||||
deviate not-supported;
|
||||
}
|
||||
}
|
||||
@@ -179,7 +179,7 @@
|
||||
<PARAM name="pwpass" ptype="/STRING" help="Optional clear text password (no spaces)"/>
|
||||
</SWITCH>
|
||||
<ACTION sym="script" interactive="true">
|
||||
type=${KLISH_PARAM_pwhash:-md5}
|
||||
type=${KLISH_PARAM_pwhash:-sha512}
|
||||
salt=${KLISH_PARAM_pwsalt:+-S $KLISH_PARAM_pwsalt}
|
||||
mkpasswd -m $type $salt $KLISH_PARAM_pwpass
|
||||
</ACTION>
|
||||
@@ -239,9 +239,13 @@
|
||||
</COMMAND>
|
||||
</SWITCH>
|
||||
<ACTION sym="script" interactive="false">
|
||||
name="${KLISH_PARAM_name:-}"
|
||||
if [ -n "$KLISH_PARAM_name" ]; then
|
||||
sysrepocfg -f json -X -d operational -m ietf-interfaces | \
|
||||
/lib/infix/json-cfg-pretty "ietf-interfaces" "$name"
|
||||
/lib/infix/cli-pretty "ietf-interfaces" -n "$KLISH_PARAM_name"
|
||||
else
|
||||
sysrepocfg -f json -X -d operational -m ietf-interfaces | \
|
||||
/lib/infix/cli-pretty "ietf-interfaces"
|
||||
fi
|
||||
</ACTION>
|
||||
</COMMAND>
|
||||
|
||||
|
||||
@@ -2,7 +2,9 @@ CFLAGS += -Wall -Wextra -Werror
|
||||
LDLIBS += -lsysrepo -lev -lyang -ljansson -lite -lsrx
|
||||
|
||||
TARGET = statd
|
||||
SRC = statd.c
|
||||
SRC = statd.c shared.c shared.h \
|
||||
iface-ip-link.c iface-ip-link.h \
|
||||
iface-ip-addr.c iface-ip-addr.h
|
||||
|
||||
all: $(TARGET)
|
||||
|
||||
|
||||
@@ -0,0 +1,267 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <jansson.h>
|
||||
#include <srx/lyx.h>
|
||||
|
||||
#include <srx/common.h>
|
||||
#include <srx/helpers.h>
|
||||
|
||||
#include "shared.h"
|
||||
|
||||
static json_t *json_get_ip_addr(const char *ifname)
|
||||
{
|
||||
char cmd[512] = {}; /* Size is arbitrary */
|
||||
|
||||
if (ifname)
|
||||
snprintf(cmd, sizeof(cmd), "ip -j addr show dev %s 2>/dev/null", ifname);
|
||||
else
|
||||
snprintf(cmd, sizeof(cmd), "ip -j addr show 2>/dev/null");
|
||||
|
||||
return json_get_output(cmd);
|
||||
}
|
||||
|
||||
static const char *get_yang_origin(const char *protocol)
|
||||
{
|
||||
size_t i;
|
||||
struct {
|
||||
const char *kern;
|
||||
const char *yang;
|
||||
|
||||
} map[] = {
|
||||
{"kernel_ll", "link-layer"},
|
||||
{"static", "static"},
|
||||
{"dhcp", "dhcp"},
|
||||
{"random", "random"},
|
||||
};
|
||||
|
||||
for (i = 0; i < sizeof(map) / sizeof(map[0]); i++) {
|
||||
if (strcmp(protocol, map[i].kern) != 0)
|
||||
continue;
|
||||
|
||||
return map[i].yang;
|
||||
}
|
||||
|
||||
return "other";
|
||||
}
|
||||
|
||||
static int ly_add_ip_mtu(const struct ly_ctx *ctx, struct lyd_node *node,
|
||||
char *xpath, json_t *j_iface, char *ifname)
|
||||
{
|
||||
json_t *j_val;
|
||||
int err;
|
||||
|
||||
/**
|
||||
* TODO: Not sure how to handle loopback MTU (65536) which is
|
||||
* out of bounds for both YANG and uint16_t. For now, we skip it.
|
||||
*/
|
||||
if (strcmp(ifname, "lo") == 0)
|
||||
return SR_ERR_OK;
|
||||
|
||||
j_val = json_object_get(j_iface, "mtu");
|
||||
if (!json_is_integer(j_val)) {
|
||||
ERROR("Expected a JSON integer for 'mtu'");
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
|
||||
err = lydx_new_path(ctx, &node, xpath, "mtu", "%lld",
|
||||
json_integer_value(j_val));
|
||||
if (err) {
|
||||
ERROR("Error, adding 'mtu' to data tree, libyang error %d", err);
|
||||
return SR_ERR_LY;
|
||||
}
|
||||
|
||||
return SR_ERR_OK;
|
||||
}
|
||||
|
||||
static int ly_add_ip_addr_origin(const struct ly_ctx *ctx, struct lyd_node *addr_node,
|
||||
char *addr_xpath, json_t *j_addr)
|
||||
{
|
||||
const char *origin;
|
||||
json_t *j_val;
|
||||
int err;
|
||||
|
||||
/* It's okey not to have an origin */
|
||||
j_val = json_object_get(j_addr, "protocol");
|
||||
if (!j_val)
|
||||
return SR_ERR_OK;
|
||||
|
||||
if (!json_is_string(j_val)) {
|
||||
ERROR("Expected a JSON string for ip 'protocol'");
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
|
||||
origin = get_yang_origin(json_string_value(j_val));
|
||||
|
||||
/**
|
||||
* kernel_ll/link-layer only has a link-layer origin if its address is
|
||||
* based on the link layer address (addrgenmode eui64).
|
||||
*/
|
||||
if (strcmp(origin, "link-layer") == 0) {
|
||||
j_val = json_object_get(j_addr, "stable-privacy");
|
||||
if (j_val && json_is_boolean(j_val) && json_boolean_value(j_val))
|
||||
origin = "random";
|
||||
}
|
||||
|
||||
err = lydx_new_path(ctx, &addr_node, addr_xpath, "origin", "%s", origin);
|
||||
if (err) {
|
||||
ERROR("Error, adding ip 'origin' to data tree, libyang error %d", err);
|
||||
return SR_ERR_LY;
|
||||
}
|
||||
|
||||
return SR_ERR_OK;
|
||||
}
|
||||
|
||||
static int ly_add_ip_addr_info(const struct ly_ctx *ctx, struct lyd_node *node,
|
||||
char *xpath, json_t *j_addr)
|
||||
{
|
||||
struct lyd_node *addr_node = NULL;
|
||||
char *addr_xpath;
|
||||
const char *ip;
|
||||
json_t *j_val;
|
||||
int err;
|
||||
|
||||
j_val = json_object_get(j_addr, "local");
|
||||
if (!json_is_string(j_val)) {
|
||||
ERROR("Expected a JSON string for ip 'local'");
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
ip = json_string_value(j_val);
|
||||
|
||||
err = asprintf(&addr_xpath, "%s/address[ip='%s']", xpath, ip);
|
||||
if (err == -1) {
|
||||
ERROR("Error, creating address xpath");
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
|
||||
err = lyd_new_path(node, ctx, addr_xpath, NULL, 0, &addr_node);
|
||||
if (err) {
|
||||
ERROR("Failed adding ip 'address' node (%s), libyang error %d: %s",
|
||||
addr_xpath, err, ly_errmsg(ctx));
|
||||
free(addr_xpath);
|
||||
return SR_ERR_LY;
|
||||
}
|
||||
|
||||
j_val = json_object_get(j_addr, "prefixlen");
|
||||
if (!json_is_integer(j_val)) {
|
||||
ERROR("Expected a JSON integer for ip 'prefixlen'");
|
||||
free(addr_xpath);
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
|
||||
err = lydx_new_path(ctx, &addr_node, addr_xpath, "prefix-length",
|
||||
"%lld", json_integer_value(j_val));
|
||||
if (err) {
|
||||
ERROR("Error, adding ip 'prefix-length' to data tree, libyang error %d", err);
|
||||
free(addr_xpath);
|
||||
return SR_ERR_LY;
|
||||
}
|
||||
|
||||
err = ly_add_ip_addr_origin(ctx, addr_node, addr_xpath, j_addr);
|
||||
|
||||
free(addr_xpath);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
static int ly_add_ip_data(const struct ly_ctx *ctx, struct lyd_node **parent,
|
||||
char *xpath, int version, json_t *j_iface, char *ifname)
|
||||
{
|
||||
struct lyd_node *node = NULL;
|
||||
json_t *j_val;
|
||||
json_t *j_addr;
|
||||
size_t index;
|
||||
int err;
|
||||
|
||||
err = lyd_new_path(*parent, ctx, xpath, NULL, 0, &node);
|
||||
if (err) {
|
||||
ERROR("Failed adding 'ip' node (%s), libyang error %d: %s",
|
||||
xpath, err, ly_errmsg(ctx));
|
||||
return SR_ERR_LY;
|
||||
}
|
||||
|
||||
err = ly_add_ip_mtu(ctx, node, xpath, j_iface, ifname);
|
||||
if (err) {
|
||||
ERROR("Error, adding ip MTU");
|
||||
return err;
|
||||
}
|
||||
|
||||
j_val = json_object_get(j_iface, "addr_info");
|
||||
if (!json_is_array(j_val)) {
|
||||
ERROR("Expected a JSON array for 'addr_info'");
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
|
||||
json_array_foreach(j_val, index, j_addr) {
|
||||
json_t *j_family;
|
||||
|
||||
j_family = json_object_get(j_addr, "family");
|
||||
if (!json_is_string(j_family)) {
|
||||
ERROR("Expected a JSON string for ip 'family'");
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
|
||||
if (version == 4 && (strcmp(json_string_value(j_family), "inet") == 0)) {
|
||||
err = ly_add_ip_addr_info(ctx, node, xpath, j_addr);
|
||||
if (err) {
|
||||
ERROR("Error, adding address");
|
||||
return err;
|
||||
}
|
||||
} else if (version == 6 && (strcmp(json_string_value(j_family), "inet6") == 0)) {
|
||||
err = ly_add_ip_addr_info(ctx, node, xpath, j_addr);
|
||||
if (err) {
|
||||
ERROR("Error, adding address");
|
||||
return err;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return SR_ERR_OK;
|
||||
}
|
||||
|
||||
|
||||
int ly_add_ip_addr(const struct ly_ctx *ctx, struct lyd_node **parent, char *ifname)
|
||||
{
|
||||
char xpath[XPATH_MAX] = {};
|
||||
json_t *j_root;
|
||||
json_t *j_iface;
|
||||
int err;
|
||||
|
||||
j_root = json_get_ip_addr(ifname);
|
||||
if (!j_root) {
|
||||
ERROR("Error, parsing ip-addr JSON");
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
if (json_array_size(j_root) != 1) {
|
||||
ERROR("Error, expected JSON array of single iface");
|
||||
json_decref(j_root);
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
|
||||
j_iface = json_array_get(j_root, 0);
|
||||
|
||||
snprintf(xpath, sizeof(xpath), "%s/interface[name='%s']/ietf-ip:ipv4",
|
||||
XPATH_IFACE_BASE, ifname);
|
||||
|
||||
err = ly_add_ip_data(ctx, parent, xpath, 4, j_iface, ifname);
|
||||
if (err) {
|
||||
ERROR("Error, adding ipv4 addr info for %s", ifname);
|
||||
json_decref(j_root);
|
||||
return err;
|
||||
}
|
||||
|
||||
snprintf(xpath, sizeof(xpath), "%s/interface[name='%s']/ietf-ip:ipv6",
|
||||
XPATH_IFACE_BASE, ifname);
|
||||
|
||||
err = ly_add_ip_data(ctx, parent, xpath, 6, j_iface, ifname);
|
||||
if (err) {
|
||||
ERROR("Error, adding ipv6 addr info for %s", ifname);
|
||||
json_decref(j_root);
|
||||
return err;
|
||||
}
|
||||
|
||||
json_decref(j_root);
|
||||
|
||||
return SR_ERR_OK;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
#ifndef STATD_IFACE_IP_ADDR_H_
|
||||
#define STATD_IFACE_IP_ADDR_H_
|
||||
|
||||
#include <srx/lyx.h>
|
||||
|
||||
int ly_add_ip_addr(const struct ly_ctx *ctx, struct lyd_node **parent, char *ifname);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,347 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <jansson.h>
|
||||
#include <srx/lyx.h>
|
||||
|
||||
#include <srx/common.h>
|
||||
#include <srx/helpers.h>
|
||||
|
||||
#include "shared.h"
|
||||
|
||||
static json_t *json_get_ip_link(const char *ifname)
|
||||
{
|
||||
char cmd[512] = {}; /* Size is arbitrary */
|
||||
|
||||
snprintf(cmd, sizeof(cmd), "ip -s -d -j link show dev %s 2>/dev/null", ifname);
|
||||
|
||||
return json_get_output(cmd);
|
||||
}
|
||||
|
||||
static const char *get_yang_operstate(const char *operstate)
|
||||
{
|
||||
size_t i;
|
||||
struct {
|
||||
const char *kern;
|
||||
const char *yang;
|
||||
|
||||
} map[] = {
|
||||
{"DOWN", "down"},
|
||||
{"UP", "up"},
|
||||
{"DORMANT", "dormant"},
|
||||
{"TESTING", "testing"},
|
||||
{"LOWERLAYERDOWN", "lower-layer-down"},
|
||||
{"NOTPRESENT", "not-present"},
|
||||
};
|
||||
|
||||
for (i = 0; i < sizeof(map) / sizeof(map[0]); i++) {
|
||||
if (strcmp(operstate, map[i].kern) != 0)
|
||||
continue;
|
||||
|
||||
return map[i].yang;
|
||||
}
|
||||
|
||||
return "unknown";
|
||||
}
|
||||
|
||||
static const char *get_yang_link_type(char *xpath, json_t *iface)
|
||||
{
|
||||
json_t *j_type;
|
||||
const char *type;
|
||||
|
||||
j_type = json_object_get(iface, "link_type");
|
||||
if (!json_is_string(j_type)) {
|
||||
ERROR("Expected a JSON string for 'link_type'");
|
||||
/* This will throw a YANG / ly error */
|
||||
return "";
|
||||
}
|
||||
|
||||
type = json_string_value(j_type);
|
||||
|
||||
if (strcmp(type, "ether") == 0) {
|
||||
const char *kind;
|
||||
json_t *j_val;
|
||||
|
||||
j_val = json_object_get(iface, "linkinfo");
|
||||
if (!j_val)
|
||||
return "infix-if-type:ethernet";
|
||||
|
||||
j_val = json_object_get(j_val, "info_kind");
|
||||
if (!j_val)
|
||||
return "infix-if-type:ethernet";
|
||||
|
||||
if (!json_is_string(j_val)) {
|
||||
ERROR("Expected a JSON string for 'info_kind'");
|
||||
return "infix-if-type:other";
|
||||
}
|
||||
kind = json_string_value(j_val);
|
||||
|
||||
if (strcmp(kind, "veth") == 0)
|
||||
return "infix-if-type:veth";
|
||||
if (strcmp(kind, "vlan") == 0)
|
||||
return "infix-if-type:vlan";
|
||||
if (strcmp(kind, "bridge") == 0)
|
||||
return "infix-if-type:bridge";
|
||||
|
||||
/**
|
||||
* We could return ethernetCsmacd here, but it might hide some
|
||||
* special type that we actually want to explicitly identify.
|
||||
*/
|
||||
ERROR("Unable to determine info_kind for \"%s\"", xpath);
|
||||
|
||||
return "infix-if-type:other";
|
||||
}
|
||||
|
||||
if (strcmp(type, "loopback") == 0)
|
||||
return "infix-if-type:loopback";
|
||||
|
||||
ERROR("Unable to determine infix-if-type for \"%s\"", xpath);
|
||||
|
||||
return "infix-if-type:other";
|
||||
}
|
||||
|
||||
static int ly_add_ip_link_stat(const struct ly_ctx *ctx, struct lyd_node **parent,
|
||||
char *xpath, json_t *j_iface)
|
||||
{
|
||||
struct lyd_node *node = NULL;
|
||||
char *stat_xpath;
|
||||
json_t *j_stat;
|
||||
json_t *j_val;
|
||||
int err;
|
||||
|
||||
err = asprintf(&stat_xpath, "%s/statistics", xpath);
|
||||
if (err == -1) {
|
||||
ERROR("Error, creating statistics xpath");
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
|
||||
j_stat = json_object_get(j_iface, "stats64");
|
||||
if (!j_stat) {
|
||||
ERROR("Didn't find 'stats64' in JSON data");
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
err = lyd_new_path(*parent, ctx, stat_xpath, NULL, 0, &node);
|
||||
if (err) {
|
||||
ERROR("Failed adding 'statistics' node, libyang error %d: %s",
|
||||
err, ly_errmsg(ctx));
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
j_val = json_object_get(j_stat, "tx");
|
||||
if (!j_val) {
|
||||
ERROR("Didn't find 'tx' in JSON stats64 data");
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
j_val = json_object_get(j_val, "bytes");
|
||||
if (!j_val) {
|
||||
ERROR("Didn't find 'bytes' in JSON stats64 tx data");
|
||||
goto err_out;
|
||||
}
|
||||
if (!json_is_integer(j_val)) {
|
||||
ERROR("Didn't get integer for 'bytes' in JSON stats64 tx data");
|
||||
goto err_out;
|
||||
}
|
||||
err = lydx_new_path(ctx, &node, stat_xpath, "out-octets", "%lld",
|
||||
json_integer_value(j_val));
|
||||
if (err) {
|
||||
ERROR("Error, adding 'out-octets' to data tree, libyang error %d", err);
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
j_val = json_object_get(j_stat, "rx");
|
||||
if (!j_val) {
|
||||
ERROR("Didn't find 'rx' in JSON stats64 data");
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
j_val = json_object_get(j_val, "bytes");
|
||||
if (!j_val) {
|
||||
ERROR("Didn't find 'bytes' in JSON stats64 rx data");
|
||||
goto err_out;
|
||||
}
|
||||
if (!json_is_integer(j_val)) {
|
||||
ERROR("Didn't get integer for 'bytes' in JSON stats64 rx data");
|
||||
goto err_out;
|
||||
}
|
||||
err = lydx_new_path(ctx, &node, stat_xpath, "in-octets", "%lld",
|
||||
json_integer_value(j_val));
|
||||
if (err) {
|
||||
ERROR("Error, adding 'in-octets' to data tree, libyang error %d", err);
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
free(stat_xpath);
|
||||
|
||||
return SR_ERR_OK;
|
||||
|
||||
err_out:
|
||||
free(stat_xpath);
|
||||
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
|
||||
static int ly_add_ip_link_br(const struct ly_ctx *ctx, struct lyd_node **parent,
|
||||
char *xpath, json_t *j_iface)
|
||||
{
|
||||
struct lyd_node *br_node = NULL;
|
||||
char *br_xpath;
|
||||
json_t *j_val;
|
||||
int err;
|
||||
|
||||
j_val = json_object_get(j_iface, "master");
|
||||
if (!j_val) {
|
||||
/* Interface has no bridge */
|
||||
return SR_ERR_OK;
|
||||
}
|
||||
|
||||
if (!json_is_string(j_val)) {
|
||||
ERROR("Expected a JSON string for bridge 'master'");
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
|
||||
err = asprintf(&br_xpath, "%s/infix-interfaces:bridge-port", xpath);
|
||||
if (err == -1) {
|
||||
ERROR("Error, creating bridge xpath");
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
|
||||
err = lyd_new_path(*parent, ctx, br_xpath, NULL, 0, &br_node);
|
||||
if (err) {
|
||||
ERROR("Failed adding 'bridge' node (%s), libyang error %d: %s",
|
||||
br_xpath, err, ly_errmsg(ctx));
|
||||
free(br_xpath);
|
||||
return SR_ERR_LY;
|
||||
}
|
||||
|
||||
err = lydx_new_path(ctx, &br_node, br_xpath, "bridge",
|
||||
"%s", json_string_value(j_val));
|
||||
if (err) {
|
||||
ERROR("Error, adding 'bridge' to data tree, libyang error %d", err);
|
||||
free(br_xpath);
|
||||
return SR_ERR_LY;
|
||||
}
|
||||
free(br_xpath);
|
||||
|
||||
return SR_ERR_OK;
|
||||
}
|
||||
|
||||
static int ly_add_ip_link_data(const struct ly_ctx *ctx, struct lyd_node **parent,
|
||||
char *xpath, json_t *j_iface)
|
||||
{
|
||||
const char *val;
|
||||
const char *type;
|
||||
json_t *j_val;
|
||||
int err;
|
||||
|
||||
j_val = json_object_get(j_iface, "ifindex");
|
||||
if (!json_is_integer(j_val)) {
|
||||
ERROR("Expected a JSON integer for 'ifindex'");
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
|
||||
err = lydx_new_path(ctx, parent, xpath, "if-index", "%lld",
|
||||
json_integer_value(j_val));
|
||||
if (err) {
|
||||
ERROR("Error, adding 'if-index' to data tree, libyang error %d", err);
|
||||
return SR_ERR_LY;
|
||||
}
|
||||
|
||||
j_val = json_object_get(j_iface, "operstate");
|
||||
if (!json_is_string(j_val)) {
|
||||
ERROR("Expected a JSON string for 'operstate'");
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
|
||||
val = get_yang_operstate(json_string_value(j_val));
|
||||
err = lydx_new_path(ctx, parent, xpath, "oper-status", val);
|
||||
if (err) {
|
||||
ERROR("Error, adding 'oper-status' to data tree, libyang error %d", err);
|
||||
return SR_ERR_LY;
|
||||
}
|
||||
|
||||
err = ly_add_ip_link_stat(ctx, parent, xpath, j_iface);
|
||||
if (err) {
|
||||
ERROR("Error, adding 'stats64' to data tree");
|
||||
return err;
|
||||
}
|
||||
|
||||
type = get_yang_link_type(xpath, j_iface);
|
||||
err = lydx_new_path(ctx, parent, xpath, "type", type);
|
||||
if (err) {
|
||||
ERROR("Error, adding 'type' to data tree, libyang error %d", err);
|
||||
return SR_ERR_LY;
|
||||
}
|
||||
|
||||
j_val = json_object_get(j_iface, "address");
|
||||
if (!json_is_string(j_val)) {
|
||||
ERROR("Expected a JSON string for 'address'");
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
|
||||
err = lydx_new_path(ctx, parent, xpath, "phys-address", json_string_value(j_val));
|
||||
if (err) {
|
||||
ERROR("Error, adding 'phys-address' to data tree, libyang error %d", err);
|
||||
return SR_ERR_LY;
|
||||
}
|
||||
|
||||
err = ly_add_ip_link_br(ctx, parent, xpath, j_iface);
|
||||
if (err) {
|
||||
ERROR("Error, adding bridge to data tree, libyang error %d", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
j_val = json_object_get(j_iface, "link");
|
||||
if (j_val) {
|
||||
if (!json_is_string(j_val)) {
|
||||
ERROR("Expected a JSON string for 'link'");
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
|
||||
err = lydx_new_path(ctx, parent, xpath,
|
||||
"ietf-if-extensions:parent-interface", "%s",
|
||||
json_string_value(j_val));
|
||||
if (err) {
|
||||
ERROR("Error, adding 'link' to data tree, libyang error %d", err);
|
||||
return SR_ERR_LY;
|
||||
}
|
||||
}
|
||||
|
||||
return SR_ERR_OK;
|
||||
}
|
||||
|
||||
int ly_add_ip_link(const struct ly_ctx *ctx, struct lyd_node **parent, char *ifname)
|
||||
{
|
||||
char xpath[XPATH_MAX] = {};
|
||||
json_t *j_root;
|
||||
json_t *j_iface;
|
||||
int err;
|
||||
|
||||
j_root = json_get_ip_link(ifname);
|
||||
if (!j_root) {
|
||||
ERROR("Error, parsing ip-link JSON");
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
if (json_array_size(j_root) != 1) {
|
||||
ERROR("Error, expected JSON array of single iface");
|
||||
json_decref(j_root);
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
|
||||
j_iface = json_array_get(j_root, 0);
|
||||
|
||||
snprintf(xpath, sizeof(xpath), "%s/interface[name='%s']",
|
||||
XPATH_IFACE_BASE, ifname);
|
||||
|
||||
err = ly_add_ip_link_data(ctx, parent, xpath, j_iface);
|
||||
if (err) {
|
||||
ERROR("Error, adding ip-link info for %s", ifname);
|
||||
json_decref(j_root);
|
||||
return err;
|
||||
}
|
||||
|
||||
json_decref(j_root);
|
||||
|
||||
return SR_ERR_OK;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
#ifndef STATD_IFACE_IP_LINK_H_
|
||||
#define STATD_IFACE_IP_LINK_H_
|
||||
|
||||
#include <srx/lyx.h>
|
||||
|
||||
int ly_add_ip_link(const struct ly_ctx *ctx, struct lyd_node **parent, char *ifname);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,35 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <jansson.h>
|
||||
|
||||
#include <srx/common.h>
|
||||
#include <srx/helpers.h>
|
||||
|
||||
json_t *json_get_output(const char *cmd)
|
||||
{
|
||||
json_error_t j_err;
|
||||
json_t *j_root;
|
||||
FILE *proc;
|
||||
|
||||
proc = popenf("re", cmd);
|
||||
if (!proc) {
|
||||
ERROR("Error, running ip link command");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
j_root = json_loadf(proc, 0, &j_err);
|
||||
pclose(proc);
|
||||
if (!j_root) {
|
||||
ERROR("Error, parsing ip link JSON");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!json_is_array(j_root)) {
|
||||
ERROR("Expected a JSON array from ip link");
|
||||
json_decref(j_root);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return j_root;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
#ifndef STATD_SHARED_H_
|
||||
#define STATD_SHARED_H_
|
||||
|
||||
#include <jansson.h>
|
||||
|
||||
#define XPATH_MAX PATH_MAX
|
||||
#define XPATH_IFACE_BASE "/ietf-interfaces:interfaces"
|
||||
|
||||
json_t *json_get_output(const char *cmd);
|
||||
|
||||
#endif
|
||||
@@ -22,8 +22,9 @@
|
||||
#include <srx/helpers.h>
|
||||
#include <srx/lyx.h>
|
||||
|
||||
#define XPATH_MAX PATH_MAX
|
||||
#define XPATH_IFACE_BASE "/ietf-interfaces:interfaces"
|
||||
#include "shared.h"
|
||||
#include "iface-ip-link.h"
|
||||
#include "iface-ip-addr.h"
|
||||
|
||||
#define SOCK_RMEM_SIZE 1000000 /* Arbitrary chosen, default = 212992 */
|
||||
#define NL_BUF_SIZE 4096 /* Arbitrary chosen */
|
||||
@@ -106,451 +107,13 @@ static void sub_delete(struct ev_loop *loop, struct sub_head *subs, struct sub *
|
||||
free(sub);
|
||||
}
|
||||
|
||||
static json_t *_json_get_ip_output(const char *cmd)
|
||||
{
|
||||
json_error_t j_err;
|
||||
json_t *j_root;
|
||||
FILE *proc;
|
||||
|
||||
proc = popenf("re", cmd);
|
||||
if (!proc) {
|
||||
ERROR("Error, running ip link command");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
j_root = json_loadf(proc, 0, &j_err);
|
||||
pclose(proc);
|
||||
if (!j_root) {
|
||||
ERROR("Error, parsing ip link JSON");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!json_is_array(j_root)) {
|
||||
ERROR("Expected a JSON array from ip link");
|
||||
json_decref(j_root);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return j_root;
|
||||
}
|
||||
|
||||
static json_t *json_get_ip_link(const char *ifname)
|
||||
static json_t *json_get_ip_link(void)
|
||||
{
|
||||
char cmd[512] = {}; /* Size is arbitrary */
|
||||
|
||||
if (ifname)
|
||||
snprintf(cmd, sizeof(cmd), "ip -s -d -j link show dev %s 2>/dev/null", ifname);
|
||||
else
|
||||
snprintf(cmd, sizeof(cmd), "ip -s -d -j link show 2>/dev/null");
|
||||
snprintf(cmd, sizeof(cmd), "ip -s -d -j link show 2>/dev/null");
|
||||
|
||||
return _json_get_ip_output(cmd);
|
||||
}
|
||||
|
||||
static json_t *json_get_ip_addr(const char *ifname)
|
||||
{
|
||||
char cmd[512] = {}; /* Size is arbitrary */
|
||||
|
||||
if (ifname)
|
||||
snprintf(cmd, sizeof(cmd), "ip -j addr show dev %s 2>/dev/null", ifname);
|
||||
else
|
||||
snprintf(cmd, sizeof(cmd), "ip -j addr show 2>/dev/null");
|
||||
|
||||
return _json_get_ip_output(cmd);
|
||||
}
|
||||
|
||||
static const char *get_yang_operstate(const char *operstate)
|
||||
{
|
||||
size_t i;
|
||||
struct {
|
||||
const char *kern;
|
||||
const char *yang;
|
||||
|
||||
} map[] = {
|
||||
{"DOWN", "down"},
|
||||
{"UP", "up"},
|
||||
{"DORMANT", "dormant"},
|
||||
{"TESTING", "testing"},
|
||||
{"LOWERLAYERDOWN", "lower-layer-down"},
|
||||
{"NOTPRESENT", "not-present"},
|
||||
};
|
||||
|
||||
for (i = 0; i < sizeof(map) / sizeof(map[0]); i++) {
|
||||
if (strcmp(operstate, map[i].kern) != 0)
|
||||
continue;
|
||||
|
||||
return map[i].yang;
|
||||
}
|
||||
|
||||
return "unknown";
|
||||
}
|
||||
|
||||
static int ly_add_ip_link_stat(const struct ly_ctx *ctx, struct lyd_node **parent,
|
||||
char *xpath, json_t *j_iface)
|
||||
{
|
||||
struct lyd_node *node = NULL;
|
||||
char *stat_xpath;
|
||||
json_t *j_stat;
|
||||
json_t *j_val;
|
||||
int err;
|
||||
|
||||
err = asprintf(&stat_xpath, "%s/statistics", xpath);
|
||||
if (err == -1) {
|
||||
ERROR("Error, creating statistics xpath");
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
|
||||
j_stat = json_object_get(j_iface, "stats64");
|
||||
if (!j_stat) {
|
||||
ERROR("Didn't find 'stats64' in JSON data");
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
err = lyd_new_path(*parent, ctx, stat_xpath, NULL, 0, &node);
|
||||
if (err) {
|
||||
ERROR("Failed adding 'statistics' node, libyang error %d: %s",
|
||||
err, ly_errmsg(ctx));
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
j_val = json_object_get(j_stat, "tx");
|
||||
if (!j_val) {
|
||||
ERROR("Didn't find 'tx' in JSON stats64 data");
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
j_val = json_object_get(j_val, "bytes");
|
||||
if (!j_val) {
|
||||
ERROR("Didn't find 'bytes' in JSON stats64 tx data");
|
||||
goto err_out;
|
||||
}
|
||||
if (!json_is_integer(j_val)) {
|
||||
ERROR("Didn't get integer for 'bytes' in JSON stats64 tx data");
|
||||
goto err_out;
|
||||
}
|
||||
err = lydx_new_path(ctx, &node, stat_xpath, "out-octets", "%lld",
|
||||
json_integer_value(j_val));
|
||||
if (err) {
|
||||
ERROR("Error, adding 'out-octets' to data tree, libyang error %d", err);
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
j_val = json_object_get(j_stat, "rx");
|
||||
if (!j_val) {
|
||||
ERROR("Didn't find 'rx' in JSON stats64 data");
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
j_val = json_object_get(j_val, "bytes");
|
||||
if (!j_val) {
|
||||
ERROR("Didn't find 'bytes' in JSON stats64 rx data");
|
||||
goto err_out;
|
||||
}
|
||||
if (!json_is_integer(j_val)) {
|
||||
ERROR("Didn't get integer for 'bytes' in JSON stats64 rx data");
|
||||
goto err_out;
|
||||
}
|
||||
err = lydx_new_path(ctx, &node, stat_xpath, "in-octets", "%lld",
|
||||
json_integer_value(j_val));
|
||||
if (err) {
|
||||
ERROR("Error, adding 'in-octets' to data tree, libyang error %d", err);
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
free(stat_xpath);
|
||||
|
||||
return SR_ERR_OK;
|
||||
|
||||
err_out:
|
||||
free(stat_xpath);
|
||||
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
|
||||
static const char *get_yang_link_type(char *xpath, json_t *iface)
|
||||
{
|
||||
json_t *j_type;
|
||||
const char *type;
|
||||
|
||||
j_type = json_object_get(iface, "link_type");
|
||||
if (!json_is_string(j_type)) {
|
||||
ERROR("Expected a JSON string for 'link_type'");
|
||||
/* This will throw a YANG / ly error */
|
||||
return "";
|
||||
}
|
||||
|
||||
type = json_string_value(j_type);
|
||||
|
||||
if (strcmp(type, "ether") == 0) {
|
||||
const char *kind;
|
||||
json_t *j_val;
|
||||
|
||||
j_val = json_object_get(iface, "linkinfo");
|
||||
if (!j_val)
|
||||
return "infix-if-type:ethernet";
|
||||
|
||||
j_val = json_object_get(j_val, "info_kind");
|
||||
if (!j_val)
|
||||
return "infix-if-type:ethernet";
|
||||
|
||||
if (!json_is_string(j_val)) {
|
||||
ERROR("Expected a JSON string for 'info_kind'");
|
||||
return "infix-if-type:other";
|
||||
}
|
||||
kind = json_string_value(j_val);
|
||||
|
||||
if (strcmp(kind, "veth") == 0)
|
||||
return "infix-if-type:veth";
|
||||
if (strcmp(kind, "vlan") == 0)
|
||||
return "infix-if-type:vlan";
|
||||
if (strcmp(kind, "bridge") == 0)
|
||||
return "infix-if-type:bridge";
|
||||
|
||||
/**
|
||||
* We could return ethernetCsmacd here, but it might hide some
|
||||
* special type that we actually want to explicitly identify.
|
||||
*/
|
||||
ERROR("Unable to determine info_kind for \"%s\"", xpath);
|
||||
|
||||
return "infix-if-type:other";
|
||||
}
|
||||
|
||||
if (strcmp(type, "loopback") == 0)
|
||||
return "infix-if-type:loopback";
|
||||
|
||||
ERROR("Unable to determine infix-if-type for \"%s\"", xpath);
|
||||
|
||||
return "infix-if-type:other";
|
||||
}
|
||||
|
||||
static int ly_add_ip_link_data(const struct ly_ctx *ctx, struct lyd_node **parent,
|
||||
char *xpath, json_t *iface)
|
||||
{
|
||||
const char *val;
|
||||
const char *type;
|
||||
json_t *j_val;
|
||||
int err;
|
||||
|
||||
j_val = json_object_get(iface, "ifindex");
|
||||
if (!json_is_integer(j_val)) {
|
||||
ERROR("Expected a JSON integer for 'ifindex'");
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
|
||||
err = lydx_new_path(ctx, parent, xpath, "if-index", "%lld",
|
||||
json_integer_value(j_val));
|
||||
if (err) {
|
||||
ERROR("Error, adding 'if-index' to data tree, libyang error %d", err);
|
||||
return SR_ERR_LY;
|
||||
}
|
||||
|
||||
j_val = json_object_get(iface, "operstate");
|
||||
if (!json_is_string(j_val)) {
|
||||
ERROR("Expected a JSON string for 'operstate'");
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
|
||||
val = get_yang_operstate(json_string_value(j_val));
|
||||
err = lydx_new_path(ctx, parent, xpath, "oper-status", val);
|
||||
if (err) {
|
||||
ERROR("Error, adding 'oper-status' to data tree, libyang error %d", err);
|
||||
return SR_ERR_LY;
|
||||
}
|
||||
|
||||
err = ly_add_ip_link_stat(ctx, parent, xpath, iface);
|
||||
if (err) {
|
||||
ERROR("Error, adding 'stats64' to data tree");
|
||||
return err;
|
||||
}
|
||||
|
||||
type = get_yang_link_type(xpath, iface);
|
||||
err = lydx_new_path(ctx, parent, xpath, "type", type);
|
||||
if (err) {
|
||||
ERROR("Error, adding 'type' to data tree, libyang error %d", err);
|
||||
return SR_ERR_LY;
|
||||
}
|
||||
|
||||
j_val = json_object_get(iface, "address");
|
||||
if (!json_is_string(j_val)) {
|
||||
ERROR("Expected a JSON string for 'address'");
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
|
||||
err = lydx_new_path(ctx, parent, xpath, "phys-address", json_string_value(j_val));
|
||||
if (err) {
|
||||
ERROR("Error, adding 'phys-address' to data tree, libyang error %d", err);
|
||||
return SR_ERR_LY;
|
||||
}
|
||||
|
||||
return SR_ERR_OK;
|
||||
}
|
||||
|
||||
static int ly_add_ip_addr_data(const struct ly_ctx *ctx, struct lyd_node **parent,
|
||||
char *xpath, json_t *j_iface, char *ifname)
|
||||
{
|
||||
struct lyd_node *ipv4_node = NULL;
|
||||
json_t *j_val;
|
||||
json_t *j_arr;
|
||||
size_t index;
|
||||
int err;
|
||||
|
||||
err = lyd_new_path(*parent, ctx, xpath, NULL, 0, &ipv4_node);
|
||||
if (err) {
|
||||
ERROR("Failed adding 'ipv4' node (%s), libyang error %d: %s",
|
||||
xpath, err, ly_errmsg(ctx));
|
||||
return SR_ERR_LY;
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: Not sure how to handle loopback MTU (65536) which is
|
||||
* out of bounds for both YANG and uint16_t. For now, we skip it.
|
||||
*/
|
||||
if (strcmp(ifname, "lo") != 0) {
|
||||
j_val = json_object_get(j_iface, "mtu");
|
||||
if (!json_is_integer(j_val)) {
|
||||
ERROR("Expected a JSON integer for 'mtu'");
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
|
||||
err = lydx_new_path(ctx, &ipv4_node, xpath, "mtu", "%lld",
|
||||
json_integer_value(j_val));
|
||||
if (err) {
|
||||
ERROR("Error, adding 'mtu' to data tree, libyang error %d", err);
|
||||
return SR_ERR_LY;
|
||||
}
|
||||
}
|
||||
|
||||
j_arr = json_object_get(j_iface, "addr_info");
|
||||
if (!json_is_array(j_arr)) {
|
||||
ERROR("Expected a JSON array for 'addr_info'");
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
|
||||
json_array_foreach(j_arr, index, j_val) {
|
||||
struct lyd_node *addr_node = NULL;
|
||||
char *addr_xpath;
|
||||
json_t *j_family;
|
||||
json_t *j_local;
|
||||
json_t *j_prefix;
|
||||
const char *ip;
|
||||
|
||||
j_family = json_object_get(j_val, "family");
|
||||
if (!json_is_string(j_family)) {
|
||||
ERROR("Expected a JSON string for ipv4 'family'");
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
/* TODO: We only handle ipv4 for now */
|
||||
if (strcmp(json_string_value(j_family), "inet") != 0)
|
||||
continue;
|
||||
|
||||
j_local = json_object_get(j_val, "local");
|
||||
if (!json_is_string(j_local)) {
|
||||
ERROR("Expected a JSON string for ipv4 'local'");
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
ip = json_string_value(j_local);
|
||||
|
||||
err = asprintf(&addr_xpath, "%s/address[ip='%s']", xpath, ip);
|
||||
if (err == -1) {
|
||||
ERROR("Error, creating address xpath");
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
|
||||
err = lyd_new_path(ipv4_node, ctx, addr_xpath, NULL, 0, &addr_node);
|
||||
if (err) {
|
||||
ERROR("Failed adding ipv4 'address' node (%s), libyang error %d: %s",
|
||||
addr_xpath, err, ly_errmsg(ctx));
|
||||
free(addr_xpath);
|
||||
return SR_ERR_LY;
|
||||
}
|
||||
|
||||
j_prefix = json_object_get(j_val, "prefixlen");
|
||||
if (!json_is_integer(j_prefix)) {
|
||||
ERROR("Expected a JSON integer for ipv4 'prefixlen'");
|
||||
free(addr_xpath);
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
|
||||
err = lydx_new_path(ctx, &addr_node, addr_xpath, "prefix-length",
|
||||
"%lld", json_integer_value(j_prefix));
|
||||
if (err) {
|
||||
ERROR("Error, adding ipv4 'prefix-length' to data tree, libyang error %d", err);
|
||||
free(addr_xpath);
|
||||
return SR_ERR_LY;
|
||||
}
|
||||
free(addr_xpath);
|
||||
}
|
||||
|
||||
return SR_ERR_OK;
|
||||
}
|
||||
|
||||
static int ly_add_ip_link(const struct ly_ctx *ctx, struct lyd_node **parent, char *ifname)
|
||||
{
|
||||
char xpath[XPATH_MAX] = {};
|
||||
json_t *j_root;
|
||||
json_t *j_iface;
|
||||
int err;
|
||||
|
||||
j_root = json_get_ip_link(ifname);
|
||||
if (!j_root) {
|
||||
ERROR("Error, parsing ip-link JSON");
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
if (json_array_size(j_root) != 1) {
|
||||
ERROR("Error, expected JSON array of single iface");
|
||||
json_decref(j_root);
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
|
||||
j_iface = json_array_get(j_root, 0);
|
||||
|
||||
snprintf(xpath, sizeof(xpath), "%s/interface[name='%s']",
|
||||
XPATH_IFACE_BASE, ifname);
|
||||
|
||||
err = ly_add_ip_link_data(ctx, parent, xpath, j_iface);
|
||||
if (err) {
|
||||
ERROR("Error, adding ip-link info for %s", ifname);
|
||||
json_decref(j_root);
|
||||
return err;
|
||||
}
|
||||
|
||||
json_decref(j_root);
|
||||
|
||||
return SR_ERR_OK;
|
||||
}
|
||||
|
||||
static int ly_add_ip_addr(const struct ly_ctx *ctx, struct lyd_node **parent, char *ifname)
|
||||
{
|
||||
char xpath[XPATH_MAX] = {};
|
||||
json_t *j_root;
|
||||
json_t *j_iface;
|
||||
int err;
|
||||
|
||||
j_root = json_get_ip_addr(ifname);
|
||||
if (!j_root) {
|
||||
ERROR("Error, parsing ip-addr JSON");
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
if (json_array_size(j_root) != 1) {
|
||||
ERROR("Error, expected JSON array of single iface");
|
||||
json_decref(j_root);
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
|
||||
j_iface = json_array_get(j_root, 0);
|
||||
|
||||
snprintf(xpath, sizeof(xpath), "%s/interface[name='%s']/ietf-ip:ipv4",
|
||||
XPATH_IFACE_BASE, ifname);
|
||||
|
||||
err = ly_add_ip_addr_data(ctx, parent, xpath, j_iface, ifname);
|
||||
if (err) {
|
||||
ERROR("Error, adding ip-addr info for %s", ifname);
|
||||
json_decref(j_root);
|
||||
return err;
|
||||
}
|
||||
|
||||
json_decref(j_root);
|
||||
|
||||
return SR_ERR_OK;
|
||||
return json_get_output(cmd);
|
||||
}
|
||||
|
||||
static int sr_ifaces_cb(sr_session_ctx_t *session, uint32_t, const char *path,
|
||||
@@ -742,7 +305,7 @@ static int sub_to_ifaces(struct statd *statd)
|
||||
json_t *j_root;
|
||||
size_t i;
|
||||
|
||||
j_root = json_get_ip_link(NULL);
|
||||
j_root = json_get_ip_link();
|
||||
if (!j_root) {
|
||||
ERROR("Error, parsing ip-link JSON");
|
||||
return SR_ERR_SYS;
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
# Tests in this suite can be run on localhost without a target environment
|
||||
|
||||
- name: cli-pretty
|
||||
suite: cli_pretty/all.yaml
|
||||
@@ -0,0 +1,39 @@
|
||||
---
|
||||
- case: run.sh
|
||||
name: "interfaces-empty"
|
||||
opts:
|
||||
- "json/empty.json"
|
||||
- "ietf-interfaces"
|
||||
|
||||
- case: run.sh
|
||||
name: "interfaces-factory"
|
||||
opts:
|
||||
- "json/factory.json"
|
||||
- "ietf-interfaces"
|
||||
|
||||
- case: run.sh
|
||||
name: "interfaces-bloated"
|
||||
opts:
|
||||
- "json/bloated.json"
|
||||
- "ietf-interfaces"
|
||||
|
||||
- case: run.sh
|
||||
name: "interface-ethernet"
|
||||
opts:
|
||||
- "json/bloated.json"
|
||||
- "ietf-interfaces"
|
||||
- "-n e0"
|
||||
|
||||
- case: run.sh
|
||||
name: "interface-vlan"
|
||||
opts:
|
||||
- "json/bloated.json"
|
||||
- "ietf-interfaces"
|
||||
- "-n vlan1"
|
||||
|
||||
- case: run.sh
|
||||
name: "interface-birdge"
|
||||
opts:
|
||||
- "json/bloated.json"
|
||||
- "ietf-interfaces"
|
||||
- "-n br0"
|
||||
@@ -0,0 +1,356 @@
|
||||
{
|
||||
"ietf-interfaces:interfaces": {
|
||||
"interface": [
|
||||
{
|
||||
"TEST-DESCR": "Normal loopback",
|
||||
"name": "lo",
|
||||
"type": "infix-if-type:loopback",
|
||||
"oper-status": "up",
|
||||
"if-index": 1,
|
||||
"phys-address": "00:00:00:00:00:00",
|
||||
"statistics": {
|
||||
"in-octets": "3099",
|
||||
"out-octets": "3099"
|
||||
},
|
||||
"ietf-ip:ipv4": {
|
||||
"address": [
|
||||
{
|
||||
"ip": "127.0.0.1",
|
||||
"prefix-length": 8
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"TEST-DESCR": "Bridge interface with IP",
|
||||
"name": "e0",
|
||||
"type": "infix-if-type:ethernet",
|
||||
"oper-status": "up",
|
||||
"if-index": 2,
|
||||
"phys-address": "02:00:00:00:00:00",
|
||||
"statistics": {
|
||||
"in-octets": "0",
|
||||
"out-octets": "21286"
|
||||
},
|
||||
"ietf-ip:ipv4": {
|
||||
"mtu": 1500,
|
||||
"address": [
|
||||
{
|
||||
"ip": "192.168.1.1",
|
||||
"prefix-length": 24
|
||||
}
|
||||
]
|
||||
},
|
||||
"ietf-ip:ipv6": {
|
||||
"mtu": 1500,
|
||||
"address": [
|
||||
{
|
||||
"ip": "fe80::beff:407a:d738:abb4",
|
||||
"prefix-length": 64,
|
||||
"origin": "link-layer"
|
||||
},
|
||||
{
|
||||
"ip": "fe80::beff:aaaa:d738:abb4",
|
||||
"prefix-length": 64,
|
||||
"origin": "random"
|
||||
}
|
||||
]
|
||||
},
|
||||
"infix-interfaces:bridge-port": {
|
||||
"bridge": "br0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"TEST-DESCR": "Bridge interface without IP",
|
||||
"name": "e1",
|
||||
"type": "infix-if-type:ethernet",
|
||||
"oper-status": "up",
|
||||
"if-index": 4,
|
||||
"phys-address": "02:00:00:00:00:00",
|
||||
"statistics": {
|
||||
"in-octets": "0",
|
||||
"out-octets": "21286"
|
||||
},
|
||||
"ietf-ip:ipv4": {
|
||||
"mtu": 1500
|
||||
},
|
||||
"infix-interfaces:bridge-port": {
|
||||
"bridge": "br0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"TEST-DESCR": "Bridge interface without IP",
|
||||
"name": "e1",
|
||||
"type": "infix-if-type:ethernet",
|
||||
"oper-status": "up",
|
||||
"if-index": 4,
|
||||
"phys-address": "02:00:00:00:00:00",
|
||||
"statistics": {
|
||||
"in-octets": "0",
|
||||
"out-octets": "21286"
|
||||
},
|
||||
"ietf-ip:ipv4": {
|
||||
"mtu": 1500
|
||||
},
|
||||
"infix-interfaces:bridge-port": {
|
||||
"bridge": "br1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"TEST-DESCR": "Interface without IP",
|
||||
"name": "e10",
|
||||
"type": "infix-if-type:ethernet",
|
||||
"oper-status": "up",
|
||||
"if-index": 4,
|
||||
"phys-address": "02:00:00:00:00:00",
|
||||
"statistics": {
|
||||
"in-octets": "0",
|
||||
"out-octets": "21286"
|
||||
},
|
||||
"ietf-ip:ipv4": {
|
||||
"mtu": 1500
|
||||
}
|
||||
},
|
||||
{
|
||||
"TEST-DESCR": "Interface with single IP",
|
||||
"name": "e11",
|
||||
"type": "infix-if-type:ethernet",
|
||||
"oper-status": "up",
|
||||
"if-index": 4,
|
||||
"phys-address": "02:00:00:00:ee:ff",
|
||||
"statistics": {
|
||||
"in-octets": "21280",
|
||||
"out-octets": "21281"
|
||||
},
|
||||
"ietf-ip:ipv4": {
|
||||
"mtu": 1500,
|
||||
"address": [
|
||||
{
|
||||
"ip": "192.168.5.1",
|
||||
"prefix-length": 24,
|
||||
"origin" : "static"
|
||||
}
|
||||
]
|
||||
},
|
||||
"ietf-ip:ipv6": {
|
||||
"mtu": 1500,
|
||||
"address": [
|
||||
{
|
||||
"ip": "fe80::beff:407a:d738:abb4",
|
||||
"prefix-length": 64,
|
||||
"origin": "link-layer"
|
||||
},
|
||||
{
|
||||
"ip": "fe80::beff:aaaa:d738:abb4",
|
||||
"prefix-length": 64,
|
||||
"origin": "random"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"TEST-DESCR": "Interface with many IP",
|
||||
"name": "e12",
|
||||
"type": "infix-if-type:ethernet",
|
||||
"oper-status": "up",
|
||||
"if-index": 4,
|
||||
"phys-address": "02:00:00:00:ee:ff",
|
||||
"statistics": {
|
||||
"in-octets": "21280",
|
||||
"out-octets": "21281"
|
||||
},
|
||||
"ietf-ip:ipv4": {
|
||||
"mtu": 1500,
|
||||
"address": [
|
||||
{
|
||||
"ip": "192.168.1.1",
|
||||
"prefix-length": 24,
|
||||
"origin" : "static"
|
||||
},
|
||||
{
|
||||
"ip": "192.168.2.1",
|
||||
"prefix-length": 24,
|
||||
"origin" : "static"
|
||||
},
|
||||
{
|
||||
"ip": "192.168.3.1",
|
||||
"prefix-length": 24,
|
||||
"origin" : "dhcp"
|
||||
},
|
||||
{
|
||||
"ip": "192.168.4.1",
|
||||
"prefix-length": 24,
|
||||
"origin" : "dhcp"
|
||||
},
|
||||
{
|
||||
"ip": "10.0.1.1",
|
||||
"prefix-length": 24
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"TEST-DESCR": "Interface with VLAN on top",
|
||||
"name": "e20",
|
||||
"type": "infix-if-type:ethernet",
|
||||
"oper-status": "up",
|
||||
"if-index": 4,
|
||||
"phys-address": "02:00:00:00:ee:ff",
|
||||
"statistics": {
|
||||
"in-octets": "21280",
|
||||
"out-octets": "21281"
|
||||
},
|
||||
"ietf-ip:ipv4": {
|
||||
"mtu": 1500,
|
||||
"address": [
|
||||
{
|
||||
"ip": "192.168.1.1",
|
||||
"prefix-length": 24
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"TEST-DESCR": "Bridge without IP",
|
||||
"name": "br0",
|
||||
"type": "infix-if-type:bridge",
|
||||
"oper-status": "up",
|
||||
"if-index": 2,
|
||||
"phys-address": "02:00:00:00:00:00",
|
||||
"statistics": {
|
||||
"in-octets": "0",
|
||||
"out-octets": "378"
|
||||
},
|
||||
"ietf-ip:ipv4": {
|
||||
"mtu": 1500
|
||||
}
|
||||
},
|
||||
{
|
||||
"TEST-DESCR": "Bridge with IP",
|
||||
"name": "br1",
|
||||
"type": "infix-if-type:bridge",
|
||||
"oper-status": "up",
|
||||
"if-index": 3,
|
||||
"phys-address": "02:00:00:00:00:00",
|
||||
"statistics": {
|
||||
"in-octets": "0",
|
||||
"out-octets": "378"
|
||||
},
|
||||
"ietf-ip:ipv4": {
|
||||
"mtu": 1500,
|
||||
"address": [
|
||||
{
|
||||
"ip": "192.168.1.1",
|
||||
"prefix-length": 24
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"TEST-DESCR": "Empty bridge with IP",
|
||||
"name": "br2",
|
||||
"type": "infix-if-type:bridge",
|
||||
"oper-status": "up",
|
||||
"if-index": 3,
|
||||
"phys-address": "02:00:00:00:00:00",
|
||||
"statistics": {
|
||||
"in-octets": "0",
|
||||
"out-octets": "378"
|
||||
},
|
||||
"ietf-ip:ipv4": {
|
||||
"mtu": 1500,
|
||||
"address": [
|
||||
{
|
||||
"ip": "192.168.1.1",
|
||||
"prefix-length": 24
|
||||
},
|
||||
{
|
||||
"ip": "10.0.1.1",
|
||||
"prefix-length": 24
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"TEST-DESCR": "VLAN on bridge",
|
||||
"name": "vlan1",
|
||||
"type": "infix-if-type:vlan",
|
||||
"oper-status": "up",
|
||||
"if-index": 4,
|
||||
"phys-address": "02:00:00:00:00:00",
|
||||
"statistics": {
|
||||
"in-octets": "0",
|
||||
"out-octets": "0"
|
||||
},
|
||||
"ietf-if-extensions:parent-interface": "br0",
|
||||
"ietf-ip:ipv4": {
|
||||
"mtu": 1500
|
||||
},
|
||||
"ietf-if-vlan-encapsulation:dot1q-vlan": {
|
||||
"outer-tag": {
|
||||
"tag-type": "ieee802-dot1q-types:c-vlan",
|
||||
"vlan-id": 10
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"TEST-DESCR": "VLAN with IP on bridge",
|
||||
"name": "vlan2",
|
||||
"type": "infix-if-type:vlan",
|
||||
"oper-status": "up",
|
||||
"if-index": 4,
|
||||
"phys-address": "02:00:00:00:00:00",
|
||||
"statistics": {
|
||||
"in-octets": "0",
|
||||
"out-octets": "0"
|
||||
},
|
||||
"ietf-if-extensions:parent-interface": "br0",
|
||||
"ietf-ip:ipv4": {
|
||||
"mtu": 1500,
|
||||
"address": [
|
||||
{
|
||||
"ip": "192.168.2.1",
|
||||
"prefix-length": 24
|
||||
}
|
||||
]
|
||||
},
|
||||
"ietf-if-vlan-encapsulation:dot1q-vlan": {
|
||||
"outer-tag": {
|
||||
"tag-type": "ieee802-dot1q-types:c-vlan",
|
||||
"vlan-id": 20
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "vlan20",
|
||||
"type": "infix-if-type:vlan",
|
||||
"oper-status": "up",
|
||||
"if-index": 4,
|
||||
"phys-address": "02:00:00:00:00:00",
|
||||
"statistics": {
|
||||
"in-octets": "0",
|
||||
"out-octets": "0"
|
||||
},
|
||||
"ietf-if-extensions:parent-interface": "e20",
|
||||
"ietf-ip:ipv4": {
|
||||
"mtu": 1500
|
||||
},
|
||||
"ietf-ip:ipv4": {
|
||||
"mtu": 1500,
|
||||
"address": [
|
||||
{
|
||||
"ip": "192.168.2.1",
|
||||
"prefix-length": 24
|
||||
}
|
||||
]
|
||||
},
|
||||
"ietf-if-vlan-encapsulation:dot1q-vlan": {
|
||||
"outer-tag": {
|
||||
"tag-type": "ieee802-dot1q-types:c-vlan",
|
||||
"vlan-id": 10
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"ietf-interfaces:interfaces": {
|
||||
"interface": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"ietf-interfaces:interfaces": {
|
||||
"interface": [
|
||||
{
|
||||
"name": "lo",
|
||||
"type": "infix-if-type:loopback",
|
||||
"oper-status": "up",
|
||||
"if-index": 1,
|
||||
"phys-address": "00:00:00:00:00:00",
|
||||
"statistics": {
|
||||
"in-octets": "3035",
|
||||
"out-octets": "3035"
|
||||
},
|
||||
"ietf-ip:ipv4": {
|
||||
"address": [
|
||||
{
|
||||
"ip": "127.0.0.1",
|
||||
"prefix-length": 8
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "e0",
|
||||
"type": "infix-if-type:ethernet",
|
||||
"oper-status": "up",
|
||||
"if-index": 2,
|
||||
"phys-address": "02:00:00:00:00:00",
|
||||
"statistics": {
|
||||
"in-octets": "550",
|
||||
"out-octets": "13724"
|
||||
},
|
||||
"ietf-ip:ipv4": {
|
||||
"mtu": 1500
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
#!/bin/sh
|
||||
|
||||
SCRIPT_PATH="$(dirname "$(readlink -f "$0")")"
|
||||
|
||||
if [ $# -lt 2 ]; then
|
||||
echo "Usage: $0 JSON-FILE MODULE [ ARGS ]"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
json=$1; shift
|
||||
module=$1; shift
|
||||
|
||||
echo "1..1"
|
||||
|
||||
if [ ! -e "$SCRIPT_PATH/$json" ]; then
|
||||
echo "not ok 1 - $SCRIPT_PATH/$json not found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cat "$SCRIPT_PATH/$json" | \
|
||||
"$SCRIPT_PATH"/../../../board/netconf/rootfs/lib/infix/cli-pretty \
|
||||
"$module" $*
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "ok 1 - $json printed without crashing"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "not ok 1 - $json printing returned non zero"
|
||||
exit 1
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
- case: vlan_ping.py
|
||||
- case: ipv4_address.py
|
||||
- case: iface_phys_address.py
|
||||
- case: iface_status.py
|
||||
- case: routing_basic.py
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import copy
|
||||
import infamy
|
||||
import infamy.iface as iface
|
||||
|
||||
|
||||
with infamy.Test() as test:
|
||||
with test.step("Initialize"):
|
||||
env = infamy.Env(infamy.std_topology("1x2"))
|
||||
target = env.attach("target", "mgmt")
|
||||
_, tport = env.ltop.xlate("target", "data")
|
||||
pmac = iface.get_phys_address(target, tport)
|
||||
cmac = "02:01:00:c0:ff:ee"
|
||||
print(f"Target iface {tport} original mac {pmac}")
|
||||
|
||||
with test.step("Set custom MAC address"):
|
||||
config = {
|
||||
"interfaces": {
|
||||
"interface": [{
|
||||
"name": f"{tport}",
|
||||
"type": "infix-if-type:ethernet",
|
||||
"phys-address": f"{cmac}"
|
||||
}]
|
||||
}
|
||||
}
|
||||
target.put_config_dict("ietf-interfaces", config)
|
||||
mac = iface.get_phys_address(target, tport)
|
||||
print(f"Target iface {tport} current mac: {mac}")
|
||||
assert mac == cmac
|
||||
|
||||
with test.step(f"Remove custom MAC address"):
|
||||
running = target.get_config_dict("/ietf-interfaces:interfaces")
|
||||
new = copy.deepcopy(running)
|
||||
for i in new["interfaces"]["interface"]:
|
||||
if i["name"] == tport:
|
||||
del i["phys-address"]
|
||||
break
|
||||
target.put_diff_dicts("ietf-interfaces", running, new)
|
||||
mac = iface.get_phys_address(target, tport)
|
||||
print(f"Target iface {tport} current mac: {mac}")
|
||||
assert mac == pmac
|
||||
|
||||
test.succeed()
|
||||
@@ -15,6 +15,7 @@ RUN apk add --no-cache \
|
||||
qemu-img \
|
||||
qemu-system-x86_64 \
|
||||
ruby-mustache \
|
||||
socat \
|
||||
squashfs-tools \
|
||||
tcpdump
|
||||
|
||||
|
||||
@@ -8,6 +8,10 @@ The following is a checklist/reminder to maintainers for how to update
|
||||
the image, e.g., with missing Alpine packages.
|
||||
|
||||
1. Update the Dockerfile
|
||||
|
||||
cd test/docker/
|
||||
edit Dockerfile
|
||||
|
||||
2. Build the new image version, for latest version, see released images
|
||||
here: <https://github.com/kernelkit/infix/pkgs/container/infix-test>
|
||||
in this example we use version 0.4:
|
||||
|
||||
@@ -3,5 +3,6 @@ netconf_client==2.2.0
|
||||
netifaces==0.11.0
|
||||
networkx==3.1
|
||||
pydot==1.4.2
|
||||
pyyaml==5.4.1
|
||||
pyyaml==6.0.1
|
||||
passlib==1.7.4
|
||||
ssdp[cli]==1.3.0
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
set -e
|
||||
|
||||
INFIX_TEST=ghcr.io/kernelkit/infix-test:0.6
|
||||
INFIX_TEST=ghcr.io/kernelkit/infix-test:0.7
|
||||
|
||||
extract_yang()
|
||||
{
|
||||
@@ -91,6 +91,7 @@ EOF
|
||||
|
||||
testdir=$(dirname $(readlink -f "$0"))
|
||||
ixdir=$(readlink -f "$testdir/..")
|
||||
logdir=$(readlink -f "$testdir/.log")
|
||||
envdir="$HOME/.infix-test-venv"
|
||||
qeneth="$ixdir/qeneth/qeneth"
|
||||
|
||||
@@ -147,6 +148,14 @@ if [ "$containerize" ]; then
|
||||
$kvm \
|
||||
$INFIX_TEST \
|
||||
"$0" -C "$@"
|
||||
else
|
||||
if [ ! -f ~/.9pm.rc ]; then
|
||||
cat <<-EOF >~/.9pm.rc
|
||||
# Generated by Infix env
|
||||
SSH_OPTS: "-o StrictHostKeyChecking=no"
|
||||
LOG_PATH: "$logdir"
|
||||
EOF
|
||||
fi
|
||||
fi
|
||||
|
||||
shift $((OPTIND - 1))
|
||||
|
||||
@@ -1,47 +1,55 @@
|
||||
def extract_iface_param(json_content, param):
|
||||
"""
|
||||
Fetch interface status from remote device.
|
||||
"""
|
||||
|
||||
def _iface_xpath(iface, path=None):
|
||||
"""Compose complete XPath to a YANG node in /ietf-interfaces"""
|
||||
xpath = f"/ietf-interfaces:interfaces/interface[name='{iface}']"
|
||||
if path:
|
||||
xpath.join(f"/{path}")
|
||||
return xpath
|
||||
|
||||
def _iface_extract_param(json_content, param):
|
||||
"""Returns (extracted) value for parameter 'param'"""
|
||||
interfaces = json_content.get('interfaces')
|
||||
if not interfaces:
|
||||
return None
|
||||
|
||||
|
||||
for interface in interfaces.get('interface'):
|
||||
if param not in interface:
|
||||
continue
|
||||
return interface[param]
|
||||
|
||||
return None
|
||||
|
||||
return None
|
||||
|
||||
def _iface_get_param(target, iface, param=None):
|
||||
"""Fetch target dict for iface and extract param from JSON"""
|
||||
try:
|
||||
content = target.get_data(_iface_xpath(iface, param))
|
||||
return _iface_extract_param(content, param)
|
||||
except:
|
||||
return None
|
||||
|
||||
def interface_exist(target, iface):
|
||||
"""Verify that the target interface exists"""
|
||||
try:
|
||||
content = target.get_dict(f"/ietf-interfaces:interfaces/ietf-interfaces:interface[name='{iface}']")
|
||||
name = extract_iface_param(content, 'name')
|
||||
return (name != None)
|
||||
except:
|
||||
return False
|
||||
return _iface_get_param(target, iface, "name") is not None
|
||||
|
||||
def get_if_index(target, iface):
|
||||
"""Return value of 'if-index' (interface index) parameter for the target interface"""
|
||||
try:
|
||||
content = target.get_dict(f"/ietf-interfaces:interfaces/ietf-interfaces:interface[name='{iface}']/ietf-interfaces:if-index")
|
||||
if_index = extract_iface_param(content, 'if-index')
|
||||
return if_index
|
||||
except:
|
||||
return None
|
||||
"""Fetch interface 'if-index' (operational status)"""
|
||||
return _iface_get_param(target, iface, "if-index")
|
||||
|
||||
def get_oper_status(target, iface):
|
||||
"""Return value of 'oper-status' (operational status) parameter for the target interface"""
|
||||
try:
|
||||
content = target.get_dict(f"/ietf-interfaces:interfaces/ietf-interfaces:interface[name='{iface}']/ietf-interfaces:oper-status")
|
||||
oper_status = extract_iface_param(content, 'oper-status')
|
||||
return oper_status
|
||||
except:
|
||||
return None
|
||||
|
||||
"""Fetch interface 'oper-status' (operational status)"""
|
||||
return _iface_get_param(target, iface, "oper-status")
|
||||
|
||||
def get_phys_address(target, iface):
|
||||
"""Fetch interface MAC address (operational status)"""
|
||||
return _iface_get_param(target, iface, "phys-address")
|
||||
|
||||
def print_iface_status(target):
|
||||
"""Print status parameters for all target interfaces"""
|
||||
try:
|
||||
content = target.get_dict(f"/ietf-interfaces:interfaces")
|
||||
content = target.get_dict("/ietf-interfaces:interfaces")
|
||||
interfaces = content.get('interfaces')
|
||||
if interfaces:
|
||||
interface_list = interfaces.get('interface')
|
||||
@@ -58,4 +66,4 @@ def print_iface_status(target):
|
||||
f"{interface['oper-status']: <12}")
|
||||
print('-'*36)
|
||||
except:
|
||||
print(f"Failed to get interfaces' status from target {target}")
|
||||
print(f"Failed to get interfaces' status from target {target}")
|
||||
|
||||
@@ -6,6 +6,7 @@ import logging
|
||||
import socket
|
||||
import sys
|
||||
import time
|
||||
import uuid # For _ncc_get_data() extension
|
||||
|
||||
import libyang
|
||||
import lxml
|
||||
@@ -45,6 +46,13 @@ class Manager(netconf_client.ncclient.Manager):
|
||||
self.set_logger_level(logging.DEBUG)
|
||||
self.logger().addHandler(logging.StreamHandler(sys.stderr))
|
||||
|
||||
class NccGetDataReply:
|
||||
"""Fold in to DataReply class when upstreaming"""
|
||||
def __init__(self, raw, ele):
|
||||
self.data_ele = ele.find("{urn:ietf:params:xml:ns:yang:ietf-netconf-nmda}data")
|
||||
self.data_xml = lxml.etree.tostring(self.data_ele)
|
||||
self.raw_reply = raw
|
||||
|
||||
@dataclass
|
||||
class Location:
|
||||
host: str
|
||||
@@ -120,6 +128,25 @@ class Device(object):
|
||||
return list(filter(lambda m: m["name"] in modnames,
|
||||
self.modules.values()))
|
||||
|
||||
def _ncc_make_rpc(self, guts, msg_id=None):
|
||||
if not msg_id:
|
||||
msg_id = uuid.uuid4()
|
||||
|
||||
return '<rpc message-id="{id}" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">{guts}</rpc>' \
|
||||
.format(guts=guts, id=msg_id).encode("utf-8")
|
||||
|
||||
def _ncc_get_data_rpc(self, datastore="operational", filter=None, msg_id=None):
|
||||
pieces = []
|
||||
pieces.append('<get-data xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-nmda">')
|
||||
pieces.append(f'<datastore xmlns:ds="urn:ietf:params:xml:ns:yang:ietf-datastores">'
|
||||
f'ds:{datastore}'
|
||||
f'</datastore>')
|
||||
if filter:
|
||||
xmlns = " ".join([f"xmlns:{m['name']}=\"{m['namespace']}\"" for m in self._modules_in_xpath(filter)])
|
||||
pieces.append(f'<xpath-filter {xmlns}>{filter}</xpath-filter>')
|
||||
pieces.append("</get-data>")
|
||||
return self._ncc_make_rpc("".join(pieces), msg_id=msg_id)
|
||||
|
||||
def _get(self, xpath, getter):
|
||||
# Figure out which modules we are referencing
|
||||
mods = self._modules_in_xpath(xpath)
|
||||
@@ -127,16 +154,32 @@ class Device(object):
|
||||
# Fetch the data
|
||||
xmlns = " ".join([f"xmlns:{m['name']}=\"{m['namespace']}\"" for m in mods])
|
||||
filt = f"<filter type=\"xpath\" select=\"{xpath}\" {xmlns} />"
|
||||
# pylint: disable=c-extension-no-member
|
||||
cfg = lxml.etree.tostring(getter(filter=filt).data_ele[0])
|
||||
|
||||
return self.ly.parse_data_mem(cfg, "xml", parse_only=True)
|
||||
|
||||
def _get_data(self, xpath):
|
||||
"""Local member wrapper for netconf-client <get-data> RPC"""
|
||||
# pylint: disable=protected-access
|
||||
(raw, ele) = self.ncc._send_rpc(self._ncc_get_data_rpc(filter=xpath))
|
||||
data = NccGetDataReply(raw, ele)
|
||||
# pylint: disable=c-extension-no-member
|
||||
cfg = lxml.etree.tostring(data.data_ele[0])
|
||||
return self.ly.parse_data_mem(cfg, "xml", parse_only=True)
|
||||
|
||||
def get(self, xpath):
|
||||
"""RPC <get> (legacy NETCONF) fetches config:false data"""
|
||||
return self._get(xpath, self.ncc.get)
|
||||
|
||||
def get_dict(self, xpath):
|
||||
"""Return Python dictionary of <get> RPC data"""
|
||||
return self.get(xpath).print_dict()
|
||||
|
||||
def get_data(self, xpath):
|
||||
"""RPC <get-data> to fetch operational data"""
|
||||
return self._get_data(xpath).print_dict()
|
||||
|
||||
def get_config(self, xpath):
|
||||
return self._get(xpath, self.ncc.get_config)
|
||||
|
||||
|
||||