1
0
forked from extern/SSH-Snake

Compare commits

...

No commits in common. "main" and "cytoscape" have entirely different histories.

40 changed files with 33248 additions and 6785 deletions

133
404.html Normal file
View File

@ -0,0 +1,133 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><title>Page Not Found :(</title><style>::-moz-selection {
background: #b3d4fc;
text-shadow: none;
}
::selection {
background: #b3d4fc;
text-shadow: none;
}
html {
padding: 30px 10px;
font-size: 20px;
line-height: 1.4;
color: #737373;
background: #f0f0f0;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
}
html,
input {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
body {
max-width: 500px;
_width: 500px;
padding: 30px 20px 50px;
border: 1px solid #b3b3b3;
border-radius: 4px;
margin: 0 auto;
box-shadow: 0 1px 10px #a7a7a7, inset 0 1px 0 #fff;
background: #fcfcfc;
}
h1 {
margin: 0 10px;
font-size: 50px;
text-align: center;
}
h1 span {
color: #bbb;
}
h3 {
margin: 1.5em 0 0.5em;
}
p {
margin: 1em 0;
}
ul {
padding: 0 0 0 40px;
margin: 1em 0;
}
.container {
max-width: 380px;
_width: 380px;
margin: 0 auto;
}
/* google search */
#goog-fixurl ul {
list-style: none;
padding: 0;
margin: 0;
}
#goog-fixurl form {
margin: 0;
}
#goog-wm-qt,
#goog-wm-sb {
border: 1px solid #bbb;
font-size: 16px;
line-height: normal;
vertical-align: top;
color: #444;
border-radius: 2px;
}
#goog-wm-qt {
width: 220px;
height: 20px;
padding: 5px;
margin: 5px 10px 0 0;
box-shadow: inset 0 1px 1px #ccc;
}
#goog-wm-sb {
display: inline-block;
height: 32px;
padding: 0 10px;
margin: 5px 0 0;
white-space: nowrap;
cursor: pointer;
background-color: #f5f5f5;
background-image: -webkit-linear-gradient(rgba(255,255,255,0), #f1f1f1);
background-image: -moz-linear-gradient(rgba(255,255,255,0), #f1f1f1);
background-image: -ms-linear-gradient(rgba(255,255,255,0), #f1f1f1);
background-image: -o-linear-gradient(rgba(255,255,255,0), #f1f1f1);
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
*overflow: visible;
*display: inline;
*zoom: 1;
}
#goog-wm-sb:hover,
#goog-wm-sb:focus {
border-color: #aaa;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
background-color: #f8f8f8;
}
#goog-wm-qt:hover,
#goog-wm-qt:focus {
border-color: #105cb6;
outline: 0;
color: #222;
}
input::-moz-focus-inner {
padding: 0;
border: 0;
}</style><body><div class="container"><h1>Not found <span>:(</span></h1><p>Sorry, but the page you were trying to view does not exist.</p><p>It looks like this was the result of either:</p><ul><li>a mistyped address</li><li>an out-of-date link</li></ul><script>var GOOG_FIXURL_LANG = (navigator.language || '').slice(0,2),GOOG_FIXURL_SITE = location.host;</script><script src="//linkhelp.clients.google.com/tbproxy/lh/wm/fixurl.js"></script></div>

16
COPYING
View File

@ -1,16 +0,0 @@
SSH-Snake: Automated SSH-Based Network Traversal
Copyright (C) 2024 Joshua Rogers <https://joshua.hu/>
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/>.

View File

@ -1,40 +0,0 @@
# Visualizing System Relationships
SSH-Snake's output can be used to create visualizations of the network it has traversed. For example, using the python script _generate-graph.py_ provided in [tools/](tools/), we can generate a PNG visualizing the network:
![A graph visualizing the relation between systems using SSH](tools/SSH-Snake-dot-circo.png)
In [this image](tools/SSH-Snake-dot-circo.png), the blue nodes indicate a destination that can connect to itself (meaning a key on the system is also trusted by `authorized_keys`). The red edges/lines indicate that the connection from one system to another is bi-directional, meaning system A can SSH to system B and system B can SSH to system A. Note that this image includes usernames in the system labels.
This graph was created using the command:
```bash
python3 tools/generate-graph.py --with-users --file SSHSnake.log --format dot
circo -Tpng -Goverlap=false -Gsplines=true -Gconcentrate=true -Gnodesep=0.1 -Goverlap=false SSHSnake_dot_file.dot -o SSH-Snake-dot-circo.png
```
which first generates a [dot file](https://en.wikipedia.org/wiki/DOT_(graph_description_language), then uses [graphviz' circo](https://graphviz.org/docs/layouts/circo/) to generate a PNG.
---
An alternative visualization can be created in [gexf format](https://gexf.net/), and then [Gephi](https://gephi.org/users/download/) can be used to create another meaningful image:
![A graph visualizing the relation between systems using SSH](tools/SSH-Snake-Gephi.svg)
In [this image](tools/SSH-Snake-Gephi.svg), the green nodes indicate a _host_ (without a username) that can connect to itself, and green lines/edges indicate that the connection is bi-directional. The gray host in the top right corner is the host that the script was initially executed on. Note that the hosts do __not__ include the usernames of the system, and this visualization indicates system to system connections, rather than destination (`user@host`) to destination (`user@host`) connections.
This graph was created using the command (note the lack of `--with-users`):
```bash
python3 tools/generate-graph.py --file SSHSnake.log --format gexf
```
Using Gephi, the final image was generated.
---
Cytoscape is another tool that can be used to generate interesting graphs. Using the same gexf format output file from before, you can install the gexf-app app for Cytoscape and import the file.
|![A graph visualizing the relation between systems using SSH](tools/SSH-Snake-CytoScape.svg)The blue nodes indicate the _destination_ can connect to itself (user@host<-->user@host). The red edges indicate that the connection is bi-directional (user1@host1<-->user2@host2).|
Not only can you create an image like this in Cytoscape (using the "yFiles hierarchical Layout"), you can also create webpages like this one: [https://megamansec.github.io/SSH-Snake/](https://megamansec.github.io/SSH-Snake/#/).

661
LICENSE
View File

@ -1,661 +0,0 @@
GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 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 Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
our General Public Licenses are 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.
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.
Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.
A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate. Many developers of free software are heartened and
encouraged by the resulting cooperation. However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.
The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community. It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server. Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.
An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals. This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.
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 Affero 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. Remote Network Interaction; Use with the GNU General Public License.
Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software. This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.
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 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 work with which it is combined will remain governed by version
3 of the GNU General Public License.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU Affero 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 Affero 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 Affero 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 Affero 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 Affero 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 Affero General Public License for more details.
You should have received a copy of the GNU Affero 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 your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source. For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code. There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.
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 AGPL, see
<https://www.gnu.org/licenses/>.

View File

@ -1,94 +0,0 @@
SSH-Snake's approach to output is quite simple and consists of the following:
- Print where we are,
- Print any keys found,
- Print any exceptional information.
A normal output will look something like this:
```
(1) [1704020277]jrogers@10.128.0.25
(2) [1704020277]jrogers@(10.128.0.25)
(3) [1704020277]jrogers@10.128.0.25: Discovered usable private key in [/home/jrogers/.ssh/id_rsa]
(4) [1704020277]jrogers@10.128.0.25: EXTERNAL_MSG: KEY[/home/jrogers/.ssh/id_rsa]: LS0tLS1CRUdJTiBPUE[...]
(5) [1704020278]jrogers@10.128.0.25: Discovered unusable private key in [/home/jrogers/.ssh/protected]
(6) [1704020278]jrogers@10.128.0.25: EXTERNAL_MSG: KEY[/home/jrogers/.ssh/protected]: LS0tLS1CRUdJTiB[...]
(7) [1704020278]jrogers@10.128.0.25: EXTERNAL_MSG: INFO: Beginning with 12 dests and 1 keys
(8) [1704020279] jrogers@10.128.0.25[!/home/jrogers/.ssh/id_rsa]->jrogers@10.128.0.25
(9) [1704020279] jrogers@(10.128.0.25)[!/home/jrogers/.ssh/id_rsa]->jrogers@(10.128.0.25)
(10) [1704020279] jrogers@10.128.0.25[!/home/jrogers/.ssh/id_rsa]->jrogers@10.128.0.27
(11) [1704020279] jrogers@(10.128.0.25)[!/home/jrogers/.ssh/id_rsa]->jrogers@(10.128.0.27)
(12) [1704020277] jrogers@10.128.0.25[!/home/jrogers/.ssh/id_rsa]->jrogers@10.128.0.27: Discovered usable private key in [/home/jrogers/.ssh/id_rsa]
....
```
Every line is prepended with the UNIX epoch time.
Going through each line one by one, the purpose of each line is explained respectively:
1. The current destination (`user@host`) in the so-called "hosts chain" format. This destination address is the exact address that was used to `ssh` to (`ssh -i key user@host`).
2. The current destination (`user@(host)`) in the so-called "hostnames chain" format. This format identifies a system based on all of its addresses. For example, a system with three IPv4 addresses corresponds to `user@(ip1:ip2:ip3)` where each `ip` is the IPv4 address. This format of destination is a clear indicator of the system and is used to ensure scanning of duplicate systems does not occur (such that connecting to a secondary address does not trigger a duplicate scan for a system that has already been scanned).
3. A private key that can be used (no passphrase or permission issue) has been discovered in `/home/jrogers/.ssh/id_rsa`.
4. The contents of the private key discovered in `/home/jrogers/.ssh/id_rsa` in base64 format.
5. A private key that cannot be used (either a passphrase or some type of permission issue) has been discovered in `/home/jrogers/.ssh/protected`.
6. The contents of the private key discovered in `/home/jrogers/.ssh/protected` in base64 format.
7. 1 usable key and 12 destination addresses have been discovered on the system. The script will now try to connect to those 12 addresses using the 1 key.
8. `jrogers@10.128.0.25` has connected to `jrogers@10.128.0.25` using the `/home/jrogers/.ssh/id_rsa` key. The `!` at the beginning of the key location indicates that `sudo` was used.
9. The "hostnames chain" format of the above.
10. `jrogers@10.128.0.25` has connected to `jrogers@10.128.0.27` using the `/home/jrogers/.ssh/id_rsa` key.
11. The "hostnames chain" format of the above.
12. A private key that can be used has been discovered in `/home/jrogers/.ssh/id_rsa`.
Again: each of these lines are indicative of _normal_ output.
---
There are some exceptional cases which are related to error conditions and the [custom_cmds option](/SETTINGS.md#custom_cmds):
Examples of these exception cases are listed below:
```
(1) [1704020279] jrogers@10.128.0.25[/home/jrogers/.ssh/id_rsa]->git@20.205.243.166 [GitHub]
(2) [1704020279] jrogers@10.128.0.25[/home/jrogers/.ssh/id_rsa]->jrogers@10.128.50.50 [GitLab]
(3) [1704020279] jrogers@10.128.0.25[/home/jrogers/.ssh/id_rsa]->jrogers@10.128.0.30 [NoLogin]
(4) [1704020279] jrogers@10.128.0.25[/home/jrogers/.ssh/id_rsa]->jrogers@10.128.0.30 [OoM]
(5) [1704020279] jrogers@10.128.0.25[/home/jrogers/.ssh/id_rsa]->jrogers@10.128.0.30 [ConnErr]
(6) [1704020279] jrogers@10.128.0.25[/home/jrogers/.ssh/id_rsa]->jrogers@10.128.0.30 [fail,aws,ubuntu]
(7) [1704020279] jrogers@10.128.0.25[/home/jrogers/.ssh/id_rsa]->jrogers@10.128.0.30 [fail,cmd,awk]
(8) [1704020279] jrogers@10.128.0.25[/home/jrogers/.ssh/id_rsa]->jrogers@10.128.0.30 [ARGLIMIT:1048576, abcdef...]
(9) [1704020279] jrogers@10.128.0.25[/home/jrogers/.ssh/id_rsa]->jrogers@10.128.0.30: EXTERNAL_MSG: CMD[uname]: abcdef..."
(10) [1704020279] jrogers@10.128.0.25[/home/jrogers/.ssh/id_rsa]->jrogers@10.128.0.30 [line]: abcdef..
```
Each of these indicate:
1. The `/home/jrogers/.ssh/id_rsa` key can be used to SSH to `git@20.205.243.166`, which is a server identifying itself as GitHub.
2. The `/home/jrogers/.ssh/id_rsa` key can be used to SSH to `jrogers@10.128.50.50`, which is a GitLab server.
3. The `/home/jrogers/.ssh/id_rsa` key can be used to SSH to `jrogers@10.128.0.30`, but the user is restricted to `/usr/sbin/nologin` (meaning the SSH connection is likely used only for proxying).
4. The destination `jrogers@10.128.0.30` has run of memory during script execution.
5. The destination `jrogers@10.128.0.30` has unexpectedly disconnected.
6. The destination `jrogers@10.128.0.30` is an AWS EC2 instance which accepts the `/home/jrogers/.ssh/id_rsa` key but does not allow SSH to the `jrogers` user: instead, you must SSH to the `ubuntu` user. If the [retry_count option](SETTINGS.md#retry_count) is greater than 0, the script will automatically attempt to SSH to `ubuntu@10.128.0.30`.
7. The destination `jrogers@10.128.0.30` accepts the key but the script cannot run because the `awk` program is not installed on the system.
8. Either `jrogers@10.128.0.25` or `jrogers@10.128.0.30` has experienced a fatal error: [the argument limit length](https://unix.stackexchange.com/questions/120642/what-defines-the-maximum-size-for-a-command-single-argument) has been reached, which means that the script cannot be passed via an argument. The argument limit is `1048576`. The so-called `ignore_list` (containing all of the destinations already scanned and currently being scanned) is also printed in base64 format.
9. The custom command `uname` has been run on `jrogers@10.128.0.30` due to it being set in the `custom_cmds` option, and the output of the command (including stderr) is printed in base64 format.
10. The destination `jrogers@10.128.0.30` has printed an unexpected output. The output is printed after `[line]: `. Alternatively, it may also mean that `ssh` on `jrogers@10.128.0.25` has printed an unexpected output while using `ssh -i key jrogers@10.128.0.30`.
---
A few more procedural lines are also printed:
```
(1) [1702897342] jrogers@10.128.0.30: EXTERNAL_MSG: INFO: Trying again with 2 dests and 4 keys (attempts left: 0)
(2) 12 destinations (from 10 unique servers) added to interesting_dests.
(3) Unique private keys discovered: 8
(4) Unique shell accounts accessed: 10
(5) Unique servers accessed: 5
```
1. Either 2 recoverable errors have been encountered such that the destinations where the errors occurs will be tried again, or the [use_find_from_ignore_list option](SETTINGS.md#use_find_from_ignore_list) has been enabled and the script is attempting to SSH into any destinations from the ignore list (and thus the new destinations are being tried).
2. The [use_retry_all_dests options](SETTINGS.md#use_retry_all_dests) has been enabled and the script is going to re-run the scan completely with 12 destinations, corresponding to 10 unique systems (user1@host and user2@host are one system).
3. At the complete end of the scan, this identifies the total amount of private keys discovered during the scan.
4. At the complete end of the scan, this identifies the total amount of destinations (`user@host`) that have been accessed.
5. At the complete end of the scan, this identifies the total amount of systems (based on the hostnames chain format) that have been accessed.

147
README.md
View File

@ -1,147 +0,0 @@
# SSH-Snake: Automated SSH-Based Network Traversal
🐍 SSH-Snake is a powerful tool designed to perform automatic network traversal using SSH private keys discovered on systems, with the objective of creating a comprehensive map of a network and its dependencies, identifying to what extent a network can be compromised using SSH and SSH private keys starting from a particular system.
SSH-Snake can automatically reveal the relationship between systems which are connected via SSH, which would normally take a tremendous amount of time and effort to perform manually.
In other words, SSH-Snake performs the following tasks automatically and recursively:
1. On the current system, find any SSH private keys,
2. On the current system, find any hosts or destinations (`user@host`) that the private keys may be accepted,
3. Attempt to SSH into all of the destinations using all of the private keys discovered,
4. If a destination is successfully connected to, repeats steps #1 - #4 on the connected-to system.
It's completely self-replicating and self-propagating -- and completely fileless. In many ways, SSH-Snake is actually a [worm](https://en.wikipedia.org/wiki/Computer_worm): It replicates itself and spreads itself from one system to another as far as it can.
Instead of manually jumping between systems with SSH keys like it's a Super Mario game, let SSH-Snake do the work for you.
Although this tool is intended for hacking purposes, sysadmins can also use it to better understand their infrastructure and network. If you want to disable the printing of private keys discovered, [comment out this line of code](https://github.com/MegaManSec/SSH-Snake/blob/7ae7ef0afe0e067a1b96f69e508df52831a08b8b/Snake.sh#L964).
An in-depth look at how this script actually works, technical details, interesting discoveries, design decisions, benchmarking, and lessons learnt, check out [this blog post](https://joshua.hu/ssh-snake-ssh-network-traversal-discover-ssh-private-keys-network-graph).
# Screenshots
|![](tools/SSH-Snake-Screenshot.png)A reduced screenshot from the output of SSH-Snake in a very small network.|
|:-:|
---
|![A graph visualizing the relation between systems using SSH](tools/SSH-Snake-CytoScape.svg)The blue nodes indicate the _destination_ can connect to itself (user@host<-->user@host). The red edges indicate that the connection is bi-directional (user1@host1<-->user2@host2).|
|:-:|
---
|![A graph visualizing the relation between systems using SSH](tools/SSH-Snake-Gephi.svg)The green nodes indicate a _host_ (without a username) that can connect to itself (host1<-->host1). The green edges indicate that the connection is bi-directional (host1<-->host2). The gray host in the top right corner is the host that the script was initially executed on.|
|:-:|
---
|![A graph visualizing the relation between systems using SSH](tools/SSH-Snake-dot-circo.png)The blue nodes indicate the _destination_ can connect to itself (user@host<-->user@host). The red edges indicate that the connection is bi-directional (user1@host1<-->user2@host2).|
|:-:|
# Using and Running SSH-Snake
SSH-Snake can either be downloaded or piped into bash:
```bash
wget https://raw.githubusercontent.com/MegaManSec/SSH-Snake/main/Snake.nocomments.sh
bash ./Snake.nocomments.sh
```
or
```bash
curl https://raw.githubusercontent.com/MegaManSec/SSH-Snake/main/Snake.nocomments.sh | bash
```
# About SSH-Snake
SSH-Snake seamlessly emulates what a human adversary would do to discover SSH private keys and destinations where they can be used to connect to. Written entirely in Bash, it operates with a minimal set of dependencies commonly available on major Linux (and MacOS) systems: `bash`, `ssh`, `coreutils`, `awk`, `uniq`, `sort`, `grep`, `tr`, `find`, and `cat`. `getent` OR `dscacheutil` is required. `sed` is required for only the very first system. Likewise, `sudo`, `hostname`, `ip`, `timeout`, `arp`, `ifconfig`, `ipconfig`, and `xargs` may also be used, but they are not required (and the script gracefully handles cases where they are not present). If a system is discovered without any of the required packages, it gracefully fails, alerting the user that the scan could not continue on that particular system (and backtracks, continuing from the previous system.)
SSH-Snake is completely fileless: after the user runs the script, it is passed to destinations' bash via stdin and bash arguments (via SSH). No material evidence of the script exists on any of the systems scanned: the only evidence of the script running is in the process tree, and the substantial amount of invalid SSH attempts which will inevitably occur.
SSH-Snake takes a [depth-first approach](https://en.wikipedia.org/wiki/Depth-first_search) to discovery: once it connects to one system, it tries to connect further from that system before backtracking.
The name SSH-Snake comes from the fact that the output of the script looks like a snake slithering up and down the network. However unlike the game Snake, SSH-Snake will not die when it bites its own tail (connects to a systems it has already scanned or is currently scanning): it will simply print how it connected there as normal, but return and not re-scan the destination (in order to avoid infinite recursion).
SSH-Snake has been tested on various flavors of Linux, and MacOS (with Homebrew Bash installed). If you encounter a Linux-based OS it isn't compatible with, please submit a report.
# Features
- Recursively SSH from one system to another using local SSH private keys,
- Fileless traversal and propogation/replication of the SSH-Snake script using only stdin and bash arguments to remote systems,
- Automatic elevation of privileges to root using sudo if possible,
- Discover SSH private key files from `.bash_history` entries,
- Discover SSH private keys from commonly used files and folders,
- Exfiltration SSH private keys as output of the script,
- Configurable custom command execution on each system,
- Plug-and-play modular system to discover private keys and systems,
- Detect hosts from IP ranges, last logins, known hosts, SSH config files, and more,
- Ability to detect when a system has already been scanned or is in the process of being scanned such that a network like A->B->C is able to also discover C->A but does not regress to A->B->C-A->B->C->A->B->....,
- Ability to generate graphical visulizations of a network from the output of the script,
- ... and more.
# Settings
SSH-Snake comes with some general settings that can be configured. These settings are documented in [SETTINGS.md#general-settings](SETTINGS.md#general-settings).
SSH-Snake also comes with a variety configurable/plug-and-play strategies (functions) which can be used to discover SSH private keys on a system and discover hosts and destinations to attempt to connect to. Sane defaults have been provided, however if you want to perform a scan as thoroughly as possible, then enabling more discovery techniques can help. If a scan is taking a long time, disabling some discovery techniques can help. With the exception of one strategy (`find_ssh_keys`), each of the strategies can be toggled off/on. These are documented in [SETTINGS.md#configurable-discovery-strategies](SETTINGS.md#configurable-discovery-strategies).
# Understanding Output
The raw output of SSH-Snake contains a mix of infomation about discovered private keys, destinations, and error messages.
A detailed explanation on the full output of SSH-Snake can be found in [OUTPUT.md](OUTPUT.md).
# Visualizing System Relationships
The output of SSH-Snake can be used to create graphs/visualizations of the network that the script traverses.
A detailed explanation on how to create and interpret images/visualizations from the output of SSH-Snake can be found in [GRAPHICS.md](GRAPHICS.md).
# Other Tools
In addition to the ability to create visualizations of the network that SSH-Snake traverses, three other tools are provided. Namely:
1. `forward-lookup-host.py`: Given a source host or destination, determine all of the systems that can be accessed either directly or indirectly (i.e. through a tertiary system).
2. `reverse-lookup-host.py`: Given a destination host or destination, determine all of the systems that can either directly or indirectly access it.
3. `shortest-path-create-chain.py`: Given host or destination A and B, determine the shortest path connecting the two.
The third tool also generates a command that can be used to connect from destination A to destination B. For example:
```
$ python3 tools/shortest-path-create-chain.py --file output.log --src 'jrogers@10.2.3.4' --dest 'root@10.25.49.1'
Shortest path from jrogers@10.2.3.4 to root@10.25.49.1: jrogers@10.2.3.4->user@10.44.39.21->user@10.19.29.54->root@10.25.49.1
[..]
ssh -i "/home/jrogers/.ssh/key" user@10.44.39.21 'sudo ssh -i "/root/.ssh/id_rsa" user@10.19.29.54 'ssh -i "/tmp/key" root@10.25.49.1''
```
# Snake.sh vs Snake.nocomments.sh
Since the script is quite large, loading the script into a here-document (which it does automatically because the script it actually [a Quine](https://en.wikipedia.org/wiki/Quine_(computing))) [causes bash to write to a temporary file](https://joshua.hu/more-fun-with-bash-ssh-and-ssh-keygen-version-differences) (as it is greater than 65535-bytes).
To cut down on the size such that it remains 100% fileless, Snake.nocomments.sh has a version with all comments, unnecessary white-spaces, and blank lines removed. This cuts the file's size down such that the temporary file is not created by bash.
# Bugs / Issues
If you encounter any bugs or issues related to the script, please report them as a GitHub issue. Please include your configuration setings.
I am particually interested in any interesting `[line]` outputs associated with errors that haven't been caught by the script.
# Limitations
- IPv4 Only: Like all of the best programs, the script does not support IPv6. I can't imagine there will be support for this anytime soon.
- Port 22 Only: There is a general assumption that SSH is running on port 22.
- GNU coreutils: The script relies heavily on GNU coreutils. I have not determined how much (if any) GNU-ism is used in the script.
- The script does not currently look for SSH agent sockets.

View File

@ -1,330 +0,0 @@
# General Settings
### ignore_user
Default: 0.
If set to 1, the script will consider a system already scanned when one user has been accessed. For example, if `user1@host` has been scanned and the script makes its way to `user2@host` somehow, a repeated scan will not occur. This may be useful in an environment where sudo is accessible by every user (because `user1@host` can already access the keys that `user2@host` can access).
## use_sudo
Default: 1
If set to 1, the script will attempt to use `sudo` to elevate its privileges. If it is successful, the script runs as root; if it isn't, the script runs as the normal user.
## ssh_timeout
Default: 3
The connection timeout (in seconds) for SSH connections __and DNS resolution__. See `ssh_config(5)`'s _ConnectTimeout_.
## retry_count
Default: 3
In some cases, a __recoverable__ error may be encountered while using SSH. This number corresponds to the maximum amount of times a destination with a recoverable error should be tried again. It is advised to be at least 1.
## ignored_users
Default: ()
A list of usernames that are always ignored when attempting to SSH to another system. For example, if "root" is ignored, there will be no attempts to SSH into the root user of any host.
## ignored_hosts
Default: ()
A list of hosts (ip addresses or hostnames) that are always ignored/skipped when attempting to SSH to another system. It is generally safest to specify the hostname in ip address form.
## ignored_dests
Default: ()
A list of destinations in the form of `username@hostname` that are always ignored. It is generally safest to specify the hostname in ip address form.
## ignored_key_files
Default: ("\*badcert.pem\*" "\*badkey.pem\*")
A list of locations that are ignored when searching for SSH private keys. This setting supports globbing/wildcards using the standard asterisk as in any other bash script. For example, to reject just the filename "file.name", you would include "\*/file.name" in the list. Also note that for example, "/dir/\*/file" will also match "/dir/dir2/dir3/file".
## custom_cmds
Default: ()
A list of commands that should be run when the script has been initialized on each system. The output of these commands are printed as base64 strings (including stderr). Note: these commands will only ever run once as they are executed right after checking that the system has not already been scanned.
This list also supports sudo (if available), and can be used by using `${s}` as a literal. For example, `custom_cmds=('${s} cat /etc/shadow')`. If `${s}` is not specified, the command will __not__ run as sudo even if `use_sudo=1`.
---
# Configurable Discovery Strategies
SSH-Snake comes with various configurable strategies (functions) which can be used to discover SSH private keys on a system and discover hosts and destinations to attempt to connect to. Sane defaults have been provided, however if you want to perform a scan as thoroughly as possible, then enabling more discovery techniques can help. With the exception of one strategy (`find_ssh_keys`), each of these strategies can be toggled off/on. Below are details of each of the strategies.
Detailed technical explanations of how some of these strategies work can be found in [this blog post](https://joshua.hu/ssh-snake-ssh-network-traversal-discover-ssh-private-keys-network-graph).
## SSH Private Key Discovery Strategies
The following strategies are used to discover any private keys on the system. We use these strategies over, say, checking every single file on the system, because it would be prohibitively expensive to open and parse every file on the system. Instead, the following strategies can be used to provide hints towards the location of private keys.
### find_ssh_keys
Checks every readable file within the `.ssh/` folder in every home folder of the system (identified using `getent passwd` and `/home/*/`. This strategy is not optional.
### scan_paths / scan_paths_depth
Using the `scan_paths` and `scan_paths_depth` user-setting, the script uses `find(1)` to search each of the locations specified by `scan_paths` for keys. A maximum depth for searching directories is specified using `scan_paths_depth` (equivalent to `find $location -maxdepth $scan_paths_depth`). Multiple locations may be specified.
For example, `scan_paths=("/root/" "/var/*/")` and `scan_paths_depth=3` will look for look for keys in `/root/*/*/*` and `/var/*/*/*/*`.
If `scan_paths` is left empty (`scan_paths=()`) or `scan_paths_depth` is less than 1, this strategy does nothing. The default value is () and 3 respectively.
## SSH Host Discovery Strategies
The following strategies are used to discover potential _hosts_ which the script will SSH to. _Hosts_ correspond to either a hostname or an ip address: they do not constitute a destination that SSH will use in of itself, since SSH is missing a username that corresponds to the host.
Since hosts do not correspond to destinations, it is necessary for hosts to somehow be combined with usernames to actually be useful. Therefore, all "host discovery strategies" are disabled unless either:
1. `use_combinate_interesting_users_hosts` is enabled and there is at least one entry in _interesting_users_,
2. `use_combinate_users_hosts_aggressive` is enabled.
`use_combinate_interesting_users_hosts` will combine all of the _interesting_users_ with all of the hosts discovered to create destinations, and `use_combinate_users_hosts_aggressive` will combine all users discovered with all of the hosts discovered to creation destinations. That process is described in [combinatorial_destination_discovery_strategies](#combinatorial-destination-discovery-strategies).
### use_find_from_hosts
By parsing `/etc/hosts` (or more correctly, running `getent ahostsv4`), extra hosts may be discovered.
This strategy may be toggled off/on with 0/1. The default value is 1.
### use_find_arp_neighbours
This function adds all of the neighbour hosts from the arp table to the list of hosts.
This strategy may be toggled off/on with 0/1. The default value is 1.
### use_find_d_block
This function takes the current host's address(es) and adds the all d-block addresses into the list of hosts. For example, if the current host has the address 10.0.0.5, this function will add the 10.0.0.0-10.0.0.255 hosts.
This strategy may be toggled off/on with 0/1. The default value is 0.
## SSH Destination Discovery Strategies
In the context of this script, a "destination" (or "dest") means a username and host combination; the destination that `ssh` will attempt to connect to (`ssh user@host`). Without destinations, there is nowhere for the script to attempt to SSH to. These strategies are used to discover potential destinations that will be SSH'd to.
Note that for each of these destinations, the username is also loaded into a collection of usernames, and the hosts are loaded into a collection of hosts. If `use_combinate_users_hosts_aggressive` or `use_combinate_interesting_users_hosts` are enabled, they will use these usernames and hosts to create destinations.
### use_find_from_authorized_keys
`authorized_keys` files may include ip-based restrictions for key usage such as `from="10.0.0.1,10.2.3.3" ssh-rsa ...`.
This strategy adds any hosts discovered in the `from` directive of `authorized_keys` file to our list of destinations using `$user@$host`, where `$user` is the username corresponding to the location where the `authorized_keys` file was found.
This strategy may be toggled off/on with 0/1. The default value is 1.
### use_find_from_last
This strategy checks the last logins to the system by using `last`, and extracts the addresses the logins came from. The strategy then naively assumes that the destination username of that SSH access also corresponds to the source username, adding the `$destination_username@$source_address` to the list of destinations.
This strategy may be toggled off/on with 0/1. The default value is 1.
### use_find_from_prev_dest
This strategy takes the destination that we are connecting _from_ and adds it to the list of destinations.
For example, consider the chain `user@system_a->user@system_b->user@system_c`. Using this strategy, `user@system_b` will try to connect to `user@system_a`. `user@system_c` will then try to connect to `user@system_b`.
This strategy may be toggled off/on with 0/1. The default value is 1.
### use_find_from_known_hosts
`known_hosts` files contain a list of the hosts a user has previously SSH'd into, and can be a wealth of knowledge for discovering hosts. For example: `# 2048 MD5:32:41:b4:e7:3e:d7:ee:a4:3a:c3:a8:44:40:45:16:04 10.0.0.1 (RSA)`.
This function extracts the `10.0.0.1` host. Likewise, we add `$user@$host` to the list of destinations, where `$user` is the username corresponding to the location where the `known_hosts` file was found.
Incidentally, this function also extracts users, hosts, and destinations from `authorized_keys` files which _may_ share a similar format like `# 2048 MD5:62:38:9a:f0:6d:e7:57:57:25:09:71:4d:c7:bb:4b:b0 root@system (RSA)`. This function will extract `root@system`.
This strategy may be toggled off/on with 0/1. The default value is 1.
### use_find_from_hashed_known_hosts
`known_hosts` files contain a list of hosts that a user has previously connected to with SSH. However, SSH offers an option _HashKnownHosts_ which is used to hash the entries of the hosts in this file such that they cannot easily be read. This is the default on most Debian-based operating systems.
For example, a user that has has _HashKnownHosts_ enabled when running `ssh 192.168.1.1` will have an entry in their `known_hosts` file similar to this: `|1|e77JRypO4qWElXpIaBGiFLOJBXg=|HBu6N6IGFeOz5wt0HFXz9/hp/wY= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIClRF2LjL1EJNfEYAKpr9rENgZVFlH7jtEPla0x3hakB`
Here, `|1|e77JRypO4qWElXpIaBGiFLOJBXg=|HBu6N6IGFeOz5wt0HFXz9/hp/wY=` corresponds to a hash of the host `192.168.1.1`. Hashing is a one-way procedure, however it is possible to brute-force this hash using `ssh-keygen`:
```
$ ssh-keygen -F 192.168.1.1
# Host 192.168.1.1 found: line 58
|1|96KUSpeaZrkYrbQhhjFLF/jJ15w=|xMX7qNROy8SwPZK1zEjrlEeYU24= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIClRF2LjL1EJNfEYAKpr9rENgZVFlH7jtEPla0x3hakB
```
When `use_find_from_hashed_known_hosts` is enabled, we attempt to brute-force all of the ip addresses of the c and d blocks of the current system. For example, if we are currently on `user@85.82.81.80` and we discover hashed known hosts, we will attempt to discover them by checking whether the hash corresponds to any of the hosts `85.82.0.0-85.82.255.255`. If any of the hashes are cracked, we add `$user@$host` to the list of destinations, where `$user` is the username corresponding to the location where the `known_hosts` file was found.
Note that this strategy is _extremely_ slow and for each `known_hosts` file may take many minutes. Some performance testing yielded the following time taken per `known_hosts` file:
```
# xargs available: 2m42.820s
# no xargs available: 7m52.145s
# xargs available using sudo: 3m56.659s
# no args available using sudo for-loop: 15m36.738s
```
Unlike the rest of the script, if `use_sudo` is enabled, sudo will not actually be used unless it is completely necessary (i.e. the `known_hosts` file cannot be read by the current user).
This strategy may be toggled off/on with 0/1. The default value is 0.
### use_find_from_ignore_list
At any point in time, the so-called "ignore list" contains a list of destinations which have previously been successfully accessed and scanned. This strategy takes this list and adds all of those destinations to the list of destinations to connect to. There are two different ways this strategy can be used.
When `use_find_from_ignore_list=1`, the script will parse the ignore list when the script _starts_ and connect to any destinations which have _previously_ been connected to.
When `use_find_from_ignore_list=2`, the script will do the same as above, but also parse the ignore list when the script _finishes_, re-trying with any newly added destinations on the ignore list.
`use_find_from_ignore_list=0` disables this function completely. The default value is 0.
### use_retry_all_dests
The 2nd option from the `use_find_from_ignore_list` strategy is slightly flawed. Consider the following:
```
A->B->C ; Normal scan
A->D->C ; A->D discovered naturally, D->C discovered using use_find_from_ignore_list=1 or use_find_from_ignore_list=2.
A->C ; A->C discovered using use_find_from_ignore_list=2.
```
It is possible that C->D could also exist. However, this link will not be discovered because destination D was first discovered after C. Since C has already been scanned, the script will not scan it again, losing the valuable data of C->D.
In order to discover every possible combination of connected systems, `use_retry_all_hosts` takes a different approach. Once the whole scan is completely finished (i.e. the script the user is running), the scan simply repeats itself but adds all of the previously discovered destinations to `interesting_dests`, ensuring that every single destination will try every other destination.
On the re-run, we do NOT attempt to discover any NEW users/hosts/destinations, only discover keys. This means that although new chains may be discovered, no new destinations will be discovered. In fact, the function to add new users, hosts, and destinations is noop'd during the re-run, so it is not possible for new destinations to be discovered at all.
This strategy may be toggled off/on with 0/1. The default value is 1.
## Both SSH Private Key and Destination Discovery Strategies
Some of these strategies can be used to find both private keys and destinations. Both of these strategies are generally advised to be kept enabled, as they are the most natural resource for finding how SSH has been used on the system (and therefore where we can find keys and where they connect to easily).
### use_find_from_bash_history
`.bash_history` files are a jackpot/wealth of information when it comes to SSH private keys and especially destinations. By parsing `.bash_history` files, we can see exactly how users are utilizing the `ssh`, `scp`, and `rsync` binaries, and determine where they have been connecting to and with which keys.
Parsing each bash_history line, we look at all calls to `ssh`, `scp`, and `rsync` and extract the following:
1. Usernames,
2. Hosts,
3. Destinations,
4. Key Files.
For `ssh`, `scp`, and `rsync`, we extract any destinations in the form `user@host`.
For `ssh` and `scp` specifically, we parse and extract:
1. The location of any key files which have been passed with the `-i` parameter: `-i /absolute/key_file`, `-i ~/expanded/key_file`, or `-i relative/key_file`. In the middle case, we expand the `~` to the home directory of the user corresponding to where the `.bash_history` file was found. In the latter case, we also assume the location corresponds to the relative location based on the home directory of the user corresponding to the `.bash_history file`. Likewise, all cases `-i/absolute/key_file`, `-i~/expanded/key_file`, and `-irelative/key_file` are also extracted.
2. Any username of any remote destinations that have been passed with the `-l` parameter (see `man(1)`).
3. Any hosts of any remote destination
4. Any destinations.
For example, this strategy is able to extract the following (_note: this list is not exhaustive and these are just some examples. the `use_find_from_bash_history` function is complicated and can hopefully handle all legitimate usage of ssh and scp_):
```
ssh user@host ; extract user@host as a destination
scp file user@host:~/ ; extract user@host as a destination
scp user@host:~/file ./ ; extract user@host as a destination
rsync -a * user@host:~/ ; extract user@host as a destination
scp file host:~/ ; extract host, and assume $user@host as a destination
scp host:~/file ./ ; extract host, and assume $user@host as a destination
ssh -i.ssh/id_rsa host ; extract .ssh/id_rsa and host, assume $user@host as a destination
ssh -i .ssh/id_rsa host ; extract .ssh/id_rsa and host, assume $user@host as a destination
ssh -luser host ; extract user, extract user@host as a destination
ssh -i /tmp/key host -luser ps ; extract /tmp/key and user@host as a destination
ssh host -v 'bash -c ls' ; extract host, assume $user@host as a destination
sssh -D 9000 localhost -luser ; extract user@localhost as a destination
ssh -i key_file -v -luser host ps ; extract key_file and extract user@host as a destination
```
This strategy may be toggled off/on with 0/1. The default value is 1.
### use_find_from_ssh_config
By parsing every readable file in`.ssh/` folders, we may encounter `ssh_config` files. These files generally look something like this:
```
Host example.com
Hostname example.com
User your_username
IdentityFile ~/.ssh/id_rsa
```
We parse this file and extract the `IdentityFile` for the location of a private key. We also extract the `Host`, `Hostname`, and `User`.
Unfortunately at the moment, this function is unable to generate individual destinations as it naively parses the file line-by-line, rather than block-by-block. Future versions will be able to identify the destination that the block corresponds to.
This strategy may be toggled off/on with 0/1. The default value is 1.
## Combinatorial Destination Discovery Strategies
Each time a system is scanned, various individual usernames, hosts, and destinations will be discovered which can point towards other destinations. However, if usernames and hosts are discovered in a context that doesn't necessarily result in a definitive full destination being discovered, this data is effectively unused. That's where combinatorial destination discovery strategies come in.
### combinate_interesting_users_hosts
This strategy takes pre-defined usernames, hosts, and destinations, and combinates them with their respective others to form destinations.
All `interesting_users` will be combined with all of the hosts that are discovered on the system to form destinations.
All `interesting_hosts` will be combined with all of the usernames that are discovered on the system to form destinations.
All `interesting_users` will be combined with all of the `interesting_hosts` to form destinations.
All `interesting_dests` will be used to form destinations, and can be used to force every system to attempt to SSH into specific destinations with every key.
This strategy may be toggled off/on with 0/1, or with empty `interesting_users=()`, `interesting_hosts=()`, `interesting_dests()` values. The default values are 1, (), ("$USER" "root"), and () respectively.
### use_combinate_users_hosts_aggressive
Every single username discovered is combined with every single host discovered to form destinations.
This strategy will result in massive growth of attempted destinations; for example, 100 usernames discovered on a system along with 100 hosts will result in 10,000 destinations. Use this with caution.
This strategy may be toggled off/on with 0/1. The default value is 0.
# Alternative Settings
In some parts of the world, it is common to simply look for any SSH private keys in `.ssh/` folders and try to SSH into every address in the d-block of the system which the key was found. The below settings imitate a similar strategy. That is to say, the below settings ensure that the script only looks for nearby hosts in the d-block, arp neighbours, and `/etc/hosts`, and attempts to SSH into each of those hosts with the username `root` and the username which the system started with (`$USER` evaluates to the username that has been SSH'd into on each destination).
```
interesting_users=("$USER" "root")
interesting_hosts=("127.0.0.1")
interesting_dests=()
use_combinate_interesting_users_hosts=1
use_combinate_users_hosts_aggressive=0
use_retry_all_dests=1
scan_paths_depth=3
use_find_from_hosts=1
use_find_arp_neighbours=1
use_find_d_block=1
ignored_key_files=("*badcert.pem*" "*badkey.pem*")
use_sudo=1
ssh_timeout=3
retry_count=3
ignore_user=0
ignored_users=()
ignored_hosts=()
ignored_dests=()
custom_cmds=()
scan_paths=()
use_find_from_authorized_keys=0
use_find_from_last=0
use_find_from_prev_dest=0
use_find_from_known_hosts=0
use_find_from_hashed_known_hosts=0
use_find_from_ignore_list=0
use_find_from_ssh_config=0
use_find_from_bash_history=0
```

File diff suppressed because it is too large Load Diff

2268
Snake.sh

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,229 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata></metadata>
<defs>
<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
<font-face units-per-em="1200" ascent="960" descent="-240" />
<missing-glyph horiz-adv-x="500" />
<glyph />
<glyph />
<glyph unicode="&#xd;" />
<glyph unicode=" " />
<glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" />
<glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" />
<glyph unicode="&#xa0;" />
<glyph unicode="&#x2000;" horiz-adv-x="652" />
<glyph unicode="&#x2001;" horiz-adv-x="1304" />
<glyph unicode="&#x2002;" horiz-adv-x="652" />
<glyph unicode="&#x2003;" horiz-adv-x="1304" />
<glyph unicode="&#x2004;" horiz-adv-x="434" />
<glyph unicode="&#x2005;" horiz-adv-x="326" />
<glyph unicode="&#x2006;" horiz-adv-x="217" />
<glyph unicode="&#x2007;" horiz-adv-x="217" />
<glyph unicode="&#x2008;" horiz-adv-x="163" />
<glyph unicode="&#x2009;" horiz-adv-x="260" />
<glyph unicode="&#x200a;" horiz-adv-x="72" />
<glyph unicode="&#x202f;" horiz-adv-x="260" />
<glyph unicode="&#x205f;" horiz-adv-x="326" />
<glyph unicode="&#x20ac;" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" />
<glyph unicode="&#x2212;" d="M200 400h900v300h-900v-300z" />
<glyph unicode="&#x2601;" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86t85 208q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" />
<glyph unicode="&#x2709;" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" />
<glyph unicode="&#x270f;" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" />
<glyph unicode="&#xe000;" horiz-adv-x="500" d="M0 0z" />
<glyph unicode="&#xe001;" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" />
<glyph unicode="&#xe002;" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q17 -55 85.5 -75.5t147.5 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" />
<glyph unicode="&#xe003;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" />
<glyph unicode="&#xe005;" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" />
<glyph unicode="&#xe006;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" />
<glyph unicode="&#xe007;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" />
<glyph unicode="&#xe008;" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" />
<glyph unicode="&#xe009;" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" />
<glyph unicode="&#xe010;" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" />
<glyph unicode="&#xe011;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 450v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5z" />
<glyph unicode="&#xe012;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5z" />
<glyph unicode="&#xe013;" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" />
<glyph unicode="&#xe014;" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" />
<glyph unicode="&#xe015;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" />
<glyph unicode="&#xe016;" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 299q-120 -77 -261 -77q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" />
<glyph unicode="&#xe017;" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" />
<glyph unicode="&#xe018;" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" />
<glyph unicode="&#xe019;" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73zM385 601 q0 88 63 151t152 63t152 -63t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152z" />
<glyph unicode="&#xe020;" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" />
<glyph unicode="&#xe021;" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" />
<glyph unicode="&#xe022;" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" />
<glyph unicode="&#xe023;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" />
<glyph unicode="&#xe024;" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" />
<glyph unicode="&#xe025;" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" />
<glyph unicode="&#xe026;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" />
<glyph unicode="&#xe027;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" />
<glyph unicode="&#xe028;" d="M0 25v475l200 700h800q199 -700 200 -700v-475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" />
<glyph unicode="&#xe029;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" />
<glyph unicode="&#xe030;" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" />
<glyph unicode="&#xe031;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" />
<glyph unicode="&#xe032;" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" />
<glyph unicode="&#xe033;" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" />
<glyph unicode="&#xe034;" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" />
<glyph unicode="&#xe035;" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" />
<glyph unicode="&#xe036;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" />
<glyph unicode="&#xe037;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" />
<glyph unicode="&#xe038;" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" />
<glyph unicode="&#xe039;" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" />
<glyph unicode="&#xe040;" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" />
<glyph unicode="&#xe041;" d="M1 700v475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" />
<glyph unicode="&#xe042;" d="M2 700v475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" />
<glyph unicode="&#xe043;" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" />
<glyph unicode="&#xe044;" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" />
<glyph unicode="&#xe045;" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" />
<glyph unicode="&#xe046;" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" />
<glyph unicode="&#xe047;" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" />
<glyph unicode="&#xe048;" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v70h471q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" />
<glyph unicode="&#xe049;" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" />
<glyph unicode="&#xe050;" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " />
<glyph unicode="&#xe051;" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" />
<glyph unicode="&#xe052;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
<glyph unicode="&#xe053;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
<glyph unicode="&#xe054;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600 q-21 0 -35.5 15t-14.5 35z" />
<glyph unicode="&#xe055;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" />
<glyph unicode="&#xe056;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" />
<glyph unicode="&#xe057;" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100 q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100z" />
<glyph unicode="&#xe058;" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" />
<glyph unicode="&#xe059;" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" />
<glyph unicode="&#xe060;" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " />
<glyph unicode="&#xe062;" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" />
<glyph unicode="&#xe063;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" />
<glyph unicode="&#xe064;" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 138.5t-64 210.5zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" />
<glyph unicode="&#xe065;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" />
<glyph unicode="&#xe066;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" />
<glyph unicode="&#xe067;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l566 567l-136 137l-430 -431l-147 147z" />
<glyph unicode="&#xe068;" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" />
<glyph unicode="&#xe069;" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
<glyph unicode="&#xe070;" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
<glyph unicode="&#xe071;" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" />
<glyph unicode="&#xe072;" d="M200 0l900 550l-900 550v-1100z" />
<glyph unicode="&#xe073;" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
<glyph unicode="&#xe074;" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
<glyph unicode="&#xe075;" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" />
<glyph unicode="&#xe076;" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" />
<glyph unicode="&#xe077;" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" />
<glyph unicode="&#xe078;" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" />
<glyph unicode="&#xe079;" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" />
<glyph unicode="&#xe080;" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" />
<glyph unicode="&#xe081;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" />
<glyph unicode="&#xe082;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM300 500h600v200h-600v-200z" />
<glyph unicode="&#xe083;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141z" />
<glyph unicode="&#xe084;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" />
<glyph unicode="&#xe085;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM363 700h144q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5q19 0 30 -10t11 -26 q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-105 0 -172 -56t-67 -183zM500 300h200v100h-200v-100z" />
<glyph unicode="&#xe086;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" />
<glyph unicode="&#xe087;" d="M0 500v200h194q15 60 36 104.5t55.5 86t88 69t126.5 40.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200 v-206q149 48 201 206h-201v200h200q-25 74 -76 127.5t-124 76.5v-204h-200v203q-75 -24 -130 -77.5t-79 -125.5h209v-200h-210z" />
<glyph unicode="&#xe088;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" />
<glyph unicode="&#xe089;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" />
<glyph unicode="&#xe090;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" />
<glyph unicode="&#xe091;" d="M0 547l600 453v-300h600v-300h-600v-301z" />
<glyph unicode="&#xe092;" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" />
<glyph unicode="&#xe093;" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" />
<glyph unicode="&#xe094;" d="M104 600h296v600h300v-600h298l-449 -600z" />
<glyph unicode="&#xe095;" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" />
<glyph unicode="&#xe096;" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" />
<glyph unicode="&#xe097;" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" />
<glyph unicode="&#xe101;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-33 14.5h-207q-20 0 -32 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" />
<glyph unicode="&#xe102;" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111v6t-1 15t-3 18l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6h-111v-100z M100 0h400v400h-400v-400zM200 900q-3 0 14 48t35 96l18 47l214 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" />
<glyph unicode="&#xe103;" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" />
<glyph unicode="&#xe104;" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" />
<glyph unicode="&#xe105;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" />
<glyph unicode="&#xe106;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" />
<glyph unicode="&#xe107;" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 33 -48 36t-48 -29l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" />
<glyph unicode="&#xe108;" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -21 -13 -29t-32 1l-94 78h-222l-94 -78q-19 -9 -32 -1t-13 29v64 q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" />
<glyph unicode="&#xe109;" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" />
<glyph unicode="&#xe110;" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" />
<glyph unicode="&#xe111;" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" />
<glyph unicode="&#xe112;" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" />
<glyph unicode="&#xe113;" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" />
<glyph unicode="&#xe114;" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" />
<glyph unicode="&#xe115;" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" />
<glyph unicode="&#xe116;" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" />
<glyph unicode="&#xe117;" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" />
<glyph unicode="&#xe118;" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" />
<glyph unicode="&#xe119;" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" />
<glyph unicode="&#xe120;" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" />
<glyph unicode="&#xe121;" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" />
<glyph unicode="&#xe122;" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM99 500v250v5q0 13 0.5 18.5t2.5 13t8 10.5t15 3h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35q-56 337 -56 351z M1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" />
<glyph unicode="&#xe123;" d="M74 350q0 21 13.5 35.5t33.5 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-22 -9 -63 -23t-167.5 -37 t-251.5 -23t-245.5 20.5t-178.5 41.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" />
<glyph unicode="&#xe124;" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" />
<glyph unicode="&#xe125;" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q123 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 212l100 213h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" />
<glyph unicode="&#xe126;" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q123 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" />
<glyph unicode="&#xe127;" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" />
<glyph unicode="&#xe128;" d="M-101 651q0 72 54 110t139 37h302l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 16.5 -10.5t26 -26t16.5 -36.5v-526q0 -13 -85.5 -93.5t-93.5 -80.5h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l106 89v502l-342 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM999 201v600h200v-600h-200z" />
<glyph unicode="&#xe129;" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6v7.5v7v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" />
<glyph unicode="&#xe130;" d="M1 585q-15 -31 7 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85l-1 -302q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM76 565l237 339h503l89 -100v-294l-340 -130 q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" />
<glyph unicode="&#xe131;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 500h300l-2 -194l402 294l-402 298v-197h-298v-201z" />
<glyph unicode="&#xe132;" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l400 -294v194h302v201h-300v197z" />
<glyph unicode="&#xe133;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" />
<glyph unicode="&#xe134;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" />
<glyph unicode="&#xe135;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -34 5.5 -93t7.5 -87q0 -9 17 -44t16 -60q12 0 23 -5.5 t23 -15t20 -13.5q20 -10 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55.5t-20 -57.5q12 -21 22.5 -34.5t28 -27t36.5 -17.5q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q101 -2 221 111q31 30 47 48t34 49t21 62q-14 9 -37.5 9.5t-35.5 7.5q-14 7 -49 15t-52 19 q-9 0 -39.5 -0.5t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q8 16 22 22q6 -1 26 -1.5t33.5 -4.5t19.5 -13q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5 t5.5 57.5q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 41 1 44q31 -13 58.5 -14.5t39.5 3.5l11 4q6 36 -17 53.5t-64 28.5t-56 23 q-19 -3 -37 0q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -46 0t-45 -3q-20 -6 -51.5 -25.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79zM518 915q3 12 16 30.5t16 25.5q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -18 8 -42.5t16.5 -44 t9.5 -23.5q-6 1 -39 5t-53.5 10t-36.5 16z" />
<glyph unicode="&#xe136;" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" />
<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" />
<glyph unicode="&#xe138;" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" />
<glyph unicode="&#xe139;" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" />
<glyph unicode="&#xe140;" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" />
<glyph unicode="&#xe141;" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM513 609q0 32 21 56.5t52 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-16 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5q-37 0 -62.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" />
<glyph unicode="&#xe142;" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -79.5 -17t-67.5 -51l-388 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23q38 0 53 -36 q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60l517 511 q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" />
<glyph unicode="&#xe143;" d="M79 784q0 131 99 229.5t230 98.5q144 0 242 -129q103 129 245 129q130 0 227 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100l-84.5 84.5t-68 74t-60 78t-33.5 70.5t-15 78z M250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-106 48.5q-73 0 -131 -83l-118 -171l-114 174q-51 80 -124 80q-59 0 -108.5 -49.5t-49.5 -118.5z" />
<glyph unicode="&#xe144;" d="M57 353q0 -94 66 -160l141 -141q66 -66 159 -66q95 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-12 12 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141l19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -18q46 -46 77 -99l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" />
<glyph unicode="&#xe145;" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" />
<glyph unicode="&#xe146;" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" />
<glyph unicode="&#xe148;" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335l-27 7q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5v-307l64 -14 q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5zM700 237 q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" />
<glyph unicode="&#xe149;" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -11 2.5 -24.5t5.5 -24t9.5 -26.5t10.5 -25t14 -27.5t14 -25.5 t15.5 -27t13.5 -24h242v-100h-197q8 -50 -2.5 -115t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q32 1 102 -16t104 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10 t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5t-30 142.5h-221z" />
<glyph unicode="&#xe150;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" />
<glyph unicode="&#xe151;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" />
<glyph unicode="&#xe152;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" />
<glyph unicode="&#xe153;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" />
<glyph unicode="&#xe154;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" />
<glyph unicode="&#xe155;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" />
<glyph unicode="&#xe156;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" />
<glyph unicode="&#xe157;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" />
<glyph unicode="&#xe158;" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" />
<glyph unicode="&#xe159;" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" />
<glyph unicode="&#xe160;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" />
<glyph unicode="&#xe161;" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" />
<glyph unicode="&#xe162;" d="M216 519q10 -19 32 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8l9 -1q13 0 26 16l538 630q15 19 6 36q-8 18 -32 16h-300q1 4 78 219.5t79 227.5q2 17 -6 27l-8 8h-9q-16 0 -25 -15q-4 -5 -98.5 -111.5t-228 -257t-209.5 -238.5q-17 -19 -7 -40z" />
<glyph unicode="&#xe163;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " />
<glyph unicode="&#xe164;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" />
<glyph unicode="&#xe165;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" />
<glyph unicode="&#xe166;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" />
<glyph unicode="&#xe167;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" />
<glyph unicode="&#xe168;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" />
<glyph unicode="&#xe169;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 401h700v699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" />
<glyph unicode="&#xe170;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l248 -237v700h-699zM900 150h100v50h-100v-50z" />
<glyph unicode="&#xe171;" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" />
<glyph unicode="&#xe172;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" />
<glyph unicode="&#xe173;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" />
<glyph unicode="&#xe174;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" />
<glyph unicode="&#xe175;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" />
<glyph unicode="&#xe176;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" />
<glyph unicode="&#xe177;" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" />
<glyph unicode="&#xe178;" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" />
<glyph unicode="&#xe179;" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -117q-25 -16 -43.5 -50.5t-18.5 -65.5v-359z" />
<glyph unicode="&#xe180;" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" />
<glyph unicode="&#xe181;" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" />
<glyph unicode="&#xe182;" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q16 17 13 40.5t-22 37.5l-192 136q-19 14 -45 12t-42 -19l-119 -118q-143 103 -267 227q-126 126 -227 268l118 118q17 17 20 41.5 t-11 44.5l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" />
<glyph unicode="&#xe183;" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -15 -35.5t-35 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" />
<glyph unicode="&#xe184;" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" />
<glyph unicode="&#xe185;" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" />
<glyph unicode="&#xe186;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
<glyph unicode="&#xe187;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
<glyph unicode="&#xe188;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" />
<glyph unicode="&#xe189;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" />
<glyph unicode="&#xe190;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" />
<glyph unicode="&#xe191;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
<glyph unicode="&#xe192;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
<glyph unicode="&#xe193;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" />
<glyph unicode="&#xe194;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" />
<glyph unicode="&#xe195;" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" />
<glyph unicode="&#xe197;" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86t85 208q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300 h200l-300 -300z" />
<glyph unicode="&#xe198;" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104t60.5 178q0 121 -85 207.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" />
<glyph unicode="&#xe199;" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" />
<glyph unicode="&#xe200;" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -12t1 -11q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" />
</font>
</defs></svg>

After

Width:  |  Height:  |  Size: 61 KiB

BIN
data/.DS_Store vendored Normal file

Binary file not shown.

1571
data/networks.js Normal file

File diff suppressed because it is too large Load Diff

1596
data/styles.js Normal file

File diff suppressed because it is too large Load Diff

BIN
favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

1
images/cy3logo.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="1200"><path fill-rule="evenodd" clip-rule="evenodd" fill="#F7941E" d="M550.422 290.782c-1.929 18.994-7.456 37.375-16.326 54.261l143.954 146.989c20.593-9.925 43.002-15.439 65.961-16.236l59.945-197.528c-15.307-11.352-28.341-25.543-38.354-41.754l-215.18 54.268zm-23.997-97.716l218.266-55.049c9.794-73.383 72.698-129.678 148.337-129.678 82.635 0 149.661 67.03 149.661 149.664 0 80.584-63.738 146.32-143.525 149.538l-59.143 194.862c46.633 30.299 75.373 82.311 75.373 138.865 0 47.468-20.218 92.066-55.058 123.282l64.754 129.255c6.939-.989 13.952-1.47 20.979-1.47 82.639 0 149.662 67.027 149.662 149.665 0 82.634-67.023 149.661-149.662 149.661s-149.665-67.027-149.665-149.661c0-38.274 14.528-74.625 40.342-102.21l-67.195-134.124c-6.543.783-13.132 1.178-19.73 1.178-33.522 0-65.877-10.053-93.263-28.776l-76.083 67.009c.514 3.934.767 7.907.767 11.891 0 50.415-40.89 91.316-91.311 91.316-50.423 0-91.319-40.901-91.319-91.316 0-50.425 40.896-91.324 91.319-91.324 8.7 0 17.312 1.232 25.612 3.653l79.255-69.797c-4.035-10.729-6.928-21.852-8.652-33.19l-188.937-25.45c-25.852 48.044-76.254 78.745-131.815 78.745-82.637 0-149.661-67.029-149.661-149.661 0-82.637 67.023-149.659 149.661-149.659 72.708 0 134.096 52.147 147.114 122.061l188.905 25.453c1.258-2.536 2.582-5.04 3.969-7.512l-144.344-147.39c-18.729 8.13-38.933 12.318-59.508 12.318-82.636 0-149.663-67.025-149.663-149.662s67.027-149.663 149.663-149.663c50.722 0 97.415 25.58 124.895 67.176z"/></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

1
images/small_fit.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 154 KiB

20
index.html Normal file
View File

@ -0,0 +1,20 @@
<!doctype html><!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]--><!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]--><!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]--><!--[if gt IE 8]><!--><html class="no-js"><!--<![endif]--><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>SSH-Snake: Cytoscape Example</title><meta name="description" content="Viewer for JSON files exported from Cytoscape 3"><meta name="viewport" content="width=device-width, initial-scale=1"><!-- Place favicon.ico and apple-touch-icon.png in the root directory --><link rel="stylesheet" href="styles/dc4be20e.vendor.css"><link rel="stylesheet" href="styles/dcab8a36.main.css"><body ng-app="cyViewerApp"><!--[if lt IE 7]>
<p class="browsehappy">You are using an <strong>outdated</strong> browser. Please
<a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
<![endif]--><!-- Add your site or application content here --><div class="main" ng-view=""></div><!--[if lt IE 9]>
<script src="bower_components/es5-shim/es5-shim.js"></script>
<script src="bower_components/json3/lib/json3.min.js"></script>
<![endif]-->
<script type="text/ng-template" id="main.html">
<div id="network" ng-style="{'background-color': bg.color}"></div><div class="loading"><span us-spinner="{radius:30, width:3, length: 100}"></span></div><div class="summary" ng-show="overlayState.show"><h3>Network:</h3><select class="form-control" id="network-selector" ng-options="networkName for networkName in networkNames" ng-change="switchNetwork()" ng-model="currentNetwork"></select><h3>Visual Style:</h3><select class="form-control" id="vs-selector" ng-options="styleName for styleName in visualStyleNames" ng-change="switchVS()" ng-model="currentVS"></select><h3>Layout:</h3><select class="form-control" id="layout-selector" ng-options="layoutName for layoutName in LAYOUTS" ng-change="switchLayout()" ng-model="currentLayout"></select></div><div ng-show="browserState.show" class="table-browser"><div id="table-view"><tabset justified="true"><tab heading="Node"><table class="table table-striped table-bordered table-hover"><thead><tr><td>SUID<td ng-repeat="columnName in columnNames">{{columnName}}<tbody data-ng-repeat="node in selectedNodes"><tr><td>{{ node.id() }}<td ng-repeat="colName in columnNames">{{node.data(colName)}}</table></tab><tab heading="Edge"><table class="table table-striped table-bordered table-hover"><thead><tr><td>SUID<td ng-repeat="columnName in edgeColumnNames">{{columnName}}<tbody data-ng-repeat="edge in selectedEdges"><tr><td>{{ edge.id() }}<td ng-repeat="colName in edgeColumnNames">{{edge.data(colName)}}</table></tab></tabset></div></div><div class="home-button" ng-click="toggleToolbar()" style="clear:both" tooltip-placement="left" tooltip="Show/Hide Toolbar"><span class="glyphicon glyphicon-sort"></span></div><div class="command-bar" ng-show="toolbarState.show"><div class="icon-button" ng-click="toggleTableBrowser()" tooltip-placement="left" tooltip="Show/Hide Table"><span class="glyphicon glyphicon-list-alt"></span></div><div class="icon-button" ng-click="toggleOverlay()" tooltip-placement="left" tooltip="Show/Hide Selector"><span class="glyphicon glyphicon-info-sign"></span></div><div class="icon-button" ng-click="fit()" tooltip-placement="left" tooltip="Fit to window"><span class="glyphicon glyphicon-resize-full"></span></div><div class="icon-button" colorpicker="" colorpicker-position="left" ng-model="bg.color" tooltip-placement="left" tooltip="Set Background Color"><span class="glyphicon glyphicon-tint"></span></div></div>
</script>
<script src="data/networks.js"> </script>
<script src="data/styles.js"> </script>
<script src="scripts/65d77273.vendor.js"></script>
<script src="scripts/1d327552.scripts.js"></script>
<script src="scripts/custom.js"></script>

4
robots.txt Normal file
View File

@ -0,0 +1,4 @@
# robotstxt.org
User-agent: *
Allow: /

174
scripts/1d327552.scripts.js Normal file
View File

@ -0,0 +1,174 @@
"use strict";
angular.module("cyViewerApp", ["ngCookies", "ngResource", "ngSanitize", "ngRoute", "ngAnimate", "ui.bootstrap", "angular-underscore", "colorpicker.module", "angularSpinner"]).config(["$routeProvider", function(a) {
a.when("/", {
templateUrl: "main.html",
controller: "MainCtrl"
}).otherwise({
redirectTo: "/"
})
}]), angular.module("cyViewerApp").controller("MainCtrl", ["$scope", "$http", "$location", "$routeParams", "$window", "Network", "VisualStyles", function(a, b, c, d, e, f, g) {
function h() {
var b = angular.element(q);
b.on("dragenter", function(a) {
a.stopPropagation(), a.preventDefault()
}), b.on("dragover", function(a) {
a.stopPropagation(), a.preventDefault()
}), b.on("drop", function(b) {
b.preventDefault();
var c = b.originalEvent.dataTransfer.files,
d = c[0],
e = new FileReader;
e.onload = function(b) {
var json = b.target.result
if (!json.startsWith('{'))
json = json.substr(json.indexOf('{'))
var c = JSON.parse(json)
if (c.hasOwnProperty('format_version')){
c = {[c.data.name]: c}
}
d = null
Object.keys(c).forEach(function(name){
a.networks[name] = c[name];
if (a.networkNames.indexOf(name) === -1)
a.networkNames.push(name);
(d === null && (d = c[name], a.currentNetwork = name));
z()
}), a.cy.load(d.elements), k()
}, e.readAsText(d)
})
}
function i(b) {
a.nodes = o.elements.nodes, a.edges = o.elements.edges, m(b);
var c = o.data.name;
a.networks[c] || (a.networks[c] = o, a.networkNames.push(c), a.currentNetwork = o.data.name), j(), d.bgcolor && (a.bg.color = d.bgcolor)
}
function j() {
a.columnNames = [], a.edgeColumnNames = [], a.networkColumnNames = [];
var b = a.nodes[0];
for (var c in b.data) a.columnNames.push(c);
var d = a.edges[0];
for (var e in d.data) a.edgeColumnNames.push(e);
for (var f in o.data) a.networkColumnNames.push(f)
}
function k() {
a.selectedNodes = {}, a.selectedEdges = {}
}
function l() {
a.selectedNodes = {}, a.selectedEdges = {};
var b = !1;
a.cy.on("select", "node", function(c) {
var d = c.cyTarget.id();
a.selectedNodes[d] = c.cyTarget, b = !0
}), a.cy.on("select", "edge", function(c) {
var d = c.cyTarget.id();
a.selectedEdges[d] = c.cyTarget, b = !0
}), a.cy.on("unselect", "node", function(c) {
var d = c.cyTarget.id();
delete a.selectedNodes[d], b = !0
}), a.cy.on("unselect", "edge", function(c) {
var d = c.cyTarget.id();
delete a.selectedEdges[d], b = !0
}), setInterval(function() {
b && a.browserState.show && (a.$apply(), b = !1)
}, 300)
}
function m(b) {
_.each(b, function(b) {
a.visualStyles[b.title] = b, a.visualStyleNames.push(b.title)
}), a.currentVS = r
}
function z(){
var el = document.getElementsByClassName('glyphicon')[0]
el.click()
el.click()
}
var n, o,
q = "#network",
r = "default";
a.LAYOUTS = ["preset", "cola", "random", "grid", "circle", "concentric", "breadthfirst", "cose"], a.networks = {}, a.currentVS = null, a.visualStyles = [], a.visualStyleNames = [], a.networkNames = [], a.currentNetworkData = null, a.browserState = {
show: !1
}, a.overlayState = {
show: !0
}, a.toolbarState = {
show: !0
}, a.bg = {
color: "#FAFAFA"
}, a.columnNames = [], a.edgeColumnNames = [], a.networkColumnNames = [];
var s = {
showOverlay: !1,
minZoom: .01,
maxZoom: 200,
boxSelectionEnabled: !0,
layout: {
name: "preset"
},
ready: function() {
a.cy = this,
a.cy.load(o.elements),
i(n),
h(),
l(),
a.currentVS = r,
a.currentLayout = "preset",
a.cy.style().fromJson(a.visualStyles[r].style).update(),
angular.element(".loading").remove()
var b = {
name: a.currentLayout
};
a.cy.layout(b)
z()
}
};
a.toggleTableBrowser = function() {
a.browserState.show = !a.browserState.show
}, a.toggleOverlay = function() {
a.overlayState.show = !a.overlayState.show
}, a.toggleToolbar = function() {
a.toolbarState.show = !a.toolbarState.show
}, a.fit = function() {
a.cy.fit()
}, a.switchVS = function() {
var b = a.currentVS.trim(),
c = a.visualStyles[b].style;
a.cy.style().fromJson(c).update()
}, a.switchNetwork = function() {
var b = a.networks[a.currentNetwork]
a.cy.load(b.elements),
a.currentNetworkData = o,
k(), a.nodes = b.elements.nodes,
a.edges = b.elements.edges,
j()
//a.switchLayout()
}, a.switchLayout = function() {
var b = {
name: a.currentLayout
};
a.cy.layout(b)
}, function(){
var b = networks;
a.networks = b;
a.networkNames = Object.keys(b);
c = a.networkNames[0];
n = styles;
o = b[c], a.currentNetworkData = o.data, a.currentNetwork = c
,angular.element(q).cytoscape(s)
}()
}]), angular.module("cyViewerApp").factory("Network", ["$resource", function(a) {
return a("data/:filename", {
filename: "@filename"
})
return {get: function(){}}
}]), angular.module("cyViewerApp").factory("VisualStyles", ["$resource", function(a) {
return a("data/:filename", {
filename: styles
})
}]);

28
scripts/3e4be17b.app.js Normal file
View File

@ -0,0 +1,28 @@
// Sample project for visualizing JSON files.
//
// by Keiichiro Ono
//
'use strict';
angular.module('cyViewerApp', [
'ngCookies',
'ngResource',
'ngSanitize',
'ngRoute',
'ngAnimate',
'ui.bootstrap',
'angular-underscore',
'colorpicker.module',
'angularSpinner'
])
.config(function($routeProvider) {
// Routing
$routeProvider
.when('/', {
templateUrl: 'main.html',
controller: 'MainCtrl'
})
.otherwise({
redirectTo: '/'
});
});

29135
scripts/65d77273.vendor.js Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,312 @@
/*global _, angular */
angular.module('cyViewerApp')
.controller('MainCtrl', function($scope, $http, $location, $routeParams, $window, Network, VisualStyles) {
'use strict';
var FILE_LIST_NAME = 'filelist.json';
// Name of network tag in the DOM
var NETWORK_SECTION_ID = '#network';
// Default Visual Style name
var DEFAULT_VISUAL_STYLE_NAME = 'default';
var visualStyleFile;
var networkData;
$scope.LAYOUTS = [
'preset', 'cola', 'random', 'grid', 'circle', 'concentric', 'breadthfirst', 'cose'
];
// Application global objects
$scope.networks = networks;
$scope.currentVS = null;
$scope.visualStyles = styles;
$scope.visualStyleNames = Object.styles(styles);
$scope.networkNames = Object.styles(networks);
$scope.currentNetworkData = Network.get(
{filename: $scope.networks[defaultNetworkName]},
function () {
angular.element(NETWORK_SECTION_ID).cytoscape(options);
$scope.currentNetworkData = networkData;
$scope.currentNetwork = defaultNetworkName;
});;
// Show / Hide Table browser
$scope.browserState = {
show: false
};
// Show / Hide style selector UI
$scope.overlayState = {
show: true
};
// Show / Hide toolbar
$scope.toolbarState = {
show: true
};
// Background color
$scope.bg = {
color: '#FAFAFA'
};
$scope.columnNames = [];
$scope.edgeColumnNames = [];
$scope.networkColumnNames = [];
// Basic settings for the Cytoscape window
var options = {
showOverlay: false,
minZoom: 0.01,
maxZoom: 200,
boxSelectionEnabled: true,
layout: {
name: 'preset'
},
ready: function() {
$scope.cy = this;
$scope.cy.load(networkData.elements);
VisualStyles.query(
{filename: visualStyleFile}, function (vs) {
init(vs);
dropSupport();
setEventListeners();
$scope.currentVS = DEFAULT_VISUAL_STYLE_NAME;
$scope.currentLayout = 'preset';
$scope.cy.style().fromJson($scope.visualStyles[DEFAULT_VISUAL_STYLE_NAME].style).update();
angular.element('.loading').remove();
});
}
};
function dropSupport() {
var dropZone = angular.element(NETWORK_SECTION_ID);
dropZone.on('dragenter', function(e) {
e.stopPropagation();
e.preventDefault();
});
dropZone.on('dragover', function(e) {
e.stopPropagation();
e.preventDefault();
});
dropZone.on('drop', function(e) {
e.preventDefault();
var files = e.originalEvent.dataTransfer.files;
var networkFile = files[0];
var reader = new FileReader();
reader.onload = function(evt) {
var network = JSON.parse(evt.target.result);
var networkName = 'Unknown';
// Check data section is available or not.
networkData = network.data;
if (networkData !== undefined) {
if (networkData.name !== undefined) {
networkName = networkData.name;
$scope.currentNetworkData = networkData;
}
}
while (_.contains($scope.networkNames, networkName)) {
networkName = networkName + '*';
}
$scope.$apply(function() {
$scope.networks[networkName] = network;
$scope.networkNames.push(networkName);
$scope.currentNetwork = networkName;
});
$scope.cy.load(network.elements);
reset();
};
reader.readAsText(networkFile);
});
}
function init(vs) {
$scope.nodes = networkData.elements.nodes;
$scope.edges = networkData.elements.edges;
initVisualStyleCombobox(vs);
// Set network name
var networkName = networkData.data.name;
if (!$scope.networks[networkName]) {
$scope.networks[networkName] = networkData;
$scope.networkNames.push(networkName);
$scope.currentNetwork = networkData.data.name;
}
// Get column names
setColumnNames();
if ($routeParams.bgcolor) {
$scope.bg.color = $routeParams.bgcolor;
}
}
function setColumnNames() {
$scope.columnNames = [];
$scope.edgeColumnNames = [];
$scope.networkColumnNames = [];
var oneNode = $scope.nodes[0];
for (var colName in oneNode.data) {
$scope.columnNames.push(colName);
}
var oneEdge = $scope.edges[0];
for (var edgeColName in oneEdge.data) {
$scope.edgeColumnNames.push(edgeColName);
}
for (var netColName in networkData.data) {
$scope.networkColumnNames.push(netColName);
}
}
function reset() {
$scope.selectedNodes = {};
$scope.selectedEdges = {};
}
/*
Event listener setup for Cytoscape.js
*/
function setEventListeners() {
$scope.selectedNodes = {};
$scope.selectedEdges = {};
var updateFlag = false;
// Node selection
$scope.cy.on('select', 'node', function(event) {
var id = event.cyTarget.id();
$scope.selectedNodes[id] = event.cyTarget;
updateFlag = true;
});
$scope.cy.on('select', 'edge', function(event) {
var id = event.cyTarget.id();
$scope.selectedEdges[id] = event.cyTarget;
updateFlag = true;
});
// Reset selection
$scope.cy.on('unselect', 'node', function(event) {
var id = event.cyTarget.id();
delete $scope.selectedNodes[id];
updateFlag = true;
});
$scope.cy.on('unselect', 'edge', function(event) {
var id = event.cyTarget.id();
delete $scope.selectedEdges[id];
updateFlag = true;
});
setInterval(function() {
if (updateFlag && $scope.browserState.show) {
$scope.$apply();
updateFlag = false;
}
}, 300);
}
function initVisualStyleCombobox(vs) {
_.each(vs, function(visualStyle) {
$scope.visualStyles[visualStyle.title] = visualStyle;
$scope.visualStyleNames.push(visualStyle.title);
});
$scope.currentVS = DEFAULT_VISUAL_STYLE_NAME;
}
$scope.toggleTableBrowser = function() {
$scope.browserState.show = !$scope.browserState.show;
};
$scope.toggleOverlay = function() {
$scope.overlayState.show = !$scope.overlayState.show;
};
$scope.toggleToolbar = function() {
$scope.toolbarState.show = !$scope.toolbarState.show;
};
$scope.fit = function() {
$scope.cy.fit();
};
// Apply Visual Style
$scope.switchVS = function() {
var vsName = $scope.currentVS.trim();
var vs = $scope.visualStyles[vsName].style;
// Apply Visual Style
$scope.cy.style().fromJson(vs).update();
};
$scope.switchNetwork = function() {
var networkFile = $scope.networks[$scope.currentNetwork];
networkData = Network.get(
{filename: networkFile},
function (network) {
$scope.cy.load(network.elements);
$scope.currentNetworkData = networkData;
reset();
$scope.nodes = network.elements.nodes;
$scope.edges = network.elements.edges;
setColumnNames();
});
};
$scope.switchLayout = function() {
var layoutOptions = {
name: $scope.currentLayout
};
$scope.cy.layout(layoutOptions);
};
///////////////////// Start the loading process ////////////////
/*$http.get(FILE_LIST_NAME).success(function(fileList) {
visualStyleFile = styles;
var defaultNetworkName = null;
$scope.networks = networks;
_.each(_.keys(networks), function(key) {
$scope.networkNames.push(key)
}
_.each(_.keys(fileList), function(key) {
if(key !== 'style') {
if(defaultNetworkName === null) {
defaultNetworkName = key;
}
$scope.networks[key] = fileList[key];
$scope.networkNames.push(key);
}
});
networkData = Network.get(
{filename: $scope.networks[defaultNetworkName]},
function () {
angular.element(NETWORK_SECTION_ID).cytoscape(options);
$scope.currentNetworkData = networkData;
$scope.currentNetwork = defaultNetworkName;
});
});
});*/

15
scripts/custom.js Normal file
View File

@ -0,0 +1,15 @@
$( document ).ready(function(){
// Custom Cytoscape.JS code goes here.
// Example: add linkouts to nodes that opens the "href" node attribute on click
// cy.on('tap', 'node', function(){
// try { // your browser may block popups
// window.open( this.data('href') );
// } catch(e){ // fall back on url change
// window.location.href = this.data('href');
// }
// });
// For more options, check out http://js.cytoscape.org/
});

View File

@ -0,0 +1,14 @@
/**
* Created by kono on 2014/01/24.
*/
'use strict';
/**
* Services that persists and retrieves TODOs from localStorage
*/
angular.module('cyViewerApp')
.factory('Network', ['$resource', function ($resource) {
return $resource('data/:filename', {filename: '@filename'});
}]
);

View File

@ -0,0 +1,11 @@
/**
* Created by kono on 2014/01/24.
*/
/*
'use strict';
angular.module('cyViewerApp')
.factory('VisualStyles', ['$resource', function ($resource) {
return $resource('data/:filename', {filename: '@filename'});
}]
);*/

File diff suppressed because one or more lines are too long

1
styles/dcab8a36.main.css Normal file

File diff suppressed because one or more lines are too long

View File

@ -1,627 +0,0 @@
<?xml version="1.0" standalone="no"?>
<svg
version="1.1"
baseProfile="full"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:ev="http://www.w3.org/2001/xml-events"
x="0px"
y="0px"
width="1551px"
height="951px"
viewBox="0 0 1551 951"
>
<title></title>
<desc>Creator: FreeHEP Graphics2D Driver Producer: org.freehep.graphicsio.svg.SVGGraphics2D Revision Source: Date: Wednesday, January 3, 2024 at 2:44:33 AM Indochina Time</desc>
<g stroke-dashoffset="0" stroke-linejoin="miter" stroke-dasharray="none" stroke-width="1" stroke-linecap="square" stroke-miterlimit="10">
<g fill="#ffffff" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 0 0 L 1551 0 L 1551 951 L 0 951 L 0 0 z"/>
</g> <!-- drawing style -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 464.5989990234375 -270.6177673339844 C 464.5927429199219 -270.59112548828125 464.56243896484375 -266.07421875 464.5313720703125 -260.52899169921875 C 464.5002746582031 -254.98377990722656 464.2608337402344 -212.27854919433594 463.99658203125 -165.14419555664062 C 463.7322998046875 -118.00984954833984 463.49285888671875 -75.30462646484375 463.4617919921875 -69.75940704345703 C 463.4306945800781 -64.21419525146484 458.9101867675781 -59.744110107421875 453.364990234375 -59.77519989013672 C 447.81976318359375 -59.80628967285156 406.3186340332031 -60.03897476196289 360.66961669921875 -60.29491424560547 C 315.02056884765625 -60.55085372924805 273.5194396972656 -60.783538818359375 267.9742431640625 -60.81462860107422 C 262.42901611328125 -60.84572219848633 257.90850830078125 -56.37563705444336 257.87744140625 -50.830421447753906 C 257.8463439941406 -45.28520584106445 257.8148193359375 -39.66609573364258 257.80706787109375 -38.27979278564453 C 257.7992858886719 -36.89348602294922 257.76776123046875 -31.274377822875977 257.7366943359375 -25.72916030883789 C 257.7055969238281 -20.183940887451172 257.6802062988281 -15.6569185256958 257.67999267578125 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 469.9092712402344 -270.6177673339844 C 469.90966796875 -270.6118469238281 469.3861083984375 -213.52572631835938 468.7398681640625 -143.11236572265625 C 468.0936584472656 -72.69901275634766 467.56976318359375 -15.6177396774292 467.56976318359375 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -1317.4180908203125 19.38222885131836 C -1317.885498046875 85.66770935058594 -1318.264892578125 139.39353942871094 -1318.265380859375 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -1309.9180908203125 19.38222885131836 C -1309.9180908203125 30.42792320251465 -1309.9180908203125 47.217247009277344 -1309.9180908203125 56.882232666015625 C -1309.9180908203125 66.5472183227539 -1309.9180908203125 78.85938262939453 -1309.9180908203125 84.38223266601562 C -1309.9180908203125 89.90508270263672 -1305.44091796875 94.38223266601562 -1299.9180908203125 94.38223266601562 C -1294.395263671875 94.38223266601562 -1277.0462646484375 94.38223266601562 -1261.1680908203125 94.38223266601562 C -1245.2899169921875 94.38223266601562 -1227.94091796875 94.38223266601562 -1222.4180908203125 94.38223266601562 C -1216.895263671875 94.38223266601562 -1212.4180908203125 98.85938262939453 -1212.4180908203125 104.38223266601562 C -1212.4180908203125 109.90508270263672 -1212.4180908203125 115.50151824951172 -1212.4180908203125 116.88223266601562 C -1212.4180908203125 118.26294708251953 -1212.4180908203125 128.33653259277344 -1212.4180908203125 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -612.4180908203125 19.38222885131836 C -612.4180908203125 35.95077133178711 -616.895263671875 49.38222885131836 -622.4180908203125 49.38222885131836 C -627.94091796875 49.38222885131836 -659.5608520507812 49.38222885131836 -693.0430908203125 49.38222885131836 C -726.5253295898438 49.38222885131836 -758.145263671875 49.38222885131836 -763.6680908203125 49.38222885131836 C -769.19091796875 49.38222885131836 -773.6680908203125 53.85938262939453 -773.6680908203125 59.382232666015625 C -773.6680908203125 64.90508270263672 -773.6680908203125 80.57511138916016 -773.6680908203125 94.38223266601562 C -773.6680908203125 108.1893539428711 -773.6680908203125 128.33653259277344 -773.6680908203125 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#cd5c5c" stroke-linecap="round">
<path d="M -619.9180908203125 1.8822293281555176 C -661.3394775390625 1.8822293281555176 -669.734130859375 -23.3017520904541 -638.6680908203125 -54.367767333984375 C -607.60205078125 -85.43378448486328 -582.4180908203125 -68.08482360839844 -582.4180908203125 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 437.8732604980469 -270.6177673339844 C 437.85406494140625 -270.60687255859375 437.8357849121094 -266.111083984375 437.8324279785156 -260.57611083984375 C 437.8290710449219 -255.0411376953125 437.8236389160156 -246.0671844482422 437.8202819824219 -240.53221130371094 C 437.8169250488281 -234.9972381591797 437.8114929199219 -226.02328491210938 437.8081359863281 -220.48831176757812 C 437.8047790527344 -214.95335388183594 433.3150939941406 -210.46908569335938 427.7801208496094 -210.47244262695312 C 422.2451477050781 -210.4757843017578 202.58348083496094 -210.60882568359375 -62.84796142578125 -210.76959228515625 C -328.2793884277344 -210.9303436279297 -547.9411010742188 -211.06338500976562 -553.47607421875 -211.06674194335938 C -559.010986328125 -211.07008361816406 -563.500732421875 -206.5858154296875 -563.5040283203125 -201.05084228515625 C -563.5073852539062 -195.51588439941406 -563.5311889648438 -156.2548065185547 -563.55712890625 -113.35879516601562 C -563.5831298828125 -70.46278381347656 -563.60693359375 -31.201719284057617 -563.6102294921875 -25.666748046875 C -563.6135864257812 -20.131778717041016 -563.6293334960938 -15.632698059082031 -563.6453247070312 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -552.4180908203125 19.38222885131836 C -552.4180908203125 35.95077133178711 -547.94091796875 49.38222885131836 -542.4180908203125 49.38222885131836 C -536.895263671875 49.38222885131836 -505.2753601074219 49.38222885131836 -471.7930908203125 49.38222885131836 C -438.31085205078125 49.38222885131836 -406.69097900390625 49.38222885131836 -401.1681213378906 49.38222885131836 C -395.645263671875 49.38222885131836 -391.1681213378906 53.85938262939453 -391.1681213378906 59.382232666015625 C -391.1681213378906 64.90508270263672 -391.1681213378906 80.57511138916016 -391.1681213378906 94.38223266601562 C -391.1681213378906 108.1893539428711 -391.1681213378906 128.33653259277344 -391.1681213378906 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -597.4180908203125 19.38222885131836 C -597.4180908203125 30.42792320251465 -597.4180908203125 40.50151824951172 -597.4180908203125 41.88222885131836 C -597.4180908203125 43.262939453125 -597.4180908203125 48.85938262939453 -597.4180908203125 54.382232666015625 C -597.4180908203125 59.90507888793945 -601.895263671875 64.38223266601562 -607.4180908203125 64.38223266601562 C -612.94091796875 64.38223266601562 -628.6109619140625 64.38223266601562 -642.4180908203125 64.38223266601562 C -656.2252197265625 64.38223266601562 -671.895263671875 64.38223266601562 -677.4180908203125 64.38223266601562 C -682.94091796875 64.38223266601562 -687.4180908203125 68.85938262939453 -687.4180908203125 74.38223266601562 C -687.4180908203125 79.90508270263672 -687.4180908203125 92.21724700927734 -687.4180908203125 101.88223266601562 C -687.4180908203125 111.5472183227539 -687.4180908203125 128.33653259277344 -687.4180908203125 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -582.4180908203125 19.38222885131836 L -582.4180908203125 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -567.4180908203125 19.38222885131836 C -567.4180908203125 30.42792320251465 -567.4180908203125 40.50151824951172 -567.4180908203125 41.88222885131836 C -567.4180908203125 43.262939453125 -567.4180908203125 48.85938262939453 -567.4180908203125 54.382232666015625 C -567.4180908203125 59.90507888793945 -562.94091796875 64.38223266601562 -557.4180908203125 64.38223266601562 C -551.895263671875 64.38223266601562 -536.2252197265625 64.38223266601562 -522.4180908203125 64.38223266601562 C -508.6109924316406 64.38223266601562 -492.94097900390625 64.38223266601562 -487.4181213378906 64.38223266601562 C -481.895263671875 64.38223266601562 -477.4181213378906 68.85938262939453 -477.4181213378906 74.38223266601562 C -477.4181213378906 79.90508270263672 -477.4181213378906 92.21724700927734 -477.4181213378906 101.88223266601562 C -477.4181213378906 111.5472183227539 -477.4181213378906 128.33653259277344 -477.4181213378906 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 486.0791015625 -270.6177673339844 C 486.0622253417969 -270.634765625 486.0419006347656 -266.1859130859375 486.0336608886719 -260.68096923828125 C 486.0254211425781 -255.176025390625 485.98712158203125 -229.5158233642578 485.94805908203125 -203.3673095703125 C 485.90899658203125 -177.21881103515625 485.8706970214844 -151.55860900878906 485.8624572753906 -146.05364990234375 C 485.8542175292969 -140.5487060546875 490.3102111816406 -136.0793914794922 495.815185546875 -136.0711669921875 C 501.32012939453125 -136.06295776367188 633.8446655273438 -135.8650360107422 791.8170166015625 -135.62911987304688 C 949.7894287109375 -135.3931884765625 1082.31396484375 -135.1952667236328 1087.8189697265625 -135.18704223632812 C 1093.323974609375 -135.1788330078125 1097.7799072265625 -130.7095184326172 1097.771728515625 -125.20457458496094 C 1097.7635498046875 -119.69962310791016 1097.730224609375 -97.38641357421875 1097.697265625 -75.36661529541016 C 1097.664306640625 -53.34681701660156 1097.6309814453125 -31.033599853515625 1097.622802734375 -25.528650283813477 C 1097.6146240234375 -20.023700714111328 1097.60791015625 -15.586448669433594 1097.6080322265625 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 440.5186462402344 -270.6177673339844 C 440.51336669921875 -270.6144714355469 440.5035705566406 -266.1243591308594 440.496826171875 -260.5887756347656 C 440.4900817871094 -255.05319213867188 440.4750061035156 -242.712646484375 440.46319580078125 -233.02537536621094 C 440.45135498046875 -223.33810424804688 440.4363098144531 -210.99755859375 440.4295654296875 -205.46197509765625 C 440.42279052734375 -199.92640686035156 435.9298400878906 -195.4444122314453 430.394287109375 -195.451171875 C 424.85870361328125 -195.45791625976562 212.14442443847656 -195.71751403808594 -44.71635437011719 -196.03099060058594 C -301.5771179199219 -196.34446716308594 -514.2913818359375 -196.60406494140625 -519.8269653320312 -196.61080932617188 C -525.362548828125 -196.61756896972656 -529.8555297851562 -192.1355743408203 -529.8623046875 -186.60000610351562 C -529.8690185546875 -181.06442260742188 -529.926513671875 -133.94595336914062 -529.99072265625 -81.35794067382812 C -530.0548706054688 -28.769935607910156 -530.1123657226562 18.348539352416992 -530.119140625 23.884119033813477 C -530.1258544921875 29.41969871520996 -525.6438598632812 33.91265106201172 -520.1082763671875 33.919403076171875 C -514.57275390625 33.9261589050293 -479.51434326171875 33.96894454956055 -441.80322265625 34.01496887207031 C -404.0920715332031 34.06099319458008 -369.03369140625 34.10377883911133 -363.49810791015625 34.11053466796875 C -357.9625244140625 34.117286682128906 -353.48052978515625 38.61023712158203 -353.4873046875 44.145816802978516 C -353.4940490722656 49.681396484375 -353.5173034667969 68.75315856933594 -353.5392761230469 86.74378967285156 C -353.5612487792969 104.73442840576172 -353.5845031738281 123.80619049072266 -353.59124755859375 129.34176635742188 C -353.5980224609375 134.87734985351562 -353.6118469238281 139.37261962890625 -353.6221923828125 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -1302.4180908203125 19.38222885131836 C -1302.4180908203125 30.42792320251465 -1302.4180908203125 43.85938262939453 -1302.4180908203125 49.38222885131836 C -1302.4180908203125 54.90507507324219 -1302.4180908203125 63.85938262939453 -1302.4180908203125 69.38223266601562 C -1302.4180908203125 74.90508270263672 -1297.94091796875 79.38223266601562 -1292.4180908203125 79.38223266601562 C -1286.895263671875 79.38223266601562 -1247.72021484375 79.38223266601562 -1204.9180908203125 79.38223266601562 C -1162.115966796875 79.38223266601562 -1122.94091796875 79.38223266601562 -1117.4180908203125 79.38223266601562 C -1111.895263671875 79.38223266601562 -1107.4180908203125 83.85938262939453 -1107.4180908203125 89.38223266601562 C -1107.4180908203125 94.90508270263672 -1107.4180908203125 103.85938262939453 -1107.4180908203125 109.38223266601562 C -1107.4180908203125 114.90508270263672 -1107.4180908203125 128.33653259277344 -1107.4180908203125 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 499.4875793457031 -270.6177673339844 C 499.46844482421875 -270.628662109375 499.4506530761719 -266.1693420410156 499.4478759765625 -260.65765380859375 C 499.445068359375 -255.1459197998047 499.4405517578125 -246.2096710205078 499.437744140625 -240.6979522705078 C 499.4349670410156 -235.1862335205078 499.4304504394531 -226.24998474121094 499.4276428222656 -220.73828125 C 499.4248352050781 -215.2265625 503.8907165527344 -210.7561798095703 509.40240478515625 -210.75338745117188 C 514.9141235351562 -210.75057983398438 761.8978271484375 -210.62545776367188 1061.055908203125 -210.47390747070312 C 1360.2139892578125 -210.32235717773438 1607.19775390625 -210.19723510742188 1612.70947265625 -210.19444274902344 C 1618.22119140625 -210.191650390625 1622.68701171875 -205.7212677001953 1622.684326171875 -200.2095489501953 C 1622.6815185546875 -194.6978302001953 1622.66162109375 -155.60171508789062 1622.6400146484375 -112.88594055175781 C 1622.618408203125 -70.17015838623047 1622.5985107421875 -31.074047088623047 1622.595703125 -25.562334060668945 C 1622.593017578125 -20.05061912536621 1622.5906982421875 -15.598286628723145 1622.5906982421875 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -1287.4180908203125 19.38222885131836 C -1287.4180908203125 35.95077133178711 -1282.94091796875 49.38222885131836 -1277.4180908203125 49.38222885131836 C -1271.895263671875 49.38222885131836 -1189.06787109375 49.38222885131836 -1092.4180908203125 49.38222885131836 C -995.7682495117188 49.38222885131836 -912.94091796875 49.38222885131836 -907.4180908203125 49.38222885131836 C -901.895263671875 49.38222885131836 -897.4180908203125 53.85938262939453 -897.4180908203125 59.382232666015625 C -897.4180908203125 64.90508270263672 -897.4180908203125 80.57511138916016 -897.4180908203125 94.38223266601562 C -897.4180908203125 108.1893539428711 -897.4180908203125 128.33653259277344 -897.4180908203125 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 448.59405517578125 -270.6177673339844 C 448.5763854980469 -270.6023864746094 448.5579528808594 -266.1009521484375 448.55291748046875 -260.56353759765625 C 448.5478820800781 -255.02610778808594 448.5274658203125 -232.58126831054688 448.5072937011719 -210.43157958984375 C 448.48712158203125 -188.2819061279297 448.4667053222656 -165.83706665039062 448.461669921875 -160.29965209960938 C 448.4566345214844 -154.76222229003906 443.96356201171875 -150.27734375 438.4261474609375 -150.28237915039062 C 432.88873291015625 -150.28741455078125 253.6506805419922 -150.45054626464844 38.08677673339844 -150.646728515625 C -177.4771270751953 -150.8428955078125 -356.71514892578125 -151.0060272216797 -362.2525634765625 -151.0110626220703 C -367.7900085449219 -151.01609802246094 -372.2830505371094 -146.53121948242188 -372.2880859375 -140.99380493164062 C -372.2931213378906 -135.45639038085938 -372.3166198730469 -109.64482879638672 -372.340576171875 -83.34207153320312 C -372.364501953125 -57.03932189941406 -372.38800048828125 -31.227760314941406 -372.3930358886719 -25.690338134765625 C -372.3980712890625 -20.152917861938477 -372.40216064453125 -15.643274307250977 -372.4021911621094 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 451.2694396972656 -270.6177673339844 C 451.25238037109375 -270.60064697265625 451.2333679199219 -266.0965270996094 451.22698974609375 -260.55755615234375 C 451.2205810546875 -255.01856994628906 451.19085693359375 -229.1997528076172 451.16058349609375 -202.8896026611328 C 451.13031005859375 -176.57945251464844 451.1005859375 -150.76063537597656 451.0942077636719 -145.22164916992188 C 451.08782958984375 -139.68267822265625 446.5924377441406 -135.19761657714844 441.053466796875 -135.2039794921875 C 435.5144958496094 -135.21035766601562 279.1983642578125 -135.3903045654297 91.91165161132812 -135.6059112548828 C -95.37506866455078 -135.82151794433594 -251.69119262695312 -136.00146484375 -257.23016357421875 -136.00784301757812 C -262.7691345214844 -136.0142059326172 -267.2645263671875 -131.52914428710938 -267.27093505859375 -125.99017333984375 C -267.2773132324219 -120.4511947631836 -267.3031311035156 -98.00005340576172 -267.3286437988281 -75.84413146972656 C -267.3541564941406 -53.6882209777832 -267.3799743652344 -31.237071990966797 -267.3863525390625 -25.69809341430664 C -267.39276123046875 -20.159114837646484 -267.39794921875 -15.645999908447266 -267.3979797363281 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 456.6150817871094 -270.6177673339844 C 456.6001281738281 -270.59613037109375 456.5790100097656 -266.085205078125 456.56793212890625 -260.5423583984375 C 456.5568542480469 -254.99951171875 456.49176025390625 -222.42262268066406 456.42254638671875 -187.77984619140625 C 456.35333251953125 -153.13705444335938 456.2882385253906 -120.56016540527344 456.27716064453125 -115.01731872558594 C 456.2660827636719 -109.47447204589844 451.76373291015625 -104.9900894165039 446.22088623046875 -105.00115966796875 C 440.6780700683594 -105.01223754882812 330.22955322265625 -105.23291778564453 199.52728271484375 -105.49406433105469 C 68.82499694824219 -105.75521850585938 -41.623497009277344 -105.97589874267578 -47.166343688964844 -105.98696899414062 C -52.709190368652344 -105.998046875 -57.21153259277344 -101.51366424560547 -57.22260665893555 -95.97081756591797 C -57.233680725097656 -90.42797088623047 -57.265106201171875 -74.7011947631836 -57.29279327392578 -60.844085693359375 C -57.32047653198242 -46.986968994140625 -57.35190200805664 -31.260194778442383 -57.36297607421875 -25.717348098754883 C -57.37405014038086 -20.174503326416016 -57.383087158203125 -15.652767181396484 -57.383155822753906 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 459.2830810546875 -270.6177673339844 C 459.26995849609375 -270.5934753417969 459.2469177246094 -266.0787048339844 459.23162841796875 -260.53375244140625 C 459.2163391113281 -254.98883056640625 459.1170959472656 -219.0283660888672 459.010009765625 -180.2138214111328 C 458.9029235839844 -141.39927673339844 458.8036804199219 -105.43881225585938 458.78839111328125 -99.89387512207031 C 458.7731018066406 -94.34893798828125 454.265625 -89.86628723144531 448.720703125 -89.88158416748047 C 443.1757507324219 -89.89688110351562 355.68267822265625 -90.13829803466797 253.29940795898438 -90.42079162597656 C 150.9161376953125 -90.70328521728516 63.42305374145508 -90.9447021484375 57.87812042236328 -90.95999908447266 C 52.333187103271484 -90.97529602050781 47.82572555541992 -86.49264526367188 47.8104248046875 -80.94770812988281 C 47.79512405395508 -75.40277099609375 47.761016845703125 -63.04136276245117 47.73424530029297 -53.337730407714844 C 47.70746994018555 -43.63409423828125 47.673362731933594 -31.27268409729004 47.65806198120117 -25.72774887084961 C 47.64276123046875 -20.182815551757812 47.630271911621094 -15.656423568725586 47.630165100097656 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -1339.9180908203125 19.38222885131836 C -1339.9180908203125 30.42792320251465 -1339.9180908203125 43.85938262939453 -1339.9180908203125 49.38222885131836 C -1339.9180908203125 54.90507507324219 -1339.9180908203125 63.85938262939453 -1339.9180908203125 69.38223266601562 C -1339.9180908203125 74.90508270263672 -1344.395263671875 79.38223266601562 -1349.9180908203125 79.38223266601562 C -1355.44091796875 79.38223266601562 -1416.442138671875 79.38223266601562 -1486.1680908203125 79.38223266601562 C -1555.89404296875 79.38223266601562 -1616.895263671875 79.38223266601562 -1622.4180908203125 79.38223266601562 C -1627.94091796875 79.38223266601562 -1632.4180908203125 83.85938262939453 -1632.4180908203125 89.38223266601562 C -1632.4180908203125 94.90508270263672 -1632.4180908203125 103.85938262939453 -1632.4180908203125 109.38223266601562 C -1632.4180908203125 114.90508270263672 -1632.4180908203125 128.33653259277344 -1632.4180908203125 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -1294.9180908203125 19.38222885131836 C -1294.9180908203125 30.42792320251465 -1294.9180908203125 40.50151824951172 -1294.9180908203125 41.88222885131836 C -1294.9180908203125 43.262939453125 -1294.9180908203125 48.85938262939453 -1294.9180908203125 54.382232666015625 C -1294.9180908203125 59.90507888793945 -1290.44091796875 64.38223266601562 -1284.9180908203125 64.38223266601562 C -1279.395263671875 64.38223266601562 -1218.39404296875 64.38223266601562 -1148.6680908203125 64.38223266601562 C -1078.942138671875 64.38223266601562 -1017.94091796875 64.38223266601562 -1012.4180908203125 64.38223266601562 C -1006.895263671875 64.38223266601562 -1002.4180908203125 68.85938262939453 -1002.4180908203125 74.38223266601562 C -1002.4180908203125 79.90508270263672 -1002.4180908203125 92.21724700927734 -1002.4180908203125 101.88223266601562 C -1002.4180908203125 111.5472183227539 -1002.4180908203125 128.33653259277344 -1002.4180908203125 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -1332.4180908203125 19.38222885131836 C -1332.4180908203125 30.42792320251465 -1332.4180908203125 47.217247009277344 -1332.4180908203125 56.882232666015625 C -1332.4180908203125 66.5472183227539 -1332.4180908203125 78.85938262939453 -1332.4180908203125 84.38223266601562 C -1332.4180908203125 89.90508270263672 -1336.895263671875 94.38223266601562 -1342.4180908203125 94.38223266601562 C -1347.94091796875 94.38223266601562 -1387.115966796875 94.38223266601562 -1429.9180908203125 94.38223266601562 C -1472.72021484375 94.38223266601562 -1511.895263671875 94.38223266601562 -1517.4180908203125 94.38223266601562 C -1522.94091796875 94.38223266601562 -1527.4180908203125 98.85938262939453 -1527.4180908203125 104.38223266601562 C -1527.4180908203125 109.90508270263672 -1527.4180908203125 115.50151824951172 -1527.4180908203125 116.88223266601562 C -1527.4180908203125 118.26294708251953 -1527.4180908203125 128.33653259277344 -1527.4180908203125 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#cd5c5c" stroke-linecap="round">
<path d="M 432.5393981933594 -270.6177673339844 C 432.5214538574219 -270.6091003417969 432.50543212890625 -263.87725830078125 432.50360107421875 -255.581787109375 C 432.5018005371094 -247.2863311767578 428.01715087890625 -240.56251525878906 422.48681640625 -240.563720703125 C 416.9565124511719 -240.56494140625 28.879554748535156 -240.64987182617188 -444.3073425292969 -240.75341796875 C -917.4942626953125 -240.85696411132812 -1305.5711669921875 -240.94189453125 -1311.1015625 -240.943115234375 C -1316.6318359375 -240.94432067871094 -1321.115966796875 -236.46209716796875 -1321.1171875 -230.93179321289062 C -1321.118408203125 -225.4014892578125 -1321.12841796875 -179.44869995117188 -1321.1396484375 -128.29335021972656 C -1321.15087890625 -77.13801574707031 -1321.160888671875 -31.185218811035156 -1321.162109375 -25.6549129486084 C -1321.163330078125 -20.12460708618164 -1321.164306640625 -15.630824089050293 -1321.164306640625 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -1324.9180908203125 19.38222885131836 C -1324.9180908203125 30.42792320251465 -1324.9180908203125 50.575111389160156 -1324.9180908203125 64.38223266601562 C -1324.9180908203125 78.1893539428711 -1324.9180908203125 93.85938262939453 -1324.9180908203125 99.38223266601562 C -1324.9180908203125 104.90508270263672 -1329.395263671875 109.38223266601562 -1334.9180908203125 109.38223266601562 C -1340.44091796875 109.38223266601562 -1357.7899169921875 109.38223266601562 -1373.6680908203125 109.38223266601562 C -1389.5462646484375 109.38223266601562 -1406.895263671875 109.38223266601562 -1412.4180908203125 109.38223266601562 C -1417.94091796875 109.38223266601562 -1422.4180908203125 122.81369018554688 -1422.4180908203125 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -1354.9180908203125 19.38222885131836 C -1354.9180908203125 35.95077133178711 -1359.395263671875 49.38222885131836 -1364.9180908203125 49.38222885131836 C -1370.44091796875 49.38222885131836 -1475.0943603515625 49.38222885131836 -1598.6680908203125 49.38222885131836 C -1722.2418212890625 49.38222885131836 -1826.895263671875 49.38222885131836 -1832.4180908203125 49.38222885131836 C -1837.94091796875 49.38222885131836 -1842.4180908203125 53.85938262939453 -1842.4180908203125 59.382232666015625 C -1842.4180908203125 64.90508270263672 -1842.4180908203125 80.57511138916016 -1842.4180908203125 94.38223266601562 C -1842.4180908203125 108.1893539428711 -1842.4180908203125 128.33653259277344 -1842.4180908203125 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -1347.4180908203125 19.38222885131836 C -1347.4180908203125 30.42792320251465 -1347.4180908203125 40.50151824951172 -1347.4180908203125 41.88222885131836 C -1347.4180908203125 43.262939453125 -1347.4180908203125 48.85938262939453 -1347.4180908203125 54.382232666015625 C -1347.4180908203125 59.90507888793945 -1351.895263671875 64.38223266601562 -1357.4180908203125 64.38223266601562 C -1362.94091796875 64.38223266601562 -1445.768310546875 64.38223266601562 -1542.4180908203125 64.38223266601562 C -1639.06787109375 64.38223266601562 -1721.895263671875 64.38223266601562 -1727.4180908203125 64.38223266601562 C -1732.94091796875 64.38223266601562 -1737.4180908203125 68.85938262939453 -1737.4180908203125 74.38223266601562 C -1737.4180908203125 79.90508270263672 -1737.4180908203125 92.21724700927734 -1737.4180908203125 101.88223266601562 C -1737.4180908203125 111.5472183227539 -1737.4180908203125 128.33653259277344 -1737.4180908203125 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 475.3045654296875 -270.6177673339844 C 475.29754638671875 -270.6364440917969 475.266845703125 -266.192626953125 475.23602294921875 -260.6922302246094 C 475.2052307128906 -255.1918487548828 474.9866027832031 -216.1760711669922 474.7477722167969 -173.54806518554688 C 474.5089416503906 -130.92005920410156 474.2903137207031 -91.90428161621094 474.259521484375 -86.40390014648438 C 474.22869873046875 -80.90351104736328 478.66265869140625 -76.4195785522461 484.16302490234375 -76.38876342773438 C 489.6634216308594 -76.35794067382812 530.8290405273438 -76.12728881835938 576.1090087890625 -75.87358093261719 C 621.3890380859375 -75.61988067626953 662.5546264648438 -75.38922882080078 668.0550537109375 -75.35841369628906 C 673.555419921875 -75.32759094238281 677.9893798828125 -70.84365844726562 677.9585571289062 -65.34326934814453 C 677.927734375 -59.8428840637207 677.8778076171875 -50.924991607666016 677.846923828125 -45.42460632324219 C 677.8161010742188 -39.924217224121094 677.7661743164062 -31.006324768066406 677.7353515625 -25.505937576293945 C 677.7044677734375 -20.005550384521484 677.6796875 -15.578466415405273 677.679931640625 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 480.7028503417969 -270.6177673339844 C 480.68896484375 -270.6380615234375 480.6654052734375 -266.1952209472656 480.6502380371094 -260.69439697265625 C 480.63507080078125 -255.19358825683594 480.5459289550781 -222.86375427246094 480.45111083984375 -188.4836883544922 C 480.3563232421875 -154.10362243652344 480.2671813964844 -121.77378845214844 480.25201416015625 -116.27297973632812 C 480.2368469238281 -110.77217864990234 484.683837890625 -106.30059051513672 490.18463134765625 -106.2854232788086 C 495.6854553222656 -106.27025604248047 582.4822998046875 -106.03091430664062 684.0508422851562 -105.7508544921875 C 785.6193237304688 -105.47078704833984 872.4161987304688 -105.2314453125 877.9169921875 -105.21627807617188 C 883.4178466796875 -105.20111846923828 887.8648681640625 -100.72953033447266 887.8496704101562 -95.22872161865234 C 887.83447265625 -89.72791290283203 887.7914428710938 -74.12040710449219 887.7535400390625 -60.368377685546875 C 887.7156372070312 -46.616355895996094 887.672607421875 -31.008848190307617 887.6574096679688 -25.508037567138672 C 887.6422119140625 -20.00722885131836 887.6300048828125 -15.579204559326172 887.630126953125 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#cd5c5c" stroke-linecap="round">
<path d="M 431.2203063964844 -288.1177673339844 C 389.7989501953125 -288.1177673339844 381.404296875 -313.3017578125 412.4703063964844 -344.3677673339844 C 443.53631591796875 -375.43377685546875 468.7203063964844 -358.0848083496094 468.7203063964844 -305.6177673339844"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 483.392822265625 -270.6177673339844 C 483.37713623046875 -270.636474609375 483.3554992675781 -266.190673828125 483.3445129394531 -260.687744140625 C 483.3335266113281 -255.1848602294922 483.275634765625 -226.18846130371094 483.2152099609375 -195.9224853515625 C 483.1547546386719 -165.65652465820312 483.09686279296875 -136.66012573242188 483.08587646484375 -131.1572265625 C 483.07489013671875 -125.65431213378906 487.5269470214844 -121.18441772460938 493.02984619140625 -121.17343139648438 C 498.53277587890625 -121.16244506835938 608.1853637695312 -120.9434814453125 737.94580078125 -120.68436431884766 C 867.7062377929688 -120.42524719238281 977.3588256835938 -120.20628356933594 982.8616943359375 -120.19529724121094 C 988.3646240234375 -120.18431091308594 992.8167114257812 -115.71441650390625 992.8057250976562 -110.21151733398438 C 992.7947387695312 -104.70861053466797 992.7568969726562 -85.74942779541016 992.72119140625 -67.864990234375 C 992.6854248046875 -49.980552673339844 992.6475830078125 -31.0213680267334 992.6365966796875 -25.518463134765625 C 992.6256103515625 -20.015560150146484 992.6167602539062 -15.582868576049805 992.6168212890625 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 435.187744140625 -270.6177673339844 C 435.17724609375 -270.6123046875 435.16595458984375 -266.12286376953125 435.16253662109375 -260.5903625488281 C 435.1591491699219 -255.05784606933594 435.1556701660156 -249.4516143798828 435.15484619140625 -248.0684814453125 C 435.15399169921875 -246.68536376953125 435.1505126953125 -241.07913208007812 435.1470947265625 -235.54661560058594 C 435.1436767578125 -230.01409912109375 430.6559143066406 -225.53189086914062 425.1234130859375 -225.53530883789062 C 419.59088134765625 -225.53871154785156 145.12571716308594 -225.70822143554688 -187.91171264648438 -225.9138946533203 C -520.9491577148438 -226.11956787109375 -795.414306640625 -226.28907775878906 -800.94677734375 -226.29248046875 C -806.4793090820312 -226.2958984375 -810.967041015625 -221.81369018554688 -810.970458984375 -216.2811737060547 C -810.9739379882812 -210.7486572265625 -811.0216674804688 -133.3826446533203 -811.0772094726562 -43.47932815551758 C -811.1327514648438 46.423980712890625 -811.1804809570312 123.79000091552734 -811.1839599609375 129.322509765625 C -811.1873779296875 134.8550262451172 -811.169921875 139.35891723632812 -811.1449584960938 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 504.8470458984375 -270.6177673339844 C 504.8276062011719 -270.627197265625 504.8093566894531 -263.9307556152344 504.8063049316406 -255.66085815429688 C 504.8032531738281 -247.3909454345703 509.2701721191406 -240.6852264404297 514.783447265625 -240.68319702148438 C 520.2966918945312 -240.68115234375 813.0812377929688 -240.57313537597656 1168.7359619140625 -240.44192504882812 C 1524.3907470703125 -240.3107147216797 1817.17529296875 -240.20269775390625 1822.6884765625 -240.20065307617188 C 1828.2017822265625 -240.19862365722656 1832.6695556640625 -235.72760009765625 1832.66748046875 -230.21432495117188 C 1832.6654052734375 -224.70106506347656 1832.6485595703125 -178.889892578125 1832.6297607421875 -127.89219665527344 C 1832.6109619140625 -76.89450073242188 1832.5941162109375 -31.083316802978516 1832.592041015625 -25.570053100585938 C 1832.5899658203125 -20.056787490844727 1832.58837890625 -15.60099983215332 1832.58837890625 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#cd5c5c" stroke-linecap="round">
<path d="M 445.9177551269531 -270.6177673339844 C 445.8996276855469 -270.6038513183594 445.8816223144531 -266.10467529296875 445.8775634765625 -260.5685729980469 C 445.87347412109375 -255.032470703125 445.8594665527344 -235.9589385986328 445.8462219238281 -217.96661376953125 C 445.8329772949219 -199.97430419921875 445.8189697265625 -180.9007568359375 445.81488037109375 -175.36465454101562 C 445.810791015625 -169.8285675048828 441.3196105957031 -165.34396362304688 435.78350830078125 -165.34805297851562 C 430.2474060058594 -165.3521270751953 232.29925537109375 -165.49771118164062 -6.3460693359375 -165.67323303222656 C -244.99139404296875 -165.8487548828125 -442.9395446777344 -165.9943389892578 -448.47564697265625 -165.9984130859375 C -454.0117492675781 -166.0024871826172 -458.5029296875 -161.5178985595703 -458.50701904296875 -155.98179626464844 C -458.5111083984375 -150.44569396972656 -458.5325622558594 -121.27439880371094 -458.554931640625 -90.82585906982422 C -458.57733154296875 -60.37732696533203 -458.5987854003906 -31.206018447875977 -458.60284423828125 -25.669921875 C -458.60693359375 -20.13382339477539 -458.6237487792969 -15.633322715759277 -458.64044189453125 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 467.2479553222656 -270.6177673339844 C 467.2462158203125 -270.5971984863281 467.2109069824219 -266.09124755859375 467.1690673828125 -260.553466796875 C 467.127197265625 -255.01564025878906 466.779541015625 -209.0005645751953 466.39251708984375 -157.77587890625 C 466.0055236816406 -106.55120086669922 465.6578674316406 -60.53611373901367 465.61602783203125 -54.99831008911133 C 465.57415771484375 -49.460506439208984 461.05096435546875 -45.00514602661133 455.51318359375 -45.04698944091797 C 449.9753723144531 -45.088829040527344 431.4971618652344 -45.22843551635742 414.240966796875 -45.35881423950195 C 396.98480224609375 -45.489192962646484 378.5066223144531 -45.62879943847656 372.96881103515625 -45.67063903808594 C 367.4309997558594 -45.71248245239258 362.890869140625 -39.01248550415039 362.8280944824219 -30.705780029296875 C 362.76531982421875 -22.39907455444336 362.71429443359375 -15.643942832946777 362.7140808105469 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 461.9450988769531 -270.6177673339844 C 461.934814453125 -270.5911560058594 461.9088134765625 -266.0733947753906 461.8870849609375 -260.52703857421875 C 461.8653259277344 -254.98065185546875 461.7110595703125 -215.63873291015625 461.54254150390625 -172.6543731689453 C 461.3739929199219 -129.67002868652344 461.2197265625 -90.3281021118164 461.197998046875 -84.78173065185547 C 461.17626953125 -79.23535919189453 456.66241455078125 -74.75677490234375 451.11602783203125 -74.77851867675781 C 445.5696716308594 -74.80026245117188 381.05694580078125 -75.05320739746094 307.0228271484375 -75.34349060058594 C 232.9887237548828 -75.6337661743164 168.4759979248047 -75.88671112060547 162.92962646484375 -75.90845489501953 C 157.3832550048828 -75.9301986694336 152.86941528320312 -71.45160675048828 152.84765625 -65.90524291992188 C 152.82591247558594 -60.35887145996094 152.79066467285156 -51.366432189941406 152.7689208984375 -45.820064544677734 C 152.74716186523438 -40.27369689941406 152.7119140625 -31.28125762939453 152.69015502929688 -25.734888076782227 C 152.6684112548828 -20.188520431518555 152.65065002441406 -15.658931732177734 152.65049743652344 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 478.0072326660156 -270.6177673339844 C 477.9961242675781 -270.6387023925781 477.96966552734375 -266.19757080078125 477.9481201171875 -260.6982421875 C 477.9265441894531 -255.19888305664062 477.78680419921875 -219.53408813476562 477.635986328125 -181.0386962890625 C 477.48516845703125 -142.5432891845703 477.3454284667969 -106.87850189208984 477.3238525390625 -101.37915802001953 C 477.30230712890625 -95.87981414794922 481.7429504394531 -91.40425109863281 487.2423095703125 -91.38270568847656 C 492.74163818359375 -91.36115264892578 556.7073974609375 -91.11052703857422 630.1138305664062 -90.82291412353516 C 703.520263671875 -90.5353012084961 767.4859619140625 -90.28466796875 772.9853515625 -90.26312255859375 C 778.4846801757812 -90.2415771484375 782.92529296875 -85.76600646972656 782.9037475585938 -80.26666259765625 C 782.8822021484375 -74.76732635498047 782.8341674804688 -62.50755310058594 782.7965087890625 -52.88370132446289 C 782.7587890625 -43.259849548339844 782.7107543945312 -31.000078201293945 782.689208984375 -25.500734329223633 C 782.6676025390625 -20.001392364501953 782.6502685546875 -15.576638221740723 782.6504516601562 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 443.2337341308594 -270.6177673339844 C 443.2150573730469 -270.6049499511719 443.1966247558594 -266.1066589355469 443.19256591796875 -260.570556640625 C 443.1884765625 -255.03445434570312 443.17694091796875 -239.32684326171875 443.166748046875 -225.48660278320312 C 443.15655517578125 -211.64634704589844 443.14501953125 -195.938720703125 443.14093017578125 -190.40261840820312 C 443.1368713378906 -184.8665313720703 438.64569091796875 -180.38192749023438 433.10955810546875 -180.38600158691406 C 427.5734558105469 -180.39007568359375 221.8115692138672 -180.54141235351562 -26.472503662109375 -180.72402954101562 C -274.7565612792969 -180.90663146972656 -480.5184631347656 -181.05796813964844 -486.0545654296875 -181.06204223632812 C -491.5906677246094 -181.06613159179688 -496.08184814453125 -176.58152770996094 -496.0859375 -171.04544067382812 C -496.0899963378906 -165.50933837890625 -496.1139221191406 -132.97210693359375 -496.1393737792969 -98.37149810791016 C -496.1648254394531 -63.77089309692383 -496.1887512207031 -31.23366355895996 -496.19281005859375 -25.697566986083984 C -496.1968994140625 -20.161470413208008 -496.1734619140625 -15.648591995239258 -496.1405029296875 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 496.807373046875 -270.6177673339844 C 496.7884521484375 -270.6295471191406 496.7704162597656 -266.1717529296875 496.76708984375 -260.6610107421875 C 496.7637634277344 -255.15025329589844 496.7563171386719 -242.86505126953125 496.75048828125 -233.2212371826172 C 496.74462890625 -223.57742309570312 496.7371826171875 -211.29222106933594 496.7338562011719 -205.78146362304688 C 496.73052978515625 -200.2707061767578 501.1951599121094 -195.8006591796875 506.7059326171875 -195.7973175048828 C 512.2166748046875 -195.79397583007812 736.302001953125 -195.65830993652344 1007.2144775390625 -195.49429321289062 C 1278.1270751953125 -195.3302764892578 1502.2122802734375 -195.19461059570312 1507.72314453125 -195.19126892089844 C 1513.23388671875 -195.18792724609375 1517.698486328125 -190.71788024902344 1517.695068359375 -185.20712280273438 C 1517.6917724609375 -179.69638061523438 1517.670166015625 -143.9575958251953 1517.646728515625 -105.38233947753906 C 1517.6234130859375 -66.80707550048828 1517.601806640625 -31.068294525146484 1517.598388671875 -25.55754280090332 C 1517.5950927734375 -20.046791076660156 1517.5924072265625 -15.596603393554688 1517.5924072265625 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 502.16741943359375 -270.6177673339844 C 502.14813232421875 -270.62786865234375 502.13055419921875 -266.167236328125 502.128173828125 -260.65472412109375 C 502.1258239746094 -255.1421661376953 502.1234130859375 -249.55616760253906 502.122802734375 -248.17803955078125 C 502.1222229003906 -246.79991149902344 502.11981201171875 -241.2139129638672 502.117431640625 -235.70135498046875 C 502.1150817871094 -230.18881225585938 506.58197021484375 -225.7180938720703 512.094482421875 -225.71572875976562 C 517.6070556640625 -225.71336364746094 787.4906005859375 -225.59738159179688 1114.8963623046875 -225.4566650390625 C 1442.302001953125 -225.3159637451172 1712.185546875 -225.19998168945312 1717.6981201171875 -225.19760131835938 C 1723.210693359375 -225.1952362060547 1727.677490234375 -220.72451782226562 1727.6751708984375 -215.21197509765625 C 1727.6728515625 -209.69943237304688 1727.654541015625 -167.24583435058594 1727.634521484375 -120.38922119140625 C 1727.6143798828125 -73.53260040283203 1727.5960693359375 -31.07900619506836 1727.59375 -25.566463470458984 C 1727.59130859375 -20.053918838500977 1727.58935546875 -15.599738121032715 1727.58935546875 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 488.7629699707031 -270.6177673339844 C 488.74530029296875 -270.6331787109375 488.7258605957031 -266.18157958984375 488.7195129394531 -260.6748352050781 C 488.7131652832031 -255.16807556152344 488.6875 -232.84751892089844 488.66217041015625 -210.82049560546875 C 488.6368103027344 -188.79345703125 488.61114501953125 -166.472900390625 488.60479736328125 -160.9661407470703 C 488.59844970703125 -155.45938110351562 493.05743408203125 -150.99012756347656 498.564208984375 -150.98379516601562 C 504.0709533691406 -150.9774627685547 659.477783203125 -150.79864501953125 845.675048828125 -150.5843963623047 C 1031.872314453125 -150.37014770507812 1187.2791748046875 -150.1913299560547 1192.785888671875 -150.18499755859375 C 1198.292724609375 -150.1786651611328 1202.751708984375 -145.70941162109375 1202.745361328125 -140.20266723632812 C 1202.739013671875 -134.69590759277344 1202.70947265625 -109.02726745605469 1202.679443359375 -82.87016296386719 C 1202.6492919921875 -56.71305465698242 1202.6197509765625 -31.04442024230957 1202.6134033203125 -25.537660598754883 C 1202.6070556640625 -20.030902862548828 1202.6019287109375 -15.589615821838379 1202.6019287109375 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 472.5992736816406 -270.6177673339844 C 472.5970764160156 -270.62774658203125 472.5615539550781 -266.1710510253906 472.51995849609375 -260.6634521484375 C 472.4783630371094 -255.15585327148438 472.1580505371094 -212.74037170410156 471.80450439453125 -165.92581176757812 C 471.450927734375 -119.11123657226562 471.130615234375 -76.69574737548828 471.08905029296875 -71.18815612792969 C 471.0474548339844 -65.68055725097656 475.478515625 -61.18205261230469 480.9861145019531 -61.14045715332031 C 486.49371337890625 -61.0988655090332 504.87109375 -60.960079193115234 522.0331420898438 -60.83047103881836 C 539.1951904296875 -60.700862884521484 557.5725708007812 -60.562076568603516 563.0802001953125 -60.520484924316406 C 568.5877685546875 -60.47888946533203 573.0188598632812 -55.980384826660156 572.977294921875 -50.47278594970703 C 572.9356689453125 -44.96519088745117 572.8935546875 -39.38420486450195 572.8831787109375 -38.00730895996094 C 572.8727416992188 -36.630409240722656 572.8306274414062 -31.049421310424805 572.7890014648438 -25.541826248168945 C 572.7473754882812 -20.034231185913086 572.7138671875 -15.591079711914062 572.7140502929688 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 453.94342041015625 -270.6177673339844 C 453.92718505859375 -270.5985412597656 453.9073181152344 -266.0912780761719 453.8990478515625 -260.55047607421875 C 453.8907775878906 -255.0096893310547 453.8471374511719 -225.81362915039062 453.8016357421875 -195.33926391601562 C 453.756103515625 -164.86488342285156 453.71246337890625 -135.6688232421875 453.70416259765625 -130.12802124023438 C 453.6958923339844 -124.58722686767578 449.1974792480469 -120.10224151611328 443.65667724609375 -120.11051940917969 C 438.1158752441406 -120.1187973022461 304.7283630371094 -120.31810760498047 145.7273406982422 -120.55569458007812 C -13.273691177368164 -120.79328155517578 -146.66119384765625 -120.99259185791016 -152.20199584960938 -121.00086975097656 C -157.74278259277344 -121.00914764404297 -162.24119567871094 -116.52416229248047 -162.24948120117188 -110.98336791992188 C -162.25775146484375 -105.44256591796875 -162.28628540039062 -86.35283660888672 -162.3131866455078 -68.34525299072266 C -162.340087890625 -50.33766555786133 -162.36862182617188 -31.24793243408203 -162.37689208984375 -25.707138061523438 C -162.3851776123047 -20.166343688964844 -162.39193725585938 -15.649178504943848 -162.39198303222656 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 494.126708984375 -270.6177673339844 C 494.10809326171875 -270.6305847167969 494.0896911621094 -266.174560546875 494.08563232421875 -260.6649169921875 C 494.08160400390625 -255.15528869628906 494.0700988769531 -239.52276611328125 494.05999755859375 -225.74868774414062 C 494.04986572265625 -211.97462463378906 494.0383605957031 -196.34210205078125 494.0343017578125 -190.83245849609375 C 494.0302734375 -185.3228302001953 498.493408203125 -180.85311889648438 504.0030517578125 -180.84906005859375 C 509.5126953125 -180.8450164794922 710.7017211914062 -180.6970977783203 953.371337890625 -180.5186767578125 C 1196.041015625 -180.34027099609375 1397.22998046875 -180.19235229492188 1402.7396240234375 -180.18829345703125 C 1408.249267578125 -180.1842498779297 1412.71240234375 -175.71453857421875 1412.7083740234375 -170.20489501953125 C 1412.704345703125 -164.6952667236328 1412.6805419921875 -132.31361389160156 1412.6552734375 -97.87842559814453 C 1412.6298828125 -63.44324493408203 1412.6060791015625 -31.06157875061035 1412.60205078125 -25.551950454711914 C 1412.5980224609375 -20.042322158813477 1412.5947265625 -15.594637870788574 1412.5947265625 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 491.44537353515625 -270.6177673339844 C 491.4271240234375 -270.6318054199219 491.4082946777344 -266.1778259277344 491.40325927734375 -260.66949462890625 C 491.39825439453125 -255.16119384765625 491.3810119628906 -236.18336486816406 491.3647155761719 -218.2813720703125 C 491.3484191894531 -200.37936401367188 491.3311767578125 -181.40155029296875 491.326171875 -175.8932342529297 C 491.3211364746094 -170.38491821289062 495.7824401855469 -165.91549682617188 501.290771484375 -165.91049194335938 C 506.799072265625 -165.9054718017578 685.0948486328125 -165.7432861328125 899.5254516601562 -165.5482177734375 C 1113.9560546875 -165.3531494140625 1292.2518310546875 -165.1909637451172 1297.76025390625 -165.18594360351562 C 1303.2685546875 -165.18093872070312 1307.7298583984375 -160.71151733398438 1307.724853515625 -155.2032012939453 C 1307.7197265625 -149.69488525390625 1307.693359375 -120.66999816894531 1307.665771484375 -90.3742904663086 C 1307.63818359375 -60.07858657836914 1307.61181640625 -31.053693771362305 1307.6068115234375 -25.54538345336914 C 1307.601806640625 -20.03707504272461 1307.5977783203125 -15.592329978942871 1307.5977783203125 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 485.5041198730469 -351.6177673339844 C 485.5022277832031 -351.6827392578125 485.7996520996094 -341.50714111328125 486.16845703125 -328.88995361328125 C 486.5372314453125 -316.27276611328125 486.64312744140625 -305.85345458984375 486.4049377441406 -305.6177673339844"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 484.9925842285156 -416.6177673339844 L 484.9925842285156 -386.6177673339844"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 484.9925842285156 -546.6177978515625 L 484.9925842285156 -516.6177978515625"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 484.9925842285156 -481.6177673339844 L 484.9925842285156 -451.6177673339844"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 220.08187866210938 -15.617770195007324 L 295.0818786621094 -15.617770195007324 L 295.0818786621094 19.382229804992676 L 220.08187866210938 19.382229804992676 L 220.08187866210938 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 864.7273363015069, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.125.149.108</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 430.0818786621094 -15.617770195007324 L 505.0818786621094 -15.617770195007324 L 505.0818786621094 19.382229804992676 L 430.0818786621094 19.382229804992676 L 430.0818786621094 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 950.7591843695093, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.157.253.42</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -1354.9180908203125 139.38223266601562 L -1279.9180908203125 139.38223266601562 L -1279.9180908203125 174.38223266601562 L -1354.9180908203125 174.38223266601562 L -1354.9180908203125 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 230.33472246151445, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.250.138.59</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -1249.9180908203125 139.38223266601562 L -1174.9180908203125 139.38223266601562 L -1174.9180908203125 174.38223266601562 L -1249.9180908203125 174.38223266601562 L -1249.9180908203125 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 271.43660513907605, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.69.109.1423</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#00bfff" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -619.9180908203125 -15.617770195007324 L -544.9180908203125 -15.617770195007324 L -544.9180908203125 19.382229804992676 L -619.9180908203125 19.382229804992676 L -619.9180908203125 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 526.980094201164, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.159.82.135</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -514.9180908203125 139.38223266601562 L -439.9181213378906 139.38223266601562 L -439.9181213378906 174.38223266601562 L -514.9180908203125 174.38223266601562 L -514.9180908203125 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 570.6340320206451, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.68.62.211</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 1060.0819091796875 -15.617770195007324 L 1135.0819091796875 -15.617770195007324 L 1135.0819091796875 19.382229804992676 L 1060.0819091796875 19.382229804992676 L 1060.0819091796875 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 1207.5787133194253, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.97.53.32</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -409.9181213378906 139.38223266601562 L -334.9181213378906 139.38223266601562 L -334.9181213378906 174.38223266601562 L -409.9181213378906 174.38223266601562 L -409.9181213378906 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 611.7359023813383, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.35.238.234</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -1144.9180908203125 139.38223266601562 L -1069.9180908203125 139.38223266601562 L -1069.9180908203125 174.38223266601562 L -1144.9180908203125 174.38223266601562 L -1144.9180908203125 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 316.3665705295169, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.22.93.103</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 1585.0819091796875 -15.617770195007324 L 1660.0819091796875 -15.617770195007324 L 1660.0819091796875 19.382229804992676 L 1585.0819091796875 19.382229804992676 L 1585.0819091796875 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 1418.1922369910726, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.21.187.33</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -934.9180908203125 139.38223266601562 L -859.9180908203125 139.38223266601562 L -859.9180908203125 174.38223266601562 L -934.9180908203125 174.38223266601562 L -934.9180908203125 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 399.84636345559994, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.233.85.112</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -409.9181213378906 -15.617770195007324 L -334.9181213378906 -15.617770195007324 L -334.9181213378906 19.382229804992676 L -409.9181213378906 19.382229804992676 L -409.9181213378906 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 611.7359023813383, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.181.108.77</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -304.9181213378906 -15.617770195007324 L -229.91812133789062 -15.617770195007324 L -229.91812133789062 19.382229804992676 L -304.9181213378906 19.382229804992676 L -304.9181213378906 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 655.3898402008194, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.68.193.47</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -94.91812133789062 -15.617770195007324 L -19.918121337890625 -15.617770195007324 L -19.918121337890625 19.382229804992676 L -94.91812133789062 19.382229804992676 L -94.91812133789062 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 740.1456606978621, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.126.52.27</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 10.081878662109375 -15.617770195007324 L 85.08187866210938 -15.617770195007324 L 85.08187866210938 19.382229804992676 L 10.081878662109375 19.382229804992676 L 10.081878662109375 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 781.2475433754238, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.35.183.112</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -1358.6680908203125 -15.617770195007324 L -1283.6680908203125 -15.617770195007324 L -1283.6680908203125 19.382229804992676 L -1358.6680908203125 19.382229804992676 L -1358.6680908203125 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 228.82122566692436, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.37.244.247</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -1564.9180908203125 139.38223266601562 L -1489.9180908203125 139.38223266601562 L -1489.9180908203125 174.38223266601562 L -1564.9180908203125 174.38223266601562 L -1564.9180908203125 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 148.13095710639107, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.58.74.24</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -1669.9180908203125 139.38223266601562 L -1594.9180908203125 139.38223266601562 L -1594.9180908203125 174.38223266601562 L -1669.9180908203125 174.38223266601562 L -1669.9180908203125 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 104.47701928691006, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.55.160.79</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -1459.9180908203125 139.38223266601562 L -1384.9180908203125 139.38223266601562 L -1384.9180908203125 174.38223266601562 L -1459.9180908203125 174.38223266601562 L -1459.9180908203125 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 186.68078464203333, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.128.212.227</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#00bfff" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 431.2203063964844 -305.6177673339844 L 506.2203063964844 -305.6177673339844 L 506.2203063964844 -270.6177673339844 L 431.2203063964844 -270.6177673339844 L 431.2203063964844 -305.6177673339844 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 952.4946804009621, 442.9211944958623)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.144.39.76</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 447.4925842285156 -386.6177673339844 L 522.4926147460938 -386.6177673339844 L 522.4926147460938 -351.6177673339844 L 447.4925842285156 -351.6177673339844 L 447.4925842285156 -386.6177673339844 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 957.7861425707263, 410.22966373271726)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.86.123.195</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 325.0818786621094 -15.617770195007324 L 400.0818786621094 -15.617770195007324 L 400.0818786621094 19.382229804992676 L 325.0818786621094 19.382229804992676 L 325.0818786621094 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 907.1052465500283, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.118.101.183</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -619.9180908203125 139.38223266601562 L -544.9180908203125 139.38223266601562 L -544.9180908203125 174.38223266601562 L -619.9180908203125 174.38223266601562 L -619.9180908203125 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 525.7040666302044, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.185.110.197</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 447.4925842285156 -516.6177978515625 L 522.4926147460938 -516.6177978515625 L 522.4926147460938 -481.6177673339844 L 447.4925842285156 -481.6177673339844 L 447.4925842285156 -516.6177978515625 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 960.3381977126458, 357.76176253672713)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.62.163.4</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -829.9180908203125 139.38223266601562 L -754.9180908203125 139.38223266601562 L -754.9180908203125 174.38223266601562 L -829.9180908203125 174.38223266601562 L -829.9180908203125 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 442.2242737041213, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.197.194.62</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 447.4925842285156 -451.6177673339844 L 522.4926147460938 -451.6177673339844 L 522.4926147460938 -416.6177673339844 L 447.4925842285156 -416.6177673339844 L 447.4925842285156 -451.6177673339844 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 959.062170141686, 383.99571929315647)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.61.80.228</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 640.0819091796875 -15.617770195007324 L 715.0819091796875 -15.617770195007324 L 715.0819091796875 19.382229804992676 L 640.0819091796875 19.382229804992676 L 640.0819091796875 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 1035.5150171834205, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.168.73.201</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 535.0819091796875 -15.617770195007324 L 610.0819091796875 -15.617770195007324 L 610.0819091796875 19.382229804992676 L 535.0819091796875 19.382229804992676 L 535.0819091796875 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 993.1371069348991, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.202.224.40</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 850.0819091796875 -15.617770195007324 L 925.0819091796875 -15.617770195007324 L 925.0819091796875 19.382229804992676 L 850.0819091796875 19.382229804992676 L 850.0819091796875 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 1120.2708376804633, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.89.231.140</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 745.0819091796875 -15.617770195007324 L 820.0819091796875 -15.617770195007324 L 820.0819091796875 19.382229804992676 L 745.0819091796875 19.382229804992676 L 745.0819091796875 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 1077.8929274319419, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.133.169.10</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 1165.0819091796875 -15.617770195007324 L 1240.0819091796875 -15.617770195007324 L 1240.0819091796875 19.382229804992676 L 1165.0819091796875 19.382229804992676 L 1165.0819091796875 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 1248.680595996987, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.253.25.71</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 955.0819091796875 -15.617770195007324 L 1030.0819091796875 -15.617770195007324 L 1030.0819091796875 19.382229804992676 L 955.0819091796875 19.382229804992676 L 955.0819091796875 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 1162.6487479289847, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.218.254.25</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -724.9180908203125 139.38223266601562 L -649.9180908203125 139.38223266601562 L -649.9180908203125 174.38223266601562 L -724.9180908203125 174.38223266601562 L -724.9180908203125 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 483.32615638168295, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.199.123.242</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 1270.0819091796875 -15.617770195007324 L 1345.0819091796875 -15.617770195007324 L 1345.0819091796875 19.382229804992676 L 1270.0819091796875 19.382229804992676 L 1270.0819091796875 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 1291.0585062455084, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.240.60.82</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 1480.0819091796875 -15.617770195007324 L 1555.0819091796875 -15.617770195007324 L 1555.0819091796875 19.382229804992676 L 1480.0819091796875 19.382229804992676 L 1480.0819091796875 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 1375.8143267425512, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.85.31.233</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 1375.0819091796875 -15.617770195007324 L 1450.0819091796875 -15.617770195007324 L 1450.0819091796875 19.382229804992676 L 1375.0819091796875 19.382229804992676 L 1375.0819091796875 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 1332.16038892307, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.184.80.138</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 1690.0819091796875 -15.617770195007324 L 1765.0819091796875 -15.617770195007324 L 1765.0819091796875 19.382229804992676 L 1690.0819091796875 19.382229804992676 L 1690.0819091796875 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 1460.570147239594, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.94.104.59</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -1039.9180908203125 139.38223266601562 L -964.9180908203125 139.38223266601562 L -964.9180908203125 174.38223266601562 L -1039.9180908203125 174.38223266601562 L -1039.9180908203125 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 357.46845320707854, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.69.109.142</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 447.4925842285156 -581.6177978515625 L 522.4926147460938 -581.6177978515625 L 522.4926147460938 -546.6177978515625 L 447.4925842285156 -546.6177978515625 L 447.4925842285156 -581.6177978515625 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 951.6897853649134, 331.5278180971663)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">jrogers@10.71.99.80</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 1795.0819091796875 -15.617770195007324 L 1870.0819091796875 -15.617770195007324 L 1870.0819091796875 19.382229804992676 L 1795.0819091796875 19.382229804992676 L 1795.0819091796875 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 1500.396002346196, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.186.116.235</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -1879.9180908203125 139.38223266601562 L -1804.9180908203125 139.38223266601562 L -1804.9180908203125 174.38223266601562 L -1879.9180908203125 174.38223266601562 L -1879.9180908203125 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 18.44517121890754, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.113.209.84</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -514.9180908203125 -15.617770195007324 L -439.9181213378906 -15.617770195007324 L -439.9181213378906 19.382229804992676 L -514.9180908203125 19.382229804992676 L -514.9180908203125 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 569.3580044496854, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.174.159.88</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -199.91812133789062 -15.617770195007324 L -124.91812133789062 -15.617770195007324 L -124.91812133789062 19.382229804992676 L -199.91812133789062 19.382229804992676 L -199.91812133789062 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 696.4917228783811, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.86.156.205</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -1774.9180908203125 139.38223266601562 L -1699.9180908203125 139.38223266601562 L -1699.9180908203125 174.38223266601562 L -1774.9180908203125 174.38223266601562 L -1774.9180908203125 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 62.099109038388654, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.70.22.254</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 115.08187866210938 -15.617770195007324 L 190.08187866210938 -15.617770195007324 L 190.08187866210938 19.382229804992676 L 115.08187866210938 19.382229804992676 L 115.08187866210938 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 826.1775087658647, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.162.69.9</text>
</g> <!-- transform -->
</g> <!-- default stroke -->
</svg> <!-- bounding box -->

Before

Width:  |  Height:  |  Size: 90 KiB

View File

@ -1,768 +0,0 @@
<?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 contentScriptType="text/ecmascript" width="2180.2944"
xmlns:xlink="http://www.w3.org/1999/xlink" zoomAndPan="magnify"
contentStyleType="text/css"
viewBox="-1164.000000 -658.000000 2180.294434 1476.000000" height="1476.0"
preserveAspectRatio="xMidYMid meet" xmlns="http://www.w3.org/2000/svg"
version="1.1">
<g id="edges">
<path fill="none" stroke-width="2.0"
d="M -912.969482,-437.985809 L -1015.838867,-522.677551"
class="id_10.37.244.247 id_10.55.160.79" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -859.366089,-404.068451 L -37.105820,-17.449495"
class="id_10.37.244.247 id_10.144.39.76" stroke-opacity="1.0"
stroke="#3fb17d"/>
<path fill="none" stroke-width="2.0"
d="M -892.279968,-449.383942 L -910.226379,-592.119263"
class="id_10.37.244.247 id_10.69.109.142" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -919.999634,-421.715149 L -1098.211182,-444.454681"
class="id_10.37.244.247 id_10.113.209.84" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -858.887939,-430.202942 L -787.476318,-460.641968"
class="id_10.37.244.247 id_10.70.22.254" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -912.150635,-396.397247 L -961.459229,-352.433380"
class="id_10.37.244.247 id_10.250.138.59" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -875.891052,-447.129852 L -823.219177,-572.256104"
class="id_10.37.244.247 id_10.69.109.1423" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -893.783264,-386.180206 L -916.457764,-256.146301"
class="id_10.37.244.247 id_10.22.93.103" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -871.531067,-390.452209 L -831.380981,-325.256287"
class="id_10.37.244.247 id_10.233.85.112" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -902.092529,-446.501129 L -918.236877,-480.230621"
class="id_10.37.244.247 id_10.58.74.24" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -918.135559,-406.219360 L -1066.556885,-349.274231"
class="id_10.37.244.247 id_10.128.212.227" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -29.925459,18.151556 L -167.407059,101.567322"
class="id_10.144.39.76 id_10.118.101.183" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -23.859507,-25.613398 L -187.325195,-201.087463"
class="id_10.144.39.76 id_10.202.224.40" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -34.793209,3.818572 L -360.840515,39.641632"
class="id_10.144.39.76 id_10.133.169.10" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -9.704267,-33.632416 L -76.885841,-266.500488"
class="id_10.144.39.76 id_10.218.254.25" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 25.694565,-23.766424 L 101.073196,-93.470184"
class="id_10.144.39.76 id_10.240.60.82" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -12.910931,32.528763 L -113.043243,284.889984"
class="id_10.144.39.76 id_10.184.80.138" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 27.595112,-21.529890 L 246.075729,-191.943192"
class="id_10.144.39.76 id_10.186.116.235" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 14.871363,-31.686172 L 128.255524,-273.200562"
class="id_10.144.39.76 id_10.86.156.205" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 6.946230,34.299366 L 37.724777,186.240051"
class="id_10.144.39.76 id_10.162.69.9" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 34.997421,-0.028696 L 299.881683,-0.216344"
class="id_10.144.39.76 id_10.125.149.108" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -20.152706,-28.621584 L -96.339890,-136.824356"
class="id_10.144.39.76 id_10.157.253.42" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 33.045601,-11.528593 L 256.542877,-89.467468"
class="id_10.144.39.76 id_10.97.53.32" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -33.800644,-9.097311 L -148.909378,-40.067444"
class="id_10.144.39.76 id_10.174.159.88" stroke-opacity="1.0"
stroke="#3fb17d"/>
<path fill="none" stroke-width="2.0"
d="M 4.514752,34.703358 L 59.019096,453.468719"
class="id_10.144.39.76 id_10.35.238.234" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -18.182711,29.903997 L -107.619461,177.035126"
class="id_10.144.39.76 id_10.21.187.33" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 34.954319,-1.740626 L 153.321793,-7.621346"
class="id_10.144.39.76 id_10.181.108.77" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -26.969805,22.306816 L -297.745728,246.326950"
class="id_10.144.39.76 id_10.68.193.47" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -33.786499,-9.149726 L -275.182495,-74.499298"
class="id_10.144.39.76 id_10.126.52.27" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 20.262844,28.532272 L 93.077118,131.063660"
class="id_10.144.39.76 id_10.35.183.112" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 9.247681,33.751583 L 166.616577,608.013428"
class="id_10.144.39.76 id_10.159.82.135" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 16.550085,30.834547 L 188.363754,350.932343"
class="id_10.144.39.76 id_10.197.194.62" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -10.539809,-33.380039 L -115.267296,-365.098602"
class="id_10.144.39.76 id_10.168.73.201" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 17.914200,-30.070318 L 110.112022,-184.788986"
class="id_10.144.39.76 id_10.89.231.140" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 30.550713,17.069393 L 207.211456,115.788116"
class="id_10.144.39.76 id_10.253.25.71" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -0.002566,-0.003901 C 69.997437,-70.003899 69.997437,69.996101 -0.002566,-0.003901"
class="id_10.144.39.76" stroke-opacity="1.0" stroke="#3fb17d"/>
<path fill="none" stroke-width="2.0"
d="M -31.676073,-14.896484 L -853.936340,-401.515442"
class="id_10.144.39.76 id_10.37.244.247" stroke-opacity="1.0"
stroke="#3fb17d"/>
<path fill="none" stroke-width="2.0"
d="M 2.369656,-34.923420 L 20.438126,-300.894440"
class="id_10.144.39.76 id_10.85.31.233" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 11.223092,-33.154842 L 50.812134,-150.066833"
class="id_10.144.39.76 id_10.94.104.59" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 877.418152,-462.193939 L 860.669128,-453.753052"
class="id_10.62.163.4 id_10.61.80.228" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 801.734619,-423.266937 L 695.957581,-366.839447"
class="id_10.61.80.228 id_10.86.123.195" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -154.703339,-41.626312 L -39.594601,-10.656181"
class="id_10.174.159.88 id_10.144.39.76" stroke-opacity="1.0"
stroke="#3fb17d"/>
<path fill="none" stroke-width="2.0"
d="M 158.538300,669.180908 L 95.676567,758.551147"
class="id_10.159.82.135 id_10.68.62.211" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 204.454956,657.151550 L 276.200684,691.398438"
class="id_10.159.82.135 id_10.185.110.197" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 158.105713,618.662292 L 84.878174,518.254028"
class="id_10.159.82.135 id_10.35.238.234" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 176.414291,643.766663 C 238.557144,581.623779 238.557144,705.909546 176.414291,643.766663"
class="id_10.159.82.135" stroke-opacity="1.0" stroke="#3fb17d"/>
<path fill="none" stroke-width="2.0"
d="M 181.796478,674.368408 L 195.284607,751.058350"
class="id_10.159.82.135 id_10.199.123.242" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 179.841156,612.884766 L 201.418915,418.432251"
class="id_10.159.82.135 id_10.197.194.62" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 637.336548,-335.745758 L 36.272038,-19.112883"
class="id_10.86.123.195 id_10.144.39.76" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 952.074768,-498.519653 L 937.025024,-491.344757"
class="id_joshua@10.71.99.80 id_10.62.163.4" stroke-opacity="1.0"
stroke="#ee7993"/>
</g>
<g id="arrows">
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.37.244.247 id_10.55.160.79"
points="-1020.471008,-526.491150 -1013.932068,-524.993591 -1017.745667,-520.361511"
stroke="none"/>
<polyline fill="#3fb17d" fill-opacity="1.0"
class="id_10.37.244.247 id_10.144.39.76"
points="-31.676073,-14.896483 -38.382328,-14.734623 -35.829311,-20.164368"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.37.244.247 id_10.69.109.142"
points="-910.974854,-598.072388 -907.249817,-592.493530 -913.202942,-591.744995"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.37.244.247 id_10.113.209.84"
points="-1104.162964,-445.214111 -1097.831421,-447.430542 -1098.590942,-441.478821"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.37.244.247 id_10.70.22.254"
points="-781.956848,-462.994659 -786.299988,-457.882202 -788.652649,-463.401733"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.37.244.247 id_10.250.138.59"
points="-965.937683,-348.440399 -963.455688,-354.672577 -959.462769,-350.194183"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.37.244.247 id_10.69.109.1423"
points="-820.891296,-577.786133 -820.454163,-571.092163 -825.984192,-573.420044"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.37.244.247 id_10.22.93.103"
points="-917.488464,-250.235474 -919.413147,-256.661652 -913.502380,-255.630951"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.37.244.247 id_10.233.85.112"
points="-828.234741,-320.147369 -833.935425,-323.683167 -828.826538,-326.829407"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.37.244.247 id_10.58.74.24"
points="-920.827271,-485.642639 -915.530884,-481.525818 -920.942871,-478.935425"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.37.244.247 id_10.128.212.227"
points="-1072.158813,-347.124939 -1067.631470,-352.075165 -1065.482300,-346.473297"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.118.101.183"
points="-172.536697,104.679688 -168.963242,99.002502 -165.850876,104.132141"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.202.224.40"
points="-191.414963,-205.477661 -185.130096,-203.132339 -189.520294,-199.042587"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.133.169.10"
points="-366.804626,40.296913 -361.168152,36.659576 -360.512878,42.623688"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.218.254.25"
points="-78.548988,-272.265381 -74.003395,-267.332062 -79.768288,-265.668915"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.240.60.82"
points="105.478416,-97.543762 103.109985,-91.267570 99.036407,-95.672798"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.184.80.138"
points="-115.256104,290.467010 -115.831757,283.783539 -110.254730,285.996429"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.186.116.235"
points="250.806763,-195.633362 247.920807,-189.577682 244.230652,-194.308701"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.86.156.205"
points="130.805344,-278.631805 130.971146,-271.925659 125.539902,-274.475464"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.162.69.9"
points="38.916000,192.120605 34.784496,186.835663 40.665058,185.644440"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.125.149.108"
points="305.881683,-0.220594 299.883820,2.783655 299.879547,-3.216343"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.157.253.42"
points="-99.794205,-141.730240 -93.886948,-138.551514 -98.792831,-135.097198"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.97.53.32"
points="262.208282,-91.443130 257.530701,-86.634766 255.555054,-92.300171"
stroke="none"/>
<polyline fill="#3fb17d" fill-opacity="1.0"
class="id_10.144.39.76 id_10.174.159.88"
points="-154.703339,-41.626312 -148.129944,-42.964420 -149.688812,-37.170467"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.35.238.234"
points="59.793495,459.418518 56.044189,453.855927 61.994003,453.081512"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.21.187.33"
points="-110.736053,182.162186 -110.182999,175.476822 -105.055923,178.593430"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.181.108.77"
points="159.314407,-7.919070 153.470657,-4.625041 153.172928,-10.617651"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.68.193.47"
points="-302.368683,250.151642 -299.658081,244.015472 -295.833374,248.638428"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.126.52.27"
points="-280.974030,-76.067154 -274.398560,-77.395065 -275.966431,-71.603531"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.35.183.112"
points="96.551186,135.955566 90.631157,132.800690 95.523079,129.326630"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.159.82.135"
points="168.202332,613.800049 163.723251,608.806335 169.509903,607.220520"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.197.194.62"
points="191.201355,356.218933 185.720459,352.351135 191.007050,349.513550"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.168.73.201"
points="-117.073685,-370.820221 -112.406487,-366.001801 -118.128105,-364.195404"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.89.231.140"
points="113.183472,-189.943237 112.689140,-183.253265 107.534904,-186.324707"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.253.25.71"
points="212.449158,118.714966 205.748032,118.406967 208.674881,113.169266"
stroke="none"/>
<polyline fill="#3fb17d" fill-opacity="1.0"
class="id_10.144.39.76 id_10.37.244.247"
points="-859.366089,-404.068451 -852.659851,-404.230316 -855.212830,-398.800568"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.85.31.233"
points="20.844793,-306.880615 23.431227,-300.691101 17.445024,-301.097778"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.94.104.59"
points="52.736534,-155.749847 53.653641,-149.104630 47.970627,-151.029037"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.62.163.4 id_10.61.80.228"
points="855.311096,-451.052826 859.319031,-456.432068 862.019226,-451.074036"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.61.80.228 id_10.86.123.195"
points="690.663696,-364.015411 694.545532,-369.486359 697.369629,-364.192535"
stroke="none"/>
<polyline fill="#3fb17d" fill-opacity="1.0"
class="id_10.174.159.88 id_10.144.39.76"
points="-33.800644,-9.097311 -40.374035,-7.759203 -38.815166,-13.553160"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.159.82.135 id_10.68.62.211"
points="92.224655,763.458740 93.222778,756.825195 98.130356,760.277100"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.159.82.135 id_10.185.110.197"
points="281.615417,693.983093 274.908356,694.105835 277.493011,688.691040"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.159.82.135 id_10.35.238.234"
points="81.342728,513.406311 87.302048,516.486328 82.454300,520.021729"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.159.82.135 id_10.199.123.242"
points="196.323929,756.967651 192.329956,751.578003 198.239258,750.538696"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.159.82.135 id_10.197.194.62"
points="202.080658,412.468872 204.400620,418.763123 198.437210,418.101379"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.86.123.195 id_10.144.39.76"
points="30.963560,-16.316446 34.873817,-21.767122 37.670258,-16.458643"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_joshua@10.71.99.80 id_10.62.163.4"
points="931.609009,-488.762695 935.734009,-494.052765 938.316040,-488.636749"
stroke="none"/>
</g>
<g id="nodes">
<circle fill-opacity="1.0" fill="#ee7993" r="30.964285" cx="-888.2924"
class="id_10.37.244.247" cy="-417.66934" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-1043.6316"
class="id_10.55.160.79" cy="-545.5591" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#3fb17d" r="34.0" cx="-0.0025655753"
class="id_10.144.39.76" cy="-0.0039011668" stroke="#2c7b57"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-198.18489"
class="id_10.118.101.183" cy="120.2415" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.178572" cx="904.36786"
class="id_10.62.163.4" cy="-475.77557" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.178572" cx="828.3614"
class="id_10.61.80.228" cy="-437.4712" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-211.86377"
class="id_10.202.224.40" cy="-227.42867" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-396.62518"
class="id_10.133.169.10" cy="43.57332" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-86.86473"
class="id_10.218.254.25" cy="-301.0898" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="127.504524"
class="id_10.240.60.82" cy="-117.911644" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-126.32042"
class="id_10.184.80.138" cy="318.35214" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-914.71735"
class="id_10.69.109.142" cy="-627.838" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="274.4619"
class="id_10.186.116.235" cy="-214.08421" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-1133.9216"
class="id_10.113.209.84" cy="-449.0113" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.178572" cx="-183.84555"
class="id_10.174.159.88" cy="-49.46706" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="143.55443"
class="id_10.86.156.205" cy="-305.78802" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-754.3593"
class="id_10.70.22.254" cy="-474.75803" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="44.872112"
class="id_10.162.69.9" cy="221.5234" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="335.88168"
class="id_10.125.149.108" cy="-0.24184658" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-117.06575"
class="id_10.157.253.42" cy="-166.25969" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-988.3297"
class="id_10.250.138.59" cy="-328.47552" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-809.252"
class="id_10.69.109.1423" cy="-605.4362" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#3fb17d" r="30.071428" cx="176.41429"
class="id_10.159.82.135" cy="643.76666" stroke="#2c7b57"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="74.96507"
class="id_10.68.62.211" cy="787.9966" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="290.53528"
class="id_10.97.53.32" cy="-101.321434" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="63.66548"
class="id_10.35.238.234" cy="489.1676" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-922.6419"
class="id_10.22.93.103" cy="-220.68143" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-126.31904"
class="id_10.21.187.33" cy="207.79753" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-812.5034"
class="id_10.233.85.112" cy="-294.60278" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="189.27745"
class="id_10.181.108.77" cy="-9.407691" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-325.48346"
class="id_10.68.193.47" cy="269.27512" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-309.93167"
class="id_10.126.52.27" cy="-83.90643" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="113.92154"
class="id_10.35.183.112" cy="160.41515" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-933.77936"
class="id_10.58.74.24" cy="-512.70264" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-1100.168"
class="id_10.128.212.227" cy="-336.3786" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.178572" cx="664.0369"
class="id_10.86.123.195" cy="-349.81116" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="308.68918"
class="id_10.185.110.197" cy="706.90643" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="205.38934"
class="id_10.197.194.62" cy="382.6519" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-126.105606"
class="id_10.168.73.201" cy="-399.42834" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="128.5407"
class="id_10.89.231.140" cy="-215.71445" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="238.63768"
class="id_10.253.25.71" cy="133.34921" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="201.52052"
class="id_10.199.123.242" cy="786.51416" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="22.878126"
class="id_10.85.31.233" cy="-336.81165" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="62.358524"
class="id_10.94.104.59" cy="-184.16493" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#c0c0c0" r="29.178572" cx="979.3159"
class="id_joshua@10.71.99.80" cy="-511.50677" stroke="#868686"
stroke-opacity="1.0" stroke-width="2.0"/>
</g>
<g id="node-labels">
<text font-size="8" x="-888.2924" y="-416.20645" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.37.244.247">
10.37.244.247
</text>
<text font-size="8" x="-1043.6316" y="-544.09717" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.55.160.79">
10.55.160.79
</text>
<text font-size="8" x="-0.0025655753" y="1.4589895" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.144.39.76">
10.144.39.76
</text>
<text font-size="8" x="-198.18489" y="121.70439" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.118.101.183">
10.118.101.183
</text>
<text font-size="8" x="904.36786" y="-474.31268" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.62.163.4">
10.62.163.4
</text>
<text font-size="8" x="828.3614" y="-436.00928" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.61.80.228">
10.61.80.228
</text>
<text font-size="8" x="-211.86377" y="-225.96675" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.202.224.40">
10.202.224.40
</text>
<text font-size="8" x="-396.62518" y="45.03621" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.133.169.10">
10.133.169.10
</text>
<text font-size="8" x="-86.86473" y="-299.6279" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.218.254.25">
10.218.254.25
</text>
<text font-size="8" x="127.504524" y="-116.44973" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.240.60.82">
10.240.60.82
</text>
<text font-size="8" x="-126.32042" y="319.81503" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.184.80.138">
10.184.80.138
</text>
<text font-size="8" x="-914.71735" y="-626.3761" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.69.109.142">
10.69.109.142
</text>
<text font-size="8" x="274.4619" y="-212.62132" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.186.116.235">
10.186.116.235
</text>
<text font-size="8" x="-1133.9216" y="-447.5484" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.113.209.84">
10.113.209.84
</text>
<text font-size="8" x="-183.84555" y="-48.005146" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.174.159.88">
10.174.159.88
</text>
<text font-size="8" x="143.55443" y="-304.3261" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.86.156.205">
10.86.156.205
</text>
<text font-size="8" x="-754.3593" y="-473.2961" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.70.22.254">
10.70.22.254
</text>
<text font-size="8" x="44.872112" y="222.98532" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.162.69.9">
10.162.69.9
</text>
<text font-size="8" x="335.88168" y="1.2200675" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.125.149.108">
10.125.149.108
</text>
<text font-size="8" x="-117.06575" y="-164.7968" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.157.253.42">
10.157.253.42
</text>
<text font-size="8" x="-988.3297" y="-327.01263" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.250.138.59">
10.250.138.59
</text>
<text font-size="8" x="-809.252" y="-603.9733" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.69.109.1423">
10.69.109.1423
</text>
<text font-size="8" x="176.41429" y="645.22955" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.159.82.135">
10.159.82.135
</text>
<text font-size="8" x="74.96507" y="789.4585" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.68.62.211">
10.68.62.211
</text>
<text font-size="8" x="290.53528" y="-99.85854" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.97.53.32">
10.97.53.32
</text>
<text font-size="8" x="63.66548" y="490.6305" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.35.238.234">
10.35.238.234
</text>
<text font-size="8" x="-922.6419" y="-219.21854" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.22.93.103">
10.22.93.103
</text>
<text font-size="8" x="-126.31904" y="209.26042" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.21.187.33">
10.21.187.33
</text>
<text font-size="8" x="-812.5034" y="-293.1399" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.233.85.112">
10.233.85.112
</text>
<text font-size="8" x="189.27745" y="-7.945777" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.181.108.77">
10.181.108.77
</text>
<text font-size="8" x="-325.48346" y="270.738" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.68.193.47">
10.68.193.47
</text>
<text font-size="8" x="-309.93167" y="-82.44452" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.126.52.27">
10.126.52.27
</text>
<text font-size="8" x="113.92154" y="161.87804" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.35.183.112">
10.35.183.112
</text>
<text font-size="8" x="-933.77936" y="-511.24072" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.58.74.24">
10.58.74.24
</text>
<text font-size="8" x="-1100.168" y="-334.9167" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.128.212.227">
10.128.212.227
</text>
<text font-size="8" x="664.0369" y="-348.34827" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.86.123.195">
10.86.123.195
</text>
<text font-size="8" x="308.68918" y="708.36835" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.185.110.197">
10.185.110.197
</text>
<text font-size="8" x="205.38934" y="384.1138" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.197.194.62">
10.197.194.62
</text>
<text font-size="8" x="-126.105606" y="-397.96545" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.168.73.201">
10.168.73.201
</text>
<text font-size="8" x="128.5407" y="-214.25156" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.89.231.140">
10.89.231.140
</text>
<text font-size="8" x="238.63768" y="134.8121" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.253.25.71">
10.253.25.71
</text>
<text font-size="8" x="201.52052" y="787.97705" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.199.123.242">
10.199.123.242
</text>
<text font-size="8" x="22.878126" y="-335.34875" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.85.31.233">
10.85.31.233
</text>
<text font-size="8" x="62.358524" y="-182.70302" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.94.104.59">
10.94.104.59
</text>
<text font-size="8" x="979.3159" y="-509.62787" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_joshua@10.71.99.80">
joshua@10.71.99.80
</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 431 KiB

View File

@ -1,108 +0,0 @@
#!/usr/bin/env python3
# <https://github.com/MegaManSec/SSH-Snake>
# By Joshua Rogers <https://joshua.hu/>
# GPL 3, of course.
import re
import heapq
from collections import defaultdict
import argparse
def indirect_get_connected_nodes(graph, interesting_host, ignore_dest_user):
connected_nodes = set()
sentinel = '__SENTINEL__'
heap = [(interesting_host, sentinel)]
while heap:
current_node, parent_node = heapq.heappop(heap)
if current_node not in connected_nodes:
connected_nodes.add(current_node)
if parent_node is not sentinel:
heapq.heappush(heap, (parent_node, sentinel))
if current_node in graph:
for connection in graph[current_node]:
if ignore_dest_user:
node = connection[4] # dest_host
else:
node = f"{connection[3]}@{connection[4]}" #dest_host@dest_user
heapq.heappush(heap, (node, current_node))
return connected_nodes
def build_lookup_table(input_lines, ignore_dest_user):
graph = defaultdict(set)
for line in input_lines:
line = line.strip()
line = re.sub(r"^\[?\d+\]?\s*", "", line)
prev_dest_host = None
if ": " in line or "]->" not in line or not line[-1].isdigit():
continue
pattern = re.compile(r"(\w+)@(\d+\.\d+\.\d+\.\d+)(\[[^\]]+\])->(?=(\w+)@(\d+\.\d+\.\d+\.\d+))")
matches = re.finditer(pattern, line)
for match in matches:
user, host, path, dest_user, dest_host = match.groups()
if host == "(127.0.0.1)" or host == "127.0.0.1":
if prev_dest_host is not None:
host = prev_dest_host
if dest_host == "(127.0.0.1)" or dest_host == "127.0.0.1":
dest_host = host
prev_dest_host = dest_host
else:
prev_dest_host = None
line_to_add = (user, host, path, dest_user, dest_host)
if ignore_dest_user:
graph[host].add(line_to_add)
else:
graph[f"{user}@{host}"].add(line_to_add)
return graph
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Find all of the destinations that a source 'host' or 'user@host' can directly or indirectly access.")
parser.add_argument("--file", help="Path to a file containing the output of SSH-Snake.")
parser.add_argument("--src", help="The host or destination that we are interested in finding out from which other hosts can be connected to. This may either be in the form of 'host' or 'user@host'.")
parser.add_argument("--mode", choices=['directly', 'indirectly'], help="Specify whether to search for directly connected hosts or indirectly connected hosts. Note: 'indirectly' includes 'directly' entries.")
args = parser.parse_args()
file_path = args.file
interesting_host = args.src
mode = args.mode
ignore_dest_user = False
if not any(vars(args).values()) or mode not in ("directly", "indirectly"):
parser.print_help()
exit()
if '@' not in interesting_host:
ignore_dest_user = True
with open(file_path, 'r') as file:
input_lines = file.readlines()
lookup_table = build_lookup_table(input_lines, ignore_dest_user)
if interesting_host in lookup_table:
print(f"{interesting_host} is able to connect {mode} to:\n")
if mode == "indirectly":
result = indirect_get_connected_nodes(lookup_table, interesting_host, ignore_dest_user)
for dest in result:
print(dest)
else:
for entry in lookup_table[interesting_host]:
user, host, path, dest_user, dest_host = entry
print(f"{user}@{host}{path} -> {dest_user}@{dest_host}")
else:
print(f"{interesting_host} cannot connect {mode} to any other destinations.")

View File

@ -1,122 +0,0 @@
import argparse
import re
from collections import defaultdict
import networkx as nx
from networkx.drawing.nx_agraph import write_dot
def create_graph_from_edges(lookup_table):
graph = nx.DiGraph()
for source, dest in lookup_table:
graph.add_edge(source, dest)
return graph
def build_lookup_table(input_lines, ignore_dest_user, dot):
lookup_table = set()
for line in input_lines:
line = line.strip()
line = re.sub(r"^\[?\d+\]?\s*", "", line)
if ": " in line or "]->" not in line or not line[-2].isdigit() or not line[-1] == ')':
continue
pattern = re.compile(r"(\w+)@\(([\d\.:]+)\)(\[[^\]]+\])->(?=(\w+)@\(([\d\.:]+)\))")
matches = re.finditer(pattern, line)
previous_dest_host = None
for match in matches:
user, host, _, dest_user, dest_host = match.groups()
if dot:
user = f'"{user}'
host = f'{host}"'
dest_user = f'"{dest_user}'
dest_host = f'{dest_host}"'
if host == "(127.0.0.1)" or host == "127.0.0.1":
if prev_dest_host is not None:
host = prev_dest_host
if dest_host == "(127.0.0.1)" or dest_host == "127.0.0.1":
dest_host = host
prev_dest_host = dest_host
else:
prev_dest_host = None
if ignore_dest_user:
target_range = (host, dest_host)
else:
target_range = (f"{user}@{host}", f"{dest_user}@{dest_host}")
lookup_table.add(target_range)
return lookup_table
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Construct a graph file to visualize the relation between servers discovered by SSH-Snake.")
parser.add_argument("--file", help="Path to a file containing the output of SSH-Snake.")
parser.add_argument("--format", help="The format of the graph file to export. The options are gexf or dot.")
parser.add_argument("--with-users", action="store_true", help="Create nodes based on their 'user@host' instead of just 'host'. This setting is optional and not recommended.")
args = parser.parse_args()
if not any(vars(args).values()):
parser.print_help()
exit()
if args.format not in ("gexf", "dot"):
print("Valid options for --format are: gexf or dot")
exit()
with open(args.file, 'r') as file:
input_lines = file.readlines()
ignore_dest_user = True
if args.with_users:
ignore_dest_user = False
lookup_table = build_lookup_table(input_lines, ignore_dest_user, args.format == "dot")
graph = create_graph_from_edges(lookup_table)
if len(lookup_table) > 500 and args.format == "dot":
print("The list of connections is quite big; YMMV with a .dot file.")
# Set default edge color to green
for edge in graph.edges():
graph.edges[edge]['color'] = '#006400'
# Set default node color to lightgrey.
for node in graph.nodes():
graph.nodes[node]['fillcolor'] = 'lightgrey'
graph.nodes[node]['style'] = 'filled'
# Set any edges that correspond to a dest1 being able to connect to dest2 and backwards (dest1<--->dest2) to red.
for source, dest in graph.edges():
if (dest, source) in graph.edges():
graph.edges[(source, dest)]['dir'] = 'both'
graph.edges[(source, dest)]['color'] = '#CD5C5C'
# Set any node corresponding to a loopback (dest1<--->dest1) to blue
for node in graph.nodes():
if graph.has_edge(node, node) or any((edge[0] == edge[1] == node) for edge in graph.edges()):
graph.nodes[node]['fillcolor'] = '#00BFFF'
output_dot_file_path = "SSHSnake_dot_file.dot"
output_gexf_file_path = "SSHSnake_gexf_file.gexf"
if args.format == "gexf":
nx.write_gexf(graph, output_gexf_file_path)
print("Your gexf file has been created in ./sshsnake_gexf_file.gexf")
print("You can now open the file using Gephi.\n")
print("Or you can use Cytoscape! Take a look at GRAPHICS.md")
else:
nx.drawing.nx_pydot.write_dot(graph, output_dot_file_path)
print("Your dot file has been created in ./sshsnake_dot_file.dot.\n")
print("To convert your dot file to a png or svg, use the following command to sample different algorithms available from graphviz:\n")
print("for alg in sfdp fdp circo twopi neato dot; do\n\t$alg -Tpng -Gsplines=true -Gconcentrate=true -Gnodesep=0.1 -Goverlap=false SSHSnake_dot_file.dot -o $alg.png\ndone\n\n")
print("Alternatively, you can just paste the .dot file into https://dreampuf.github.io/GraphvizOnline/ -- if pasting that type of information into your browser is in your threat model...\n\n")
print("Try placing splines=true; concentrate=true; nodesep=0.1; overlap=false; in the file just after the first line, too!")

View File

@ -1,106 +0,0 @@
#!/usr/bin/env python3
# <https://github.com/MegaManSec/SSH-Snake>
# By Joshua Rogers <https://joshua.hu/>
# GPL 3, of course.
import re
import heapq
from collections import defaultdict
import argparse
def indirect_get_connected_nodes(graph, interesting_host, ignore_dest_user):
backward_connected_nodes = set()
sentinel = '__SENTINEL__'
backward_heap = [(interesting_host, sentinel)]
while backward_heap:
current_node, parent_node = heapq.heappop(backward_heap)
if current_node not in backward_connected_nodes:
backward_connected_nodes.add(current_node)
if parent_node is not sentinel:
heapq.heappush(backward_heap, (parent_node, sentinel))
if current_node in graph:
for connection in graph[current_node]:
if ignore_dest_user:
node = connection[1] # host
else:
node = f"{connection[0]}@{connection[1]}" # user@host
heapq.heappush(backward_heap, (node, current_node))
return backward_connected_nodes
def build_lookup_table(input_lines, ignore_dest_user):
graph = defaultdict(set)
for line in input_lines:
line = line.strip()
line = re.sub(r"^\[?\d+\]?\s*", "", line)
prev_dest_host = None
if ": " in line or "]->" not in line or not line[-1].isdigit():
continue
pattern = re.compile(r"(\w+)@(\d+\.\d+\.\d+\.\d+)(\[[^\]]+\])->(?=(\w+)@(\d+\.\d+\.\d+\.\d+))")
matches = re.finditer(pattern, line)
for match in matches:
user, host, path, dest_user, dest_host = match.groups()
if host == "(127.0.0.1)" or host == "127.0.0.1":
if prev_dest_host is not None:
host = prev_dest_host
if dest_host == "(127.0.0.1)" or dest_host == "127.0.0.1":
dest_host = host
prev_dest_host = dest_host
else:
prev_dest_host = None
line_to_add = (user, host, path, dest_user, dest_host)
if ignore_dest_user:
graph[dest_host].add(line_to_add)
else:
graph[f"{dest_user}@{dest_host}"].add(line_to_add)
return graph
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Given the address of a destination host, determine how many other hosts can connect directly or indirectly to it. The format of the host to be found must either be 'host' or 'user@host', where 'host' is an IP address.")
parser.add_argument("--file", help="Path to a file containing the output of SSH-Snake.")
parser.add_argument("--dest", help="The host or destination that we are interested in finding incoming connections to. This may either be in the form of 'host' or 'user@host'.")
parser.add_argument("--mode", choices=['directly', 'indirectly'], help="Specify whether to search for directly connected hosts or indirectly connected hosts. Note: 'indirectly' includes 'directly' entries.")
args = parser.parse_args()
file_path = args.file
interesting_host = args.dest
mode = args.mode
ignore_dest_user = False
if not any(vars(args).values()) or mode not in ("directly", "indirectly"):
parser.print_help()
exit()
if '@' not in interesting_host:
ignore_dest_user = True
with open(file_path, 'r') as file:
input_lines = file.readlines()
reverse_lookup_table = build_lookup_table(input_lines, ignore_dest_user)
if interesting_host in reverse_lookup_table:
print(f"The following hosts are able to connect {mode} to {interesting_host}:\n")
if mode == "directly":
for entry in reverse_lookup_table[interesting_host]:
user, host, path, dest_user, dest_host = entry
print(f"{user}@{host}{path} -> {dest_user}@{dest_host}")
else:
result = indirect_get_connected_nodes(reverse_lookup_table, interesting_host, ignore_dest_user)
for entry in result:
print(entry)
else:
print(f"No hosts are able to {mode} connect to {interesting_host}.")

View File

@ -1,169 +0,0 @@
#!/usr/bin/env python3
# <https://github.com/MegaManSec/SSH-Snake>
# By Joshua Rogers <https://joshua.hu/>
# GPL 3, of course.
import re
import heapq
import argparse
class Graph:
def __init__(self):
self.graph = {}
def add_edge(self, start, end):
if start not in self.graph:
self.graph[start] = []
self.graph[start].append(end)
def dijkstra(self, start, end):
heap = [(0, start, [])]
visited = set()
while heap:
(cost, node, path) = heapq.heappop(heap)
if node not in visited:
visited.add(node)
path = path + [node]
if node == end:
return path
for neighbor in self.graph.get(node, []):
if neighbor not in visited:
heapq.heappush(heap, (cost + 1, neighbor, path))
return None
def build_lookup_table(input_lines, ignore_dest_user):
lookup_table = {}
for line in input_lines:
line = line.strip()
line = re.sub(r"^\[?\d+\]?\s*", "", line)
prev_dest_host = None
if ": " in line or "]->" not in line or not line[-1].isdigit():
continue
pattern = re.compile(r"(\w+)@(\d+\.\d+\.\d+\.\d+)(\[[^\]]+\])->(?=(\w+)@(\d+\.\d+\.\d+\.\d+))")
matches = re.finditer(pattern, line)
for match in matches:
user, host, path, dest_user, dest_host = match.groups()
if host == "(127.0.0.1)" or host == "127.0.0.1":
if prev_dest_host is not None:
host = prev_dest_host
if dest_host == "(127.0.0.1)" or dest_host == "127.0.0.1":
dest_host = host
prev_dest_host = dest_host
else:
prev_dest_host = None
if ignore_dest_user:
target_range = (host, dest_host)
else:
target_range = (f"{user}@{host}", f"{dest_user}@{dest_host}")
if target_range in lookup_table:
continue
entry = [user, host, path, dest_user, dest_host]
lookup_table[target_range] = entry
return lookup_table
def build_full_path(lookup_table, sequence):
result_str = ""
for i in range(len(sequence)-1):
target_range = (sequence[i], sequence[i+1])
if target_range in lookup_table:
user, host, path, dest_user, dest_host = lookup_table[target_range]
if i == len(sequence)-2:
result_str += f"{user}@{host}{path}->{dest_user}@{dest_host}"
else:
result_str += f"{user}@{host}{path}->"
else:
print(f"Could not find {target_range[0]}->{target_range[1]}")
exit()
result_str = result_str.rstrip("->")
return result_str
def build_cmd(lookup_table, sequence):
result_str = ""
for i in range(len(sequence)-1):
target_range = (sequence[i], sequence[i+1])
if target_range in lookup_table:
user, host, path, dest_user, dest_host = lookup_table[target_range]
path = path.split('[')[1].split(']')[0]
if path[0] == "!":
result_str += "sudo "
path = path[1:]
result_str += f"ssh -t -oIdentitiesOnly=yes -oServerAliveInterval=300 -oTCPKeepAlive=no -oConnectTimeout=5 -oStrictHostKeyChecking=no -oGlobalKnownHostsFile=/dev/null -oUserKnownHostsFile=/dev/null -oBatchMode=yes -i \"{path}\" {dest_user}@{dest_host} '"
else:
print(f"Could not find {target_range[0]}->{target_range[1]}")
exit()
for i in range(len(sequence)-3):
result_str += "'"
result_str = result_str.rstrip("->")
return result_str
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Find the shortest path from host_a to host_b, or user_a@host_a to user_b@host_b. Likewise, create a single command which can be used to ssh from from a to b.")
parser.add_argument("--file", help="Path to a file containing the output of SSH-Snake.")
parser.add_argument("--src", help="The starting host or user@host in the chain.")
parser.add_argument("--dest", help="The ending host or user@host in the chain.")
args = parser.parse_args()
file_path = args.file
host_a = args.src
host_b = args.dest
ignore_dest_user = False
if not any(vars(args).values()):
parser.print_help()
exit()
if '@' not in host_a:
if '@' not in host_b:
ignore_dest_user = True
else:
print("host_a and host_b must be either host_a and host_b, or user_a@host_a and user_b@host_b")
exit()
elif '@' not in host_b:
if '@' in host_a:
print("host_a and host_b must be either host_a and host_b, or user_a@host_a and user_b@host_b")
exit()
with open(file_path, 'r') as file:
input_lines = file.readlines()
lookup_table = build_lookup_table(input_lines, ignore_dest_user)
graph = Graph()
for edge in lookup_table:
graph.add_edge(edge[0], edge[1])
path = graph.dijkstra(host_a, host_b)
if path:
print(f"Shortest path from {host_a} to {host_b}: {'->'.join(path)}\n")
else:
print(f"No path found from {host_a} to {host_b}")
exit()
result_str = build_full_path(lookup_table, path)
print(result_str,"\n")
result_str = build_cmd(lookup_table, path)
print(result_str)

1
views/main.html Normal file
View File

@ -0,0 +1 @@
<div id="network" ng-style="{'background-color': bg.color}"></div><div class="loading"><span us-spinner="{radius:30, width:3, length: 100}"></span></div><div class="summary" ng-show="overlayState.show"><h3>Network:</h3><select class="form-control" id="network-selector" ng-options="networkName for networkName in networkNames" ng-change="switchNetwork()" ng-model="currentNetwork"></select><h3>Visual Style:</h3><select class="form-control" id="vs-selector" ng-options="styleName for styleName in visualStyleNames" ng-change="switchVS()" ng-model="currentVS"></select><h3>Layout:</h3><select class="form-control" id="layout-selector" ng-options="layoutName for layoutName in LAYOUTS" ng-change="switchLayout()" ng-model="currentLayout"></select></div><div ng-show="browserState.show" class="table-browser"><div id="table-view"><tabset justified="true"><tab heading="Node"><table class="table table-striped table-bordered table-hover"><thead><tr><td>SUID<td ng-repeat="columnName in columnNames">{{columnName}}<tbody data-ng-repeat="node in selectedNodes"><tr><td>{{ node.id() }}<td ng-repeat="colName in columnNames">{{node.data(colName)}}</table></tab><tab heading="Edge"><table class="table table-striped table-bordered table-hover"><thead><tr><td>SUID<td ng-repeat="columnName in edgeColumnNames">{{columnName}}<tbody data-ng-repeat="edge in selectedEdges"><tr><td>{{ edge.id() }}<td ng-repeat="colName in edgeColumnNames">{{edge.data(colName)}}</table></tab></tabset></div></div><div class="home-button" ng-click="toggleToolbar()" style="clear:both" tooltip-placement="left" tooltip="Show/Hide Toolbar"><span class="glyphicon glyphicon-sort"></span></div><div class="command-bar" ng-show="toolbarState.show"><div class="icon-button" ng-click="toggleTableBrowser()" tooltip-placement="left" tooltip="Show/Hide Table"><span class="glyphicon glyphicon-list-alt"></span></div><div class="icon-button" ng-click="toggleOverlay()" tooltip-placement="left" tooltip="Show/Hide Selector"><span class="glyphicon glyphicon-info-sign"></span></div><div class="icon-button" ng-click="fit()" tooltip-placement="left" tooltip="Fit to window"><span class="glyphicon glyphicon-resize-full"></span></div><div class="icon-button" colorpicker="" colorpicker-position="left" ng-model="bg.color" tooltip-placement="left" tooltip="Set Background Color"><span class="glyphicon glyphicon-tint"></span></div></div>