[docysserver] Move to the Hugo/Docsy set of files as the primary documentation.

Bug: skia:11799
Change-Id: Ic9e9bc6a91cf1a7c9166ca1eae4aec6b00eb5e2a
Docs-Preview: https://skia.org/?cl=391436
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/391436
Reviewed-by: Heather Miller <hcm@google.com>
This commit is contained in:
Joe Gregorio 2021-03-31 15:06:18 -04:00
parent c44612bffc
commit 10d45b867f
227 changed files with 84 additions and 22578 deletions

View File

@ -1,4 +0,0 @@
{
"dirOrder": ["user", "dev"],
"fileOrder": []
}

View File

@ -1,13 +0,0 @@
{
"dirOrder": [
"contrib",
"tools",
"testing",
"design",
"present",
"runtime",
"chrome",
"gardening"
],
"fileOrder": []
}

View File

@ -1,87 +0,0 @@
Blink layout tests
==================
How to land Skia changes that change Blink layout test results.
Changes that affect a small number of layout test results
---------------------------------------------------------
Changes affecting fewer than ~20 layout tests can be rebaselined without
special coordination with the Blink gardener using these steps:
1. Prepare your Skia change, taking note of which layout tests will turn red
\(see http://www.chromium.org/developers/testing/webkit-layout-tests for more
detail on running the Blink layout tests\).
2. Check in your code to the Skia repo.
3. Ahead of the Skia auto roll including your change, manually push a change to the
Blink LayoutTests/TestExpectations [file](https://chromium.googlesource.com/chromium/src/+/master/third_party/blink/web_tests/TestExpectations), flagging tests expected to fail as a result of your change as follows:
foo/bar/test-name.html [ Failure Pass ] # Needs rebaseline
4. Wait for the Skia roll to land successfully.
5. Check in another change to the Blink TestExpectations file removing all the
skipped test expectations you add earlier, an run `git cl rebaseline` which will prompt the automatic rebaseline.
Changes that affect a large number of test results
--------------------------------------------------
Where a 'large number' or 'many' means more than about 20.
Follow the instructions below:
In the following the term 'code suppression' means a build flag \(a\.k\.a\. define\).
Such code suppressions should be given a name with the form SK\_IGNORE\_xxx\_FIX.
Updating the version of Skia in Chromium is called a 'roll'.
The Auto Roll Bot performs this roll multiple times per day, and can also be done manually.
See https://chromium.googlesource.com/chromium/src/+log/master/DEPS and search for skia\-deps\-roller.
### Setup
#### Code suppression does not yet exist \- Direct method
1. Make a change in Skia which will change many Blink layout tests.
2. Put the change behind a code suppression.
3. Check in the change to the Skia repository.
4. Manually roll Skia or append the autoroll with the code suppression to
Chromium's 'skia/chromium\_skia\_defines\.gypi'
#### Code suppression does not yet exist \- Alternate method
1. Add code suppression to Chromium's 'skia/chromium\_skia\_defines\.gypi' before making code
changes in Skia.
2. Make a change in Skia which will change many Blink layout tests.
3. Put the change behind a code suppression.
4. Check in the change to the Skia repository.
5. Wait for Skia roll into Chromium.
#### Code suppression exists in header
1. Remove code suppression from header file in Chromium and add code suppression to
Chromium's 'skia/chromium\_skia\_defines\.gypi'.
The code suppression cannot be in a header file and a defined in a gyp file at the
same time or a multiple definition warning will be treated as an error and break
the Chromium build.
### Rebaseline
1. Choose a time when the Blink tree is likely to be quiet. Avoid PST afternoons in
particular. The bigger the change, the more important this is. Regardless,
determine who the Blink gardener is and notify them. You will be making the
Chromium\.WebKit tree very red for an extended period, and the gardener needs to
know that they are not expected to fix it.
2. Create a CL removing the code suppression from Chromium's
skia/chromium\_skia\_defines\.gypi while simultaneously adding [ NeedsRebaseline ]
lines to Blink's LayoutTests/TestExpectations [file](https://chromium.googlesource.com/chromium/src/+/master/third_party/blink/web_tests/TestExpectations).
Then the auto rebaseline bot will take care of the work of actually checking in the
new images. This is generally acceptable for up to 600 or so rebaselined images.
Above that you might still use [ NeedsRebaseline ], but it's best to coordinate with
the gardener. This should go through the CQ cleanly.
3. Be careful with tests that are already failing or flakey. These may or may not need
to be rebaselined and flakey tests should not be removed from TestExpectations
regardless. In such cases revert the TestExpectations changes before committing.
4. If you are not the one handling the cleanup step, please open a Skia Issue of the
form
Title: "Remove code suppression SK\_IGNORE\_xxx\_FIX\."
Comment: "Code suppression SK\_IGNORE\_xxx\_FIX rebaselined with Blink revision
123456\." and assign it to the individual responsible for the cleanup step.
### Cleanup
1. Remove the now unused old code from Skia and any defines which were introduced
to suppress the new code.
2. Check in the cleanup change to the Skia repository.
3. Wait for Skia roll into Chromium.

View File

@ -1,35 +0,0 @@
Chrome changes
==============
If your change modifies the Skia API, you may also need to land a change in Chromium.
The strategy you use to synchronize changes in the Skia and Chromium
repositories may differ based on the nature of the change, but in general, we
recommend using build flag suppressions \(defines\)\.
We also prefer making the old code path opt-in where possible.
Method 1 \(preferred\) \- Make the old code path opt\-in for Chromium
* Add new code to Skia, leaving the old code in place.
* Deprecate the old code path so that it must be enabled with a flag such as
'SK_SUPPORT_LEGACY_XXX'.
* Synchronize the above changes in Skia with a Chromium commit to
'skia/skia_common.gypi' or 'skia/config/SkUserConfig.h' to enable the
deprecated Skia API.
* Note that the code suppression cannot exist in both the header file and
the gyp file, it should only reside in one location.
* Test the new or updated Skia API within Chromium.
* Remove the flag and code when the legacy code path is no longer in use.
Method 2 \- Make the new code path opt\-in for Chromium
* Add new code to Skia, suppressed by a flag.
* Leave the old code path in place.
* Set the flag in Chromium's 'skia/skia_common.gypi' or
'skia/config/SkUserConfig.h' to enable the new or updated Skia API.
* Test the new or updated Skia API within Chromium.
* Remove the code suppression \(and code\) when the legacy API is no longer
in use.
If your changes will affect Blink layout tests, see detailed instructions about
how to synchronize the changes between Skia, Blink, and Chromium [here](./blink).

View File

@ -1,22 +0,0 @@
Chromium Command Buffer
==========================
It is possible to run Skia's correctness tool, dm, and benchmarking tool,
nanobench, on top of the GL ES interface provided by Chromium's command
buffer.
The Skia tools are always built with this support. They dynamically load
the command buffer as a shared library and thus no GYP/GN flags are
required.
The command buffer standalone shared library is built in a Chromium checkout
by building the `command_buffer_gles2` target. The command buffer should be
built with the `is_component_build` in GN set to false. This will produce a .so,
.dylib, or .dll depending on the target OS. This should be copied alongside
the dm or nanobench executable built from a Skia repository.
Both tools have a `commandbuffer` config which can be used with the `--config`
option to the tool and will run the tests or benchmarks using the command buffer
library. Unit tests in dm always run on all appropriate and available backends
regardless of the `--config` flag.

View File

@ -1,35 +0,0 @@
Skia in Chrome
==============
Changes to the Skia repository will be rolled into Chromium by the AutoRoll bot
several times per day.
If you have a Skia change that needs to be tested in Chrome, or which requires
associated changes in that repository, see the guides in this section for tips
on execution.
For problems in Chromium related to Skia rolls:
* Go to https://autoroll.skia.org/r/skia-autoroll. Login with google.com
account and click the STOP button to pause new rolls.
* Revert the offending DEPS roll.
* If an obvious owner cannot be found in the list of CLs, assign to the Skia
Gardener, listed in the gardeners widget on https://status.skia.org and as
a reviewer on the roll CL.
* If the Skia Gardener cannot be assigned, cc them and assign the issue to hcm@.
For more tips on bug triage and labeling, see the [Issue Tracker page](../../user/issue-tracker/).
Branching for Chrome
--------------------
Every 6 weeks, we cut a new branch in Skia to reflect the new release branch in
Chrome, eg. [refs/heads/chrome/m75](https://skia.googlesource.com/skia/+/chrome/m75).
This process is simplified by running [tools/chrome_release_branch](https://skia.googlesource.com/skia/+/7a5b6ec0f6c01d3039e3ec30de6f8065ffc8aac4/tools/chrome_release_branch.py').
This script handles creation of the branch itself, as well as associated
housekeeping like updating the Chrome milestone number for the next release,
setting up the [commit queue]('https://skia.googlesource.com/skia/+/infra/config/commit-queue.cfg')
for the new branch. For example:
tools/chrome_release_branch <commit hash>

View File

@ -1,85 +0,0 @@
Multiple repo Chromium trybots
==============================
When a proposed Skia change will require a change in Chromium or Blink it is
often helpful to locally create the Chromium and Blink changes and test with the
proposed Skia change. This often happens with Skia API changes and changes
which affect Blink layout tests. While simple to do locally, this explains how
to do so on the Chromium trybots.
Skia only changes
-----------------
If the Skia patch is already in Gerrit and there are no associated Chromium
changes, then it is possible to just run the Chromium trybots. This will apply
the Skia patch and run the bot.
Skia and Chromium changes
-------------------------
If the Skia patch is already in Gerrit and there are associated Chromium
changes, then in the Chromium CL add the following to
\<chromium>/src/DEPS in the 'hooks' array.
{
'name': 'fetch_custom_patch',
'pattern': '.',
'action': [ 'git', '-C', 'src/third_party/skia/',
'fetch', 'https://skia.googlesource.com/skia', 'refs/changes/13/10513/13',
],
},
{
'name': 'apply_custom_patch',
'pattern': '.',
'action': ['git', '-C', 'src/third_party/skia/',
'-c', 'user.name=Custom Patch', '-c', 'user.email=custompatch@example.com',
'cherry-pick', 'FETCH_HEAD',
],
},
Modify the 'refs/changes/XX/YYYY/ZZ' to the appropriate values (where YYYY is
the numeric change number, ZZ is the patch set number and XX is the last two
digits of the numeric change number). This can be seen in the 'Download' link on
Gerrit.
If this is for a project other than Skia, update the checkout directory and
fetch source. Note that this can be used multiple times to apply multiple
issues.
An example of this being used can be seen at
https://crrev.com/2786433004/#ps1 .
To test locally, run `gclient runhooks` to update the Skia source code.
Note that if your local skia patch in `third_party/skia` isn't clean (e.g., you
already applied some patch to it), then `gclient runhooks` won't successfully
run. In that case, run `git reset --hard` inside `third_party/skia` before
`gclient runhooks`.
Arbitrary changes
-----------------
If the patch is to files where the above is not possible, then it is still
possible to patch the files manually by adding the following to
\<chromium>/src/DEPS in the 'hooks' array just before the 'gyp' hook.
{
'name': 'apply_custom_patch',
'pattern': '.',
'action': ['python2',
'-c', 'from distutils.dir_util import copy_tree; copy_tree("src/patch/", "src/");'
],
},
Then, copy all 'out of tree' files into \<chromium>/src/patch/, using the same
directory structure used by Chromium. When `gclient runhooks` is run, the files
in \<chromium>/src/patch/ will be copied to and overwrite corresponding files in
\<chromium>/src/. For example, if changing \<skia>/include/core/SkPath.h, place
a copy of the modified SkPath.h at
\<chromium>/src/patch/third_party/skia/include/core/SkPath.h.
An example of this being used can be seen at
https://crrev.com/1866773002/#ps20001 .
Try the patch
-------------
After committing a \<chromium>/src/DEPS or \<chromium>/src/patch/ change
locally, `git cl upload` can be used in the usual way. Be sure to add
`COMMIT=false` to the issue description to avoid accidentally checking it in.

View File

@ -1,17 +0,0 @@
Working in a Chromium repo
==========================
To work on Skia inside a Chromium checkout, run the following:
cd chromium/src/third_party/skia
python2 tools/git-sync-deps
bin/gn gen out/Debug
The second command does a minimal "just sync the DEPS" emulation of `gclient
sync` for Skia into chromium/src/third_party/skia/third_party. After that,
`ninja -C out/Debug dm` in chromium/src/third_party/skia will get you rolling.
We no longer recommend the .gclient file manipulation to have Chromium DEPS also
sync Skia's DEPS. Most of those DEPS are for building and testing only;
Chromium doesn't need any of them, and it can be confusing and problematic if
they somehow get mixed into the Chromium build.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 129 KiB

View File

@ -1,96 +0,0 @@
Notes about Bazel Builds
========================
Skia cannot be built with Bazel yet.
But you should be able to build and run the trivial `tools/bazel_test.cc`:
$ bazel test ...
Dependencies
------------
`WORKSPACE.bazel` acts like `DEPS`, listing external dependencies and how to
fetch them. You can call `bazel sync`, or just let `bazel {build,test,run}`
handle it as needed on its own. The easiest way to add a new dependency is to
start using `tag="..."` or `branch="..."` and then follow the advice of Bazel
to pin that to the `commit` and `shallow_since` it suggests.
We must provide Bazel build configuration for dependencies like `libpng` that
don't provide their own. For `libpng` that's `bazel/libpng.bazel`, linked by
the `new_git_repository()` `build_file` argument, written relative to that
fetched Git repo's root. Its resemblance to `third_party/libpng/BUILD.gn` is
no coincidence... it's pretty much a 1:1 translation between GN and Bazel.
Everything that's checked in builds external dependencies from source. I've
not written an integrated system for substituting prebuilt versions of these
dependencies (e.g. `/usr/include/png.h` and `/usr/lib/libpng.so`), instead
leaving that up to users who want it. The process is not exactly trivial, but
closer to tedious than difficult. Here's an example, overriding `libpng` to
point to prebuilts from Homebrew in ~/brew:
Each overridden dependency will need its own directory with a few files.
$ find overrides
overrides
overrides/libpng
overrides/libpng/include
overrides/libpng/WORKSPACE.bazel
overrides/libpng/BUILD.bazel
`WORKSPACE.bazel` must be present, but in this case can be empty.
$ cat overrides/libpng/WORKSPACE.bazel
`BUILD.bazel` is where it all happens:
$ cat overrides/libpng/BUILD.bazel
cc_library(
name = "libpng",
hdrs = ["include/png.h"],
srcs = ["include/pngconf.h", "include/pnglibconf.h"],
includes = ["include"],
linkopts = ["-lpng", "-L/Users/mtklein/brew/lib"],
visibility = ["//visibility:public"],
)
`include` is a symlink I've made to `~/brew/include` because Bazel doesn't like
absolute paths in `hdrs` or `includes`. On the other hand, a symlink to
`~/brew/lib` doesn't work here, though `-L/Users/mtklein/brew/lib` works fine.
$ readlink overrides/libpng/include
/Users/mtklein/brew/include/
Finally, we point Bazel at all that using `--override_repository`:
$ bazel test ... --override_repository libpng=/Users/mtklein/overrides/libpng
I expect building from source to be the most common use case, and it's more or
less enough to simply know that we can substitute prebuilts this way. The most
interesting part to me is that we don't need to provide this mechanism... it's
all there in stock Bazel. This plan may all want some rethinking in the future
if we want to add the option to trim the dependency entirely and make this
tristate (build it, use it prebuilt, or trim).
.bazelrc
--------
I have not (yet?) checked in a .bazelrc to the Skia repo, but have found it
handy to write my own in ~/.bazelrc:
$ cat ~/.bazelrc
# Print more information on failures.
build --verbose_failures
test --test_output errors
# Create an ASAN config, try `bazel test --config asan ...`.
build:asan --copt -fsanitize=address
build:asan --copt -Wno-macro-redefined # (_FORTIFY_SOURCE redefined.)
build:asan --linkopt -fsanitize=address
# Flip on and off prebuilt overrides easily.
build --override_repository libpng=/Users/mtklein/overrides/libpng
I'm impressed by how much you can configure via bazelrc, and I think this
should let our Bazel build configuration stay mostly focused on the structure
of the project, less cluttered by build settings.

View File

@ -1,93 +0,0 @@
Commit Queue Keywords
=====================
See [CQ
documentation](https://chromium.googlesource.com/chromium/src/+/master/docs/infra/cq.md)
for more information.
Options in the form "Key: Value" must appear in the last paragraph of the
commit message to be used.
Commit
------
If you are working on experimental code and do not want to risk accidentally
submitting the change via the CQ, then you can mark it with "Commit: false".
The CQ will immediately abandon the change if it contains this option.
To do a dry run through the CQ please use Gerrit's [CQ Dry
Run](https://groups.google.com/a/chromium.org/forum/#!topic/chromium-dev/G5-X0_tfmok)
feature.
Commit: false
The CQ will run through its list of verifiers (reviewer check, trybots, tree check,
presubmit check), and will close the issue instead of committing it.
No-Dependency-Checks
--------------------
No-Dependency-Checks: true
The CQ rejects patchsets with open dependencies. An open dependency exists when a CL
depends on another CL that is not yet closed. You can skip this check with this keyword.
Cq-Include-Trybots
------------------
Allows you to add arbitrary trybots to the CQ's list of default trybots.
The CQ will block till these tryjobs pass just like the default list of tryjobs.
This is the format of the values of this keyword:
Cq-Include-Trybots: bucket1:bot1,bot2;bucket2:bot3,bot4
Multiple lines are allowed:
Cq-Include-Trybots: bucket1:bot1
Cq-Include-Trybots: bucket1:bot2
Cq-Include-Trybots: bucket2:bot3
Cq-Include-Trybots: bucket2:bot4
Here are some real world examples:
Cq-Include-Trybots: master.tryserver.chromium.linux:linux_chromium_asan_rel_ng
Cq-Include-Trybots: skia.primary:Test-Win10-Clang-ShuttleC-GPU-GTX960-x86_64-Debug-All-ANGLE
Cq-Include-Trybots: luci.skia.skia.primary:Build-Debian9-Clang-x86-devrel-Android_SKQP
FIXME: what bucket are skia bots in now?
No-Tree-Checks
--------------
If you want to skip the tree status checks, to make the CQ commit a CL even if
the tree is closed, you can add the following line to the CL description:
No-Tree-Checks: true
This is discouraged, since the tree is closed for a reason. However, in rare
cases this is acceptable, primarily to fix build breakages (i.e., your CL will
help in reopening the tree).
No-Presubmit
------------
If you want to skip the presubmit checks, add the following line to the CL description:
No-Presubmit: true
No-Try
------
If you cannot wait for the try job results, you can add the following line to
the CL description:
No-Try: true
The CQ will then not run any try jobs for your change and will commit the CL as
soon as the tree is open, assuming the presubmit check passes.

View File

@ -1,42 +0,0 @@
The Skia Directory
==================
* Docs & Bugs
- [Skia.org](https://skia.org/)
- [Issue Tracker](https://bug.skia.org/)
- [Autogenerated API Documentation](https://api.skia.org)
* Code Repositories
- [Git repository](https://skia.googlesource.com/skia/)
- [Other Skia project repositories](https://skia.googlesource.com/)
- [GitHub Mirror](https://github.com/google/skia)
- [Code Search](https://cs.skia.org) based on the version of Skia in the
Chromium tree.
* BuildBot Consoles
- [Commit Status](https://status.skia.org/)
- [Tree Status](https://tree-status.skia.org/) (requires login)
- [BuildBot Console](https://build.chromium.org/p/client.skia/console)
- [FYI BuildBot
Console](https://build.chromium.org/p/client.skia.fyi/console)
- [Android BuildBot
Console](https://build.chromium.org/p/client.skia.android/console)
- [Compile BuildBot
Console](https://build.chromium.org/p/client.skia.compile/console)
* Other
- [Fiddle](https://fiddle.skia.org/) Try out Skia on the web!
- [Gold](https://gold.skia.org/) Correctness testing.
- [Perf](https://perf.skia.org/) Performance testing.
- [Mon](https://mon.skia.org/) Grafana dashboard (requires login).
- [Alerts](https://alerts.skia.org/) Monitor testing and bot status.
- [BugChomper] (https://bugchomper.skia.org/) Prioritize bugs quickly.
- [Code Review](https://skia-review.googlesource.com/)
* Mailing Lists
- [Discussion Mailing List](https://groups.google.com/group/skia-discuss)
- [Code Review Announce
List](https://groups.google.com/a/skia.org/forum/#!forum/reviews)
- [Bug Announce
List](https://groups.google.com/a/skia.org/forum/#!forum/bugs)

View File

@ -1,60 +0,0 @@
Contributing to Skia
====================
Here some ways you can get involved and help us improve Skia.
Report Bugs
-----------
Find bugs to fix or report new bugs in the [Skia issue
tracker](http://bug.skia.org/). You can also search the [Chromium issue
tracker](http://code.google.com/p/chromium/issues/list) for bugs related to
graphics or Skia.
Test
----
Write an application or tool that will exercise the Skia code differently than
our current set of tests and verify that Skia works as expected.
Draw something interesting and profile it to find ways to speed up Skia's
implementation.
We cannot always fix issues or support every scenario, but we welcome any bugs
found so we can assess and prioritize them. (If you find _and_ fix a bug, even
better!)
Contribute Code
---------------
Whether you develop a new feature or a fix for an existing bug in the Skia code
base, you will need a committer to review and approve the change.
There are some steps that can speed up the review process:
Keep your code submissions small and targeted.
When possible, have a fellow contributor review your change in advance of
submission.
Propose new features to the project leads by opening a feature bug
or posting to skia-discuss ahead of development.
For more information, see [How to submit a patch](/dev/contrib/submit).
For background on the project and an outline of the types of roles interested
parties can take on, see [Project Roles](/roles).
Anyone contributing code to Skia must sign a Contributor License Agreement and
ensure they are listed in the AUTHORS file:
Individual contributors can complete the [Individual Contributor License
Agreement](https://developers.google.com/open-source/cla/individual) online.
If you are contributing on behalf of a corporation, fill out the [Corporate
Contributor License
Agreement](https://developers.google.com/open-source/cla/corporate) and send it
in as described on that page.
If it is your first time submitting code or you have not previously done so,
add your (or your organization's) name and contact info to the [AUTHORS
file](https://skia.googlesource.com/skia/+/master/AUTHORS) as a part of your CL.
REVIEWERS: Before you LGTM a change, verify that the contributor is listed in
the AUTHORS file.
If they are not, a Googler must ensure that the individual or
their corporation has signed the CLA by searching
[go/cla-signers](https://goto.google.com/cla-signers).
Then have an entry added to the AUTHORS file with the CL.

View File

@ -1,73 +0,0 @@
Applying patches
================
If you are a Skia committer and have been asked to commit an
externally-submitted patch, this is how to do it. (This technique is useful in
other situations too, like if you just want to try out somebody else's patch
locally.)
Notes:
* For the examples below, we will assume that this is the change you want
to patch into your local checkout: https://codereview.appspot.com/6201055/
* These instructions should work on Mac or Linux; Windows is trickier,
because there is no standard Windows "patch" tool.
See also [Contributing Code for The Chromium Projects]
(http://dev.chromium.org/developers/contributing-code#TOC-Instructions-for-Reviewer:-Checking-in-the-patch-for-a-non-committer).
If you use `git cl`, then you should be able to use the shortcut:
~~~~
git cl patch 6201055
~~~~
If you use `gcl`, or the above doesn't work, the following should always work.
1. Prepare your local workspace to accept the patch.
* cd into the root directory (usually `trunk/`) of the workspace where you
want to apply the patch.
* Make sure that the workspace is up-to-date and clean (or "updated and
clean enough" for your purposes). If the codereview patch was against
an old revision of the repo, you may need to sync your local workspace
to that same revision.
2. Download the raw patch set.
* Open the codereview web page and look for the "Download raw patch set"
link near the upper right-hand corner. Right-click on that link and copy
it to the clipboard. (In my case, the link is
https://codereview.appspot.com/download/issue6201055_1.diff )
* If you are on Linux or Mac and have "curl" or "wget" installed, you can
download the patch from the command line:
~~~~
curl https://codereview.appspot.com/download/issue6201055_1.diff
--output patch.txt
# or...
wget https://codereview.appspot.com/download/issue6201055_1.diff
--output-document=patch.txt
~~~~
* Otherwise, figure out some other way to download this file and save it as
`patch.txt`
3. Apply this patch to your local checkout.
* You should still be in the root directory of the workspace where you want
to apply the patch.
~~~~
patch -p1 <patch.txt
~~~~
* Then you can run `diff` and visually check the local changes.
4. Complications: If the patch fails to apply, the following may be happening:
* Wrong revision. Maybe your local workspace is not up to date? Or maybe the
patch was made against an old revision of the repository, and cannot be applied
to the latest revision? (In that case, revert any changes and sync your
workspace to an older revision, then re-apply the patch.)

View File

@ -1,39 +0,0 @@
How to revert a CL
==================
Using one-click revert
----------------------
* Find the codereview issue for the CL you want to revert.
* Click the "revert" button.
Using Git
---------
Update the local repository
git fetch origin master
Create a local branch with origin/master as its start point.
git checkout -b revert$RANDOM origin/master
Find the SHA1 of the commit you want to revert
git log origin/master
Create a revert commit.
git revert <SHA1>
Upload it to Gerrit.
git cl upload
Land the revert in origin/master.
git cl land
Delete the local revert branch.
git checkout --detach && git branch -D @{-1}

View File

@ -1,509 +0,0 @@
Coding Style Guidelines
=======================
These conventions have evolved over time. Some of the earlier code in both
projects doesn't strictly adhere to the guidelines. However, as the code evolves
we hope to make the existing code conform to the guildelines.
Files
-----
We use .cpp and .h as extensions for c++ source and header files.
Headers that aren't meant for public consumption should be placed in src
directories so that they aren't in a client's search path, or in
include/private if they need to be used by public headers.
We prefer to minimize includes. If forward declaring a name in a header is
sufficient then that is preferred to an include.
Forward declarations and file includes should be in alphabetical order.
<span id="no-define-before-sktypes"></span>
Do not use #if/#ifdef before including "SkTypes.h" (directly or indirectly).
Most things you'd #if on tend to not yet be decided until SkTypes.h.
We use 4 spaces, not tabs.
We use Unix style endlines (LF).
We prefer no trailing whitespace but aren't very strict about it.
We wrap lines at 100 columns unless it is excessively ugly (use your judgement).
Naming
------
Most externally visibile types and functions use an Sk- prefix to designate
they're part of Skia, but code in Ganesh uses Gr-. Nested types need not be
prefixed.
<!--?prettify?-->
~~~~
class SkClass {
public:
class HelperClass {
...
};
};
~~~~
Data fields in structs, classes, and unions that have methods begin with
lower-case f and are then camel-capped, to distinguish those fields from other
variables. Types that are predominantly meant for direct field access don't
need f-decoration.
<!--?prettify?-->
~~~~
struct GrCar {
float milesDriven;
Color color;
};
class GrMotorcyle {
public:
float getMilesDriven() const { return fMilesDriven; }
void setMilesDriven(float milesDriven) { fMilesDriven = milesDriven; }
Color getColor() const { return fColor; }
private:
float fMilesDriven;
Color fColor;
};
~~~~
Global variables are similar but prefixed with g and camel-capped.
<!--?prettify?-->
~~~~
bool gLoggingEnabled;
~~~~
Local variables and arguments are camel-capped with no initial cap.
<!--?prettify?-->
~~~~
int herdCats(const Array& cats) {
int numCats = cats.count();
}
~~~~
Variables declared `constexpr` or `const`, and whose value is fixed for the
duration of the program, are named with a leading "k" and then camel-capped.
<!--?prettify?-->
~~~~
int drawPicture() {
constexpr SkISize kPictureSize = {100, 100};
constexpr float kZoom = 1.0f;
}
~~~~
Enum values are also prefixed with k. Unscoped enum values are postfixed with
an underscore and singular name of the enum name. The enum itself should be
singular for exclusive values or plural for a bitfield. If a count is needed it
is `k<singular enum name>Count` and not be a member of the enum (see example),
or a kLast member of the enum is fine too.
<!--?prettify?-->
~~~~
// Enum class does not need suffixes.
enum class SkPancakeType {
kBlueberry,
kPlain,
kChocolateChip,
};
~~~~
<!--?prettify?-->
~~~~
// Enum should have a suffix after the enum name.
enum SkDonutType {
kGlazed_DonutType,
kSprinkles_DonutType,
kChocolate_DonutType,
kMaple_DonutType,
kLast_DonutType = kMaple_DonutType
};
static const SkDonutType kDonutTypeCount = kLast_DonutType + 1;
~~~~
<!--?prettify?-->
~~~~
enum SkSausageIngredientBits {
kFennel_SausageIngredientBit = 0x1,
kBeef_SausageIngredientBit = 0x2
};
~~~~
<!--?prettify?-->
~~~~
enum SkMatrixFlags {
kTranslate_MatrixFlag = 0x1,
kRotate_MatrixFlag = 0x2
};
~~~~
Macros are all caps with underscores between words. Macros that have greater
than file scope should be prefixed SK or GR.
Static non-class functions in implementation files are lower-case with
underscores separating words:
<!--?prettify?-->
~~~~
static inline bool tastes_like_chicken(Food food) {
return kIceCream_Food != food;
}
~~~~
Externed functions or static class functions are camel-capped with an initial cap:
<!--?prettify?-->
~~~~
bool SkIsOdd(int n);
class SkFoo {
public:
static int FooInstanceCount();
// Not static.
int barBaz();
};
~~~~
Macros
------
Ganesh macros that are GL-specific should be prefixed GR_GL.
<!--?prettify?-->
~~~~
#define GR_GL_TEXTURE0 0xdeadbeef
~~~~
Ganesh prefers that macros are always defined and the use of `#if MACRO` rather than
`#ifdef MACRO`.
<!--?prettify?-->
~~~~
#define GR_GO_SLOWER 0
...
#if GR_GO_SLOWER
Sleep(1000);
#endif
~~~~
The rest of Skia tends to use `#ifdef SK_MACRO` for boolean flags.
Braces
------
Open braces don't get a newline. `else` and `else if` appear on same line as
opening and closing braces unless preprocessor conditional compilation
interferes. Braces are always used with `if`, `else`, `while`, `for`, and `do`.
<!--?prettify?-->
~~~~
if (...) {
oneOrManyLines;
}
if (...) {
oneOrManyLines;
} else if (...) {
oneOrManyLines;
} else {
oneOrManyLines;
}
for (...) {
oneOrManyLines;
}
while (...) {
oneOrManyLines;
}
void function(...) {
oneOrManyLines;
}
if (!error) {
proceed_as_usual();
}
#if HANDLE_ERROR
else {
freak_out();
}
#endif
~~~~
Flow Control
------------
There is a space between flow control words and parentheses, and between
parentheses and braces:
<!--?prettify?-->
~~~~
while (...) {
}
do {
} while (...);
switch (...) {
...
}
~~~~
Cases and default in switch statements are indented from the switch.
<!--?prettify?-->
~~~~
switch (color) {
case kBlue:
...
break;
case kGreen:
...
break;
...
default:
...
break;
}
~~~~
Fallthrough from one case to the next is annotated with `[[fallthrough]]`.
However, when multiple case statements in a row are used, they do not need the
`[[fallthrough]]` annotation.
<!--?prettify?-->
~~~~
switch (recipe) {
...
case kSmallCheesePizza_Recipe:
case kLargeCheesePizza_Recipe:
ingredients |= kCheese_Ingredient | kDough_Ingredient | kSauce_Ingredient;
break;
case kCheeseOmelette_Recipe:
ingredients |= kCheese_Ingredient;
[[fallthrough]]
case kPlainOmelette_Recipe:
ingredients |= (kEgg_Ingredient | kMilk_Ingredient);
break;
...
}
~~~~
When a block is needed to declare variables within a case follow this pattern:
<!--?prettify?-->
~~~~
switch (filter) {
...
case kGaussian_Filter: {
Bitmap srcCopy = src->makeCopy();
...
} break;
...
};
~~~~
Classes
-------
Unless there is a need for forward declaring something, class declarations
should be ordered `public`, `protected`, `private`. Each should be preceded by a
newline. Within each visibility section (`public`, `private`), fields should not be
intermixed with methods. It's nice to keep all data fields together at the end.
<!--?prettify?-->
~~~~
class SkFoo {
public:
...
protected:
...
private:
void barHelper(...);
...
SkBar fBar;
...
};
~~~~
Virtual functions that are overridden in derived classes should use override,
and the virtual keyword should be omitted.
<!--?prettify?-->
~~~~
void myVirtual() override {
}
~~~~
If you call a method on a parent type that must stand out as specifically the
parent's version of that method, we usually privately alias that parent type to
`INHERITED` within the class. That lets calls like `INHERITED::onFoo()` stand
out visually. No need for `this->` when using `INHERITED::`.
<!--?prettify?-->
~~~~
class GrDillPickle : public GrPickle {
...
bool onTasty() const override {
return INHERITED::onTasty()
&& fFreshDill;
}
...
private:
bool fFreshDill;
using INHERITED = GrPickle;
};
~~~~
Constructor initializers should be one per line, indented, with punctuation
placed before the initializer.
<!--?prettify?-->
~~~~
GrDillPickle::GrDillPickle()
: GrPickle()
, fSize(kDefaultPickleSize) {
...
}
~~~~
Constructors that take one argument should almost always be explicit, with
exceptions made only for the (rare) automatic compatibility class.
<!--?prettify?-->
~~~~
class Foo {
explicit Foo(int x); // Good.
Foo(float y); // Spooky implicit conversion from float to Foo. No no no!
...
};
~~~~
Method calls within method calls should be prefixed with dereference of the
'this' pointer. For example:
<!--?prettify?-->
~~~~
this->method();
~~~~
A common pattern for virtual methods in Skia is to include a public non-virtual
(or final) method, paired with a private virtual method named "onMethodName".
This ensures that the base-class method is always invoked and gives it control
over how the virtual method is used, rather than relying on each subclass to
call `INHERITED::onMethodName`. For example:
<!--?prettify?-->
~~~~
class SkSandwich {
public:
void assemble() {
// All sandwiches must have bread on the top and bottom.
this->addIngredient(kBread_Ingredient);
this->onAssemble();
this->addIngredient(kBread_Ingredient);
}
bool cook() {
return this->onCook();
}
private:
// All sandwiches must implement onAssemble.
virtual void onAssemble() = 0;
// Sandwiches can remain uncooked by default.
virtual bool onCook() { return true; }
};
class SkGrilledCheese : public SkSandwich {
private:
void onAssemble() override {
this->addIngredient(kCheese_Ingredient);
}
bool onCook() override {
return this->toastOnGriddle();
}
};
class SkPeanutButterAndJelly : public SkSandwich {
private:
void onAssemble() override {
this->addIngredient(kPeanutButter_Ingredient);
this->addIngredient(kGrapeJelly_Ingredient);
}
};
~~~~
Integer Types
-------------
We follow the Google C++ guide for ints and are slowly making older code conform to this
(http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Integer_Types)
Summary: Use `int` unless you have need a guarantee on the bit count, then use
`stdint.h` types (`int32_t`, etc). Assert that counts, etc are not negative instead
of using unsigned. Bitfields use `uint32_t` unless they have to be made shorter
for packing or performance reasons.
Function Parameters
-------------------
Mandatory constant object parameters are passed to functions as const references.
Optional constant object parameters are passed to functions as const pointers.
Mutable object parameters are passed to functions as pointers.
We very rarely pass anything by non-const reference.
<!--?prettify?-->
~~~~
// src and paint are optional
void SkCanvas::drawBitmapRect(const SkBitmap& bitmap, const SkIRect* src,
const SkRect& dst, const SkPaint* paint = nullptr);
// metrics is mutable (it is changed by the method)
SkScalar SkPaint::getFontMetrics(FontMetric* metrics, SkScalar scale) const;
~~~~
If function arguments or parameters do not all fit on one line, the overflowing
parameters may be lined up with the first parameter on the next line
<!--?prettify?-->
~~~~
void drawBitmapRect(const SkBitmap& bitmap, const SkRect& dst,
const SkPaint* paint = nullptr) {
this->drawBitmapRectToRect(bitmap, nullptr, dst, paint,
kNone_DrawBitmapRectFlag);
}
~~~~
or all parameters placed on the next line and indented eight spaces
<!--?prettify?-->
~~~~
void drawBitmapRect(
const SkBitmap& bitmap, const SkRect& dst, const SkPaint* paint = nullptr) {
this->drawBitmapRectToRect(
bitmap, nullptr, dst, paint, kNone_DrawBitmapRectFlag);
}
~~~~
Python
------
Python code follows the [Google Python Style Guide](http://google-styleguide.googlecode.com/svn/trunk/pyguide.html).

View File

@ -1,238 +0,0 @@
How to submit a patch
=====================
Configure git
-------------
<!--?prettify lang=sh?-->
git config --global user.name "Your Name"
git config --global user.email you@example.com
Making changes
--------------
First create a branch for your changes:
<!--?prettify lang=sh?-->
git config branch.autosetuprebase always
git checkout -b my_feature origin/master
After making your changes, create a commit
<!--?prettify lang=sh?-->
git add [file1] [file2] ...
git commit
If your branch gets out of date, you will need to update it:
<!--?prettify lang=sh?-->
git pull
python2 tools/git-sync-deps
Adding a unit test
------------------
If you are willing to change Skia codebase, it's nice to add a test at the same
time. Skia has a simple unittest framework so you can add a case to it.
Test code is located under the 'tests' directory.
See [Writing Unit and Rendering Tests](../testing/tests) for details.
Unit tests are best, but if your change touches rendering and you can't think of
an automated way to verify the results, consider writing a GM test. Also, if your
change is in the GPU code, you may not be able to write it as part of the standard
unit test suite, but there are GPU-specific testing paths you can extend.
Submitting a patch
------------------
For your code to be accepted into the codebase, you must complete the
[Individual Contributor License
Agreement](http://code.google.com/legal/individual-cla-v1.0.html). You can do
this online, and it only takes a minute. If you are contributing on behalf of a
corporation, you must fill out the [Corporate Contributor License
Agreement](http://code.google.com/legal/corporate-cla-v1.0.html)
and send it to us as described on that page. Add your (or your organization's)
name and contact info to the AUTHORS file as a part of your CL.
Now that you've made a change and written a test for it, it's ready for the code
review! Submit a patch and getting it reviewed is fairly easy with depot tools.
Use `git-cl`, which comes with [depot
tools](http://sites.google.com/a/chromium.org/dev/developers/how-tos/install-depot-tools).
For help, run `git cl help`.
Note that in order for `git cl` to work correctly, it needs to run on a clone of
<https://skia.googlesource.com/skia>. Using clones of mirrors, including Google's mirror
on GitHub, might lead to issues with `git cl` usage.
### Find a reviewer
Ideally, the reviewer is someone who is familiar with the area of code you are
touching. Look at the git blame for the file to see who else has been editing
it. If unsuccessful, another option is to click on the 'Suggested Reviewers' button
to add one of the listed Skia contacts. They should be able to add appropriate
reviewers for your change. The button is located here:
<img src="/dev/contrib/SuggestedReviewers.png" style="display: inline-block; max-width: 75%" />
### Uploading changes for review
Skia uses the Gerrit code review tool. Skia's instance is [skia-review](http://skia-review.googlesource.com).
Use `git cl` to upload your change:
<!--?prettify lang=sh?-->
git cl upload
You may have to enter a Google Account username and password to authenticate
yourself to Gerrit. A free gmail account will do fine, or any
other type of Google account. It does not have to match the email address you
configured using `git config --global user.email` above, but it can.
The command output should include a URL, similar to
(https://skia-review.googlesource.com/c/4559/), indicating where your changelist
can be reviewed.
### Submit try jobs
Skia's trybots allow testing and verification of changes before they land in the
repo. You need to have permission to trigger try jobs; if you need permission,
ask a committer. After uploading your CL to [Gerrit](https://skia-review.googlesource.com/),
you may trigger a try job for any job listed in tasks.json, either via the
Gerrit UI, using `git cl try`, eg.
git cl try -B skia.primary -b Some-Tryjob-Name
or using bin/try, a small wrapper for `git cl try` which helps to choose try jobs.
From a Skia checkout:
bin/try --list
You can also search using regular expressions:
bin/try "Test.*GTX660.*Release"
For more information about testing, see [testing infrastructure](https://skia.org/dev/testing/automated_testing).
### Request review
Go to the supplied URL or go to the code review page and select the **Your**
dropdown and click on **Changes**. Select the change you want to submit for
review and click **Reply**. Enter at least one reviewer's email address. Now
add any optional notes, and send your change off for review by clicking on
**Send**. Unless you send your change to reviewers, no one will know to look
at it.
_Note_: If you don't see editing commands on the review page, click **Sign in**
in the upper right. _Hint_: You can add -r reviewer@example.com --send-mail to
send the email directly when uploading a change using `git-cl`.
The review process
------------------
If you submit a giant patch, or do a bunch of work without discussing it with
the relevant people, you may have a hard time convincing anyone to review it!
Code reviews are an important part of the engineering process. The reviewer will
almost always have suggestions or style fixes for you, and it's important not to
take such suggestions personally or as a commentary on your abilities or ideas.
This is a process where we work together to make sure that the highest quality
code gets submitted!
You will likely get email back from the reviewer with comments. Fix these and
update the patch set in the issue by uploading again. The upload will explain
that it is updating the current CL and ask you for a message explaining the
change. Be sure to respond to all comments before you request review of an
update.
If you need to update code the code on an already uploaded CL, simply edit the
code, commit it again locally, and then run git cl upload again e.g.
echo "GOATS" > whitespace.txt
git add whitespace.txt
git commit -m 'add GOATS fix to whitespace.txt'
git cl upload
Once you're ready for another review, use **Reply** again to send another
notification (it is helpful to tell the reviewer what you did with respect to
each of their comments). When the reviewer is happy with your patch, they will
approve your change by setting the Code-Review label to "+1".
_Note_: As you work through the review process, both you and your reviewers
should converse using the code review interface, and send notes.
Once your change has received an approval, you can click the "Submit to CQ"
button on the codereview page and it will be committed on your behalf.
Once your commit has gone in, you should delete the branch containing your change:
git checkout -q origin/master
git branch -D my_feature
Final Testing
-------------
Skia's principal downstream user is Chromium, and any change to Skia rendering
output can break Chromium. If your change alters rendering in any way, you are
expected to test for and alleviate this. You may be able to find a Skia team
member to help you, but the onus remains on each individual contributor to avoid
breaking Chrome.
### Evaluating Impact on Chromium
Keep in mind that Skia is rolled daily into Blink and Chromium. Run local tests
and watch canary bots for results to ensure no impact. If you are submitting
changes that will impact layout tests, follow the guides below and/or work with
your friendly Skia-Blink engineer to evaluate, rebaseline, and land your
changes.
Resources:
[How to land Skia changes that change Blink layout test results](../chrome/layouttest)
If you're changing the Skia API, you may need to make an associated change in Chromium.
If you do, please follow these instructions: [Landing Skia changes which require Chrome changes](../chrome/changes)
Check in your changes
---------------------
### Non-Skia-committers
If you already have committer rights, you can follow the directions below to
commit your change directly to Skia's repository.
If you don't have committer rights in https://skia.googlesource.com/skia.git ...
first of all, thanks for submitting your patch! We really appreciate these
submissions. After receiving an approval from a committer, you will be able to
click the "Submit to CQ" button and submit your patch via the commit queue.
In special instances, a Skia committer may assist you in landing the change
by uploading a new codereview containing your patch (perhaps with some small
adjustments at their discretion). If so, you can mark your change as
"Abandoned", and update it with a link to the new codereview.
### Skia committers
* tips on how to apply an externally provided patch are [here](./patch)
* when landing externally contributed patches, please note the original
contributor's identity (and provide a link to the original codereview) in the commit message
`git-cl` will squash all your commits into a single one with the description you used when you uploaded your change.
~~~~
git cl land
~~~~
or
~~~~
git cl land -c 'Contributor Name <email@example.com>'
~~~~

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

View File

@ -1,5 +0,0 @@
Analytic Anti-Alias
====
* [Analytic Anti-Alias Slides](https://docs.google.com/presentation/d/16r9HMS4_UBrcF3HUHscAqbSgkrtIwqaihZNwGP2TL_s/edit?usp=sharing)
* [Analytic Anti-Alias Documents](https://docs.google.com/document/d/17Gq-huAf9q7wA4MRfXwpi_bYLrVeteKcSfAep0Am-wA/edit?usp=sharing)

View File

@ -1,233 +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="337px"
height="327px"
viewBox="0 0 337 327"
>
<title></title>
<desc>Creator: FreeHEP Graphics2D Driver Producer: geogebra.export.SVGExtensions Revision: 12753 Source: Date: Friday, December 22, 2017 4:11:08 PM EST</desc>
<g stroke-linejoin="miter" stroke-dashoffset="0" stroke-dasharray="none" stroke-width="1" stroke-miterlimit="10" stroke-linecap="square">
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#ffffff">
<path d="M 0 0 L 265 0 L 265 257 L 0 257 L 0 0 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 69.171875 149.359375 Q 68.421875 149.359375 68.03125 150.109375 Q 67.65625 150.859375 67.65625 152.359375 Q 67.65625 153.859375 68.03125 154.609375 Q 68.421875 155.359375 69.171875 155.359375 Q 69.953125 155.359375 70.328125 154.609375 Q 70.71875 153.859375 70.71875 152.359375 Q 70.71875 150.859375 70.328125 150.109375 Q 69.953125 149.359375 69.171875 149.359375 z M 69.171875 148.578125 Q 70.40625 148.578125 71.046875 149.546875 Q 71.703125 150.515625 71.703125 152.359375 Q 71.703125 154.203125 71.046875 155.171875 Q 70.40625 156.140625 69.171875 156.140625 Q 67.953125 156.140625 67.296875 155.171875 Q 66.65625 154.203125 66.65625 152.359375 Q 66.65625 150.515625 67.296875 149.546875 Q 67.953125 148.578125 69.171875 148.578125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 60.78662485303139 142.82509847769097 L 60.78662485303139 146.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 148.234375 155.171875 L 149.859375 155.171875 L 149.859375 149.609375 L 148.09375 149.953125 L 148.09375 149.0625 L 149.84375 148.703125 L 150.828125 148.703125 L 150.828125 155.171875 L 152.4375 155.171875 L 152.4375 156 L 148.234375 156 L 148.234375 155.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 149.83505704565925 142.82509847769097 L 149.83505704565925 146.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 237.921875 155.171875 L 241.359375 155.171875 L 241.359375 156 L 236.734375 156 L 236.734375 155.171875 Q 237.296875 154.59375 238.265625 153.609375 Q 239.234375 152.625 239.484375 152.34375 Q 239.953125 151.8125 240.140625 151.453125 Q 240.328125 151.078125 240.328125 150.71875 Q 240.328125 150.140625 239.921875 149.78125 Q 239.515625 149.40625 238.859375 149.40625 Q 238.390625 149.40625 237.875 149.578125 Q 237.375 149.734375 236.78125 150.0625 L 236.78125 149.0625 Q 237.375 148.828125 237.890625 148.703125 Q 238.40625 148.578125 238.84375 148.578125 Q 239.96875 148.578125 240.640625 149.140625 Q 241.328125 149.703125 241.328125 150.65625 Q 241.328125 151.109375 241.15625 151.515625 Q 240.984375 151.90625 240.546875 152.453125 Q 240.421875 152.59375 239.765625 153.28125 Q 239.109375 153.953125 237.921875 155.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 238.88348923828713 142.82509847769097 L 238.88348923828713 146.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 0 142.82509847769097 L 263 142.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 264 143.32509847769097 L 261 139.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 264 142.32509847769097 L 261 145.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 44.484375 231.859375 L 47.125 231.859375 L 47.125 232.65625 L 44.484375 232.65625 L 44.484375 231.859375 z M 48.8427734375 234.171875 L 50.4677734375 234.171875 L 50.4677734375 228.609375 L 48.7021484375 228.953125 L 48.7021484375 228.0625 L 50.4521484375 227.703125 L 51.4365234375 227.703125 L 51.4365234375 234.171875 L 53.0458984375 234.171875 L 53.0458984375 235 L 48.8427734375 235 L 48.8427734375 234.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 56.78662485303139 231.87353067031938 L 60.78662485303139 231.87353067031938"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 51.171875 133.359375 Q 50.421875 133.359375 50.03125 134.109375 Q 49.65625 134.859375 49.65625 136.359375 Q 49.65625 137.859375 50.03125 138.609375 Q 50.421875 139.359375 51.171875 139.359375 Q 51.953125 139.359375 52.328125 138.609375 Q 52.71875 137.859375 52.71875 136.359375 Q 52.71875 134.859375 52.328125 134.109375 Q 51.953125 133.359375 51.171875 133.359375 z M 51.171875 132.578125 Q 52.40625 132.578125 53.046875 133.546875 Q 53.703125 134.515625 53.703125 136.359375 Q 53.703125 138.203125 53.046875 139.171875 Q 52.40625 140.140625 51.171875 140.140625 Q 49.953125 140.140625 49.296875 139.171875 Q 48.65625 138.203125 48.65625 136.359375 Q 48.65625 134.515625 49.296875 133.546875 Q 49.953125 132.578125 51.171875 132.578125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 56.78662485303139 142.82509847769097 L 60.78662485303139 142.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 49.234375 56.171875 L 50.859375 56.171875 L 50.859375 50.609375 L 49.09375 50.953125 L 49.09375 50.0625 L 50.84375 49.703125 L 51.828125 49.703125 L 51.828125 56.171875 L 53.4375 56.171875 L 53.4375 57 L 49.234375 57 L 49.234375 56.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 56.78662485303139 53.776666285062575 L 60.78662485303139 53.776666285062575"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 60.78662485303139 2 L 60.78662485303139 257"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 61.28662485303139 1 L 57.78662485303139 4"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 60.28662485303139 1 L 63.78662485303139 4"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g id="misc">
</g><!-- misc -->
<g id="layer0">
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 238.88348923828713 142.82509847769097 C 238.88348923828713 192.00518957402107 199.0151481419891 231.87353067031938 149.83505704565925 231.87353067031938 C 100.65496594932941 231.87353067031938 60.786624853031384 192.00518957402107 60.786624853031384 142.82509847769097 C 60.786624853031384 93.64500738136084 100.65496594932941 53.776666285062575 149.83505704565925 53.776666285062575 C 199.0151481419891 53.776666285062575 238.88348923828713 93.64500738136084 238.88348923828713 142.82509847769097 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 33 22 L 133 22"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 56 22 C 56 23.65685424949238 54.65685424949238 25 53 25 C 51.34314575050762 25 50 23.65685424949238 50 22 C 50 20.34314575050762 51.34314575050762 19 53 19 C 54.65685424949238 19 56 20.34314575050762 56 22 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 56 22 C 56 23.65685424949238 54.65685424949238 25 53 25 C 51.34314575050762 25 50 23.65685424949238 50 22 C 50 20.34314575050762 51.34314575050762 19 53 19 C 54.65685424949238 19 56 20.34314575050762 56 22 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 15.9375 33.4375 Q 15.75 33.34375 15.53125 33.296875 Q 15.328125 33.234375 15.0625 33.234375 Q 14.15625 33.234375 13.65625 33.828125 Q 13.171875 34.421875 13.171875 35.546875 L 13.171875 39 L 12.09375 39 L 12.09375 32.4375 L 13.171875 32.4375 L 13.171875 33.453125 Q 13.515625 32.859375 14.0625 32.578125 Q 14.609375 32.28125 15.390625 32.28125 Q 15.5 32.28125 15.625 32.296875 Q 15.765625 32.3125 15.921875 32.34375 L 15.9375 33.4375 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 17.16796875 43.171875 L 18.79296875 43.171875 L 18.79296875 37.609375 L 17.02734375 37.953125 L 17.02734375 37.0625 L 18.77734375 36.703125 L 19.76171875 36.703125 L 19.76171875 43.171875 L 21.37109375 43.171875 L 21.37109375 44 L 17.16796875 44 L 17.16796875 43.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 27.3759765625 33.546875 L 34.8916015625 33.546875 L 34.8916015625 34.53125 L 27.3759765625 34.53125 L 27.3759765625 33.546875 z M 27.3759765625 35.9375 L 34.8916015625 35.9375 L 34.8916015625 36.9375 L 27.3759765625 36.9375 L 27.3759765625 35.9375 z M 41.4638671875 38 L 43.4013671875 38 L 43.4013671875 31.328125 L 41.2919921875 31.75 L 41.2919921875 30.671875 L 43.3857421875 30.25 L 44.5732421875 30.25 L 44.5732421875 38 L 46.5107421875 38 L 46.5107421875 39 L 41.4638671875 39 L 41.4638671875 38 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 60.78662485303139 142.82509847769097 L 265 4.751810368390778"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 153 143 C 153 144.65685424949237 151.65685424949237 146 150 146 C 148.34314575050763 146 147 144.65685424949237 147 143 C 147 141.34314575050763 148.34314575050763 140 150 140 C 151.65685424949237 140 153 141.34314575050763 153 143 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 153 143 C 153 144.65685424949237 151.65685424949237 146 150 146 C 148.34314575050763 146 147 144.65685424949237 147 143 C 147 141.34314575050763 148.34314575050763 140 150 140 C 151.65685424949237 140 153 141.34314575050763 153 143 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 161.734375 128.921875 L 161.734375 130.171875 Q 161.125 129.609375 160.453125 129.34375 Q 159.78125 129.0625 159.015625 129.0625 Q 157.515625 129.0625 156.71875 129.984375 Q 155.921875 130.90625 155.921875 132.640625 Q 155.921875 134.359375 156.71875 135.28125 Q 157.515625 136.203125 159.015625 136.203125 Q 159.78125 136.203125 160.453125 135.921875 Q 161.125 135.640625 161.734375 135.09375 L 161.734375 136.328125 Q 161.109375 136.75 160.40625 136.96875 Q 159.71875 137.171875 158.953125 137.171875 Q 156.953125 137.171875 155.8125 135.953125 Q 154.671875 134.734375 154.671875 132.640625 Q 154.671875 130.53125 155.8125 129.3125 Q 156.953125 128.09375 158.953125 128.09375 Q 159.734375 128.09375 160.421875 128.3125 Q 161.125 128.515625 161.734375 128.921875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 163.61328125 141.171875 L 165.23828125 141.171875 L 165.23828125 135.609375 L 163.47265625 135.953125 L 163.47265625 135.0625 L 165.22265625 134.703125 L 166.20703125 134.703125 L 166.20703125 141.171875 L 167.81640625 141.171875 L 167.81640625 142 L 163.61328125 142 L 163.61328125 141.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 136 94 C 136 95.65685424949238 134.65685424949237 97 133 97 C 131.34314575050763 97 130 95.65685424949238 130 94 C 130 92.34314575050762 131.34314575050763 91 133 91 C 134.65685424949237 91 136 92.34314575050762 136 94 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 136 94 C 136 95.65685424949238 134.65685424949237 97 133 97 C 131.34314575050763 97 130 95.65685424949238 130 94 C 130 92.34314575050762 131.34314575050763 91 133 91 C 134.65685424949237 91 136 92.34314575050762 136 94 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 139.359375 80.21875 L 139.359375 83.515625 L 140.84375 83.515625 Q 141.671875 83.515625 142.125 83.09375 Q 142.578125 82.65625 142.578125 81.859375 Q 142.578125 81.078125 142.125 80.65625 Q 141.671875 80.21875 140.84375 80.21875 L 139.359375 80.21875 z M 138.171875 79.25 L 140.84375 79.25 Q 142.328125 79.25 143.078125 79.921875 Q 143.828125 80.578125 143.828125 81.859375 Q 143.828125 83.15625 143.078125 83.828125 Q 142.328125 84.484375 140.84375 84.484375 L 139.359375 84.484375 L 139.359375 88 L 138.171875 88 L 138.171875 79.25 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 64 143 C 64 144.65685424949237 62.65685424949238 146 61 146 C 59.34314575050762 146 58 144.65685424949237 58 143 C 58 141.34314575050763 59.34314575050762 140 61 140 C 62.65685424949238 140 64 141.34314575050763 64 143 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 64 143 C 64 144.65685424949237 62.65685424949238 146 61 146 C 59.34314575050762 146 58 144.65685424949237 58 143 C 58 141.34314575050763 59.34314575050762 140 61 140 C 62.65685424949238 140 64 141.34314575050763 64 143 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 72.734375 128.921875 L 72.734375 130.171875 Q 72.125 129.609375 71.453125 129.34375 Q 70.78125 129.0625 70.015625 129.0625 Q 68.515625 129.0625 67.71875 129.984375 Q 66.921875 130.90625 66.921875 132.640625 Q 66.921875 134.359375 67.71875 135.28125 Q 68.515625 136.203125 70.015625 136.203125 Q 70.78125 136.203125 71.453125 135.921875 Q 72.125 135.640625 72.734375 135.09375 L 72.734375 136.328125 Q 72.109375 136.75 71.40625 136.96875 Q 70.71875 137.171875 69.953125 137.171875 Q 67.953125 137.171875 66.8125 135.953125 Q 65.671875 134.734375 65.671875 132.640625 Q 65.671875 130.53125 66.8125 129.3125 Q 67.953125 128.09375 69.953125 128.09375 Q 70.734375 128.09375 71.421875 128.3125 Q 72.125 128.515625 72.734375 128.921875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 77.09765625 134.40625 L 77.09765625 135.15625 L 76.23828125 135.15625 Q 75.75390625 135.15625 75.56640625 135.359375 Q 75.37890625 135.546875 75.37890625 136.046875 L 75.37890625 136.53125 L 76.84765625 136.53125 L 76.84765625 137.234375 L 75.37890625 137.234375 L 75.37890625 142 L 74.47265625 142 L 74.47265625 137.234375 L 73.61328125 137.234375 L 73.61328125 136.53125 L 74.47265625 136.53125 L 74.47265625 136.15625 Q 74.47265625 135.234375 74.89453125 134.828125 Q 75.31640625 134.40625 76.23828125 134.40625 L 77.09765625 134.40625 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 186 60 C 186 61.65685424949238 184.65685424949237 63 183 63 C 181.34314575050763 63 180 61.65685424949238 180 60 C 180 58.34314575050762 181.34314575050763 57 183 57 C 184.65685424949237 57 186 58.34314575050762 186 60 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 186 60 C 186 61.65685424949238 184.65685424949237 63 183 63 C 181.34314575050763 63 180 61.65685424949238 180 60 C 180 58.34314575050762 181.34314575050763 57 183 57 C 184.65685424949237 57 186 58.34314575050762 186 60 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 189.359375 46.21875 L 189.359375 49.515625 L 190.84375 49.515625 Q 191.671875 49.515625 192.125 49.09375 Q 192.578125 48.65625 192.578125 47.859375 Q 192.578125 47.078125 192.125 46.65625 Q 191.671875 46.21875 190.84375 46.21875 L 189.359375 46.21875 z M 188.171875 45.25 L 190.84375 45.25 Q 192.328125 45.25 193.078125 45.921875 Q 193.828125 46.578125 193.828125 47.859375 Q 193.828125 49.15625 193.078125 49.828125 Q 192.328125 50.484375 190.84375 50.484375 L 189.359375 50.484375 L 189.359375 54 L 188.171875 54 L 188.171875 45.25 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 195.470703125 58.171875 L 197.095703125 58.171875 L 197.095703125 52.609375 L 195.330078125 52.953125 L 195.330078125 52.0625 L 197.080078125 51.703125 L 198.064453125 51.703125 L 198.064453125 58.171875 L 199.673828125 58.171875 L 199.673828125 59 L 195.470703125 59 L 195.470703125 58.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
</g><!-- layer0 -->
</g> <!-- default stroke -->
</svg> <!-- bounding box -->

Before

Width:  |  Height:  |  Size: 21 KiB

View File

@ -1,213 +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="337px"
height="327px"
viewBox="0 0 337 327"
>
<title></title>
<desc>Creator: FreeHEP Graphics2D Driver Producer: geogebra.export.SVGExtensions Revision: 12753 Source: Date: Friday, December 22, 2017 4:12:44 PM EST</desc>
<g stroke-linejoin="miter" stroke-dashoffset="0" stroke-dasharray="none" stroke-width="1" stroke-miterlimit="10" stroke-linecap="square">
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#ffffff">
<path d="M 0 0 L 265 0 L 265 257 L 0 257 L 0 0 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 69.171875 149.359375 Q 68.421875 149.359375 68.03125 150.109375 Q 67.65625 150.859375 67.65625 152.359375 Q 67.65625 153.859375 68.03125 154.609375 Q 68.421875 155.359375 69.171875 155.359375 Q 69.953125 155.359375 70.328125 154.609375 Q 70.71875 153.859375 70.71875 152.359375 Q 70.71875 150.859375 70.328125 150.109375 Q 69.953125 149.359375 69.171875 149.359375 z M 69.171875 148.578125 Q 70.40625 148.578125 71.046875 149.546875 Q 71.703125 150.515625 71.703125 152.359375 Q 71.703125 154.203125 71.046875 155.171875 Q 70.40625 156.140625 69.171875 156.140625 Q 67.953125 156.140625 67.296875 155.171875 Q 66.65625 154.203125 66.65625 152.359375 Q 66.65625 150.515625 67.296875 149.546875 Q 67.953125 148.578125 69.171875 148.578125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 60.78662485303139 142.82509847769097 L 60.78662485303139 146.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 148.234375 155.171875 L 149.859375 155.171875 L 149.859375 149.609375 L 148.09375 149.953125 L 148.09375 149.0625 L 149.84375 148.703125 L 150.828125 148.703125 L 150.828125 155.171875 L 152.4375 155.171875 L 152.4375 156 L 148.234375 156 L 148.234375 155.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 149.83505704565925 142.82509847769097 L 149.83505704565925 146.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 237.921875 155.171875 L 241.359375 155.171875 L 241.359375 156 L 236.734375 156 L 236.734375 155.171875 Q 237.296875 154.59375 238.265625 153.609375 Q 239.234375 152.625 239.484375 152.34375 Q 239.953125 151.8125 240.140625 151.453125 Q 240.328125 151.078125 240.328125 150.71875 Q 240.328125 150.140625 239.921875 149.78125 Q 239.515625 149.40625 238.859375 149.40625 Q 238.390625 149.40625 237.875 149.578125 Q 237.375 149.734375 236.78125 150.0625 L 236.78125 149.0625 Q 237.375 148.828125 237.890625 148.703125 Q 238.40625 148.578125 238.84375 148.578125 Q 239.96875 148.578125 240.640625 149.140625 Q 241.328125 149.703125 241.328125 150.65625 Q 241.328125 151.109375 241.15625 151.515625 Q 240.984375 151.90625 240.546875 152.453125 Q 240.421875 152.59375 239.765625 153.28125 Q 239.109375 153.953125 237.921875 155.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 238.88348923828713 142.82509847769097 L 238.88348923828713 146.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 0 142.82509847769097 L 263 142.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 264 143.32509847769097 L 261 139.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 264 142.32509847769097 L 261 145.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 44.484375 231.859375 L 47.125 231.859375 L 47.125 232.65625 L 44.484375 232.65625 L 44.484375 231.859375 z M 48.8427734375 234.171875 L 50.4677734375 234.171875 L 50.4677734375 228.609375 L 48.7021484375 228.953125 L 48.7021484375 228.0625 L 50.4521484375 227.703125 L 51.4365234375 227.703125 L 51.4365234375 234.171875 L 53.0458984375 234.171875 L 53.0458984375 235 L 48.8427734375 235 L 48.8427734375 234.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 56.78662485303139 231.87353067031938 L 60.78662485303139 231.87353067031938"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 51.171875 133.359375 Q 50.421875 133.359375 50.03125 134.109375 Q 49.65625 134.859375 49.65625 136.359375 Q 49.65625 137.859375 50.03125 138.609375 Q 50.421875 139.359375 51.171875 139.359375 Q 51.953125 139.359375 52.328125 138.609375 Q 52.71875 137.859375 52.71875 136.359375 Q 52.71875 134.859375 52.328125 134.109375 Q 51.953125 133.359375 51.171875 133.359375 z M 51.171875 132.578125 Q 52.40625 132.578125 53.046875 133.546875 Q 53.703125 134.515625 53.703125 136.359375 Q 53.703125 138.203125 53.046875 139.171875 Q 52.40625 140.140625 51.171875 140.140625 Q 49.953125 140.140625 49.296875 139.171875 Q 48.65625 138.203125 48.65625 136.359375 Q 48.65625 134.515625 49.296875 133.546875 Q 49.953125 132.578125 51.171875 132.578125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 56.78662485303139 142.82509847769097 L 60.78662485303139 142.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 49.234375 56.171875 L 50.859375 56.171875 L 50.859375 50.609375 L 49.09375 50.953125 L 49.09375 50.0625 L 50.84375 49.703125 L 51.828125 49.703125 L 51.828125 56.171875 L 53.4375 56.171875 L 53.4375 57 L 49.234375 57 L 49.234375 56.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 56.78662485303139 53.776666285062575 L 60.78662485303139 53.776666285062575"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 60.78662485303139 2 L 60.78662485303139 257"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 61.28662485303139 1 L 57.78662485303139 4"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 60.28662485303139 1 L 63.78662485303139 4"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g id="misc">
</g><!-- misc -->
<g id="layer0">
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 238.88348923828713 142.82509847769097 C 238.88348923828713 192.00518957402107 199.0151481419891 231.87353067031938 149.83505704565925 231.87353067031938 C 100.65496594932941 231.87353067031938 60.786624853031384 192.00518957402107 60.786624853031384 142.82509847769097 C 60.786624853031384 93.64500738136084 100.65496594932941 53.776666285062575 149.83505704565925 53.776666285062575 C 199.0151481419891 53.776666285062575 238.88348923828713 93.64500738136084 238.88348923828713 142.82509847769097 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 33 22 L 133 22"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 56 22 C 56 23.65685424949238 54.65685424949238 25 53 25 C 51.34314575050762 25 50 23.65685424949238 50 22 C 50 20.34314575050762 51.34314575050762 19 53 19 C 54.65685424949238 19 56 20.34314575050762 56 22 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 56 22 C 56 23.65685424949238 54.65685424949238 25 53 25 C 51.34314575050762 25 50 23.65685424949238 50 22 C 50 20.34314575050762 51.34314575050762 19 53 19 C 54.65685424949238 19 56 20.34314575050762 56 22 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 15.9375 33.4375 Q 15.75 33.34375 15.53125 33.296875 Q 15.328125 33.234375 15.0625 33.234375 Q 14.15625 33.234375 13.65625 33.828125 Q 13.171875 34.421875 13.171875 35.546875 L 13.171875 39 L 12.09375 39 L 12.09375 32.4375 L 13.171875 32.4375 L 13.171875 33.453125 Q 13.515625 32.859375 14.0625 32.578125 Q 14.609375 32.28125 15.390625 32.28125 Q 15.5 32.28125 15.625 32.296875 Q 15.765625 32.3125 15.921875 32.34375 L 15.9375 33.4375 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 17.16796875 43.171875 L 18.79296875 43.171875 L 18.79296875 37.609375 L 17.02734375 37.953125 L 17.02734375 37.0625 L 18.77734375 36.703125 L 19.76171875 36.703125 L 19.76171875 43.171875 L 21.37109375 43.171875 L 21.37109375 44 L 17.16796875 44 L 17.16796875 43.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 27.3759765625 33.546875 L 34.8916015625 33.546875 L 34.8916015625 34.53125 L 27.3759765625 34.53125 L 27.3759765625 33.546875 z M 27.3759765625 35.9375 L 34.8916015625 35.9375 L 34.8916015625 36.9375 L 27.3759765625 36.9375 L 27.3759765625 35.9375 z M 41.4638671875 38 L 43.4013671875 38 L 43.4013671875 31.328125 L 41.2919921875 31.75 L 41.2919921875 30.671875 L 43.3857421875 30.25 L 44.5732421875 30.25 L 44.5732421875 38 L 46.5107421875 38 L 46.5107421875 39 L 41.4638671875 39 L 41.4638671875 38 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 60.78662485303139 142.82509847769097 L -26.259375880414986 0"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 153 143 C 153 144.65685424949237 151.65685424949237 146 150 146 C 148.34314575050763 146 147 144.65685424949237 147 143 C 147 141.34314575050763 148.34314575050763 140 150 140 C 151.65685424949237 140 153 141.34314575050763 153 143 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 153 143 C 153 144.65685424949237 151.65685424949237 146 150 146 C 148.34314575050763 146 147 144.65685424949237 147 143 C 147 141.34314575050763 148.34314575050763 140 150 140 C 151.65685424949237 140 153 141.34314575050763 153 143 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 161.734375 128.921875 L 161.734375 130.171875 Q 161.125 129.609375 160.453125 129.34375 Q 159.78125 129.0625 159.015625 129.0625 Q 157.515625 129.0625 156.71875 129.984375 Q 155.921875 130.90625 155.921875 132.640625 Q 155.921875 134.359375 156.71875 135.28125 Q 157.515625 136.203125 159.015625 136.203125 Q 159.78125 136.203125 160.453125 135.921875 Q 161.125 135.640625 161.734375 135.09375 L 161.734375 136.328125 Q 161.109375 136.75 160.40625 136.96875 Q 159.71875 137.171875 158.953125 137.171875 Q 156.953125 137.171875 155.8125 135.953125 Q 154.671875 134.734375 154.671875 132.640625 Q 154.671875 130.53125 155.8125 129.3125 Q 156.953125 128.09375 158.953125 128.09375 Q 159.734375 128.09375 160.421875 128.3125 Q 161.125 128.515625 161.734375 128.921875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 163.61328125 141.171875 L 165.23828125 141.171875 L 165.23828125 135.609375 L 163.47265625 135.953125 L 163.47265625 135.0625 L 165.22265625 134.703125 L 166.20703125 134.703125 L 166.20703125 141.171875 L 167.81640625 141.171875 L 167.81640625 142 L 163.61328125 142 L 163.61328125 141.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 45 112 C 45 113.65685424949238 43.65685424949238 115 42 115 C 40.34314575050762 115 39 113.65685424949238 39 112 C 39 110.34314575050762 40.34314575050762 109 42 109 C 43.65685424949238 109 45 110.34314575050762 45 112 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 45 112 C 45 113.65685424949238 43.65685424949238 115 42 115 C 40.34314575050762 115 39 113.65685424949238 39 112 C 39 110.34314575050762 40.34314575050762 109 42 109 C 43.65685424949238 109 45 110.34314575050762 45 112 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 48.359375 98.21875 L 48.359375 101.515625 L 49.84375 101.515625 Q 50.671875 101.515625 51.125 101.09375 Q 51.578125 100.65625 51.578125 99.859375 Q 51.578125 99.078125 51.125 98.65625 Q 50.671875 98.21875 49.84375 98.21875 L 48.359375 98.21875 z M 47.171875 97.25 L 49.84375 97.25 Q 51.328125 97.25 52.078125 97.921875 Q 52.828125 98.578125 52.828125 99.859375 Q 52.828125 101.15625 52.078125 101.828125 Q 51.328125 102.484375 49.84375 102.484375 L 48.359375 102.484375 L 48.359375 106 L 47.171875 106 L 47.171875 97.25 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 64 143 C 64 144.65685424949237 62.65685424949238 146 61 146 C 59.34314575050762 146 58 144.65685424949237 58 143 C 58 141.34314575050763 59.34314575050762 140 61 140 C 62.65685424949238 140 64 141.34314575050763 64 143 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 64 143 C 64 144.65685424949237 62.65685424949238 146 61 146 C 59.34314575050762 146 58 144.65685424949237 58 143 C 58 141.34314575050763 59.34314575050762 140 61 140 C 62.65685424949238 140 64 141.34314575050763 64 143 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 72.734375 128.921875 L 72.734375 130.171875 Q 72.125 129.609375 71.453125 129.34375 Q 70.78125 129.0625 70.015625 129.0625 Q 68.515625 129.0625 67.71875 129.984375 Q 66.921875 130.90625 66.921875 132.640625 Q 66.921875 134.359375 67.71875 135.28125 Q 68.515625 136.203125 70.015625 136.203125 Q 70.78125 136.203125 71.453125 135.921875 Q 72.125 135.640625 72.734375 135.09375 L 72.734375 136.328125 Q 72.109375 136.75 71.40625 136.96875 Q 70.71875 137.171875 69.953125 137.171875 Q 67.953125 137.171875 66.8125 135.953125 Q 65.671875 134.734375 65.671875 132.640625 Q 65.671875 130.53125 66.8125 129.3125 Q 67.953125 128.09375 69.953125 128.09375 Q 70.734375 128.09375 71.421875 128.3125 Q 72.125 128.515625 72.734375 128.921875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 77.09765625 134.40625 L 77.09765625 135.15625 L 76.23828125 135.15625 Q 75.75390625 135.15625 75.56640625 135.359375 Q 75.37890625 135.546875 75.37890625 136.046875 L 75.37890625 136.53125 L 76.84765625 136.53125 L 76.84765625 137.234375 L 75.37890625 137.234375 L 75.37890625 142 L 74.47265625 142 L 74.47265625 137.234375 L 73.61328125 137.234375 L 73.61328125 136.53125 L 74.47265625 136.53125 L 74.47265625 136.15625 Q 74.47265625 135.234375 74.89453125 134.828125 Q 75.31640625 134.40625 76.23828125 134.40625 L 77.09765625 134.40625 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
</g><!-- layer0 -->
</g> <!-- default stroke -->
</svg> <!-- bounding box -->

Before

Width:  |  Height:  |  Size: 19 KiB

View File

@ -1,213 +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="337px"
height="327px"
viewBox="0 0 337 327"
>
<title></title>
<desc>Creator: FreeHEP Graphics2D Driver Producer: geogebra.export.SVGExtensions Revision: 12753 Source: Date: Friday, December 22, 2017 4:14:25 PM EST</desc>
<g stroke-linejoin="miter" stroke-dashoffset="0" stroke-dasharray="none" stroke-width="1" stroke-miterlimit="10" stroke-linecap="square">
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#ffffff">
<path d="M 0 0 L 265 0 L 265 257 L 0 257 L 0 0 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 69.171875 149.359375 Q 68.421875 149.359375 68.03125 150.109375 Q 67.65625 150.859375 67.65625 152.359375 Q 67.65625 153.859375 68.03125 154.609375 Q 68.421875 155.359375 69.171875 155.359375 Q 69.953125 155.359375 70.328125 154.609375 Q 70.71875 153.859375 70.71875 152.359375 Q 70.71875 150.859375 70.328125 150.109375 Q 69.953125 149.359375 69.171875 149.359375 z M 69.171875 148.578125 Q 70.40625 148.578125 71.046875 149.546875 Q 71.703125 150.515625 71.703125 152.359375 Q 71.703125 154.203125 71.046875 155.171875 Q 70.40625 156.140625 69.171875 156.140625 Q 67.953125 156.140625 67.296875 155.171875 Q 66.65625 154.203125 66.65625 152.359375 Q 66.65625 150.515625 67.296875 149.546875 Q 67.953125 148.578125 69.171875 148.578125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 60.78662485303139 142.82509847769097 L 60.78662485303139 146.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 148.234375 155.171875 L 149.859375 155.171875 L 149.859375 149.609375 L 148.09375 149.953125 L 148.09375 149.0625 L 149.84375 148.703125 L 150.828125 148.703125 L 150.828125 155.171875 L 152.4375 155.171875 L 152.4375 156 L 148.234375 156 L 148.234375 155.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 149.83505704565925 142.82509847769097 L 149.83505704565925 146.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 237.921875 155.171875 L 241.359375 155.171875 L 241.359375 156 L 236.734375 156 L 236.734375 155.171875 Q 237.296875 154.59375 238.265625 153.609375 Q 239.234375 152.625 239.484375 152.34375 Q 239.953125 151.8125 240.140625 151.453125 Q 240.328125 151.078125 240.328125 150.71875 Q 240.328125 150.140625 239.921875 149.78125 Q 239.515625 149.40625 238.859375 149.40625 Q 238.390625 149.40625 237.875 149.578125 Q 237.375 149.734375 236.78125 150.0625 L 236.78125 149.0625 Q 237.375 148.828125 237.890625 148.703125 Q 238.40625 148.578125 238.84375 148.578125 Q 239.96875 148.578125 240.640625 149.140625 Q 241.328125 149.703125 241.328125 150.65625 Q 241.328125 151.109375 241.15625 151.515625 Q 240.984375 151.90625 240.546875 152.453125 Q 240.421875 152.59375 239.765625 153.28125 Q 239.109375 153.953125 237.921875 155.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 238.88348923828713 142.82509847769097 L 238.88348923828713 146.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 0 142.82509847769097 L 263 142.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 264 143.32509847769097 L 261 139.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 264 142.32509847769097 L 261 145.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 44.484375 231.859375 L 47.125 231.859375 L 47.125 232.65625 L 44.484375 232.65625 L 44.484375 231.859375 z M 48.8427734375 234.171875 L 50.4677734375 234.171875 L 50.4677734375 228.609375 L 48.7021484375 228.953125 L 48.7021484375 228.0625 L 50.4521484375 227.703125 L 51.4365234375 227.703125 L 51.4365234375 234.171875 L 53.0458984375 234.171875 L 53.0458984375 235 L 48.8427734375 235 L 48.8427734375 234.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 56.78662485303139 231.87353067031938 L 60.78662485303139 231.87353067031938"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 51.171875 133.359375 Q 50.421875 133.359375 50.03125 134.109375 Q 49.65625 134.859375 49.65625 136.359375 Q 49.65625 137.859375 50.03125 138.609375 Q 50.421875 139.359375 51.171875 139.359375 Q 51.953125 139.359375 52.328125 138.609375 Q 52.71875 137.859375 52.71875 136.359375 Q 52.71875 134.859375 52.328125 134.109375 Q 51.953125 133.359375 51.171875 133.359375 z M 51.171875 132.578125 Q 52.40625 132.578125 53.046875 133.546875 Q 53.703125 134.515625 53.703125 136.359375 Q 53.703125 138.203125 53.046875 139.171875 Q 52.40625 140.140625 51.171875 140.140625 Q 49.953125 140.140625 49.296875 139.171875 Q 48.65625 138.203125 48.65625 136.359375 Q 48.65625 134.515625 49.296875 133.546875 Q 49.953125 132.578125 51.171875 132.578125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 56.78662485303139 142.82509847769097 L 60.78662485303139 142.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 49.234375 56.171875 L 50.859375 56.171875 L 50.859375 50.609375 L 49.09375 50.953125 L 49.09375 50.0625 L 50.84375 49.703125 L 51.828125 49.703125 L 51.828125 56.171875 L 53.4375 56.171875 L 53.4375 57 L 49.234375 57 L 49.234375 56.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 56.78662485303139 53.776666285062575 L 60.78662485303139 53.776666285062575"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 60.78662485303139 2 L 60.78662485303139 257"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 61.28662485303139 1 L 57.78662485303139 4"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 60.28662485303139 1 L 63.78662485303139 4"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g id="misc">
</g><!-- misc -->
<g id="layer0">
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 221.07380279976155 142.82509847769097 C 221.07380279976155 182.16917135475506 189.17912992272312 214.0638442317937 149.83505704565925 214.0638442317937 C 110.49098416859538 214.0638442317937 78.59631129155696 182.16917135475506 78.59631129155696 142.82509847769097 C 78.59631129155696 103.48102560062685 110.49098416859538 71.58635272358825 149.83505704565925 71.58635272358825 C 189.17912992272312 71.58635272358825 221.07380279976155 103.48102560062685 221.07380279976155 142.82509847769097 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 33 22 L 133 22"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 52 22 C 52 23.65685424949238 50.65685424949238 25 49 25 C 47.34314575050762 25 46 23.65685424949238 46 22 C 46 20.34314575050762 47.34314575050762 19 49 19 C 50.65685424949238 19 52 20.34314575050762 52 22 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 52 22 C 52 23.65685424949238 50.65685424949238 25 49 25 C 47.34314575050762 25 46 23.65685424949238 46 22 C 46 20.34314575050762 47.34314575050762 19 49 19 C 50.65685424949238 19 52 20.34314575050762 52 22 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 11.9375 33.4375 Q 11.75 33.34375 11.53125 33.296875 Q 11.328125 33.234375 11.0625 33.234375 Q 10.15625 33.234375 9.65625 33.828125 Q 9.171875 34.421875 9.171875 35.546875 L 9.171875 39 L 8.09375 39 L 8.09375 32.4375 L 9.171875 32.4375 L 9.171875 33.453125 Q 9.515625 32.859375 10.0625 32.578125 Q 10.609375 32.28125 11.390625 32.28125 Q 11.5 32.28125 11.625 32.296875 Q 11.765625 32.3125 11.921875 32.34375 L 11.9375 33.4375 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 13.16796875 43.171875 L 14.79296875 43.171875 L 14.79296875 37.609375 L 13.02734375 37.953125 L 13.02734375 37.0625 L 14.77734375 36.703125 L 15.76171875 36.703125 L 15.76171875 43.171875 L 17.37109375 43.171875 L 17.37109375 44 L 13.16796875 44 L 13.16796875 43.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 23.3759765625 33.546875 L 30.8916015625 33.546875 L 30.8916015625 34.53125 L 23.3759765625 34.53125 L 23.3759765625 33.546875 z M 23.3759765625 35.9375 L 30.8916015625 35.9375 L 30.8916015625 36.9375 L 23.3759765625 36.9375 L 23.3759765625 35.9375 z M 39.7919921875 31.03125 Q 38.8857421875 31.03125 38.4169921875 31.9375 Q 37.9638671875 32.828125 37.9638671875 34.640625 Q 37.9638671875 36.4375 38.4169921875 37.34375 Q 38.8857421875 38.234375 39.7919921875 38.234375 Q 40.7138671875 38.234375 41.1669921875 37.34375 Q 41.6357421875 36.4375 41.6357421875 34.640625 Q 41.6357421875 32.828125 41.1669921875 31.9375 Q 40.7138671875 31.03125 39.7919921875 31.03125 z M 39.7919921875 30.09375 Q 41.2607421875 30.09375 42.0419921875 31.265625 Q 42.8232421875 32.421875 42.8232421875 34.640625 Q 42.8232421875 36.84375 42.0419921875 38.015625 Q 41.2607421875 39.171875 39.7919921875 39.171875 Q 38.3232421875 39.171875 37.5419921875 38.015625 Q 36.7763671875 36.84375 36.7763671875 34.640625 Q 36.7763671875 32.421875 37.5419921875 31.265625 Q 38.3232421875 30.09375 39.7919921875 30.09375 z M 44.8955078125 37.515625 L 46.1298828125 37.515625 L 46.1298828125 39 L 44.8955078125 39 L 44.8955078125 37.515625 z M 51.2412109375 34.84375 Q 50.3974609375 34.84375 49.9130859375 35.296875 Q 49.4287109375 35.75 49.4287109375 36.53125 Q 49.4287109375 37.328125 49.9130859375 37.78125 Q 50.3974609375 38.234375 51.2412109375 38.234375 Q 52.0849609375 38.234375 52.5693359375 37.78125 Q 53.0537109375 37.328125 53.0537109375 36.53125 Q 53.0537109375 35.75 52.5693359375 35.296875 Q 52.1005859375 34.84375 51.2412109375 34.84375 z M 50.0537109375 34.34375 Q 49.3037109375 34.15625 48.8662109375 33.640625 Q 48.4443359375 33.109375 48.4443359375 32.359375 Q 48.4443359375 31.3125 49.1943359375 30.703125 Q 49.9443359375 30.09375 51.2412109375 30.09375 Q 52.5537109375 30.09375 53.2880859375 30.703125 Q 54.0380859375 31.3125 54.0380859375 32.359375 Q 54.0380859375 33.109375 53.6162109375 33.640625 Q 53.1943359375 34.15625 52.4287109375 34.34375 Q 53.2880859375 34.546875 53.7568359375 35.125 Q 54.2412109375 35.703125 54.2412109375 36.53125 Q 54.2412109375 37.8125 53.4599609375 38.5 Q 52.6943359375 39.171875 51.2412109375 39.171875 Q 49.8037109375 39.171875 49.0224609375 38.5 Q 48.2412109375 37.8125 48.2412109375 36.53125 Q 48.2412109375 35.703125 48.7255859375 35.125 Q 49.2099609375 34.546875 50.0537109375 34.34375 z M 49.6318359375 32.46875 Q 49.6318359375 33.15625 50.0537109375 33.53125 Q 50.4755859375 33.90625 51.2412109375 33.90625 Q 52.0068359375 33.90625 52.4287109375 33.53125 Q 52.8662109375 33.15625 52.8662109375 32.46875 Q 52.8662109375 31.796875 52.4287109375 31.421875 Q 52.0068359375 31.03125 51.2412109375 31.03125 Q 50.4755859375 31.03125 50.0537109375 31.421875 Q 49.6318359375 31.796875 49.6318359375 32.46875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 60.78662485303139 142.82509847769097 L -26.259375880414986 0"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 153 143 C 153 144.65685424949237 151.65685424949237 146 150 146 C 148.34314575050763 146 147 144.65685424949237 147 143 C 147 141.34314575050763 148.34314575050763 140 150 140 C 151.65685424949237 140 153 141.34314575050763 153 143 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 153 143 C 153 144.65685424949237 151.65685424949237 146 150 146 C 148.34314575050763 146 147 144.65685424949237 147 143 C 147 141.34314575050763 148.34314575050763 140 150 140 C 151.65685424949237 140 153 141.34314575050763 153 143 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 161.734375 128.921875 L 161.734375 130.171875 Q 161.125 129.609375 160.453125 129.34375 Q 159.78125 129.0625 159.015625 129.0625 Q 157.515625 129.0625 156.71875 129.984375 Q 155.921875 130.90625 155.921875 132.640625 Q 155.921875 134.359375 156.71875 135.28125 Q 157.515625 136.203125 159.015625 136.203125 Q 159.78125 136.203125 160.453125 135.921875 Q 161.125 135.640625 161.734375 135.09375 L 161.734375 136.328125 Q 161.109375 136.75 160.40625 136.96875 Q 159.71875 137.171875 158.953125 137.171875 Q 156.953125 137.171875 155.8125 135.953125 Q 154.671875 134.734375 154.671875 132.640625 Q 154.671875 130.53125 155.8125 129.3125 Q 156.953125 128.09375 158.953125 128.09375 Q 159.734375 128.09375 160.421875 128.3125 Q 161.125 128.515625 161.734375 128.921875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 163.61328125 141.171875 L 165.23828125 141.171875 L 165.23828125 135.609375 L 163.47265625 135.953125 L 163.47265625 135.0625 L 165.22265625 134.703125 L 166.20703125 134.703125 L 166.20703125 141.171875 L 167.81640625 141.171875 L 167.81640625 142 L 163.61328125 142 L 163.61328125 141.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 45 112 C 45 113.65685424949238 43.65685424949238 115 42 115 C 40.34314575050762 115 39 113.65685424949238 39 112 C 39 110.34314575050762 40.34314575050762 109 42 109 C 43.65685424949238 109 45 110.34314575050762 45 112 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 45 112 C 45 113.65685424949238 43.65685424949238 115 42 115 C 40.34314575050762 115 39 113.65685424949238 39 112 C 39 110.34314575050762 40.34314575050762 109 42 109 C 43.65685424949238 109 45 110.34314575050762 45 112 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 48.359375 98.21875 L 48.359375 101.515625 L 49.84375 101.515625 Q 50.671875 101.515625 51.125 101.09375 Q 51.578125 100.65625 51.578125 99.859375 Q 51.578125 99.078125 51.125 98.65625 Q 50.671875 98.21875 49.84375 98.21875 L 48.359375 98.21875 z M 47.171875 97.25 L 49.84375 97.25 Q 51.328125 97.25 52.078125 97.921875 Q 52.828125 98.578125 52.828125 99.859375 Q 52.828125 101.15625 52.078125 101.828125 Q 51.328125 102.484375 49.84375 102.484375 L 48.359375 102.484375 L 48.359375 106 L 47.171875 106 L 47.171875 97.25 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 64 143 C 64 144.65685424949237 62.65685424949238 146 61 146 C 59.34314575050762 146 58 144.65685424949237 58 143 C 58 141.34314575050763 59.34314575050762 140 61 140 C 62.65685424949238 140 64 141.34314575050763 64 143 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 64 143 C 64 144.65685424949237 62.65685424949238 146 61 146 C 59.34314575050762 146 58 144.65685424949237 58 143 C 58 141.34314575050763 59.34314575050762 140 61 140 C 62.65685424949238 140 64 141.34314575050763 64 143 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 72.734375 128.921875 L 72.734375 130.171875 Q 72.125 129.609375 71.453125 129.34375 Q 70.78125 129.0625 70.015625 129.0625 Q 68.515625 129.0625 67.71875 129.984375 Q 66.921875 130.90625 66.921875 132.640625 Q 66.921875 134.359375 67.71875 135.28125 Q 68.515625 136.203125 70.015625 136.203125 Q 70.78125 136.203125 71.453125 135.921875 Q 72.125 135.640625 72.734375 135.09375 L 72.734375 136.328125 Q 72.109375 136.75 71.40625 136.96875 Q 70.71875 137.171875 69.953125 137.171875 Q 67.953125 137.171875 66.8125 135.953125 Q 65.671875 134.734375 65.671875 132.640625 Q 65.671875 130.53125 66.8125 129.3125 Q 67.953125 128.09375 69.953125 128.09375 Q 70.734375 128.09375 71.421875 128.3125 Q 72.125 128.515625 72.734375 128.921875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 77.09765625 134.40625 L 77.09765625 135.15625 L 76.23828125 135.15625 Q 75.75390625 135.15625 75.56640625 135.359375 Q 75.37890625 135.546875 75.37890625 136.046875 L 75.37890625 136.53125 L 76.84765625 136.53125 L 76.84765625 137.234375 L 75.37890625 137.234375 L 75.37890625 142 L 74.47265625 142 L 74.47265625 137.234375 L 73.61328125 137.234375 L 73.61328125 136.53125 L 74.47265625 136.53125 L 74.47265625 136.15625 Q 74.47265625 135.234375 74.89453125 134.828125 Q 75.31640625 134.40625 76.23828125 134.40625 L 77.09765625 134.40625 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
</g><!-- layer0 -->
</g> <!-- default stroke -->
</svg> <!-- bounding box -->

Before

Width:  |  Height:  |  Size: 21 KiB

View File

@ -1,233 +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="337px"
height="327px"
viewBox="0 0 337 327"
>
<title></title>
<desc>Creator: FreeHEP Graphics2D Driver Producer: geogebra.export.SVGExtensions Revision: 12753 Source: Date: Friday, December 22, 2017 4:15:24 PM EST</desc>
<g stroke-linejoin="miter" stroke-dashoffset="0" stroke-dasharray="none" stroke-width="1" stroke-miterlimit="10" stroke-linecap="square">
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#ffffff">
<path d="M 0 0 L 265 0 L 265 257 L 0 257 L 0 0 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 69.171875 149.359375 Q 68.421875 149.359375 68.03125 150.109375 Q 67.65625 150.859375 67.65625 152.359375 Q 67.65625 153.859375 68.03125 154.609375 Q 68.421875 155.359375 69.171875 155.359375 Q 69.953125 155.359375 70.328125 154.609375 Q 70.71875 153.859375 70.71875 152.359375 Q 70.71875 150.859375 70.328125 150.109375 Q 69.953125 149.359375 69.171875 149.359375 z M 69.171875 148.578125 Q 70.40625 148.578125 71.046875 149.546875 Q 71.703125 150.515625 71.703125 152.359375 Q 71.703125 154.203125 71.046875 155.171875 Q 70.40625 156.140625 69.171875 156.140625 Q 67.953125 156.140625 67.296875 155.171875 Q 66.65625 154.203125 66.65625 152.359375 Q 66.65625 150.515625 67.296875 149.546875 Q 67.953125 148.578125 69.171875 148.578125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 60.78662485303139 142.82509847769097 L 60.78662485303139 146.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 148.234375 155.171875 L 149.859375 155.171875 L 149.859375 149.609375 L 148.09375 149.953125 L 148.09375 149.0625 L 149.84375 148.703125 L 150.828125 148.703125 L 150.828125 155.171875 L 152.4375 155.171875 L 152.4375 156 L 148.234375 156 L 148.234375 155.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 149.83505704565925 142.82509847769097 L 149.83505704565925 146.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 237.921875 155.171875 L 241.359375 155.171875 L 241.359375 156 L 236.734375 156 L 236.734375 155.171875 Q 237.296875 154.59375 238.265625 153.609375 Q 239.234375 152.625 239.484375 152.34375 Q 239.953125 151.8125 240.140625 151.453125 Q 240.328125 151.078125 240.328125 150.71875 Q 240.328125 150.140625 239.921875 149.78125 Q 239.515625 149.40625 238.859375 149.40625 Q 238.390625 149.40625 237.875 149.578125 Q 237.375 149.734375 236.78125 150.0625 L 236.78125 149.0625 Q 237.375 148.828125 237.890625 148.703125 Q 238.40625 148.578125 238.84375 148.578125 Q 239.96875 148.578125 240.640625 149.140625 Q 241.328125 149.703125 241.328125 150.65625 Q 241.328125 151.109375 241.15625 151.515625 Q 240.984375 151.90625 240.546875 152.453125 Q 240.421875 152.59375 239.765625 153.28125 Q 239.109375 153.953125 237.921875 155.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 238.88348923828713 142.82509847769097 L 238.88348923828713 146.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 0 142.82509847769097 L 263 142.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 264 143.32509847769097 L 261 139.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 264 142.32509847769097 L 261 145.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 44.484375 231.859375 L 47.125 231.859375 L 47.125 232.65625 L 44.484375 232.65625 L 44.484375 231.859375 z M 48.8427734375 234.171875 L 50.4677734375 234.171875 L 50.4677734375 228.609375 L 48.7021484375 228.953125 L 48.7021484375 228.0625 L 50.4521484375 227.703125 L 51.4365234375 227.703125 L 51.4365234375 234.171875 L 53.0458984375 234.171875 L 53.0458984375 235 L 48.8427734375 235 L 48.8427734375 234.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 56.78662485303139 231.87353067031938 L 60.78662485303139 231.87353067031938"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 51.171875 133.359375 Q 50.421875 133.359375 50.03125 134.109375 Q 49.65625 134.859375 49.65625 136.359375 Q 49.65625 137.859375 50.03125 138.609375 Q 50.421875 139.359375 51.171875 139.359375 Q 51.953125 139.359375 52.328125 138.609375 Q 52.71875 137.859375 52.71875 136.359375 Q 52.71875 134.859375 52.328125 134.109375 Q 51.953125 133.359375 51.171875 133.359375 z M 51.171875 132.578125 Q 52.40625 132.578125 53.046875 133.546875 Q 53.703125 134.515625 53.703125 136.359375 Q 53.703125 138.203125 53.046875 139.171875 Q 52.40625 140.140625 51.171875 140.140625 Q 49.953125 140.140625 49.296875 139.171875 Q 48.65625 138.203125 48.65625 136.359375 Q 48.65625 134.515625 49.296875 133.546875 Q 49.953125 132.578125 51.171875 132.578125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 56.78662485303139 142.82509847769097 L 60.78662485303139 142.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 49.234375 56.171875 L 50.859375 56.171875 L 50.859375 50.609375 L 49.09375 50.953125 L 49.09375 50.0625 L 50.84375 49.703125 L 51.828125 49.703125 L 51.828125 56.171875 L 53.4375 56.171875 L 53.4375 57 L 49.234375 57 L 49.234375 56.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 56.78662485303139 53.776666285062575 L 60.78662485303139 53.776666285062575"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 60.78662485303139 2 L 60.78662485303139 257"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 61.28662485303139 1 L 57.78662485303139 4"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 60.28662485303139 1 L 63.78662485303139 4"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g id="misc">
</g><!-- misc -->
<g id="layer0">
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 221.07380279976155 142.82509847769097 C 221.07380279976155 182.16917135475506 189.17912992272312 214.0638442317937 149.83505704565925 214.0638442317937 C 110.49098416859538 214.0638442317937 78.59631129155696 182.16917135475506 78.59631129155696 142.82509847769097 C 78.59631129155696 103.48102560062685 110.49098416859538 71.58635272358825 149.83505704565925 71.58635272358825 C 189.17912992272312 71.58635272358825 221.07380279976155 103.48102560062685 221.07380279976155 142.82509847769097 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 33 22 L 133 22"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 52 22 C 52 23.65685424949238 50.65685424949238 25 49 25 C 47.34314575050762 25 46 23.65685424949238 46 22 C 46 20.34314575050762 47.34314575050762 19 49 19 C 50.65685424949238 19 52 20.34314575050762 52 22 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 52 22 C 52 23.65685424949238 50.65685424949238 25 49 25 C 47.34314575050762 25 46 23.65685424949238 46 22 C 46 20.34314575050762 47.34314575050762 19 49 19 C 50.65685424949238 19 52 20.34314575050762 52 22 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 11.9375 33.4375 Q 11.75 33.34375 11.53125 33.296875 Q 11.328125 33.234375 11.0625 33.234375 Q 10.15625 33.234375 9.65625 33.828125 Q 9.171875 34.421875 9.171875 35.546875 L 9.171875 39 L 8.09375 39 L 8.09375 32.4375 L 9.171875 32.4375 L 9.171875 33.453125 Q 9.515625 32.859375 10.0625 32.578125 Q 10.609375 32.28125 11.390625 32.28125 Q 11.5 32.28125 11.625 32.296875 Q 11.765625 32.3125 11.921875 32.34375 L 11.9375 33.4375 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 13.16796875 43.171875 L 14.79296875 43.171875 L 14.79296875 37.609375 L 13.02734375 37.953125 L 13.02734375 37.0625 L 14.77734375 36.703125 L 15.76171875 36.703125 L 15.76171875 43.171875 L 17.37109375 43.171875 L 17.37109375 44 L 13.16796875 44 L 13.16796875 43.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 23.3759765625 33.546875 L 30.8916015625 33.546875 L 30.8916015625 34.53125 L 23.3759765625 34.53125 L 23.3759765625 33.546875 z M 23.3759765625 35.9375 L 30.8916015625 35.9375 L 30.8916015625 36.9375 L 23.3759765625 36.9375 L 23.3759765625 35.9375 z M 39.7919921875 31.03125 Q 38.8857421875 31.03125 38.4169921875 31.9375 Q 37.9638671875 32.828125 37.9638671875 34.640625 Q 37.9638671875 36.4375 38.4169921875 37.34375 Q 38.8857421875 38.234375 39.7919921875 38.234375 Q 40.7138671875 38.234375 41.1669921875 37.34375 Q 41.6357421875 36.4375 41.6357421875 34.640625 Q 41.6357421875 32.828125 41.1669921875 31.9375 Q 40.7138671875 31.03125 39.7919921875 31.03125 z M 39.7919921875 30.09375 Q 41.2607421875 30.09375 42.0419921875 31.265625 Q 42.8232421875 32.421875 42.8232421875 34.640625 Q 42.8232421875 36.84375 42.0419921875 38.015625 Q 41.2607421875 39.171875 39.7919921875 39.171875 Q 38.3232421875 39.171875 37.5419921875 38.015625 Q 36.7763671875 36.84375 36.7763671875 34.640625 Q 36.7763671875 32.421875 37.5419921875 31.265625 Q 38.3232421875 30.09375 39.7919921875 30.09375 z M 44.8955078125 37.515625 L 46.1298828125 37.515625 L 46.1298828125 39 L 44.8955078125 39 L 44.8955078125 37.515625 z M 51.2412109375 34.84375 Q 50.3974609375 34.84375 49.9130859375 35.296875 Q 49.4287109375 35.75 49.4287109375 36.53125 Q 49.4287109375 37.328125 49.9130859375 37.78125 Q 50.3974609375 38.234375 51.2412109375 38.234375 Q 52.0849609375 38.234375 52.5693359375 37.78125 Q 53.0537109375 37.328125 53.0537109375 36.53125 Q 53.0537109375 35.75 52.5693359375 35.296875 Q 52.1005859375 34.84375 51.2412109375 34.84375 z M 50.0537109375 34.34375 Q 49.3037109375 34.15625 48.8662109375 33.640625 Q 48.4443359375 33.109375 48.4443359375 32.359375 Q 48.4443359375 31.3125 49.1943359375 30.703125 Q 49.9443359375 30.09375 51.2412109375 30.09375 Q 52.5537109375 30.09375 53.2880859375 30.703125 Q 54.0380859375 31.3125 54.0380859375 32.359375 Q 54.0380859375 33.109375 53.6162109375 33.640625 Q 53.1943359375 34.15625 52.4287109375 34.34375 Q 53.2880859375 34.546875 53.7568359375 35.125 Q 54.2412109375 35.703125 54.2412109375 36.53125 Q 54.2412109375 37.8125 53.4599609375 38.5 Q 52.6943359375 39.171875 51.2412109375 39.171875 Q 49.8037109375 39.171875 49.0224609375 38.5 Q 48.2412109375 37.8125 48.2412109375 36.53125 Q 48.2412109375 35.703125 48.7255859375 35.125 Q 49.2099609375 34.546875 50.0537109375 34.34375 z M 49.6318359375 32.46875 Q 49.6318359375 33.15625 50.0537109375 33.53125 Q 50.4755859375 33.90625 51.2412109375 33.90625 Q 52.0068359375 33.90625 52.4287109375 33.53125 Q 52.8662109375 33.15625 52.8662109375 32.46875 Q 52.8662109375 31.796875 52.4287109375 31.421875 Q 52.0068359375 31.03125 51.2412109375 31.03125 Q 50.4755859375 31.03125 50.0537109375 31.421875 Q 49.6318359375 31.796875 49.6318359375 32.46875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 60.78662485303139 142.82509847769097 L 168.9065303237307 0"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 153 143 C 153 144.65685424949237 151.65685424949237 146 150 146 C 148.34314575050763 146 147 144.65685424949237 147 143 C 147 141.34314575050763 148.34314575050763 140 150 140 C 151.65685424949237 140 153 141.34314575050763 153 143 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 153 143 C 153 144.65685424949237 151.65685424949237 146 150 146 C 148.34314575050763 146 147 144.65685424949237 147 143 C 147 141.34314575050763 148.34314575050763 140 150 140 C 151.65685424949237 140 153 141.34314575050763 153 143 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 161.734375 128.921875 L 161.734375 130.171875 Q 161.125 129.609375 160.453125 129.34375 Q 159.78125 129.0625 159.015625 129.0625 Q 157.515625 129.0625 156.71875 129.984375 Q 155.921875 130.90625 155.921875 132.640625 Q 155.921875 134.359375 156.71875 135.28125 Q 157.515625 136.203125 159.015625 136.203125 Q 159.78125 136.203125 160.453125 135.921875 Q 161.125 135.640625 161.734375 135.09375 L 161.734375 136.328125 Q 161.109375 136.75 160.40625 136.96875 Q 159.71875 137.171875 158.953125 137.171875 Q 156.953125 137.171875 155.8125 135.953125 Q 154.671875 134.734375 154.671875 132.640625 Q 154.671875 130.53125 155.8125 129.3125 Q 156.953125 128.09375 158.953125 128.09375 Q 159.734375 128.09375 160.421875 128.3125 Q 161.125 128.515625 161.734375 128.921875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 163.61328125 141.171875 L 165.23828125 141.171875 L 165.23828125 135.609375 L 163.47265625 135.953125 L 163.47265625 135.0625 L 165.22265625 134.703125 L 166.20703125 134.703125 L 166.20703125 141.171875 L 167.81640625 141.171875 L 167.81640625 142 L 163.61328125 142 L 163.61328125 141.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 128 58 C 128 59.65685424949238 126.65685424949238 61 125 61 C 123.34314575050762 61 122 59.65685424949238 122 58 C 122 56.34314575050762 123.34314575050762 55 125 55 C 126.65685424949238 55 128 56.34314575050762 128 58 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 128 58 C 128 59.65685424949238 126.65685424949238 61 125 61 C 123.34314575050762 61 122 59.65685424949238 122 58 C 122 56.34314575050762 123.34314575050762 55 125 55 C 126.65685424949238 55 128 56.34314575050762 128 58 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 131.359375 44.21875 L 131.359375 47.515625 L 132.84375 47.515625 Q 133.671875 47.515625 134.125 47.09375 Q 134.578125 46.65625 134.578125 45.859375 Q 134.578125 45.078125 134.125 44.65625 Q 133.671875 44.21875 132.84375 44.21875 L 131.359375 44.21875 z M 130.171875 43.25 L 132.84375 43.25 Q 134.328125 43.25 135.078125 43.921875 Q 135.828125 44.578125 135.828125 45.859375 Q 135.828125 47.15625 135.078125 47.828125 Q 134.328125 48.484375 132.84375 48.484375 L 131.359375 48.484375 L 131.359375 52 L 130.171875 52 L 130.171875 43.25 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 64 143 C 64 144.65685424949237 62.65685424949238 146 61 146 C 59.34314575050762 146 58 144.65685424949237 58 143 C 58 141.34314575050763 59.34314575050762 140 61 140 C 62.65685424949238 140 64 141.34314575050763 64 143 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 64 143 C 64 144.65685424949237 62.65685424949238 146 61 146 C 59.34314575050762 146 58 144.65685424949237 58 143 C 58 141.34314575050763 59.34314575050762 140 61 140 C 62.65685424949238 140 64 141.34314575050763 64 143 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 72.734375 128.921875 L 72.734375 130.171875 Q 72.125 129.609375 71.453125 129.34375 Q 70.78125 129.0625 70.015625 129.0625 Q 68.515625 129.0625 67.71875 129.984375 Q 66.921875 130.90625 66.921875 132.640625 Q 66.921875 134.359375 67.71875 135.28125 Q 68.515625 136.203125 70.015625 136.203125 Q 70.78125 136.203125 71.453125 135.921875 Q 72.125 135.640625 72.734375 135.09375 L 72.734375 136.328125 Q 72.109375 136.75 71.40625 136.96875 Q 70.71875 137.171875 69.953125 137.171875 Q 67.953125 137.171875 66.8125 135.953125 Q 65.671875 134.734375 65.671875 132.640625 Q 65.671875 130.53125 66.8125 129.3125 Q 67.953125 128.09375 69.953125 128.09375 Q 70.734375 128.09375 71.421875 128.3125 Q 72.125 128.515625 72.734375 128.921875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 77.09765625 134.40625 L 77.09765625 135.15625 L 76.23828125 135.15625 Q 75.75390625 135.15625 75.56640625 135.359375 Q 75.37890625 135.546875 75.37890625 136.046875 L 75.37890625 136.53125 L 76.84765625 136.53125 L 76.84765625 137.234375 L 75.37890625 137.234375 L 75.37890625 142 L 74.47265625 142 L 74.47265625 137.234375 L 73.61328125 137.234375 L 73.61328125 136.53125 L 74.47265625 136.53125 L 74.47265625 136.15625 Q 74.47265625 135.234375 74.89453125 134.828125 Q 75.31640625 134.40625 76.23828125 134.40625 L 77.09765625 134.40625 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 93 105 C 93 106.65685424949238 91.65685424949238 108 90 108 C 88.34314575050762 108 87 106.65685424949238 87 105 C 87 103.34314575050762 88.34314575050762 102 90 102 C 91.65685424949238 102 93 103.34314575050762 93 105 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 93 105 C 93 106.65685424949238 91.65685424949238 108 90 108 C 88.34314575050762 108 87 106.65685424949238 87 105 C 87 103.34314575050762 88.34314575050762 102 90 102 C 91.65685424949238 102 93 103.34314575050762 93 105 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 96.359375 91.21875 L 96.359375 94.515625 L 97.84375 94.515625 Q 98.671875 94.515625 99.125 94.09375 Q 99.578125 93.65625 99.578125 92.859375 Q 99.578125 92.078125 99.125 91.65625 Q 98.671875 91.21875 97.84375 91.21875 L 96.359375 91.21875 z M 95.171875 90.25 L 97.84375 90.25 Q 99.328125 90.25 100.078125 90.921875 Q 100.828125 91.578125 100.828125 92.859375 Q 100.828125 94.15625 100.078125 94.828125 Q 99.328125 95.484375 97.84375 95.484375 L 96.359375 95.484375 L 96.359375 99 L 95.171875 99 L 95.171875 90.25 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 102.470703125 103.171875 L 104.095703125 103.171875 L 104.095703125 97.609375 L 102.330078125 97.953125 L 102.330078125 97.0625 L 104.080078125 96.703125 L 105.064453125 96.703125 L 105.064453125 103.171875 L 106.673828125 103.171875 L 106.673828125 104 L 102.470703125 104 L 102.470703125 103.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
</g><!-- layer0 -->
</g> <!-- default stroke -->
</svg> <!-- bounding box -->

Before

Width:  |  Height:  |  Size: 23 KiB

View File

@ -1,253 +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="337px"
height="327px"
viewBox="0 0 337 327"
>
<title></title>
<desc>Creator: FreeHEP Graphics2D Driver Producer: geogebra.export.SVGExtensions Revision: 12753 Source: Date: Friday, December 22, 2017 4:23:26 PM EST</desc>
<g stroke-linejoin="miter" stroke-dashoffset="0" stroke-dasharray="none" stroke-width="1" stroke-miterlimit="10" stroke-linecap="square">
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#ffffff">
<path d="M 0 0 L 265 0 L 265 257 L 0 257 L 0 0 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 69.171875 149.359375 Q 68.421875 149.359375 68.03125 150.109375 Q 67.65625 150.859375 67.65625 152.359375 Q 67.65625 153.859375 68.03125 154.609375 Q 68.421875 155.359375 69.171875 155.359375 Q 69.953125 155.359375 70.328125 154.609375 Q 70.71875 153.859375 70.71875 152.359375 Q 70.71875 150.859375 70.328125 150.109375 Q 69.953125 149.359375 69.171875 149.359375 z M 69.171875 148.578125 Q 70.40625 148.578125 71.046875 149.546875 Q 71.703125 150.515625 71.703125 152.359375 Q 71.703125 154.203125 71.046875 155.171875 Q 70.40625 156.140625 69.171875 156.140625 Q 67.953125 156.140625 67.296875 155.171875 Q 66.65625 154.203125 66.65625 152.359375 Q 66.65625 150.515625 67.296875 149.546875 Q 67.953125 148.578125 69.171875 148.578125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 60.78662485303139 142.82509847769097 L 60.78662485303139 146.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 148.234375 155.171875 L 149.859375 155.171875 L 149.859375 149.609375 L 148.09375 149.953125 L 148.09375 149.0625 L 149.84375 148.703125 L 150.828125 148.703125 L 150.828125 155.171875 L 152.4375 155.171875 L 152.4375 156 L 148.234375 156 L 148.234375 155.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 149.83505704565925 142.82509847769097 L 149.83505704565925 146.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 237.921875 155.171875 L 241.359375 155.171875 L 241.359375 156 L 236.734375 156 L 236.734375 155.171875 Q 237.296875 154.59375 238.265625 153.609375 Q 239.234375 152.625 239.484375 152.34375 Q 239.953125 151.8125 240.140625 151.453125 Q 240.328125 151.078125 240.328125 150.71875 Q 240.328125 150.140625 239.921875 149.78125 Q 239.515625 149.40625 238.859375 149.40625 Q 238.390625 149.40625 237.875 149.578125 Q 237.375 149.734375 236.78125 150.0625 L 236.78125 149.0625 Q 237.375 148.828125 237.890625 148.703125 Q 238.40625 148.578125 238.84375 148.578125 Q 239.96875 148.578125 240.640625 149.140625 Q 241.328125 149.703125 241.328125 150.65625 Q 241.328125 151.109375 241.15625 151.515625 Q 240.984375 151.90625 240.546875 152.453125 Q 240.421875 152.59375 239.765625 153.28125 Q 239.109375 153.953125 237.921875 155.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 238.88348923828713 142.82509847769097 L 238.88348923828713 146.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 0 142.82509847769097 L 263 142.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 264 143.32509847769097 L 261 139.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 264 142.32509847769097 L 261 145.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 44.484375 231.859375 L 47.125 231.859375 L 47.125 232.65625 L 44.484375 232.65625 L 44.484375 231.859375 z M 48.8427734375 234.171875 L 50.4677734375 234.171875 L 50.4677734375 228.609375 L 48.7021484375 228.953125 L 48.7021484375 228.0625 L 50.4521484375 227.703125 L 51.4365234375 227.703125 L 51.4365234375 234.171875 L 53.0458984375 234.171875 L 53.0458984375 235 L 48.8427734375 235 L 48.8427734375 234.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 56.78662485303139 231.87353067031938 L 60.78662485303139 231.87353067031938"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 51.171875 133.359375 Q 50.421875 133.359375 50.03125 134.109375 Q 49.65625 134.859375 49.65625 136.359375 Q 49.65625 137.859375 50.03125 138.609375 Q 50.421875 139.359375 51.171875 139.359375 Q 51.953125 139.359375 52.328125 138.609375 Q 52.71875 137.859375 52.71875 136.359375 Q 52.71875 134.859375 52.328125 134.109375 Q 51.953125 133.359375 51.171875 133.359375 z M 51.171875 132.578125 Q 52.40625 132.578125 53.046875 133.546875 Q 53.703125 134.515625 53.703125 136.359375 Q 53.703125 138.203125 53.046875 139.171875 Q 52.40625 140.140625 51.171875 140.140625 Q 49.953125 140.140625 49.296875 139.171875 Q 48.65625 138.203125 48.65625 136.359375 Q 48.65625 134.515625 49.296875 133.546875 Q 49.953125 132.578125 51.171875 132.578125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 56.78662485303139 142.82509847769097 L 60.78662485303139 142.82509847769097"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 49.234375 56.171875 L 50.859375 56.171875 L 50.859375 50.609375 L 49.09375 50.953125 L 49.09375 50.0625 L 50.84375 49.703125 L 51.828125 49.703125 L 51.828125 56.171875 L 53.4375 56.171875 L 53.4375 57 L 49.234375 57 L 49.234375 56.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 56.78662485303139 53.776666285062575 L 60.78662485303139 53.776666285062575"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 60.78662485303139 2 L 60.78662485303139 257"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 61.28662485303139 1 L 57.78662485303139 4"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 60.28662485303139 1 L 63.78662485303139 4"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g id="misc">
</g><!-- misc -->
<g id="layer0">
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 221.07380279976155 142.82509847769097 C 221.07380279976155 182.16917135475506 189.17912992272312 214.0638442317937 149.83505704565925 214.0638442317937 C 110.49098416859538 214.0638442317937 78.59631129155696 182.16917135475506 78.59631129155696 142.82509847769097 C 78.59631129155696 103.48102560062685 110.49098416859538 71.58635272358825 149.83505704565925 71.58635272358825 C 189.17912992272312 71.58635272358825 221.07380279976155 103.48102560062685 221.07380279976155 142.82509847769097 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 33 22 L 133 22"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 52 22 C 52 23.65685424949238 50.65685424949238 25 49 25 C 47.34314575050762 25 46 23.65685424949238 46 22 C 46 20.34314575050762 47.34314575050762 19 49 19 C 50.65685424949238 19 52 20.34314575050762 52 22 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 52 22 C 52 23.65685424949238 50.65685424949238 25 49 25 C 47.34314575050762 25 46 23.65685424949238 46 22 C 46 20.34314575050762 47.34314575050762 19 49 19 C 50.65685424949238 19 52 20.34314575050762 52 22 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 11.9375 33.4375 Q 11.75 33.34375 11.53125 33.296875 Q 11.328125 33.234375 11.0625 33.234375 Q 10.15625 33.234375 9.65625 33.828125 Q 9.171875 34.421875 9.171875 35.546875 L 9.171875 39 L 8.09375 39 L 8.09375 32.4375 L 9.171875 32.4375 L 9.171875 33.453125 Q 9.515625 32.859375 10.0625 32.578125 Q 10.609375 32.28125 11.390625 32.28125 Q 11.5 32.28125 11.625 32.296875 Q 11.765625 32.3125 11.921875 32.34375 L 11.9375 33.4375 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 13.16796875 43.171875 L 14.79296875 43.171875 L 14.79296875 37.609375 L 13.02734375 37.953125 L 13.02734375 37.0625 L 14.77734375 36.703125 L 15.76171875 36.703125 L 15.76171875 43.171875 L 17.37109375 43.171875 L 17.37109375 44 L 13.16796875 44 L 13.16796875 43.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 23.3759765625 33.546875 L 30.8916015625 33.546875 L 30.8916015625 34.53125 L 23.3759765625 34.53125 L 23.3759765625 33.546875 z M 23.3759765625 35.9375 L 30.8916015625 35.9375 L 30.8916015625 36.9375 L 23.3759765625 36.9375 L 23.3759765625 35.9375 z M 39.7919921875 31.03125 Q 38.8857421875 31.03125 38.4169921875 31.9375 Q 37.9638671875 32.828125 37.9638671875 34.640625 Q 37.9638671875 36.4375 38.4169921875 37.34375 Q 38.8857421875 38.234375 39.7919921875 38.234375 Q 40.7138671875 38.234375 41.1669921875 37.34375 Q 41.6357421875 36.4375 41.6357421875 34.640625 Q 41.6357421875 32.828125 41.1669921875 31.9375 Q 40.7138671875 31.03125 39.7919921875 31.03125 z M 39.7919921875 30.09375 Q 41.2607421875 30.09375 42.0419921875 31.265625 Q 42.8232421875 32.421875 42.8232421875 34.640625 Q 42.8232421875 36.84375 42.0419921875 38.015625 Q 41.2607421875 39.171875 39.7919921875 39.171875 Q 38.3232421875 39.171875 37.5419921875 38.015625 Q 36.7763671875 36.84375 36.7763671875 34.640625 Q 36.7763671875 32.421875 37.5419921875 31.265625 Q 38.3232421875 30.09375 39.7919921875 30.09375 z M 44.8955078125 37.515625 L 46.1298828125 37.515625 L 46.1298828125 39 L 44.8955078125 39 L 44.8955078125 37.515625 z M 51.2412109375 34.84375 Q 50.3974609375 34.84375 49.9130859375 35.296875 Q 49.4287109375 35.75 49.4287109375 36.53125 Q 49.4287109375 37.328125 49.9130859375 37.78125 Q 50.3974609375 38.234375 51.2412109375 38.234375 Q 52.0849609375 38.234375 52.5693359375 37.78125 Q 53.0537109375 37.328125 53.0537109375 36.53125 Q 53.0537109375 35.75 52.5693359375 35.296875 Q 52.1005859375 34.84375 51.2412109375 34.84375 z M 50.0537109375 34.34375 Q 49.3037109375 34.15625 48.8662109375 33.640625 Q 48.4443359375 33.109375 48.4443359375 32.359375 Q 48.4443359375 31.3125 49.1943359375 30.703125 Q 49.9443359375 30.09375 51.2412109375 30.09375 Q 52.5537109375 30.09375 53.2880859375 30.703125 Q 54.0380859375 31.3125 54.0380859375 32.359375 Q 54.0380859375 33.109375 53.6162109375 33.640625 Q 53.1943359375 34.15625 52.4287109375 34.34375 Q 53.2880859375 34.546875 53.7568359375 35.125 Q 54.2412109375 35.703125 54.2412109375 36.53125 Q 54.2412109375 37.8125 53.4599609375 38.5 Q 52.6943359375 39.171875 51.2412109375 39.171875 Q 49.8037109375 39.171875 49.0224609375 38.5 Q 48.2412109375 37.8125 48.2412109375 36.53125 Q 48.2412109375 35.703125 48.7255859375 35.125 Q 49.2099609375 34.546875 50.0537109375 34.34375 z M 49.6318359375 32.46875 Q 49.6318359375 33.15625 50.0537109375 33.53125 Q 50.4755859375 33.90625 51.2412109375 33.90625 Q 52.0068359375 33.90625 52.4287109375 33.53125 Q 52.8662109375 33.15625 52.8662109375 32.46875 Q 52.8662109375 31.796875 52.4287109375 31.421875 Q 52.0068359375 31.03125 51.2412109375 31.03125 Q 50.4755859375 31.03125 50.0537109375 31.421875 Q 49.6318359375 31.796875 49.6318359375 32.46875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 60.78662485303139 142.82509847769097 L 265 -42.99129391401277"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 153 143 C 153 144.65685424949237 151.65685424949237 146 150 146 C 148.34314575050763 146 147 144.65685424949237 147 143 C 147 141.34314575050763 148.34314575050763 140 150 140 C 151.65685424949237 140 153 141.34314575050763 153 143 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 153 143 C 153 144.65685424949237 151.65685424949237 146 150 146 C 148.34314575050763 146 147 144.65685424949237 147 143 C 147 141.34314575050763 148.34314575050763 140 150 140 C 151.65685424949237 140 153 141.34314575050763 153 143 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 161.734375 128.921875 L 161.734375 130.171875 Q 161.125 129.609375 160.453125 129.34375 Q 159.78125 129.0625 159.015625 129.0625 Q 157.515625 129.0625 156.71875 129.984375 Q 155.921875 130.90625 155.921875 132.640625 Q 155.921875 134.359375 156.71875 135.28125 Q 157.515625 136.203125 159.015625 136.203125 Q 159.78125 136.203125 160.453125 135.921875 Q 161.125 135.640625 161.734375 135.09375 L 161.734375 136.328125 Q 161.109375 136.75 160.40625 136.96875 Q 159.71875 137.171875 158.953125 137.171875 Q 156.953125 137.171875 155.8125 135.953125 Q 154.671875 134.734375 154.671875 132.640625 Q 154.671875 130.53125 155.8125 129.3125 Q 156.953125 128.09375 158.953125 128.09375 Q 159.734375 128.09375 160.421875 128.3125 Q 161.125 128.515625 161.734375 128.921875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 163.61328125 141.171875 L 165.23828125 141.171875 L 165.23828125 135.609375 L 163.47265625 135.953125 L 163.47265625 135.0625 L 165.22265625 134.703125 L 166.20703125 134.703125 L 166.20703125 141.171875 L 167.81640625 141.171875 L 167.81640625 142 L 163.61328125 142 L 163.61328125 141.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 168 48 C 168 49.65685424949238 166.65685424949237 51 165 51 C 163.34314575050763 51 162 49.65685424949238 162 48 C 162 46.34314575050762 163.34314575050763 45 165 45 C 166.65685424949237 45 168 46.34314575050762 168 48 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 168 48 C 168 49.65685424949238 166.65685424949237 51 165 51 C 163.34314575050763 51 162 49.65685424949238 162 48 C 162 46.34314575050762 163.34314575050763 45 165 45 C 166.65685424949237 45 168 46.34314575050762 168 48 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 171.359375 34.21875 L 171.359375 37.515625 L 172.84375 37.515625 Q 173.671875 37.515625 174.125 37.09375 Q 174.578125 36.65625 174.578125 35.859375 Q 174.578125 35.078125 174.125 34.65625 Q 173.671875 34.21875 172.84375 34.21875 L 171.359375 34.21875 z M 170.171875 33.25 L 172.84375 33.25 Q 174.328125 33.25 175.078125 33.921875 Q 175.828125 34.578125 175.828125 35.859375 Q 175.828125 37.15625 175.078125 37.828125 Q 174.328125 38.484375 172.84375 38.484375 L 171.359375 38.484375 L 171.359375 42 L 170.171875 42 L 170.171875 33.25 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 64 143 C 64 144.65685424949237 62.65685424949238 146 61 146 C 59.34314575050762 146 58 144.65685424949237 58 143 C 58 141.34314575050763 59.34314575050762 140 61 140 C 62.65685424949238 140 64 141.34314575050763 64 143 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 64 143 C 64 144.65685424949237 62.65685424949238 146 61 146 C 59.34314575050762 146 58 144.65685424949237 58 143 C 58 141.34314575050763 59.34314575050762 140 61 140 C 62.65685424949238 140 64 141.34314575050763 64 143 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 72.734375 128.921875 L 72.734375 130.171875 Q 72.125 129.609375 71.453125 129.34375 Q 70.78125 129.0625 70.015625 129.0625 Q 68.515625 129.0625 67.71875 129.984375 Q 66.921875 130.90625 66.921875 132.640625 Q 66.921875 134.359375 67.71875 135.28125 Q 68.515625 136.203125 70.015625 136.203125 Q 70.78125 136.203125 71.453125 135.921875 Q 72.125 135.640625 72.734375 135.09375 L 72.734375 136.328125 Q 72.109375 136.75 71.40625 136.96875 Q 70.71875 137.171875 69.953125 137.171875 Q 67.953125 137.171875 66.8125 135.953125 Q 65.671875 134.734375 65.671875 132.640625 Q 65.671875 130.53125 66.8125 129.3125 Q 67.953125 128.09375 69.953125 128.09375 Q 70.734375 128.09375 71.421875 128.3125 Q 72.125 128.515625 72.734375 128.921875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 77.09765625 134.40625 L 77.09765625 135.15625 L 76.23828125 135.15625 Q 75.75390625 135.15625 75.56640625 135.359375 Q 75.37890625 135.546875 75.37890625 136.046875 L 75.37890625 136.53125 L 76.84765625 136.53125 L 76.84765625 137.234375 L 75.37890625 137.234375 L 75.37890625 142 L 74.47265625 142 L 74.47265625 137.234375 L 73.61328125 137.234375 L 73.61328125 136.53125 L 74.47265625 136.53125 L 74.47265625 136.15625 Q 74.47265625 135.234375 74.89453125 134.828125 Q 75.31640625 134.40625 76.23828125 134.40625 L 77.09765625 134.40625 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 141 73 C 141 74.65685424949238 139.65685424949237 76 138 76 C 136.34314575050763 76 135 74.65685424949238 135 73 C 135 71.34314575050762 136.34314575050763 70 138 70 C 139.65685424949237 70 141 71.34314575050762 141 73 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 141 73 C 141 74.65685424949238 139.65685424949237 76 138 76 C 136.34314575050763 76 135 74.65685424949238 135 73 C 135 71.34314575050762 136.34314575050763 70 138 70 C 139.65685424949237 70 141 71.34314575050762 141 73 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 144.359375 59.21875 L 144.359375 62.515625 L 145.84375 62.515625 Q 146.671875 62.515625 147.125 62.09375 Q 147.578125 61.65625 147.578125 60.859375 Q 147.578125 60.078125 147.125 59.65625 Q 146.671875 59.21875 145.84375 59.21875 L 144.359375 59.21875 z M 143.171875 58.25 L 145.84375 58.25 Q 147.328125 58.25 148.078125 58.921875 Q 148.828125 59.578125 148.828125 60.859375 Q 148.828125 62.15625 148.078125 62.828125 Q 147.328125 63.484375 145.84375 63.484375 L 144.359375 63.484375 L 144.359375 67 L 143.171875 67 L 143.171875 58.25 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 150.470703125 71.171875 L 152.095703125 71.171875 L 152.095703125 65.609375 L 150.330078125 65.953125 L 150.330078125 65.0625 L 152.080078125 64.703125 L 153.064453125 64.703125 L 153.064453125 71.171875 L 154.673828125 71.171875 L 154.673828125 72 L 150.470703125 72 L 150.470703125 71.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 84 124 C 84 125.65685424949238 82.65685424949238 127 81 127 C 79.34314575050762 127 78 125.65685424949238 78 124 C 78 122.34314575050762 79.34314575050762 121 81 121 C 82.65685424949238 121 84 122.34314575050762 84 124 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 84 124 C 84 125.65685424949238 82.65685424949238 127 81 127 C 79.34314575050762 127 78 125.65685424949238 78 124 C 78 122.34314575050762 79.34314575050762 121 81 121 C 82.65685424949238 121 84 122.34314575050762 84 124 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 87.359375 110.21875 L 87.359375 113.515625 L 88.84375 113.515625 Q 89.671875 113.515625 90.125 113.09375 Q 90.578125 112.65625 90.578125 111.859375 Q 90.578125 111.078125 90.125 110.65625 Q 89.671875 110.21875 88.84375 110.21875 L 87.359375 110.21875 z M 86.171875 109.25 L 88.84375 109.25 Q 90.328125 109.25 91.078125 109.921875 Q 91.828125 110.578125 91.828125 111.859375 Q 91.828125 113.15625 91.078125 113.828125 Q 90.328125 114.484375 88.84375 114.484375 L 87.359375 114.484375 L 87.359375 118 L 86.171875 118 L 86.171875 109.25 z M 94.595703125 110.21875 L 94.595703125 113.515625 L 96.080078125 113.515625 Q 96.908203125 113.515625 97.361328125 113.09375 Q 97.814453125 112.65625 97.814453125 111.859375 Q 97.814453125 111.078125 97.361328125 110.65625 Q 96.908203125 110.21875 96.080078125 110.21875 L 94.595703125 110.21875 z M 93.408203125 109.25 L 96.080078125 109.25 Q 97.564453125 109.25 98.314453125 109.921875 Q 99.064453125 110.578125 99.064453125 111.859375 Q 99.064453125 113.15625 98.314453125 113.828125 Q 97.564453125 114.484375 96.080078125 114.484375 L 94.595703125 114.484375 L 94.595703125 118 L 93.408203125 118 L 93.408203125 109.25 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 100.70703125 122.171875 L 102.33203125 122.171875 L 102.33203125 116.609375 L 100.56640625 116.953125 L 100.56640625 116.0625 L 102.31640625 115.703125 L 103.30078125 115.703125 L 103.30078125 122.171875 L 104.91015625 122.171875 L 104.91015625 123 L 100.70703125 123 L 100.70703125 122.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
</g><!-- layer0 -->
</g> <!-- default stroke -->
</svg> <!-- bounding box -->

Before

Width:  |  Height:  |  Size: 26 KiB

View File

@ -1,324 +0,0 @@
Two-point Conical Gradient
====
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
tex2jax: {
inlineMath: [['$','$'], ['\\(','\\)']]
}
});
</script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js?config=TeX-MML-AM_CHTML'></script>
(Please refresh the page if you see a lot of dollars instead of math symbols.)
We present a fast shading algorithm (compared to bruteforcely solving the quadratic equation of
gradient $t$) for computing the two-point conical gradient (i.e., `createRadialGradient` in
[spec](https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-createradialgradient)).
It reduced the number of multiplications per pixel from ~10 down to 3, and brought a speedup of up to
26% in our nanobenches.
This document has 3 parts:
1. [Problem Statement and Setup](#problem-statement)
2. [Algorithm](#algorithm)
3. [Appendix](#appendix)
Part 1 and 2 are self-explanatory. Part 3 shows how to geometrically proves our Theorem 1 in part
2; it's more complicated but it gives us a nice picture about what's going on.
## <span id="problem-statement">Problem Statement and Setup</span>
Let two circles be $C_0, r_0$ and $C_1, r_1$ where $C$ is the center and $r$ is the radius. For any
point $P = (x, y)$ we want the shader to quickly compute a gradient $t \in \mathbb R$ such that $p$
is on the linearly interpolated circle with center $C_t = (1-t) \cdot C_0 + t \cdot C_1$ and radius
$r_t = (1-t) \cdot r_0 + t \cdot r_1 > 0$ (note that radius $r_t$ has to be *positive*). If
there are multiple (at most 2) solutions of $t$, choose the bigger one.
There are two degenerated cases:
1. $C_0 = C_1$ so the gradient is essentially a simple radial gradient.
2. $r_0 = r_1$ so the gradient is a single strip with bandwidth $2 r_0 = 2 r_1$.
<!-- TODO maybe add some fiddle or images here to illustrate the two degenerated cases -->
They are easy to handle so we won't cover them here. From now on, we assume $C_0 \neq C_1$ and $r_0
\neq r_1$.
As $r_0 \neq r_1$, we can find a focal point $C_f = (1-f) \cdot C_0 + f \cdot C_1$ where its
corresponding linearly interpolated radius $r_f = (1-f) \cdot r_0 + f \cdot r_1 = 0$.
Solving the latter equation gets us $f = r_0 / (r_0 - r_1)$.
As $C_0 \neq C_1$, focal point $C_f$ is different from $C_1$ unless $r_1 = 0$. If $r_1 = 0$, we can
swap $C_0, r_0$ with $C_1, r_1$, compute swapped gradient $t_s$ as if $r_1 \neq 0$, and finally set
$t = 1 - t_s$. The only catch here is that with multiple solutions of $t_s$, we shall choose the
smaller one (so $t$ could be the bigger one).
Assuming that we've done swapping if necessary so $C_1 \neq C_f$, we can then do a linear
transformation to map $C_f, C_1$ to $(0, 0), (1, 0)$. After the transformation:
1. All centers $C_t = (x_t, 0)$ must be on the $x$ axis
2. The radius $r_t$ is $x_t r_1$.
3. Given $x_t$ , we can derive $t = f + (1 - f) x_t$
From now on, we'll focus on how to quickly computes $x_t$. Note that $r_t > 0$ so we're only
interested positive solution $x_t$. Again, if there are multiple $x_t$ solutions, we may want to
find the bigger one if $1 - f > 0$, and smaller one if $1 - f < 0$, so the corresponding $t$ is
always the bigger one (note that $f \neq 1$, otherwise we'll swap $C_0, r_0$ with $C_1, r_1$).
## <span id="algorithm">Algorithm</span>
**Theorem 1.** The solution to $x_t$ is
1. $\frac{x^2 + y^2}{(1 + r_1) x} = \frac{x^2 + y^2}{2 x}$ if $r_1 = 1$
2. $\left(\sqrt{(r_1^2 - 1) y ^2 + r_1^2 x^2} - x\right) / (r_1^2 - 1)$ if $r_1 > 1$
3. $\left(\pm \sqrt{(r_1^2 - 1) y ^2 + r_1^2 x^2} - x\right) / (r_1^2 - 1)$ if $r_1 < 1$.
Case 2 always produces a valid $x_t$. Case 1 and 3 requires $x > 0$ to produce valid $x_t > 0$. Case
3 may have no solution at all if $(r_1^2 - 1) y^2 + r_1^2 x^2 < 0$.
*Proof.* Algebriacally, solving the quadratic equation $(x_t - x)^2 + y^2 = (x_t r_1)^2$ and
eliminate negative $x_t$ solutions get us the theorem.
Alternatively, we can also combine Corollary 2., 3., and Lemma 4. in the Appendix to geometrically
prove the theorem. $\square$
Theorem 1 by itself is not sufficient for our shader algorithm because:
1. we still need to compute $t$ from $x_t$ (remember that $t = f + (1-f) x_t$);
2. we still need to handle cases of choosing the bigger/smaller $x_t$;
3. we still need to handle the swapped case (we swap $C_0, r_0$ with $C_1, r_1$ if $r_1 = 0$);
4. there are way too many multiplications and divisions in Theorem 1 that would slow our shader.
Issue 2 and 3 are solved by generating different shader code based on different situations. So they
are mainly correctness issues rather than performance issues. Issue 1 and 4 are performance
critical, and they will affect how we handle issue 2 and 3.
The key to handle 1 and 4 efficiently is to fold as many multiplications and divisions into the
linear transformation matrix, which the shader has to do anyway (remember our linear transformation
to map $C_f, C_1$ to $(0, 0), (1, 0)$).
For example, let $\hat x, \hat y = |1-f|x, |1-f|y$. Computing $\hat x_t$ with respect to $\hat x,
\hat y$ allow us to have $t = f + (1 - f)x_t = f + \text{sign}(1-f) \cdot \hat x_t$. That saves us
one multiplication. Applying similar techniques to Theorem 1 gets us:
1. If $r_1 = 1$, let $x' = x/2,~ y' = y/2$, then $x_t = (x'^2 + y'^2) / x'$.
2. If $r_1 > 1$, let $x' = r_1 / (r_1^2 - 1) x,~ y' = \frac{\sqrt{r_1^2 - 1}}{r_1^2 - 1} y$, then
$x_t = \sqrt{x'^2 + y'^2} - x' / r_1$
3. If $r_1 < 1$, let $x' = r_1 / (r_1^2 - 1) x,~ y' = \frac{\sqrt{1 - r_1^2}}{r_1^2 - 1} y$, then
$x_t = \pm\sqrt{x'^2 - y'^2} - x' / r_1$
Combining it with the swapping, the equation $t = f + (1-f) x_t$, and the fact that we only want
positive $x_t > 0$ and bigger $t$, we have our final algorithm:
**Algorithm 1.**
1. Let $C'_0, r'_0, C'_1, r'_1 = C_0, r_0, C_1, r_1$ if there is no swapping and $C'_0,
r'_0, C'_1, r'_1 = C_1, r_1, C_0, r_0$ if there is swapping.
2. Let $f = r'_0 / (r'_0 - r'_1)$ and $1 - f = r'_1 / (r'_1 - r'_0)$
3. Let $x' = x/2,~ y' = y/2$ if $r_1 = 1$, and
$x' = r_1 / (r_1^2 - 1) x,~ y' = \sqrt{|r_1^2 - 1|} / (r_1^2 - 1) y$ if $r_1 \neq 1$
4. Let $\hat x = |1 - f|x', \hat y = |1 - f|y'$
5. If $r_1 = 1$, let $\hat x_t = (\hat x^2 + \hat y^2) / \hat x$
6. If $r_1 > 1$,
let $\hat x_t = \sqrt{\hat x^2 + \hat y^2} - \hat x / r_1$
7. If $r_1 < 1$
1. return invalid if $\hat x^2 - \hat y^2 < 0$
2. let $\hat x_t = -\sqrt{\hat x^2 - \hat y^2} - \hat x / r_1$ if we've swapped $r_0, r_1$,
or if $1 - f < 0$
3. let $\hat x_t = \sqrt{\hat x^2 - \hat y^2} - \hat x / r_1$ otherwise
8. $t$ is invalid if $\hat x_t < 0$ (this check is unnecessary if $r_1 > 1$)
9. Let $t = f + \text{sign}(1 - f) \hat x_t$
10. If swapped, let $t = 1 - t$
In step 7, we try to select either the smaller or bigger $\hat x_t$ based on whether the final $t$
has a negative or positive relationship with $\hat x_t$. It's negative if we've swapped, or if
$\text{sign}(1 - f)$ is negative (these two cannot both happen).
Note that all the computations and if decisions not involving $\hat x, \hat y$ can be precomputed
before the shading stage. The two if decisions $\hat x^2 - \hat y^2 < 0$ and $\hat x^t < 0$ can
also be omitted by precomputing the shading area that never violates those conditions.
The number of operations per shading is thus:
* 1 addition, 2 multiplications, and 1 division if $r_1 = 1$
* 2 additions, 3 multiplications, and 1 sqrt for $r_1 \neq 1$ (count substraction as addition;
dividing $r_1$ is multiplying $1/r_1$)
* 1 more addition operation if $f \neq 0$
* 1 more addition operation if swapped.
In comparison, for $r_1 \neq 1$ case, our current raster pipeline shading algorithm (which shall
hopefully soon be upgraded to the algorithm described here) mainly uses formula $$t = 0.5 \cdot
(1/a) \cdot \left(-b \pm \sqrt{b^2 - 4ac}\right)$$ It precomputes $a = 1 - (r_1 - r_0)^2, 1/a, r1 -
r0$. Number $b = -2 \cdot (x + (r1 - r0) \cdot r0)$ costs 2 multiplications and 1 addition. Number
$c = x^2 + y^2 - r_0^2$ costs 3 multiplications and 2 additions. And the final $t$ costs 5 more
multiplications, 1 more sqrt, and 2 more additions. That's a total of 5 additions, 10
multiplications, and 1 sqrt. (Our algorithm has 2-4 additions, 3 multiplications, and 1 sqrt.) Even
if it saves the $0.5 \cdot (1/a), 4a, r_0^2$ and $(r_1 - r_0) r_0$ multiplications, there are still
6 multiplications. Moreover, it sends in 4 unitofmrs to the shader while our algorithm only needs 2
uniforms ($1/r_1$ and $f$).
## <span id="appendix">Appendix</span>
**Lemma 1.** Draw a ray from $C_f = (0, 0)$ to $P = (x, y)$. For every
intersection points $P_1$ between that ray and circle $C_1 = (1, 0), r_1$, there exists an $x_t$
that equals to the length of segment $C_f P$ over length of segment $C_f P_1$. That is,
$x_t = || C_f P || / ||C_f P_1||$
*Proof.* Draw a line from $P$ that's parallel to $C_1 P_1$. Let it intersect with $x$-axis on point
$C = (x', y')$.
<img src="conical/lemma1.svg"/>
Triangle $\triangle C_f C P$ is similar to triangle $\triangle C_f C_1 P_1$.
Therefore $||P C|| = ||P_1 C_1|| \cdot (||C_f C|| / ||C_f C_1||) = r_1 x'$. Thus $x'$ is a solution
to $x_t$. Because triangle $\triangle C_f C P$ and triangle $\triangle C_f C_1 P_1$ are similar, $x'
= ||C_f C_1|| \cdot (||C_f P|| / ||C_f P_1||) = ||C_f P|| / ||C_f P_1||$. $\square$
**Lemma 2.** For every solution $x_t$, if we extend/shrink segment $C_f P$ to $C_f P_1$ with ratio
$1 / x_t$ (i.e., find $P_1$ on ray $C_f P$ such that $||C_f P_1|| / ||C_f P|| = 1 / x_t$), then
$P_1$ must be on circle $C_1, r_1$.
*Proof.* Let $C_t = (x_t, 0)$. Triangle $\triangle C_f C_t P$ is similar to $C_f C_1 P_1$. Therefore
$||C_1 P_1|| = r_1$ and $P_1$ is on circle $C_1, r_1$. $\square$
**Corollary 1.** By lemma 1. and 2., we conclude that the number of solutions $x_t$ is equal to the
number of intersections between ray $C_f P$ and circle $C_1, r_1$. Therefore
* when $r_1 > 1$, there's always one unique intersection/solution; we call this "well-behaved"; this
was previously known as the "inside" case;
* when $r_1 = 1$, there's either one or zero intersection/solution (excluding $C_f$ which is always
on the circle); we call this "focal-on-circle"; this was previously known as the "edge" case;
<img src="conical/corollary2.2.1.svg"/>
<img src="conical/corollary2.2.2.svg"/>
* when $r_1 < 1$, there may be $0, 1$, or $2$ solutions; this was also previously as the "outside"
case.
<img src="conical/corollary2.3.1.svg" width="30%"/>
<img src="conical/corollary2.3.2.svg" width="30%"/>
<img src="conical/corollary2.3.3.svg" width="30%"/>
**Lemma 3.** When solution exists, one such solution is
$$
x_t = {|| C_f P || \over ||C_f P_1||} = \frac{x^2 + y^2}{x + \sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2}}
$$
*Proof.* As $C_f = (0, 0), P = (x, y)$, we have $||C_f P|| = \sqrt(x^2 + y^2)$. So we'll mainly
focus on how to compute $||C_f P_1||$.
**When $x \geq 0$:**
<img src="conical/lemma3.1.svg"/>
Let $X_P = (x, 0)$ and $H$ be a point on $C_f P_1$ such that $C_1 H$ is perpendicular to $C_1
P_1$. Triangle $\triangle C_1 H C_f$ is similar to triangle $\triangle P X_P C_f$. Thus
$$||C_f H|| = ||C_f C_1|| \cdot (||C_f X_P|| / ||C_f P||) = x / \sqrt{x^2 + y^2}$$
$$||C_1 H|| = ||C_f C_1|| \cdot (||P X_P|| / ||C_f P||) = y / \sqrt{x^2 + y^2}$$
Triangle $\triangle C_1 H P_1$ is a right triangle with hypotenuse $r_1$. Hence
$$ ||H P_1|| = \sqrt{r_1^2 - ||C_1 H||^2} = \sqrt{r_1^2 - y^2 / (x^2 + y^2)} $$
We have
\begin{align}
||C_f P_1|| &= ||C_f H|| + ||H P_1|| \\\\\\
&= x / \sqrt{x^2 + y^2} + \sqrt{r_1^2 - y^2 / (x^2 + y^2)} \\\\\\
&= \frac{x + \sqrt{r_1^2 (x^2 + y^2) - y^2}}{\sqrt{x^2 + y^2}} \\\\\\
&= \frac{x + \sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2}}{\sqrt{x^2 + y^2}}
\end{align}
**When $x < 0$:**
Define $X_P$ and $H$ similarly as before except that now $H$ is on ray $P_1 C_f$ instead of
$C_f P_1$.
<img src="conical/lemma3.2.svg"/>
As before, triangle $\triangle C_1 H C_f$ is similar to triangle $\triangle P X_P C_f$, and triangle
$\triangle C_1 H P_1$ is a right triangle, so we have
$$||C_f H|| = ||C_f C_1|| \cdot (||C_f X_P|| / ||C_f P||) = -x / \sqrt{x^2 + y^2}$$
$$||C_1 H|| = ||C_f C_1|| \cdot (||P X_P|| / ||C_f P||) = y / \sqrt{x^2 + y^2}$$
$$ ||H P_1|| = \sqrt{r_1^2 - ||C_1 H||^2} = \sqrt{r_1^2 - y^2 / (x^2 + y^2)} $$
Note that the only difference is changing $x$ to $-x$ because $x$ is negative.
Also note that now $||C_f P_1|| = -||C_f H|| + ||H P_1||$ and we have $-||C_f H||$ instead of
$||C_f H||$. That negation cancels out the negation of $-x$ so we get the same equation
of $||C_f P_1||$ for both $x \geq 0$ and $x < 0$ cases:
$$
||C_f P_1|| = \frac{x + \sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2}}{\sqrt{x^2 + y^2}}
$$
Finally
$$
x_t = \frac{||C_f P||}{||C_f P_1||} = \frac{\sqrt{x^2 + y^2}}{||C_f P_1||}
= \frac{x^2 + y^2}{x + \sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2}}
$$ $\square$
**Corollary 2.** If $r_1 = 1$, then the solution $x_t = \frac{x^2 + y^2}{(1 + r_1) x}$, and
it's valide (i.e., $x_t > 0$) iff $x > 0$.
*Proof.* Simply plug $r_1 = 1$ into the formula of Lemma 3. $\square$
**Corollary 3.** If $r_1 > 1$, then the unique solution is
$x_t = \left(\sqrt{(r_1^2 - 1) y ^2 + r_1^2 x^2} - x\right) / (r_1^2 - 1)$.
*Proof.* From Lemma 3., we have
\begin{align}
x_t &= \frac{x^2 + y^2}{x + \sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2}} \\\\\\
&= {
(x^2 + y^2) \left ( -x + \sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2} \right )
\over
\left (x + \sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2} \right )
\left (-x + \sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2} \right )
} \\\\\\
&= {
(x^2 + y^2) \left ( -x + \sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2} \right )
\over
-x^2 + (r_1^2 - 1) y^2 + r_1^2 x^2
} \\\\\\
&= {
(x^2 + y^2) \left ( -x + \sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2} \right )
\over
(r_1^2 - 1) (x^2 + y^2)
} \\\\\\
&= \left(\sqrt{(r_1^2 - 1) y ^2 + r_1^2 x^2} - x\right) / (r_1^2 - 1)
\end{align}
The transformation above (multiplying $-x + \sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2}$ to enumerator and
denomenator) is always valid because $r_1 > 1$ and it's the unique solution due to Corollary 1.
$\square$
**Lemma 4.** If $r_1 < 1$, then
1. there's no solution to $x_t$ if $(r_1^2 - 1) y^2 + r_1^2 x^2 < 0$
2. otherwise, the solutions are
$x_t = \left(\sqrt{(r_1^2 - 1) y ^2 + r_1^2 x^2} - x\right) / (r_1^2 - 1)$,
or
$x_t = \left(-\sqrt{(r_1^2 - 1) y ^2 + r_1^2 x^2} - x\right) / (r_1^2 - 1)$.
(Note that solution $x_t$ still has to be nonnegative to be valid; also note that
$x_t > 0 \Leftrightarrow x > 0$ if the solution exists.)
*Proof.* Case 1 follows naturally from Lemma 3. and Corollary 1.
<img src="conical/lemma4.svg"/>
For case 2, we notice that $||C_f P_1||$ could be
1. either $||C_f H|| + ||H P_1||$ or $||C_f H|| - ||H P_1||$ if $x \geq 0$,
2. either $-||C_f H|| + ||H P_1||$ or $-||C_f H|| - ||H P_1||$ if $x < 0$.
By analysis similar to Lemma 3., the solution to $x_t$ does not depend on the sign of $x$ and
they are either $\frac{x^2 + y^2}{x + \sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2}}$
or $\frac{x^2 + y^2}{x - \sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2}}$.
As $r_1 \neq 1$, we can apply the similar transformation in Corollary 3. to get the two
formula in the lemma.
$\square$

Binary file not shown.

View File

@ -1,298 +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="562px"
height="514px"
viewBox="0 0 562 514"
>
<title></title>
<desc>Creator: FreeHEP Graphics2D Driver Producer: geogebra.export.SVGExtensions Revision: 12753 Source: Date: Friday, December 22, 2017 3:02:35 PM EST</desc>
<g stroke-linejoin="miter" stroke-dashoffset="0" stroke-dasharray="none" stroke-width="1" stroke-miterlimit="10" stroke-linecap="square">
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#ffffff">
<path d="M 0 0 L 442 0 L 442 404 L 0 404 L 0 0 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 49.484375 212.859375 L 52.125 212.859375 L 52.125 213.65625 L 49.484375 213.65625 L 49.484375 212.859375 z M 53.8427734375 215.171875 L 55.4677734375 215.171875 L 55.4677734375 209.609375 L 53.7021484375 209.953125 L 53.7021484375 209.0625 L 55.4521484375 208.703125 L 56.4365234375 208.703125 L 56.4365234375 215.171875 L 58.0458984375 215.171875 L 58.0458984375 216 L 53.8427734375 216 L 53.8427734375 215.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 53.73819266040353 202.82509847769083 L 53.73819266040353 206.82509847769083"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 151.171875 209.359375 Q 150.421875 209.359375 150.03125 210.109375 Q 149.65625 210.859375 149.65625 212.359375 Q 149.65625 213.859375 150.03125 214.609375 Q 150.421875 215.359375 151.171875 215.359375 Q 151.953125 215.359375 152.328125 214.609375 Q 152.71875 213.859375 152.71875 212.359375 Q 152.71875 210.859375 152.328125 210.109375 Q 151.953125 209.359375 151.171875 209.359375 z M 151.171875 208.578125 Q 152.40625 208.578125 153.046875 209.546875 Q 153.703125 210.515625 153.703125 212.359375 Q 153.703125 214.203125 153.046875 215.171875 Q 152.40625 216.140625 151.171875 216.140625 Q 149.953125 216.140625 149.296875 215.171875 Q 148.65625 214.203125 148.65625 212.359375 Q 148.65625 210.515625 149.296875 209.546875 Q 149.953125 208.578125 151.171875 208.578125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 142.7866248530314 202.82509847769083 L 142.7866248530314 206.82509847769083"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 230.234375 215.171875 L 231.859375 215.171875 L 231.859375 209.609375 L 230.09375 209.953125 L 230.09375 209.0625 L 231.84375 208.703125 L 232.828125 208.703125 L 232.828125 215.171875 L 234.4375 215.171875 L 234.4375 216 L 230.234375 216 L 230.234375 215.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 231.8350570456593 202.82509847769083 L 231.8350570456593 206.82509847769083"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 319.921875 215.171875 L 323.359375 215.171875 L 323.359375 216 L 318.734375 216 L 318.734375 215.171875 Q 319.296875 214.59375 320.265625 213.609375 Q 321.234375 212.625 321.484375 212.34375 Q 321.953125 211.8125 322.140625 211.453125 Q 322.328125 211.078125 322.328125 210.71875 Q 322.328125 210.140625 321.921875 209.78125 Q 321.515625 209.40625 320.859375 209.40625 Q 320.390625 209.40625 319.875 209.578125 Q 319.375 209.734375 318.78125 210.0625 L 318.78125 209.0625 Q 319.375 208.828125 319.890625 208.703125 Q 320.40625 208.578125 320.84375 208.578125 Q 321.96875 208.578125 322.640625 209.140625 Q 323.328125 209.703125 323.328125 210.65625 Q 323.328125 211.109375 323.15625 211.515625 Q 322.984375 211.90625 322.546875 212.453125 Q 322.421875 212.59375 321.765625 213.28125 Q 321.109375 213.953125 319.921875 215.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 320.8834892382872 202.82509847769083 L 320.8834892382872 206.82509847769083"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 411.0625 212.0625 Q 411.765625 212.21875 412.15625 212.703125 Q 412.5625 213.171875 412.5625 213.875 Q 412.5625 214.953125 411.8125 215.546875 Q 411.078125 216.140625 409.703125 216.140625 Q 409.25 216.140625 408.765625 216.046875 Q 408.28125 215.953125 407.765625 215.78125 L 407.765625 214.828125 Q 408.171875 215.0625 408.65625 215.1875 Q 409.15625 215.3125 409.6875 215.3125 Q 410.609375 215.3125 411.09375 214.953125 Q 411.578125 214.578125 411.578125 213.875 Q 411.578125 213.234375 411.125 212.875 Q 410.671875 212.515625 409.875 212.515625 L 409.015625 212.515625 L 409.015625 211.703125 L 409.90625 211.703125 Q 410.640625 211.703125 411.015625 211.40625 Q 411.40625 211.109375 411.40625 210.5625 Q 411.40625 210.015625 411 209.71875 Q 410.609375 209.40625 409.875 209.40625 Q 409.46875 209.40625 409 209.5 Q 408.53125 209.578125 407.984375 209.765625 L 407.984375 208.890625 Q 408.546875 208.734375 409.03125 208.65625 Q 409.53125 208.578125 409.953125 208.578125 Q 411.078125 208.578125 411.734375 209.09375 Q 412.390625 209.59375 412.390625 210.46875 Q 412.390625 211.078125 412.046875 211.5 Q 411.703125 211.90625 411.0625 212.0625 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 409.9319214309151 202.82509847769083 L 409.9319214309151 206.82509847769083"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 0 202.82509847769083 L 440 202.82509847769083"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 441 203.32509847769083 L 438 199.82509847769083"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 441 202.32509847769083 L 438 205.82509847769083"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 126.484375 380.859375 L 129.125 380.859375 L 129.125 381.65625 L 126.484375 381.65625 L 126.484375 380.859375 z M 131.5302734375 383.171875 L 134.9677734375 383.171875 L 134.9677734375 384 L 130.3427734375 384 L 130.3427734375 383.171875 Q 130.9052734375 382.59375 131.8740234375 381.609375 Q 132.8427734375 380.625 133.0927734375 380.34375 Q 133.5615234375 379.8125 133.7490234375 379.453125 Q 133.9365234375 379.078125 133.9365234375 378.71875 Q 133.9365234375 378.140625 133.5302734375 377.78125 Q 133.1240234375 377.40625 132.4677734375 377.40625 Q 131.9990234375 377.40625 131.4833984375 377.578125 Q 130.9833984375 377.734375 130.3896484375 378.0625 L 130.3896484375 377.0625 Q 130.9833984375 376.828125 131.4990234375 376.703125 Q 132.0146484375 376.578125 132.4521484375 376.578125 Q 133.5771484375 376.578125 134.2490234375 377.140625 Q 134.9365234375 377.703125 134.9365234375 378.65625 Q 134.9365234375 379.109375 134.7646484375 379.515625 Q 134.5927734375 379.90625 134.1552734375 380.453125 Q 134.0302734375 380.59375 133.3740234375 381.28125 Q 132.7177734375 381.953125 131.5302734375 383.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 138.7866248530314 380.9219628629475 L 142.7866248530314 380.9219628629475"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 126.484375 291.859375 L 129.125 291.859375 L 129.125 292.65625 L 126.484375 292.65625 L 126.484375 291.859375 z M 130.8427734375 294.171875 L 132.4677734375 294.171875 L 132.4677734375 288.609375 L 130.7021484375 288.953125 L 130.7021484375 288.0625 L 132.4521484375 287.703125 L 133.4365234375 287.703125 L 133.4365234375 294.171875 L 135.0458984375 294.171875 L 135.0458984375 295 L 130.8427734375 295 L 130.8427734375 294.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 138.7866248530314 291.87353067031916 L 142.7866248530314 291.87353067031916"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 133.171875 193.359375 Q 132.421875 193.359375 132.03125 194.109375 Q 131.65625 194.859375 131.65625 196.359375 Q 131.65625 197.859375 132.03125 198.609375 Q 132.421875 199.359375 133.171875 199.359375 Q 133.953125 199.359375 134.328125 198.609375 Q 134.71875 197.859375 134.71875 196.359375 Q 134.71875 194.859375 134.328125 194.109375 Q 133.953125 193.359375 133.171875 193.359375 z M 133.171875 192.578125 Q 134.40625 192.578125 135.046875 193.546875 Q 135.703125 194.515625 135.703125 196.359375 Q 135.703125 198.203125 135.046875 199.171875 Q 134.40625 200.140625 133.171875 200.140625 Q 131.953125 200.140625 131.296875 199.171875 Q 130.65625 198.203125 130.65625 196.359375 Q 130.65625 194.515625 131.296875 193.546875 Q 131.953125 192.578125 133.171875 192.578125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 138.7866248530314 202.8250984776908 L 142.7866248530314 202.8250984776908"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 131.234375 116.171875 L 132.859375 116.171875 L 132.859375 110.609375 L 131.09375 110.953125 L 131.09375 110.0625 L 132.84375 109.703125 L 133.828125 109.703125 L 133.828125 116.171875 L 135.4375 116.171875 L 135.4375 117 L 131.234375 117 L 131.234375 116.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 138.7866248530314 113.77666628506246 L 142.7866248530314 113.77666628506246"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 131.921875 27.171875 L 135.359375 27.171875 L 135.359375 28 L 130.734375 28 L 130.734375 27.171875 Q 131.296875 26.59375 132.265625 25.609375 Q 133.234375 24.625 133.484375 24.34375 Q 133.953125 23.8125 134.140625 23.453125 Q 134.328125 23.078125 134.328125 22.71875 Q 134.328125 22.140625 133.921875 21.78125 Q 133.515625 21.40625 132.859375 21.40625 Q 132.390625 21.40625 131.875 21.578125 Q 131.375 21.734375 130.78125 22.0625 L 130.78125 21.0625 Q 131.375 20.828125 131.890625 20.703125 Q 132.40625 20.578125 132.84375 20.578125 Q 133.96875 20.578125 134.640625 21.140625 Q 135.328125 21.703125 135.328125 22.65625 Q 135.328125 23.109375 135.15625 23.515625 Q 134.984375 23.90625 134.546875 24.453125 Q 134.421875 24.59375 133.765625 25.28125 Q 133.109375 25.953125 131.921875 27.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 138.7866248530314 24.72823409243412 L 142.7866248530314 24.72823409243412"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 142.7866248530314 2 L 142.7866248530314 404"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 143.2866248530314 1 L 139.7866248530314 4"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 142.2866248530314 1 L 145.7866248530314 4"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g id="misc">
</g><!-- misc -->
<g id="layer0">
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 418.8367646501779 202.82509847769083 C 418.8367646501779 306.10328977998404 335.113248347952 389.82680608221034 231.8350570456593 389.82680608221034 C 128.5568657433666 389.82680608221034 44.83334944114074 306.10328977998404 44.83334944114074 202.82509847769083 C 44.83334944114074 99.5469071753976 128.5568657433666 15.82339087317132 231.8350570456593 15.82339087317132 C 335.113248347952 15.82339087317132 418.8367646501779 99.5469071753976 418.8367646501779 202.82509847769083 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 33 22 L 133 22"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 78 22 C 78 23.65685424949238 76.65685424949238 25 75 25 C 73.34314575050762 25 72 23.65685424949238 72 22 C 72 20.34314575050762 73.34314575050762 19 75 19 C 76.65685424949238 19 78 20.34314575050762 78 22 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 78 22 C 78 23.65685424949238 76.65685424949238 25 75 25 C 73.34314575050762 25 72 23.65685424949238 72 22 C 72 20.34314575050762 73.34314575050762 19 75 19 C 76.65685424949238 19 78 20.34314575050762 78 22 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 68.9375 6.4375 Q 68.75 6.34375 68.53125 6.296875 Q 68.328125 6.234375 68.0625 6.234375 Q 67.15625 6.234375 66.65625 6.828125 Q 66.171875 7.421875 66.171875 8.546875 L 66.171875 12 L 65.09375 12 L 65.09375 5.4375 L 66.171875 5.4375 L 66.171875 6.453125 Q 66.515625 5.859375 67.0625 5.578125 Q 67.609375 5.28125 68.390625 5.28125 Q 68.5 5.28125 68.625 5.296875 Q 68.765625 5.3125 68.921875 5.34375 L 68.9375 6.4375 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 70.16796875 16.171875 L 71.79296875 16.171875 L 71.79296875 10.609375 L 70.02734375 10.953125 L 70.02734375 10.0625 L 71.77734375 9.703125 L 72.76171875 9.703125 L 72.76171875 16.171875 L 74.37109375 16.171875 L 74.37109375 17 L 70.16796875 17 L 70.16796875 16.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 80.3759765625 6.546875 L 87.8916015625 6.546875 L 87.8916015625 7.53125 L 80.3759765625 7.53125 L 80.3759765625 6.546875 z M 80.3759765625 8.9375 L 87.8916015625 8.9375 L 87.8916015625 9.9375 L 80.3759765625 9.9375 L 80.3759765625 8.9375 z M 95.2763671875 11 L 99.4169921875 11 L 99.4169921875 12 L 93.8544921875 12 L 93.8544921875 11 Q 94.5263671875 10.3125 95.6826171875 9.140625 Q 96.8544921875 7.953125 97.1513671875 7.609375 Q 97.7294921875 6.984375 97.9482421875 6.546875 Q 98.1826171875 6.09375 98.1826171875 5.671875 Q 98.1826171875 4.96875 97.6826171875 4.53125 Q 97.1982421875 4.09375 96.4169921875 4.09375 Q 95.8544921875 4.09375 95.2294921875 4.28125 Q 94.6201171875 4.46875 93.9169921875 4.875 L 93.9169921875 3.671875 Q 94.6357421875 3.390625 95.2451171875 3.25 Q 95.8701171875 3.09375 96.3857421875 3.09375 Q 97.7451171875 3.09375 98.5576171875 3.78125 Q 99.3701171875 4.453125 99.3701171875 5.59375 Q 99.3701171875 6.125 99.1669921875 6.609375 Q 98.9638671875 7.09375 98.4326171875 7.75 Q 98.2763671875 7.921875 97.4951171875 8.734375 Q 96.7138671875 9.546875 95.2763671875 11 z M 101.8955078125 10.515625 L 103.1298828125 10.515625 L 103.1298828125 12 L 101.8955078125 12 L 101.8955078125 10.515625 z M 105.9130859375 11 L 107.8505859375 11 L 107.8505859375 4.328125 L 105.7412109375 4.75 L 105.7412109375 3.671875 L 107.8349609375 3.25 L 109.0224609375 3.25 L 109.0224609375 11 L 110.9599609375 11 L 110.9599609375 12 L 105.9130859375 12 L 105.9130859375 11 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g stroke-linejoin="round" stroke-dasharray="5,4" stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 3.451104209809671 409 L 389.1354963935821 -5"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 142.7866248530314 202.82509847769083 L 442 13.738868350091622"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 359.30328095086816 65.9986005269738 L 231.8350570456593 202.82509847769083"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 235 203 C 235 204.65685424949237 233.65685424949237 206 232 206 C 230.34314575050763 206 229 204.65685424949237 229 203 C 229 201.34314575050763 230.34314575050763 200 232 200 C 233.65685424949237 200 235 201.34314575050763 235 203 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 235 203 C 235 204.65685424949237 233.65685424949237 206 232 206 C 230.34314575050763 206 229 204.65685424949237 229 203 C 229 201.34314575050763 230.34314575050763 200 232 200 C 233.65685424949237 200 235 201.34314575050763 235 203 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 243.734375 188.921875 L 243.734375 190.171875 Q 243.125 189.609375 242.453125 189.34375 Q 241.78125 189.0625 241.015625 189.0625 Q 239.515625 189.0625 238.71875 189.984375 Q 237.921875 190.90625 237.921875 192.640625 Q 237.921875 194.359375 238.71875 195.28125 Q 239.515625 196.203125 241.015625 196.203125 Q 241.78125 196.203125 242.453125 195.921875 Q 243.125 195.640625 243.734375 195.09375 L 243.734375 196.328125 Q 243.109375 196.75 242.40625 196.96875 Q 241.71875 197.171875 240.953125 197.171875 Q 238.953125 197.171875 237.8125 195.953125 Q 236.671875 194.734375 236.671875 192.640625 Q 236.671875 190.53125 237.8125 189.3125 Q 238.953125 188.09375 240.953125 188.09375 Q 241.734375 188.09375 242.421875 188.3125 Q 243.125 188.515625 243.734375 188.921875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 245.61328125 201.171875 L 247.23828125 201.171875 L 247.23828125 195.609375 L 245.47265625 195.953125 L 245.47265625 195.0625 L 247.22265625 194.703125 L 248.20703125 194.703125 L 248.20703125 201.171875 L 249.81640625 201.171875 L 249.81640625 202 L 245.61328125 202 L 245.61328125 201.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 274 122 C 274 123.65685424949238 272.65685424949237 125 271 125 C 269.34314575050763 125 268 123.65685424949238 268 122 C 268 120.34314575050762 269.34314575050763 119 271 119 C 272.65685424949237 119 274 120.34314575050762 274 122 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 274 122 C 274 123.65685424949238 272.65685424949237 125 271 125 C 269.34314575050763 125 268 123.65685424949238 268 122 C 268 120.34314575050762 269.34314575050763 119 271 119 C 272.65685424949237 119 274 120.34314575050762 274 122 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 277.359375 108.21875 L 277.359375 111.515625 L 278.84375 111.515625 Q 279.671875 111.515625 280.125 111.09375 Q 280.578125 110.65625 280.578125 109.859375 Q 280.578125 109.078125 280.125 108.65625 Q 279.671875 108.21875 278.84375 108.21875 L 277.359375 108.21875 z M 276.171875 107.25 L 278.84375 107.25 Q 280.328125 107.25 281.078125 107.921875 Q 281.828125 108.578125 281.828125 109.859375 Q 281.828125 111.15625 281.078125 111.828125 Q 280.328125 112.484375 278.84375 112.484375 L 277.359375 112.484375 L 277.359375 116 L 276.171875 116 L 276.171875 107.25 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 146 203 C 146 204.65685424949237 144.65685424949237 206 143 206 C 141.34314575050763 206 140 204.65685424949237 140 203 C 140 201.34314575050763 141.34314575050763 200 143 200 C 144.65685424949237 200 146 201.34314575050763 146 203 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 146 203 C 146 204.65685424949237 144.65685424949237 206 143 206 C 141.34314575050763 206 140 204.65685424949237 140 203 C 140 201.34314575050763 141.34314575050763 200 143 200 C 144.65685424949237 200 146 201.34314575050763 146 203 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 154.734375 188.921875 L 154.734375 190.171875 Q 154.125 189.609375 153.453125 189.34375 Q 152.78125 189.0625 152.015625 189.0625 Q 150.515625 189.0625 149.71875 189.984375 Q 148.921875 190.90625 148.921875 192.640625 Q 148.921875 194.359375 149.71875 195.28125 Q 150.515625 196.203125 152.015625 196.203125 Q 152.78125 196.203125 153.453125 195.921875 Q 154.125 195.640625 154.734375 195.09375 L 154.734375 196.328125 Q 154.109375 196.75 153.40625 196.96875 Q 152.71875 197.171875 151.953125 197.171875 Q 149.953125 197.171875 148.8125 195.953125 Q 147.671875 194.734375 147.671875 192.640625 Q 147.671875 190.53125 148.8125 189.3125 Q 149.953125 188.09375 151.953125 188.09375 Q 152.734375 188.09375 153.421875 188.3125 Q 154.125 188.515625 154.734375 188.921875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 159.09765625 194.40625 L 159.09765625 195.15625 L 158.23828125 195.15625 Q 157.75390625 195.15625 157.56640625 195.359375 Q 157.37890625 195.546875 157.37890625 196.046875 L 157.37890625 196.53125 L 158.84765625 196.53125 L 158.84765625 197.234375 L 157.37890625 197.234375 L 157.37890625 202 L 156.47265625 202 L 156.47265625 197.234375 L 155.61328125 197.234375 L 155.61328125 196.53125 L 156.47265625 196.53125 L 156.47265625 196.15625 Q 156.47265625 195.234375 156.89453125 194.828125 Q 157.31640625 194.40625 158.23828125 194.40625 L 159.09765625 194.40625 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 362 66 C 362 67.65685424949238 360.65685424949237 69 359 69 C 357.34314575050763 69 356 67.65685424949238 356 66 C 356 64.34314575050762 357.34314575050763 63 359 63 C 360.65685424949237 63 362 64.34314575050762 362 66 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 362 66 C 362 67.65685424949238 360.65685424949237 69 359 69 C 357.34314575050763 69 356 67.65685424949238 356 66 C 356 64.34314575050762 357.34314575050763 63 359 63 C 360.65685424949237 63 362 64.34314575050762 362 66 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 365.359375 52.21875 L 365.359375 55.515625 L 366.84375 55.515625 Q 367.671875 55.515625 368.125 55.09375 Q 368.578125 54.65625 368.578125 53.859375 Q 368.578125 53.078125 368.125 52.65625 Q 367.671875 52.21875 366.84375 52.21875 L 365.359375 52.21875 z M 364.171875 51.25 L 366.84375 51.25 Q 368.328125 51.25 369.078125 51.921875 Q 369.828125 52.578125 369.828125 53.859375 Q 369.828125 55.15625 369.078125 55.828125 Q 368.328125 56.484375 366.84375 56.484375 L 365.359375 56.484375 L 365.359375 60 L 364.171875 60 L 364.171875 51.25 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 371.470703125 64.171875 L 373.095703125 64.171875 L 373.095703125 58.609375 L 371.330078125 58.953125 L 371.330078125 58.0625 L 373.080078125 57.703125 L 374.064453125 57.703125 L 374.064453125 64.171875 L 375.673828125 64.171875 L 375.673828125 65 L 371.470703125 65 L 371.470703125 64.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 199 203 C 199 204.65685424949237 197.65685424949237 206 196 206 C 194.34314575050763 206 193 204.65685424949237 193 203 C 193 201.34314575050763 194.34314575050763 200 196 200 C 197.65685424949237 200 199 201.34314575050763 199 203 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 199 203 C 199 204.65685424949237 197.65685424949237 206 196 206 C 194.34314575050763 206 193 204.65685424949237 193 203 C 193 201.34314575050763 194.34314575050763 200 196 200 C 197.65685424949237 200 199 201.34314575050763 199 203 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 207.734375 188.921875 L 207.734375 190.171875 Q 207.125 189.609375 206.453125 189.34375 Q 205.78125 189.0625 205.015625 189.0625 Q 203.515625 189.0625 202.71875 189.984375 Q 201.921875 190.90625 201.921875 192.640625 Q 201.921875 194.359375 202.71875 195.28125 Q 203.515625 196.203125 205.015625 196.203125 Q 205.78125 196.203125 206.453125 195.921875 Q 207.125 195.640625 207.734375 195.09375 L 207.734375 196.328125 Q 207.109375 196.75 206.40625 196.96875 Q 205.71875 197.171875 204.953125 197.171875 Q 202.953125 197.171875 201.8125 195.953125 Q 200.671875 194.734375 200.671875 192.640625 Q 200.671875 190.53125 201.8125 189.3125 Q 202.953125 188.09375 204.953125 188.09375 Q 205.734375 188.09375 206.421875 188.3125 Q 207.125 188.515625 207.734375 188.921875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
</g><!-- layer0 -->
</g> <!-- default stroke -->
</svg> <!-- bounding box -->

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

View File

@ -1,328 +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="357px"
height="247px"
viewBox="0 0 357 247"
>
<title></title>
<desc>Creator: FreeHEP Graphics2D Driver Producer: geogebra.export.SVGExtensions Revision: 12753 Source: Date: Friday, December 22, 2017 4:53:23 PM EST</desc>
<g stroke-linejoin="miter" stroke-dashoffset="0" stroke-dasharray="none" stroke-width="1" stroke-miterlimit="10" stroke-linecap="square">
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#ffffff">
<path d="M 0 0 L 405 0 L 405 280 L 0 280 L 0 0 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 45.484375 235.859375 L 48.125 235.859375 L 48.125 236.65625 L 45.484375 236.65625 L 45.484375 235.859375 z M 51.7802734375 232.359375 Q 51.0302734375 232.359375 50.6396484375 233.109375 Q 50.2646484375 233.859375 50.2646484375 235.359375 Q 50.2646484375 236.859375 50.6396484375 237.609375 Q 51.0302734375 238.359375 51.7802734375 238.359375 Q 52.5615234375 238.359375 52.9365234375 237.609375 Q 53.3271484375 236.859375 53.3271484375 235.359375 Q 53.3271484375 233.859375 52.9365234375 233.109375 Q 52.5615234375 232.359375 51.7802734375 232.359375 z M 51.7802734375 231.578125 Q 53.0146484375 231.578125 53.6552734375 232.546875 Q 54.3115234375 233.515625 54.3115234375 235.359375 Q 54.3115234375 237.203125 53.6552734375 238.171875 Q 53.0146484375 239.140625 51.7802734375 239.140625 Q 50.5615234375 239.140625 49.9052734375 238.171875 Q 49.2646484375 237.203125 49.2646484375 235.359375 Q 49.2646484375 233.515625 49.9052734375 232.546875 Q 50.5615234375 231.578125 51.7802734375 231.578125 z M 56.033203125 237.765625 L 57.064453125 237.765625 L 57.064453125 239 L 56.033203125 239 L 56.033203125 237.765625 z M 59.2275390625 231.703125 L 63.1025390625 231.703125 L 63.1025390625 232.546875 L 60.1337890625 232.546875 L 60.1337890625 234.328125 Q 60.3525390625 234.25 60.5556640625 234.21875 Q 60.7744140625 234.1875 60.9931640625 234.1875 Q 62.2119140625 234.1875 62.9150390625 234.859375 Q 63.6337890625 235.515625 63.6337890625 236.65625 Q 63.6337890625 237.84375 62.8994140625 238.5 Q 62.1806640625 239.140625 60.8369140625 239.140625 Q 60.3837890625 239.140625 59.8994140625 239.0625 Q 59.4306640625 238.984375 58.9150390625 238.828125 L 58.9150390625 237.84375 Q 59.3681640625 238.078125 59.8369140625 238.203125 Q 60.3056640625 238.3125 60.8212890625 238.3125 Q 61.6650390625 238.3125 62.1494140625 237.875 Q 62.6494140625 237.421875 62.6494140625 236.65625 Q 62.6494140625 235.90625 62.1494140625 235.46875 Q 61.6650390625 235.015625 60.8212890625 235.015625 Q 60.4306640625 235.015625 60.0244140625 235.109375 Q 59.6337890625 235.1875 59.2275390625 235.375 L 59.2275390625 231.703125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 54.41565157552739 225.13443114482905 L 54.41565157552739 229.13443114482905"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 127.171875 232.359375 Q 126.421875 232.359375 126.03125 233.109375 Q 125.65625 233.859375 125.65625 235.359375 Q 125.65625 236.859375 126.03125 237.609375 Q 126.421875 238.359375 127.171875 238.359375 Q 127.953125 238.359375 128.328125 237.609375 Q 128.71875 236.859375 128.71875 235.359375 Q 128.71875 233.859375 128.328125 233.109375 Q 127.953125 232.359375 127.171875 232.359375 z M 127.171875 231.578125 Q 128.40625 231.578125 129.046875 232.546875 Q 129.703125 233.515625 129.703125 235.359375 Q 129.703125 237.203125 129.046875 238.171875 Q 128.40625 239.140625 127.171875 239.140625 Q 125.953125 239.140625 125.296875 238.171875 Q 124.65625 237.203125 124.65625 235.359375 Q 124.65625 233.515625 125.296875 232.546875 Q 125.953125 231.578125 127.171875 231.578125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 118.66669502231808 225.13443114482905 L 118.66669502231808 229.13443114482905"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 178.171875 232.359375 Q 177.421875 232.359375 177.03125 233.109375 Q 176.65625 233.859375 176.65625 235.359375 Q 176.65625 236.859375 177.03125 237.609375 Q 177.421875 238.359375 178.171875 238.359375 Q 178.953125 238.359375 179.328125 237.609375 Q 179.71875 236.859375 179.71875 235.359375 Q 179.71875 233.859375 179.328125 233.109375 Q 178.953125 232.359375 178.171875 232.359375 z M 178.171875 231.578125 Q 179.40625 231.578125 180.046875 232.546875 Q 180.703125 233.515625 180.703125 235.359375 Q 180.703125 237.203125 180.046875 238.171875 Q 179.40625 239.140625 178.171875 239.140625 Q 176.953125 239.140625 176.296875 238.171875 Q 175.65625 237.203125 175.65625 235.359375 Q 175.65625 233.515625 176.296875 232.546875 Q 176.953125 231.578125 178.171875 231.578125 z M 182.4248046875 237.765625 L 183.4560546875 237.765625 L 183.4560546875 239 L 182.4248046875 239 L 182.4248046875 237.765625 z M 185.619140625 231.703125 L 189.494140625 231.703125 L 189.494140625 232.546875 L 186.525390625 232.546875 L 186.525390625 234.328125 Q 186.744140625 234.25 186.947265625 234.21875 Q 187.166015625 234.1875 187.384765625 234.1875 Q 188.603515625 234.1875 189.306640625 234.859375 Q 190.025390625 235.515625 190.025390625 236.65625 Q 190.025390625 237.84375 189.291015625 238.5 Q 188.572265625 239.140625 187.228515625 239.140625 Q 186.775390625 239.140625 186.291015625 239.0625 Q 185.822265625 238.984375 185.306640625 238.828125 L 185.306640625 237.84375 Q 185.759765625 238.078125 186.228515625 238.203125 Q 186.697265625 238.3125 187.212890625 238.3125 Q 188.056640625 238.3125 188.541015625 237.875 Q 189.041015625 237.421875 189.041015625 236.65625 Q 189.041015625 235.90625 188.541015625 235.46875 Q 188.056640625 235.015625 187.212890625 235.015625 Q 186.822265625 235.015625 186.416015625 235.109375 Q 186.025390625 235.1875 185.619140625 235.375 L 185.619140625 231.703125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 182.91773846910877 225.13443114482905 L 182.91773846910877 229.13443114482905"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 245.234375 238.171875 L 246.859375 238.171875 L 246.859375 232.609375 L 245.09375 232.953125 L 245.09375 232.0625 L 246.84375 231.703125 L 247.828125 231.703125 L 247.828125 238.171875 L 249.4375 238.171875 L 249.4375 239 L 245.234375 239 L 245.234375 238.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 247.16878191589944 225.13443114482905 L 247.16878191589944 229.13443114482905"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 305.234375 238.171875 L 306.859375 238.171875 L 306.859375 232.609375 L 305.09375 232.953125 L 305.09375 232.0625 L 306.84375 231.703125 L 307.828125 231.703125 L 307.828125 238.171875 L 309.4375 238.171875 L 309.4375 239 L 305.234375 239 L 305.234375 238.171875 z M 311.4248046875 237.765625 L 312.4560546875 237.765625 L 312.4560546875 239 L 311.4248046875 239 L 311.4248046875 237.765625 z M 314.619140625 231.703125 L 318.494140625 231.703125 L 318.494140625 232.546875 L 315.525390625 232.546875 L 315.525390625 234.328125 Q 315.744140625 234.25 315.947265625 234.21875 Q 316.166015625 234.1875 316.384765625 234.1875 Q 317.603515625 234.1875 318.306640625 234.859375 Q 319.025390625 235.515625 319.025390625 236.65625 Q 319.025390625 237.84375 318.291015625 238.5 Q 317.572265625 239.140625 316.228515625 239.140625 Q 315.775390625 239.140625 315.291015625 239.0625 Q 314.822265625 238.984375 314.306640625 238.828125 L 314.306640625 237.84375 Q 314.759765625 238.078125 315.228515625 238.203125 Q 315.697265625 238.3125 316.212890625 238.3125 Q 317.056640625 238.3125 317.541015625 237.875 Q 318.041015625 237.421875 318.041015625 236.65625 Q 318.041015625 235.90625 317.541015625 235.46875 Q 317.056640625 235.015625 316.212890625 235.015625 Q 315.822265625 235.015625 315.416015625 235.109375 Q 315.025390625 235.1875 314.619140625 235.375 L 314.619140625 231.703125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 311.4198253626901 225.13443114482905 L 311.4198253626901 229.13443114482905"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 374.921875 238.171875 L 378.359375 238.171875 L 378.359375 239 L 373.734375 239 L 373.734375 238.171875 Q 374.296875 237.59375 375.265625 236.609375 Q 376.234375 235.625 376.484375 235.34375 Q 376.953125 234.8125 377.140625 234.453125 Q 377.328125 234.078125 377.328125 233.71875 Q 377.328125 233.140625 376.921875 232.78125 Q 376.515625 232.40625 375.859375 232.40625 Q 375.390625 232.40625 374.875 232.578125 Q 374.375 232.734375 373.78125 233.0625 L 373.78125 232.0625 Q 374.375 231.828125 374.890625 231.703125 Q 375.40625 231.578125 375.84375 231.578125 Q 376.96875 231.578125 377.640625 232.140625 Q 378.328125 232.703125 378.328125 233.65625 Q 378.328125 234.109375 378.15625 234.515625 Q 377.984375 234.90625 377.546875 235.453125 Q 377.421875 235.59375 376.765625 236.28125 Q 376.109375 236.953125 374.921875 238.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 375.6708688094808 225.13443114482905 L 375.6708688094808 229.13443114482905"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 0 225.13443114482905 L 403 225.13443114482905"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 404 225.63443114482905 L 401 222.13443114482905"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 404 224.63443114482905 L 401 228.13443114482905"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 109.171875 216.359375 Q 108.421875 216.359375 108.03125 217.109375 Q 107.65625 217.859375 107.65625 219.359375 Q 107.65625 220.859375 108.03125 221.609375 Q 108.421875 222.359375 109.171875 222.359375 Q 109.953125 222.359375 110.328125 221.609375 Q 110.71875 220.859375 110.71875 219.359375 Q 110.71875 217.859375 110.328125 217.109375 Q 109.953125 216.359375 109.171875 216.359375 z M 109.171875 215.578125 Q 110.40625 215.578125 111.046875 216.546875 Q 111.703125 217.515625 111.703125 219.359375 Q 111.703125 221.203125 111.046875 222.171875 Q 110.40625 223.140625 109.171875 223.140625 Q 107.953125 223.140625 107.296875 222.171875 Q 106.65625 221.203125 106.65625 219.359375 Q 106.65625 217.515625 107.296875 216.546875 Q 107.953125 215.578125 109.171875 215.578125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 114.66669502231808 225.13443114482905 L 118.66669502231808 225.13443114482905"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 99.171875 157.359375 Q 98.421875 157.359375 98.03125 158.109375 Q 97.65625 158.859375 97.65625 160.359375 Q 97.65625 161.859375 98.03125 162.609375 Q 98.421875 163.359375 99.171875 163.359375 Q 99.953125 163.359375 100.328125 162.609375 Q 100.71875 161.859375 100.71875 160.359375 Q 100.71875 158.859375 100.328125 158.109375 Q 99.953125 157.359375 99.171875 157.359375 z M 99.171875 156.578125 Q 100.40625 156.578125 101.046875 157.546875 Q 101.703125 158.515625 101.703125 160.359375 Q 101.703125 162.203125 101.046875 163.171875 Q 100.40625 164.140625 99.171875 164.140625 Q 97.953125 164.140625 97.296875 163.171875 Q 96.65625 162.203125 96.65625 160.359375 Q 96.65625 158.515625 97.296875 157.546875 Q 97.953125 156.578125 99.171875 156.578125 z M 103.4248046875 162.765625 L 104.4560546875 162.765625 L 104.4560546875 164 L 103.4248046875 164 L 103.4248046875 162.765625 z M 106.619140625 156.703125 L 110.494140625 156.703125 L 110.494140625 157.546875 L 107.525390625 157.546875 L 107.525390625 159.328125 Q 107.744140625 159.25 107.947265625 159.21875 Q 108.166015625 159.1875 108.384765625 159.1875 Q 109.603515625 159.1875 110.306640625 159.859375 Q 111.025390625 160.515625 111.025390625 161.65625 Q 111.025390625 162.84375 110.291015625 163.5 Q 109.572265625 164.140625 108.228515625 164.140625 Q 107.775390625 164.140625 107.291015625 164.0625 Q 106.822265625 163.984375 106.306640625 163.828125 L 106.306640625 162.84375 Q 106.759765625 163.078125 107.228515625 163.203125 Q 107.697265625 163.3125 108.212890625 163.3125 Q 109.056640625 163.3125 109.541015625 162.875 Q 110.041015625 162.421875 110.041015625 161.65625 Q 110.041015625 160.90625 109.541015625 160.46875 Q 109.056640625 160.015625 108.212890625 160.015625 Q 107.822265625 160.015625 107.416015625 160.109375 Q 107.025390625 160.1875 106.619140625 160.375 L 106.619140625 156.703125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 114.66669502231808 160.88338769803818 L 118.66669502231808 160.88338769803818"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 107.234375 99.171875 L 108.859375 99.171875 L 108.859375 93.609375 L 107.09375 93.953125 L 107.09375 93.0625 L 108.84375 92.703125 L 109.828125 92.703125 L 109.828125 99.171875 L 111.4375 99.171875 L 111.4375 100 L 107.234375 100 L 107.234375 99.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 114.66669502231808 96.63234425124729 L 118.66669502231808 96.63234425124729"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 97.234375 35.171875 L 98.859375 35.171875 L 98.859375 29.609375 L 97.09375 29.953125 L 97.09375 29.0625 L 98.84375 28.703125 L 99.828125 28.703125 L 99.828125 35.171875 L 101.4375 35.171875 L 101.4375 36 L 97.234375 36 L 97.234375 35.171875 z M 103.4248046875 34.765625 L 104.4560546875 34.765625 L 104.4560546875 36 L 103.4248046875 36 L 103.4248046875 34.765625 z M 106.619140625 28.703125 L 110.494140625 28.703125 L 110.494140625 29.546875 L 107.525390625 29.546875 L 107.525390625 31.328125 Q 107.744140625 31.25 107.947265625 31.21875 Q 108.166015625 31.1875 108.384765625 31.1875 Q 109.603515625 31.1875 110.306640625 31.859375 Q 111.025390625 32.515625 111.025390625 33.65625 Q 111.025390625 34.84375 110.291015625 35.5 Q 109.572265625 36.140625 108.228515625 36.140625 Q 107.775390625 36.140625 107.291015625 36.0625 Q 106.822265625 35.984375 106.306640625 35.828125 L 106.306640625 34.84375 Q 106.759765625 35.078125 107.228515625 35.203125 Q 107.697265625 35.3125 108.212890625 35.3125 Q 109.056640625 35.3125 109.541015625 34.875 Q 110.041015625 34.421875 110.041015625 33.65625 Q 110.041015625 32.90625 109.541015625 32.46875 Q 109.056640625 32.015625 108.212890625 32.015625 Q 107.822265625 32.015625 107.416015625 32.109375 Q 107.025390625 32.1875 106.619140625 32.375 L 106.619140625 28.703125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 114.66669502231808 32.3813008044564 L 118.66669502231808 32.3813008044564"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 118.66669502231808 2 L 118.66669502231808 280"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 119.16669502231808 1 L 115.66669502231808 4"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 118.16669502231808 1 L 121.66669502231808 4"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g id="misc">
</g><!-- misc -->
<g id="layer0">
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 452.7721209456297 225.13443114482905 C 452.7721209456297 338.6860198052397 360.72037057630973 430.7377701745599 247.16878191589944 430.7377701745599 C 133.6171932554891 430.7377701745599 41.56544288616922 338.6860198052397 41.56544288616922 225.13443114482905 C 41.56544288616922 111.58284248441836 133.6171932554891 19.531092115098204 247.16878191589944 19.531092115098204 C 360.72037057630973 19.531092115098204 452.7721209456297 111.58284248441836 452.7721209456297 225.13443114482905 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 33 22 L 133 22"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 68 22 C 68 23.65685424949238 66.65685424949238 25 65 25 C 63.34314575050762 25 62 23.65685424949238 62 22 C 62 20.34314575050762 63.34314575050762 19 65 19 C 66.65685424949238 19 68 20.34314575050762 68 22 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 68 22 C 68 23.65685424949238 66.65685424949238 25 65 25 C 63.34314575050762 25 62 23.65685424949238 62 22 C 62 20.34314575050762 63.34314575050762 19 65 19 C 66.65685424949238 19 68 20.34314575050762 68 22 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 27.9375 33.4375 Q 27.75 33.34375 27.53125 33.296875 Q 27.328125 33.234375 27.0625 33.234375 Q 26.15625 33.234375 25.65625 33.828125 Q 25.171875 34.421875 25.171875 35.546875 L 25.171875 39 L 24.09375 39 L 24.09375 32.4375 L 25.171875 32.4375 L 25.171875 33.453125 Q 25.515625 32.859375 26.0625 32.578125 Q 26.609375 32.28125 27.390625 32.28125 Q 27.5 32.28125 27.625 32.296875 Q 27.765625 32.3125 27.921875 32.34375 L 27.9375 33.4375 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 29.16796875 43.171875 L 30.79296875 43.171875 L 30.79296875 37.609375 L 29.02734375 37.953125 L 29.02734375 37.0625 L 30.77734375 36.703125 L 31.76171875 36.703125 L 31.76171875 43.171875 L 33.37109375 43.171875 L 33.37109375 44 L 29.16796875 44 L 29.16796875 43.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 39.3759765625 33.546875 L 46.8916015625 33.546875 L 46.8916015625 34.53125 L 39.3759765625 34.53125 L 39.3759765625 33.546875 z M 39.3759765625 35.9375 L 46.8916015625 35.9375 L 46.8916015625 36.9375 L 39.3759765625 36.9375 L 39.3759765625 35.9375 z M 53.4638671875 38 L 55.4013671875 38 L 55.4013671875 31.328125 L 53.2919921875 31.75 L 53.2919921875 30.671875 L 55.3857421875 30.25 L 56.5732421875 30.25 L 56.5732421875 38 L 58.5107421875 38 L 58.5107421875 39 L 53.4638671875 39 L 53.4638671875 38 z M 60.8955078125 37.515625 L 62.1298828125 37.515625 L 62.1298828125 39 L 60.8955078125 39 L 60.8955078125 37.515625 z M 67.3974609375 34.15625 Q 66.6005859375 34.15625 66.1318359375 34.703125 Q 65.6630859375 35.25 65.6630859375 36.1875 Q 65.6630859375 37.140625 66.1318359375 37.6875 Q 66.6005859375 38.234375 67.3974609375 38.234375 Q 68.1943359375 38.234375 68.6474609375 37.6875 Q 69.1162109375 37.140625 69.1162109375 36.1875 Q 69.1162109375 35.25 68.6474609375 34.703125 Q 68.1943359375 34.15625 67.3974609375 34.15625 z M 69.7412109375 30.4375 L 69.7412109375 31.515625 Q 69.2880859375 31.3125 68.8349609375 31.203125 Q 68.3818359375 31.09375 67.9443359375 31.09375 Q 66.7724609375 31.09375 66.1474609375 31.890625 Q 65.5380859375 32.671875 65.4443359375 34.265625 Q 65.7880859375 33.765625 66.3037109375 33.5 Q 66.8349609375 33.21875 67.4599609375 33.21875 Q 68.7724609375 33.21875 69.5380859375 34.015625 Q 70.3037109375 34.8125 70.3037109375 36.1875 Q 70.3037109375 37.546875 69.5068359375 38.359375 Q 68.7099609375 39.171875 67.3974609375 39.171875 Q 65.8662109375 39.171875 65.0693359375 38.015625 Q 64.2724609375 36.84375 64.2724609375 34.640625 Q 64.2724609375 32.5625 65.2568359375 31.328125 Q 66.2412109375 30.09375 67.8974609375 30.09375 Q 68.3349609375 30.09375 68.7880859375 30.1875 Q 69.2412109375 30.265625 69.7412109375 30.4375 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="0.10196078568696976" fill-rule="nonzero" stroke="none" fill="#006400">
<path d="M 211.6416473388672 167.66152954101562 L 193.5975799560547 178.8155517578125 L 204.75160217285156 196.85960388183594 L 222.795654296875 185.70558166503906 L 211.6416473388672 167.66152954101562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#006400">
<path d="M 211.6416473388672 167.66152954101562 L 193.5975799560547 178.8155517578125 L 204.75160217285156 196.85960388183594 L 222.795654296875 185.70558166503906 L 211.6416473388672 167.66152954101562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 118.66669502231808 225.13443114482905 L 405 48.136155148760366"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 211.64164002930823 167.6615326346497 L 247.16878191589944 225.13443114482905"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 290.818181818182 118.7181818181819 L 290.818181818182 225.13443114482905"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 250 225 C 250 226.65685424949237 248.65685424949237 228 247 228 C 245.34314575050763 228 244 226.65685424949237 244 225 C 244 223.34314575050763 245.34314575050763 222 247 222 C 248.65685424949237 222 250 223.34314575050763 250 225 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 250 225 C 250 226.65685424949237 248.65685424949237 228 247 228 C 245.34314575050763 228 244 226.65685424949237 244 225 C 244 223.34314575050763 245.34314575050763 222 247 222 C 248.65685424949237 222 250 223.34314575050763 250 225 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 258.734375 210.921875 L 258.734375 212.171875 Q 258.125 211.609375 257.453125 211.34375 Q 256.78125 211.0625 256.015625 211.0625 Q 254.515625 211.0625 253.71875 211.984375 Q 252.921875 212.90625 252.921875 214.640625 Q 252.921875 216.359375 253.71875 217.28125 Q 254.515625 218.203125 256.015625 218.203125 Q 256.78125 218.203125 257.453125 217.921875 Q 258.125 217.640625 258.734375 217.09375 L 258.734375 218.328125 Q 258.109375 218.75 257.40625 218.96875 Q 256.71875 219.171875 255.953125 219.171875 Q 253.953125 219.171875 252.8125 217.953125 Q 251.671875 216.734375 251.671875 214.640625 Q 251.671875 212.53125 252.8125 211.3125 Q 253.953125 210.09375 255.953125 210.09375 Q 256.734375 210.09375 257.421875 210.3125 Q 258.125 210.515625 258.734375 210.921875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 260.61328125 223.171875 L 262.23828125 223.171875 L 262.23828125 217.609375 L 260.47265625 217.953125 L 260.47265625 217.0625 L 262.22265625 216.703125 L 263.20703125 216.703125 L 263.20703125 223.171875 L 264.81640625 223.171875 L 264.81640625 224 L 260.61328125 224 L 260.61328125 223.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 294 119 C 294 120.65685424949238 292.65685424949237 122 291 122 C 289.34314575050763 122 288 120.65685424949238 288 119 C 288 117.34314575050762 289.34314575050763 116 291 116 C 292.65685424949237 116 294 117.34314575050762 294 119 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 294 119 C 294 120.65685424949238 292.65685424949237 122 291 122 C 289.34314575050763 122 288 120.65685424949238 288 119 C 288 117.34314575050762 289.34314575050763 116 291 116 C 292.65685424949237 116 294 117.34314575050762 294 119 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 297.359375 105.21875 L 297.359375 108.515625 L 298.84375 108.515625 Q 299.671875 108.515625 300.125 108.09375 Q 300.578125 107.65625 300.578125 106.859375 Q 300.578125 106.078125 300.125 105.65625 Q 299.671875 105.21875 298.84375 105.21875 L 297.359375 105.21875 z M 296.171875 104.25 L 298.84375 104.25 Q 300.328125 104.25 301.078125 104.921875 Q 301.828125 105.578125 301.828125 106.859375 Q 301.828125 108.15625 301.078125 108.828125 Q 300.328125 109.484375 298.84375 109.484375 L 297.359375 109.484375 L 297.359375 113 L 296.171875 113 L 296.171875 104.25 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 122 225 C 122 226.65685424949237 120.65685424949238 228 119 228 C 117.34314575050762 228 116 226.65685424949237 116 225 C 116 223.34314575050763 117.34314575050762 222 119 222 C 120.65685424949238 222 122 223.34314575050763 122 225 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 122 225 C 122 226.65685424949237 120.65685424949238 228 119 228 C 117.34314575050762 228 116 226.65685424949237 116 225 C 116 223.34314575050763 117.34314575050762 222 119 222 C 120.65685424949238 222 122 223.34314575050763 122 225 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 130.734375 210.921875 L 130.734375 212.171875 Q 130.125 211.609375 129.453125 211.34375 Q 128.78125 211.0625 128.015625 211.0625 Q 126.515625 211.0625 125.71875 211.984375 Q 124.921875 212.90625 124.921875 214.640625 Q 124.921875 216.359375 125.71875 217.28125 Q 126.515625 218.203125 128.015625 218.203125 Q 128.78125 218.203125 129.453125 217.921875 Q 130.125 217.640625 130.734375 217.09375 L 130.734375 218.328125 Q 130.109375 218.75 129.40625 218.96875 Q 128.71875 219.171875 127.953125 219.171875 Q 125.953125 219.171875 124.8125 217.953125 Q 123.671875 216.734375 123.671875 214.640625 Q 123.671875 212.53125 124.8125 211.3125 Q 125.953125 210.09375 127.953125 210.09375 Q 128.734375 210.09375 129.421875 210.3125 Q 130.125 210.515625 130.734375 210.921875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 135.09765625 216.40625 L 135.09765625 217.15625 L 134.23828125 217.15625 Q 133.75390625 217.15625 133.56640625 217.359375 Q 133.37890625 217.546875 133.37890625 218.046875 L 133.37890625 218.53125 L 134.84765625 218.53125 L 134.84765625 219.234375 L 133.37890625 219.234375 L 133.37890625 224 L 132.47265625 224 L 132.47265625 219.234375 L 131.61328125 219.234375 L 131.61328125 218.53125 L 132.47265625 218.53125 L 132.47265625 218.15625 Q 132.47265625 217.234375 132.89453125 216.828125 Q 133.31640625 216.40625 134.23828125 216.40625 L 135.09765625 216.40625 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 380 66 C 380 67.65685424949238 378.65685424949237 69 377 69 C 375.34314575050763 69 374 67.65685424949238 374 66 C 374 64.34314575050762 375.34314575050763 63 377 63 C 378.65685424949237 63 380 64.34314575050762 380 66 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 380 66 C 380 67.65685424949238 378.65685424949237 69 377 69 C 375.34314575050763 69 374 67.65685424949238 374 66 C 374 64.34314575050762 375.34314575050763 63 377 63 C 378.65685424949237 63 380 64.34314575050762 380 66 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 383.359375 52.21875 L 383.359375 55.515625 L 384.84375 55.515625 Q 385.671875 55.515625 386.125 55.09375 Q 386.578125 54.65625 386.578125 53.859375 Q 386.578125 53.078125 386.125 52.65625 Q 385.671875 52.21875 384.84375 52.21875 L 383.359375 52.21875 z M 382.171875 51.25 L 384.84375 51.25 Q 386.328125 51.25 387.078125 51.921875 Q 387.828125 52.578125 387.828125 53.859375 Q 387.828125 55.15625 387.078125 55.828125 Q 386.328125 56.484375 384.84375 56.484375 L 383.359375 56.484375 L 383.359375 60 L 382.171875 60 L 382.171875 51.25 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 389.470703125 64.171875 L 391.095703125 64.171875 L 391.095703125 58.609375 L 389.330078125 58.953125 L 389.330078125 58.0625 L 391.080078125 57.703125 L 392.064453125 57.703125 L 392.064453125 64.171875 L 393.673828125 64.171875 L 393.673828125 65 L 389.470703125 65 L 389.470703125 64.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 215 168 C 215 169.65685424949237 213.65685424949237 171 212 171 C 210.34314575050763 171 209 169.65685424949237 209 168 C 209 166.34314575050763 210.34314575050763 165 212 165 C 213.65685424949237 165 215 166.34314575050763 215 168 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 215 168 C 215 169.65685424949237 213.65685424949237 171 212 171 C 210.34314575050763 171 209 169.65685424949237 209 168 C 209 166.34314575050763 210.34314575050763 165 212 165 C 213.65685424949237 165 215 166.34314575050763 215 168 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 217.171875 153.25 L 218.359375 153.25 L 218.359375 156.84375 L 222.65625 156.84375 L 222.65625 153.25 L 223.84375 153.25 L 223.84375 162 L 222.65625 162 L 222.65625 157.828125 L 218.359375 157.828125 L 218.359375 162 L 217.171875 162 L 217.171875 153.25 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 294 225 C 294 226.65685424949237 292.65685424949237 228 291 228 C 289.34314575050763 228 288 226.65685424949237 288 225 C 288 223.34314575050763 289.34314575050763 222 291 222 C 292.65685424949237 222 294 223.34314575050763 294 225 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 294 225 C 294 226.65685424949237 292.65685424949237 228 291 228 C 289.34314575050763 228 288 226.65685424949237 288 225 C 288 223.34314575050763 289.34314575050763 222 291 222 C 292.65685424949237 222 294 223.34314575050763 294 225 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 295.75 210.25 L 297.03125 210.25 L 299.203125 213.5 L 301.390625 210.25 L 302.65625 210.25 L 299.84375 214.453125 L 302.84375 219 L 301.578125 219 L 299.109375 215.28125 L 296.640625 219 L 295.359375 219 L 298.484375 214.328125 L 295.75 210.25 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 305.189453125 217.515625 L 305.189453125 220.265625 L 306.423828125 220.265625 Q 307.111328125 220.265625 307.486328125 219.90625 Q 307.876953125 219.546875 307.876953125 218.890625 Q 307.876953125 218.234375 307.486328125 217.875 Q 307.111328125 217.515625 306.423828125 217.515625 L 305.189453125 217.515625 z M 304.205078125 216.703125 L 306.423828125 216.703125 Q 307.658203125 216.703125 308.283203125 217.265625 Q 308.908203125 217.8125 308.908203125 218.890625 Q 308.908203125 219.96875 308.283203125 220.515625 Q 307.658203125 221.0625 306.423828125 221.0625 L 305.189453125 221.0625 L 305.189453125 224 L 304.205078125 224 L 304.205078125 216.703125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
</g><!-- layer0 -->
</g> <!-- default stroke -->
</svg> <!-- bounding box -->

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

View File

@ -1,328 +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="312px"
height="279px"
viewBox="0 0 312 279"
>
<title></title>
<desc>Creator: FreeHEP Graphics2D Driver Producer: geogebra.export.SVGExtensions Revision: 12753 Source: Date: Wednesday, December 27, 2017 9:52:32 AM EST</desc>
<g stroke-linejoin="miter" stroke-dashoffset="0" stroke-dasharray="none" stroke-width="1" stroke-miterlimit="10" stroke-linecap="square">
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#ffffff">
<path d="M 0 0 L 354 0 L 354 317 L 0 317 L 0 0 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 45.484375 235.859375 L 48.125 235.859375 L 48.125 236.65625 L 45.484375 236.65625 L 45.484375 235.859375 z M 51.7802734375 232.359375 Q 51.0302734375 232.359375 50.6396484375 233.109375 Q 50.2646484375 233.859375 50.2646484375 235.359375 Q 50.2646484375 236.859375 50.6396484375 237.609375 Q 51.0302734375 238.359375 51.7802734375 238.359375 Q 52.5615234375 238.359375 52.9365234375 237.609375 Q 53.3271484375 236.859375 53.3271484375 235.359375 Q 53.3271484375 233.859375 52.9365234375 233.109375 Q 52.5615234375 232.359375 51.7802734375 232.359375 z M 51.7802734375 231.578125 Q 53.0146484375 231.578125 53.6552734375 232.546875 Q 54.3115234375 233.515625 54.3115234375 235.359375 Q 54.3115234375 237.203125 53.6552734375 238.171875 Q 53.0146484375 239.140625 51.7802734375 239.140625 Q 50.5615234375 239.140625 49.9052734375 238.171875 Q 49.2646484375 237.203125 49.2646484375 235.359375 Q 49.2646484375 233.515625 49.9052734375 232.546875 Q 50.5615234375 231.578125 51.7802734375 231.578125 z M 56.033203125 237.765625 L 57.064453125 237.765625 L 57.064453125 239 L 56.033203125 239 L 56.033203125 237.765625 z M 59.2275390625 231.703125 L 63.1025390625 231.703125 L 63.1025390625 232.546875 L 60.1337890625 232.546875 L 60.1337890625 234.328125 Q 60.3525390625 234.25 60.5556640625 234.21875 Q 60.7744140625 234.1875 60.9931640625 234.1875 Q 62.2119140625 234.1875 62.9150390625 234.859375 Q 63.6337890625 235.515625 63.6337890625 236.65625 Q 63.6337890625 237.84375 62.8994140625 238.5 Q 62.1806640625 239.140625 60.8369140625 239.140625 Q 60.3837890625 239.140625 59.8994140625 239.0625 Q 59.4306640625 238.984375 58.9150390625 238.828125 L 58.9150390625 237.84375 Q 59.3681640625 238.078125 59.8369140625 238.203125 Q 60.3056640625 238.3125 60.8212890625 238.3125 Q 61.6650390625 238.3125 62.1494140625 237.875 Q 62.6494140625 237.421875 62.6494140625 236.65625 Q 62.6494140625 235.90625 62.1494140625 235.46875 Q 61.6650390625 235.015625 60.8212890625 235.015625 Q 60.4306640625 235.015625 60.0244140625 235.109375 Q 59.6337890625 235.1875 59.2275390625 235.375 L 59.2275390625 231.703125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 54.41565157552735 225.13443114482908 L 54.41565157552735 229.13443114482908"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 127.171875 232.359375 Q 126.421875 232.359375 126.03125 233.109375 Q 125.65625 233.859375 125.65625 235.359375 Q 125.65625 236.859375 126.03125 237.609375 Q 126.421875 238.359375 127.171875 238.359375 Q 127.953125 238.359375 128.328125 237.609375 Q 128.71875 236.859375 128.71875 235.359375 Q 128.71875 233.859375 128.328125 233.109375 Q 127.953125 232.359375 127.171875 232.359375 z M 127.171875 231.578125 Q 128.40625 231.578125 129.046875 232.546875 Q 129.703125 233.515625 129.703125 235.359375 Q 129.703125 237.203125 129.046875 238.171875 Q 128.40625 239.140625 127.171875 239.140625 Q 125.953125 239.140625 125.296875 238.171875 Q 124.65625 237.203125 124.65625 235.359375 Q 124.65625 233.515625 125.296875 232.546875 Q 125.953125 231.578125 127.171875 231.578125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 118.66669502231811 225.13443114482908 L 118.66669502231811 229.13443114482908"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 178.171875 232.359375 Q 177.421875 232.359375 177.03125 233.109375 Q 176.65625 233.859375 176.65625 235.359375 Q 176.65625 236.859375 177.03125 237.609375 Q 177.421875 238.359375 178.171875 238.359375 Q 178.953125 238.359375 179.328125 237.609375 Q 179.71875 236.859375 179.71875 235.359375 Q 179.71875 233.859375 179.328125 233.109375 Q 178.953125 232.359375 178.171875 232.359375 z M 178.171875 231.578125 Q 179.40625 231.578125 180.046875 232.546875 Q 180.703125 233.515625 180.703125 235.359375 Q 180.703125 237.203125 180.046875 238.171875 Q 179.40625 239.140625 178.171875 239.140625 Q 176.953125 239.140625 176.296875 238.171875 Q 175.65625 237.203125 175.65625 235.359375 Q 175.65625 233.515625 176.296875 232.546875 Q 176.953125 231.578125 178.171875 231.578125 z M 182.4248046875 237.765625 L 183.4560546875 237.765625 L 183.4560546875 239 L 182.4248046875 239 L 182.4248046875 237.765625 z M 185.619140625 231.703125 L 189.494140625 231.703125 L 189.494140625 232.546875 L 186.525390625 232.546875 L 186.525390625 234.328125 Q 186.744140625 234.25 186.947265625 234.21875 Q 187.166015625 234.1875 187.384765625 234.1875 Q 188.603515625 234.1875 189.306640625 234.859375 Q 190.025390625 235.515625 190.025390625 236.65625 Q 190.025390625 237.84375 189.291015625 238.5 Q 188.572265625 239.140625 187.228515625 239.140625 Q 186.775390625 239.140625 186.291015625 239.0625 Q 185.822265625 238.984375 185.306640625 238.828125 L 185.306640625 237.84375 Q 185.759765625 238.078125 186.228515625 238.203125 Q 186.697265625 238.3125 187.212890625 238.3125 Q 188.056640625 238.3125 188.541015625 237.875 Q 189.041015625 237.421875 189.041015625 236.65625 Q 189.041015625 235.90625 188.541015625 235.46875 Q 188.056640625 235.015625 187.212890625 235.015625 Q 186.822265625 235.015625 186.416015625 235.109375 Q 186.025390625 235.1875 185.619140625 235.375 L 185.619140625 231.703125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 182.91773846910888 225.13443114482908 L 182.91773846910888 229.13443114482908"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 245.234375 238.171875 L 246.859375 238.171875 L 246.859375 232.609375 L 245.09375 232.953125 L 245.09375 232.0625 L 246.84375 231.703125 L 247.828125 231.703125 L 247.828125 238.171875 L 249.4375 238.171875 L 249.4375 239 L 245.234375 239 L 245.234375 238.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 247.16878191589964 225.13443114482908 L 247.16878191589964 229.13443114482908"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 305.234375 238.171875 L 306.859375 238.171875 L 306.859375 232.609375 L 305.09375 232.953125 L 305.09375 232.0625 L 306.84375 231.703125 L 307.828125 231.703125 L 307.828125 238.171875 L 309.4375 238.171875 L 309.4375 239 L 305.234375 239 L 305.234375 238.171875 z M 311.4248046875 237.765625 L 312.4560546875 237.765625 L 312.4560546875 239 L 311.4248046875 239 L 311.4248046875 237.765625 z M 314.619140625 231.703125 L 318.494140625 231.703125 L 318.494140625 232.546875 L 315.525390625 232.546875 L 315.525390625 234.328125 Q 315.744140625 234.25 315.947265625 234.21875 Q 316.166015625 234.1875 316.384765625 234.1875 Q 317.603515625 234.1875 318.306640625 234.859375 Q 319.025390625 235.515625 319.025390625 236.65625 Q 319.025390625 237.84375 318.291015625 238.5 Q 317.572265625 239.140625 316.228515625 239.140625 Q 315.775390625 239.140625 315.291015625 239.0625 Q 314.822265625 238.984375 314.306640625 238.828125 L 314.306640625 237.84375 Q 314.759765625 238.078125 315.228515625 238.203125 Q 315.697265625 238.3125 316.212890625 238.3125 Q 317.056640625 238.3125 317.541015625 237.875 Q 318.041015625 237.421875 318.041015625 236.65625 Q 318.041015625 235.90625 317.541015625 235.46875 Q 317.056640625 235.015625 316.212890625 235.015625 Q 315.822265625 235.015625 315.416015625 235.109375 Q 315.025390625 235.1875 314.619140625 235.375 L 314.619140625 231.703125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 311.4198253626904 225.13443114482908 L 311.4198253626904 229.13443114482908"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 0 225.13443114482908 L 352 225.13443114482908"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 353 225.63443114482908 L 350 222.13443114482908"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 353 224.63443114482908 L 350 228.13443114482908"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 93.484375 289.859375 L 96.125 289.859375 L 96.125 290.65625 L 93.484375 290.65625 L 93.484375 289.859375 z M 99.7802734375 286.359375 Q 99.0302734375 286.359375 98.6396484375 287.109375 Q 98.2646484375 287.859375 98.2646484375 289.359375 Q 98.2646484375 290.859375 98.6396484375 291.609375 Q 99.0302734375 292.359375 99.7802734375 292.359375 Q 100.5615234375 292.359375 100.9365234375 291.609375 Q 101.3271484375 290.859375 101.3271484375 289.359375 Q 101.3271484375 287.859375 100.9365234375 287.109375 Q 100.5615234375 286.359375 99.7802734375 286.359375 z M 99.7802734375 285.578125 Q 101.0146484375 285.578125 101.6552734375 286.546875 Q 102.3115234375 287.515625 102.3115234375 289.359375 Q 102.3115234375 291.203125 101.6552734375 292.171875 Q 101.0146484375 293.140625 99.7802734375 293.140625 Q 98.5615234375 293.140625 97.9052734375 292.171875 Q 97.2646484375 291.203125 97.2646484375 289.359375 Q 97.2646484375 287.515625 97.9052734375 286.546875 Q 98.5615234375 285.578125 99.7802734375 285.578125 z M 104.033203125 291.765625 L 105.064453125 291.765625 L 105.064453125 293 L 104.033203125 293 L 104.033203125 291.765625 z M 107.2275390625 285.703125 L 111.1025390625 285.703125 L 111.1025390625 286.546875 L 108.1337890625 286.546875 L 108.1337890625 288.328125 Q 108.3525390625 288.25 108.5556640625 288.21875 Q 108.7744140625 288.1875 108.9931640625 288.1875 Q 110.2119140625 288.1875 110.9150390625 288.859375 Q 111.6337890625 289.515625 111.6337890625 290.65625 Q 111.6337890625 291.84375 110.8994140625 292.5 Q 110.1806640625 293.140625 108.8369140625 293.140625 Q 108.3837890625 293.140625 107.8994140625 293.0625 Q 107.4306640625 292.984375 106.9150390625 292.828125 L 106.9150390625 291.84375 Q 107.3681640625 292.078125 107.8369140625 292.203125 Q 108.3056640625 292.3125 108.8212890625 292.3125 Q 109.6650390625 292.3125 110.1494140625 291.875 Q 110.6494140625 291.421875 110.6494140625 290.65625 Q 110.6494140625 289.90625 110.1494140625 289.46875 Q 109.6650390625 289.015625 108.8212890625 289.015625 Q 108.4306640625 289.015625 108.0244140625 289.109375 Q 107.6337890625 289.1875 107.2275390625 289.375 L 107.2275390625 285.703125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 114.66669502231811 289.3854745916199 L 118.66669502231811 289.3854745916199"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 109.171875 216.359375 Q 108.421875 216.359375 108.03125 217.109375 Q 107.65625 217.859375 107.65625 219.359375 Q 107.65625 220.859375 108.03125 221.609375 Q 108.421875 222.359375 109.171875 222.359375 Q 109.953125 222.359375 110.328125 221.609375 Q 110.71875 220.859375 110.71875 219.359375 Q 110.71875 217.859375 110.328125 217.109375 Q 109.953125 216.359375 109.171875 216.359375 z M 109.171875 215.578125 Q 110.40625 215.578125 111.046875 216.546875 Q 111.703125 217.515625 111.703125 219.359375 Q 111.703125 221.203125 111.046875 222.171875 Q 110.40625 223.140625 109.171875 223.140625 Q 107.953125 223.140625 107.296875 222.171875 Q 106.65625 221.203125 106.65625 219.359375 Q 106.65625 217.515625 107.296875 216.546875 Q 107.953125 215.578125 109.171875 215.578125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 114.66669502231811 225.13443114482908 L 118.66669502231811 225.13443114482908"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 99.171875 157.359375 Q 98.421875 157.359375 98.03125 158.109375 Q 97.65625 158.859375 97.65625 160.359375 Q 97.65625 161.859375 98.03125 162.609375 Q 98.421875 163.359375 99.171875 163.359375 Q 99.953125 163.359375 100.328125 162.609375 Q 100.71875 161.859375 100.71875 160.359375 Q 100.71875 158.859375 100.328125 158.109375 Q 99.953125 157.359375 99.171875 157.359375 z M 99.171875 156.578125 Q 100.40625 156.578125 101.046875 157.546875 Q 101.703125 158.515625 101.703125 160.359375 Q 101.703125 162.203125 101.046875 163.171875 Q 100.40625 164.140625 99.171875 164.140625 Q 97.953125 164.140625 97.296875 163.171875 Q 96.65625 162.203125 96.65625 160.359375 Q 96.65625 158.515625 97.296875 157.546875 Q 97.953125 156.578125 99.171875 156.578125 z M 103.4248046875 162.765625 L 104.4560546875 162.765625 L 104.4560546875 164 L 103.4248046875 164 L 103.4248046875 162.765625 z M 106.619140625 156.703125 L 110.494140625 156.703125 L 110.494140625 157.546875 L 107.525390625 157.546875 L 107.525390625 159.328125 Q 107.744140625 159.25 107.947265625 159.21875 Q 108.166015625 159.1875 108.384765625 159.1875 Q 109.603515625 159.1875 110.306640625 159.859375 Q 111.025390625 160.515625 111.025390625 161.65625 Q 111.025390625 162.84375 110.291015625 163.5 Q 109.572265625 164.140625 108.228515625 164.140625 Q 107.775390625 164.140625 107.291015625 164.0625 Q 106.822265625 163.984375 106.306640625 163.828125 L 106.306640625 162.84375 Q 106.759765625 163.078125 107.228515625 163.203125 Q 107.697265625 163.3125 108.212890625 163.3125 Q 109.056640625 163.3125 109.541015625 162.875 Q 110.041015625 162.421875 110.041015625 161.65625 Q 110.041015625 160.90625 109.541015625 160.46875 Q 109.056640625 160.015625 108.212890625 160.015625 Q 107.822265625 160.015625 107.416015625 160.109375 Q 107.025390625 160.1875 106.619140625 160.375 L 106.619140625 156.703125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 114.66669502231811 160.88338769803823 L 118.66669502231811 160.88338769803823"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 107.234375 99.171875 L 108.859375 99.171875 L 108.859375 93.609375 L 107.09375 93.953125 L 107.09375 93.0625 L 108.84375 92.703125 L 109.828125 92.703125 L 109.828125 99.171875 L 111.4375 99.171875 L 111.4375 100 L 107.234375 100 L 107.234375 99.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 114.66669502231811 96.63234425124739 L 118.66669502231811 96.63234425124739"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 97.234375 35.171875 L 98.859375 35.171875 L 98.859375 29.609375 L 97.09375 29.953125 L 97.09375 29.0625 L 98.84375 28.703125 L 99.828125 28.703125 L 99.828125 35.171875 L 101.4375 35.171875 L 101.4375 36 L 97.234375 36 L 97.234375 35.171875 z M 103.4248046875 34.765625 L 104.4560546875 34.765625 L 104.4560546875 36 L 103.4248046875 36 L 103.4248046875 34.765625 z M 106.619140625 28.703125 L 110.494140625 28.703125 L 110.494140625 29.546875 L 107.525390625 29.546875 L 107.525390625 31.328125 Q 107.744140625 31.25 107.947265625 31.21875 Q 108.166015625 31.1875 108.384765625 31.1875 Q 109.603515625 31.1875 110.306640625 31.859375 Q 111.025390625 32.515625 111.025390625 33.65625 Q 111.025390625 34.84375 110.291015625 35.5 Q 109.572265625 36.140625 108.228515625 36.140625 Q 107.775390625 36.140625 107.291015625 36.0625 Q 106.822265625 35.984375 106.306640625 35.828125 L 106.306640625 34.84375 Q 106.759765625 35.078125 107.228515625 35.203125 Q 107.697265625 35.3125 108.212890625 35.3125 Q 109.056640625 35.3125 109.541015625 34.875 Q 110.041015625 34.421875 110.041015625 33.65625 Q 110.041015625 32.90625 109.541015625 32.46875 Q 109.056640625 32.015625 108.212890625 32.015625 Q 107.822265625 32.015625 107.416015625 32.109375 Q 107.025390625 32.1875 106.619140625 32.375 L 106.619140625 28.703125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 114.66669502231811 32.381300804456544 L 118.66669502231811 32.381300804456544"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 118.66669502231811 2 L 118.66669502231811 317"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 119.16669502231811 1 L 115.66669502231811 4"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 118.16669502231811 1 L 121.66669502231811 4"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g id="misc">
</g><!-- misc -->
<g id="layer0">
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 452.77212094563004 225.13443114482908 C 452.77212094563004 338.68601980523965 360.7203705763101 430.7377701745598 247.16878191589961 430.7377701745598 C 133.61719325548916 430.7377701745598 41.565442886169166 338.68601980523965 41.565442886169166 225.13443114482908 C 41.565442886169166 111.58284248441846 133.61719325548916 19.531092115098375 247.16878191589961 19.531092115098375 C 360.7203705763101 19.531092115098375 452.77212094563004 111.58284248441846 452.77212094563004 225.13443114482908 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 33 22 L 133 22"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 68 22 C 68 23.65685424949238 66.65685424949238 25 65 25 C 63.34314575050762 25 62 23.65685424949238 62 22 C 62 20.34314575050762 63.34314575050762 19 65 19 C 66.65685424949238 19 68 20.34314575050762 68 22 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 68 22 C 68 23.65685424949238 66.65685424949238 25 65 25 C 63.34314575050762 25 62 23.65685424949238 62 22 C 62 20.34314575050762 63.34314575050762 19 65 19 C 66.65685424949238 19 68 20.34314575050762 68 22 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 27.9375 33.4375 Q 27.75 33.34375 27.53125 33.296875 Q 27.328125 33.234375 27.0625 33.234375 Q 26.15625 33.234375 25.65625 33.828125 Q 25.171875 34.421875 25.171875 35.546875 L 25.171875 39 L 24.09375 39 L 24.09375 32.4375 L 25.171875 32.4375 L 25.171875 33.453125 Q 25.515625 32.859375 26.0625 32.578125 Q 26.609375 32.28125 27.390625 32.28125 Q 27.5 32.28125 27.625 32.296875 Q 27.765625 32.3125 27.921875 32.34375 L 27.9375 33.4375 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 29.16796875 43.171875 L 30.79296875 43.171875 L 30.79296875 37.609375 L 29.02734375 37.953125 L 29.02734375 37.0625 L 30.77734375 36.703125 L 31.76171875 36.703125 L 31.76171875 43.171875 L 33.37109375 43.171875 L 33.37109375 44 L 29.16796875 44 L 29.16796875 43.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 39.3759765625 33.546875 L 46.8916015625 33.546875 L 46.8916015625 34.53125 L 39.3759765625 34.53125 L 39.3759765625 33.546875 z M 39.3759765625 35.9375 L 46.8916015625 35.9375 L 46.8916015625 36.9375 L 39.3759765625 36.9375 L 39.3759765625 35.9375 z M 53.4638671875 38 L 55.4013671875 38 L 55.4013671875 31.328125 L 53.2919921875 31.75 L 53.2919921875 30.671875 L 55.3857421875 30.25 L 56.5732421875 30.25 L 56.5732421875 38 L 58.5107421875 38 L 58.5107421875 39 L 53.4638671875 39 L 53.4638671875 38 z M 60.8955078125 37.515625 L 62.1298828125 37.515625 L 62.1298828125 39 L 60.8955078125 39 L 60.8955078125 37.515625 z M 67.3974609375 34.15625 Q 66.6005859375 34.15625 66.1318359375 34.703125 Q 65.6630859375 35.25 65.6630859375 36.1875 Q 65.6630859375 37.140625 66.1318359375 37.6875 Q 66.6005859375 38.234375 67.3974609375 38.234375 Q 68.1943359375 38.234375 68.6474609375 37.6875 Q 69.1162109375 37.140625 69.1162109375 36.1875 Q 69.1162109375 35.25 68.6474609375 34.703125 Q 68.1943359375 34.15625 67.3974609375 34.15625 z M 69.7412109375 30.4375 L 69.7412109375 31.515625 Q 69.2880859375 31.3125 68.8349609375 31.203125 Q 68.3818359375 31.09375 67.9443359375 31.09375 Q 66.7724609375 31.09375 66.1474609375 31.890625 Q 65.5380859375 32.671875 65.4443359375 34.265625 Q 65.7880859375 33.765625 66.3037109375 33.5 Q 66.8349609375 33.21875 67.4599609375 33.21875 Q 68.7724609375 33.21875 69.5380859375 34.015625 Q 70.3037109375 34.8125 70.3037109375 36.1875 Q 70.3037109375 37.546875 69.5068359375 38.359375 Q 68.7099609375 39.171875 67.3974609375 39.171875 Q 65.8662109375 39.171875 65.0693359375 38.015625 Q 64.2724609375 36.84375 64.2724609375 34.640625 Q 64.2724609375 32.5625 65.2568359375 31.328125 Q 66.2412109375 30.09375 67.8974609375 30.09375 Q 68.3349609375 30.09375 68.7880859375 30.1875 Q 69.2412109375 30.265625 69.7412109375 30.4375 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="0.10196078568696976" fill-rule="nonzero" stroke="none" fill="#006400">
<path d="M 154.53904724121094 282.778564453125 L 172.54957580566406 271.57049560546875 L 161.34149169921875 253.55996704101562 L 143.3309783935547 264.7680358886719 L 154.53904724121094 282.778564453125"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#006400">
<path d="M 154.53904724121094 282.778564453125 L 172.54957580566406 271.57049560546875 L 161.34149169921875 253.55996704101562 L 143.3309783935547 264.7680358886719 L 154.53904724121094 282.778564453125"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 178.9468221607791 322 L -5 26.4114799761894"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 154.53904829384888 282.7785681228254 L 247.16878191589961 225.13443114482908"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 80 163 L 80 225.13443114482908"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 250 225 C 250 226.65685424949237 248.65685424949237 228 247 228 C 245.34314575050763 228 244 226.65685424949237 244 225 C 244 223.34314575050763 245.34314575050763 222 247 222 C 248.65685424949237 222 250 223.34314575050763 250 225 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 250 225 C 250 226.65685424949237 248.65685424949237 228 247 228 C 245.34314575050763 228 244 226.65685424949237 244 225 C 244 223.34314575050763 245.34314575050763 222 247 222 C 248.65685424949237 222 250 223.34314575050763 250 225 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 258.734375 210.921875 L 258.734375 212.171875 Q 258.125 211.609375 257.453125 211.34375 Q 256.78125 211.0625 256.015625 211.0625 Q 254.515625 211.0625 253.71875 211.984375 Q 252.921875 212.90625 252.921875 214.640625 Q 252.921875 216.359375 253.71875 217.28125 Q 254.515625 218.203125 256.015625 218.203125 Q 256.78125 218.203125 257.453125 217.921875 Q 258.125 217.640625 258.734375 217.09375 L 258.734375 218.328125 Q 258.109375 218.75 257.40625 218.96875 Q 256.71875 219.171875 255.953125 219.171875 Q 253.953125 219.171875 252.8125 217.953125 Q 251.671875 216.734375 251.671875 214.640625 Q 251.671875 212.53125 252.8125 211.3125 Q 253.953125 210.09375 255.953125 210.09375 Q 256.734375 210.09375 257.421875 210.3125 Q 258.125 210.515625 258.734375 210.921875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 260.61328125 223.171875 L 262.23828125 223.171875 L 262.23828125 217.609375 L 260.47265625 217.953125 L 260.47265625 217.0625 L 262.22265625 216.703125 L 263.20703125 216.703125 L 263.20703125 223.171875 L 264.81640625 223.171875 L 264.81640625 224 L 260.61328125 224 L 260.61328125 223.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 83 163 C 83 164.65685424949237 81.65685424949238 166 80 166 C 78.34314575050762 166 77 164.65685424949237 77 163 C 77 161.34314575050763 78.34314575050762 160 80 160 C 81.65685424949238 160 83 161.34314575050763 83 163 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 83 163 C 83 164.65685424949237 81.65685424949238 166 80 166 C 78.34314575050762 166 77 164.65685424949237 77 163 C 77 161.34314575050763 78.34314575050762 160 80 160 C 81.65685424949238 160 83 161.34314575050763 83 163 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 86.359375 149.21875 L 86.359375 152.515625 L 87.84375 152.515625 Q 88.671875 152.515625 89.125 152.09375 Q 89.578125 151.65625 89.578125 150.859375 Q 89.578125 150.078125 89.125 149.65625 Q 88.671875 149.21875 87.84375 149.21875 L 86.359375 149.21875 z M 85.171875 148.25 L 87.84375 148.25 Q 89.328125 148.25 90.078125 148.921875 Q 90.828125 149.578125 90.828125 150.859375 Q 90.828125 152.15625 90.078125 152.828125 Q 89.328125 153.484375 87.84375 153.484375 L 86.359375 153.484375 L 86.359375 157 L 85.171875 157 L 85.171875 148.25 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 122 225 C 122 226.65685424949237 120.65685424949238 228 119 228 C 117.34314575050762 228 116 226.65685424949237 116 225 C 116 223.34314575050763 117.34314575050762 222 119 222 C 120.65685424949238 222 122 223.34314575050763 122 225 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 122 225 C 122 226.65685424949237 120.65685424949238 228 119 228 C 117.34314575050762 228 116 226.65685424949237 116 225 C 116 223.34314575050763 117.34314575050762 222 119 222 C 120.65685424949238 222 122 223.34314575050763 122 225 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 130.734375 210.921875 L 130.734375 212.171875 Q 130.125 211.609375 129.453125 211.34375 Q 128.78125 211.0625 128.015625 211.0625 Q 126.515625 211.0625 125.71875 211.984375 Q 124.921875 212.90625 124.921875 214.640625 Q 124.921875 216.359375 125.71875 217.28125 Q 126.515625 218.203125 128.015625 218.203125 Q 128.78125 218.203125 129.453125 217.921875 Q 130.125 217.640625 130.734375 217.09375 L 130.734375 218.328125 Q 130.109375 218.75 129.40625 218.96875 Q 128.71875 219.171875 127.953125 219.171875 Q 125.953125 219.171875 124.8125 217.953125 Q 123.671875 216.734375 123.671875 214.640625 Q 123.671875 212.53125 124.8125 211.3125 Q 125.953125 210.09375 127.953125 210.09375 Q 128.734375 210.09375 129.421875 210.3125 Q 130.125 210.515625 130.734375 210.921875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 135.09765625 216.40625 L 135.09765625 217.15625 L 134.23828125 217.15625 Q 133.75390625 217.15625 133.56640625 217.359375 Q 133.37890625 217.546875 133.37890625 218.046875 L 133.37890625 218.53125 L 134.84765625 218.53125 L 134.84765625 219.234375 L 133.37890625 219.234375 L 133.37890625 224 L 132.47265625 224 L 132.47265625 219.234375 L 131.61328125 219.234375 L 131.61328125 218.53125 L 132.47265625 218.53125 L 132.47265625 218.15625 Q 132.47265625 217.234375 132.89453125 216.828125 Q 133.31640625 216.40625 134.23828125 216.40625 L 135.09765625 216.40625 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 65 135 C 65 136.65685424949237 63.65685424949238 138 62 138 C 60.34314575050762 138 59 136.65685424949237 59 135 C 59 133.34314575050763 60.34314575050762 132 62 132 C 63.65685424949238 132 65 133.34314575050763 65 135 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 65 135 C 65 136.65685424949237 63.65685424949238 138 62 138 C 60.34314575050762 138 59 136.65685424949237 59 135 C 59 133.34314575050763 60.34314575050762 132 62 132 C 63.65685424949238 132 65 133.34314575050763 65 135 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 68.359375 121.21875 L 68.359375 124.515625 L 69.84375 124.515625 Q 70.671875 124.515625 71.125 124.09375 Q 71.578125 123.65625 71.578125 122.859375 Q 71.578125 122.078125 71.125 121.65625 Q 70.671875 121.21875 69.84375 121.21875 L 68.359375 121.21875 z M 67.171875 120.25 L 69.84375 120.25 Q 71.328125 120.25 72.078125 120.921875 Q 72.828125 121.578125 72.828125 122.859375 Q 72.828125 124.15625 72.078125 124.828125 Q 71.328125 125.484375 69.84375 125.484375 L 68.359375 125.484375 L 68.359375 129 L 67.171875 129 L 67.171875 120.25 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 74.470703125 133.171875 L 76.095703125 133.171875 L 76.095703125 127.609375 L 74.330078125 127.953125 L 74.330078125 127.0625 L 76.080078125 126.703125 L 77.064453125 126.703125 L 77.064453125 133.171875 L 78.673828125 133.171875 L 78.673828125 134 L 74.470703125 134 L 74.470703125 133.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 158 283 C 158 284.65685424949237 156.65685424949237 286 155 286 C 153.34314575050763 286 152 284.65685424949237 152 283 C 152 281.34314575050763 153.34314575050763 280 155 280 C 156.65685424949237 280 158 281.34314575050763 158 283 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 158 283 C 158 284.65685424949237 156.65685424949237 286 155 286 C 153.34314575050763 286 152 284.65685424949237 152 283 C 152 281.34314575050763 153.34314575050763 280 155 280 C 156.65685424949237 280 158 281.34314575050763 158 283 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 160.171875 268.25 L 161.359375 268.25 L 161.359375 271.84375 L 165.65625 271.84375 L 165.65625 268.25 L 166.84375 268.25 L 166.84375 277 L 165.65625 277 L 165.65625 272.828125 L 161.359375 272.828125 L 161.359375 277 L 160.171875 277 L 160.171875 268.25 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 83 225 C 83 226.65685424949237 81.65685424949238 228 80 228 C 78.34314575050762 228 77 226.65685424949237 77 225 C 77 223.34314575050763 78.34314575050762 222 80 222 C 81.65685424949238 222 83 223.34314575050763 83 225 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 83 225 C 83 226.65685424949237 81.65685424949238 228 80 228 C 78.34314575050762 228 77 226.65685424949237 77 225 C 77 223.34314575050763 78.34314575050762 222 80 222 C 81.65685424949238 222 83 223.34314575050763 83 225 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 84.75 210.25 L 86.03125 210.25 L 88.203125 213.5 L 90.390625 210.25 L 91.65625 210.25 L 88.84375 214.453125 L 91.84375 219 L 90.578125 219 L 88.109375 215.28125 L 85.640625 219 L 84.359375 219 L 87.484375 214.328125 L 84.75 210.25 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 94.189453125 217.515625 L 94.189453125 220.265625 L 95.423828125 220.265625 Q 96.111328125 220.265625 96.486328125 219.90625 Q 96.876953125 219.546875 96.876953125 218.890625 Q 96.876953125 218.234375 96.486328125 217.875 Q 96.111328125 217.515625 95.423828125 217.515625 L 94.189453125 217.515625 z M 93.205078125 216.703125 L 95.423828125 216.703125 Q 96.658203125 216.703125 97.283203125 217.265625 Q 97.908203125 217.8125 97.908203125 218.890625 Q 97.908203125 219.96875 97.283203125 220.515625 Q 96.658203125 221.0625 95.423828125 221.0625 L 94.189453125 221.0625 L 94.189453125 224 L 93.205078125 224 L 93.205078125 216.703125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
</g><!-- layer0 -->
</g> <!-- default stroke -->
</svg> <!-- bounding box -->

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Binary file not shown.

View File

@ -1,338 +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="308px"
height="243px"
viewBox="0 0 308 243"
>
<title></title>
<desc>Creator: FreeHEP Graphics2D Driver Producer: geogebra.export.SVGExtensions Revision: 12753 Source: Date: Wednesday, December 27, 2017 4:17:43 PM EST</desc>
<g stroke-linejoin="miter" stroke-dashoffset="0" stroke-dasharray="none" stroke-width="1" stroke-miterlimit="10" stroke-linecap="square">
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#ffffff">
<path d="M 0 0 L 385 0 L 385 303 L 0 303 L 0 0 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 65.171875 205.359375 Q 64.421875 205.359375 64.03125 206.109375 Q 63.65625 206.859375 63.65625 208.359375 Q 63.65625 209.859375 64.03125 210.609375 Q 64.421875 211.359375 65.171875 211.359375 Q 65.953125 211.359375 66.328125 210.609375 Q 66.71875 209.859375 66.71875 208.359375 Q 66.71875 206.859375 66.328125 206.109375 Q 65.953125 205.359375 65.171875 205.359375 z M 65.171875 204.578125 Q 66.40625 204.578125 67.046875 205.546875 Q 67.703125 206.515625 67.703125 208.359375 Q 67.703125 210.203125 67.046875 211.171875 Q 66.40625 212.140625 65.171875 212.140625 Q 63.953125 212.140625 63.296875 211.171875 Q 62.65625 210.203125 62.65625 208.359375 Q 62.65625 206.515625 63.296875 205.546875 Q 63.953125 204.578125 65.171875 204.578125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 56.63336452454984 198.05787425931192 L 56.63336452454984 202.05787425931192"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 123.171875 205.359375 Q 122.421875 205.359375 122.03125 206.109375 Q 121.65625 206.859375 121.65625 208.359375 Q 121.65625 209.859375 122.03125 210.609375 Q 122.421875 211.359375 123.171875 211.359375 Q 123.953125 211.359375 124.328125 210.609375 Q 124.71875 209.859375 124.71875 208.359375 Q 124.71875 206.859375 124.328125 206.109375 Q 123.953125 205.359375 123.171875 205.359375 z M 123.171875 204.578125 Q 124.40625 204.578125 125.046875 205.546875 Q 125.703125 206.515625 125.703125 208.359375 Q 125.703125 210.203125 125.046875 211.171875 Q 124.40625 212.140625 123.171875 212.140625 Q 121.953125 212.140625 121.296875 211.171875 Q 120.65625 210.203125 120.65625 208.359375 Q 120.65625 206.515625 121.296875 205.546875 Q 121.953125 204.578125 123.171875 204.578125 z M 127.4248046875 210.765625 L 128.4560546875 210.765625 L 128.4560546875 212 L 127.4248046875 212 L 127.4248046875 210.765625 z M 130.619140625 204.703125 L 134.494140625 204.703125 L 134.494140625 205.546875 L 131.525390625 205.546875 L 131.525390625 207.328125 Q 131.744140625 207.25 131.947265625 207.21875 Q 132.166015625 207.1875 132.384765625 207.1875 Q 133.603515625 207.1875 134.306640625 207.859375 Q 135.025390625 208.515625 135.025390625 209.65625 Q 135.025390625 210.84375 134.291015625 211.5 Q 133.572265625 212.140625 132.228515625 212.140625 Q 131.775390625 212.140625 131.291015625 212.0625 Q 130.822265625 211.984375 130.306640625 211.828125 L 130.306640625 210.84375 Q 130.759765625 211.078125 131.228515625 211.203125 Q 131.697265625 211.3125 132.212890625 211.3125 Q 133.056640625 211.3125 133.541015625 210.875 Q 134.041015625 210.421875 134.041015625 209.65625 Q 134.041015625 208.90625 133.541015625 208.46875 Q 133.056640625 208.015625 132.212890625 208.015625 Q 131.822265625 208.015625 131.416015625 208.109375 Q 131.025390625 208.1875 130.619140625 208.375 L 130.619140625 204.703125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 127.30951231601955 198.05787425931192 L 127.30951231601955 202.05787425931192"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 196.234375 211.171875 L 197.859375 211.171875 L 197.859375 205.609375 L 196.09375 205.953125 L 196.09375 205.0625 L 197.84375 204.703125 L 198.828125 204.703125 L 198.828125 211.171875 L 200.4375 211.171875 L 200.4375 212 L 196.234375 212 L 196.234375 211.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 197.98566010748925 198.05787425931192 L 197.98566010748925 202.05787425931192"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 262.234375 211.171875 L 263.859375 211.171875 L 263.859375 205.609375 L 262.09375 205.953125 L 262.09375 205.0625 L 263.84375 204.703125 L 264.828125 204.703125 L 264.828125 211.171875 L 266.4375 211.171875 L 266.4375 212 L 262.234375 212 L 262.234375 211.171875 z M 268.4248046875 210.765625 L 269.4560546875 210.765625 L 269.4560546875 212 L 268.4248046875 212 L 268.4248046875 210.765625 z M 271.619140625 204.703125 L 275.494140625 204.703125 L 275.494140625 205.546875 L 272.525390625 205.546875 L 272.525390625 207.328125 Q 272.744140625 207.25 272.947265625 207.21875 Q 273.166015625 207.1875 273.384765625 207.1875 Q 274.603515625 207.1875 275.306640625 207.859375 Q 276.025390625 208.515625 276.025390625 209.65625 Q 276.025390625 210.84375 275.291015625 211.5 Q 274.572265625 212.140625 273.228515625 212.140625 Q 272.775390625 212.140625 272.291015625 212.0625 Q 271.822265625 211.984375 271.306640625 211.828125 L 271.306640625 210.84375 Q 271.759765625 211.078125 272.228515625 211.203125 Q 272.697265625 211.3125 273.212890625 211.3125 Q 274.056640625 211.3125 274.541015625 210.875 Q 275.041015625 210.421875 275.041015625 209.65625 Q 275.041015625 208.90625 274.541015625 208.46875 Q 274.056640625 208.015625 273.212890625 208.015625 Q 272.822265625 208.015625 272.416015625 208.109375 Q 272.025390625 208.1875 271.619140625 208.375 L 271.619140625 204.703125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 268.66180789895895 198.05787425931192 L 268.66180789895895 202.05787425931192"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 338.921875 211.171875 L 342.359375 211.171875 L 342.359375 212 L 337.734375 212 L 337.734375 211.171875 Q 338.296875 210.59375 339.265625 209.609375 Q 340.234375 208.625 340.484375 208.34375 Q 340.953125 207.8125 341.140625 207.453125 Q 341.328125 207.078125 341.328125 206.71875 Q 341.328125 206.140625 340.921875 205.78125 Q 340.515625 205.40625 339.859375 205.40625 Q 339.390625 205.40625 338.875 205.578125 Q 338.375 205.734375 337.78125 206.0625 L 337.78125 205.0625 Q 338.375 204.828125 338.890625 204.703125 Q 339.40625 204.578125 339.84375 204.578125 Q 340.96875 204.578125 341.640625 205.140625 Q 342.328125 205.703125 342.328125 206.65625 Q 342.328125 207.109375 342.15625 207.515625 Q 341.984375 207.90625 341.546875 208.453125 Q 341.421875 208.59375 340.765625 209.28125 Q 340.109375 209.953125 338.921875 211.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 339.33795569042866 198.05787425931192 L 339.33795569042866 202.05787425931192"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 0 198.05787425931192 L 383 198.05787425931192"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 384 198.55787425931192 L 381 195.05787425931192"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 384 197.55787425931192 L 381 201.05787425931192"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 31.484375 268.859375 L 34.125 268.859375 L 34.125 269.65625 L 31.484375 269.65625 L 31.484375 268.859375 z M 37.7802734375 265.359375 Q 37.0302734375 265.359375 36.6396484375 266.109375 Q 36.2646484375 266.859375 36.2646484375 268.359375 Q 36.2646484375 269.859375 36.6396484375 270.609375 Q 37.0302734375 271.359375 37.7802734375 271.359375 Q 38.5615234375 271.359375 38.9365234375 270.609375 Q 39.3271484375 269.859375 39.3271484375 268.359375 Q 39.3271484375 266.859375 38.9365234375 266.109375 Q 38.5615234375 265.359375 37.7802734375 265.359375 z M 37.7802734375 264.578125 Q 39.0146484375 264.578125 39.6552734375 265.546875 Q 40.3115234375 266.515625 40.3115234375 268.359375 Q 40.3115234375 270.203125 39.6552734375 271.171875 Q 39.0146484375 272.140625 37.7802734375 272.140625 Q 36.5615234375 272.140625 35.9052734375 271.171875 Q 35.2646484375 270.203125 35.2646484375 268.359375 Q 35.2646484375 266.515625 35.9052734375 265.546875 Q 36.5615234375 264.578125 37.7802734375 264.578125 z M 42.033203125 270.765625 L 43.064453125 270.765625 L 43.064453125 272 L 42.033203125 272 L 42.033203125 270.765625 z M 45.2275390625 264.703125 L 49.1025390625 264.703125 L 49.1025390625 265.546875 L 46.1337890625 265.546875 L 46.1337890625 267.328125 Q 46.3525390625 267.25 46.5556640625 267.21875 Q 46.7744140625 267.1875 46.9931640625 267.1875 Q 48.2119140625 267.1875 48.9150390625 267.859375 Q 49.6337890625 268.515625 49.6337890625 269.65625 Q 49.6337890625 270.84375 48.8994140625 271.5 Q 48.1806640625 272.140625 46.8369140625 272.140625 Q 46.3837890625 272.140625 45.8994140625 272.0625 Q 45.4306640625 271.984375 44.9150390625 271.828125 L 44.9150390625 270.84375 Q 45.3681640625 271.078125 45.8369140625 271.203125 Q 46.3056640625 271.3125 46.8212890625 271.3125 Q 47.6650390625 271.3125 48.1494140625 270.875 Q 48.6494140625 270.421875 48.6494140625 269.65625 Q 48.6494140625 268.90625 48.1494140625 268.46875 Q 47.6650390625 268.015625 46.8212890625 268.015625 Q 46.4306640625 268.015625 46.0244140625 268.109375 Q 45.6337890625 268.1875 45.2275390625 268.375 L 45.2275390625 264.703125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 52.63336452454984 268.73402205078196 L 56.63336452454984 268.73402205078196"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 47.171875 189.359375 Q 46.421875 189.359375 46.03125 190.109375 Q 45.65625 190.859375 45.65625 192.359375 Q 45.65625 193.859375 46.03125 194.609375 Q 46.421875 195.359375 47.171875 195.359375 Q 47.953125 195.359375 48.328125 194.609375 Q 48.71875 193.859375 48.71875 192.359375 Q 48.71875 190.859375 48.328125 190.109375 Q 47.953125 189.359375 47.171875 189.359375 z M 47.171875 188.578125 Q 48.40625 188.578125 49.046875 189.546875 Q 49.703125 190.515625 49.703125 192.359375 Q 49.703125 194.203125 49.046875 195.171875 Q 48.40625 196.140625 47.171875 196.140625 Q 45.953125 196.140625 45.296875 195.171875 Q 44.65625 194.203125 44.65625 192.359375 Q 44.65625 190.515625 45.296875 189.546875 Q 45.953125 188.578125 47.171875 188.578125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 52.63336452454984 198.05787425931194 L 56.63336452454984 198.05787425931194"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 37.171875 124.359375 Q 36.421875 124.359375 36.03125 125.109375 Q 35.65625 125.859375 35.65625 127.359375 Q 35.65625 128.859375 36.03125 129.609375 Q 36.421875 130.359375 37.171875 130.359375 Q 37.953125 130.359375 38.328125 129.609375 Q 38.71875 128.859375 38.71875 127.359375 Q 38.71875 125.859375 38.328125 125.109375 Q 37.953125 124.359375 37.171875 124.359375 z M 37.171875 123.578125 Q 38.40625 123.578125 39.046875 124.546875 Q 39.703125 125.515625 39.703125 127.359375 Q 39.703125 129.203125 39.046875 130.171875 Q 38.40625 131.140625 37.171875 131.140625 Q 35.953125 131.140625 35.296875 130.171875 Q 34.65625 129.203125 34.65625 127.359375 Q 34.65625 125.515625 35.296875 124.546875 Q 35.953125 123.578125 37.171875 123.578125 z M 41.4248046875 129.765625 L 42.4560546875 129.765625 L 42.4560546875 131 L 41.4248046875 131 L 41.4248046875 129.765625 z M 44.619140625 123.703125 L 48.494140625 123.703125 L 48.494140625 124.546875 L 45.525390625 124.546875 L 45.525390625 126.328125 Q 45.744140625 126.25 45.947265625 126.21875 Q 46.166015625 126.1875 46.384765625 126.1875 Q 47.603515625 126.1875 48.306640625 126.859375 Q 49.025390625 127.515625 49.025390625 128.65625 Q 49.025390625 129.84375 48.291015625 130.5 Q 47.572265625 131.140625 46.228515625 131.140625 Q 45.775390625 131.140625 45.291015625 131.0625 Q 44.822265625 130.984375 44.306640625 130.828125 L 44.306640625 129.84375 Q 44.759765625 130.078125 45.228515625 130.203125 Q 45.697265625 130.3125 46.212890625 130.3125 Q 47.056640625 130.3125 47.541015625 129.875 Q 48.041015625 129.421875 48.041015625 128.65625 Q 48.041015625 127.90625 47.541015625 127.46875 Q 47.056640625 127.015625 46.212890625 127.015625 Q 45.822265625 127.015625 45.416015625 127.109375 Q 45.025390625 127.1875 44.619140625 127.375 L 44.619140625 123.703125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 52.63336452454984 127.38172646784193 L 56.63336452454984 127.38172646784193"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 45.234375 59.171875 L 46.859375 59.171875 L 46.859375 53.609375 L 45.09375 53.953125 L 45.09375 53.0625 L 46.84375 52.703125 L 47.828125 52.703125 L 47.828125 59.171875 L 49.4375 59.171875 L 49.4375 60 L 45.234375 60 L 45.234375 59.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 52.63336452454984 56.705578676371914 L 56.63336452454984 56.705578676371914"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 56.63336452454984 2 L 56.63336452454984 303"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 57.13336452454984 1 L 53.63336452454984 4"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 56.13336452454984 1 L 59.63336452454984 4"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g id="misc">
</g><!-- misc -->
<g id="layer0">
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 296.9322670155468 198.05787425931192 C 296.9322670155468 252.70457630213457 252.63236215031168 297.00448116736993 197.98566010748925 297.00448116736993 C 143.33895806466683 297.00448116736993 99.03905319943168 252.70457630213457 99.03905319943168 198.05787425931192 C 99.03905319943168 143.41117221648926 143.33895806466683 99.1112673512539 197.98566010748925 99.1112673512539 C 252.63236215031168 99.1112673512539 296.9322670155468 143.41117221648926 296.9322670155468 198.05787425931192 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 33 22 L 133 22"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 50 22 C 50 23.65685424949238 48.65685424949238 25 47 25 C 45.34314575050762 25 44 23.65685424949238 44 22 C 44 20.34314575050762 45.34314575050762 19 47 19 C 48.65685424949238 19 50 20.34314575050762 50 22 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 50 22 C 50 23.65685424949238 48.65685424949238 25 47 25 C 45.34314575050762 25 44 23.65685424949238 44 22 C 44 20.34314575050762 45.34314575050762 19 47 19 C 48.65685424949238 19 50 20.34314575050762 50 22 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 9.9375 33.4375 Q 9.75 33.34375 9.53125 33.296875 Q 9.328125 33.234375 9.0625 33.234375 Q 8.15625 33.234375 7.65625 33.828125 Q 7.171875 34.421875 7.171875 35.546875 L 7.171875 39 L 6.09375 39 L 6.09375 32.4375 L 7.171875 32.4375 L 7.171875 33.453125 Q 7.515625 32.859375 8.0625 32.578125 Q 8.609375 32.28125 9.390625 32.28125 Q 9.5 32.28125 9.625 32.296875 Q 9.765625 32.3125 9.921875 32.34375 L 9.9375 33.4375 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 11.16796875 43.171875 L 12.79296875 43.171875 L 12.79296875 37.609375 L 11.02734375 37.953125 L 11.02734375 37.0625 L 12.77734375 36.703125 L 13.76171875 36.703125 L 13.76171875 43.171875 L 15.37109375 43.171875 L 15.37109375 44 L 11.16796875 44 L 11.16796875 43.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
<path d="M 21.3759765625 33.546875 L 28.8916015625 33.546875 L 28.8916015625 34.53125 L 21.3759765625 34.53125 L 21.3759765625 33.546875 z M 21.3759765625 35.9375 L 28.8916015625 35.9375 L 28.8916015625 36.9375 L 21.3759765625 36.9375 L 21.3759765625 35.9375 z M 37.7919921875 31.03125 Q 36.8857421875 31.03125 36.4169921875 31.9375 Q 35.9638671875 32.828125 35.9638671875 34.640625 Q 35.9638671875 36.4375 36.4169921875 37.34375 Q 36.8857421875 38.234375 37.7919921875 38.234375 Q 38.7138671875 38.234375 39.1669921875 37.34375 Q 39.6357421875 36.4375 39.6357421875 34.640625 Q 39.6357421875 32.828125 39.1669921875 31.9375 Q 38.7138671875 31.03125 37.7919921875 31.03125 z M 37.7919921875 30.09375 Q 39.2607421875 30.09375 40.0419921875 31.265625 Q 40.8232421875 32.421875 40.8232421875 34.640625 Q 40.8232421875 36.84375 40.0419921875 38.015625 Q 39.2607421875 39.171875 37.7919921875 39.171875 Q 36.3232421875 39.171875 35.5419921875 38.015625 Q 34.7763671875 36.84375 34.7763671875 34.640625 Q 34.7763671875 32.421875 35.5419921875 31.265625 Q 36.3232421875 30.09375 37.7919921875 30.09375 z M 42.8955078125 37.515625 L 44.1298828125 37.515625 L 44.1298828125 39 L 42.8955078125 39 L 42.8955078125 37.515625 z M 46.4130859375 30.25 L 52.0380859375 30.25 L 52.0380859375 30.75 L 48.8662109375 39 L 47.6318359375 39 L 50.6162109375 31.25 L 46.4130859375 31.25 L 46.4130859375 30.25 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="0.10196078568696976" fill-rule="nonzero" stroke="none" fill="#006400">
<path d="M 148.8255615234375 130.73641967773438 L 131.6938018798828 143.2465362548828 L 144.20391845703125 160.3782958984375 L 161.33566284179688 147.86817932128906 L 148.8255615234375 130.73641967773438"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#006400">
<path d="M 148.8255615234375 130.73641967773438 L 131.6938018798828 143.2465362548828 L 144.20391845703125 160.3782958984375 L 161.33566284179688 147.86817932128906 L 148.8255615234375 130.73641967773438"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 56.63336452454984 198.05787425931192 L 385 -41.72509929585516"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 148.82555735449304 130.73642394409598 L 197.98566010748925 198.05787425931192"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 232.00000000000009 70 L 232.00000000000009 198.05787425931192"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 201 198 C 201 199.65685424949237 199.65685424949237 201 198 201 C 196.34314575050763 201 195 199.65685424949237 195 198 C 195 196.34314575050763 196.34314575050763 195 198 195 C 199.65685424949237 195 201 196.34314575050763 201 198 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 201 198 C 201 199.65685424949237 199.65685424949237 201 198 201 C 196.34314575050763 201 195 199.65685424949237 195 198 C 195 196.34314575050763 196.34314575050763 195 198 195 C 199.65685424949237 195 201 196.34314575050763 201 198 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 209.734375 183.921875 L 209.734375 185.171875 Q 209.125 184.609375 208.453125 184.34375 Q 207.78125 184.0625 207.015625 184.0625 Q 205.515625 184.0625 204.71875 184.984375 Q 203.921875 185.90625 203.921875 187.640625 Q 203.921875 189.359375 204.71875 190.28125 Q 205.515625 191.203125 207.015625 191.203125 Q 207.78125 191.203125 208.453125 190.921875 Q 209.125 190.640625 209.734375 190.09375 L 209.734375 191.328125 Q 209.109375 191.75 208.40625 191.96875 Q 207.71875 192.171875 206.953125 192.171875 Q 204.953125 192.171875 203.8125 190.953125 Q 202.671875 189.734375 202.671875 187.640625 Q 202.671875 185.53125 203.8125 184.3125 Q 204.953125 183.09375 206.953125 183.09375 Q 207.734375 183.09375 208.421875 183.3125 Q 209.125 183.515625 209.734375 183.921875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 211.61328125 196.171875 L 213.23828125 196.171875 L 213.23828125 190.609375 L 211.47265625 190.953125 L 211.47265625 190.0625 L 213.22265625 189.703125 L 214.20703125 189.703125 L 214.20703125 196.171875 L 215.81640625 196.171875 L 215.81640625 197 L 211.61328125 197 L 211.61328125 196.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 235 70 C 235 71.65685424949238 233.65685424949237 73 232 73 C 230.34314575050763 73 229 71.65685424949238 229 70 C 229 68.34314575050762 230.34314575050763 67 232 67 C 233.65685424949237 67 235 68.34314575050762 235 70 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 235 70 C 235 71.65685424949238 233.65685424949237 73 232 73 C 230.34314575050763 73 229 71.65685424949238 229 70 C 229 68.34314575050762 230.34314575050763 67 232 67 C 233.65685424949237 67 235 68.34314575050762 235 70 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
<path d="M 238.359375 56.21875 L 238.359375 59.515625 L 239.84375 59.515625 Q 240.671875 59.515625 241.125 59.09375 Q 241.578125 58.65625 241.578125 57.859375 Q 241.578125 57.078125 241.125 56.65625 Q 240.671875 56.21875 239.84375 56.21875 L 238.359375 56.21875 z M 237.171875 55.25 L 239.84375 55.25 Q 241.328125 55.25 242.078125 55.921875 Q 242.828125 56.578125 242.828125 57.859375 Q 242.828125 59.15625 242.078125 59.828125 Q 241.328125 60.484375 239.84375 60.484375 L 238.359375 60.484375 L 238.359375 64 L 237.171875 64 L 237.171875 55.25 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 60 198 C 60 199.65685424949237 58.65685424949238 201 57 201 C 55.34314575050762 201 54 199.65685424949237 54 198 C 54 196.34314575050763 55.34314575050762 195 57 195 C 58.65685424949238 195 60 196.34314575050763 60 198 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 60 198 C 60 199.65685424949237 58.65685424949238 201 57 201 C 55.34314575050762 201 54 199.65685424949237 54 198 C 54 196.34314575050763 55.34314575050762 195 57 195 C 58.65685424949238 195 60 196.34314575050763 60 198 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 68.734375 183.921875 L 68.734375 185.171875 Q 68.125 184.609375 67.453125 184.34375 Q 66.78125 184.0625 66.015625 184.0625 Q 64.515625 184.0625 63.71875 184.984375 Q 62.921875 185.90625 62.921875 187.640625 Q 62.921875 189.359375 63.71875 190.28125 Q 64.515625 191.203125 66.015625 191.203125 Q 66.78125 191.203125 67.453125 190.921875 Q 68.125 190.640625 68.734375 190.09375 L 68.734375 191.328125 Q 68.109375 191.75 67.40625 191.96875 Q 66.71875 192.171875 65.953125 192.171875 Q 63.953125 192.171875 62.8125 190.953125 Q 61.671875 189.734375 61.671875 187.640625 Q 61.671875 185.53125 62.8125 184.3125 Q 63.953125 183.09375 65.953125 183.09375 Q 66.734375 183.09375 67.421875 183.3125 Q 68.125 183.515625 68.734375 183.921875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 73.09765625 189.40625 L 73.09765625 190.15625 L 72.23828125 190.15625 Q 71.75390625 190.15625 71.56640625 190.359375 Q 71.37890625 190.546875 71.37890625 191.046875 L 71.37890625 191.53125 L 72.84765625 191.53125 L 72.84765625 192.234375 L 71.37890625 192.234375 L 71.37890625 197 L 70.47265625 197 L 70.47265625 192.234375 L 69.61328125 192.234375 L 69.61328125 191.53125 L 70.47265625 191.53125 L 70.47265625 191.15625 Q 70.47265625 190.234375 70.89453125 189.828125 Q 71.31640625 189.40625 72.23828125 189.40625 L 73.09765625 189.40625 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 195 99 C 195 100.65685424949238 193.65685424949237 102 192 102 C 190.34314575050763 102 189 100.65685424949238 189 99 C 189 97.34314575050762 190.34314575050763 96 192 96 C 193.65685424949237 96 195 97.34314575050762 195 99 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 195 99 C 195 100.65685424949238 193.65685424949237 102 192 102 C 190.34314575050763 102 189 100.65685424949238 189 99 C 189 97.34314575050762 190.34314575050763 96 192 96 C 193.65685424949237 96 195 97.34314575050762 195 99 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 198.359375 85.21875 L 198.359375 88.515625 L 199.84375 88.515625 Q 200.671875 88.515625 201.125 88.09375 Q 201.578125 87.65625 201.578125 86.859375 Q 201.578125 86.078125 201.125 85.65625 Q 200.671875 85.21875 199.84375 85.21875 L 198.359375 85.21875 z M 197.171875 84.25 L 199.84375 84.25 Q 201.328125 84.25 202.078125 84.921875 Q 202.828125 85.578125 202.828125 86.859375 Q 202.828125 88.15625 202.078125 88.828125 Q 201.328125 89.484375 199.84375 89.484375 L 198.359375 89.484375 L 198.359375 93 L 197.171875 93 L 197.171875 84.25 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 204.470703125 97.171875 L 206.095703125 97.171875 L 206.095703125 91.609375 L 204.330078125 91.953125 L 204.330078125 91.0625 L 206.080078125 90.703125 L 207.064453125 90.703125 L 207.064453125 97.171875 L 208.673828125 97.171875 L 208.673828125 98 L 204.470703125 98 L 204.470703125 97.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 109 162 C 109 163.65685424949237 107.65685424949238 165 106 165 C 104.34314575050762 165 103 163.65685424949237 103 162 C 103 160.34314575050763 104.34314575050762 159 106 159 C 107.65685424949238 159 109 160.34314575050763 109 162 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 109 162 C 109 163.65685424949237 107.65685424949238 165 106 165 C 104.34314575050762 165 103 163.65685424949237 103 162 C 103 160.34314575050763 104.34314575050762 159 106 159 C 107.65685424949238 159 109 160.34314575050763 109 162 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 112.359375 148.21875 L 112.359375 151.515625 L 113.84375 151.515625 Q 114.671875 151.515625 115.125 151.09375 Q 115.578125 150.65625 115.578125 149.859375 Q 115.578125 149.078125 115.125 148.65625 Q 114.671875 148.21875 113.84375 148.21875 L 112.359375 148.21875 z M 111.171875 147.25 L 113.84375 147.25 Q 115.328125 147.25 116.078125 147.921875 Q 116.828125 148.578125 116.828125 149.859375 Q 116.828125 151.15625 116.078125 151.828125 Q 115.328125 152.484375 113.84375 152.484375 L 112.359375 152.484375 L 112.359375 156 L 111.171875 156 L 111.171875 147.25 z M 119.595703125 148.21875 L 119.595703125 151.515625 L 121.080078125 151.515625 Q 121.908203125 151.515625 122.361328125 151.09375 Q 122.814453125 150.65625 122.814453125 149.859375 Q 122.814453125 149.078125 122.361328125 148.65625 Q 121.908203125 148.21875 121.080078125 148.21875 L 119.595703125 148.21875 z M 118.408203125 147.25 L 121.080078125 147.25 Q 122.564453125 147.25 123.314453125 147.921875 Q 124.064453125 148.578125 124.064453125 149.859375 Q 124.064453125 151.15625 123.314453125 151.828125 Q 122.564453125 152.484375 121.080078125 152.484375 L 119.595703125 152.484375 L 119.595703125 156 L 118.408203125 156 L 118.408203125 147.25 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 125.70703125 160.171875 L 127.33203125 160.171875 L 127.33203125 154.609375 L 125.56640625 154.953125 L 125.56640625 154.0625 L 127.31640625 153.703125 L 128.30078125 153.703125 L 128.30078125 160.171875 L 129.91015625 160.171875 L 129.91015625 161 L 125.70703125 161 L 125.70703125 160.171875 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 152 131 C 152 132.65685424949237 150.65685424949237 134 149 134 C 147.34314575050763 134 146 132.65685424949237 146 131 C 146 129.34314575050763 147.34314575050763 128 149 128 C 150.65685424949237 128 152 129.34314575050763 152 131 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 152 131 C 152 132.65685424949237 150.65685424949237 134 149 134 C 147.34314575050763 134 146 132.65685424949237 146 131 C 146 129.34314575050763 147.34314575050763 128 149 128 C 150.65685424949237 128 152 129.34314575050763 152 131 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 154.171875 116.25 L 155.359375 116.25 L 155.359375 119.84375 L 159.65625 119.84375 L 159.65625 116.25 L 160.84375 116.25 L 160.84375 125 L 159.65625 125 L 159.65625 120.828125 L 155.359375 120.828125 L 155.359375 125 L 154.171875 125 L 154.171875 116.25 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 235 198 C 235 199.65685424949237 233.65685424949237 201 232 201 C 230.34314575050763 201 229 199.65685424949237 229 198 C 229 196.34314575050763 230.34314575050763 195 232 195 C 233.65685424949237 195 235 196.34314575050763 235 198 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
<path d="M 235 198 C 235 199.65685424949237 233.65685424949237 201 232 201 C 230.34314575050763 201 229 199.65685424949237 229 198 C 229 196.34314575050763 230.34314575050763 195 232 195 C 233.65685424949237 195 235 196.34314575050763 235 198 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 236.75 183.25 L 238.03125 183.25 L 240.203125 186.5 L 242.390625 183.25 L 243.65625 183.25 L 240.84375 187.453125 L 243.84375 192 L 242.578125 192 L 240.109375 188.28125 L 237.640625 192 L 236.359375 192 L 239.484375 187.328125 L 236.75 183.25 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
<path d="M 246.189453125 190.515625 L 246.189453125 193.265625 L 247.423828125 193.265625 Q 248.111328125 193.265625 248.486328125 192.90625 Q 248.876953125 192.546875 248.876953125 191.890625 Q 248.876953125 191.234375 248.486328125 190.875 Q 248.111328125 190.515625 247.423828125 190.515625 L 246.189453125 190.515625 z M 245.205078125 189.703125 L 247.423828125 189.703125 Q 248.658203125 189.703125 249.283203125 190.265625 Q 249.908203125 190.8125 249.908203125 191.890625 Q 249.908203125 192.96875 249.283203125 193.515625 Q 248.658203125 194.0625 247.423828125 194.0625 L 246.189453125 194.0625 L 246.189453125 197 L 245.205078125 197 L 245.205078125 189.703125 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
</g><!-- layer0 -->
</g> <!-- default stroke -->
</svg> <!-- bounding box -->

Before

Width:  |  Height:  |  Size: 38 KiB

View File

@ -1,4 +0,0 @@
Design Documents
================
Public design documents for major efforts in Skia

View File

@ -1,512 +0,0 @@
PDF Theory of Operation
=======================
<!--
PRE-GIT DOCUMENT VERSION HISTORY
2012-06-25 Steve VanDeBogart
* Original version
2015-01-14 Hal Canary.
* Add section "Using the PDF backend"
* Markdown formatting
-->
Internally, SkPDFDocument and SkPDFDevice represents PDF documents and
pages. This document describes how the backend operates, but **these
interfaces are not part of the public API and are subject to perpetual
change.**
See [Using Skia's PDF Backend](../../user/sample/pdf) to find out how
to use SkPDF as a client calling Skia's public API.
* * *
### Contents ###
* [Typical usage of the PDF backend](#Typical_usage_of_the_PDF_backend)
* [PDF Objects and Document Structure](#PDF_Objects_and_Document_Structure)
* [PDF drawing](#PDF_drawing)
* [Interned objects](#Interned_objects)
* [Graphic States](#Graphic_States)
* [Clip and Transform](#Clip_and_Transform)
* [Generating a content stream](#Generating_a_content_stream)
* [Drawing details](#Drawing_details)
+ [Layers](#Layers)
+ [Fonts](#Fonts)
+ [Shaders](#Shaders)
+ [Xfer modes](#Xfer_modes)
* [Known issues](#Known_issues)
<span id="Typical_usage_of_the_PDF_backend">Typical usage of the PDF backend</span>
-----------------------------------------------------------------------------------
SkPDFDevice is the main interface to the PDF backend. This child of
SkDevice can be set on an SkCanvas and drawn to. Once drawing to
the canvas is complete (SkDocument::onEndPage() is called), the
device's content and resouces are added to the SkPDFDocument that owns
the device. A new SkPDFDevice should be created for each page or
layer desired in the document. After all the pages have been added to
the document, `SkPDFDocument::onClose()` is called to finish
serializing the PDF file.
<span id="PDF_Objects_and_Document_Structure">PDF Objects and Document Structure</span>
---------------------------------------------------------------------------------------
![PDF Logical Document Structure](/dev/design/PdfLogicalDocumentStructure.png)
**Background**: The PDF file format has a header, a set of objects and
then a footer that contains a table of contents for all of the objects
in the document (the cross-reference table). The table of contents
lists the specific byte position for each object. The objects may have
references to other objects and the ASCII size of those references is
dependent on the object number assigned to the referenced object;
therefore we can't calculate the table of contents until the size of
objects is known, which requires assignment of object numbers. The
document uses SkWStream::bytesWritten() to query the offsets of each
object and build the cross-reference table.
Furthermore, PDF files can support a *linearized* mode, where objects
are in a specific order so that pdf-viewers can more easily retrieve
just the objects they need to display a specific page, i.e. by
byte-range requests over the web. Linearization also requires that all
objects used or referenced on the first page of the PDF have object
numbers before the rest of the objects. Consequently, before
generating a linearized PDF, all objects, their sizes, and object
references must be known. Skia has no plans to implement linearized
PDFs.
%PDF-1.4
…objects...
xref
0 31 % Total number of entries in the table of contents.
0000000000 65535 f
0000210343 00000 n
0000117055 00000 n
trailer
<</Size 31 /Root 1 0 R>>
startxref
210399 % Byte offset to the start of the table of contents.
%%EOF
The the virtual class SkPDFObject are used to
manage the needs of the file format. Any object that will represent a
PDF object must inherit from SkPDFObject and implement the methods to
generate the binary representation and report any other SkPDFObjects
used as resources. SkPDFTypes.h defines most of the basic PDF object
types: bool, int, scalar, string, name, array, dictionary, and stream.
(A stream is a dictionary containing at least a Length entry followed
by the data of the stream.)
Streams are now handled in a slightly different way. The SkPDFStreamOut()
function compresses and serializes the binary data immediately instead of
creating a new object.
All of these PDF object types except the stream type can be used in
both a direct and an indirect fashion, i.e. an array can have an int
or a dictionary as an inline entry, which does not require an object
number. The stream type, cannot be inlined and must be referred to
with an object reference. Most of the time, other objects types can be
referred to with an object reference, but there are specific rules in
the PDF specification that requires an inline reference in some place
or an indirect reference in other places. All indirect objects must
have an object number assigned.
* **bools**: `true` `false`
* **ints**: `42` `0` `-1`
* **scalars**: `0.001`
* **strings**: `(strings are in parentheses or byte encoded)` `<74657374>`
* **name**: `/Name` `/Name#20with#20spaces`
* **array**: `[/Foo 42 (arrays can contain multiple types)]`
* **dictionary**: `<</Key1 (value1) /key2 42>>`
* **indirect object**:
`5 0 obj
(An indirect string. Indirect objects have an object number and a
generation number, Skia always uses generation 0 objects)
endobj`
* **object reference**: `5 0 R`
* **stream**: `<</Length 56>>
stream
...stream contents can be arbitrary, including binary...
endstream`
Indirect objects are either:
- Serialized as soon as they are needed, and a new SkPDFIndirectReference is
returned, or
- Serialized later, but reserve a document-unique SkPDFIndirectReference to
allow other objects to refer to it.
Example document:
%PDF-1.4
2 0 obj <<
/Type /Catalog
/Pages 1 0 R
>>
endobj
3 0 obj <<
/Type /Page
/Parent 1 0 R
/Resources <>
/MediaBox [0 0 612 792]
/Contents 4 0 R
>>
endobj
4 0 obj <> stream
endstream
endobj
1 0 obj <<
/Type /Pages
/Kids [3 0 R]
/Count 1
>>
endobj
xref
0 5
0000000000 65535 f
0000000236 00000 n
0000000009 00000 n
0000000062 00000 n
0000000190 00000 n
trailer
<</Size 5 /Root 2 0 R>>
startxref
299
%%EOF
<span id="PDF_drawing">PDF drawing</span>
-----------------------------------------
Most drawing in PDF is specified by the text of a stream, referred to
as a content stream. The syntax of the content stream is different
than the syntax of the file format described above and is much closer
to PostScript in nature. The commands in the content stream tell the
PDF interpreter to draw things, like a rectangle (`x y w h re`), an
image, or text, or to do meta operations like set the drawing color,
apply a transform to the drawing coordinates, or clip future drawing
operations. The page object that references a content stream has a
list of resources that can be used in the content stream using the
dictionary name to reference the resources. Resources are things like
font objects, images objects, graphic state objects (a set of meta
operations like miter limit, line width, etc). Because of a mismatch
between Skia and PDFs support for transparency (which will be
explained later), SkPDFDevice records each drawing operation into an
internal structure (ContentEntry) and only when the content stream is
needed does it flatten that list of structures into the final content
stream.
4 0 obj <<
/Type /Page
/Resources <<
/Font <</F1 9 0 R>>
/XObject <</Image1 22 0 R /Image2 73 0 R>>
>>
/Content 5 0 R
>> endobj
5 0 obj <</Length 227>> stream
% In the font specified in object 9 and a height
% of 12 points, at (72, 96) draw Hello World.
BT
/F1 12 Tf
72 96 Td
(Hello World) Tj
ET
% Draw a filled rectange.
200 96 72 72 re B
...
endstream
endobj
<span id="Interned_objects">Interned objects</span>
---------------------------------------------------
There are a number of high level PDF objects (like fonts, graphic
states, etc) that are likely to be referenced multiple times in a
single PDF. To ensure that there is only one copy of each object,
the SkPDFDocument holds on to a mapping from type-specific keys onto the
SkPDFIndirectReference for these objects.
<span id="Graphic_States">Graphic States</span>
-----------------------------------------------
PDF has a number of parameters that affect how things are drawn. The
ones that correspond to drawing options in Skia are: color, alpha,
line cap, line join type, line width, miter limit, and xfer/blend mode
(see later section for xfer modes). With the exception of color, these
can all be specified in a single pdf object, represented by the
SkPDFGraphicState class. A simple command in the content stream can
then set the drawing parameters to the values specified in that
graphic state object. PDF does not allow specifying color in the
graphic state object, instead it must be specified directly in the
content stream. Similarly the current font and font size are set
directly in the content stream.
6 0 obj <<
/Type /ExtGState
/CA 1 % Opaque - alpha = 1
/LC 0 % Butt linecap
/LJ 0 % Miter line-join
/LW 2 % Line width of 2
/ML 6 % Miter limit of 6
/BM /Normal % Blend mode is normal i.e. source over
>>
endobj
<span id="Clip_and_Transform">Clip and Transform</span>
-------------------------------------------------------
Similar to Skia, PDF allows drawing to be clipped or
transformed. However, there are a few caveats that affect the design
of the PDF backend. PDF does not support perspective transforms
(perspective transform are treated as identity transforms). Clips,
however, have more issues to cotend with. PDF clips cannot be directly
unapplied or expanded. i.e. once an area has been clipped off, there
is no way to draw to it. However, PDF provides a limited depth stack
for the PDF graphic state (which includes the drawing parameters
mentioned above in the Graphic States section as well as the clip and
transform). Therefore to undo a clip, the PDF graphic state must be
pushed before the clip is applied, then popped to revert to the state
of the graphic state before the clip was applied.
As the canvas makes drawing calls into SkPDFDevice, the active
transform, clip region, and clip stack are stored in a ContentEntry
structure. Later, when the ContentEntry structures are flattened into
a valid PDF content stream, the transforms and clips are compared to
decide on an efficient set of operations to transition between the
states needed. Currently, a local optimization is used, to figure out
the best transition from one state to the next. A global optimization
could improve things by more effectively using the graphics state
stack provided in the PDF format.
<span id="Generating_a_content_stream">Generating a content stream</span>
-------------------------------------------------------------------------
For each draw call on an SkPDFDevice, a new ContentEntry is created,
which stores the matrix, clip region, and clip stack as well as the
paint parameters. Most of the paint parameters are bundled into an
SkPDFGraphicState (interned) with the rest (color, font size, etc)
explicitly stored in the ContentEntry. After populating the
ContentEntry with all the relevant context, it is compared to the the
most recently used ContentEntry. If the context matches, then the
previous one is appended to instead of using the new one. In either
case, with the context populated into the ContentEntry, the
appropriate draw call is allowed to append to the content stream
snippet in the ContentEntry to affect the core of the drawing call,
i.e. drawing a shape, an image, text, etc.
When all drawing is complete, SkPDFDocument::onEndPage() will call
SkPDFDevice::content() to request the complete content stream for the
page. The first thing done is to apply the initial transform specified
in part in the constructor, this transform takes care of changing the
coordinate space from an origin in the lower left (PDF default) to the
upper left (Skia default) as well as any translation or scaling
requested by the user (i.e. to achieve a margin or scale the
canvas). Next (well almost next, see the next section), a clip is
applied to restrict drawing to the content area (the part of the page
inside the margins) of the page. Then, each ContentEntry is applied to
the content stream with the help of a helper class, GraphicStackState,
which tracks the state of the PDF graphics stack and optimizes the
output. For each ContentEntry, commands are emitted to the final
content entry to update the clip from its current state to the state
specified in the ContentEntry, similarly the Matrix and drawing state
(color, line joins, etc) are updated, then the content entry fragment
(the actual drawing operation) is appended.
<span id="Drawing_details">Drawing details</span>
-------------------------------------------------
Certain objects have specific properties that need to be dealt
with. Images, layers (see below), and fonts assume the standard PDF
coordinate system, so we have to undo any flip to the Skia coordinate
system before drawing these entities. We don't currently support
inverted paths, so filling an inverted path will give the wrong result
([issue 241](https://bug.skia.org/241)). PDF doesn't draw zero length
lines that have butt of square caps, so that is emulated.
### <span id="Layers">Layers</span> ###
PDF has a higher level object called a form x-object (form external
object) that is basically a PDF page, with resources and a content
stream, but can be transformed and drawn on an existing page. This is
used to implement layers. SkPDFDevice has a method,
makeFormXObjectFromDevice(), which uses the SkPDFDevice::content()
method to construct a form x-object from the the
device. SkPDFDevice::drawDevice() works by creating a form x-object of
the passed device and then drawing that form x-object in the root
device. There are a couple things to be aware of in this process. As
noted previously, we have to be aware of any flip to the coordinate
system - flipping it an even number of times will lead to the wrong
result unless it is corrected for. The SkClipStack passed to drawing
commands includes the entire clip stack, including the clipping
operations done on the base layer. Since the form x-object will be
drawn as a single operation onto the base layer, we can assume that
all of those clips are in effect and need not apply them within the
layer.
### <span id="Fonts">Fonts</span> ###
There are many details for dealing with fonts, so this document will
only talk about some of the more important ones. A couple short
details:
* We can't assume that an arbitrary font will be available at PDF view
time, so we embed all fonts in accordance with modern PDF
guidelines.
* Most fonts these days are TrueType fonts, so this is where most of
the effort has been concentrated.
* Because Skia may only be given a glyph-id encoding of the text to
render and there is no perfect way to reverse the encoding, the
PDF backend always uses the glyph-id encoding of the text.
#### *Type1/Type3 fonts* ####
Linux supports Type1 fonts, but Windows and Mac seem to lack the
functionality required to extract the required information from the
font without parsing the font file. When a non TrueType font is used
any any platform (except for Type1 on Linux), it is encoded as a Type3
font. In this context, a Type3 font is an array of form x-objects
(content streams) that draw each glyph of the font. No hinting or
kerning information is included in a Type3 font, just the shape of
each glyph. Any font that has the do-not embed copy protection bit set
will also get embedded as a Type3 font. From what I understand, shapes
are not copyrightable, but programs are, so by stripping all the
programmatic information and only embedding the shape of the glyphs we
are honoring the do-not embed bit as much as required by law.
PDF only supports an 8-bit encoding for Type1 or Type3 fonts. However,
they can contain more than 256 glyphs. The PDF backend handles this by
segmenting the glyphs into groups of 255 (glyph id 0 is always the
unknown glyph) and presenting the font as multiple fonts, each with up
to 255 glyphs.
#### *Font subsetting* ####
Many fonts, especially fonts with CJK support are fairly large, so it
is desirable to subset them. Chrome uses the SFNTLY package to provide
subsetting support to Skia for TrueType fonts.
### <span id="Shaders">Shaders</span> ###
Skia has two types of predefined shaders, image shaders and gradient
shaders. In both cases, shaders are effectively positioned absolutely,
so the initial position and bounds of where they are visible is part
of the immutable state of the shader object. Each of the Skia's tile
modes needs to be considered and handled explicitly. The image shader
we generate will be tiled, so tiling is handled by default. To support
mirroring, we draw the image, reversed, on the appropriate axis, or on
both axes plus a fourth in the vacant quadrant. For clamp mode, we
extract the pixels along the appropriate edge and stretch the single
pixel wide/long image to fill the bounds. For both x and y in clamp
mode, we fill the corners with a rectangle of the appropriate
color. The composed shader is then rotated or scaled as appropriate
for the request.
Gradient shaders are handled purely mathematically. First, the matrix
is transformed so that specific points in the requested gradient are
at pre-defined locations, for example, the linear distance of the
gradient is always normalized to one. Then, a type 4 PDF function is
created that achieves the desired gradient. A type 4 function is a
function defined by a resticted postscript language. The generated
functions clamp at the edges so if the desired tiling mode is tile or
mirror, we hav to add a bit more postscript code to map any input
parameter into the 0-1 range appropriately. The code to generate the
postscript code is somewhat obtuse, since it is trying to generate
optimized (for space) postscript code, but there is a significant
number of comments to explain the intent.
### <span id="Xfer_modes">Xfer modes</span> ###
PDF supports some of the xfer modes used in Skia directly. For those,
it is simply a matter of setting the blend mode in the graphic state
to the appropriate value (Normal/SrcOver, Multiply, Screen, Overlay,
Darken, Lighten, !ColorDOdge, ColorBurn, HardLight, SoftLight,
Difference, Exclusion). Aside from the standard SrcOver mode, PDF does
not directly support the porter-duff xfer modes though. Most of them
(Clear, SrcMode, DstMode, DstOver, SrcIn, DstIn, SrcOut, DstOut) can
be emulated by various means, mostly by creating form x-objects out of
part of the content and drawing it with a another form x-object as a
mask. I have not figured out how to emulate the following modes:
SrcATop, DstATop, Xor, Plus.
At the time of writing [2012-06-25], I have a [CL outstanding to fix a
misunderstanding I had about the meaning of some of the emulated
modes](https://codereview.appspot.com/4631078/).
I will describe the system with this change applied.
First, a bit of terminology and definition. When drawing something
with an emulated xfer mode, what's already drawn to the device is
called the destination or Dst, and what's about to be drawn is the
source or Src. Src (and Dst) can have regions where it is transparent
(alpha equals zero), but it also has an inherent shape. For most kinds
of drawn objects, the shape is the same as where alpha is not
zero. However, for things like images and layers, the shape is the
bounds of the item, not where the alpha is non-zero. For example, a
10x10 image, that is transparent except for a 1x1 dot in the center
has a shape that is 10x10. The xfermodes gm test demonstrates the
interaction between shape and alpha in combination with the port-duff
xfer modes.
The clear xfer mode removes any part of Dst that is within Src's
shape. This is accomplished by bundling the current content of the
device (Dst) into a single entity and then drawing that with the
inverse of Src's shape used as a mask (we want Dst where Src
isn't). The implementation of that takes a couple more steps. You may
have to refer back to [the content stream section](#Generating_a_content_stream). For any draw call, a
ContentEntry is created through a method called
SkPDFDevice::setUpContentEntry(). This method examines the xfer modes
in effect for that drawing operation and if it is an xfer mode that
needs emulation, it creates a form x-object from the device,
i.e. creates Dst, and stores it away for later use. This also clears
all of that existing ContentEntry's on that device. The drawing
operation is then allowed to proceed as normal (in most cases, see
note about shape below), but into the now empty device. Then, when the
drawing operation in done, a complementary method is
called,SkPDFDevice::finishContentEntry(), which takes action if the
current xfer mode is emulated. In the case of Clear, it packages what
was just drawn into another form x-object, and then uses the Src form
x-object, an invert function, and the Dst form x-object to draw Dst
with the inverse shape of Src as a mask. This works well when the
shape of Src is the same as the opaque part of the drawing, since PDF
uses the alpha channel of the mask form x-object to do masking. When
shape doesn't match the alpha channel, additional action is
required. The drawing routines where shape and alpha don't match, set
state to indicate the shape (always rectangular), which
finishContentEntry uses. The clear xfer mode is a special case; if
shape is needed, then Src isn't used, so there is code to not bother
drawing Src if shape is required and the xfer mode is clear.
SrcMode is clear plus Src being drawn afterward. DstMode simply omits
drawing Src. DstOver is the same as SrcOver with Src and Dst swapped -
this is accomplished by inserting the new ContentEntry at the
beginning of the list of ContentEntry's in setUpContentEntry instead
of at the end. SrcIn, SrcOut, DstIn, DstOut are similar to each, the
difference being an inverted or non-inverted mask and swapping Src and
Dst (or not). SrcIn is SrcMode with Src drawn with Dst as a
mask. SrcOut is like SrcMode, but with Src drawn with an inverted Dst
as a mask. DstIn is SrcMode with Dst drawn with Src as a
mask. Finally, DstOut is SrcMode with Dst draw with an inverted Src as
a mask.
<span id="Known_issues">Known issues</span>
-------------------------------------------
* [issue 249](https://bug.skia.org/249)
SrcAtop Xor, and Plus xfer modes are not supported.
* [issue 240](https://bug.skia.org/240)
drawVerticies is not implemented.
* [issue 244](https://bug.skia.org/244)
Mostly, only TTF fonts are *directly* supported.
(User metrics show that almost all fonts are truetype.)
* [issue 260](https://bug.skia.org/260)
Page rotation is accomplished by specifying a different
size page instead of including the appropriate rotation
annotation.
* * *

View File

@ -1,198 +0,0 @@
The Raster Tragedy in Skia
==========================
This is an extension of [The Raster Tragedy at Low-Resolution Revisited](http://rastertragedy.com)
as it applies to Skia. The Raster Tragedy describes a number of issues with typeface rasterization
with a particular emphasis on proper hinting to overcome these issues. Since not all fonts
are nicely hinted and sometimes hinting is not desired, there are additional hacks which may
be applied. Generally, one wants to hint purely informational text laid out for a particular
device, but not hint text which is art. Unless, of course, the hinting is part of the art like
Shift_JIS art.
The Gamma Hack
--------------
First, one should be aware of transfer functions (of which 'gamma' is an
example). A good introduction can be had at [What Every Coder Should Know About
Gamma](https://blog.johnnovak.net/2016/09/21/what-every-coder-should-know-about-gamma/).
In Skia, all color sources are converted into the destination color space and the blending is done
in the destination color space by applying the linear blend function. Skia does not convert into
a linear space, apply the linear blend, and convert back to the encoded space. If the destination
color space does not have a linear encoding this will lead to 'incorrect' blending. The idea is
that there are essentially two kinds of users of Skia. First there are existing systems which
are already using a non-linear encoding with a linear blend function. While the blend isn't
correct, these users generally don't want anything to change due to expectations. Second there
are those who want everything done correctly and they are willing to pay for a linearly encoded
destination in which the linear blend function is correct.
For bi-level glyph rendering a pixel is either covered or not, so there are no coverage blending
issues.
For regular full pixel partial coverage (anti-aliased) glyph rendering the user may or may not
want correct linear blending. In most non-linear encodings, using the linear blend function
tends to make black on white look slightly heavier, using the pixel grid as a kind of contrast
and optical sizing enhancement. It does the opposite for white on black, often making such
glyphs a bit under-covered. However, this fights the common issue of blooming where light on
dark on many displays tends to appear thicker than dark on light. (The black not being fully
black also contributes.) If the pixels are small enough and there is proper optical sizing and
perhaps anti-aliased drop out control (these latter two achieved either manually with proper
font selection or 'opsz', automatically, or through hinting) then correct linear blending tends
to look great. Otherwise black on white text tends to (correctly) get really anemic looking at
small sizes. So correct blending of glyph masks here should be left up to the user of Skia. If
they're really sophisticated and already tackled these issues then they may want linear blending
of the glyphs for best effect. Otherwise the glyphs should just keep looking like they used to
look due to expectations.
For subpixel partial coverage (subpixel anti-aliased) glyph masks linear blending in a
linear encoding is more or less required to avoid color fringing effects. The intensity of
the subpixels is being directly exploited so needs to be carefully controlled. The subpixels
tend to alleviate the issues with no full coverage (though still problematic if blitting text
in one of the display's primaries). One will still want optical sizing since the glyphs will
still look somewhat too light when scaled down linearly.
So, if subpixel anti-aliased glyph masks (and sometimes full pixel anti-aliased glyph masks)
need a correct blit how are they to be used with non-linearly encoded destinations?
One possible solution is to special case these blits. If blitting on the CPU it's often fast and
close enough to take the square root of the source and destination values, do the linear blend
function, then square the result (approximating the destination encoding as if its transfer
function is square). Many GPUs have a mode where they can blend in sRGB, though unfortunately
this generally applies to the whole framebuffer, not just individual draws. For various reasons,
Skia has avoided special casing these blends.
What Skia currently does is the gamma hack. When creating the glyph mask one usually knows
the approximate color which is going to be drawn, the transfer function, and that a linear
source-over blend is going to be used. The destination color is then guessed to be a contrasting
color (if there isn't any contrast the drawing won't be able to be seen anyway) so assume that the
destination color will be the perceptually opposite color in the destination color space. One can
now determine the desired value by converting the perceptual source and guessed destination into
a linear encoding, do the linear source-over blend, and convert to the destination encoding. The
coverage is then adjusted so that the result of a linear source-over blend on the non-linear
encoded values will be as close as possible to this desired value.
This works, but makes many assumptions. The first is the guess at the destination. A perceptual
middle gray could equally well (or poorly) contrast with black or white so the best guess
is drawing it on top of itself. Subpixel anti-aliased glyph masks drawn with this guess will
be drawn without any adjustment at all, leaving them color fringy. On macOS Skia tweaks the
destination guess to reduce the correction when using bright sources. This helps reducing
'blooming' issues with light on dark (aka dark mode) and better matches how CoreText seems
to do blending. The second is that a src-over blend is assumed, but users generally aren't as
discriminating of the results of other blends.
The gamma hack works best with subpixel anti-aliasing since the adjustment can be made per-channel
instead of full pixel. If this hack is applied to full pixel anti-aliased masks everything is
essentially being done in the nearest gray instead of the nearest color (since there is only
one channel through which to communicate), leading to poor results. Most users will not want
the gamma hack applied to full pixel anti-aliased glyphs.
Since the gamma hack is logically part of the blend, it must always be the very last adjustment
made to the coverage mask before being used by the blitter. The inputs are the destination
transfer function and the current color (in the destination color space). In Skia these come
from the color space on the SkSurface and the color on the SkPaint.
Optical Sizing Hack
-------------------
In metal type a type designer will draw out on paper the design for the faces of the final
sorts. Often there would be different drawings for different target sizes. Sometimes these
different sizes look quite different (like Display and Text faces of the same family). Then a
punch cutter takes these drawings and creates a piece of metal called a punch which can stamp
out these faces. The punch is used to create a negative in a softer piece of metal forming a
strike. This strike is made the correct width and called a matrix. This matrix is used as a mold
to cast individual sorts. The sorts are collected into a box called a type case. A typesetter
would take sorts from a type case and set them into a form. The printer would then ink the
sorts in the form and press the paper. (Note that the terms 'typeface' and 'font' aren't used
in this description, there is a lot of disagreement on what they apply to.)
Every step of this process is now automated in some way. Unfortunately, knowledge embedded in
the manual process has not always been replicated in the automation. This can be for a wide
variety of reasons, such as being overlooked or being difficult to emulate. One of these areas
is the art of optical sizing and managing thin features.
In general smaller type should be relatively heavier in weight than would be expected if taking
a larger size and linearly scaling it down. The type designer will draw out the faces with this
in mind, potentially with an eye toward how it would vary with size and with potential need
for ink traps. The punch cutter would then cut the punches at a given size with this in mind,
adjusting until the soot proofs looked good. There may even be slight adjustments to the matrix
itself if something seemed off. The typesetter would often know which specific cases contained
slightly heavier or lighter sorts. The printer would then adjust the ink and pressure to get
a good looking print.
Popular digital font formats didn't really support this until recently with the variable font
'opsz' axis. The presence of an 'opsz' axis is like the type designer giving really good
instructions about how the faces should look at various sizes. However, not all fonts have or
will have a 'opsz' axis. Since we don't always have an 'opsz' what can be done to prevent small
glyphs from looking all washed out?
One way the type designer could influence the optical size is through hinting. Any manual
hinting is done by someone looking at the result at small sizes. Tweaks are made until it
'looks good'. This often unconsciously bakes in optical sizing. Even autohinters eventually
end up emulating this, generally making the text more contrasty and somewhat heavier at small
pixel sizes (this depends on the target pixel size not the nominal requested size).
An alternate way the designer could provide optical sized fonts is using multiple font files
for different optical sizes and expect the user to select the right one (like Display and
Text variants). In theory the right one might also be selected automatically based on some
criteria. Switching font files because of nominal size changes may seem drastic, but this is
how the system font on macOS worked for a while.
One automatic way to do optical sizing is to artificially embolden the outline itself at small
nominal sizes. This is the approach taken by CoreText. This is a lot like the dreaded fake-bold,
but doesn't have the issue of the automatic fake bolding being heavier than ultra bold, since
this emboldening is applied uniformally based on requested nominal size.
Another automatic way to do optical sizing is to over-cover all the edges when doing
anti-aliasing. The pixels are a fixed physical size so affect small features more than large
features. Skia currently has rudimentary support for this in its 'contrast hack' which is
described more later.
As a note on optical sizing, this is one place where the nominal or optical size of the font is
treated differently from the final pixel size of the font. A SkCanvas may have a scale transform
active. Any hinting will be done at the final pixel size (the font size mapped through the
current transformation matrix), but the optical size is not affected by the transform since
it's actually a parameter for the SkTypeface (and maybe the SkFont).
The Contrast Hack
-----------------
Consider the example of [a pixel wide stroke at half-pixel
boundaries](http://rastertragedy.com/RTRCh3.htm#Sec1). As stated in section 3.1.3 "if we were
to choose the stroke positions to render the most faithful proportions and advance width, we
may have to compromise the rendering contrast." If the stroke lands on a pixel boundary all
is well. If the stoke lands at a half pixel boundary and correct linear blending is used then
the same number of photons are reaching the eye, but the reduction in photons is spread out
over twice the area. If the pixels were small enough then this wouldn't be an issue. Back of
the envelope suggests an 8K 20inch desktop monitor or ~400ppi being the minimum. Note that RGB
subpixel anti-aliasing brings a 100dpi display up to 300dpi, which is close, but still a bit
short. Exploiting the RGB subpixels also doesn't really increase the resolution as much when
getting close to the RGB primaries for the fill color.
One way to try to compensate for this is to cover some of these partially covered pixels more
until it visually looks better. Note that this depends on a lot of factors like the pixel density
of the display, the visual acuity of the user, the distance of the user from the display, and the
user's sensitivity to the potential variations in stem darkness which may result. Automatically
taking all these factors into account would be quite difficult. The correct function is generally
determined by having the user look at the result of applying various amounts of extra coverage
and having them to pick a setting that looks the least bad to them.
This specific form of over-covering is a form of drop out control for anti-aliasing and could
be implemented in a similar way, detecting when a stem comes on in one pixel and goes out in
the next and mark that for additional coverage. At raster time a cruder approximation could be
made by doing a pass in each of the horizontal and vertical directions and finding runs of more
than one non-fully-covered pixel and increasing their coverage.
If instead of doing these computationally expensive passes all coverage is boosted then in
addition to the smeared stems the entire outside edge of the glyph will also be bolded. Making
these outside edges heavier is a crude approximation of outsetting the initial path in a
rather complicated way and amounts to an optical sizing tweak. Just as hinting can be used to
approximate optical sizing if the user's perception of the pixel sizes is known in advance,
this is a pixel level tweak tied to a specific user and display combination.
Much like the gamma hack can be modified to reduce the correction for light on dark to
fight blooming, the contrast hack can be reduced when the color being drawn is known to be
light. Generally the contrast correction goes to zero as one approaches white.

View File

@ -1,23 +0,0 @@
Skia in Flutter & Fuchsia
=========================
Skia is used by both [Flutter](https://flutter.io/) and [Fuchsia](https://fuchsia.googlesource.com/docs/+/master/README.md).
Fuchsia has a [roller](https://fuchsia-roll.skia.org/) that will continuously roll latest Skia into that project. Fuchsia uses an XML [manifest](https://fuchsia.googlesource.com/manifest/+/master/userspace) to specify the Skia revision (as well as other third party libraries).
Flutter does not (yet) have a roller, so developers must manually perform rolls. Flutter uses [DEPS](https://github.com/flutter/engine/blob/master/DEPS) to specify third party dependencies.
Although each project is (almost always) building at a different revision of Skia, Fuchsia itself always builds the latest revision of Flutter as one of its components. Thus, the versions of Skia being used by Flutter and Fuchsia must be "source compatible" -- Flutter must be capable of compiling against either revision without any change to Flutter itself.
Making API Changes
------------------
If you need to make a breaking API change, the basic approach is:
* Add new code to Skia, leaving the old code in place.
* Deprecate the old code path so that it must be enabled with a flag such as 'SK_SUPPORT_LEGACY_XXX'.
* Add that same flag to [flutter\_defines.gni](https://skia.googlesource.com/skia/+/master/gn/flutter_defines.gni) in Skia.
* Both Flutter and Fuchsia build Skia with a GN argument that enables all the defines listed in that file.
* Land the Skia change, and test the new API in both Flutter and Fuchsia.
* Remove the flag and code when the legacy code path is no longer in use.

View File

@ -1,64 +0,0 @@
Android Gardener Documentation
==============================
### Contents ###
* [What does a Android Gardener do?](#what_is_a_android_gardener)
* [Android Autorollers](#autoroller_doc)
* [View current and upcoming rotations](#view_current_upcoming_rotations)
* [How to swap rotation shifts](#how_to_swap)
<a name="what_is_a_android_gardener"></a>
What does a Android Gardener do?
--------------------------------
The Android Gardener has two primary jobs:
1) Monitor and approve the semi-autonomous [git merges](https://googleplex-android-review.git.corp.google.com/#/q/owner:31977622648%2540project.gserviceaccount.com+status:open) from Skia's repository into the Android source tree. See autoroller documentation <a href="#autoroller_doc">here</a> for details on how to interact with it.
2) Stay on top of incoming Android-related bugs in both the [Skia](https://bugs.chromium.org/p/skia/issues/list?can=2&q=OpSys%3DAndroid&sort=-id&colspec=ID+Type+Status+Priority+Owner+Summary&cells=tiles) and [Android](https://buganizer.corp.google.com/issues?q=assignee:skia-android-triage%20status:open) bug trackers. For Skia bugs, this means triaging and assigning all Android bugs that are currently unassigned. For Android, this means following the [Android guidelines](go/android-buganizer) to verifying that all Skia bugs are TL-triaged (if not reach out to djsollen@).
The Android Gardener's job is NOT to address issues in Perf and Gold. You'll get your chance when you are the general Skia Gardener.
<a name="autoroller_doc"></a>
Android Autorollers
-------------------
The Android autoroller into the master branch runs on [https://android-master-roll.skia.org](android-master-roll.skia.org) and is accessible only to Googlers.<br/>
The autoroller's status is displayed on Skia's [status page](https://status.skia.org/).
You can send the autoroller into dry run mode via the UI. The uploaded change will not autosubmit when it is in dry run mode.
You can also stop the autoroller via the UI. This is useful in cases where a failure needs to be investigated and you do not want to waste TH resources by running unnecessary tests.
If the autoroller displays an error in the UI then look for more detail in it's [cloud logs](https://pantheon.corp.google.com/logs/viewer?project=google.com:skia-buildbots&resource=logging_log%2Fname%2Fandroid-master-autoroll&logName=projects%2Fgoogle.com:skia-buildbots%2Flogs%2Fautoroll).
If you need any more information about the autoroller please look at [skia:5538](https://bugs.chromium.org/p/skia/issues/detail?id=5538) or ask rmistry@ / skiabot@.
We also have autorollers into release branches (also restricted only to Googlers):
* [https://android-o-roll.skia.org](https://android-o-roll.skia.org) ([cloud logs](https://pantheon.corp.google.com/logs/viewer?project=google.com:skia-buildbots&resource=logging_log%2Fname%2Fandroid-o-autoroll&logName=projects%2Fgoogle.com:skia-buildbots%2Flogs%2Fautoroll)).
Changes created by these rollers need to be manually approved.<br/>
The changes created by the release rollers:
* Include all authors of merged changes so that they can watch the roll.
* Extracts all buganizer bugs of the form 'BUG=b/123' or 'Bug: b/456' and creates a single line in the merge change 'Bug: 123, 456'.
* Collects all 'Test: ' lines and carries them over to the merge change.
<a name="view_current_upcoming_rotations"></a>
View current and upcoming rotations
-----------------------------------
The list of Android Gardeners is specified [here](https://rotations.corp.google.com/rotation/5296436538245120).
The gardeners widget on the [status page](https://status.skia.org) also displays the current gardeners.
<a name="how_to_swap"></a>
How to swap rotation shifts
--------------------------
If you need to swap shifts with someone (because you are out sick or on vacation), please get approval from the person you want to swap with and directly make the swap via the [rotations page](https://rotations.corp.google.com/rotation/5296436538245120).

View File

@ -1,59 +0,0 @@
GPU Gardener Documentation
==========================
### Contents ###
* [What does a GPU Gardener do?](#what_is_a_gpu_gardener)
* [Tracking GPU Gardener Work](#tracking)
* [View current and upcoming rotations](#view_current_upcoming_rotations)
* [How to swap rotation shifts](#how_to_swap)
* [Tips for GPU Gardeners](#tips)
<a name="what_is_a_gpu_gardener"></a>
What does a GPU Gardener do?
----------------------------
The GPU Gardener has three main jobs:
1) Stay on top of incoming GPU-related bugs from clients in various bug trackers. This means triaging and assigning bugs that have a clear owner and investigating and possibly fixing bugs that don't.
2) Improve the reliability of the GPU bots. This includes dealing with flaky images, crashing bots, etc. We have a never ending set of machine or driver specific issues to deal with. We often brush them under the rug so that we have time for the "real work." When you're gardener this is "real work."
3) Improve our tooling. This includes writing new tools and improving existing test tools. Expected results are faster bot run times, more accurate testing, faster testing, surfacing new useful data, and improving debuggability.
The GPU Gardener should always prioritize dealing with incoming bugs. The balance of a gardener's time should be spent divided as seen fit between 2) and 3). It is expected that as much as possible a gardener puts normal work on pause and focuses on gardener tasks for the full week. It is ok (and encouraged) to take a deep dive on one particular facet of the gardener duties and drive it as far as possible during gardener week (while staying on top of incoming bugs).
Note that the GPU Gardener's job is NOT to spend an abnormal amount of time triaging images, filing bugs for failing bots, or shepherding DEPS rolls. You'll get your chance when you are the general Skia Gardener.
<a name="tracking"></a>
Tracking GPU Gardener Work
--------------------------
Outside of bug reports, a GPU Gardener should track their progress so that a future gardener can pick up any batons left shy of the finish line at week's end.
Also, whenever a gardener figures out how to accomplish a gardenly task (e.g. run a set of Chromium tests that aren't well documented or a cool OpenGL trick used to debug a gnarly issue) the tips section of this doc should be updated to assist future gardeners.
<a name="view_current_upcoming_rotations"></a>
View current and upcoming rotations
-----------------------------------
The list of GPU Gardeners is specified [here](https://rotations.corp.google.com/rotation/6176639586140160).
The gardeners widget on the [status page](https://status.skia.org) also displays the current gardeners.
<a name="how_to_swap"></a>
How to swap rotation shifts
---------------------------
If you need to swap shifts with someone (because you are out sick or on vacation), please get approval from the person you want to swap with and directly make the swap via the [rotations page](https://rotations.corp.google.com/rotation/6176639586140160).
<a name="tips"></a>
Tips for GPU Gardeners
----------------------
Please see [this](https://docs.google.com/a/google.com/document/d/1Q1A5T5js4MdqvD0EKjCgNbUBJfRBMPKR3OZAkc-2Tvc/edit?usp=sharing) doc.

View File

@ -1,183 +0,0 @@
Skia Gardener Documentation
===========================
### Contents ###
* [What does a Skia Gardener do?](#what_is_a_skia_gardener)
+ [Skia tree](#skia_tree)
+ [AutoRollers](#autorollers)
+ [Gold and Perf](#gold_and_perf)
+ [Documentation](#skia_gardener_doc)
* [View current and upcoming rotations](#view_current_upcoming_rotations)
* [How to swap rotation shifts](#how_to_swap)
* [Tips for Skia Gardeners](#tips)
+ [When to file bugs](#when_to_file_bugs)
+ [How to close or re-open the tree](#how_close_tree)
+ [How to revert a CL](#how_to_revert)
+ [What to do if DEPS roll fails to land](#deps_roll_failures)
+ [How to rebaseline](#how_to_rebaseline)
<a name="what_is_a_skia_gardener"></a>
What does a Skia Gardener do?
-----------------------------
A Skia Gardener keeps an eye on the tree, DEPS rolls, Gold tool, the Perf tool, and triages Chrome bugs.
Below is a brief summary of what the gardener does for each task:
<a name="skia_tree"></a>
### Skia tree
* Understand the [testing infrastructure](https://skia.org/dev/testing/automated_testing).
* Start watching the [status page](https://status.skia.org) for bot breakages.
* Track down people responsible for breakages and revert broken changes if there is no easy fix. You can use [blamer](#blamer) to help track down such changes.
* Close and open the [tree](http://tree-status.skia.org).
* Keep the builder comments on the [status page](https://status.skia.org) up to date.
* File or follow up with [BreakingTheBuildbots bugs](https://bugs.chromium.org/p/skia/issues/list?q=label:BreakingTheBuildbots). See the tip on [when to file bugs](#when_to_file_bugs).
* Read and update the [Ongoing Issues section](https://docs.google.com/document/d/1y2jUf4vXI0fwhu2TiCLVIfWC1JOxFcHXGw39y7i-y_I/edit#heading=h.tpualuc3p7z0) in the handoff doc.
* (Optional) Document significant events that occurred during your shift in the [Weekly
Handoff Notes section](https://docs.google.com/document/d/1y2jUf4vXI0fwhu2TiCLVIfWC1JOxFcHXGw39y7i-y_I/edit#heading=h.y49irwbutzr) in the handoff doc.
<a name="triage"></a>
### Triage
You should triage Chromium and Skia bugs that show up under "Untriaged Bugs" on the [status page](https://status.skia.org).
The Android Gardener will triage the untriaged Android Bugs.
For a more detailed view of bugs see [Skia Bugs Central](https://bugs-central.skia.org/).
<a name="blamer"></a>
### Blamer
If you have Go installed, a command-line tool is available to search through
git history and do text searches on the full patch text and the commit
message. To install blamer run:
go get go.skia.org/infra/blamer/go/blamer
Then run blamer from within a Skia checkout. For example, to search if the
string "SkDevice" has appeared in the last 10 commits:
$ $GOPATH/bin/blamer --match SkDevice --num 10
commit ea70c4bb22394c8dcc29a369d3422a2b8f3b3e80
Author: robertphillips <robertphillips@google.com>
Date: Wed Jul 20 08:54:31 2016 -0700
Remove SkDevice::accessRenderTarget virtual
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2167723002
Review-Url: https://codereview.chromium.org/2167723002
<a name="autorollers"></a>
### Autorollers
* Ensure that all AutoRollers listed on the [status page](https://status.skia.org) are successfully landing.
<a name="gold_and_perf"></a>
### Gold and Perf
* Pay attention for new [Perf](https://perf.skia.org/) and [Gold](https://gold.skia.org/) alerts (by clicking on the bell at the top right of the [status page](https://status.skia.org)).
* The gardener's duty here is to make sure that when developers introduce new images or new perf regressions, that they are aware of what happened, and they use these tools to take appropriate action.
<a name="skia_gardener_doc"></a>
### Documentation
* Improve/update this documentation page for future gardeners, especially the [Tips section](#tips).
In general, gardeners should have a strong bias towards actions that keep the tree green and then open; if a simple revert can fix the problem, the gardener <b>should revert first and ask questions later</b>.
<a name="view_current_upcoming_rotations"></a>
View current and upcoming rotations
-----------------------------------
The list of Skia Gardeners is specified [here](https://rotations.corp.google.com/rotation/4699606003744768).
The gardeners widget on the [status page](https://status.skia.org) also displays the current gardeners.
<a name="how_to_swap"></a>
How to swap rotation shifts
---------------------------
If you need to swap shifts with someone (because you are out sick or on vacation), please get approval from the person you want to swap with and directly make the swap via the [rotations page](https://rotations.corp.google.com/rotation/4699606003744768).
<a name="tips"></a>
Tips for Skia Gardeners
-----------------
<a name="when_to_file_bugs"></a>
### When to file bugs
Pay close attention to the "Failures" view in the [status page](https://status.skia.org).
Look at all existing [BreakingTheBuildbots bugs](https://bug.skia.org/?q=label:BreakingTheBuildbots). If the list is kept up to date then it should accurately represent everything that is causing failures. If it does not, then please file/update bugs accordingly.
<a name="how_close_tree"></a>
### How to close or re-open the tree
1. Go to [tree-status.skia.org](https://tree-status.skia.org).
2. Change the status.
* To close the tree, include the word "closed" in the status.
* To open the tree, include the word "open" in the status.
* To caution the tree, include the word "caution" in the status.
<a name="how_to_submit_when_tree_closed"></a>
### How to submit when the tree is closed
* Submit manually using the "git cl land" with the --bypass-hooks flag.
* Add "No-Tree-Checks: true" to your CL description and use the CQ as usual.
<a name="how_to_revert"></a>
### How to revert a CL
See the revert documentation [here](https://skia.org/dev/contrib/revert).
<a name="deps_roll_failures"></a>
### What to do if DEPS roll fails to land
A common cause of DEPS roll failures are layout tests. Find the offending Skia CL by examining the commit hash range in the DEPS roll and revert (or talk to the commit author if they are available). If you do revert then keep an eye on the next DEPS roll to make sure it succeeds.
If a Skia CL changes layout tests, but the new images look good, the tests need to be rebaselined. See [Rebaseline Layout Tests](#how_to_rebaseline).
<a name="how_to_rebaseline"></a>
### Rebaseline Layout Tests (i.e., add suppressions)
* First create a Chromium bug:
* goto [crbug.com](https://crbug.com)
* Make sure you're logged in with your Chromium credentials
* Click “New Issue”
* Summary: “Skia image rebaseline”
* Description:
* DEPS roll #,
* Helpful message about what went wrong (e.g., “Changes to how lighting is scaled in Skia r#### changed the following images:”)
* Layout tests affected
* You should copy the list of affected from stdio of the failing bot
* Status: Assigned
* Owner: yourself
* cc: reed@, bsalomon@, robertphillips@ & developer responsible for changes
* Labels: OS-All & Cr-Blink-LayoutTests
* If it is filter related, cc senorblanco@
* (Dispreferred but faster) Edit [skia/skia_test_expectations.txt](https://chromium.googlesource.com/chromium/src/+/master/skia/skia_test_expectations.txt)
* Add # comment about what has changed (I usually paraphrase the crbug text)
* Add line(s) like the following after the comment:
* crbug.com/<bug#youjustcreated> foo/bar/test-name.html [ ImageOnlyFailure ]
* Note: this change is usually done in the DEPS roll patch itself
* (Preferred but slower) Make a separate Blink patch by editing LayoutTests/TestExpectations
* Add # comment about what has changed (I usually paraphrase the crbug text)
* Add line(s) like the following after the comment:
* crbug.com/<bug#youjustcreated> foo/bar/test-name.html [ Skip ] # needs rebaseline
* Commit the patch you created and wait until it lands and rolls into Chrome
* Retry the DEPS roll (for the 1st/dispreferred option this usually means just retrying the layout bots)
* Make a Blink patch by editing LayoutTests/TestExpectations
* Add # comment about what has changed
* Add line(s) like the following after the comment:
* crbug.com/<bug#youjustcreated> foo/bar/test-name.html [ Skip ] # needs rebaseline
* (if you took the second option above you can just edit the existing line(s))
* If you took the first/dispreferred option above:
* Wait for the Blink patch to roll into Chrome
* Create a Chrome patch that removes your suppressions from skia/skia_test_expectations.txt

View File

@ -1,5 +0,0 @@
Infra Gardener Documentation
============================
The Infra Gardener handles problems with Skia's build and test infrastructure.
Documentation for Infra Gardeners is found at [go/skia-infra-gardener](http://go/skia-infra-gardener) (Googler's only).

View File

@ -1,4 +0,0 @@
Developer Documentation
=======================
If you want to make changes to the Skia code, this is the place for you.

View File

@ -1,39 +0,0 @@
Internal Links
==============
Index of links to resources that are internal to the Google/Skia core team, for
easy reference.
Skia team information
---------------------
* [Granting access to Skia](https://sites.google.com/a/google.com/skia/key-resources/access)
* [Project communications](https://sites.google.com/a/google.com/skia/key-resources)
Skia project information
------------------------
* [Milestones and schedule](https://sites.google.com/a/google.com/skia/milestones)
* [Status](https://sites.google.com/a/google.com/skia/status) from weekly,
monthly updates and OKRs
* [Skia branch process](https://docs.google.com/a/google.com/document/d/1Xn24lTMlmUgdP8bp-iHOeGKAOp8L5uCxg12lw49Jlpg/edit?usp=sharing)
* [Design documents](https://sites.google.com/a/google.com/skia/design-documents)
Infrastructure related
----------------------
* [iOS tools](https://sites.google.com/a/google.com/skia/key-resources/ios-provisioning)
for machine setup and provisioning
* [SKP Playback](https://docs.google.com/a/google.com/document/d/1oJpuY8XKc212RsfUm6oEH2tp26Veb-Gez3clBuqapE4/edit?usp=sharing)
for downloading buildbot SKPs
Chrome related
--------------
* [Development on a Chrome branch](https://sites.google.com/a/google.com/skia/development-on-a-chrome-branch)
* [Cherrypick instructions](https://sites.google.com/a/google.com/skia/development-on-a-chrome-branch#TOC-How-to-cherrypick-a-Skia-fix-into-a-Chrome-branch)
Android related
---------------
* Skia on Android [development guide](https://sites.google.com/a/google.com/skia/android)
Google3 related
---------------
* [Google3-Autoroller](https://sites.google.com/a/google.com/skia-infrastructure/docs/google3-autoroller)
-- How to handle failures and how to test CLs.

View File

@ -1,4 +0,0 @@
Presentations
================
Resources providing technical overview of various aspects of the Skia library

View File

@ -1,27 +0,0 @@
Path Ops
========
View the PathOps presentations with speaker notes enabled for full content.
2013 Path Ops Presentation
------------
<iframe
src="https://docs.google.com/presentation/d/1iEjbQV4o40hoooB9DiAHjH9P9Q5CrVUUnbYdQtQB6_A/embed?start=false&loop=false&delayms=3000"
frameborder="0" width="480" height="299" allowfullscreen="true"
mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>
2014 Update
------------
<iframe
src="https://docs.google.com/presentation/d/1NbmG5W6VW9h5HtjpCVLx4h6SXW0qW7HIwmSfiwzFbrI/embed?start=false&loop=false&delayms=3000"
frameborder="0" width="480" height="299" allowfullscreen="true"
mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>
2015 Update
------------
<iframe
src="https://docs.google.com/presentation/d/1PoZdIx4DqdIvs7ybv-L3EvtxQE2qXuzeOZpSkFJjfhg/embed?start=false&loop=false&delayms=3000"
frameborder="0" width="480" height="299" allowfullscreen="true"
mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>
## [Path Ops Inverse Fill Illustration](https://drive.google.com/file/d/0BwoLUwz9PYkHLWpsaXd0UDdaN00/view?usp=sharing)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 199 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 213 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 408 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 312 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 321 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 254 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 206 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

View File

@ -1,187 +0,0 @@
Skia Automated Testing
======================
Overview
--------
Skia uses [Swarming](https://github.com/luci/luci-py/blob/master/appengine/swarming/doc/Design.md)
to do the heavy lifting for our automated testing. It farms out tasks, which may
consist of compiling code, running tests, or any number of other things, to our
bots, which are virtual or real machines living in our local lab, Chrome Infra's
lab, or in GCE.
The [Skia Task Scheduler](http://go/skia-task-scheduler) determines what tasks
should run on what bots at what time. See the link for a detailed explanation of
how relative task priorities are derived. A *task* corresponds to a single
Swarming task. A *job* is composed of a directed acyclic graph of one or more
*tasks*. The job is complete when all of its component tasks have succeeded
or is considered a failure when any of its component tasks fails. The scheduler
may automatically retry tasks within its set limits. Jobs are not retried.
Multiple jobs may share the same task, for example, tests on two different
Android devices which use the same compiled code.
Each Skia repository has an `infra/bots/tasks.json` file which defines the jobs
and tasks for the repo. Most jobs will run at every commit, but it is possible
to specify nightly and weekly jobs as well. For convenience, most repos also
have a `gen_tasks.go` which will generate `tasks.json`. You will need to
[install Go](https://golang.org/doc/install). From the repository root:
$ go run infra/bots/gen_tasks.go
It is necessary to run `gen_tasks.go` every time it is changed or every time an
[asset](https://skia.googlesource.com/skia/+/master/infra/bots/assets/README.md)
has changed. There is also a test mode which simply verifies that the `tasks.json`
file is up to date:
$ go run infra/bots/gen_tasks.go --test
Try Jobs
--------
Skia's trybots allow testing and verification of changes before they land in the
repo. You need to have permission to trigger try jobs; if you need permission,
ask a committer. After uploading your CL to [Gerrit](https://skia-review.googlesource.com/),
you may trigger a try job for any job listed in `tasks.json`, either via the
Gerrit UI, using `git cl try`, eg.
git cl try -B skia.primary -b Some-Tryjob-Name
or using `bin/try`, a small wrapper for `git cl try` which helps to choose try jobs.
From a Skia checkout:
bin/try --list
You can also search using regular expressions:
bin/try "Test.*GTX660.*Release"
Status View
------------
The status view shows a table with tasks, grouped by test type and platform,
on the X-axis and commits on the Y-axis. The cells are colored according to
the status of the task for each commit:
* green: success
* orange: failure
* purple: mishap (infrastructure issue)
* black border, no fill: task in progress
* blank: no task has started yet for a given revision
Commits are listed by author, and the branch on which the commit was made is
shown on the very left. A purple result will override an orange result.
For more detail, you can click on an individual cell to get a summary of the
task. You can also click one of the white bars at the top of each column to see
a summary of recent tasks with the same name.
The status page has several filters which can be used to show only a subset of
task specs:
* Interesting: Task specs which have both successes and failures within the
visible commit window.
* Failures: Task specs which have failures within the visible commit window.
* Comments: Task specs which have comments.
* Failing w/o comment: task specs which have failures within the visible commit
window but have no comments.
* All: Display all tasks.
* Search: Enter a search string. Substrings and regular expressions may be
used, per the Javascript String Match() rules:
http://www.w3schools.com/jsref/jsref_match.asp
<a name="adding-new-jobs"></a>
Adding new jobs
---------------
If you would like to add jobs to build or test new configurations, please file a
[New Bot Request][new bot request].
If you know that the new jobs will need new hardware or you aren't sure which
existing bots should run the new jobs, assign to jcgregorio. Once the Infra team
has allocated the hardware, we will assign back to you to complete the process.
Generally it's possible to copy an existing job and make changes to accomplish
what you want. You will need to add the new job to
[infra/bots/jobs.json][jobs json]. In some cases, you will need to make changes
to recipes:
* If there are new GN flags or compiler options:
[infra/bots/recipe_modules/build][build recipe module], probably default.py.
* If there are modifications to dm flags: [infra/bots/recipes/test.py][test py]
* If there are modifications to nanobench flags:
[infra/bots/recipes/perf.py][perf py]
After modifying any of the above files, run `make train` in the infra/bots
directory to update generated files. Upload the CL, then run `git cl try -B
skia.primary -b <job name>` to run the new job. (After commit, the new job will
appear in the PolyGerrit UI after the next successful run of the
Housekeeper-Nightly-UpdateMetaConfig task.)
[new bot request]:
https://bugs.chromium.org/p/skia/issues/entry?template=New+Bot+Request
[jobs json]: https://skia.googlesource.com/skia/+/master/infra/bots/jobs.json
[build recipe module]:
https://skia.googlesource.com/skia/+/refs/heads/master/infra/bots/recipe_modules/build/
[test py]:
https://skia.googlesource.com/skia/+/master/infra/bots/recipes/test.py
[perf py]:
https://skia.googlesource.com/skia/+/master/infra/bots/recipes/perf.py
Detail on Skia Tasks
--------------------
[infra/bots/gen_tasks.go][gen_tasks] reads config files:
* [infra/bots/jobs.json][jobs json]
* [infra/bots/cfg.json][cfg json]
* [infra/bots/recipe_modules/builder_name_schema/builder_name_schema.json][builder_name_schema]
Based on each job name in jobs.json, gen_tasks decides which tasks to generate (process
function). Various helper functions return task name of the direct dependencies of the job.
In gen_tasks, tasks are specified with a TaskSpec. A TaskSpec specifies how to generate and trigger
a Swarming task.
Most Skia tasks run a recipe with Kitchen. The arguments to the kitchenTask function specify the
most common parameters for a TaskSpec that will run a recipe. More info on recipes at
[infra/bots/recipes/README.md][recipes README] and
[infra/bots/recipe_modules/README.md][recipe_modules README].
The Swarming task is generated based on several parameters of the TaskSpec:
* Isolate: specifies the isolate file. The isolate file specifies the files from the repo to place
on the bot before running the task. (For non-Kitchen tasks, the isolate also specifies the command
to run.) [More info][isolate user guide].
* Command: the command to run, if not specified in the Isolate. (Generally this is a boilerplate
Kitchen command that runs a recipe; see below.)
* CipdPackages: specifies the IDs of CIPD packages that will be placed on the bot before running the
task. See infra/bots/assets/README.md for more info.
* Dependencies: specifies the names of other tasks that this task depends upon. The outputs of those
tasks will be placed on the bot before running this task.
* Dimensions: specifies what kind of bot should run this task. Ask Infra team for how to set this.
* ExecutionTimeout: total time the task is allowed to run before it is killed.
* IoTimeout: amount of time the task can run without printing something to stdout/stderr before it
is killed.
* Expiration: Mostly ignored. If the task happens to be scheduled when there are no bots that can
run it, it will remain pending for this long before being canceled.
If you need to do something more complicated, or if you are not sure how to add
and configure the new jobs, please ask for help from borenet, benjaminwagner, or
mtklein.
[gen_tasks]:
https://skia.googlesource.com/skia/+/master/infra/bots/gen_tasks.go
[cfg json]:
https://skia.googlesource.com/skia/+/master/infra/bots/cfg.json
[builder_name_schema]:
https://skia.googlesource.com/skia/+/master/infra/bots/recipe_modules/builder_name_schema/builder_name_schema.json
[recipes README]:
https://skia.googlesource.com/skia/+/master/infra/bots/recipes/README.md
[recipe_modules README]:
https://skia.googlesource.com/skia/+/master/infra/bots/recipe_modules/README.md
[isolate user guide]:
https://chromium.googlesource.com/infra/luci/luci-py/+/master/appengine/isolate/doc/client/Isolate-User-Guide.md

View File

@ -1,32 +0,0 @@
Downloading Isolates
====================
The intermediate and final build products from running tests are all stored in
[Isolate](https://github.com/luci/luci-py/blob/master/appengine/isolate/doc/Design.md),
and can be downloaded to the desktop for inspection and debugging.
First install the client:
git clone https://github.com/luci/client-py.git
Add the checkout location to your $PATH.
To download the isolated files for a test first visit
the build status page and find the "isolated output" link:
<img src="Status.png" style="margin-left:30px" width=576 height=271 >
Follow that link to find the hash of the isolated outputs:
<img src="Isolate.png" style="margin-left:30px" width=451 height=301 >
Then run `isolateserver.py` with --isolated set to that hash:
$ isolateserver.py \
download \
--isolate-server=https://isolateserver.appspot.com \
--isolated=5b85b7c382ee2a34530e33c7db20a07515ff9481 \
--target=./download/

View File

@ -1,34 +0,0 @@
Fonts and GM Tests
==================
Overview
--------
Each test in the gm directory draws a reference image. Their primary purpose is
to detect when images change unexpectedly, indicating that a rendering bug has
been introduced.
The gm tests have a secondary purpose: they detect when rendering is different
across platforms and configurations.
GM font selection
-----------------
Each gm specifies the typeface to use when drawing text. For now, to set the
portable typeface on the paint, call:
~~~~
ToolUtils::set_portable_typeface(SkPaint* , const char* name = nullptr,
SkFontStyle style = SkFontStyle());
~~~~
To create a portable typeface, use:
~~~~
SkTypeface* typeface = ToolUtils::create_portable_typeface(const char* name,
SkFontStyle style);
~~~~
Eventually, both `set_portable_typeface()` and `create_portable_typeface()` will be
removed. Instead, a test-wide `SkFontMgr` will be selected to choose portable
fonts or resource fonts.

View File

@ -1,87 +0,0 @@
Fuzzing
=======
Reproducing using `fuzz`
------------------------
We assume that you can [build Skia](/user/build). Many fuzzes only reproduce
when building with ASAN or MSAN; see [those instructions for more details](./xsan).
When building, you should add the following args to BUILD.gn to make reproducing
less machine- and platform- dependent:
skia_use_fontconfig=false
skia_use_freetype=true
skia_use_system_freetype2=false
skia_use_wuffs=true
skia_enable_skottie=true
skia_enable_fontmgr_custom_directory=false
skia_enable_fontmgr_custom_embedded=false
skia_enable_fontmgr_custom_empty=true
All that is needed to reproduce a fuzz downloaded from ClusterFuzz or oss-fuzz is to
run something like:
out/ASAN/fuzz -b /path/to/downloaded/testcase
The fuzz binary will try its best to guess what the type/name should be based on
the name of the testcase. Manually providing type and name is also supported, like:
out/ASAN/fuzz -t filter_fuzz -b /path/to/downloaded/testcase
out/ASAN/fuzz -t api -n RasterN32Canvas -b /path/to/downloaded/testcase
To enumerate all supported types and names, run the following:
out/ASAN/fuzz --help # will list all types
out/ASAN/fuzz -t api # will list all names
If the crash does not show up, try to add the flag --loops:
out/ASAN/fuzz -b /path/to/downloaded/testcase --loops <times-to-run>
Writing fuzzers with libfuzzer
------------------------------
libfuzzer is an easy way to write new fuzzers, and how we run them on oss-fuzz.
Your fuzzer entry point should implement this API:
extern "C" int LLVMFuzzerTestOneInput(const uint8_t*, size_t);
First install Clang and libfuzzer, e.g.
sudo apt install clang-10 libc++-10-dev libfuzzer-10-dev
You should now be able to use `-fsanitize=fuzzer` with Clang.
Set up GN args to use libfuzzer:
cc = "clang-10"
cxx = "clang++-10"
sanitize = "fuzzer"
extra_cflags = [ "-O1" ] # Or whatever you want.
...
Build Skia and your fuzzer entry point:
ninja -C out/libfuzzer skia
clang++-10 -I. -O1 -fsanitize=fuzzer fuzz/oss_fuzz/whatever.cpp out/libfuzzer/libskia.a
Run your new fuzzer binary
./a.out
Fuzzing Defines
---------------
There are some defines that can help guide a fuzzer to be more productive (e.g. avoid OOMs, avoid
unnecessarily slow code).
// Required for fuzzing with afl-fuzz to prevent OOMs from adding noise.
SK_BUILD_FOR_AFL_FUZZ
// Required for fuzzing with libfuzzer
SK_BUILD_FOR_LIBFUZZER
// This define adds in guards to abort when we think some code path will take a long time or
// use a lot of RAM. It is set by default when either of the above defines are set.
SK_BUILD_FOR_FUZZER

View File

@ -1,15 +0,0 @@
Testing
=======
Skia relies heavily on our suite of unit and GM tests, which are served by our
DM test tool, for correctness testing. Tests are executed by our trybots, for
every commit, across most of our supported platforms and configurations.
Skia [Gold](https://gold.skia.org) is a web interface for triaging these results.
We also have a robust set of performance tests, served by the nanobench tool and
accessible via the Skia [Perf](https://perf.skia.org) web interface.
Cluster Telemetry is a powerful framework that helps us capture and benchmark
SKP files, a binary format for draw commands, across up to one million websites.
See the individual subpages for more details on our various test tools.

View File

@ -1,42 +0,0 @@
Testing on iOS
==============
Before setting Skia up for automated testing from the command line, please
follow the instructions to run Skia tests (*dm*, *nano-bench*) with the
mainstream iOS tool chain. See the [quick start guide for ios](../../user/quick/ios).
iOS doesn't lend itself well to compiling and running from the command line.
Below are instructions on how to install a set of tools that make this possible.
To see how they are used in automated testing please see the bash scripts
used by the buildbot recipes: <https://github.com/google/skia/tree/master/platform_tools/ios/bin>.
Installation
------------
The key tools are
* libimobiledevice <http://www.libimobiledevice.org/>, <https://github.com/libimobiledevice/libimobiledevice>
* ios-deploy <https://github.com/phonegap/ios-deploy>
Follow these steps to install them:
* Install Brew at <http://brew.sh/>
* Install *libimobiledevice*
(Note: All these are part of the *libimobiledevice* project but packaged/developed
under different names. The *cask* extension to *brew* is necessary to install
*osxfuse* and *ifuse*, which allows to mount the application directory on an iOS device).
```
brew install libimobiledevice
brew install ideviceinstaller
brew install caskroom/cask/brew-cask
brew install Caskroom/cask/osxfuse
brew install ifuse
```
* Install node.js and ios-deploy
```
$ brew update
$ brew install node
$ npm install ios-deploy
```

View File

@ -1,173 +0,0 @@
Skia Gold
=========
Overview
--------
Gold is a web application that compares the images produced by our bots against
known baseline images.
Key features:
* Baselines are managed in Gold outside of Git, but in lockstep with Git commits.
* Each commit creates >500k images.
* Deviations from the baseline are triaged after a CL lands and images are
triaged as either `positive` or `negative`. 'Positive' means the diff is
considered acceptable. 'Negative' means the diff is considered unacceptable
and requires a fix.
If a CL causes Skia to break it is reverted or an additional CL is landed to
fix the problem.
* We test across a range of dimensions, e.g.:
- OS (Windows, Linux, Mac, Android, iOS)
- Architectures (Intel, ARM)
- Backends (CPU, OpenGL, Vulkan etc.)
- etc.
* Written in Go, Polymer and deployed on the Google Cloud. The code
is in the [Skia Infra Repository](https://github.com/google/skia-buildbot).
Recommended Workflows
---------------------
### How to best use Gold for commonly faced problems ###
These instructions will refer to various views which are accessible via the left
navigation on [gold.skia.org](https://gold.skia.org/).
View access is public, triage access is granted to
Skia contributors. You must be logged in to triage.
Problem #1: As Skia Gardener, I need to triage and “assign” many incoming new images.
-------------------------------------------------------------------------------
Solution today:
* Access the By Blame view to see digests needing triage and associated
owners/CLs
+ Only untriaged digests will be shown by default
+ Blame is not sorted in any particular order
+ Digests are clustered by runs and the most minimal set of blame
<img src=BlameView.png style="margin-left:30px" align="left" width="800"/> <br clear="left">
* Select digests for triage
+ Digests will be listed in order with largest difference first
+ Click to open the digest view with detailed information
<img src=Digests.png style="margin-left:40px" align="left" width="780"/> <br clear="left">
* Open bugs for identified owner(s)
+ The digest detail view has a link to open a bug from the UI
+ Via the Gold UI or when manually entering a bug, copy the full URL of
single digest into a bug report
+ The URL reference to the digest in Issue Tracker will link the bug to
the digest in Gold
<img src="IssueHighlight.png" style="margin-left:60px" align="left" width="720" border=1/> <br clear="left">
<br>
Future improvements:
* Smarter, more granular blamelist
<br>
Problem #2: As a developer, I need to land a CL that may change many images.
----------------------------------------------------------------------------
To find your results:
* Immediately following commit, access the By Blame view to find untriaged
digest groupings associated with your ID
* Click on one of the clusters including your CL to triage
* Return to the By Blame view to walk through all untriaged digests involving
your change
* Note: It is not yet implemented in the UI but possible to filter the view
by CL. Delete hashes in the URL to only include the hash for your CL.
<img src=BlameView.png style="margin-left:30px" align="left" width="800"/> <br clear="left">
To rebaseline images:
* Access the Ignores view and create a new, short-interval (hours) ignore for
the most affected configuration(s)
<img src=Ignores.png style="margin-left:30px" align="left" width="800"/> <br clear="left">
* Click on the Ignore to bring up a search view filtered by the affected
configuration(s)
* Mark untriaged images as positive (or negative if appropriate)
* Follow one of two options for handling former positives:
+ Leave former positives as-is and let them fall off with time if there is
low risk of recurrence
+ Mark former positives as negative if needed to verify the change moving
forward
Future improvements:
* Trybot support prior to commit, with view limited to your CL
* Pre-triage prior to commit that will persist when the CL lands
<br>
Problem #3: As a developer or infrastructure engineer, I need to add a new or updated config.
---------------------------------------------------------------------------------------------
(ie: new bot, test mode, environment change)
Solution today:
* Follow the process for rebaselining images:
+ Wait for the bot/test/config to be committed and show up in the Gold UI
+ Access the Ignores view and create a short-interval ignore for the
configuration(s)
+ Triage the ignores for that config to identify positive images
+ Delete the ignore
Future improvements:
* Introduction of a new or updated test can make use of try jobs and pre-triage.
* New configs may be able to use these features as well.
<br>
Problem #4: As a developer, I need to analyze the details of a particular image digest.
---------------------------------------------------------------------------------------
Solution:
* Access the By Test view
<img src=ByTest.png style="margin-left:30px" align="left" width="800"/> <br clear="left">
* Click the magnifier to filter by configuration
* Access the Cluster view to see the distribution of digest results
+ Use control-click to select and do a direct compare between data points
+ Click on configurations under “parameters” to highlight data points and
compare
<img src=ClusterConfig.png style="margin-left:30px" align="left" width="800"/> <br clear="left">
* Access the Grid view to see NxN diffs
<img src=Grid.png style="margin-left:30px" align="left" width="800"/> <br clear="left">
* Access the Dot diagram to see history of commits for the trace
+ Each dot represents a commit
+ Each line represents a configuration
+ Dot colors distinguish between digests
<img src=DotDiagram.png style="margin-left:30px" align="left" width="800"/> <br clear="left">
<br>
Future improvements:
* Large diff display of image vs image
<br>
Problem #5: As a developer, I need to find results for a particular configuration.
----------------------------------------------------------------------------------
Solution:
* Access the Search view
* Select any parameters desired to search across tests
<img src=Search.png style="margin-left:30px" align="left" width="800"/> <br clear="left">

View File

@ -1,39 +0,0 @@
Skia Perf
=========
[Skia Perf](https://perf.skia.org) is a web application for analyzing and
viewing performance metrics produced by Skia's testing infrastructure.
<img src=Perf.png style="margin-left:30px" align="left" width="800"/> <br clear="left">
Skia tests across a large number of platforms and configurations, and each
commit to Skia generates more than 400,000 individual values that are sent to
Perf, consisting mostly of performance benchmark results, but also including
memory and coverage data.
Perf offers clustering, which is a tool to pick out trends and patterns in large sets of traces.
<img src=Cluster.png style="margin-left:30px" align="left" width="400"/> <br clear="left">
And can generate alerts when those trends spot a regression:
<img src=Regression.png style="margin-left:30px" align="left" width="800"/> <br clear="left">
## Calculations
Skia Perf has the ability to perform calculations over the test data
allowing you to build up interesting queries.
This query displays the ratio of playback time in ms to the number of ops for desk\_wowwiki.skp:
ratio(
ave(fill(filter("name=desk_wowwiki.skp&sub_result=min_ms"))),
ave(fill(filter("name=desk_wowwiki.skp&sub_result=ops")))
)
You can also use the data to answer questions like how many tests were run per commit.
count(filter(""))
See Skia Perf for the [full list of functions available](https://perf.skia.org/help/).

View File

@ -1,50 +0,0 @@
SkQP
====
Development APKs of SkQP are kept in Google storage. Each file in named
with a abbreviated Git hash that points at the commit in the Skia repository it
was built with.
These are universal APKs that contain native libraries for armeabi-v7a,
arm64-v8a, x86, and x86\_64 architectures. The most recent is listed first.
The listing can be found here:
[https://storage.googleapis.com/skia-skqp/apklist](https://storage.googleapis.com/skia-skqp/apklist)
If you are looking at Android CTS failures, use the most recent commit on the
`origin/skqp/release` branch.
To run tests:
adb install -r skqp-universal-{APK_SHA_HERE}.apk
adb logcat -c
adb shell am instrument -w org.skia.skqp
Monitor the output with:
adb logcat TestRunner org.skia.skqp skia DEBUG "*:S"
Note the test's output path on the device. It will look something like this:
01-23 15:22:12.688 27158 27173 I org.skia.skqp:
output written to "/storage/emulated/0/Android/data/org.skia.skqp/files/skqp_report_2019-02-28T102058"
Retrieve and view the report with:
OUTPUT_LOCATION="/storage/emulated/0/Android/data/org.skia.skqp/files/skqp_report_2019-02-28T102058"
adb pull "$OUTPUT_LOCATION" /tmp/
(Your value of `$OUTPUT_LOCATION` will differ from mine.
Open the file `/tmp/output/skqp_report_2019-02-28T102058/report.html` .
**Zip up that directory to attach to a bug report:**
cd /tmp
zip -r skqp_report_2019-02-28T102058.zip skqp_report_2019-02-28T102058
ls -l skqp_report_2019-02-28T102058.zip
* * *
For more information about building your own APK, refer to
https://skia.googlesource.com/skia/+/master/tools/skqp/README.md

View File

@ -1,88 +0,0 @@
Skia Swarming Bots
==================
Overview
--------
Skia's Swarming bots are hosted in three places:
* Google Compute Engine. This is the preferred location for bots which don't need to run on physical
hardware, ie. anything that doesn't require a GPU or a specific hardware configuration. Most of
our compile bots live here, along with some non-GPU test bots on Linux and Windows. We get
surprisingly stable performance numbers from GCE, despite very few guarantees about the physical
hardware.
* Chrome Golo. This is the preferred location for bots which require specific hardware or OS
configurations that are not supported by GCE. We have several Mac, Linux, and Windows bots in the
Golo.
* The Skolo (local Skia lab in Chapel Hill). Anything we can't get in GCE or the Golo lives
here. This includes a wider variety of GPUs and all Android, ChromeOS, iOS, and other devices.
[go/skbl](https://goto.google.com/skbl) lists all Skia Swarming bots.
<a name="connecting-to-swarming-bots"></a>
Connecting to Swarming Bots
---------------------------
If you need to make changes on a bot/device, please check with the Infra Gardener or another Infra team member. Most
bots/devices can be flashed/imaged back to a clean state, but others can not.
- Machine name like “skia-e-gce-NNN”, “skia-ct-gce-NNN”, “skia-i-gce-NNN”, “ct-gce-NNN”, “ct-xxx-builder-NNN” -> GCE
* First determine the project for the bot:
+ skia-e-gce-NNN, skia-ct-gce-NNN: [skia-swarming-bots](https://console.cloud.google.com/compute/instances?project=skia-swarming-bots)
+ skia-i-gce-NNN: [google.com:skia-buildbots](https://console.cloud.google.com/compute/instances?project=google.com:skia-buildbots)
+ ct-gce-NNN, ct-xxx-builder-NNN: [ct-swarming-bots](https://console.cloud.google.com/compute/instances?project=ct-swarming-bots)
* To log in to a Linux bot in GCE, use `gcloud compute ssh --project <project> default@<machine name>`. Choose the zone listed on the VM's detail page (see links above). You may also specify the zone using the `--zone` command-line flag.
* To log in to a Windows bot in GCE, first go to the VM's detail page and click the "Set Windows password"
button. (Alternatively, ask the Infra Team how to log in as chrome-bot.) There are two options to connect:
+ SSH: Follow the instructions for Linux using your username rather than `default`.
+ RDP: On the VM's detail page, click the "RDP" button. (You will be instructed to install the Chrome RDP Extension
for GCP if it hasn't already been installed.)
- Machine name ends with “a9”, “m3”, "m5" -> Chrome Golo/Labs
* To log in to Golo bots, see [go/chrome-infra-build-access](https://goto.google.com/chrome-infra-build-access).
- Machine name starts with “skia-e-”, “skia-i-” (other than “skia-i-gce-NNN”), “skia-rpi-” -> Chapel Hill lab (aka Skolo)<br/>
To log in to Skolo bots, see the [Skolo maintenance doc][remote access] remote access section. See the following for OS specific instructions:<br/>
* [Remotely debug an Android device in Skolo][remotely debug android]
* [VNC to Skolo Windows bots][vnc to skolo windows]
* [ChromeOS Debugging][chromeos debugging]
Debugging
---------
If you need to run code on a specific machine/device to debug an issue, the simplest option is to
run tryjobs (after adding debugging output to the relevant code). In some cases you may also need to
[create or modify tryjobs](automated_testing#adding-new-jobs).
For Googlers: If you need more control (e.g. to run GDB) and need to run directly on a swarming bot then you can use [leasing.skia.org](https://leasing.skia.org).<br/>
If that does not work then the [current infra gardener][current infra gardener] can help you bring the device back to your desk and connect
it to GoogleGuest Wifi or the [Google Test Network](http://go/gtn-criteria).
If you need to make changes on a bot/device, please check with the Infra Gardener or another Infra team member. Most
bots/devices can be flashed/imaged back to a clean state, but others can not.
If a permanent change needs to be made on the machine (such as an OS or driver update), please [file
a bug][infra bug] and assign to jcgregorio for reassignment.
For your convenience, the machine skolo-builder is available for checking out and compiling code within the Skolo. See
more info in the [Skolo maintenance doc][remote access] remote access section.
[current infra gardener]: https://rotations.corp.google.com/rotation/4617277386260480
[remote access]:
https://docs.google.com/document/d/1zTR1YtrIFBo-fRWgbUgvJNVJ-s_4_sNjTrHIoX2vulo/edit#heading=h.v77cmwbwc5la
[infra bug]: https://bugs.chromium.org/p/skia/issues/entry?template=Infrastructure+Bug
[remotely debug android]: https://docs.google.com/document/d/1nxn7TobfaLNNfhSTiwstOnjV0jCxYUI1uwW0T_V7BYg/
[vnc to skolo windows]:
https://docs.google.com/document/d/1zTR1YtrIFBo-fRWgbUgvJNVJ-s_4_sNjTrHIoX2vulo/edit#heading=h.7cqd856ft0s
[chromeos debugging]:
https://docs.google.com/document/d/1yJ2LLfLzV6pXKjiameid1LHEz1mj71Ob4wySIYxlBdw/edit#heading=h.9arg79l59xrf
Maintenance Tasks
-----------------
See the [Skolo maintenance doc][skolo maintenance].
[skolo maintenance]:
https://docs.google.com/document/d/1zTR1YtrIFBo-fRWgbUgvJNVJ-s_4_sNjTrHIoX2vulo/edit

View File

@ -1,192 +0,0 @@
Correctness Testing
===================
Skia correctness testing is primarily served by a tool named DM.
This is a quickstart to building and running DM.
<!--?prettify lang=sh?-->
python2 tools/git-sync-deps
bin/gn gen out/Debug
ninja -C out/Debug dm
out/Debug/dm -v -w dm_output
When you run this, you may notice your CPU peg to 100% for a while, then taper
off to 1 or 2 active cores as the run finishes. This is intentional. DM is
very multithreaded, but some of the work, particularly GPU-backed work, is
still forced to run on a single thread. You can use `--threads N` to limit DM to
N threads if you like. This can sometimes be helpful on machines that have
relatively more CPU available than RAM.
As DM runs, you ought to see a giant spew of output that looks something like this.
~~~
Skipping nonrendering: Don't understand 'nonrendering'.
Skipping angle: Don't understand 'angle'.
Skipping nvprmsaa4: Could not create a surface.
492 srcs * 3 sinks + 382 tests == 1858 tasks
( 25MB 1857) 1.36ms 8888 image mandrill_132x132_12x12.astc-5-subsets
( 25MB 1856) 1.41ms 8888 image mandrill_132x132_6x6.astc-5-subsets
( 25MB 1855) 1.35ms 8888 image mandrill_132x130_6x5.astc-5-subsets
( 25MB 1854) 1.41ms 8888 image mandrill_132x130_12x10.astc-5-subsets
( 25MB 1853) 151µs 8888 image mandrill_130x132_10x6.astc-5-subsets
( 25MB 1852) 154µs 8888 image mandrill_130x130_5x5.astc-5-subsets
...
( 748MB 5) 9.43ms unit test GLInterfaceValidation
( 748MB 4) 30.3ms unit test HalfFloatTextureTest
( 748MB 3) 31.2ms unit test FloatingPointTextureTest
( 748MB 2) 32.9ms unit test DeferredCanvas_GPU
( 748MB 1) 49.4ms unit test ClipCache
( 748MB 0) 37.2ms unit test Blur
~~~
Do not panic.
As you become more familiar with DM, this spew may be a bit annoying. If you
remove -v from the command line, DM will spin its progress on a single line
rather than print a new line for each status update.
Don't worry about the "Skipping something: Here's why." lines at startup. DM
supports many test configurations, which are not all appropriate for all
machines. These lines are a sort of FYI, mostly in case DM can't run some
configuration you might be expecting it to run.
Don't worry about the "skps: Couldn't read skps." messages either, you won't
have those by default and can do without them. If you wish to test with them
too, you can download them separately.
The next line is an overview of the work DM is about to do.
~~~
492 srcs * 3 sinks + 382 tests == 1858 tasks
~~~
DM has found 382 unit tests (code linked in from tests/), and 492 other drawing
sources. These drawing sources may be GM integration tests (code linked in
from gm/), image files (from `--images`, which defaults to "resources") or .skp
files (from `--skps`, which defaults to "skps"). You can control the types of
sources DM will use with `--src` (default, "tests gm image skp").
DM has found 3 usable ways to draw those 492 sources. This is controlled by
`--config`. The defaults are operating system dependent. On Linux they are "8888 gl nonrendering".
DM has skipped nonrendering leaving two usable configs:
8888 and gl. These two name different ways to draw using Skia:
- 8888: draw using the software backend into a 32-bit RGBA bitmap
- gl: draw using the OpenGL backend (Ganesh) into a 32-bit RGBA bitmap
Sometimes DM calls these configs, sometimes sinks. Sorry. There are many
possible configs but generally we pay most attention to 8888 and gl.
DM always tries to draw all sources into all sinks, which is why we multiply
492 by 3. The unit tests don't really fit into this source-sink model, so they
stand alone. A couple thousand tasks is pretty normal. Let's look at the
status line for one of those tasks.
~~~
( 25MB 1857) 1.36ms 8888 image mandrill_132x132_12x12.astc-5-subsets
[1] [2] [3] [4]
~~~
This status line tells us several things.
1. The maximum amount of memory DM had ever used was 25MB. Note this is a
high water mark, not the current memory usage. This is mostly useful for us
to track on our buildbots, some of which run perilously close to the system
memory limit.
2. The number of unfinished tasks, in this example there are 1857, either
currently running or waiting to run. We generally run one task per hardware
thread available, so on a typical laptop there are probably 4 or 8 running at
once. Sometimes the counts appear to show up out of order, particularly at DM
startup; it's harmless, and doesn't affect the correctness of the run.
3. Next, we see this task took 1.36 milliseconds to run. Generally, the
precision of this timer is around 1 microsecond. The time is purely there for
informational purposes, to make it easier for us to find slow tests.
4. The configuration and name of the test we ran. We drew the test
"mandrill_132x132_12x12.astc-5-subsets", which is an "image" source, into an
"8888" sink.
When DM finishes running, you should find a directory with file named `dm.json`,
and some nested directories filled with lots of images.
~~~
$ ls dm_output
8888 dm.json gl
$ find dm_output -name '*.png'
dm_output/8888/gm/3x3bitmaprect.png
dm_output/8888/gm/aaclip.png
dm_output/8888/gm/aarectmodes.png
dm_output/8888/gm/alphagradients.png
dm_output/8888/gm/arcofzorro.png
dm_output/8888/gm/arithmode.png
dm_output/8888/gm/astcbitmap.png
dm_output/8888/gm/bezier_conic_effects.png
dm_output/8888/gm/bezier_cubic_effects.png
dm_output/8888/gm/bezier_quad_effects.png
...
~~~
The directories are nested first by sink type (`--config`), then by source type (`--src`).
The image from the task we just looked at, "8888 image mandrill_132x132_12x12.astc-5-subsets",
can be found at `dm_output/8888/image/mandrill_132x132_12x12.astc-5-subsets.png`.
`dm.json` is used by our automated testing system, so you can ignore it if you
like. It contains a listing of each test run and a checksum of the image
generated for that run.
### Detail <a name="digests"></a>
Boring technical detail: The checksum is not a checksum of the
.png file, but rather a checksum of the raw pixels used to create that .png.
That means it is possible for two different configurations to produce
the same exact .png, but have their checksums differ.
Unit tests don't generally output anything but a status update when they pass.
If a test fails, DM will print out its assertion failures, both at the time
they happen and then again all together after everything is done running.
These failures are also included in the `dm.json` file.
DM has a simple facility to compare against the results of a previous run:
<!--?prettify lang=sh?-->
ninja -C out/Debug dm
out/Debug/dm -w good
# do some work
ninja -C out/Debug dm
out/Debug/dm -r good -w bad
When using `-r`, DM will display a failure for any test that didn't produce the
same image as the `good` run.
For anything fancier, I suggest using skdiff:
<!--?prettify lang=sh?-->
ninja -C out/Debug dm
out/Debug/dm -w good
# do some work
ninja -C out/Debug dm
out/Debug/dm -w bad
ninja -C out/Debug skdiff
mkdir diff
out/Debug/skdiff good bad diff
# open diff/index.html in your web browser
That's the basics of DM. DM supports many other modes and flags. Here are a
few examples you might find handy.
<!--?prettify lang=sh?-->
out/Debug/dm --help # Print all flags, their defaults, and a brief explanation of each.
out/Debug/dm --src tests # Run only unit tests.
out/Debug/dm --nocpu # Test only GPU-backed work.
out/Debug/dm --nogpu # Test only CPU-backed work.
out/Debug/dm --match blur # Run only work with "blur" in its name.
out/Debug/dm --dryRun # Don't really do anything, just print out what we'd do.

View File

@ -1,129 +0,0 @@
Writing Skia Tests
==================
+ [Unit Tests](#test)
+ [Rendering Tests](#gm)
+ [Benchmark Tests](#bench)
We assume you have already synced Skia's dependecies and set up Skia's build system.
<!--?prettify lang=sh?-->
python2 tools/git-sync-deps
bin/gn gen out/Debug
bin/gn gen out/Release --args='is_debug=false'
<span id="test"></span>
Writing a Unit Test
-------------------
1. Add a file `tests/NewUnitTest.cpp`:
<!--?prettify lang=cc?-->
/*
* Copyright ........
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file.
*/
#include "Test.h"
DEF_TEST(NewUnitTest, reporter) {
if (1 + 1 != 2) {
ERRORF(reporter, "%d + %d != %d", 1, 1, 2);
}
bool lifeIsGood = true;
REPORTER_ASSERT(reporter, lifeIsGood);
}
2. Add `NewUnitTest.cpp` to `gn/tests.gni`.
3. Recompile and run test:
<!--?prettify lang=sh?-->
ninja -C out/Debug dm
out/Debug/dm --match NewUnitTest
<span id="gm"></span>
Writing a Rendering Test
------------------------
1. Add a file `gm/newgmtest.cpp`:
<!--?prettify lang=cc?-->
/*
* Copyright ........
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file.
*/
#include "gm.h"
DEF_SIMPLE_GM(newgmtest, canvas, 128, 128) {
canvas->clear(SK_ColorWHITE);
SkPaint p;
p.setStrokeWidth(2);
canvas->drawLine(16, 16, 112, 112, p);
}
2. Add `newgmtest.cpp` to `gn/gm.gni`.
3. Recompile and run test:
<!--?prettify lang=sh?-->
ninja -C out/Debug dm
out/Debug/dm --match newgmtest
4. Run the GM inside Viewer:
<!--?prettify lang=sh?-->
ninja -C out/Debug viewer
out/Debug/viewer --slide GM_newgmtest
<span id="bench"></span>
Writing a Benchmark Test
------------------------
1. Add a file `bench/FooBench.cpp`:
<!--?prettify lang=cc?-->
/*
* Copyright ........
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file.
*/
#include "Benchmark.h"
#include "SkCanvas.h"
namespace {
class FooBench : public Benchmark {
public:
FooBench() {}
virtual ~FooBench() {}
protected:
const char* onGetName() override { return "Foo"; }
SkIPoint onGetSize() override { return SkIPoint{100, 100}; }
void onDraw(int loops, SkCanvas* canvas) override {
while (loops-- > 0) {
canvas->drawLine(0.0f, 0.0f, 100.0f, 100.0f, SkPaint());
}
}
};
} // namespace
DEF_BENCH(return new FooBench;)
2. Add `FooBench.cpp` to `gn/bench.gni`.
3. Recompile and run nanobench:
<!--?prettify lang=sh?-->
ninja -C out/Release nanobench
out/Release/nanobench --match Foo

View File

@ -1,98 +0,0 @@
MSAN, ASAN, & TSAN
==================
*Testing Skia with memory, address, and thread santizers.*
Compiling Skia with ASAN, UBSAN, or TSAN can be done with the latest version of Clang.
- UBSAN works on Linux, Mac, Android, and Windows, though some checks are platform-specific.
- ASAN works on Linux, Mac, Android, and Windows.
- TSAN works on Linux and Mac.
- MSAN works on Linux[1].
We find that testing sanitizer builds with libc++ uncovers more issues than
with the system-provided C++ standard library, which is usually libstdc++.
libc++ proactively hooks into sanitizers to help their analyses.
We ship a copy of libc++ with our Linux toolchain in /lib.
[1]To compile and run with MSAN, an MSAN-instrumented version of libc++ is needed.
It's generally easiest to run one of the following 2 steps to build/download a recent version
of Clang and the instrumented libc++, located in /msan.
Downloading Clang binaries (Googlers Only)
------------------------------------------
This requires gsutil, part of the [gcloud sdk](https://cloud.google.com/sdk/downloads).
<!--?prettify lang=sh?-->
CLANGDIR="${HOME}/clang"
python2 infra/bots/assets/clang_linux/download.py -t $CLANGDIR
Building Clang binaries from scratch (Other users)
---------------------------
<!--?prettify lang=sh?-->
CLANGDIR="${HOME}/clang"
python2 tools/git-sync-deps
CC= CXX= infra/bots/assets/clang_linux/create.py -t "$CLANGDIR"
Configure and Compile Skia with MSAN
------------------------------------
<!--?prettify lang=sh?-->
CLANGDIR="${HOME}/clang"
mkdir -p out/msan
cat > out/msan/args.gn <<- EOF
cc = "${CLANGDIR}/bin/clang"
cxx = "${CLANGDIR}/bin/clang++"
extra_cflags = [ "-B${CLANGDIR}/bin" ]
extra_ldflags = [
"-B${CLANGDIR}/bin",
"-fuse-ld=lld",
"-L${CLANGDIR}/msan",
"-Wl,-rpath,${CLANGDIR}/msan" ]
sanitize = "MSAN"
skia_use_fontconfig = false
EOF
python2 tools/git-sync-deps
bin/gn gen out/msan
ninja -C out/msan
Configure and Compile Skia with ASAN
------------------------------------
<!--?prettify lang=sh?-->
CLANGDIR="${HOME}/clang"
mkdir -p out/asan
cat > out/asan/args.gn <<- EOF
cc = "${CLANGDIR}/bin/clang"
cxx = "${CLANGDIR}/bin/clang++"
sanitize = "ASAN"
extra_ldflags = [ "-fuse-ld=lld", "-Wl,-rpath,${CLANGDIR}/lib" ]
EOF
python2 tools/git-sync-deps
bin/gn gen out/asan
ninja -C out/asan
Configure and Compile Skia with TSAN
------------------------------------
<!--?prettify lang=sh?-->
CLANGDIR="${HOME}/clang"
mkdir -p out/tsan
cat > out/tsan/args.gn <<- EOF
cc = "${CLANGDIR}/bin/clang"
cxx = "${CLANGDIR}/bin/clang++"
sanitize = "TSAN"
is_debug = false
extra_ldflags = [ "-Wl,-rpath,${CLANGDIR}/lib" ]
EOF
python2 tools/git-sync-deps
bin/gn gen out/tsan
ninja -C out/tsan

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

View File

@ -1,50 +0,0 @@
Code Search
===========
There are a number of ways to search the Skia codebase, each with advantages and
disadvantages.
[cs.skia.org](http://cs.skia.org) redirects to
[Chromium code search](https://code.google.com/p/chromium/codesearch) restricted
to the Skia portion of the Chromium tree. You can add a query after the slash;
e.g. [cs.skia.org/foo](http://cs.skia.org/foo) will search for "foo" within the
Skia tree. Chromium code search provides cross-references.
For Googlers, there is also the option of [the skia depot](http://cs/#skia/) in
internal Code Search. In addition to the
main [skia](http://cs/#skia/skia/) repo, internal Code Search indexes the
[buildbot](http://cs/#skia/buildbot/), [common](http://cs/#skia/common/),
and [skia_internal](https://cs/#skia/skia_internal/) repos. However,
cross-references and code analysis are not available.
The GitHub mirrors of the [skia](https://github.com/google/skia) and
[skia-buildbot](https://github.com/google/skia-buildbot) repos are useful for
investigating history and blame, or for exploring release branches or other
branches. However, the search functionality is fairly limited, cross-references
are not available, and in history the original committer's username is replaced
with that person's GitHub username.
You can also navigate through the
[Skia repos on googlesource.com](https://skia.googlesource.com/). All commits
appear here first.
Code search option |Search |XRef |History |Repos |Branches |Freshness
--------------------|-------|-----|--------|------------------------------|---------|---------------
[cs.skia.org][1] |regexp | yes |yes |skia [buildbot][5] |master |last DEPS roll
[Internal][2] |regexp | no |yes |skia buildbot common internal |master |hours
[GitHub][3] |basic | no |yes |skia buildbot |all |hour
[googlesource][4] |none | no |yes |all |all |N/A
[1]: http://cs.skia.org/ "Chromium code search"
[2]: http://cs/#skia/ "Internal Code Search"
[3]: https://github.com/google/skia "GitHub mirror of skia"
[4]: https://skia.googlesource.com/ "Primary Skia repos on googlesource.com"
[5]: https://cs.chromium.org/chromium/skia/buildbot/
Client code search
------------------
There is an [internal tool for
Googlers](https://goto.google.com/skia-client-search) to make it easier to
search the repos of Skia clients, e.g. Chromium, Android, and Mozilla. If you
use it and have suggestions, please let brianosman know.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

View File

@ -1,179 +0,0 @@
Skia Debugger
=============
Introduction
------------
The Skia Debugger is a graphical tool used to step through and analyze the
contents of the Skia picture format. The tool is available online at
[https://debugger.skia.org](https://debugger.skia.org/) or can be run locally.
Features:
* Draw command and multiple frame playback
* Shows the current clip and matrix at any step
* Zoomed viewer with crosshair for selecting pixels.
* Breakpoints that stop playback when a pixel's color changes.
* GPU or CPU backed execution.
* GPU op bounds visualization
* Android offscreen layer visualization
* Shared resource viewer
<img src="/dev/tools/onlinedebugger.png" style="display: inline-block;" />
User Guide
-----------
SKP files can contain a single frame or multiple frames. Single frame files have the .skp extension
and Multi-frame files have the .mskp extension. In the online debugger linked above, Open a
[sample mskp file](/dev/tools/calendar.mskp)
or capture one from an android device using the
[instructions here](https://sites.google.com/a/google.com/skia/android/skp-from-framework).
### Command Playback and Filters
Try playing back the commands within the current frame using the lower play button
<img src="/dev/tools/playcommands.png" style="display: inline-block;" />, (the one not
in a circle) You should see the image built up one draw at a time.
Many commands manipulate the matrix or clip but don't make any visible change when run. Try filtering
these out by pasting `!drawannotation save restore concat setmatrix cliprect` in to the filter
textbox just below the command playback controls. Press enter to apply the filter, and resume
playback if it was paused. This will have the effect of making the playback appear to be much faster
as there are only 29 commands in the first frame of the sample file that pass this filter.
Try pausing command playback and stepping forward and back through the commands using `,` (comma)
and `.` (period).
> Filters are case insensitive, and the only supported logical operator is ! (not) which applies to
> the entire filter and is only recognised when it occurs at the beginning.
Any command can be expanded using the
<img src="/dev/tools/expand.png" style="display: inline-block;" /> icon to see all of the
parameters that were recorded with that command.
Commands can be disabled or enabled with the checkbox that becomes available after expanding the
command's detail view.
Jog the command playhead to the end of the list with the
<img src="/dev/tools/end.png" style="display: inline-block;" /> button.
### Frame playback
<img src="/dev/tools/frameplayback.png" style="display: inline-block;" />
The sample file contains multiple frames. Use the encircled play button to play back the frames.
The current frame is indictated by the slider position, and the slider can be set manually. Frames
can be stepped through with `w` (back) and `s` forward. `p` pauses or unpauses the frame playback.
Not all frames in a file will have the same number of commands. When the command playhead is left at
the end of the list the debugger will play every frame to the end of its list. If the command
playhead is somewhere in the middle, say 155, the debugger will try to play every frame to its
155th command.
### Resources Tab
<img src="/dev/tools/resources.png" style="display: inline-block;" />
Any resources that were referenced by commands in the file appear here.
As of Dec 2019, this only shows images.
Any resource can be selected and viewed. You may find it helpful to toggle the Light/Dark setting if
you cannot see an image.
Images' names are formatted as `7 @24205864 (99, 99)` where `7` is the index of the image as it was
saved in the file, `@24205864` is it's address in wasm memory, for cross referencing with DrawImage*
commands in the command list which also show this address, and `(99, 99)` is the size of the image.
The resource viewer allows a user to determine if an image was not effectively shared between frames
or draw commands. If it occurs more than once in the resource tab, then there were multiple copies
of it with different generation ids in the process that recorded the SKP.
### Android Layers
<img src="/dev/tools/layers.png" style="display: inline-block;" />
When MSKPs are recorded in Android, Extra information about offscreen hardware layers is recorded.
The sample google calendar mskp linked above contains this information. You will find two layers on
frame 3.
There are two kinds of events relevant to recorded android layer use.
1. Draw Events - points when an offscreen surface was drawn to. They may be complete, meaning the
clip equalled the surface's size, or partial, meaning the clip was smaller.
2. Use events - points when the offscreen surface was used as an SkImage in the main surface.
Layers are shown as boxes in the bottom right of the interface when viewing a frame where a layer
draw event occurred. Each Layer box has two buttons: `Show Use` will cycle through use events for that
layer in the current frame if there are any, and `Inspector` will open the draw event as if it were
a single frame SKP. you can play back it's commands, enable or disabled them, inspect GPU op bounds
or anything else you could do with an ordinary SKP. Exit the inspector by clicking the `Exit` button
on the layer box.
### Crosshair and Breakpoints
<img src="/dev/tools/crosshair.png" style="display: inline-block;" />
Clicking any point in the main view will toggle a red crosshair for selecting pixels. the selected
pixel's color is shown in several formats on the right pane. A zoomed view centered on the selected
pixel is shown below it. The position can be moved precicely by either clicking neighbooring pixels
in the zoom view, or using `H` (left) `L` (right) `J` (down) `K` (up).
When "Break on change" is selected, command playback will pause on any command which changes the
color of the selected pixel. this can be used to find the command that draws something you see
in the viewer.
### GPU Op Bounds and Other settings
<img src="/dev/tools/settings.png" style="display: inline-block;" />
Each of the filtered commands from above has a colored number to its right
<img src="/dev/tools/gpuop.png" style="display: inline-block;" />. This is the GPU
operation id. When multiple commands share a GPU op id, this indicates that they were batched
together when sent to the GPU. In the WASM debugger, this goes though WebGL.
There is a "Display GPU Op Bounds" toggle in the upper right of the interface. Turning this on will
show a colored rectangle to represent the bounds of the GPU op of the currently selected command.
GPU - Controls which backend Skia uses to draw to the screen. GPU in the online wasm debugger means
WebGL. CPU means skia draws into a surface in memory which is copied into an HTML canvas without
using the GPU.
Light/Dark - this toggle changes the appearance of the checkerboard behind the main view and zoom
views to assist in viewing content with transparency.
Display Overdraw Viz - This vizualization shows a red overlay that is darker in propertion to how
much overdraw has occurred on a pixel. Overdraw meaning that the pixel was drawn to more than once.
* As of Dec 2019, this feature may not be working correctly.
### Image fit and download buttons.
<img src="/dev/tools/settings.png" style="display: inline-block;" />
These buttons resize the main view.
they are, from left to right:
Original size - the natural size of the canvas, when it was recorded.
Fit to page - shrink enough that the whole canvas fits in the center pane.
Fit to page width - make the canvas fit horizontally but allow scrolling vertically
Fit to page height - make the canvas fit vertically but allow scrolling horizontally.
next to these is a 5th, unrelated download button which saves the current canvas as a PNG file.
Building and running locally
--------------------
Begin by following the instructions to
[download and build Skia](../../user/quick), then simply build and run the
`skiaserve` tool:
<!--?prettify lang=sh?-->
# Build.
ninja -C out/Release skiaserve
# Run the debugger locally
out/Release/skiaserve
After running `skiaserve`, follow the instructions to open the debugger in your
local browser. By default the address will be `http://127.0.0.1:8888`.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 176 KiB

View File

@ -1,11 +0,0 @@
# Debug Visualization
Skia uses custom container types, such as `SkString` and `SkTArray<>`, which can
be inconvenient to view in a debugger.
If you frequently debug code that uses Skia types, consider installing a debug
visualizer. Skia offers debugger visualization support for the following
platforms:
- [Visual Studio and VS Code](https://skia.googlesource.com/skia/+/refs/heads/master/platform_tools/debugging/vs/Skia.natvis)
- [LLDB and Xcode](https://skia.googlesource.com/skia/+/refs/heads/master/platform_tools/debugging/lldb/skia.py)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 228 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 225 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 678 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 346 B

View File

@ -1,4 +0,0 @@
Tools
=====
Developer tools for working in Skia.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

View File

@ -1,458 +0,0 @@
Markdown
========
This site can handle normal Markdown and many common extensions. To learn
how the following is done please see the [source for this page](./markdown.md).
Any file you put under `/site/` that has the extension `.md` will be processed
as Markdown. All other files will be served directly. For example, images
can be added and they will be served correctly and referenced from within Markdown files.
When preparing for a code review of site docs you can get a preview of how the
page will render by visiting the skia.org site and add a query parameter `cl`
with the value of the Reitveld issue id:
https://skia.org/path/to/markdown-file?cl=REITVELD_ISSUE_NUMBER
This is the preferred method of previewing docs changes.
If for some reason you can't use the method above to preview docs changes you
can also run a local copy of the documentation server, which will allow you to
preview changes much quicker. You must have a recent version (>=8.9) of
[node](https://nodejs.org/) installed on your machine. You must also have
[Go](https://golang.org) installed on your computer, which you will have if
you are running on a Google corporate workstation. Installation also means
that you have `$GOPATH/bin` [added to your PATH](https://golang.org/doc/code.html#GOPATH). Run:
git clone https://skia.googlesource.com/buildbot
cd buildbot/docserverk
make
And then **from within** the directory of your local Git checkout of Skia run:
docserverk --preview --local
Then visit http://localhost:8000 to preview your changes. There is no need to
restart the server for file changes, but you will need to restart it if there
are changes to the navigation menu, i.e. you add or remove a file and want it
to appear in the navigation on the right hand side of the page.
If port 8000 is unavailable on your machine you can set the port to use via
the --port flag:
docserverk --preview --local --port=:8002
METADATA
--------
By default all files and directories that appear in the same level are sorted
alphabetically by file name in the navigation menu, with files appearing
before directories. You can override this default behavior by adding a
METADATA file to a directory. A METADATA file is a JSON file of the following
format:
~~~~
{
"dirOrder": ["sample", "quick", "special"],
"fileOrder": ["download", "api"]
}
~~~~
If a file or directory doesn't appear in `dirOrder` or `fileOrder` then it is sorted
to appear after the members of `dirOrder` or `fileOrder` respectively. All
files and directories that aren't controlled by a METADATA file are sorted in
alphabetical order by their filename.
Some Example Markdown
---------------------
This is a [link](https://www.google.com). You can also create
ordered and unordered lists:
1. First
2. Second:
* Fee
* Fie
* Foe
* Fum
3. Third
Incorporate images:
![image](/dev/tools/image.png)
Or go old school and use [ASCII art](http://asciiflow.com/):
~~~~
+----------------+
| Should you |
+--+ use ASCII art? +--+
| +----------------+ |
| |
+---v---+ +---v---+
| | | |
| Yes | | No |
| | | |
+-------+ +-------+
~~~~
Format code snippets or other preformatted text. Just surround the code
with `~~~~`. You can also trigger syntax highlighting by putting in
the following HTML comment before the code section:
<!--?prettify?-->
<!--?prettify?-->
~~~~
class SK_API SkPaint {
public:
SkPaint();
SkPaint(const SkPaint& paint);
~SkPaint();
SkPaint& operator=(const SkPaint&);
~~~~
Tables
Name | Value | Summary
--------|----------|--------
A | 27 | yes
B | 23 | no
There are also inline styles for *emphasis*, **bold**,
~~strikethrough~~, and `inline code`. Also small fractions,
such as 1/2 are rendered nicely.
> # There are
> ## Headers
> ### Up To
> #### Six
> ##### Levels
> ###### Deep
And you can <b>always</b> use HTML, which is useful for features that can't be
done in Markdown, such as iframes, but try to avoid using HTML outside of
sitations like that.
<svg viewBox="0 0 24 24" height="24px" width="24px" style="display: inline;">
<g>
<path d="M1
21h4v-12h-4v12zm22-11c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06l-1.06-1.05-6.58
6.59c-.37.36-.59.86-.59 1.41v10c0 1.1.9 2 2 2h9c.83 0 1.54-.5
1.84-1.22l3.02-7.05c.09-.23.14-.47.14-.73v-1.91l-.01-.01.01-.08z"> </path>
</g>
</svg>
Reference
=========
Below is a longer reference on the Markdown that docserver accepts.
Paragraphs
----------
A paragraph is simply one or more consecutive lines of text, separated
by one or more blank lines. (A blank line is any line that looks like a
blank line -- a line containing nothing. Note: all spaces or tabs is considered
blank.) Normal paragraphs should not be intended with spaces or tabs.
Headers and Blockquotes
-----------------------
You can create headers by either "underlining" with equal signs (`=`) and hyphens (`-`),
or,you can put 1-6 hash marks (`#`) at the
beginning of the line -- the number of hashes equals the resulting
HTML header level.
Blockquotes are indicated using email-style '`>`' angle brackets.
Markdown:
A First Level Header
====================
A Second Level Header
---------------------
Now is the time for all good men to come to
the aid of their country. This is just a
regular paragraph.
The quick brown fox jumped over the lazy
dog's back.
### Header 3
> This is a blockquote.
>
> This is the second paragraph in the blockquote.
>
> ## This is an H2 in a blockquote
Output:
<h1>A First Level Header</h1>
<h2>A Second Level Header</h2>
<p>Now is the time for all good men to come to
the aid of their country. This is just a
regular paragraph.</p>
<p>The quick brown fox jumped over the lazy
dog's back.</p>
<h3>Header 3</h3>
<blockquote>
<p>This is a blockquote.</p>
<p>This is the second paragraph in the blockquote.</p>
<h2>This is an H2 in a blockquote</h2>
</blockquote>
### Phrase Emphasis ###
Markdown uses asterisks and underscores to indicate spans of emphasis.
Markdown:
Some of these words *are emphasized*.
Some of these words _are emphasized also_.
Use two asterisks for **strong emphasis**.
Or, if you prefer, __use two underscores instead__.
Output:
<p>Some of these words <em>are emphasized</em>.
Some of these words <em>are emphasized also</em>.</p>
<p>Use two asterisks for <strong>strong emphasis</strong>.
Or, if you prefer, <strong>use two underscores instead</strong>.</p>
## Lists ##
Unordered (bulleted) lists use asterisks, pluses, and hyphens (`*`,
`+`, and `-`) as list markers. These three markers are
interchangable; this:
* Candy.
* Gum.
* Booze.
this:
+ Candy.
+ Gum.
+ Booze.
and this:
- Candy.
- Gum.
- Booze.
all produce the same output:
<ul>
<li>Candy.</li>
<li>Gum.</li>
<li>Booze.</li>
</ul>
Ordered (numbered) lists use regular numbers, followed by periods, as
list markers:
1. Red
2. Green
3. Blue
Output:
<ol>
<li>Red</li>
<li>Green</li>
<li>Blue</li>
</ol>
If you put blank lines between items, you'll get `<p>` tags for the
list item text. You can create multi-paragraph list items by indenting
the paragraphs by 4 spaces or 1 tab:
* A list item.
With multiple paragraphs.
* Another item in the list.
Output:
<ul>
<li><p>A list item.</p>
<p>With multiple paragraphs.</p></li>
<li><p>Another item in the list.</p></li>
</ul>
### Links ###
Markdown supports two styles for creating links: *inline* and
*reference*. With both styles, you use square brackets to delimit the
text you want to turn into a link.
Inline-style links use parentheses immediately after the link text.
For example:
This is an [example link](http://example.com/).
Output:
<p>This is an <a href="http://example.com/">
example link</a>.</p>
Optionally, you may include a title attribute in the parentheses:
This is an [example link](http://example.com/ "With a Title").
Output:
<p>This is an <a href="http://example.com/" title="With a Title">
example link</a>.</p>
Reference-style links allow you to refer to your links by names, which
you define elsewhere in your document:
I get 10 times more traffic from [Google][1] than from
[Yahoo][2] or [MSN][3].
[1]: http://google.com/ "Google"
[2]: http://search.yahoo.com/ "Yahoo Search"
[3]: http://search.msn.com/ "MSN Search"
Output:
<p>I get 10 times more traffic from <a href="http://google.com/"
title="Google">Google</a> than from <a href="http://search.yahoo.com/"
title="Yahoo Search">Yahoo</a> or <a href="http://search.msn.com/"
title="MSN Search">MSN</a>.</p>
The title attribute is optional. Link names may contain letters,
numbers and spaces, but are *not* case sensitive:
I start my morning with a cup of coffee and
[The New York Times][NY Times].
[ny times]: http://www.nytimes.com/
Output:
<p>I start my morning with a cup of coffee and
<a href="http://www.nytimes.com/">The New York Times</a>.</p>
### Images ###
Image syntax is very much like link syntax.
Inline (titles are optional):
![alt text](/path/to/img.jpg "Title")
Reference-style:
![alt text][id]
[id]: /path/to/img.jpg "Title"
Both of the above examples produce the same output:
<img src="/path/to/img.jpg" alt="alt text" title="Title" />
### Code ###
In a regular paragraph, you can create code span by wrapping text in
backtick quotes. Any ampersands (`&`) and angle brackets (`<` or
`>`) will automatically be translated into HTML entities. This makes
it easy to use Markdown to write about HTML example code:
I strongly recommend against using any `<blink>` tags.
I wish SmartyPants used named entities like `&mdash;`
instead of decimal-encoded entites like `&#8212;`.
Output:
<p>I strongly recommend against using any
<code>&lt;blink&gt;</code> tags.</p>
<p>I wish SmartyPants used named entities like
<code>&amp;mdash;</code> instead of decimal-encoded
entites like <code>&amp;#8212;</code>.</p>
To specify an entire block of pre-formatted code, indent every line of
the block by 4 spaces or 1 tab, or add a line containing three backticks before
and after the code block. Just like with code spans, `&`, `<`,
and `>` characters will be escaped automatically.
Markdown:
If you want your page to validate under XHTML 1.0 Strict,
you've got to put paragraph tags in your blockquotes:
<blockquote>
<p>For example.</p>
</blockquote>
or
If you want your page to validate under XHTML 1.0 Strict,
you've got to put paragraph tags in your blockquotes:
```
<blockquote>
<p>For example.</p>
</blockquote>
```
Output:
<p>If you want your page to validate under XHTML 1.0 Strict,
you've got to put paragraph tags in your blockquotes:</p>
<pre><code>&lt;blockquote&gt;
&lt;p&gt;For example.&lt;/p&gt;
&lt;/blockquote&gt;
</code></pre>
### Floating Menu ###
To create a floating menu for a single page that always appears
in the upper right hand corner of the page, use a `div` with a
class of "float", for example:
<div class="float">
<ul>
<li><a href="#SkXfermode">SkXfermode</a></li>
<li><a href="#SkShader">SkShader</a></li>
<li><a href="#SkMaskFilter">SkMaskFilter</a></li>
<li><a href="#SkColorFilter">SkColorFilter</a></li>
<li><a href="#SkPathEffect">SkPathEffect</a></li>
</ul>
</div>

Some files were not shown because too many files have changed in this diff Show More