Compare commits
6 Commits
8f7af9da13
...
601b402db5
Author | SHA1 | Date |
---|---|---|
Samuel Ortion | 601b402db5 | |
Samuel Ortion | 17b2d3d2b1 | |
Samuel Ortion | 43e4ebeef3 | |
Samuel Ortion | f62ac80412 | |
Samuel Ortion | bd8a7bcbd6 | |
Samuel Ortion | 3db94fd482 |
|
@ -0,0 +1,7 @@
|
|||
var/
|
||||
/.venv/
|
||||
/analyzer/
|
||||
|
||||
.env
|
||||
|
||||
species_list.txt
|
|
@ -0,0 +1,3 @@
|
|||
[submodule "BirdNET-Analyzer"]
|
||||
path = analyzer
|
||||
url = git@github.com:kahst/BirdNET-Analyzer.git
|
|
@ -0,0 +1,35 @@
|
|||
# !/bin/bash
|
||||
|
||||
# Extract data generated with BirdNET on record to get relevant informations and record data in sqlite
|
||||
|
||||
# Load config file
|
||||
config_filepath="./config/analyzer.conf"
|
||||
if [ -f "$config_filepath" ]; then
|
||||
source "$config_filepath"
|
||||
else
|
||||
echo "Config file not found: $config_filepath"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Verify needed prerequisites
|
||||
if [[ -z ${CHUNK_FOLDER} ]]; then
|
||||
echo "CHUNK_FOLDER is not set"
|
||||
exit 1
|
||||
else
|
||||
if [[ ! -d "${CHUNK_FOLDER}" ]]; then
|
||||
echo "CHUNK_FOLDER does not exist: ${CHUNK_FOLDER}"
|
||||
exit 1
|
||||
else
|
||||
if [[ ! -d "${CHUNK_FOLDER}/out" ]]; then
|
||||
echo "Output dir does not exist: ${CHUNK_FOLDER}/out"
|
||||
echo "Cannot mine data"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
function list_all_model_outputs()
|
||||
{
|
||||
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
#! /usr/bin/env bash
|
||||
|
||||
# Load config file
|
||||
config_filepath="./config/analyzer.conf"
|
||||
|
||||
if [ -f "$config_filepath" ]; then
|
||||
source "$config_filepath"
|
||||
else
|
||||
echo "Config file not found: $config_filepath"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if database location is specified
|
||||
if [ -z "$DATABASE" ]; then
|
||||
echo "DATABASE location not specified"
|
||||
echo "Defaults to ./var/db.sqlite"
|
||||
DATABASE="./var/db.sqlite"
|
||||
fi
|
||||
|
||||
# Create database according to schema in structure.sql
|
||||
sqlite3 "$DATABASE" < ./daemon/database/structure.sql
|
|
@ -0,0 +1,202 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="297mm"
|
||||
height="210mm"
|
||||
viewBox="0 0 297 210"
|
||||
version="1.1"
|
||||
id="svg5"
|
||||
inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)"
|
||||
sodipodi:docname="database_entity_model.svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview7"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="mm"
|
||||
showgrid="false"
|
||||
inkscape:zoom="0.69121632"
|
||||
inkscape:cx="537.45838"
|
||||
inkscape:cy="237.26292"
|
||||
inkscape:window-width="960"
|
||||
inkscape:window-height="1011"
|
||||
inkscape:window-x="20"
|
||||
inkscape:window-y="20"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="layer1" />
|
||||
<defs
|
||||
id="defs2">
|
||||
<rect
|
||||
x="60.967851"
|
||||
y="72.660463"
|
||||
width="459.41278"
|
||||
height="328.1489"
|
||||
id="rect1143" />
|
||||
</defs>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<g
|
||||
id="g1129">
|
||||
<rect
|
||||
style="fill:none;stroke:#000000;stroke-width:0.5;stroke-dasharray:none"
|
||||
id="rect131"
|
||||
width="65.246124"
|
||||
height="55.045082"
|
||||
x="43.106831"
|
||||
y="41.155899" />
|
||||
<rect
|
||||
style="fill:none;stroke:#000000;stroke-width:0.515115;stroke-dasharray:none"
|
||||
id="rect811"
|
||||
width="65.240868"
|
||||
height="19.126961"
|
||||
x="43.155922"
|
||||
y="41.253414" />
|
||||
</g>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20.4379px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:none;stroke:#000000;stroke-width:2.89671;stroke-dasharray:none"
|
||||
x="85.102234"
|
||||
y="196.65274"
|
||||
id="text975"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan973"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20.4379px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:2.89672"
|
||||
x="85.102234"
|
||||
y="196.65274">birdnet_stream_db</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444px;font-family:'Latin Modern Mono';-inkscape-font-specification:'Latin Modern Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:none;stroke:#000000;stroke-width:0.499999;stroke-dasharray:none"
|
||||
x="61.804199"
|
||||
y="53.257435"
|
||||
id="text1105"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan1103"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444px;font-family:'Latin Modern Mono';-inkscape-font-specification:'Latin Modern Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:none;stroke:#000000;stroke-width:0.5"
|
||||
x="61.804199"
|
||||
y="53.257435">taxon</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444px;font-family:'Latin Modern Mono';-inkscape-font-specification:'Latin Modern Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:none;stroke:#000000;stroke-width:0.499999;stroke-dasharray:none"
|
||||
x="48.997536"
|
||||
y="66.91153"
|
||||
id="text1133"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan1131"
|
||||
style="stroke-width:0.5"
|
||||
x="48.997536"
|
||||
y="66.91153"># taxon_id</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
style="stroke-width:0.5"
|
||||
x="48.997536"
|
||||
y="73.967079"
|
||||
id="tspan1135">scientific_name</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
style="stroke-width:0.5"
|
||||
x="48.997536"
|
||||
y="81.022629"
|
||||
id="tspan1137">common_name</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
style="stroke-width:0.5"
|
||||
x="48.997536"
|
||||
y="88.078178"
|
||||
id="tspan1139" /></text>
|
||||
<g
|
||||
id="g1129-8"
|
||||
transform="matrix(0.99211666,0,0,1.3173149,104.43433,-21.334123)">
|
||||
<rect
|
||||
style="fill:none;stroke:#000000;stroke-width:0.5;stroke-dasharray:none"
|
||||
id="rect131-9"
|
||||
width="65.246124"
|
||||
height="55.045082"
|
||||
x="43.106831"
|
||||
y="41.155899" />
|
||||
<rect
|
||||
style="fill:none;stroke:#000000;stroke-width:0.434779;stroke-dasharray:none"
|
||||
id="rect811-7"
|
||||
width="65.333549"
|
||||
height="13.606859"
|
||||
x="43.109581"
|
||||
y="41.208733" />
|
||||
</g>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444px;font-family:'Latin Modern Mono';-inkscape-font-specification:'Latin Modern Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:none;stroke:#000000;stroke-width:0.499999;stroke-dasharray:none"
|
||||
x="161.55785"
|
||||
y="46.174801"
|
||||
id="text1105-3"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan1103-6"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444px;font-family:'Latin Modern Mono';-inkscape-font-specification:'Latin Modern Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:none;stroke:#000000;stroke-width:0.5"
|
||||
x="161.55785"
|
||||
y="46.174801">observation</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.46175px;font-family:'Latin Modern Mono';-inkscape-font-specification:'Latin Modern Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:none;stroke:#000000;stroke-width:0.483816;stroke-dasharray:none"
|
||||
x="148.6974"
|
||||
y="61.234417"
|
||||
id="text1133-1"
|
||||
transform="scale(1.0338021,0.96730317)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan1131-2"
|
||||
style="stroke-width:0.483817"
|
||||
x="148.6974"
|
||||
y="61.234417"># observation_id</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
style="stroke-width:0.483817"
|
||||
x="148.6974"
|
||||
y="68.061607"
|
||||
id="tspan1135-9">taxon_id</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
style="stroke-width:0.483817"
|
||||
x="148.6974"
|
||||
y="74.888802"
|
||||
id="tspan1310">locality_id</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
style="stroke-width:0.483817"
|
||||
x="148.6974"
|
||||
y="81.715988"
|
||||
id="tspan1312">date</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
style="stroke-width:0.483817"
|
||||
x="148.6974"
|
||||
y="88.543182"
|
||||
id="tspan1314">time</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
style="stroke-width:0.483817"
|
||||
x="148.6974"
|
||||
y="95.370377"
|
||||
id="tspan1316">notes</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
style="stroke-width:0.483817"
|
||||
x="148.6974"
|
||||
y="102.19757"
|
||||
id="tspan1139-1">confidence</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
transform="scale(0.26458333)"
|
||||
id="text1141"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:21.3333px;font-family:'Latin Modern Mono';-inkscape-font-specification:'Latin Modern Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;white-space:pre;shape-inside:url(#rect1143);display:inline;fill:none;stroke:#000000;stroke-width:1.88976;stroke-dasharray:none" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444px;font-family:'Latin Modern Mono';-inkscape-font-specification:'Latin Modern Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:none;stroke:#000000;stroke-width:0.499999;stroke-dasharray:none"
|
||||
x="158.23474"
|
||||
y="72.990105"
|
||||
id="text1306"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan1304"
|
||||
style="stroke-width:0.5"
|
||||
x="158.23474"
|
||||
y="72.990105" /></text>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 9.1 KiB |
|
@ -0,0 +1,70 @@
|
|||
#! /usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
# Load config file
|
||||
config_filepath="./config/analyzer.conf"
|
||||
|
||||
if [ -f "$config_filepath" ]; then
|
||||
source "$config_filepath"
|
||||
else
|
||||
echo "Config file not found: $config_filepath"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if database location is specified
|
||||
if [ -z "$DATABASE" ]; then
|
||||
echo "DATABASE location not specified"
|
||||
echo "Defaults to ./var/db.sqlite"
|
||||
DATABASE="./var/db.sqlite"
|
||||
fi
|
||||
|
||||
# Check if species list is specified
|
||||
if [ -z "$SPECIES_LIST" ]; then
|
||||
echo "SPECIES_LIST location not specified"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
function insert_taxa()
|
||||
{
|
||||
for taxon in "$(cat $SPECIES_LIST)"; do
|
||||
taxon_scientific_name=$(echo $taxon | cut -d'_' -f1)
|
||||
taxon_common_name=$(echo $taxon | cut -d'_' -f2)
|
||||
if $(taxon_exists $taxon_scientific_name); then
|
||||
echo "Taxon already exists: $taxon_scientific_name"
|
||||
else
|
||||
echo "Inserting taxon: $taxon_scientific_name"
|
||||
statement="INSERT INTO taxon (scientific_name, common_name) VALUES ('$taxon_scientific_name', '$taxon_common_name')"
|
||||
echo $statement
|
||||
result=$(sqlite3 "$DATABASE" "$statement")
|
||||
echo "$result"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
function taxon_exists()
|
||||
{
|
||||
taxon_scientific_name="$1"
|
||||
statement="SELECT scientific_name FROM taxon WHERE scientific_name='$taxon_scientific_name'"
|
||||
result=$(sqlite3 "$DATABASE" "$statement")
|
||||
if [ -z "$result" ]; then
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
}
|
||||
|
||||
function purge_taxa()
|
||||
{
|
||||
statement="DELETE FROM taxon"
|
||||
result=$(sqlite3 "$DATABASE" "$statement")
|
||||
echo "$result"
|
||||
}
|
||||
|
||||
function main()
|
||||
{
|
||||
purge_taxa
|
||||
insert_taxa
|
||||
}
|
||||
|
||||
main
|
|
@ -0,0 +1,41 @@
|
|||
#! /usr/bin/env bash
|
||||
|
||||
# Load config file
|
||||
config_filepath="./config/analyzer.conf"
|
||||
|
||||
if [ -f "$config_filepath" ]; then
|
||||
source "$config_filepath"
|
||||
else
|
||||
echo "Config file not found: $config_filepath"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if database location is specified
|
||||
if [ -z "$DATABASE" ]; then
|
||||
echo "DATABASE location not specified"
|
||||
echo "Defaults to ./var/db.sqlite"
|
||||
DATABASE="./var/db.sqlite"
|
||||
fi
|
||||
|
||||
function insert_observation()
|
||||
{
|
||||
# Insert observation into database
|
||||
template=$(cat ./daemon/database/observation_template.sql)
|
||||
statement=$(echo "$template" | sed "s/:taxon_id/$1/g" | sed "s/:location_id/$2/g" | sed "s/:date/$3/g" | sed "s/:time/$4/g" | sed "s/:confidence/$5/g" | sed "s/:notes/$6/g")
|
||||
result=$(sqlite3 "$DATABASE" $statement)
|
||||
echo "$result"
|
||||
}
|
||||
|
||||
function get_taxon_id()
|
||||
{
|
||||
# Get taxon id from database
|
||||
statement="SELECT taxon_id FROM taxon WHERE scientific_name='$1'"
|
||||
result=$(sqlite3 "$DATABASE" "$statement")
|
||||
echo "$result"
|
||||
}
|
||||
|
||||
function test()
|
||||
{
|
||||
taxon_scientific_name="Erithacus rubecula"
|
||||
taxon_id=$(get_taxon_id "$taxon_scientific_name")
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
/** Observation database entry template */
|
||||
|
||||
INSERT INTO observation (taxon_id, locality_id, date, time, confidence) VALUES (:taxon_id, :locality_id, :date, :time, :confidence);
|
|
@ -0,0 +1,46 @@
|
|||
# Installation Guide for BirdNET-stream
|
||||
|
||||
This guide allow you to install BirdNET-stream step by step on your debian based system.
|
||||
|
||||
For a one-liner installation, you can use the following command:
|
||||
|
||||
```bash
|
||||
curl -sL https://raw.githubusercontent.com/birdnet-stream/birdnet-stream/master/install.sh | bash
|
||||
```
|
||||
|
||||
## Requirements
|
||||
|
||||
- git
|
||||
- ffmpeg
|
||||
- python3
|
||||
|
||||
## Install process
|
||||
|
||||
### Install python requirements
|
||||
|
||||
```bash
|
||||
sudo apt-get update
|
||||
sudo apt-get install python3-dev python3-pip
|
||||
sudo pip3 install --upgrade pip
|
||||
```
|
||||
|
||||
### Install ffmpeg
|
||||
|
||||
```bash
|
||||
sudo apt-get install ffmpeg
|
||||
```
|
||||
|
||||
### Clone BirdNET-stream repository
|
||||
|
||||
```bash
|
||||
git clone --recurse-submodules https://forge.chapril.org/UncleSamulus/BirdNET-stream.git
|
||||
```
|
||||
|
||||
### Setup python virtualenv and packages
|
||||
|
||||
```bash
|
||||
python3 -m venv .venv/birdnet-stream
|
||||
source .venv/birdnet-stream
|
||||
|
||||
pip install -r requirements.txt
|
||||
```
|
|
@ -0,0 +1,674 @@
|
|||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<https://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
29
README.md
29
README.md
|
@ -1,3 +1,28 @@
|
|||
# BirdNET-stream
|
||||
<h1 align="center">BirdNET-stream</h1>
|
||||
|
||||
BirdNET powered soundscape analysis for bird song identification
|
||||
<p align="center">Realtime BirdNET powered soundscape analysis for bird song identification.</p>
|
||||
|
||||
<p align="center">
|
||||
<img src="./media/logo.svg" alt="BirdNET-stream logo image IA generated" style="width: 500px">
|
||||
</p>
|
||||
|
||||
## Introduction
|
||||
|
||||
BirdNET-stream record sound on Linux computer and analyze it with the help of the BirdNET algorithm. It extracts most interesting bird songs and calls accessible in a webapp.
|
||||
|
||||
## Install
|
||||
|
||||
On debian based system, you can install BirdNET-stream with the following command:
|
||||
|
||||
```bash
|
||||
curl -sL https://raw.githubusercontent.com/birdnet-stream/birdnet-stream/master/install.sh | bash
|
||||
```
|
||||
|
||||
For finer control, or to adapt to your system, you can follow the instructions in the [INSTALL.md](./INSTALL.md) file.
|
||||
|
||||
## Usage
|
||||
|
||||
## Acknoledgements
|
||||
|
||||
- [BirdNET](https://birdnet.cornell.edu) on which this project relies
|
||||
- [BirdNET-Pi](https://birdnetpi.com) the great inspiration of this project
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 08f031585265e5bc22e86a60ecbb0310c937a29b
|
|
@ -0,0 +1,20 @@
|
|||
# Configuration file for BirdNET Analyzer
|
||||
|
||||
# Coordinates of the recorder
|
||||
LATITUDE="47.87842"
|
||||
LONGITUDE="0.21826"
|
||||
LOCATION="Maison ORTION - Saint-Gervais-en-Belin"
|
||||
# Species selection list
|
||||
SPECIES_LIST="./config/species_list.txt"
|
||||
# Minimal confidence threshold
|
||||
CONFIDENCE=0.25
|
||||
# Recording duration (in seconds)
|
||||
RECORDING_DURATION=15
|
||||
# Chunk folder location
|
||||
CHUNK_FOLDER="./var/chunks"
|
||||
# Audio recording device (pulseaudio)
|
||||
AUDIO_DEVICE="default"
|
||||
# Virtual env for BirdNET AI with required packages
|
||||
PYTHON_VENV="./.venv/birdnet-stream"
|
||||
# Database location
|
||||
DATABASE="./var/db.sqlite"
|
|
@ -0,0 +1,189 @@
|
|||
Acanthis cabaret_Lesser Redpoll
|
||||
Accipiter nisus_Eurasian Sparrowhawk
|
||||
Acrocephalus palustris_Marsh Warbler
|
||||
Acrocephalus schoenobaenus_Sedge Warbler
|
||||
Acrocephalus scirpaceus_Eurasian Reed Warbler
|
||||
Actitis hypoleucos_Common Sandpiper
|
||||
Aegithalos caudatus_Long-tailed Tit
|
||||
Aix galericulata_Mandarin Duck
|
||||
Alauda arvensis_Eurasian Skylark
|
||||
Alcedo atthis_Common Kingfisher
|
||||
Alectoris rufa_Red-legged Partridge
|
||||
Alopochen aegyptiaca_Egyptian Goose
|
||||
Anas acuta_Northern Pintail
|
||||
Anas crecca_Green-winged Teal
|
||||
Anas platyrhynchos_Mallard
|
||||
Anser albifrons_Greater White-fronted Goose
|
||||
Anser anser_Graylag Goose
|
||||
Anthus petrosus_Rock Pipit
|
||||
Anthus pratensis_Meadow Pipit
|
||||
Anthus spinoletta_Water Pipit
|
||||
Anthus trivialis_Tree Pipit
|
||||
Apus apus_Common Swift
|
||||
Aquila chrysaetos_Golden Eagle
|
||||
Ardea alba_Great Egret
|
||||
Ardea cinerea_Gray Heron
|
||||
Ardea purpurea_Purple Heron
|
||||
Arenaria interpres_Ruddy Turnstone
|
||||
Aythya ferina_Common Pochard
|
||||
Aythya fuligula_Tufted Duck
|
||||
Aythya marila_Greater Scaup
|
||||
Branta bernicla_Brant
|
||||
Branta canadensis_Canada Goose
|
||||
Bubulcus ibis_Cattle Egret
|
||||
Bucephala clangula_Common Goldeneye
|
||||
Buteo buteo_Common Buzzard
|
||||
Calidris alpina_Dunlin
|
||||
Calidris melanotos_Pectoral Sandpiper
|
||||
Calidris pugnax_Ruff
|
||||
Carduelis carduelis_European Goldfinch
|
||||
Certhia brachydactyla_Short-toed Treecreeper
|
||||
Certhia familiaris_Eurasian Treecreeper
|
||||
Cettia cetti_Cetti's Warbler
|
||||
Charadrius dubius_Little Ringed Plover
|
||||
Charadrius hiaticula_Common Ringed Plover
|
||||
Chlidonias hybrida_Whiskered Tern
|
||||
Chloris chloris_European Greenfinch
|
||||
Chroicocephalus ridibundus_Black-headed Gull
|
||||
Ciconia ciconia_White Stork
|
||||
Cinclus cinclus_White-throated Dipper
|
||||
Circaetus gallicus_Short-toed Snake-Eagle
|
||||
Circus aeruginosus_Eurasian Marsh-Harrier
|
||||
Circus pygargus_Montagu's Harrier
|
||||
Cisticola juncidis_Zitting Cisticola
|
||||
Coccothraustes coccothraustes_Hawfinch
|
||||
Columba livia_Rock Pigeon
|
||||
Columba oenas_Stock Dove
|
||||
Columba palumbus_Common Wood-Pigeon
|
||||
Corvus corax_Common Raven
|
||||
Corvus corone_Carrion Crow
|
||||
Corvus frugilegus_Rook
|
||||
Corvus monedula_Eurasian Jackdaw
|
||||
Coturnix coturnix_Common Quail
|
||||
Cuculus canorus_Common Cuckoo
|
||||
Curruca communis_Greater Whitethroat
|
||||
Curruca curruca_Lesser Whitethroat
|
||||
Curruca undata_Dartford Warbler
|
||||
Cyanistes caeruleus_Eurasian Blue Tit
|
||||
Cygnus olor_Mute Swan
|
||||
Delichon urbicum_Common House-Martin
|
||||
Dendrocopos major_Great Spotted Woodpecker
|
||||
Dendrocoptes medius_Middle Spotted Woodpecker
|
||||
Dryobates minor_Lesser Spotted Woodpecker
|
||||
Dryocopus martius_Black Woodpecker
|
||||
Egretta garzetta_Little Egret
|
||||
Emberiza calandra_Corn Bunting
|
||||
Emberiza cirlus_Cirl Bunting
|
||||
Emberiza citrinella_Yellowhammer
|
||||
Emberiza schoeniclus_Reed Bunting
|
||||
Erithacus rubecula_European Robin
|
||||
Falco peregrinus_Peregrine Falcon
|
||||
Falco subbuteo_Eurasian Hobby
|
||||
Falco tinnunculus_Eurasian Kestrel
|
||||
Ficedula hypoleuca_European Pied Flycatcher
|
||||
Fringilla coelebs_Common Chaffinch
|
||||
Fringilla montifringilla_Brambling
|
||||
Fulica atra_Eurasian Coot
|
||||
Gallinago gallinago_Common Snipe
|
||||
Gallinula chloropus_Eurasian Moorhen
|
||||
Garrulus glandarius_Eurasian Jay
|
||||
Grus grus_Common Crane
|
||||
Haematopus ostralegus_Eurasian Oystercatcher
|
||||
Himantopus himantopus_Black-winged Stilt
|
||||
Hippolais polyglotta_Melodious Warbler
|
||||
Hirundo rustica_Barn Swallow
|
||||
Ichthyaetus melanocephalus_Mediterranean Gull
|
||||
Lanius collurio_Red-backed Shrike
|
||||
Larus argentatus_Herring Gull
|
||||
Larus canus_Common Gull
|
||||
Larus fuscus_Lesser Black-backed Gull
|
||||
Larus marinus_Great Black-backed Gull
|
||||
Larus michahellis_Yellow-legged Gull
|
||||
Limosa lapponica_Bar-tailed Godwit
|
||||
Limosa limosa_Black-tailed Godwit
|
||||
Linaria cannabina_Eurasian Linnet
|
||||
Locustella naevia_Common Grasshopper-Warbler
|
||||
Lophophanes cristatus_Crested Tit
|
||||
Loxia curvirostra_Red Crossbill
|
||||
Lullula arborea_Wood Lark
|
||||
Luscinia megarhynchos_Common Nightingale
|
||||
Luscinia svecica_Bluethroat
|
||||
Mareca penelope_Eurasian Wigeon
|
||||
Mareca strepera_Gadwall
|
||||
Mergus merganser_Common Merganser
|
||||
Milvus migrans_Black Kite
|
||||
Milvus milvus_Red Kite
|
||||
Morus bassanus_Northern Gannet
|
||||
Motacilla alba_White Wagtail
|
||||
Motacilla cinerea_Gray Wagtail
|
||||
Motacilla flava_Western Yellow Wagtail
|
||||
Muscicapa striata_Spotted Flycatcher
|
||||
Numenius arquata_Eurasian Curlew
|
||||
Nycticorax nycticorax_Black-crowned Night-Heron
|
||||
Oenanthe oenanthe_Northern Wheatear
|
||||
Oriolus oriolus_Eurasian Golden Oriole
|
||||
Pandion haliaetus_Osprey
|
||||
Panurus biarmicus_Bearded Reedling
|
||||
Parus major_Great Tit
|
||||
Passer domesticus_House Sparrow
|
||||
Passer montanus_Eurasian Tree Sparrow
|
||||
Perdix perdix_Gray Partridge
|
||||
Periparus ater_Coal Tit
|
||||
Pernis apivorus_European Honey-buzzard
|
||||
Phalacrocorax carbo_Great Cormorant
|
||||
Phasianus colchicus_Ring-necked Pheasant
|
||||
Phoenicurus ochruros_Black Redstart
|
||||
Phoenicurus phoenicurus_Common Redstart
|
||||
Phylloscopus bonelli_Western Bonelli's Warbler
|
||||
Phylloscopus collybita_Common Chiffchaff
|
||||
Phylloscopus ibericus_Iberian Chiffchaff
|
||||
Phylloscopus trochilus_Willow Warbler
|
||||
Pica pica_Eurasian Magpie
|
||||
Picus viridis_Eurasian Green Woodpecker
|
||||
Pluvialis apricaria_European Golden-Plover
|
||||
Pluvialis squatarola_Black-bellied Plover
|
||||
Podiceps cristatus_Great Crested Grebe
|
||||
Poecile montanus_Willow Tit
|
||||
Poecile palustris_Marsh Tit
|
||||
Prunella modularis_Dunnock
|
||||
Psittacula krameri_Rose-ringed Parakeet
|
||||
Pyrrhocorax pyrrhocorax_Red-billed Chough
|
||||
Pyrrhula pyrrhula_Eurasian Bullfinch
|
||||
Rallus aquaticus_Water Rail
|
||||
Recurvirostra avosetta_Pied Avocet
|
||||
Regulus ignicapilla_Common Firecrest
|
||||
Regulus regulus_Goldcrest
|
||||
Remiz pendulinus_Eurasian Penduline-Tit
|
||||
Riparia riparia_Bank Swallow
|
||||
Saxicola rubetra_Whinchat
|
||||
Saxicola rubicola_European Stonechat
|
||||
Serinus serinus_European Serin
|
||||
Sitta europaea_Eurasian Nuthatch
|
||||
Spatula clypeata_Northern Shoveler
|
||||
Spatula querquedula_Garganey
|
||||
Spinus spinus_Eurasian Siskin
|
||||
Sterna hirundo_Common Tern
|
||||
Sternula albifrons_Little Tern
|
||||
Streptopelia decaocto_Eurasian Collared-Dove
|
||||
Streptopelia turtur_European Turtle-Dove
|
||||
Strix aluco_Tawny Owl
|
||||
Sturnus vulgaris_European Starling
|
||||
Sylvia atricapilla_Eurasian Blackcap
|
||||
Sylvia borin_Garden Warbler
|
||||
Tachybaptus ruficollis_Little Grebe
|
||||
Tadorna tadorna_Common Shelduck
|
||||
Thalasseus sandvicensis_Sandwich Tern
|
||||
Tringa erythropus_Spotted Redshank
|
||||
Tringa glareola_Wood Sandpiper
|
||||
Tringa nebularia_Common Greenshank
|
||||
Tringa ochropus_Green Sandpiper
|
||||
Tringa totanus_Common Redshank
|
||||
Troglodytes troglodytes_Eurasian Wren
|
||||
Turdus iliacus_Redwing
|
||||
Turdus merula_Eurasian Blackbird
|
||||
Turdus philomelos_Song Thrush
|
||||
Turdus pilaris_Fieldfare
|
||||
Turdus viscivorus_Mistle Thrush
|
||||
Tyto alba_Barn Owl
|
||||
Uria aalge_Common Murre
|
||||
Vanellus vanellus_Northern Lapwing
|
|
@ -0,0 +1,87 @@
|
|||
#! /usr/bin/env bash
|
||||
set -e
|
||||
|
||||
config_filepath="./config/analyzer.conf"
|
||||
|
||||
if [ -f "$config_filepath" ]; then
|
||||
source "$config_filepath"
|
||||
else
|
||||
echo "Config file not found: $config_filepath"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
PYTHON_EXECUTABLE="${PYTHON_VENV}/bin/python3"
|
||||
|
||||
check_prerequisites() {
|
||||
if [[ -z ${LATITUDE} ]]; then
|
||||
echo "LATITUDE is not set"
|
||||
exit 1
|
||||
fi
|
||||
if [[ -z ${LONGITUDE} ]]; then
|
||||
echo "LONGITUDE is not set"
|
||||
exit 1
|
||||
fi
|
||||
if [[ -z ${CHUNK_FOLDER} ]]; then
|
||||
echo "CHUNK_FOLDER is not set"
|
||||
exit 1
|
||||
else
|
||||
if [[ ! -d "${CHUNK_FOLDER}" ]]; then
|
||||
echo "CHUNK_FOLDER does not exist: ${CHUNK_FOLDER}"
|
||||
exit 1
|
||||
else
|
||||
if [[ ! -d "${CHUNK_FOLDER}/in" ]]; then
|
||||
echo "Input dir does not exist: ${CHUNK_FOLDER}/in"
|
||||
exit 1
|
||||
else
|
||||
if [[ ! -d "${CHUNK_FOLDER}/out" ]]; then
|
||||
echo "Output dir does not exist: ${CHUNK_FOLDER}/out"
|
||||
echo "Creating output dir"
|
||||
mkdir -p "${CHUNK_FOLDER}/out"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
if [[ -z ${SPECIES_LIST} ]]; then
|
||||
echo "SPECIES_LIST is not set"
|
||||
exit 1
|
||||
fi
|
||||
if [[ -f ${PYTHON_EXECUTABLE} ]]; then
|
||||
if $verbose; then
|
||||
echo "Python executable found: ${PYTHON_EXECUTABLE}"
|
||||
fi
|
||||
else
|
||||
echo "Python executable not found: ${PYTHON_EXECUTABLE}"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Get array of audio chunks to be processed
|
||||
get_chunk_list() {
|
||||
find "${CHUNK_FOLDER}/in" -type f -name '*.wav' -exec basename {} \; ! -size 0 | sort
|
||||
}
|
||||
|
||||
# Perform audio chunk analysis on one chunk
|
||||
analyze_chunk() {
|
||||
chunk_name=$1
|
||||
chunk_path="${CHUNK_FOLDER}/in/$chunk_name"
|
||||
output_dir="${CHUNK_FOLDER}/out/$chunk_name.d"
|
||||
mkdir -p "$output_dir"
|
||||
date=$(echo $chunk_name | cut -d'_' -f2)
|
||||
week=$(./daemon/weekof.sh $date)
|
||||
$PYTHON_EXECUTABLE ./analyzer/analyze.py --i $chunk_path --o "$output_dir/model.out.csv" --lat $LATITUDE --lon $LONGITUDE --week $week --min_conf $CONFIDENCE --threads 4 --rtype csv
|
||||
}
|
||||
|
||||
# Perform audio chunk analysis on all recorded chunks
|
||||
analyze_chunks() {
|
||||
for chunk_name in $(get_chunk_list); do
|
||||
analyze_chunk $chunk_name
|
||||
chunk_path="${CHUNK_FOLDER}/in/$chunk_name"
|
||||
mv $chunk_path "${CHUNK_FOLDER}/out/$chunk_name"
|
||||
done
|
||||
}
|
||||
|
||||
# Get list of current chunk in working directory
|
||||
chunks=$(get_chunk_list)
|
||||
|
||||
# Analyze all chunks in working directory
|
||||
analyze_chunks $chunks
|
|
@ -0,0 +1,76 @@
|
|||
#! /usr/bin/env bash
|
||||
##
|
||||
## Clean up var folder from useless files
|
||||
##
|
||||
|
||||
config_filepath="./config/analyzer.conf"
|
||||
|
||||
if [ -f "$config_filepath" ]; then
|
||||
source "$config_filepath"
|
||||
else
|
||||
echo "Config file not found: $config_filepath"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
wav2dir_name() {
|
||||
wav_path=$1
|
||||
dir_name=$(basename "$wav_path" .wav)
|
||||
echo "$dir_name"
|
||||
}
|
||||
|
||||
# Clean out folder from empty audio
|
||||
clean() {
|
||||
rm -rf $(junk)
|
||||
}
|
||||
|
||||
# Check if string contains string
|
||||
mem() {
|
||||
string=$2
|
||||
substring=$1
|
||||
if [[ "$string" == *"$substring"* ]]; then
|
||||
echo "true"
|
||||
else
|
||||
echo "false"
|
||||
fi
|
||||
}
|
||||
|
||||
# Get list of junk files
|
||||
junk() {
|
||||
# Get all empty files from treatement folder
|
||||
find "${CHUNK_FOLDER}/out" -type f -name '*.wav' -size 0
|
||||
for file in $junk; do
|
||||
folder=$(wav2dir_name "$file")
|
||||
if [[ -d $folder ]]; then
|
||||
junk="$junk $folder"
|
||||
fi
|
||||
done
|
||||
# Get all empty files from record folder
|
||||
junk=$(find "${CHUNK_FOLDER}/in" -type f -name '*.wav' -exec basename {} \; ! -size 0)
|
||||
# Get all empty treatment directories
|
||||
junk="$junk $(find ${CHUNK_FOLDER}/out -type d -empty)"
|
||||
# Get all empty record directories
|
||||
treatement_folder=$(find "${CHUNK_FOLDER}/out" -type d ! -empty)
|
||||
for folder in $treatement_folder; do
|
||||
if ! $(mem $folder $junk) && $(no_bird_in_model_output $folder); then
|
||||
junk="$junk $folder"
|
||||
fi
|
||||
done
|
||||
echo "$junk"
|
||||
}
|
||||
|
||||
no_bird_in_model_output() {
|
||||
folder=$1
|
||||
output="${folder}/model.out.csv"
|
||||
lines=$(wc -l < "$output")
|
||||
if [[ $lines -eq 1 ]]; then
|
||||
echo "true"
|
||||
else
|
||||
echo "false"
|
||||
fi
|
||||
}
|
||||
|
||||
main() {
|
||||
clean
|
||||
}
|
||||
|
||||
main
|
|
@ -0,0 +1,37 @@
|
|||
#! /usr/bin/env bash
|
||||
|
||||
record_chunk() {
|
||||
DEVICE=$1
|
||||
DURATION=$2
|
||||
ffmpeg -f pulse -i ${DEVICE} -t ${DURATION} -vn -acodec pcm_s16le -ac 1 -ar 48000 file:${CHUNK_FOLDER}/in/birdnet_$(date "+%Y%m%d_%H%M%S").wav
|
||||
}
|
||||
|
||||
config_filepath="./config/analyzer.conf"
|
||||
|
||||
if [ -f "$config_filepath" ]; then
|
||||
source "$config_filepath"
|
||||
else
|
||||
echo "Config file not found: $config_filepath"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
[ -z $RECORDING_DURATION ] && RECORDING_DURATION=15
|
||||
|
||||
if [[ -z $AUDIO_DEVICE ]]; then
|
||||
echo "AUDIO_DEVICE is not set"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
check_folder() {
|
||||
if [[ ! -d "${CHUNK_FOLDER}" ]]; then
|
||||
echo "CHUNK_FOLDER does not exist: ${CHUNK_FOLDER}"
|
||||
echo "Creating recording dir"
|
||||
mkdir -p "${CHUNK_FOLDER}/in"
|
||||
fi
|
||||
}
|
||||
|
||||
check_folder
|
||||
|
||||
while true; do
|
||||
record_chunk $AUDIO_DEVICE $RECORDING_DURATION
|
||||
done
|
|
@ -0,0 +1,83 @@
|
|||
#! /usr/bin/env python3
|
||||
|
||||
import sqlite3
|
||||
import os
|
||||
|
||||
verbose = False
|
||||
|
||||
"""Load config"""
|
||||
def load_conf():
|
||||
with open("./config/analyzer.conf", "r") as f:
|
||||
conf = f.readlines()
|
||||
res = dict(map(str.strip, sub.split('=', 1)) for sub in conf if '=' in sub)
|
||||
return res
|
||||
|
||||
# Singleton database instance
|
||||
database = None
|
||||
def get_database():
|
||||
global database
|
||||
if database is None:
|
||||
database = sqlite3.connect(CONFIG["DATABASE"])
|
||||
return database
|
||||
|
||||
"""Create the database if it doesn't exist"""
|
||||
def create_database():
|
||||
# Create the database
|
||||
database =
|
||||
|
||||
database = get_database()
|
||||
cursor = database.cursor()
|
||||
with open("./daemon/database/structure.sql", "r") as f:
|
||||
cursor.executescript(f.read())
|
||||
database.commit()
|
||||
|
||||
"""Insert an observation into the database"""
|
||||
def insert_observation(observation):
|
||||
database = get_database()
|
||||
cursor = database.cursor()
|
||||
cursor.execute(f"INSERT INTO observation (taxon_id, locality_id, date, time, confidence) VALUES ({observation['taxon_id']}, {observation['locality_id']}, {observation['date']}, {observation['time']}, {observation['confidence']});")
|
||||
database.commit()
|
||||
|
||||
"""Insert a taxon in database"""
|
||||
def insert_taxon(taxon):
|
||||
database = get_database()
|
||||
cursor = database.cursor()
|
||||
cursor.execute(f"INSERT INTO taxon (scientific_name, common_name) VALUES ('{taxon['scientific_name']}', '{taxon['common_name']}');")
|
||||
database.commit()
|
||||
|
||||
"""Insert a location into database"""
|
||||
def insert_locality(locality):
|
||||
database = get_database()
|
||||
cursor = database.cursor()
|
||||
cursor.execute(f"INSERT INTO locality (name, latitude, longitude) VALUES ('{locality['name']}', {locality['latitude']}, {locality['longitude']});")
|
||||
database.commit()
|
||||
|
||||
"""Insert all species from list into database"""
|
||||
def insert_all_species(species):
|
||||
database = get_database()
|
||||
cursor = database.cursor()
|
||||
for sp in species:
|
||||
# Check if the species already exists in the database
|
||||
cursor.execute(f"SELECT * FROM taxon WHERE scientific_name = '{sp[0]}';")
|
||||
# If it doesn't exist, insert it
|
||||
if cursor.fetchone() is None:
|
||||
cursor.execute(f"INSERT INTO taxon (scientific_name, common_name) VALUES ('{sp[0]}', '{sp[1]}');")
|
||||
database.commit()
|
||||
|
||||
CONFIG = load_conf()
|
||||
|
||||
def main():
|
||||
# Create the database if it doesn't exist
|
||||
if not os.path.exists(CONFIG["DATABASE"]):
|
||||
create_database()
|
||||
else:
|
||||
print("Database already exists")
|
||||
|
||||
# Open species list file
|
||||
with open(CONFIG["SPECIES_LIST"], "r") as f:
|
||||
species = f.readlines()
|
||||
species = [sp.split("_") for sp in species]
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
database.close()
|
|
@ -0,0 +1,29 @@
|
|||
/** Database structure for BirdNET-stream SQLite*/
|
||||
|
||||
/** Taxon table */
|
||||
CREATE TABLE IF NOT EXISTS taxon (
|
||||
taxon_id INTEGER PRIMARY KEY,
|
||||
scientific_name TEXT NOT NULL,
|
||||
common_name TEXT NOT NULL
|
||||
);
|
||||
|
||||
/** Locality table */
|
||||
CREATE TABLE IF NOT EXISTS locality (
|
||||
locality_id INTEGER PRIMARY KEY,
|
||||
name TEXT NOT NULL,
|
||||
latitude REAL NOT NULL,
|
||||
longitude REAL NOT NULL
|
||||
);
|
||||
|
||||
/** Observation table */
|
||||
CREATE TABLE IF NOT EXISTS observation (
|
||||
observation_id INTEGER PRIMARY KEY,
|
||||
taxon_id INTEGER NOT NULL,
|
||||
locality_id INTEGER NOT NULL,
|
||||
date TEXT NOT NULL,
|
||||
time TEXT NOT NULL,
|
||||
notes TEXT,
|
||||
confidence REAL NOT NULL,
|
||||
FOREIGN KEY(taxon_id) REFERENCES taxon(taxon_id),
|
||||
FOREIGN KEY(locality_id) REFERENCES locality(locality_id)
|
||||
);
|
|
@ -0,0 +1,15 @@
|
|||
# Launch BirdNET-Analyzer on the previously recorded audio chunks
|
||||
|
||||
[Unit]
|
||||
Description=BirdNET-stream Analyzis
|
||||
|
||||
[Service]
|
||||
User=$USER
|
||||
Group=$USER
|
||||
ExecStart=/home/$USER/BirdNET-Analyzer/deamon/birdnet_analysis.sh
|
||||
Restart=always
|
||||
RestartSec=3
|
||||
Type=simple
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
|
@ -0,0 +1,15 @@
|
|||
# BirdNET recording script launcher service
|
||||
|
||||
[Unit]
|
||||
Description=BirdNET-stream recording
|
||||
|
||||
[Service]
|
||||
User=1000
|
||||
Group=1000
|
||||
ExecStart="bash /home/$USER/BirdNET-stream/daemon/birdnet_recording.sh"
|
||||
Restart=always
|
||||
RestartSec=3
|
||||
Type=simple
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
|
@ -0,0 +1,10 @@
|
|||
#! /usr/bin/env bash
|
||||
|
||||
# Take a week with format "YYYY-MM-DD" and return the week number.
|
||||
function weekof()
|
||||
{
|
||||
local date=$1
|
||||
date -d "$date" +%W
|
||||
}
|
||||
|
||||
weekof $1
|
|
@ -0,0 +1,72 @@
|
|||
#! /usr/bin/env bash
|
||||
set -X
|
||||
set -e
|
||||
|
||||
DEBUG=${DEBUG:-0}
|
||||
|
||||
# Standard Installation Script for BirdNET-stream for Debian Based Linux distros
|
||||
|
||||
REQUIREMENTS="git ffmpeg python3-pip python3-dev"
|
||||
REPOSITORY="https://github.com/UncleSamulus/BirdNET-stream.git"
|
||||
PYTHON_VENV=".venv/birdnet-stream"
|
||||
|
||||
# Update system
|
||||
update() {
|
||||
sudo apt-get update
|
||||
sudo apt-get upgrade
|
||||
}
|
||||
|
||||
debug() {
|
||||
if [ $DEBUG -eq 1 ]; then
|
||||
echo "$1"
|
||||
fi
|
||||
}
|
||||
|
||||
install_requirements() {
|
||||
if
|
||||
requirements=$1
|
||||
# Install requirements
|
||||
missing_requirements=""
|
||||
for requirement in $requirements; do
|
||||
if ! dpkg -s $requirement >/dev/null 2>&1; then
|
||||
missing_requirements="$missing_requirements $requirement"
|
||||
fi
|
||||
done
|
||||
if [ -n "$missing_requirements" ]; then
|
||||
debug "Installing missing requirements: $missing_requirements"
|
||||
sudo apt-get install $missing_requirements
|
||||
fi
|
||||
}
|
||||
|
||||
# Install BirdNET-stream
|
||||
install_birdnetstream() {
|
||||
# Clone BirdNET-stream
|
||||
debug "Cloning BirdNET-stream from $REPOSITORY"
|
||||
git clone --recurse-submodules $REPOSITORY
|
||||
# Install BirdNET-stream
|
||||
cd BirdNET-stream
|
||||
debug "Creating python3 virtual environment '$PYTHON_VENV'"
|
||||
python3 -m venv $PYTHON_VENV
|
||||
debug "Activating $PYTHON_VENV"
|
||||
source .venv/birdnet-stream/bin/activate
|
||||
debug "Installing python packages"
|
||||
pip install -U pip
|
||||
pip install -r requirements.txt
|
||||
}
|
||||
|
||||
# Install systemd services
|
||||
install_birdnetstream_services() {
|
||||
debug "Setting up BirdNET stream systemd services"
|
||||
sudo ln -s $PWD/BirdNET-stream/daemon/systemd/birdnet_recording.service /etc/systemd/system/birdnet_recording.service
|
||||
sudo ln -s $PWD/BirdNET-stream/daemon/systemd/birdnet_analyzis.service /etc/systemd/system/birdnet_analyzis.service
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable --now birdnet_recording.service birdnet_analyzis.service
|
||||
}
|
||||
|
||||
main() {
|
||||
install_requirements $REQUIREMENTS
|
||||
install_birdnetstream
|
||||
install_birdnetstream_services
|
||||
}
|
||||
|
||||
main
|
File diff suppressed because it is too large
Load Diff
After Width: | Height: | Size: 52 KiB |
|
@ -0,0 +1,24 @@
|
|||
appdirs==1.4.4
|
||||
audioread==2.1.9
|
||||
certifi==2022.6.15
|
||||
cffi==1.15.1
|
||||
charset-normalizer==2.1.0
|
||||
decorator==5.1.1
|
||||
idna==3.3
|
||||
joblib==1.1.0
|
||||
librosa==0.9.2
|
||||
llvmlite==0.39.0
|
||||
numba==0.56.0
|
||||
numpy==1.22.4
|
||||
packaging==21.3
|
||||
pooch==1.6.0
|
||||
pycparser==2.21
|
||||
pyparsing==3.0.9
|
||||
requests==2.28.1
|
||||
resampy==0.3.1
|
||||
scikit-learn==1.1.2
|
||||
scipy==1.9.0
|
||||
SoundFile==0.10.3.post1
|
||||
tflite-runtime==2.9.1
|
||||
threadpoolctl==3.1.0
|
||||
urllib3==1.26.11
|
|
@ -0,0 +1,17 @@
|
|||
|
||||
###> symfony/framework-bundle ###
|
||||
/.env.local
|
||||
/.env.local.php
|
||||
/.env.*.local
|
||||
/config/secrets/prod/prod.decrypt.private.php
|
||||
/public/bundles/
|
||||
/var/
|
||||
/vendor/
|
||||
###< symfony/framework-bundle ###
|
||||
|
||||
###> symfony/webpack-encore-bundle ###
|
||||
/node_modules/
|
||||
/public/build/
|
||||
npm-debug.log
|
||||
yarn-error.log
|
||||
###< symfony/webpack-encore-bundle ###
|
|
@ -0,0 +1,12 @@
|
|||
/*
|
||||
* Welcome to your app's main JavaScript file!
|
||||
*
|
||||
* We recommend including the built version of this JavaScript file
|
||||
* (and its CSS file) in your base layout (base.html.twig).
|
||||
*/
|
||||
|
||||
// any CSS you import will output into a single css file (app.css in this case)
|
||||
import './styles/app.css';
|
||||
|
||||
// start the Stimulus application
|
||||
import './bootstrap';
|
|
@ -0,0 +1,11 @@
|
|||
import { startStimulusApp } from '@symfony/stimulus-bridge';
|
||||
|
||||
// Registers Stimulus controllers from controllers.json and in the controllers/ directory
|
||||
export const app = startStimulusApp(require.context(
|
||||
'@symfony/stimulus-bridge/lazy-controller-loader!./controllers',
|
||||
true,
|
||||
/\.[jt]sx?$/
|
||||
));
|
||||
|
||||
// register any custom, 3rd party controllers here
|
||||
// app.register('some_controller_name', SomeImportedController);
|
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"controllers": [],
|
||||
"entrypoints": []
|
||||
}
|
|
@ -0,0 +1,83 @@
|
|||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: lightgray;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
header {
|
||||
padding: 1em;
|
||||
text-align: center;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
/** Align text and center of image */
|
||||
justify-content: center;
|
||||
align-items: baseline;
|
||||
}
|
||||
|
||||
header img#logo {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
}
|
||||
|
||||
main {
|
||||
min-height: 80vh;
|
||||
padding: 5em;
|
||||
}
|
||||
|
||||
footer {
|
||||
color: white;
|
||||
background-color: black;
|
||||
padding: 2em;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
footer a {
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
footer a:hover {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
nav ul {
|
||||
list-style-type: none;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
background-color: lightgreen;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
nav ul li a,
|
||||
.dropdown-button {
|
||||
color: green;
|
||||
text-decoration: none;
|
||||
display: block;
|
||||
padding: 1em 0.5em;
|
||||
}
|
||||
|
||||
nav ul li a.active,
|
||||
nav ul li a:hover {
|
||||
background-color: aquamarine;
|
||||
}
|
||||
|
||||
.dropdown:hover .dropdown-content {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.dropdown-content {
|
||||
display: none;
|
||||
position: absolute;
|
||||
background-color: #f9f9f9;
|
||||
min-width: 160px;
|
||||
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
|
||||
z-index: 1;
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
#!/usr/bin/env php
|
||||
<?php
|
||||
|
||||
use App\Kernel;
|
||||
use Symfony\Bundle\FrameworkBundle\Console\Application;
|
||||
|
||||
if (!is_file(dirname(__DIR__).'/vendor/autoload_runtime.php')) {
|
||||
throw new LogicException('Symfony Runtime is missing. Try running "composer require symfony/runtime".');
|
||||
}
|
||||
|
||||
require_once dirname(__DIR__).'/vendor/autoload_runtime.php';
|
||||
|
||||
return function (array $context) {
|
||||
$kernel = new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']);
|
||||
|
||||
return new Application($kernel);
|
||||
};
|
|
@ -0,0 +1,6 @@
|
|||
#! /usr/bin/env bash
|
||||
|
||||
# Extract and update translation files
|
||||
php bin/console translation:extract --dump-messages fr
|
||||
|
||||
php bin/console translation:extract --force fr
|
|
@ -0,0 +1,75 @@
|
|||
{
|
||||
"type": "project",
|
||||
"license": "proprietary",
|
||||
"minimum-stability": "stable",
|
||||
"prefer-stable": true,
|
||||
"require": {
|
||||
"php": ">=8.1",
|
||||
"ext-ctype": "*",
|
||||
"ext-iconv": "*",
|
||||
"sensio/framework-extra-bundle": "^6.2",
|
||||
"symfony/console": "6.1.*",
|
||||
"symfony/dotenv": "6.1.*",
|
||||
"symfony/flex": "^2",
|
||||
"symfony/framework-bundle": "6.1.*",
|
||||
"symfony/runtime": "6.1.*",
|
||||
"symfony/translation": "6.1.*",
|
||||
"symfony/twig-bundle": "6.1.*",
|
||||
"symfony/webpack-encore-bundle": "^1.15",
|
||||
"symfony/yaml": "6.1.*",
|
||||
"twig/extra-bundle": "^2.12|^3.0",
|
||||
"twig/twig": "^2.12|^3.0"
|
||||
},
|
||||
"config": {
|
||||
"allow-plugins": {
|
||||
"composer/package-versions-deprecated": true,
|
||||
"symfony/flex": true,
|
||||
"symfony/runtime": true
|
||||
},
|
||||
"optimize-autoloader": true,
|
||||
"preferred-install": {
|
||||
"*": "dist"
|
||||
},
|
||||
"sort-packages": true
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"App\\": "src/"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"App\\Tests\\": "tests/"
|
||||
}
|
||||
},
|
||||
"replace": {
|
||||
"symfony/polyfill-ctype": "*",
|
||||
"symfony/polyfill-iconv": "*",
|
||||
"symfony/polyfill-php72": "*",
|
||||
"symfony/polyfill-php73": "*",
|
||||
"symfony/polyfill-php74": "*",
|
||||
"symfony/polyfill-php80": "*",
|
||||
"symfony/polyfill-php81": "*"
|
||||
},
|
||||
"scripts": {
|
||||
"auto-scripts": {
|
||||
"cache:clear": "symfony-cmd",
|
||||
"assets:install %PUBLIC_DIR%": "symfony-cmd"
|
||||
},
|
||||
"post-install-cmd": [
|
||||
"@auto-scripts"
|
||||
],
|
||||
"post-update-cmd": [
|
||||
"@auto-scripts"
|
||||
]
|
||||
},
|
||||
"conflict": {
|
||||
"symfony/symfony": "*"
|
||||
},
|
||||
"extra": {
|
||||
"symfony": {
|
||||
"allow-contrib": false,
|
||||
"require": "6.1.*"
|
||||
}
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,9 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true],
|
||||
Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true],
|
||||
Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true],
|
||||
Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true],
|
||||
Symfony\WebpackEncoreBundle\WebpackEncoreBundle::class => ['all' => true],
|
||||
];
|
|
@ -0,0 +1,19 @@
|
|||
framework:
|
||||
cache:
|
||||
# Unique name of your app: used to compute stable namespaces for cache keys.
|
||||
#prefix_seed: your_vendor_name/app_name
|
||||
|
||||
# The "app" cache stores to the filesystem by default.
|
||||
# The data in this cache should persist between deploys.
|
||||
# Other options include:
|
||||
|
||||
# Redis
|
||||
#app: cache.adapter.redis
|
||||
#default_redis_provider: redis://localhost
|
||||
|
||||
# APCu (not recommended with heavy random-write workloads as memory fragmentation can cause perf issues)
|
||||
#app: cache.adapter.apcu
|
||||
|
||||
# Namespaced pools use the above "app" backend by default
|
||||
#pools:
|
||||
#my.dedicated.cache: null
|
|
@ -0,0 +1,24 @@
|
|||
# see https://symfony.com/doc/current/reference/configuration/framework.html
|
||||
framework:
|
||||
secret: '%env(APP_SECRET)%'
|
||||
#csrf_protection: true
|
||||
http_method_override: false
|
||||
|
||||
# Enables session support. Note that the session will ONLY be started if you read or write from it.
|
||||
# Remove or comment this section to explicitly disable session support.
|
||||
session:
|
||||
handler_id: null
|
||||
cookie_secure: auto
|
||||
cookie_samesite: lax
|
||||
storage_factory_id: session.storage.factory.native
|
||||
|
||||
#esi: true
|
||||
#fragments: true
|
||||
php_errors:
|
||||
log: true
|
||||
|
||||
when@test:
|
||||
framework:
|
||||
test: true
|
||||
session:
|
||||
storage_factory_id: session.storage.factory.mock_file
|
|
@ -0,0 +1,12 @@
|
|||
framework:
|
||||
router:
|
||||
utf8: true
|
||||
|
||||
# Configure how to generate URLs in non-HTTP contexts, such as CLI commands.
|
||||
# See https://symfony.com/doc/current/routing.html#generating-urls-in-commands
|
||||
#default_uri: http://localhost
|
||||
|
||||
when@prod:
|
||||
framework:
|
||||
router:
|
||||
strict_requirements: null
|
|
@ -0,0 +1,3 @@
|
|||
sensio_framework_extra:
|
||||
router:
|
||||
annotations: false
|
|
@ -0,0 +1,13 @@
|
|||
framework:
|
||||
default_locale: en
|
||||
translator:
|
||||
default_path: '%kernel.project_dir%/translations'
|
||||
fallbacks:
|
||||
- en
|
||||
# providers:
|
||||
# crowdin:
|
||||
# dsn: '%env(CROWDIN_DSN)%'
|
||||
# loco:
|
||||
# dsn: '%env(LOCO_DSN)%'
|
||||
# lokalise:
|
||||
# dsn: '%env(LOKALISE_DSN)%'
|
|
@ -0,0 +1,6 @@
|
|||
twig:
|
||||
default_path: '%kernel.project_dir%/templates'
|
||||
|
||||
when@test:
|
||||
twig:
|
||||
strict_variables: true
|
|
@ -0,0 +1,49 @@
|
|||
webpack_encore:
|
||||
# The path where Encore is building the assets - i.e. Encore.setOutputPath()
|
||||
output_path: '%kernel.project_dir%/public/build'
|
||||
# If multiple builds are defined (as shown below), you can disable the default build:
|
||||
# output_path: false
|
||||
|
||||
# Set attributes that will be rendered on all script and link tags
|
||||
script_attributes:
|
||||
defer: true
|
||||
# Uncomment (also under link_attributes) if using Turbo Drive
|
||||
# https://turbo.hotwired.dev/handbook/drive#reloading-when-assets-change
|
||||
# 'data-turbo-track': reload
|
||||
# link_attributes:
|
||||
# Uncomment if using Turbo Drive
|
||||
# 'data-turbo-track': reload
|
||||
|
||||
# If using Encore.enableIntegrityHashes() and need the crossorigin attribute (default: false, or use 'anonymous' or 'use-credentials')
|
||||
# crossorigin: 'anonymous'
|
||||
|
||||
# Preload all rendered script and link tags automatically via the HTTP/2 Link header
|
||||
# preload: true
|
||||
|
||||
# Throw an exception if the entrypoints.json file is missing or an entry is missing from the data
|
||||
# strict_mode: false
|
||||
|
||||
# If you have multiple builds:
|
||||
# builds:
|
||||
# pass "frontend" as the 3rg arg to the Twig functions
|
||||
# {{ encore_entry_script_tags('entry1', null, 'frontend') }}
|
||||
|
||||
# frontend: '%kernel.project_dir%/public/frontend/build'
|
||||
|
||||
# Cache the entrypoints.json (rebuild Symfony's cache when entrypoints.json changes)
|
||||
# Put in config/packages/prod/webpack_encore.yaml
|
||||
# cache: true
|
||||
|
||||
framework:
|
||||
assets:
|
||||
json_manifest_path: '%kernel.project_dir%/public/build/manifest.json'
|
||||
|
||||
#when@prod:
|
||||
# webpack_encore:
|
||||
# # Cache the entrypoints.json (rebuild Symfony's cache when entrypoints.json changes)
|
||||
# # Available in version 1.2
|
||||
# cache: true
|
||||
|
||||
#when@test:
|
||||
# webpack_encore:
|
||||
# strict_mode: false
|
|
@ -0,0 +1,5 @@
|
|||
<?php
|
||||
|
||||
if (file_exists(dirname(__DIR__).'/var/cache/prod/App_KernelProdContainer.preload.php')) {
|
||||
require dirname(__DIR__).'/var/cache/prod/App_KernelProdContainer.preload.php';
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
controllers:
|
||||
resource: ../src/Controller/
|
||||
type: attribute
|
|
@ -0,0 +1,4 @@
|
|||
when@dev:
|
||||
_errors:
|
||||
resource: '@FrameworkBundle/Resources/config/routing/errors.xml'
|
||||
prefix: /_error
|
|
@ -0,0 +1,24 @@
|
|||
# This file is the entry point to configure your own services.
|
||||
# Files in the packages/ subdirectory configure your dependencies.
|
||||
|
||||
# Put parameters here that don't need to change on each machine where the app is deployed
|
||||
# https://symfony.com/doc/current/best_practices.html#use-parameters-for-application-configuration
|
||||
parameters:
|
||||
|
||||
services:
|
||||
# default configuration for services in *this* file
|
||||
_defaults:
|
||||
autowire: true # Automatically injects dependencies in your services.
|
||||
autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
|
||||
|
||||
# makes classes in src/ available to be used as services
|
||||
# this creates a service per class whose id is the fully-qualified class name
|
||||
App\:
|
||||
resource: '../src/'
|
||||
exclude:
|
||||
- '../src/DependencyInjection/'
|
||||
- '../src/Entity/'
|
||||
- '../src/Kernel.php'
|
||||
|
||||
# add more service definitions when explicit configuration is needed
|
||||
# please note that last definitions always *replace* previous ones
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"devDependencies": {
|
||||
"@hotwired/stimulus": "^3.0.0",
|
||||
"@symfony/stimulus-bridge": "^3.2.0",
|
||||
"@symfony/webpack-encore": "^3.0.0",
|
||||
"core-js": "^3.23.0",
|
||||
"regenerator-runtime": "^0.13.9",
|
||||
"webpack-notifier": "^1.15.0"
|
||||
},
|
||||
"license": "UNLICENSED",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev-server": "encore dev-server",
|
||||
"dev": "encore dev",
|
||||
"watch": "encore dev --watch",
|
||||
"build": "encore production --progress"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
<?php
|
||||
|
||||
use App\Kernel;
|
||||
|
||||
require_once dirname(__DIR__).'/vendor/autoload_runtime.php';
|
||||
|
||||
return function (array $context) {
|
||||
return new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']);
|
||||
};
|
|
@ -0,0 +1,231 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="19 122.5 1882 1674.9" enable-background="new 19 122.5 1882 1674.9" xml:space="preserve">
|
||||
<g>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M463.4,171.4c10.6-2.5,21.8,6.7,21.2,17.6c0.2,10.8-11,19.8-21.5,17.1 c-10.3-1.9-16.9-14.1-12.7-23.8C452.5,176.8,457.5,172.5,463.4,171.4z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M502.5,207.5c6.4-3.3,14.9,0.7,16.7,7.6 c1.9,6.1-2.1,13.3-8.3,14.8c-6.4,2-13.8-2.4-15-9C494.6,215.6,497.5,209.7,502.5,207.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M546.4,214.5c12-3.2,25.4,5.4,27.6,17.6c2.8,11.7-5.4,24.4-17.1,26.9 c-8.1,2-17.2-0.9-22.6-7.3c-5.9-6.6-7.3-16.8-3.3-24.7C533.8,220.7,539.7,216,546.4,214.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M615.3,250.4c8.9-1.8,18.5,2.3,23.4,9.9c5.7,8.3,4.8,20.2-1.9,27.6 c-5.8,6.9-15.9,9.6-24.4,6.7c-9.1-2.9-15.7-12-15.7-21.5C596.5,262.3,604.7,252.2,615.3,250.4z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M556.4,273.5c9.6-2.4,20.1,4.9,21.3,14.7c1.7,9.3-5.4,18.8-14.7,20.1 c-9.2,1.8-18.9-5.1-20.3-14.3C540.8,284.9,547.3,275.3,556.4,273.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M396.4,292.6c9.1-2.6,18.7,5.1,18.9,14.4c0.8,8.1-6,16.1-14.3,16.3 c-8,0.5-15.3-6.4-15.8-14.4C384.5,301.7,389.3,294.3,396.4,292.6z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M687.4,293.4c15.9-3.8,33.4,7.1,37,23c4.5,15.6-5.5,33.4-21.1,37.9 c-15,5.1-32.8-3.3-38.5-18c-5.7-13.1-0.9-29.5,10.8-37.7C679.1,296.1,683.1,294.3,687.4,293.4z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M627.3,306.1c10.5-2.8,21.9,6,21.7,16.9c0.6,10.8-10.3,20-20.9,17.8 c-9.5-1.5-16.4-11.5-14.3-20.9C615.1,313.3,620.7,307.6,627.3,306.1z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M767.4,332.6c9.1-1.3,18.7,0.7,26.5,5.5c12.2,7.4,19.9,21.7,19,36 c-0.4,17.4-13.6,33.3-30.5,37.1c-11.1,2.8-23.2,0.4-32.6-6.1c-8.7-6.1-14.8-15.7-16.5-26.2c-2-11,1.1-22.8,8.1-31.5 C747.7,339.4,757.2,333.9,767.4,332.6z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M698.4,367.5c11-2.7,22.9,5.6,24.3,16.8c1.8,10.3-5.5,20.9-15.8,22.9 c-10.3,2.5-21.7-4.6-24-15C680,381.5,687.5,369.5,698.4,367.5z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M643.4,371.5c6.9-2.1,14.8,3.3,15.2,10.5 c0.9,7.3-6.1,14.1-13.4,13c-6.3-0.6-11.3-6.7-10.6-13C635,377.1,638.7,372.7,643.4,371.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M856.4,381.7c13.9-2,28.5,1.7,39.9,10c11.2,8.1,19.2,20.5,21.7,34.1 c2.9,14.5-0.5,30.1-9.1,42.2c-7.2,10.2-17.9,17.8-29.8,21.2c-13.8,4-29,2.3-41.6-4.6c-12.8-7-22.7-19.3-26.6-33.3 c-4.5-15.6-1.6-33.1,7.8-46.4C827.4,392.3,841.4,383.7,856.4,381.7z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M547.3,386.1c8.2-2.5,17.3,3.6,18.8,11.9 c1.9,7.9-3.4,16.8-11.5,18.3c-7.9,1.9-16.3-4-17.9-11.9C534.7,396.9,539.5,388.1,547.3,386.1z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M723.3,419.2c7-3,15.8,2.3,16.3,9.9 c1,7.1-5.5,13.9-12.6,13.3c-6.7-0.2-12.2-6.7-11.3-13.4C716.2,424.6,719.2,420.7,723.3,419.2z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M769.4,426.5c14.4-4.1,30.7,5.1,34.8,19.5c4.9,14.4-3.9,31.4-18.4,35.9 c-13.4,4.9-29.7-2.1-35.5-15.1c-5.8-11.8-2.1-27.1,8.3-35C761.8,429.2,765.5,427.4,769.4,426.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M957.4,454.5c13-4.5,28.3,4.3,31.2,17.7c3.2,12-4.4,25.5-16.2,29.1 c-7.8,2.6-16.9,0.9-23.3-4.4c-7.3-5.9-10.6-16.1-8.1-25.2C943,463.7,949.5,456.9,957.4,454.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M576.4,472.5c8.9-3,19,4.2,19.5,13.5c1.1,7.9-5,16.1-13,16.8 c-7.3,1.1-14.6-4.2-16.4-11.3C564,484,568.7,474.9,576.4,472.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M640.4,496.4c8-2.7,17.1,2.9,19,11c2.2,7.6-2.3,16.6-10,18.8 c-7.6,2.6-16.4-2.3-18.7-9.8C627.6,508.5,632.2,498.7,640.4,496.4z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M836.4,497.4c6.8-3.3,15,3.1,14.3,10.4 c-0.1,7.2-8.9,12.4-15.1,8.5C828.3,512.5,828.7,500.5,836.4,497.4z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M712.3,499.1c9.1-2.7,19.4,2.8,22.8,11.6c2.8,6.9,1.6,15.4-3.5,20.9 c-5,5.9-13.9,7.9-21,4.9c-7.7-3.1-12.7-11.3-12.2-19.5C698.6,508.9,704.4,501.2,712.3,499.1z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M778.4,500.5c17-4.5,36.2,4.6,43.6,20.5c6,12.1,5,27.3-2.7,38.4 c-9.9,15.4-31.6,21.5-48.1,13.4c-15-6.6-24.4-23.6-22-39.8C751,517.5,763.2,503.9,778.4,500.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M894.3,501.3c13.7-2.4,28.3,0.7,39.9,8.5c12.4,8.2,21.1,21.7,23.6,36.3 c2.7,14.8-1.2,30.5-10.2,42.5c-7.9,10.7-19.9,18.2-33,20.8c-14.5,3.1-30.2-0.2-42.4-8.7c-11-7.5-18.9-19.1-22.1-31.9 c-3.3-12.9-1.6-27.1,4.7-38.9C862.6,514.9,877.7,504,894.3,501.3z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M674.4,516.3c5.6-2.8,12.9,1.1,14.1,7.1 c1.7,5.7-2.5,12.4-8.6,13c-5.2,0.7-10.4-3.2-11.3-8.4C667.6,523.4,670,518.3,674.4,516.3z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M990.4,517.6c11.9-3.7,25.7,3.4,29.7,15.1c2.8,7.4,1.7,16-2.9,22.5 c-4.7,6.8-13,10.9-21.3,10.5c-8.3-0.3-16.3-5.1-20.3-12.4c-3.5-6.1-4.1-13.8-1.7-20.4C976.6,525.6,982.9,519.7,990.4,517.6z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M600.4,535.6c8-3,17.4,2.4,19.4,10.5c2.7,8.4-3.2,18.5-12.1,19.6 c-7.8,1.4-15.6-4.5-17.1-12.2C589,546.2,593.2,537.9,600.4,535.6z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M716.5,550.6c7.7-2.1,15,6.6,12,13.9c-2,7-12,9.3-16.8,3.8 C706,563,708.7,552.1,716.5,550.6z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M677.4,552.5c8.1-2.4,17.1,3.5,18.7,11.6 c2.3,8.5-4.1,18.3-13.1,18.9c-7.9,1-15.5-5.5-16.5-13.3C665.2,562.3,670,554.3,677.4,552.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M996.4,575.7c22.1-4.1,46,3.1,62.1,18.8c14,13.2,22.1,32.3,22.1,51.5 c0.2,19.1-7.8,38-21.4,51.3c-10.9,10.9-25.5,18-40.8,20c-20.4,2.8-41.8-3.8-57.1-17.5c-12.4-11-20.8-26.4-23.2-42.8 c-2.8-17.5,1.4-35.9,11.3-50.6C960,590.3,977.4,578.9,996.4,575.7z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M726.4,578.4c9.4-3.1,20,2.8,23.3,11.9c3.4,8.4,0.3,19.1-7.6,23.9 c-6.4,4.2-15.3,3.7-21.3-0.9c-7-5.2-9.8-15.1-6.7-23.2C716.1,584.5,720.8,580,726.4,578.4z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M769.3,589.2c7.9-1.4,14.3,8,10.7,15 c-2.6,6.6-12.3,8-16.7,2.5C757.8,601,761.3,590,769.3,589.2z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M684.4,594.5c7-2.6,14.7,4.1,13.5,11.4 c-0.4,7.5-10.1,11.9-16,7.2C675.2,608.6,676.7,597,684.4,594.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M812.4,594.6c17.2-4,36.1,5.7,43.1,21.8c4.8,10.5,4.5,23.1-0.8,33.3 c-4.8,9.3-13.5,16.6-23.6,19.5c-10.6,3.1-22.4,1.4-31.7-4.7c-13.3-8.3-20.3-25.4-16.7-40.7C785.8,609.5,797.9,597.4,812.4,594.6z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M749.5,636.7c6.3-2.5,13.7,2.7,13.8,9.4 c0.5,5.4-3.8,10.7-9.3,11c-6.1,0.7-11.6-5-11.1-11C743,642,745.6,638,749.5,636.7z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M568.4,642.6c9.4-2.2,19.4,5.7,19.4,15.3c0.6,8.7-7.1,16.8-15.8,16.8 c-9,0.5-17.2-7.8-16.6-16.8C555.5,650.7,561.2,643.9,568.4,642.6z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M902.4,656.5c6.5-1.8,13.9-0.3,19.2,4c5,3.9,8.1,10.2,8.2,16.6 c0.3,8.4-5,16.7-12.7,20.1c-4.7,2.2-10.2,2.4-15.2,1.1c-8.8-2.5-15.4-11-15.5-20.2C885.9,668.2,893,658.8,902.4,656.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M855.4,677.6c7.7-2.4,16.3,3.1,18,10.8c2.3,7.9-3.3,17-11.5,18.2 c-8.2,1.6-16.4-5.4-16.8-13.7C844.4,686.3,848.9,679.4,855.4,677.6z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M804.3,679.2c5.7-2,12.8,1.2,14.5,7.1 c2,5.8-2.2,12.3-7.9,13.8c-5.8,1.8-12.8-1.6-14.3-7.6C795,687,798.8,680.8,804.3,679.2z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M656.4,694.4c9.4-3.3,20.2,2.4,23.6,11.6c3,7.2,1.3,16.2-4.4,21.6 c-5.5,5.6-14.6,7-21.5,3.3c-7.2-3.5-11.6-11.8-10.8-19.8C643.8,703.6,649.1,696.6,656.4,694.4z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1074.4,707.8c17.5-2.8,36.1,3.6,48.2,16.6c13.6,14,18.6,35.5,12.7,54 c-4.8,15.9-17.2,29.3-32.8,35.2c-15.7,6.2-34.3,4.5-48.6-4.4c-13.6-8.2-23.2-22.5-25.6-38.2c-2.9-17,3-35.2,15.2-47.4 C1051.8,715.1,1062.8,709.5,1074.4,707.8z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M915.4,710.7c17.3-3,35.8,7.6,41.8,24.1c4.7,12,2.9,26.3-4.8,36.6 c-8.8,12.3-25.2,18.4-39.9,14.8c-10.5-2.4-19.8-9.4-24.9-18.8c-5.9-10.6-6.4-24-1.2-34.9C891.7,721,902.9,712.5,915.4,710.7z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M742.4,717.5c9.4-2.6,19.6,3.6,22.6,12.7c3,8.3-0.1,18.4-7.6,23.2 c-6.3,4.2-15.1,4-21.2-0.5c-6.9-4.8-10-14.2-7.5-22.2C730.5,724.2,735.9,718.9,742.4,717.5z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M850.4,725.6c7.7-2.5,16.5,2.9,18.2,10.7 c2.2,7.7-3,16.8-11,18.1c-7.5,1.7-15.3-3.7-16.9-11.1C838.7,736.1,843.1,727.7,850.4,725.6z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M788.4,729.6c7.7-2.6,16.6,5,14.1,13 c-2,8.8-15,11.5-20.4,4.2C777.1,740.9,781.1,731.1,788.4,729.6z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M989.3,729.4c7.2-1.7,15.2,0.6,20.3,6c5.2,5.2,7.3,13.1,5.6,20.2 c-1.6,6.7-6.5,12.4-12.8,15c-6.7,2.8-14.8,1.9-20.7-2.3c-7.3-4.9-10.8-14.6-8.6-23.1C975,737.4,981.5,731,989.3,729.4z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M674.5,748.5c5.2-3.1,12.5,1.5,12,7.5 c0,5.9-7.2,9.9-12.2,6.7C668.8,759.9,668.9,751.1,674.5,748.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M816.3,753.2c9.8-1.9,20.5,1.9,26.9,9.6c8.9,10.2,8.7,26.9-0.5,36.8 c-8.6,10.2-24.7,12.6-35.9,5.4c-9.7-5.8-15.2-17.6-13.2-28.7C795.4,764.9,804.9,755.2,816.3,753.2z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M582.3,764.3c7.1-1.6,14.7,4.3,14.6,11.7c0.5,7-6,13.2-12.9,12.6 c-7.1-0.2-12.9-7.6-11.3-14.6C573.5,769.2,577.5,765.1,582.3,764.3z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M724.3,775.3c12.1-2.5,25,6.6,26.8,18.8c2.4,11.9-6.3,24.5-18.2,26.6 c-9.7,2.1-20.2-3-24.8-11.7c-3.3-6.1-3.7-13.6-1-20C710,781.9,716.7,776.5,724.3,775.3z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M984.4,785.6c17.6-3,36.2,8.2,41.9,25.1c6.4,16.8-1,37.2-16.6,46.1 c-10.1,6.1-23.1,7.1-34,2.6c-7.4-3-13.8-8.2-18.1-15c-7-10.7-8-24.9-2.7-36.5C960.1,796.1,971.6,787.4,984.4,785.6z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M768.4,800.4c6.7-2,14.5,3.4,14.2,10.6 c0.1,8.1-9.6,13.4-16.6,10c-5.3-2.3-8-9.1-5.3-14.3C762.1,803.5,765.1,801.2,768.4,800.4z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M508.4,802.7c10.5-2.2,21.5,6.6,21.5,17.3c0.7,9.6-7.4,18.6-16.9,19.1 c-9.5,1-18.8-6.7-19.7-16.2C492,813.5,499.1,804.1,508.4,802.7z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1162.4,803.6c17.7-2.9,36,10,39.3,27.6c4,17-6.9,35.8-23.6,40.8 c-16,5.6-35.1-2.5-42.4-17.7c-6.9-13.2-4-30.6,6.8-40.9C1147.8,808.1,1154.9,804.6,1162.4,803.6z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M888.4,807.6c9.9-2.2,20.6-0.5,29.3,4.7c11.9,6.8,19.9,19.9,20.5,33.6 c1,16.1-8.6,32.2-23.2,39c-10.2,5-22.6,5.5-33.1,1.3c-10.9-4.3-19.8-13.4-23.6-24.4c-3.6-9.8-3.2-21,1.1-30.6 C864.5,819.3,875.6,810.2,888.4,807.6z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M799.4,829.7c9.6-3.2,20.5,3,23.5,12.5c2.5,7.1,0.7,15.7-4.8,20.9 c-5,5-12.9,6.7-19.5,4.1c-8.4-3.1-13.9-12.4-12.6-21.2C786.8,838.6,792.2,831.8,799.4,829.7z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1066.4,836.5c17.7-3.4,36.9,2.8,49.3,15.9c12.7,12.8,18.2,32.3,14.3,49.9 c-3.4,16.3-14.8,30.8-29.9,37.9c-15.2,7.5-33.8,7.3-48.8-0.4c-14.8-7.4-25.9-21.8-29.1-38.1c-3.4-15.8,0.8-32.9,11-45.4 C1041.4,845.9,1053.4,838.7,1066.4,836.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M583.4,847.5c6.8-2.6,15,2.3,16,9.5c1.6,7.4-5,14.9-12.4,14.4 c-6.8-0.1-12.6-6.5-11.9-13.3C575.5,853.4,578.8,849,583.4,847.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M683.4,865.7c9.7-2.3,20.4,3.9,23.3,13.5c2.4,7.1,0.4,15.4-5,20.6 c-6,6.2-16.3,7.7-23.8,3.4c-6.8-3.6-11.1-11.4-10.5-19.1C667.8,875.3,674.8,867.3,683.4,865.7z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M982.4,881.6c7.1-1.4,14.7,1.1,19.6,6.3c5.8,6,7.6,15.5,4.3,23.2 c-3.6,9.1-13.8,14.8-23.3,13.1c-10.3-1.4-18.5-11-18.4-21.3C964.4,892.8,972.4,883.3,982.4,881.6z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M837.3,882.3c5.4-2.3,11.9,2.9,10.9,8.7 c-0.5,6.2-8.9,9.4-13.4,5.2C830.1,892.4,831.6,884,837.3,882.3z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1188.4,889.6c18.3-2.1,37.3,5.8,48.7,20.3c10.9,13.3,14.9,32,10.3,48.6 c-4,15.1-14.7,28.3-28.8,35.1c-14.8,7.4-32.9,7.6-47.8,0.5c-15.8-7.2-27.6-22.4-30.7-39.4c-3.5-17.4,2.2-36.3,14.7-48.9 C1163.7,896.7,1175.8,890.9,1188.4,889.6z"/>
|
||||
<path fill="#020202" stroke="#020202" stroke-width="9.375000e-002" d="M1636.5,896.4c5.8-3.4,13.9,1.9,13.1,8.6 c-0.1,6.5-8.3,10.8-13.7,7.1C1629.9,908.9,1630.3,899.2,1636.5,896.4z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1674.3,896.6c11.1-2.4,23.2,4.6,26.6,15.4c2.6,7.4,1.1,16-3.8,22.1 c-4.3,5.5-11.2,8.8-18.1,8.8c-8.7,0.2-17.3-5-21.1-12.8c-3.7-7.2-3.3-16.3,1.1-23.1C1662.4,901.6,1668.1,897.8,1674.3,896.6z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M765.4,899.5c7.8-3.3,17.5,3.1,17.5,11.6c0.6,7.8-6.9,14.7-14.6,13.5 c-6.6-0.7-11.9-7-11.3-13.6C757.1,905.9,760.7,901.2,765.4,899.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M916.4,905.8c16.1-3.7,33.6,7.3,37.4,23.4c4.3,15.5-5.1,33.2-20.4,38.1 c-15.3,5.9-34-2.5-40.1-17.7c-6-13.4-1.2-30.3,10.9-38.5C907.8,908.5,912,906.7,916.4,905.8z"/>
|
||||
<path fill="#020202" stroke="#020202" stroke-width="9.375000e-002" d="M1733.4,906.4c4.9-2.2,10.9,2.2,10.4,7.5 c-0.1,5.9-7.8,9.4-12.3,5.5C1726.9,916.2,1728.1,908.2,1733.4,906.4z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1577.3,907.3c7.3-2.4,15.7,3.2,16.3,10.8 c1.1,7.6-6,14.9-13.6,14.1c-7-0.4-12.7-7.2-11.7-14.1C1568.8,913.1,1572.5,908.7,1577.3,907.3z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1766.4,907.3c3.7-1.7,8.3,1.6,8,5.7 c0.1,4.6-6.2,7.4-9.6,4.3C1761.3,914.7,1762.3,908.6,1766.4,907.3z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M868.5,908.7c5.6-2.1,11.9,3.4,10.5,9.3 c-0.8,6.1-9.2,8.9-13.5,4.5C861,918.5,862.7,910.3,868.5,908.7z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M819.4,911.5c5.6-2.1,12.4,1.8,13.5,7.7 c1.4,5.8-3.1,12-9,12.5c-5.4,0.8-10.9-3.5-11.5-8.9C811.7,917.9,814.8,913,819.4,911.5z"/>
|
||||
<path fill="#020202" stroke="#020202" stroke-width="9.375000e-002" d="M1710.4,914.2c3-1.9,7.5,0.3,7.8,3.9c0.8,4-4.1,7.5-7.7,5.4 C1707,921.8,1706.7,916,1710.4,914.2z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1618.4,917.7c8.2-2.3,17.5,0.4,23.2,6.7c5.7,5.9,7.8,14.9,5.6,22.7 c-2.4,8.4-9.7,15.2-18.4,16.8c-8.5,1.7-17.8-1.8-23-8.7c-4.9-6.2-6.4-14.8-3.8-22.3C1604.5,925.5,1610.8,919.6,1618.4,917.7z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1808.4,917.4c5.7-2.9,13.1,2.1,12.4,8.5 c-0.1,6.8-9,10.8-14.1,6.4C1801.6,928.6,1802.6,919.8,1808.4,917.4z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1783.4,918.4c6.8-3,15.1,3.2,14.2,10.6 c-0.2,7.7-10.1,12.5-16.3,7.9C1774.3,932.5,1775.7,920.9,1783.4,918.4z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1752.4,921.5c7.1-2.1,14.8,4.1,14.4,11.5 c0.1,7.3-7.7,13.1-14.7,11c-6.3-1.5-10.2-8.7-8-14.8C1745.3,925.5,1748.6,922.4,1752.4,921.5z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1832.5,924.7c7.3-2.1,15.2,4.8,13.9,12.3 c-0.6,7-8.4,11.9-14.9,9.4c-6.5-2-9.7-10.3-6.2-16.1C1826.8,927.5,1829.4,925.4,1832.5,924.7z"/>
|
||||
<path fill="#020202" stroke="#020202" stroke-width="9.375000e-002" d="M1724.4,928.4c6.2-3.3,14.3,2.6,12.9,9.5 c-0.7,6.8-9.8,10.1-14.8,5.5C1717.6,939.6,1718.6,930.8,1724.4,928.4z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1544.4,929.6c15.5-2.5,31.8,6.2,38.5,20.4c6.2,12.3,4.5,28-4.1,38.8 c-9.9,13.1-28.9,18-43.9,11.2c-14.6-6.1-24.1-22.3-22-38.1C1514.6,945.7,1528.2,931.7,1544.4,929.6z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M847.4,937.6c12.5-3.7,27.1,2.2,33.4,13.7c5.9,9.9,5,23.3-2.1,32.5 c-7.1,9.6-20.5,14-31.9,10.4c-8.2-2.4-15.2-8.6-18.5-16.4c-3.3-7.4-3.3-16,0-23.4C831.7,946.2,838.9,939.9,847.4,937.6z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M794.3,938.2c7.7-2.6,16.7,3.6,16.7,11.8 c0.7,7.2-5.8,13.9-13,13.6c-6.8,0.1-13-5.9-12.9-12.8C784.9,945.2,788.8,939.7,794.3,938.2z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M999.4,939.6c16.9-4,35.6,3.1,45.8,17.1c10.6,13.9,11.8,34.2,2.9,49.3 c-8.8,15.8-27.7,25-45.6,22.2c-17.4-2.4-32.7-15.8-37-32.8c-4.4-15.4,0.5-32.8,11.9-43.9C983.5,945.6,991.2,941.4,999.4,939.6z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M749.4,940.4c6.9-2.9,15.5,1.7,17.1,9c2.1,7.1-3.2,15.1-10.5,16 c-7,1.3-14.4-4.3-14.9-11.5C740.3,948.3,744,942.4,749.4,940.4z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1805.4,940.5c7.4-3.1,16.6,1.5,18.7,9.2 c2.4,7.2-2.2,15.6-9.5,17.7c-7.1,2.4-15.5-2.1-17.6-9.2C1794.5,951.2,1798.5,942.9,1805.4,940.5z"/>
|
||||
<path fill="#020202" stroke="#020202" stroke-width="9.375000e-002" d="M1707.5,942.6c3.4-1.4,7.5,1.7,7.1,5.4 c-0.1,4-5.3,6.4-8.4,3.9C1702.8,949.6,1703.7,943.8,1707.5,942.6z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1775.4,945.5c7.4-2.8,15.6,4.8,13.5,12.3 c-1.4,7.5-11.7,10.7-17.1,5.4C1765.7,958.4,1767.9,947.5,1775.4,945.5z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1685.4,948.3c5.7-2.5,12.7,2.4,12.3,8.6 c0.2,6.8-8.5,11.4-14,7.4C1677.6,960.7,1678.7,950.5,1685.4,948.3z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1655.4,950.4c6.1-3.2,14,2.8,12.7,9.6 c-0.7,6.7-9.7,10.2-14.7,5.6C1648.3,961.7,1649.5,952.8,1655.4,950.4z"/>
|
||||
<path fill="#020202" stroke="#020202" stroke-width="9.375000e-002" d="M1754.4,951.4c4.5-1.2,9,3.8,7.1,8.1 c-1.3,4.2-7.3,5.4-10.2,2.1C1748,958.5,1749.9,952.2,1754.4,951.4z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1729.5,952.5c5.8-3.1,13.4,2,12.9,8.5 c0,6.7-8.3,11.1-13.8,7.3C1722.6,965,1723.1,955.2,1729.5,952.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1480.4,954.7c7-1.6,14.8,1,19.3,6.5c4.8,5.5,6,13.8,3,20.5 c-3.3,8-12.3,13-20.8,11.7c-9.1-1.1-16.6-9.3-16.9-18.4C1464.4,965.6,1471.3,956.6,1480.4,954.7z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1707.3,962.2c5.3-3,12.5,1.8,11.8,7.8 c0,6-7.7,9.8-12.6,6.4C1701.3,973.3,1701.8,964.7,1707.3,962.2z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1110.4,963.5c6.6-1.3,13.7,0.9,18.4,5.7c6.1,6.1,7.6,16.3,3.3,23.8 c-4.2,8-14.1,12.3-22.9,9.9c-8.9-2.1-15.5-10.8-15.2-19.9C1094,973.8,1101.2,965.1,1110.4,963.5z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1639.4,970.5c5.8-1.9,12.3,3.4,11.5,9.5 c-0.2,6.8-9.2,10.8-14.4,6.4C1630.6,982.4,1632.5,972.2,1639.4,970.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1675.4,970.7c10.1-2.8,21.4,5,22.4,15.4c1.5,10-6.7,20-16.7,20.5 c-9.2,0.9-18.3-6.3-19.4-15.5C1660.1,982,1666.4,972.6,1675.4,970.7z"/>
|
||||
<path fill="#020202" stroke="#020202" stroke-width="9.375000e-002" d="M1750.4,970.2c3.2-1.1,6.8,2.3,5.5,5.5 c-0.8,3.2-5.3,4.2-7.4,1.8C1746.2,975.3,1747.3,971,1750.4,970.2z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1604.4,972.3c7.5-3.2,17,1.8,18.6,9.9c2,7.4-3.5,15.7-11,16.8 c-7.2,1.5-14.9-3.8-16.2-11C1594.4,981.5,1598.2,974.6,1604.4,972.3z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1768.5,972.5c4.9-2.2,11,2,10.5,7.4c0,5.7-7.3,9.3-11.8,5.9 C1762.2,982.8,1763,974.5,1768.5,972.5z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1789.4,972.3c5.1-2.9,12,1.9,11,7.6 c-0.4,5.5-7.5,8.7-11.9,5.4C1783.9,982.4,1784.5,974.7,1789.4,972.3z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1731.4,978.4c3.9-2.1,9.1,1.2,8.8,5.6 c0.2,4.9-6.3,7.9-10,4.7C1726.7,986.2,1727.4,980,1731.4,978.4z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1274.4,980.5c10.1-3.6,22.4,1.7,26.6,11.5c3.7,7.8,2,17.8-4,24 c-5.6,6-14.9,8.3-22.6,5.6c-8.7-2.8-14.9-11.5-14.7-20.6C1259.6,992,1265.8,983.3,1274.4,980.5z"/>
|
||||
<path fill="#020202" stroke="#020202" stroke-width="9.375000e-002" d="M1712.4,986.2c3.7-1.7,8.4,1.7,8,5.7c0,4.6-6.1,7.3-9.5,4.3 C1707.3,993.7,1708.2,987.6,1712.4,986.2z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1750.4,986.5c6.8-3,15.3,2.1,15.8,9.5 c1,6.9-5.3,13.5-12.2,12.9c-6.7-0.2-12.2-7.1-10.8-13.7C1743.9,991.3,1746.8,988,1750.4,986.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M910.4,987.6c17.4-2.8,35.5,9.8,39,27.1c4.3,16.9-6.2,35.7-22.7,41.1 c-14.2,5.2-31.3-0.1-40.1-12.4c-7.8-10.4-9.1-25.2-3-36.7C888.7,996.4,899,989,910.4,987.6z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1450.4,988.5c9-2.1,18.7,5.2,19.2,14.5c1,8.9-6.6,17.4-15.6,17.5 c-8.6,0.5-16.6-6.9-16.7-15.5C1436.8,997.2,1442.8,989.8,1450.4,988.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1636.3,996.2c12.7-2.7,26.1,6.9,27.7,19.8c2.1,12.2-6.9,24.8-19.1,26.8 c-9.7,2-20.3-3-25-11.7c-3.8-6.8-4-15.6-0.3-22.5C1622.8,1002.2,1629.2,997.5,1636.3,996.2z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1505.4,999.6c9.2-2,18.9,6,18.5,15.4c0.4,8.5-7.5,16.2-16,15.8 c-8.4,0.1-15.8-7.5-15.5-15.8C1492.4,1007.6,1498.2,1000.8,1505.4,999.6z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1726.4,1000.5c5.4-2.1,12,1.8,12.7,7.6 c1.2,6.1-4.9,12.2-11,11c-5-0.7-8.9-5.9-8-11C1720.6,1004.7,1723.1,1001.6,1726.4,1000.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1578.4,1002.6c6.4-2.3,14-0.7,18.8,4.1c5.4,5.1,7,13.6,4,20.4 c-2.9,6.6-9.9,11.2-17.2,10.8c-8.5,0-16.3-6.9-17.5-15.3C1565,1014.3,1570.3,1005.3,1578.4,1002.6z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1702.4,1004.4c5.7-2.6,12.6,3.5,10.9,9.5 c-1.1,5.9-9.2,8.4-13.5,4.2C1695.3,1014.3,1696.9,1006.2,1702.4,1004.4z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1338.3,1007.2c5.3-1.1,10.9,0,15.3,3.1c6.2,4.2,9.5,12.1,8.1,19.4 c-0.9,5.4-4.2,10.4-8.8,13.3c-6.4,4.2-15.3,4.1-21.6-0.3c-6.8-4.5-10.2-13.4-8-21.2C1325.1,1014.4,1331.1,1008.6,1338.3,1007.2z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1213.4,1010.6c5.4-1.6,11.4-1,16.3,1.6c6.9,3.5,11.4,11,11.5,18.8 c0.1,6.6-2.9,13.1-8.1,17.2c-6.3,5.2-15.7,6.2-23,2.7c-7.5-3.5-12.5-11.6-12.3-19.9C1197.9,1021.8,1204.5,1013,1213.4,1010.6z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1416.5,1010.6c8.2-2.4,16.2,6.9,12.8,14.7 c-2.7,7.9-14.5,9.5-19.2,2.6C1405.3,1021.9,1409,1012.1,1416.5,1010.6z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1157.4,1015.4c7.1-2.2,15.1,3.3,15.7,10.7 c1,7.3-5.6,14.4-13,13.8c-7.3-0.1-13.2-7.5-11.7-14.6C1149.1,1020.6,1152.8,1016.6,1157.4,1015.4z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1678.5,1015.6c6.5-2.9,14.1,4.1,11.9,10.8 c-1.5,6.4-10.4,8.9-14.9,4.2C1670.6,1026.4,1672.4,1017.6,1678.5,1015.6z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M658.4,1016.4c7.5-2.4,15.4,5.5,13,13 c-1.6,7.6-12.3,10.5-17.6,4.9C647.8,1029,650.7,1018.1,658.4,1016.4z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1079.3,1022.3c16.8-3.6,35.2,5.5,42.5,21c7.6,14.8,4.2,34.3-8.1,45.5 c-10.1,9.8-25.8,13.3-39.2,8.8c-15.8-5-27.2-21-26.7-37.6C1047.8,1042,1061.7,1025.4,1079.3,1022.3z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1379.4,1024.5c6.1-2.3,13.5,2.2,14.3,8.7 c1.4,6.7-4.9,13.6-11.7,12.7c-7-0.2-12.1-8.1-9.6-14.5C1373.5,1028.2,1376.2,1025.6,1379.4,1024.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1463.4,1025.6c14.1-2.4,28.7,8.3,30.7,22.4c2.8,14.2-7.9,29-22.1,31.1 c-14.4,2.9-29.6-8-31.5-22.5C1437.8,1042.2,1448.9,1027.3,1463.4,1025.6z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1532.4,1029.6c15.5-4.3,33.1,3.1,41,17c6.8,11.1,6.8,25.9,0.3,37.1 c-6.9,12.4-21.5,20-35.7,18.4c-13.3-1.2-25.5-10.2-30.5-22.6c-5.5-12.9-2.7-28.8,6.9-39.1 C1519.2,1035.2,1525.5,1031.3,1532.4,1029.6z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M576.4,1031.5c8.5-3.2,18.8,2.7,20.5,11.6c2.2,8.5-4.2,17.9-12.8,19.1 c-8,1.5-16.6-4.2-18.1-12.2C564,1042.3,568.9,1033.8,576.4,1031.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1284.4,1037.2c17.3-2.4,35.5,4.2,47.3,17.1c11.9,12.6,17.2,31,13.8,48 c-3.2,16.8-14.6,31.7-30.1,39c-14.8,7.3-32.9,7.4-47.7,0.1c-15.4-7.3-27-22.1-30.3-38.8c-3.4-16.4,1.3-34.3,12.4-46.9 C1258.5,1045.6,1271.1,1038.9,1284.4,1037.2z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1603.4,1042.5c9-3.4,19.9,1.9,23,10.9c3.6,9-1.5,20.2-10.7,23.3 c-9.1,3.7-20.5-1.5-23.6-10.9C1588.6,1056.7,1594.1,1045.4,1603.4,1042.5z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1412.3,1046.2c7-2.7,15.5,2.5,16.4,9.9 c1.2,6.7-4,13.5-10.7,14.2c-6.8,1.1-13.7-4.5-14.1-11.4C1403.4,1053.5,1407.1,1047.9,1412.3,1046.2z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M792.5,1051.6c5.8-2.1,12.3,4.1,10.3,10 c-1.4,5.9-9.8,8.1-13.8,3.5C784.7,1061.1,786.8,1053.1,792.5,1051.6z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M752.5,1052.5c6.1-1.7,12.1,5.4,9.3,11.1 c-2.1,5.7-10.8,6.7-14.1,1.6C744.2,1060.9,746.9,1053.5,752.5,1052.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1005.4,1052.7c10.8-2.2,22.3,5.3,24.8,15.9c2.4,8.7-1.5,18.6-9.1,23.5 c-7.5,5.1-18.1,4.7-25.2-1c-7.3-5.4-10.3-15.8-7.2-24.3C991.3,1059.5,997.9,1053.9,1005.4,1052.7z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1372.4,1058.7c10.9-3,23.1,4.1,26,14.9c3.5,10.8-3.2,23.4-14,26.7 c-11.3,4-24.8-3.2-27.7-14.9C1353.2,1074.1,1360.9,1061.2,1372.4,1058.7z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M836.4,1060.3c5.7-2.3,12.2,3.6,10.6,9.5 c-1,5.9-8.9,8.5-13.3,4.5C828.8,1070.5,830.5,1061.9,836.4,1060.3z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1170.4,1060.7c18.2-3,37.5,6.3,46.6,22.2c9.3,15.4,8.2,36.2-2.6,50.5 c-10.4,14.7-30,21.9-47.5,17.7c-17.2-3.8-31.4-18.2-34.7-35.5c-3.6-16.3,2.7-34.3,15.6-44.8 C1154.3,1065.5,1162.2,1062,1170.4,1060.7z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M888.5,1061.6c5.4-2.7,12.4,2.3,11.4,8.3 c-0.2,6.1-8.1,9.6-12.8,5.9C881.9,1072.6,882.8,1063.8,888.5,1061.6z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M938.3,1065.3c18.2-2.8,37.4,7.1,45.9,23.4c8.4,15.4,6.6,35.5-4.5,49 c-10.6,13.7-29.6,20.2-46.3,15.7c-16.2-3.9-29.5-17.5-32.9-33.8c-3.8-16,2.3-33.7,14.9-44.2C921.9,1069.9,930,1066.4,938.3,1065.3z "/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M811.3,1077.3c6.8-1.7,14.1,3.7,14.2,10.7 c0.6,7.4-7.2,13.8-14.3,11.7c-6.3-1.3-10.4-8.6-8.3-14.6C804.1,1081.2,807.4,1078.1,811.3,1077.3z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M864.5,1080.7c7.8-2.5,16.7,4.1,16.5,12.3c0.4,8-7.9,14.9-15.7,12.8 c-6.9-1.3-11.7-8.8-9.9-15.6C856.3,1085.7,859.9,1081.8,864.5,1080.7z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M776.3,1082.1c5.5-2.7,12.5,2.6,11.3,8.7 c-0.5,6-8.2,9.2-12.9,5.6C769.6,1093,770.6,1084.3,776.3,1082.1z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1421.3,1082.3c9.6-3.1,20.9,2.5,24.4,11.9c3,7.4,1.2,16.4-4.6,21.9 c-5.5,5.6-14.5,7.4-21.7,4.4c-7.4-2.9-12.7-10.5-12.7-18.5C1406.5,1093.2,1412.8,1084.6,1421.3,1082.3z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M638.4,1083.5c9.8-3,21.1,3,24.4,12.7c2.6,7.1,0.7,15.7-4.7,21 c-5.8,6-15.6,7.8-23.1,4c-7.5-3.5-12.2-11.9-11.3-20.1C624.4,1092.8,630.5,1085.5,638.4,1083.5z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M458.3,1085.2c6.7-2.7,15,1.9,16.2,9 c1.9,7.5-4.9,15.4-12.5,14.7c-7.6,0.1-13.5-8.2-11.3-15.4C451.6,1089.8,454.6,1086.6,458.3,1085.2z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1588.4,1085.7c8.5-2.5,18.1,3.7,19.4,12.4c1.7,8.1-4.2,16.8-12.3,18.3 c-7.9,1.8-16.6-3.6-18.4-11.6C1574.8,1096.7,1580.3,1087.6,1588.4,1085.7z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1476.4,1087.5c12.7-3.3,27,4.2,31.5,16.5c3.1,7.9,2.3,17.3-2.4,24.5 c-4.4,7-12.2,11.7-20.5,12.4c-10.5,1.1-21.2-4.6-26.2-13.9c-5-8.8-4.4-20.4,1.5-28.7C1464.1,1093,1469.9,1089,1476.4,1087.5z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M562.3,1097.3c7.4-1.5,14.9,5.2,14.2,12.8 c-0.2,7.5-8.3,13.4-15.5,11.2c-7.1-1.7-11.2-10.3-8-16.9C554.8,1100.6,558.3,1097.9,562.3,1097.3z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1045.4,1107.8c20.3-3.1,41.5,1.2,59,11.8c13.7,8.2,25.2,20.2,32.7,34.4 c8.8,16.3,12.2,35.5,9.8,53.8c-2.5,18.7-11.1,36.5-24.2,50c-12.2,12.8-28.4,21.8-45.7,25.4c-16.9,3.7-35,2.2-51.1-4.1 c-18-7-33.6-20-43.6-36.4c-9.2-14.8-13.7-32.3-13.1-49.7c0.6-19.7,8-39,20.6-54C1003.7,1122.1,1023.9,1110.8,1045.4,1107.8z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1385.3,1110.3c9.7-1.7,19.5,6.9,19.1,16.8c0.2,9.2-8.3,17.2-17.4,16.6 c-9.4-0.1-17.5-9.3-16.1-18.6C1371.7,1117.6,1377.9,1111.1,1385.3,1110.3z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M794.5,1111.5c5.7-2.5,12.5,3.1,11,9.1 c-0.9,6.2-9.3,9-13.7,4.5C787.4,1121.4,788.9,1113.4,794.5,1111.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1542.4,1112.5c17.5-4.3,36.9,6.4,42.7,23.4c6,15.6-0.4,34.7-14.5,43.6 c-11,7.3-26,8-37.6,1.6c-12.9-6.7-20.9-21.6-19.3-36.1C1514.9,1129.5,1527.1,1115.7,1542.4,1112.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M828.4,1113.6c12.3-3.7,26.2,4.9,28.6,17.5c3,12.4-6.3,26.1-19,27.6 c-12.3,2.3-25.2-7.3-26.5-19.8C809.7,1127.8,817.5,1116.3,828.4,1113.6z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M875.5,1122.5c5.2-3.2,12.6,1.4,12.2,7.4 c0.1,6-7.3,10.1-12.4,6.8C869.9,1133.9,870,1125.2,875.5,1122.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1423.3,1137.4c17.8-3.8,37.1,7.9,42.1,25.3c5.6,16.7-2.9,36.4-18.7,43.9 c-15,7.9-35.1,3.5-45.4-10c-9.8-11.8-10.8-29.9-2.4-42.8C1404.3,1145.4,1413.3,1139.2,1423.3,1137.4z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1349.4,1138.5c6.1-2.7,14,0.6,16.3,6.9 c3,6.8-1.6,15.4-8.9,16.8c-7.1,1.8-14.8-3.9-15.1-11.2C1341.2,1145.7,1344.6,1140.4,1349.4,1138.5z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M719.3,1139.3c7.3-2.4,15.8,3.1,16.5,10.8 c1.3,7.8-5.9,15.5-13.7,14.7c-7.3-0.3-13.2-7.5-12-14.7C710.7,1145.1,714.5,1140.7,719.3,1139.3z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1484.4,1151.4c8-2.9,17.7,1.8,20.3,9.8c3.2,8-1.5,17.9-9.7,20.7 c-8.2,3.2-18.4-1.8-20.8-10.3C1471.3,1163.6,1476.3,1154,1484.4,1151.4z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1236.4,1156.5c7.2-1.7,15.1-0.3,21.2,4c6.5,4.3,10.7,11.8,11.4,19.5 c1,10.2-4.6,20.6-13.5,25.5c-9.5,5.4-22.3,4-30.4-3.4c-7.3-6.3-10.6-16.9-8.1-26.2C1219.1,1166.4,1226.9,1158.6,1236.4,1156.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M889.3,1159.3c7.9-2.6,16.8,4.3,16.5,12.5c0.2,7.2-6.6,13.6-13.8,12.9 c-7.3-0.2-13.3-7.4-12.1-14.6C880.6,1165.1,884.5,1160.7,889.3,1159.3z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1303.4,1159.4c7.2-2.8,15.5,3.9,14.5,11.5 c-0.4,8.2-11.1,13.1-17.5,7.9C1293.1,1174,1295.1,1161.7,1303.4,1159.4z"/>
|
||||
<path fill="#020202" stroke="#020202" stroke-width="9.375000e-002" d="M854.4,1162.4c5.8-2.8,12.9,3.1,11.2,9.3 c-1,5.7-8.6,8.5-13.1,4.7C847.6,1172.9,848.8,1164.5,854.4,1162.4z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1178.4,1169.6c6.9-1.5,14.4,0.6,19.5,5.6c6.1,5.7,8.4,15.2,5.4,23.1 c-3,8.7-12.1,14.7-21.3,14.2c-10.8-0.2-20.5-9.6-20.8-20.5C1160.4,1181.6,1168.2,1171.5,1178.4,1169.6z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1367.4,1173.6c9.9-2.2,20.2,6.3,19.9,16.4c0.4,9.6-8.8,17.9-18.3,16.8 c-9.5-0.6-17-10.3-15-19.7C1355.1,1180.4,1360.7,1174.8,1367.4,1173.6z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M929.3,1182.3c7.7-2.8,16.8,3.5,16.9,11.7 c0.6,7.3-5.9,14.1-13.2,13.7c-6.8,0-12.8-6-12.7-12.7C920.1,1189.3,924,1184,929.3,1182.3z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1509.5,1183.5c5.2-2.8,12.4-0.1,14.5,5.4 c2.4,5.3-0.5,12.1-6,14.1c-5.1,2.1-11.4-0.5-13.6-5.5C1502,1192.4,1504.4,1185.8,1509.5,1183.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1302.5,1191.7c18.7-3.6,38.8,6.7,47,23.8c8.2,15.8,5.3,36.3-6.7,49.3 c-12.2,13.9-33.6,18.5-50.4,10.9c-17.2-7.2-28.4-26.1-26.3-44.7C1267.7,1211.7,1283.4,1194.7,1302.5,1191.7z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1541.4,1195.5c8.5-3,18.8,2.7,20.7,11.6c2.7,9.5-5.3,20-15.1,19.9 c-8.5,0.6-16.3-6.6-16.7-15C1529.7,1204.8,1534.5,1197.7,1541.4,1195.5z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M895.4,1198.3c5.2-2.9,12.3,1.7,11.8,7.6 c0.1,6.5-8.6,10.5-13.4,6.1C889.3,1208.6,890.2,1200.7,895.4,1198.3z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1473.3,1205.2c16.2-2.9,33.5,2.8,44.9,14.6c13.4,13.4,18.2,34.6,11.8,52.4 c-5.8,17.1-21.3,30.5-39.2,33.5c-17.9,3.4-37.2-3.8-48.6-17.9c-11.6-14-14.8-34.4-7.8-51.2 C1440.8,1220.2,1456.1,1207.9,1473.3,1205.2z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1388.4,1214.5c9.9-1.6,20.4,2.6,26.7,10.4c8.3,10.1,8.3,25.9-0.2,35.9 c-8.3,10.5-24.2,13.6-35.8,7c-10.7-5.6-16.9-18.5-14.4-30.4C1366.7,1225.8,1376.7,1216.2,1388.4,1214.5z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M949.5,1215.5c5.8-2,12.2,4.2,10.2,10.1 c-1.4,5.9-9.7,8.1-13.8,3.5C941.5,1225.1,943.7,1216.9,949.5,1215.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1193.4,1225.5c16.9-3.4,35,0.9,48.7,11.4c12.9,9.7,21.6,24.8,23.6,40.9 c2.6,18.6-4.3,38.1-17.6,51.2c-12,12-29.1,18.5-46,17.6c-18-0.8-35.3-10-46-24.5c-11.5-15.1-15.2-35.7-9.7-53.8 C1152.4,1246.7,1171.3,1229.4,1193.4,1225.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M795.3,1235.1c11.3-3.5,24.3,5.2,25.4,17c1.6,10.5-6.5,21.1-17,22.4 c-10.2,1.8-20.8-5.5-22.8-15.6C778.4,1248.8,785.3,1237.6,795.3,1235.1z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M477.4,1242.6c9.5-2.1,19.8,4.9,21.4,14.5c2.4,10.4-6.2,21.3-16.8,21.7 c-9.2,0.8-18.2-6.5-19.2-15.7C461.2,1253.7,468.1,1244.1,477.4,1242.6z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M622.3,1249.4c8.6-2.5,18.4,2.3,21.6,10.6c2.8,6.4,1.3,14.4-3.5,19.4 c-4.7,5.1-12.4,7.1-18.9,4.9c-7.1-2.1-12.4-9-12.7-16.5C608.3,1259.6,614.2,1251.4,622.3,1249.4z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M943.4,1254.6c19.3-3,39.2,11,43.1,30.1c4.5,18-5.9,38.1-23.1,44.9 c-14.9,6.4-33.4,2.3-44.1-9.9c-11.7-12.5-13.4-32.9-4-47.2C921.5,1262.7,932,1256,943.4,1254.6z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1407.4,1279.6c11-3.7,23.8,4,25.7,15.4c2.4,10.7-5.4,22.1-16.2,23.8 c-10.8,2.3-22.4-5.9-23.7-16.9C1391.6,1292.3,1398,1282.2,1407.4,1279.6z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1046.4,1297.5c6-1.3,12.5,3.4,13,9.5 c1,6.5-4.9,12.8-11.5,12.3c-6.2-0.1-11.3-6.2-10.4-12.3C1038,1302.3,1041.8,1298.3,1046.4,1297.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1102.4,1298.5c16.9-2.9,34.5,9.1,38.1,25.9c4.3,16.4-5.9,34.8-22.1,39.9 c-14.7,5.4-32.4-1.1-40.2-14.5c-8.4-13.3-5.7-32.2,6-42.6C1089.2,1302.6,1095.6,1299.5,1102.4,1298.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1316.4,1299.8c17-2.8,34.8-0.7,50.5,6.3c16.7,7.3,31.1,19.9,40.5,35.5 c10.6,17.3,14.9,38.3,12.1,58.4c-2.7,19.4-12,37.9-26,51.6c-11.7,11.5-26.6,19.6-42.7,23.2c-18.6,4.3-38.6,2.4-56-5.5 c-14.5-6.4-27.2-16.8-36.4-29.7c-12.1-16.8-18-38-16.3-58.6c1.2-17.2,7.7-33.9,18.2-47.5 C1273.9,1315.6,1294.4,1303.3,1316.4,1299.8z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M877.4,1303.6c8.8-3,19.1,3.3,20.6,12.5c2,8.9-5,18.3-14,19.2 c-8.6,1.3-17.4-5.6-18-14.3C864.9,1313.4,870.1,1305.6,877.4,1303.6z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1463.3,1315.3c9.6-2.2,20.1,3.8,23.1,13.1c2.6,7.2,0.7,15.8-4.9,21.1 c-5.9,5.9-15.5,7.5-22.9,3.8c-7.6-3.5-12.4-12-11.4-20.4C1448,1324.4,1454.9,1316.9,1463.3,1315.3z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1003.3,1328.2c17.3-2.8,35.5,2.3,48.9,13.6c12,10,19.9,24.7,21.5,40.2 c2.2,18.2-4.7,37.1-17.7,50c-11.5,11.5-27.8,18.1-44,17.8c-16.8-0.2-33.3-7.7-44.5-20.2c-14.3-15.6-19.5-39-13-59.2 C961,1348.6,980.8,1331.5,1003.3,1328.2z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M827.4,1333.5c14.6-3.9,31.2,3.5,38.1,16.9c5,9.2,5.4,20.7,1,30.2 c-4.7,10.5-15.1,18.2-26.5,19.6c-15.8,2.4-32.3-8-36.8-23.3c-4.5-13.2,0.4-28.8,11.5-37.3C818.4,1336.8,822.8,1334.6,827.4,1333.5z "/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M906.3,1342.3c12.5-3,26.3,4,31.6,15.7c5.2,10.7,2.5,24.6-6.3,32.6 c-8.7,8.4-22.9,10.1-33.3,4c-9-5-14.8-15.3-14.3-25.7C884.2,1356.4,894,1344.8,906.3,1342.3z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1176.4,1361.5c18.2-4.2,38.3,4.1,48.3,19.9c10.1,15,9.9,36-0.4,50.9 c-9.9,15.1-29.3,23.1-47,19.4c-17.2-3.2-31.7-16.9-35.8-33.9c-3.9-15.1,0.5-31.9,11.3-43.1 C1159,1368.1,1167.4,1363.4,1176.4,1361.5z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1443.4,1367.4c7.2-2.9,15.6,4,14.1,11.7 c-0.8,7.8-11.3,11.9-17.2,6.7C1433.8,1381,1435.7,1369.7,1443.4,1367.4z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M695.4,1373.5c15.9-3.3,32.9,8.5,35.4,24.5c3.3,15.3-7.3,31.7-22.5,35.2 c-14.7,4.2-31.5-4.8-36.4-19.3c-5-13.2,0.7-29.2,12.8-36.4C687.9,1375.6,691.6,1374.2,695.4,1373.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1100.4,1375.8c6.1-1.6,12.9,0,17.9,3.9c6.8,5.3,9.5,15.1,6.5,23.2 c-3.2,9.1-13.3,15.1-22.8,13.3c-9.3-1.4-17-9.8-17.3-19.2C1083.9,1387.3,1091,1377.9,1100.4,1375.8z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M750.3,1382.2c5.9-2.5,13.4,1.5,14.5,7.9 c1.6,6.2-3.5,12.9-9.9,13.1c-5.4,0.5-10.8-3.8-11.4-9.2C742.7,1389.1,745.7,1383.9,750.3,1382.2z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M782.3,1407.4c14.9-3.8,31.5,6.2,35,21.2c4.1,14-4.2,30-17.8,34.9 c-12.4,5.1-27.8,0.2-35.1-11c-7.7-11-6.3-27.2,3.2-36.8C771.6,1411.6,776.8,1408.6,782.3,1407.4z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M864.4,1408.5c12.3-4.1,26.6,4.1,29.4,16.7c3.2,11.5-4.1,24.5-15.5,28 c-9.1,3.1-19.9-0.2-25.7-7.9c-5.4-6.8-6.5-16.6-2.7-24.4C852.7,1414.9,858.1,1410.4,864.4,1408.5z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M374.4,1411.7c14.4-3.6,30.1,7.4,31.4,22.2c2.2,14.2-9.5,28.3-23.8,29 c-13.4,1.4-26.6-9.4-27.8-22.8C352.5,1427.2,361.8,1414.2,374.4,1411.7z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M533.3,1412.3c6.4-2.2,13.7,3,13.9,9.7 c0.6,6.2-5.1,12-11.3,11.6c-5.2-0.1-9.9-4.4-10.4-9.6C524.9,1418.9,528.4,1413.7,533.3,1412.3z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M464.4,1415.7c18.4-3.8,38.5,6.2,46.8,23.1c8.6,16.4,5.1,38.2-8.5,50.9 c-13.1,13.3-35.1,16.1-51.3,7c-16-8.5-25.3-27.7-22-45.6C432.2,1433.5,446.8,1418.6,464.4,1415.7z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M927.5,1416.7c6.8-1.2,14.1,1,19,5.9c6.3,6,8.5,16,5.1,24.1 c-3.6,9.1-13.8,15.1-23.5,13.5c-10.3-1.3-18.7-10.7-18.8-21C908.6,1428.4,916.9,1418.2,927.5,1416.7z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M128.4,1421.4c6.4-2,13.7,0.1,18.3,4.9c5.3,5.3,6.6,14,3.3,20.6 c-3.4,7.3-12,11.6-19.9,10c-8.4-1.5-15-9.4-14.8-17.9C115.1,1431.1,120.8,1423.6,128.4,1421.4z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M574.4,1421.6c6.4-1.9,13.6-0.9,19.2,2.8c6,3.8,10.1,10.5,10.7,17.6 c0.8,7.8-2.7,15.7-8.8,20.5c-6.4,5.1-15.6,6.5-23.2,3.3c-8.7-3.4-14.8-12.4-14.7-21.8C557.4,1433.9,564.7,1424.3,574.4,1421.6z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M641.4,1423.5c7.7-2.6,16.5,3.4,17.1,11.4c1,7.6-5.7,15.1-13.4,14.8 c-7.9,0.2-14.7-7.8-13.1-15.6C632.8,1429.2,636.6,1424.9,641.4,1423.5z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M736.5,1426.6c5.5-2.2,12.5,1,14.2,6.8 c2.1,5.7-1.8,12.6-7.7,13.9c-5.4,1.5-11.6-2-13-7.4C728.1,1434.6,731.3,1428.4,736.5,1426.6z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1108.4,1428.5c10.7-3.9,23.5,2.9,26.4,13.8c3.4,10.5-3.4,22.8-14,25.7 c-6.7,2-14.3,0.4-19.5-4.3c-5.5-4.7-8.1-12.4-6.7-19.5C1095.9,1437.1,1101.4,1430.8,1108.4,1428.5z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M262.4,1432.4c7-3.2,15.9,1.4,17.5,8.8 c1.9,6.6-2.5,14.1-9.1,15.7c-6.6,2-14.2-2.3-16-9C253,1441.8,256.4,1434.7,262.4,1432.4z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M675.3,1441.2c6-2.6,13.6,1.4,14.7,7.8 c1.5,5.9-3.1,12.3-9.2,13c-6,1-12.1-4-12.3-10.1C668.2,1447.4,671.2,1442.9,675.3,1441.2z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M321.3,1452.2c5.5-2.7,12.4,2.8,11.2,8.8 c-0.6,5.8-8.2,8.9-12.8,5.4C314.5,1463.1,315.5,1454.2,321.3,1452.2z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M531.4,1453.3c5.6-2.4,12.8,1,14.4,6.9 c2.1,6.1-2.4,13.2-8.9,14c-6.1,1.1-12.2-4-12.4-10.2C524.2,1459.4,527.2,1455,531.4,1453.3z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M709.4,1453.6c12.7-3.8,27.2,5.4,29.1,18.5c2.6,12.5-6.9,25.7-19.5,27.3 c-12.6,2.3-25.6-7.6-26.8-20.3C690.6,1467.8,698.5,1456.3,709.4,1453.6z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1050.4,1454.6c16.7-4.9,35.8,5.7,40.7,22.3c5.7,16.5-3.9,36.2-20.3,41.8 c-15.1,6-33.7-1-41.2-15.3c-7.5-13.2-4.6-31.1,6.8-41.2C1040.3,1458.6,1045.2,1455.9,1050.4,1454.6z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1228.5,1455.8c15.6-3.5,32.8,4.3,40.3,18.4c6.8,12,6.2,27.7-1.6,39 c-9.2,14.3-28.8,20.5-44.5,14.1c-14.6-5.4-24.8-20.7-24-36.3C1199.1,1474.3,1212,1458.9,1228.5,1455.8z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M975.4,1457.6c9.6-2.2,20.1,1.1,26.7,8.3c8.2,8.5,10,22.2,4.4,32.5 c-5.6,11.1-19.1,17.3-31.1,14.4c-12.7-2.6-22.5-14.8-22.2-27.8C953,1472.1,962.8,1460.1,975.4,1457.6z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M625.4,1461.6c8.1-1.5,16.8-0.1,23.9,4.1c10.6,6,17.5,18.1,17.2,30.3 c0.2,16.3-12.8,31.3-28.8,33.7c-16.2,3.1-33.5-7.3-38.5-22.9c-5.3-14.4,0.8-31.7,13.6-40C616.6,1464.3,620.9,1462.5,625.4,1461.6z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M896.4,1461.6c9.2-2.2,19.4,3.6,22.3,12.6c2.5,7,0.4,15.3-5.1,20.3 c-5.6,5.3-14.4,6.7-21.3,3.3c-6.7-3.1-11.3-10.4-11-17.8C881.2,1471.3,887.9,1463.3,896.4,1461.6z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M831.3,1465.3c7.7-2.5,16.5,3.6,17,11.7 c0.9,7.5-5.7,14.8-13.3,14.6c-6.9,0.2-13.2-5.7-13.4-12.6C821,1472.9,825.4,1466.9,831.3,1465.3z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M1147.3,1468.2c8.8-1.6,18.2,1.7,24,8.4c5.8,6.5,8,16,5.6,24.4 c-2.5,9-10.3,16.4-19.5,18.3c-9.2,2.1-19.2-1.3-25.3-8.4c-5.1-5.9-7.4-14.2-5.9-21.8C1128.1,1478.7,1136.9,1469.9,1147.3,1468.2z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M414.4,1474.4c6.3-1.9,12.7,5.1,10.3,11.2 c-1.7,6.1-10.5,8-14.6,3.2C405.5,1484.4,408.1,1475.6,414.4,1474.4z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M255.4,1476.5c5.6-2.1,12,3.5,10.5,9.3 c-0.9,6-9,8.7-13.4,4.5C247.9,1486.6,249.6,1478.1,255.4,1476.5z"/>
|
||||
<path fill="#020202" stroke="#020202" stroke-width="9.375000e-002" d="M291.4,1478.4c5.5-2.7,12.4,2.5,11.4,8.5 c-0.5,6-8.4,9.3-13,5.5C284.8,1488.9,285.7,1480.4,291.4,1478.4z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M561.5,1479.8c7.7-2.7,16.7,3.3,17.3,11.4 c1.1,8.1-6.6,15.7-14.7,14.7c-7.5-0.6-13.3-8.3-11.8-15.6C553.1,1485.4,556.8,1481.2,561.5,1479.8z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1297.4,1488.5c7.9-2.2,15.7,6.3,13,14 c-2.1,8-13.8,10.4-18.9,3.9C1286,1500.6,1289.6,1489.9,1297.4,1488.5z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M332.5,1489.6c7.2-3,16.1,1.9,17.4,9.6 c2,8.1-5.5,16.4-13.7,15.5c-7.2-0.3-13-7.5-11.9-14.5C324.7,1495.4,328.1,1491.3,332.5,1489.6z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M525.4,1502.6c11-1.9,22.7,5.3,25.9,16c2.7,8.2,0.3,17.8-5.9,23.8 c-6.9,7-18.4,8.8-27.1,4.2c-8.6-4.3-13.9-14.1-12.6-23.6C506.8,1512.8,515.2,1504,525.4,1502.6z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M408.3,1503.2c12-2.5,25,4.9,29,16.4c3.4,8.9,1.4,19.6-5.1,26.6 c-6.4,7.1-16.9,10.2-26.1,7.6c-11.3-2.9-19.7-14.1-19-25.8C387.2,1516.1,396.6,1505.2,408.3,1503.2z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M256.4,1506.5c7.9-2.6,16.8,4.1,16.6,12.5 c0.3,8-8,14.7-15.8,12.7c-7.7-1.4-12.5-10.6-9.2-17.7C249.5,1510.4,252.7,1507.5,256.4,1506.5z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M474.5,1513.6c6.3-1.5,13.2,3.8,13,10.4 c0.4,6.8-6.6,12.5-13.2,10.8c-6.3-1.2-10.2-8.5-7.8-14.4C467.8,1517,470.9,1514.3,474.5,1513.6z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M356.5,1516.6c7.2-2.9,15.9,2.8,16.3,10.5c0.8,6.8-5,13.3-11.8,13.3 c-6.5,0.4-12.6-5.1-12.7-11.6C347.9,1523.6,351.4,1518.3,356.5,1516.6z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M308.4,1524.3c5.8-2.6,12.7,3.5,10.9,9.6 c-1.2,6-9.7,8.2-13.8,3.7C301.4,1533.7,303.1,1526.1,308.4,1524.3z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M133.4,1533.6c11.3-2.6,22.9,7.8,21.6,19.3c-0.5,10.5-11.3,18.8-21.6,16.5 c-10.6-1.7-17.8-13.9-13.8-24C121.6,1539.4,127.1,1534.7,133.4,1533.6z"/>
|
||||
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M452.4,1541.3c6-1.7,12.2,4.5,10.4,10.4 c-1.2,6.5-10.4,9-14.7,4.1C443.4,1551.4,446,1542.5,452.4,1541.3z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M327.4,1544.4c13.3-4,28.6,4.7,31.9,18.2c4,13.2-4.6,28.3-17.8,31.8 c-13.2,4.2-28.7-4.3-32.2-17.8C305.1,1563.3,313.8,1547.8,327.4,1544.4z"/>
|
||||
<path fill="#020202" stroke="#020202" stroke-width="9.375000e-002" d="M388.5,1559.6c6.3-1.8,12.6,5,10.3,11.2 c-1.7,6.2-10.5,8.1-14.7,3.2C379.5,1569.4,382.2,1560.7,388.5,1559.6z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M220.4,1596.3c6.9-2.6,15.1,2.4,16.1,9.7c1.2,6.6-3.9,13.4-10.5,14.1 c-6.7,1.1-13.6-4.4-13.8-11.2C211.5,1603.5,215.1,1598,220.4,1596.3z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M88.3,1645.2c10.7-2.5,22,6.8,21.7,17.8c0.4,10.1-8.9,19.1-19,18.4 c-9.1-0.2-17.2-8.2-17.5-17.4C72.9,1655.2,79.6,1646.7,88.3,1645.2z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M271.4,1679.6c12.3-3.7,26.2,5,28.5,17.5c2.8,11.5-5,24.2-16.5,27 c-8.3,2.3-17.8-0.5-23.4-7.1c-5.6-6.2-7.3-15.5-4.3-23.3C258.3,1686.8,264.3,1681.4,271.4,1679.6z"/>
|
||||
<path stroke="#000000" stroke-width="9.375000e-002" d="M139.4,1703.6c8.2-2.3,17.4,0.6,23,7c5.4,6,7.3,14.9,4.7,22.6 c-2.9,8.9-11.7,15.7-21.2,15.7c-8.8,0.5-17.4-4.7-21.3-12.6c-3.4-6.6-3.3-14.9,0.3-21.4C127.9,1709.4,133.3,1705.1,139.4,1703.6z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 47 KiB |
|
@ -0,0 +1,21 @@
|
|||
<?php
|
||||
// src/Controller/AboutController.php
|
||||
namespace App\Controller;
|
||||
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\Routing\Annotation\Route;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
|
||||
class AboutController extends AbstractController
|
||||
{
|
||||
/**
|
||||
* @Route("/about", name="about")
|
||||
*/
|
||||
public function about()
|
||||
{
|
||||
return $this->render('about/index.html.twig', [
|
||||
|
||||
]);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
<?php
|
||||
// src/Controller/HomeController.php
|
||||
namespace App\Controller;
|
||||
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\Routing\Annotation\Route;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
|
||||
class HomeController extends AbstractController
|
||||
{
|
||||
/**
|
||||
* @Route("/", name="home")
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return $this->render('index.html.twig', [
|
||||
|
||||
]);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
<?php
|
||||
|
||||
namespace App;
|
||||
|
||||
use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
|
||||
use Symfony\Component\HttpKernel\Kernel as BaseKernel;
|
||||
|
||||
class Kernel extends BaseKernel
|
||||
{
|
||||
use MicroKernelTrait;
|
||||
}
|
|
@ -0,0 +1,127 @@
|
|||
{
|
||||
"doctrine/annotations": {
|
||||
"version": "1.13",
|
||||
"recipe": {
|
||||
"repo": "github.com/symfony/recipes",
|
||||
"branch": "main",
|
||||
"version": "1.10",
|
||||
"ref": "64d8583af5ea57b7afa4aba4b159907f3a148b05"
|
||||
}
|
||||
},
|
||||
"sensio/framework-extra-bundle": {
|
||||
"version": "6.2",
|
||||
"recipe": {
|
||||
"repo": "github.com/symfony/recipes",
|
||||
"branch": "main",
|
||||
"version": "5.2",
|
||||
"ref": "fb7e19da7f013d0d422fa9bce16f5c510e27609b"
|
||||
},
|
||||
"files": [
|
||||
"config/packages/sensio_framework_extra.yaml"
|
||||
]
|
||||
},
|
||||
"symfony/console": {
|
||||
"version": "6.1",
|
||||
"recipe": {
|
||||
"repo": "github.com/symfony/recipes",
|
||||
"branch": "main",
|
||||
"version": "5.3",
|
||||
"ref": "da0c8be8157600ad34f10ff0c9cc91232522e047"
|
||||
},
|
||||
"files": [
|
||||
"bin/console"
|
||||
]
|
||||
},
|
||||
"symfony/flex": {
|
||||
"version": "2.2",
|
||||
"recipe": {
|
||||
"repo": "github.com/symfony/recipes",
|
||||
"branch": "main",
|
||||
"version": "1.0",
|
||||
"ref": "146251ae39e06a95be0fe3d13c807bcf3938b172"
|
||||
},
|
||||
"files": [
|
||||
".env"
|
||||
]
|
||||
},
|
||||
"symfony/framework-bundle": {
|
||||
"version": "6.1",
|
||||
"recipe": {
|
||||
"repo": "github.com/symfony/recipes",
|
||||
"branch": "main",
|
||||
"version": "5.4",
|
||||
"ref": "3cd216a4d007b78d8554d44a5b1c0a446dab24fb"
|
||||
},
|
||||
"files": [
|
||||
"config/packages/cache.yaml",
|
||||
"config/packages/framework.yaml",
|
||||
"config/preload.php",
|
||||
"config/routes/framework.yaml",
|
||||
"config/services.yaml",
|
||||
"public/index.php",
|
||||
"src/Controller/.gitignore",
|
||||
"src/Kernel.php"
|
||||
]
|
||||
},
|
||||
"symfony/routing": {
|
||||
"version": "6.1",
|
||||
"recipe": {
|
||||
"repo": "github.com/symfony/recipes",
|
||||
"branch": "main",
|
||||
"version": "6.1",
|
||||
"ref": "a44010c0d06989bd4f154aa07d2542d47caf5b83"
|
||||
},
|
||||
"files": [
|
||||
"config/packages/routing.yaml",
|
||||
"config/routes.yaml"
|
||||
]
|
||||
},
|
||||
"symfony/translation": {
|
||||
"version": "6.1",
|
||||
"recipe": {
|
||||
"repo": "github.com/symfony/recipes",
|
||||
"branch": "main",
|
||||
"version": "5.3",
|
||||
"ref": "da64f5a2b6d96f5dc24914517c0350a5f91dee43"
|
||||
},
|
||||
"files": [
|
||||
"config/packages/translation.yaml",
|
||||
"translations/.gitignore"
|
||||
]
|
||||
},
|
||||
"symfony/twig-bundle": {
|
||||
"version": "6.1",
|
||||
"recipe": {
|
||||
"repo": "github.com/symfony/recipes",
|
||||
"branch": "main",
|
||||
"version": "5.4",
|
||||
"ref": "bb2178c57eee79e6be0b297aa96fc0c0def81387"
|
||||
},
|
||||
"files": [
|
||||
"config/packages/twig.yaml",
|
||||
"templates/base.html.twig"
|
||||
]
|
||||
},
|
||||
"symfony/webpack-encore-bundle": {
|
||||
"version": "1.15",
|
||||
"recipe": {
|
||||
"repo": "github.com/symfony/recipes",
|
||||
"branch": "main",
|
||||
"version": "1.10",
|
||||
"ref": "2e458cc7e6f1df1dad890eb104b81e4f302c9bd4"
|
||||
},
|
||||
"files": [
|
||||
"assets/app.js",
|
||||
"assets/bootstrap.js",
|
||||
"assets/controllers.json",
|
||||
"assets/controllers/hello_controller.js",
|
||||
"assets/styles/app.css",
|
||||
"config/packages/webpack_encore.yaml",
|
||||
"package.json",
|
||||
"webpack.config.js"
|
||||
]
|
||||
},
|
||||
"twig/extra-bundle": {
|
||||
"version": "v3.4.0"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
{% extends "base.html.twig" %}
|
||||
|
||||
{% block content %}
|
||||
<h2>{{ "About" | trans }}</h2>
|
||||
<p>{{ "BirdNET-stream is a realtime soundscape analyzis software powered by BirdNET AI." | trans }}</p>
|
||||
<p>{{ "It aims to be able to run on any computer with a microphone." | trans }}</p>
|
||||
<h3>{{ "Author" | trans }}</h3>
|
||||
<p>{{ "This project is made with ♥ by Samuel ORTION." | trans | raw }}</p>
|
||||
<h3>{{ "License" | trans }}</h3>
|
||||
<p>{{ "BirdNET-stream is licensed under the" | trans }}
|
||||
<span class="license">
|
||||
<a href="https://www.gnu.org/licenses/gpl-3.0.html">
|
||||
GNU General Public License v3 or later</a>
|
||||
</span>.
|
||||
</p>
|
||||
<p>{{ "BirdNET-Analyzer, on which this project relies, is licensed under" | trans }}
|
||||
<span class="license">
|
||||
<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
|
||||
Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License
|
||||
</a>
|
||||
</span>.
|
||||
</p>
|
||||
{% endblock %}
|
|
@ -0,0 +1,35 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>
|
||||
{% block title %}BirdNET-stream
|
||||
{% endblock %}
|
||||
</title>
|
||||
|
||||
{# Run `composer require symfony/webpack-encore-bundle` to start using Symfony UX #}
|
||||
{% block stylesheets %}
|
||||
{{ encore_entry_link_tags('app') }}
|
||||
{% endblock %}
|
||||
|
||||
{% block javascripts %}
|
||||
{{ encore_entry_script_tags('app') }}
|
||||
{% endblock %}
|
||||
</head>
|
||||
<body>
|
||||
{% block body %}
|
||||
<header>
|
||||
<img id="logo" src="/media/logo.svg" alt="BirdNET-stream logo">
|
||||
<h1>BirdNET-stream</h1>
|
||||
</header>
|
||||
{% include "menu.html.twig" %}
|
||||
|
||||
<main>
|
||||
{% block content %}
|
||||
<p>Welcome to BirdNET-stream !</p>
|
||||
{% endblock %}
|
||||
</main>
|
||||
{% include "footer.html.twig" %}
|
||||
{% endblock %}
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,12 @@
|
|||
<footer>
|
||||
<p>
|
||||
© <span class="creation-date">2022
|
||||
<!-- check if the current year is the same as the creation year -->
|
||||
{% set year = "now" | date("Y") %}
|
||||
{% if year != "2022" %}
|
||||
- {{ year }}
|
||||
{% endif %}
|
||||
</span>
|
||||
<a href="https://samuel.ortion.fr/">Samuel ORTION</a>
|
||||
</p>
|
||||
</footer>
|
|
@ -0,0 +1,5 @@
|
|||
{% extends "base.html.twig" %}
|
||||
|
||||
{% block content %}
|
||||
<p>Welcome to BirdNET-stream !</p>
|
||||
{% endblock %}
|
|
@ -0,0 +1,40 @@
|
|||
<nav class="nav-bar">
|
||||
<ul>
|
||||
<li>
|
||||
<a href="/">Home</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/about">About</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/today">Today's Detections</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/spectro">Spectrogram</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/stats">Species Stats</a>
|
||||
</li>
|
||||
<li class="dropdown">
|
||||
<a href="/records" class="dropdown-button">Recordings</a>
|
||||
<ul class="dropdown-content">
|
||||
<li>
|
||||
<a href="/records/bests">
|
||||
Best Recordings
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/charts">Daily Charts</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/logs">View Logs</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/tools">
|
||||
Tools
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
|
@ -0,0 +1,42 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="fr" datatype="plaintext" original="file.ext">
|
||||
<header>
|
||||
<tool tool-id="symfony" tool-name="Symfony"/>
|
||||
</header>
|
||||
<body>
|
||||
<trans-unit id="Tvyg0Qx" resname="About">
|
||||
<source>About</source>
|
||||
<target>À propos</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="VAw_dLX" resname="BirdNET-stream is a realtime soundscape analyzis software powered by BirdNET AI.">
|
||||
<source>BirdNET-stream is a realtime soundscape analyzis software powered by BirdNET AI.</source>
|
||||
<target>BirdNET-stream est un logiciel d'analyse en temps réel de l'environement sonore basé sur BirdNET.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="vvz1r3A" resname="It aims to be able to run on any computer with a microphone.">
|
||||
<source>It aims to be able to run on any computer with a microphone.</source>
|
||||
<target>Il cherche à être fonctionnel sur tout ordinateur équipé d'un microphone.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="2VCCou5" resname="Author">
|
||||
<source>Author</source>
|
||||
<target>Auteur</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="1zd9FJ_" resname="This project is made with &hearts; by Samuel ORTION.">
|
||||
<source>This project is made with &hearts; by Samuel ORTION.</source>
|
||||
<target><![CDATA[Ce projet est fait avec ♥ par Samuel ORTION]]></target>
|
||||
</trans-unit>
|
||||
<trans-unit id="wBHWCXv" resname="License">
|
||||
<source>License</source>
|
||||
<target>Licence</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="6AM7sRb" resname="BirdNET-stream is licensed under the">
|
||||
<source>BirdNET-stream is licensed under the</source>
|
||||
<target>BirdNET-stream est sous licence</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="nNkktM9" resname="BirdNET-Analyzer, on which this project relies, is licensed under">
|
||||
<source>BirdNET-Analyzer, on which this project relies, is licensed under</source>
|
||||
<target>BirdNET-Analyzer, sur qui ce projet repose, est sous licence</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
|
@ -0,0 +1,75 @@
|
|||
const Encore = require('@symfony/webpack-encore');
|
||||
|
||||
// Manually configure the runtime environment if not already configured yet by the "encore" command.
|
||||
// It's useful when you use tools that rely on webpack.config.js file.
|
||||
if (!Encore.isRuntimeEnvironmentConfigured()) {
|
||||
Encore.configureRuntimeEnvironment(process.env.NODE_ENV || 'dev');
|
||||
}
|
||||
|
||||
Encore
|
||||
// directory where compiled assets will be stored
|
||||
.setOutputPath('public/build/')
|
||||
// public path used by the web server to access the output path
|
||||
.setPublicPath('/build')
|
||||
// only needed for CDN's or sub-directory deploy
|
||||
//.setManifestKeyPrefix('build/')
|
||||
|
||||
/*
|
||||
* ENTRY CONFIG
|
||||
*
|
||||
* Each entry will result in one JavaScript file (e.g. app.js)
|
||||
* and one CSS file (e.g. app.css) if your JavaScript imports CSS.
|
||||
*/
|
||||
.addEntry('app', './assets/app.js')
|
||||
|
||||
// enables the Symfony UX Stimulus bridge (used in assets/bootstrap.js)
|
||||
.enableStimulusBridge('./assets/controllers.json')
|
||||
|
||||
// When enabled, Webpack "splits" your files into smaller pieces for greater optimization.
|
||||
.splitEntryChunks()
|
||||
|
||||
// will require an extra script tag for runtime.js
|
||||
// but, you probably want this, unless you're building a single-page app
|
||||
.enableSingleRuntimeChunk()
|
||||
|
||||
/*
|
||||
* FEATURE CONFIG
|
||||
*
|
||||
* Enable & configure other features below. For a full
|
||||
* list of features, see:
|
||||
* https://symfony.com/doc/current/frontend.html#adding-more-features
|
||||
*/
|
||||
.cleanupOutputBeforeBuild()
|
||||
.enableBuildNotifications()
|
||||
.enableSourceMaps(!Encore.isProduction())
|
||||
// enables hashed filenames (e.g. app.abc123.css)
|
||||
.enableVersioning(Encore.isProduction())
|
||||
|
||||
.configureBabel((config) => {
|
||||
config.plugins.push('@babel/plugin-proposal-class-properties');
|
||||
})
|
||||
|
||||
// enables @babel/preset-env polyfills
|
||||
.configureBabelPresetEnv((config) => {
|
||||
config.useBuiltIns = 'usage';
|
||||
config.corejs = 3;
|
||||
})
|
||||
|
||||
// enables Sass/SCSS support
|
||||
//.enableSassLoader()
|
||||
|
||||
// uncomment if you use TypeScript
|
||||
//.enableTypeScriptLoader()
|
||||
|
||||
// uncomment if you use React
|
||||
//.enableReactPreset()
|
||||
|
||||
// uncomment to get integrity="..." attributes on your script & link tags
|
||||
// requires WebpackEncoreBundle 1.4 or higher
|
||||
//.enableIntegrityHashes(Encore.isProduction())
|
||||
|
||||
// uncomment if you're having problems with a jQuery plugin
|
||||
//.autoProvidejQuery()
|
||||
;
|
||||
|
||||
module.exports = Encore.getWebpackConfig();
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue