summaryrefslogtreecommitdiff
path: root/.config/qutebrowser/misc
diff options
context:
space:
mode:
Diffstat (limited to '.config/qutebrowser/misc')
-rw-r--r--.config/qutebrowser/misc/Makefile33
-rw-r--r--.config/qutebrowser/misc/apparmor/usr.bin.qutebrowser41
-rw-r--r--.config/qutebrowser/misc/cheatsheet.svg3726
-rw-r--r--.config/qutebrowser/misc/qutebrowser.appdata.xml48
-rw-r--r--.config/qutebrowser/misc/qutebrowser.desktop12
-rw-r--r--.config/qutebrowser/misc/qutebrowser.nsi80
-rw-r--r--.config/qutebrowser/misc/qutebrowser.rcc13
-rw-r--r--.config/qutebrowser/misc/qutebrowser.spec76
-rw-r--r--.config/qutebrowser/misc/requirements/README.md20
-rw-r--r--.config/qutebrowser/misc/requirements/requirements-check-manifest.txt3
-rw-r--r--.config/qutebrowser/misc/requirements/requirements-check-manifest.txt-raw1
-rw-r--r--.config/qutebrowser/misc/requirements/requirements-codecov.txt9
-rw-r--r--.config/qutebrowser/misc/requirements/requirements-codecov.txt-raw1
-rw-r--r--.config/qutebrowser/misc/requirements/requirements-flake8.txt27
-rw-r--r--.config/qutebrowser/misc/requirements/requirements-flake8.txt-raw23
-rw-r--r--.config/qutebrowser/misc/requirements/requirements-pip.txt8
-rw-r--r--.config/qutebrowser/misc/requirements/requirements-pyinstaller.txt7
-rw-r--r--.config/qutebrowser/misc/requirements/requirements-pyinstaller.txt-raw1
-rw-r--r--.config/qutebrowser/misc/requirements/requirements-pylint-master.txt19
-rw-r--r--.config/qutebrowser/misc/requirements/requirements-pylint-master.txt-raw11
-rw-r--r--.config/qutebrowser/misc/requirements/requirements-pylint.txt19
-rw-r--r--.config/qutebrowser/misc/requirements/requirements-pylint.txt-raw7
-rw-r--r--.config/qutebrowser/misc/requirements/requirements-pyqt.txt4
-rw-r--r--.config/qutebrowser/misc/requirements/requirements-pyqt.txt-raw1
-rw-r--r--.config/qutebrowser/misc/requirements/requirements-pyroma.txt4
-rw-r--r--.config/qutebrowser/misc/requirements/requirements-pyroma.txt-raw1
-rw-r--r--.config/qutebrowser/misc/requirements/requirements-qutebrowser.txt-raw7
-rw-r--r--.config/qutebrowser/misc/requirements/requirements-tests-git.txt38
-rw-r--r--.config/qutebrowser/misc/requirements/requirements-tests.txt42
-rw-r--r--.config/qutebrowser/misc/requirements/requirements-tests.txt-raw21
-rw-r--r--.config/qutebrowser/misc/requirements/requirements-tox.txt9
-rw-r--r--.config/qutebrowser/misc/requirements/requirements-tox.txt-raw1
-rw-r--r--.config/qutebrowser/misc/requirements/requirements-vulture.txt3
-rw-r--r--.config/qutebrowser/misc/requirements/requirements-vulture.txt-raw1
-rwxr-xr-x.config/qutebrowser/misc/userscripts/cast156
-rwxr-xr-x.config/qutebrowser/misc/userscripts/dmenu_qutebrowser48
-rwxr-xr-x.config/qutebrowser/misc/userscripts/format_json42
-rwxr-xr-x.config/qutebrowser/misc/userscripts/getbib69
-rwxr-xr-x.config/qutebrowser/misc/userscripts/open_download115
-rwxr-xr-x.config/qutebrowser/misc/userscripts/openfeeds40
-rwxr-xr-x.config/qutebrowser/misc/userscripts/password_fill381
-rwxr-xr-x.config/qutebrowser/misc/userscripts/qute-keepass261
-rwxr-xr-x.config/qutebrowser/misc/userscripts/qute-lastpass172
-rwxr-xr-x.config/qutebrowser/misc/userscripts/qute-pass207
-rwxr-xr-x.config/qutebrowser/misc/userscripts/qutedmenu54
-rwxr-xr-x.config/qutebrowser/misc/userscripts/readability41
-rwxr-xr-x.config/qutebrowser/misc/userscripts/ripbang34
-rwxr-xr-x.config/qutebrowser/misc/userscripts/rss122
-rwxr-xr-x.config/qutebrowser/misc/userscripts/taskadd34
-rwxr-xr-x.config/qutebrowser/misc/userscripts/tor_identity52
-rwxr-xr-x.config/qutebrowser/misc/userscripts/view_in_mpv143
51 files changed, 6288 insertions, 0 deletions
diff --git a/.config/qutebrowser/misc/Makefile b/.config/qutebrowser/misc/Makefile
new file mode 100644
index 0000000..210480e
--- /dev/null
+++ b/.config/qutebrowser/misc/Makefile
@@ -0,0 +1,33 @@
+PYTHON = python3
+PREFIX = /usr/local
+DESTDIR =
+ICONSIZES = 16 24 32 48 64 128 256 512
+
+SETUPTOOLSOPTIONS =
+ifdef DESTDIR
+SETUPTOOLSOPTS = --root="$(DESTDIR)"
+endif
+
+.PHONY: install
+
+doc/qutebrowser.1.html:
+ a2x -f manpage doc/qutebrowser.1.asciidoc
+
+install: doc/qutebrowser.1.html
+ $(PYTHON) setup.py install --prefix="$(PREFIX)" --optimize=1 $(SETUPTOOLSOPTS)
+ install -Dm644 misc/qutebrowser.appdata.xml \
+ "$(DESTDIR)$(PREFIX)/share/metainfo/qutebrowser.appdata.xml"
+ install -Dm644 doc/qutebrowser.1 \
+ "$(DESTDIR)$(PREFIX)/share/man/man1/qutebrowser.1"
+ install -Dm644 misc/qutebrowser.desktop \
+ "$(DESTDIR)$(PREFIX)/share/applications/qutebrowser.desktop"
+ $(foreach i,$(ICONSIZES),install -Dm644 "icons/qutebrowser-$(i)x$(i).png" \
+ "$(DESTDIR)$(PREFIX)/share/icons/hicolor/$(i)x$(i)/apps/qutebrowser.png";)
+ install -Dm644 icons/qutebrowser.svg \
+ "$(DESTDIR)$(PREFIX)/share/icons/hicolor/scalable/apps/qutebrowser.svg"
+ install -Dm755 -t "$(DESTDIR)$(PREFIX)/share/qutebrowser/userscripts/" \
+ $(wildcard misc/userscripts/*)
+ install -Dm755 -t "$(DESTDIR)$(PREFIX)/share/qutebrowser/scripts/" \
+ $(filter-out scripts/__init__.py scripts/__pycache__ scripts/dev \
+ scripts/testbrowser scripts/asciidoc2html.py scripts/setupcommon.py \
+ scripts/link_pyqt.py,$(wildcard scripts/*))
diff --git a/.config/qutebrowser/misc/apparmor/usr.bin.qutebrowser b/.config/qutebrowser/misc/apparmor/usr.bin.qutebrowser
new file mode 100644
index 0000000..b993e00
--- /dev/null
+++ b/.config/qutebrowser/misc/apparmor/usr.bin.qutebrowser
@@ -0,0 +1,41 @@
+# AppArmor profile for qutebrowser
+# Tested on Debian jessie
+
+#include <tunables/global>
+
+profile qutebrowser /usr/{local/,}bin/qutebrowser {
+
+ #include <abstractions/base>
+ #include <abstractions/nameservice>
+ #include <abstractions/openssl>
+ #include <abstractions/ssl_certs>
+ #include <abstractions/audio>
+ #include <abstractions/fonts>
+ #include <abstractions/kde>
+ #include <abstractions/user-download>
+ #include <abstractions/X>
+
+ capability dac_override,
+
+ /usr/{local/,}bin/ r,
+ /usr/{local/,}bin/qutebrowser rix,
+ /usr/bin/python3.? r,
+
+ /usr/lib/python3/ mr,
+ /usr/lib/python3/** mr,
+ /usr/lib/python3.?/ r,
+ /usr/lib/python3.?/** mr,
+ /usr/local/lib/python3.?/** r,
+
+ /proc/*/mounts r,
+ owner /tmp/** rwkl,
+ owner /run/user/*/ rw,
+ owner /run/user/*/** krw,
+
+ @{HOME}/.config/qutebrowser/** krw,
+ @{HOME}/.local/share/qutebrowser/** krw,
+ @{HOME}/.cache/qutebrowser/** krw,
+ @{HOME}/.gstreamer-0.10/* r,
+
+}
+
diff --git a/.config/qutebrowser/misc/cheatsheet.svg b/.config/qutebrowser/misc/cheatsheet.svg
new file mode 100644
index 0000000..bb87142
--- /dev/null
+++ b/.config/qutebrowser/misc/cheatsheet.svg
@@ -0,0 +1,3726 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1092.2667"
+ height="682.66669"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.92.2 5c3e80d, 2017-08-06"
+ version="1.0"
+ sodipodi:docname="cheatsheet.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/vav/images/xmonad/xmbindings_lg.png"
+ inkscape:export-xdpi="112.5"
+ inkscape:export-ydpi="112.5">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.7536248"
+ inkscape:cx="430.72917"
+ inkscape:cy="268.64059"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ width="1024px"
+ height="640px"
+ showgrid="false"
+ inkscape:window-width="2560"
+ inkscape:window-height="1440"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-maximized="0"
+ inkscape:snap-text-baseline="true"
+ inkscape:measure-start="0,0"
+ inkscape:measure-end="0,0">
+ <inkscape:grid
+ id="GridFromPre046Settings"
+ type="xygrid"
+ originx="0"
+ originy="0"
+ spacingx="2.1333333"
+ spacingy="2.1333333"
+ color="#3f3fff"
+ empcolor="#3f3fff"
+ opacity="0.15"
+ empopacity="0.38"
+ empspacing="5" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <rect
+ ry="4.7797003"
+ y="163.79405"
+ x="10.666667"
+ height="64"
+ width="74.666664"
+ id="rect3328"
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <rect
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect3330"
+ width="64"
+ height="64"
+ x="96"
+ y="163.79405"
+ ry="4.7797003" />
+ <rect
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect3382"
+ width="63.461262"
+ height="64"
+ x="544.48407"
+ y="163.79405"
+ ry="4.7797003" />
+ <rect
+ ry="4.7797003"
+ y="163.79405"
+ x="619.1535"
+ height="64"
+ width="63.461262"
+ id="rect3384"
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <rect
+ ry="4.7797003"
+ y="163.79405"
+ x="469.8172"
+ height="64"
+ width="63.461262"
+ id="rect3386"
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <rect
+ ry="4.7797003"
+ y="163.79405"
+ x="768.48407"
+ height="64"
+ width="63.461262"
+ id="rect3388"
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <rect
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect3392"
+ width="63.461262"
+ height="64"
+ x="693.82019"
+ y="163.79405"
+ ry="4.7797003" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="99.751244"
+ y="187.30594"
+ id="text3444"><tspan
+ sodipodi:role="line"
+ id="tspan3446"
+ x="99.751244"
+ y="187.30594"
+ style="font-size:19.20000076px;line-height:1.25;stroke-width:1.06666672">Q</tspan></text>
+ <rect
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect2739"
+ width="63.461262"
+ height="64"
+ x="320.05182"
+ y="163.79405"
+ ry="4.7797003" />
+ <text
+ id="text3448"
+ y="187.60356"
+ x="323.15463"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="187.60356"
+ x="323.15463"
+ id="tspan3450"
+ sodipodi:role="line"
+ style="font-size:19.20000076px;line-height:1.25;stroke-width:1.06666672">R</tspan></text>
+ <rect
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect7301"
+ width="63.461262"
+ height="64"
+ x="171.15358"
+ y="163.79405"
+ ry="4.7797003" />
+ <path
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 171.24757,196.86071 c 21.0911,0 42.18218,0 63.27327,0"
+ id="path7305"
+ inkscape:connector-curvature="0" />
+ <text
+ id="text3464"
+ y="187.92427"
+ x="175.64062"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:monospace;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="187.92427"
+ x="175.64062"
+ sodipodi:role="line"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ id="tspan3498">W</tspan></text>
+ <text
+ id="text3468"
+ y="216.29616"
+ x="99.515625"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="216.29616"
+ x="99.515625"
+ id="tspan3470"
+ sodipodi:role="line"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">q</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="175.64062"
+ y="220.43825"
+ id="text3472"><tspan
+ sodipodi:role="line"
+ id="tspan3474"
+ x="175.64062"
+ y="220.43825"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">w</tspan></text>
+ <path
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 96.637962,195.79405 c 21.265388,0 42.530768,0 63.796148,0"
+ id="path3476"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g7271"
+ transform="translate(0,16.59406)"
+ style="fill:#eeeeec;fill-opacity:1">
+ <rect
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect3378"
+ width="63.461262"
+ height="64"
+ x="395.15076"
+ y="147.2"
+ ry="4.7797003" />
+ <rect
+ ry="2.4296808"
+ y="147.2"
+ x="395.15076"
+ height="32.533333"
+ width="63.461262"
+ id="rect7269"
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <path
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 395.24997,179.73333 c 21.26539,0 42.53077,0 63.79615,0"
+ id="path3484"
+ inkscape:connector-curvature="0" />
+ </g>
+ <path
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.1617893px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 469.91423,196.86071 c 21.08993,0 42.17982,0 63.26974,0"
+ id="path3486"
+ inkscape:connector-curvature="0" />
+ <path
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 544.58331,196.86071 c 21.26538,0 42.53076,0 63.79615,0"
+ id="path3488"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path3490"
+ d="m 619.24757,196.32738 c 21.0911,0 42.18218,0 63.27327,0"
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path3492"
+ d="m 693.91424,196.86071 c 21.09109,0 42.18218,0 63.27327,0"
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path3494"
+ d="m 768.58331,196.86071 c 21.26538,0 42.53076,0 63.79615,0"
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <rect
+ ry="4.7797003"
+ y="163.79405"
+ x="245.38516"
+ height="64"
+ width="63.461262"
+ id="rect2735"
+ style="font-size:18px;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <path
+ id="path2737"
+ d="m 245.47916,195.19999 c 21.09109,0 42.18217,0 63.27327,0"
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="248.78169"
+ y="187.60356"
+ id="text3502"><tspan
+ sodipodi:role="line"
+ id="tspan3504"
+ x="248.78169"
+ y="187.60356"
+ style="font-size:19.20000076px;line-height:1.25;stroke-width:1.06666672">E</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="248.64069"
+ y="220.16637"
+ id="text3506"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan3508"
+ x="248.64069"
+ y="220.16637">e</tspan></text>
+ <path
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 320.14582,195.19999 c 21.0911,0 42.18218,0 63.27327,0"
+ id="path2741"
+ inkscape:connector-curvature="0" />
+ <text
+ id="text3510"
+ y="219.88054"
+ x="321.97186"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672"
+ y="219.88054"
+ x="321.97186"
+ id="tspan3512"
+ sodipodi:role="line">r</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="399.83853"
+ y="220.32741"
+ id="text3532"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan3534"
+ x="399.83853"
+ y="220.32741">t</tspan></text>
+ <text
+ id="text3536"
+ y="217.93365"
+ x="474.22501"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ y="217.93365"
+ x="474.22501"
+ id="tspan3538"
+ sodipodi:role="line">y</tspan></text>
+ <text
+ id="text3540"
+ y="219.90315"
+ x="547.44312"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="219.90315"
+ x="547.44312"
+ id="tspan3542"
+ sodipodi:role="line"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672">u</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="622.33124"
+ y="220.32741"
+ id="text3544"><tspan
+ sodipodi:role="line"
+ id="tspan3546"
+ x="622.33124"
+ y="220.32741"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">i</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="698.52502"
+ y="219.88054"
+ id="text3548"><tspan
+ sodipodi:role="line"
+ id="tspan3550"
+ x="698.52502"
+ y="219.88054"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">o</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="772.01251"
+ y="219.88054"
+ id="text3552"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan3554"
+ x="772.01251"
+ y="219.88054">p</tspan></text>
+ <text
+ id="text3556"
+ y="201.17621"
+ x="851.88257"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-size:23.46666718px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672px"
+ y="201.17621"
+ x="851.88257"
+ id="tspan3558"
+ sodipodi:role="line"> </tspan></text>
+ <rect
+ ry="4.7797003"
+ y="238.46074"
+ x="106.23158"
+ height="64"
+ width="64"
+ id="rect3616"
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <rect
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect3618"
+ width="63.461262"
+ height="64"
+ x="181.38516"
+ y="238.46074"
+ ry="4.7797003" />
+ <rect
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect3620"
+ width="64.538773"
+ height="64"
+ x="255.56491"
+ y="238.46074"
+ ry="4.7797003" />
+ <rect
+ ry="4.7797003"
+ y="238.46074"
+ x="332.05182"
+ height="64"
+ width="63.461262"
+ id="rect3622"
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <rect
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect3624"
+ width="63.461262"
+ height="64"
+ x="405.38232"
+ y="238.46074"
+ ry="4.7797003" />
+ <rect
+ ry="4.7797003"
+ y="238.46074"
+ x="554.71564"
+ height="64"
+ width="63.461262"
+ id="rect3626"
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <rect
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect3628"
+ width="63.461262"
+ height="64"
+ x="629.38507"
+ y="238.46074"
+ ry="4.7797003" />
+ <rect
+ ry="4.7797003"
+ y="238.46074"
+ x="779.1535"
+ height="64"
+ width="63.948242"
+ id="rect3634"
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <text
+ id="text3638"
+ y="262.07977"
+ x="110.55427"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="262.07977"
+ x="110.55427"
+ id="tspan3640"
+ sodipodi:role="line"
+ style="font-size:19.20000076px;line-height:1.25;stroke-width:1.06666672">A</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="335.79037"
+ y="264.53333"
+ id="text3642"><tspan
+ sodipodi:role="line"
+ id="tspan3644"
+ x="335.79037"
+ y="264.53333"
+ style="font-size:19.20000076px;line-height:1.25;stroke-width:1.06666672">F</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:monospace;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="185.38518"
+ y="261.80792"
+ id="text3646"><tspan
+ id="tspan3648"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ sodipodi:role="line"
+ x="185.38518"
+ y="261.80792">S</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="110.07188"
+ y="295.08054"
+ id="text3650"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan3652"
+ x="110.07188"
+ y="295.08054">a</tspan></text>
+ <text
+ id="text3654"
+ y="295.08054"
+ x="185.54375"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ y="295.08054"
+ x="185.54375"
+ id="tspan3656"
+ sodipodi:role="line">s</tspan></text>
+ <path
+ id="path3658"
+ d="m 106.86955,270.46071 c 21.26538,0 42.53076,0 63.79615,0"
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 181.47916,270.99405 c 21.09109,0 42.18217,0 63.27327,0"
+ id="path3660"
+ inkscape:connector-curvature="0" />
+ <path
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:0.60877639px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 256.71172,270.08518 c 20.26767,0 40.53532,0 60.80299,0"
+ id="path3662"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path3664"
+ d="m 330.81249,271.52738 c 21.09109,0 42.18218,0 63.27327,0"
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 405.48156,270.99405 c 21.26538,0 42.53076,0 63.79615,0"
+ id="path3666"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g10542"
+ transform="matrix(1,0,0,-1,0,653.98815)"
+ style="fill:#eeeeec;fill-opacity:1">
+ <rect
+ ry="4.7797003"
+ y="351.5274"
+ x="480.04877"
+ height="64"
+ width="63.461262"
+ id="rect3630"
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <rect
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect8437"
+ width="63.461262"
+ height="33.005924"
+ x="480.04877"
+ y="351.5274"
+ ry="2.4649756" />
+ <path
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:#000000;stroke-width:1.1617893px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 480.14581,384.59406 c 21.08993,0 42.17982,0 63.26974,0"
+ id="path3668"
+ inkscape:connector-curvature="0" />
+ </g>
+ <path
+ id="path3670"
+ d="m 554.81489,271.52738 c 21.26539,0 42.53076,0 63.79615,0"
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 629.47916,270.99405 c 21.09109,0 42.18217,0 63.27327,0"
+ id="path3672"
+ inkscape:connector-curvature="0" />
+ <path
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 704.14582,271.52738 c 21.0911,0 42.18218,0 63.27327,0"
+ id="path3674"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path3678"
+ d="m 779.24757,270.99405 c 21.0911,0 42.18218,0 63.27327,0"
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <text
+ id="text3680"
+ y="262.07977"
+ x="259.86594"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="262.07977"
+ x="259.86594"
+ id="tspan3682"
+ sodipodi:role="line"
+ style="font-size:19.20000076px;line-height:1.25;stroke-width:1.06666672">D</tspan></text>
+ <text
+ id="text3684"
+ y="295.7149"
+ x="260.63126"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="295.7149"
+ x="260.63126"
+ id="tspan3686"
+ sodipodi:role="line"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672">d</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="335.79037"
+ y="293.96075"
+ id="text3688"><tspan
+ sodipodi:role="line"
+ id="tspan3690"
+ x="335.79037"
+ y="293.96075"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">f</tspan></text>
+ <text
+ id="text3692"
+ y="293.27176"
+ x="409.74942"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="293.27176"
+ x="409.74942"
+ id="tspan3694"
+ sodipodi:role="line"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">g</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="483.63565"
+ y="292.44882"
+ id="text3696"><tspan
+ sodipodi:role="line"
+ id="tspan3698"
+ x="483.63565"
+ y="292.44882"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672">h</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="563.19849"
+ y="293.46237"
+ id="text3700"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan3702"
+ x="563.19849"
+ y="293.46237">j</tspan></text>
+ <text
+ id="text3704"
+ y="298.28571"
+ x="630.01605"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672"
+ y="298.28571"
+ x="630.01605"
+ id="tspan3706"
+ sodipodi:role="line">k</tspan></text>
+ <g
+ id="g10537"
+ transform="translate(0,-112.47259)"
+ style="fill:#eeeeec;fill-opacity:1">
+ <rect
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect8447"
+ width="63.461262"
+ height="64"
+ x="704"
+ y="350.93332"
+ ry="4.7797003" />
+ <rect
+ ry="2.3898501"
+ y="382.93332"
+ x="704"
+ height="32"
+ width="63.461262"
+ id="rect8449"
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <path
+ id="path8451"
+ d="m 704.33984,383.97137 c 21.08993,0 42.17982,0 63.26974,0"
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:#000000;stroke-width:1.1617893px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ </g>
+ <text
+ id="text3708"
+ y="297.45032"
+ x="708.60419"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672"
+ y="297.45032"
+ x="708.60419"
+ id="tspan3710"
+ sodipodi:role="line">l</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="781.47919"
+ y="292.20032"
+ id="text3716"><tspan
+ sodipodi:role="line"
+ id="tspan3718"
+ x="781.47919"
+ y="292.20032"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">;</tspan></text>
+ <rect
+ ry="4.7797003"
+ y="238.46074"
+ x="854.2525"
+ height="64"
+ width="63.461262"
+ id="rect3720"
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <path
+ id="path3724"
+ d="m 854.35172,271.52738 c 21.26539,0 42.53077,0 63.79615,0"
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="font-size:18px;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect3722"
+ width="137.60541"
+ height="64"
+ x="929.06122"
+ y="238.46074"
+ ry="4.7797003" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="858.5"
+ y="296.23157"
+ id="text3728"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan3730"
+ x="858.5"
+ y="296.23157">'</tspan></text>
+ <text
+ id="text3740"
+ y="279.57574"
+ x="929.25153"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="279.57574"
+ x="929.25153"
+ id="tspan3742"
+ sodipodi:role="line"
+ style="font-size:21.33333397px;line-height:1.25;stroke-width:1.06666672">↲</tspan></text>
+ <rect
+ style="font-size:18px;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect3764"
+ width="64"
+ height="64"
+ x="116.89825"
+ y="313.12741"
+ ry="4.7797003" />
+ <rect
+ ry="4.7797003"
+ y="313.12741"
+ x="192.05182"
+ height="64"
+ width="63.461262"
+ id="rect3766"
+ style="font-size:18px;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <rect
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect3770"
+ width="63.461262"
+ height="64"
+ x="341.38516"
+ y="313.12741"
+ ry="4.7797003" />
+ <rect
+ ry="4.7797003"
+ y="313.12741"
+ x="416.04898"
+ height="64"
+ width="63.461262"
+ id="rect3772"
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <rect
+ ry="4.7797003"
+ y="313.12741"
+ x="490.71542"
+ height="64"
+ width="63.461262"
+ id="rect3778"
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <rect
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect3780"
+ width="63.948242"
+ height="64"
+ x="789.82019"
+ y="313.12741"
+ ry="4.7797003" />
+ <text
+ id="text3796"
+ y="368.70032"
+ x="126.76303"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="368.70032"
+ x="126.76303"
+ id="tspan3798"
+ sodipodi:role="line"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">z</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="199.07387"
+ y="367.11551"
+ id="text3800"><tspan
+ sodipodi:role="line"
+ id="tspan3802"
+ x="199.07387"
+ y="367.11551"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">x</tspan></text>
+ <path
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 117.53621,345.12738 c 21.26539,0 42.53077,0 63.79615,0"
+ id="path3804"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path3806"
+ d="m 192.14582,345.66071 c 21.0911,0 42.18218,0 63.27327,0"
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <rect
+ ry="4.7797003"
+ y="313.12741"
+ x="266.23157"
+ height="64"
+ width="64.538773"
+ id="rect3768"
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <path
+ id="path3808"
+ d="m 267.37839,344.75185 c 20.26767,0 40.53532,0 60.80299,0"
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.06666672;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 341.47916,346.19405 c 21.09109,0 42.18217,0 63.27327,0"
+ id="path3810"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path3812"
+ d="m 416.14822,345.66071 c 21.26539,0 42.53077,0 63.79615,0"
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.1617893px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 490.81248,346.19405 c 21.08993,0 42.17982,0 63.26974,0"
+ id="path3814"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g7140"
+ transform="translate(0,16.594076)"
+ style="fill:#eeeeec;fill-opacity:1">
+ <rect
+ ry="4.7797003"
+ y="296.53333"
+ x="565.38226"
+ height="64"
+ width="63.461262"
+ id="rect3774"
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <rect
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect7131"
+ width="63.461262"
+ height="32"
+ x="565.38226"
+ y="328.53333"
+ ry="2.3898501" />
+ <path
+ id="path3816"
+ d="m 565.48156,329.6 c 21.26538,0 42.53076,0 63.79615,0"
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ id="g7162"
+ transform="translate(0,16.594076)"
+ style="fill:#babdb6;fill-opacity:1">
+ <rect
+ style="font-size:18px;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect3776"
+ width="63.461262"
+ height="64"
+ x="640.05176"
+ y="296.53333"
+ ry="4.7797003" />
+ <rect
+ ry="2.3898501"
+ y="328.53333"
+ x="640.05176"
+ height="32"
+ width="63.461262"
+ id="rect7160"
+ style="font-size:18px;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <path
+ style="font-size:18px;fill:#babdb6;fill-opacity:1;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 640.14582,329.06667 c 21.0911,0 42.18218,0 63.27327,0"
+ id="path3818"
+ inkscape:connector-curvature="0" />
+ </g>
+ <path
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 789.91424,345.66071 c 21.09109,0 42.18218,0 63.27327,0"
+ id="path3822"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="271.65314"
+ y="368.61978"
+ id="text3828"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan3830"
+ x="271.65314"
+ y="368.61978">c</tspan></text>
+ <text
+ id="text3832"
+ y="368.62741"
+ x="348.59036"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ y="368.62741"
+ x="348.59036"
+ id="tspan3834"
+ sodipodi:role="line">v</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="420.34647"
+ y="367.93842"
+ id="text3836"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan3838"
+ x="420.34647"
+ y="367.93842">b</tspan></text>
+ <text
+ id="text3840"
+ y="368.05829"
+ x="494.32407"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672"
+ y="368.05829"
+ x="494.32407"
+ id="tspan3842"
+ sodipodi:role="line">n</tspan></text>
+ <text
+ id="text3844"
+ y="368.12903"
+ x="573.86517"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="368.12903"
+ x="573.86517"
+ id="tspan3846"
+ sodipodi:role="line"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">m</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="643.82837"
+ y="367.86551"
+ id="text3848"><tspan
+ sodipodi:role="line"
+ id="tspan3850"
+ x="643.82837"
+ y="367.86551"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">,</tspan></text>
+ <g
+ id="g7167"
+ transform="translate(74.666662,16.594076)"
+ style="fill:#eeeeec;fill-opacity:1">
+ <rect
+ ry="4.7797003"
+ y="296.53333"
+ x="640.05176"
+ height="64"
+ width="63.461262"
+ id="rect7169"
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <rect
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect7171"
+ width="63.461262"
+ height="32"
+ x="640.05176"
+ y="328.53333"
+ ry="2.3898501" />
+ <path
+ id="path7173"
+ d="m 640.14582,329.06667 c 21.0911,0 42.18218,0 63.27327,0"
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="718.6156"
+ y="367.46667"
+ id="text3852"><tspan
+ sodipodi:role="line"
+ id="tspan3854"
+ x="718.6156"
+ y="367.46667"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">.</tspan></text>
+ <text
+ id="text3856"
+ y="367.10361"
+ x="798.54919"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ y="367.10361"
+ x="798.54919"
+ id="tspan3858"
+ sodipodi:role="line">/</tspan></text>
+ <rect
+ ry="4.7797003"
+ y="89.127388"
+ x="85.333328"
+ height="64"
+ width="64"
+ id="rect3876"
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <rect
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect3878"
+ width="63.461262"
+ height="64"
+ x="160.48691"
+ y="89.127388"
+ ry="4.7797003" />
+ <rect
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect10511"
+ width="63.461262"
+ height="64"
+ x="235.15358"
+ y="89.127388"
+ ry="4.7797003" />
+ <rect
+ ry="4.7797003"
+ y="89.127388"
+ x="309.82025"
+ height="64"
+ width="63.461262"
+ id="rect3882"
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <rect
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect3884"
+ width="63.461262"
+ height="64"
+ x="384.48407"
+ y="89.127388"
+ ry="4.7797003" />
+ <rect
+ ry="4.7797003"
+ y="89.127388"
+ x="533.81738"
+ height="64"
+ width="63.461262"
+ id="rect3886"
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <rect
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect3888"
+ width="63.461262"
+ height="64"
+ x="608.48688"
+ y="89.127388"
+ ry="4.7797003" />
+ <rect
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect3890"
+ width="63.461262"
+ height="64"
+ x="459.15051"
+ y="89.127388"
+ ry="4.7797003" />
+ <rect
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect3892"
+ width="63.461262"
+ height="64"
+ x="757.33331"
+ y="89.127388"
+ ry="4.7797003" />
+ <rect
+ ry="4.7797003"
+ y="89.127388"
+ x="832.48688"
+ height="64"
+ width="63.461262"
+ id="rect3894"
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <rect
+ ry="4.7797003"
+ y="89.127388"
+ x="683.1535"
+ height="64"
+ width="63.461262"
+ id="rect3896"
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="88.721916"
+ y="145.3714"
+ id="text3910"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan3912"
+ x="88.721916"
+ y="145.3714">1</tspan></text>
+ <text
+ id="text3914"
+ y="144.91666"
+ x="162.87187"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ y="144.91666"
+ x="162.87187"
+ id="tspan3916"
+ sodipodi:role="line">2</tspan></text>
+ <path
+ id="path3918"
+ d="m 85.971291,121.12738 c 21.265389,0 42.530769,0 63.796159,0"
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 160.58091,121.66071 c 21.09109,0 42.18217,0 63.27327,0"
+ id="path3920"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path3924"
+ d="m 309.91424,122.19405 c 21.09109,0 42.18218,0 63.27327,0"
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 384.58331,121.66071 c 21.26538,0 42.53076,0 63.79615,0"
+ id="path3926"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path3928"
+ d="m 459.24756,122.19405 c 21.08993,0 42.17982,0 63.26974,0"
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.1617893px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path3930"
+ d="m 533.91664,122.19405 c 21.26539,0 42.53076,0 63.79615,0"
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 608.58091,121.66071 c 21.09109,0 42.18217,0 63.27327,0"
+ id="path3932"
+ inkscape:connector-curvature="0" />
+ <path
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 683.24757,122.19405 c 21.0911,0 42.18218,0 63.27327,0"
+ id="path3934"
+ inkscape:connector-curvature="0" />
+ <path
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 757.91664,122.19405 c 21.26539,0 42.53076,0 63.79615,0"
+ id="path3936"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path3938"
+ d="m 832.58091,121.66071 c 21.09109,0 42.18217,0 63.27327,0"
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 235.24757,122.19405 c 21.0911,0 42.18218,0 63.27327,0"
+ id="path10513"
+ inkscape:connector-curvature="0" />
+ <text
+ id="text3944"
+ y="144.91666"
+ x="239.48438"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="144.91666"
+ x="239.48438"
+ id="tspan3946"
+ sodipodi:role="line"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">3</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="312.26355"
+ y="145.3714"
+ id="text3948"><tspan
+ sodipodi:role="line"
+ id="tspan3950"
+ x="312.26355"
+ y="145.3714"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">4</tspan></text>
+ <text
+ id="text3952"
+ y="144.79477"
+ x="386.92606"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="144.79477"
+ x="386.92606"
+ id="tspan3954"
+ sodipodi:role="line"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">5</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="461.15417"
+ y="144.91666"
+ id="text3956"><tspan
+ sodipodi:role="line"
+ id="tspan3958"
+ x="461.15417"
+ y="144.91666"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">6</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="536.29688"
+ y="145.06665"
+ id="text3960"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan3962"
+ x="536.29688"
+ y="145.06665">7</tspan></text>
+ <text
+ id="text3964"
+ y="144.79477"
+ x="611.03851"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ y="144.79477"
+ x="611.03851"
+ id="tspan3966"
+ sodipodi:role="line">8</tspan></text>
+ <text
+ id="text3968"
+ y="144.82977"
+ x="686.55652"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ y="144.82977"
+ x="686.55652"
+ id="tspan3970"
+ sodipodi:role="line">9</tspan></text>
+ <text
+ id="text3972"
+ y="144.57379"
+ x="760.35419"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="144.57379"
+ x="760.35419"
+ id="tspan3974"
+ sodipodi:role="line"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">0</tspan></text>
+ <rect
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect3976"
+ width="63.461262"
+ height="64"
+ x="906.71844"
+ y="89.127388"
+ ry="4.7797003" />
+ <path
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 906.81249,121.66071 c 21.09109,0 42.18218,0 63.27327,0"
+ id="path3978"
+ inkscape:connector-curvature="0" />
+ <rect
+ ry="4.7797003"
+ y="89.127388"
+ x="11.153512"
+ height="64"
+ width="63.461262"
+ id="rect3980"
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <path
+ id="path3982"
+ d="m 11.247578,121.66071 c 21.091093,0 42.182176,0 63.273269,0"
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="840.27075"
+ y="143.8774"
+ id="text3988"><tspan
+ sodipodi:role="line"
+ id="tspan3990"
+ x="840.27075"
+ y="143.8774"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672">-</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="913.50781"
+ y="144.89095"
+ id="text3992"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan3994"
+ x="913.50781"
+ y="144.89095">=</tspan></text>
+ <rect
+ ry="4.7797003"
+ y="89.127388"
+ x="981.67877"
+ height="64"
+ width="95.078056"
+ id="rect3996"
+ style="font-size:18px;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <text
+ id="text4004"
+ y="141.20207"
+ x="992.40417"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="141.20207"
+ x="992.40417"
+ id="tspan4006"
+ sodipodi:role="line"
+ style="font-size:13.86666679px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">Backspace</tspan></text>
+ <text
+ id="text4977"
+ y="117.46353"
+ x="89.259377"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="117.46353"
+ x="89.259377"
+ id="tspan4979"
+ sodipodi:role="line"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">!</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="162.17561"
+ y="116.44883"
+ id="text4981"><tspan
+ sodipodi:role="line"
+ id="tspan4983"
+ x="162.17561"
+ y="116.44883"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">@</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="238.91458"
+ y="117.86665"
+ id="text4985"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan4987"
+ x="238.91458"
+ y="117.86665">#</tspan></text>
+ <text
+ id="text4989"
+ y="117.96072"
+ x="311.69211"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ y="117.96072"
+ x="311.69211"
+ id="tspan4991"
+ sodipodi:role="line">$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="387.71487"
+ y="117.27174"
+ id="text4993"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan4995"
+ x="387.71487"
+ y="117.27174">%</tspan></text>
+ <text
+ id="text4997"
+ y="116.44883"
+ x="461.6011"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ y="116.44883"
+ x="461.6011"
+ id="tspan4999"
+ sodipodi:role="line">^</tspan></text>
+ <text
+ id="text5001"
+ y="117.46236"
+ x="536.96692"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="117.46236"
+ x="536.96692"
+ id="tspan5003"
+ sodipodi:role="line"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">&amp;</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="609.5968"
+ y="117.19882"
+ id="text5005"><tspan
+ sodipodi:role="line"
+ id="tspan5007"
+ x="609.5968"
+ y="117.19882"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">*</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="685.03265"
+ y="116.44881"
+ id="text5009"><tspan
+ sodipodi:role="line"
+ id="tspan5011"
+ x="685.03265"
+ y="116.44881"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">(</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="761.91931"
+ y="116.12902"
+ id="text5013"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan5015"
+ x="761.91931"
+ y="116.12902">)</tspan></text>
+ <rect
+ ry="3.5688117"
+ y="387.40637"
+ x="254.19489"
+ height="47.786243"
+ width="385.80511"
+ id="rect5017"
+ style="font-size:18px;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <g
+ id="g4061"
+ transform="translate(0,-7.1714294)">
+ <text
+ id="text5021"
+ y="422.17459"
+ x="261.68033"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="422.17459"
+ x="261.68033"
+ id="tspan5023"
+ sodipodi:role="line"
+ style="font-size:13.86666679px;line-height:1.25;stroke-width:1.06666672">Space</tspan></text>
+ </g>
+ <text
+ id="text6971"
+ y="339.18835"
+ x="125.368"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="339.18835"
+ x="125.368"
+ id="tspan6973"
+ sodipodi:role="line"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">Z</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="197.67885"
+ y="337.60355"
+ id="text6975"><tspan
+ sodipodi:role="line"
+ id="tspan6977"
+ x="197.67885"
+ y="337.60355"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">X</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="271.76355"
+ y="339.99478"
+ id="text6979"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan6981"
+ x="271.76355"
+ y="339.99478">C</tspan></text>
+ <text
+ id="text6983"
+ y="339.11542"
+ x="347.19534"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ y="339.11542"
+ x="347.19534"
+ id="tspan6985"
+ sodipodi:role="line">V</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="418.95145"
+ y="338.42645"
+ id="text6987"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan6989"
+ x="418.95145"
+ y="338.42645">B</tspan></text>
+ <text
+ id="text6991"
+ y="338.27698"
+ x="494.1412"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672"
+ y="338.27698"
+ x="494.1412"
+ id="tspan6993"
+ sodipodi:role="line">N</tspan></text>
+ <text
+ id="text6995"
+ y="338.6171"
+ x="572.47015"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="338.6171"
+ x="572.47015"
+ id="tspan6997"
+ sodipodi:role="line"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">M</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="645.10004"
+ y="338.35355"
+ id="text6999"><tspan
+ sodipodi:role="line"
+ id="tspan7001"
+ x="645.10004"
+ y="338.35355"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">&lt;</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="723.39313"
+ y="336.84164"
+ id="text7003"><tspan
+ sodipodi:role="line"
+ id="tspan7005"
+ x="723.39313"
+ y="336.84164"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">&gt;</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="798.75592"
+ y="337.85516"
+ id="text7007"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan7009"
+ x="798.75592"
+ y="337.85516">?</tspan></text>
+ <text
+ id="text7027"
+ y="264.07922"
+ x="409.74942"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="264.07922"
+ x="409.74942"
+ id="tspan7029"
+ sodipodi:role="line"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672">G</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="483.63565"
+ y="263.25632"
+ id="text7031"><tspan
+ sodipodi:role="line"
+ id="tspan7033"
+ x="483.63565"
+ y="263.25632"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672">H</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="559.00153"
+ y="264.26987"
+ id="text7035"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan7037"
+ x="559.00153"
+ y="264.26987">J</tspan></text>
+ <text
+ id="text7039"
+ y="263.13974"
+ x="631.41089"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672"
+ y="263.13974"
+ x="631.41089"
+ id="tspan7041"
+ sodipodi:role="line">K</tspan></text>
+ <text
+ id="text7043"
+ y="264.96075"
+ x="708.60419"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672"
+ y="264.96075"
+ x="708.60419"
+ id="tspan7045"
+ sodipodi:role="line">L</tspan></text>
+ <text
+ id="text7047"
+ y="263.34451"
+ x="781.32269"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="263.34451"
+ x="781.32269"
+ id="tspan7049"
+ sodipodi:role="line"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">:</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="399.83853"
+ y="187.92427"
+ id="text7051"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan7053"
+ x="399.83853"
+ y="187.92427">T</tspan></text>
+ <text
+ id="text7055"
+ y="187.60356"
+ x="474.54233"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ y="187.60356"
+ x="474.54233"
+ id="tspan7057"
+ sodipodi:role="line">Y</tspan></text>
+ <text
+ id="text7059"
+ y="187.3317"
+ x="548.19391"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="187.3317"
+ x="548.19391"
+ id="tspan7061"
+ sodipodi:role="line"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">U</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="621.77612"
+ y="187.60356"
+ id="text7063"><tspan
+ sodipodi:role="line"
+ id="tspan7065"
+ x="621.77612"
+ y="187.60356"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">I</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="698.92633"
+ y="187.3317"
+ id="text7067"><tspan
+ sodipodi:role="line"
+ id="tspan7069"
+ x="698.92633"
+ y="187.3317"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">O</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="771.70312"
+ y="187.92427"
+ id="text7071"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan7073"
+ x="771.70312"
+ y="187.92427">P</tspan></text>
+ <rect
+ ry="4.7797003"
+ y="163.79405"
+ x="842.71564"
+ height="64"
+ width="63.461262"
+ id="rect7075"
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <rect
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect7077"
+ width="63.461262"
+ height="64"
+ x="917.38507"
+ y="163.79405"
+ ry="4.7797003" />
+ <rect
+ ry="4.7797003"
+ y="163.79405"
+ x="992.05176"
+ height="64"
+ width="85.281578"
+ id="rect7079"
+ style="font-size:18px;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <path
+ id="path7081"
+ d="m 842.81489,196.86071 c 21.26539,0 42.53076,0 63.79615,0"
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 917.47916,196.32738 c 21.09109,0 42.18217,0 63.27327,0"
+ id="path7083"
+ inkscape:connector-curvature="0" />
+ <path
+ style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.34042335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 992.33815,196.86071 c 28.07395,0 56.14795,0 84.22195,0"
+ id="path7085"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="845.2594"
+ y="219.39616"
+ id="text7087"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan7089"
+ x="845.2594"
+ y="219.39616">[</tspan></text>
+ <text
+ id="text7091"
+ y="219.39616"
+ x="919.95624"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ y="219.39616"
+ x="919.95624"
+ id="tspan7093"
+ sodipodi:role="line">]</tspan></text>
+ <text
+ id="text7095"
+ y="219.92429"
+ x="993.08435"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ y="219.92429"
+ x="993.08435"
+ id="tspan7097"
+ sodipodi:role="line">\</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="844.91248"
+ y="186.91489"
+ id="text7099"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan7101"
+ x="844.91248"
+ y="186.91489">{</tspan></text>
+ <text
+ id="text7103"
+ y="186.91489"
+ x="918.51251"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ y="186.91489"
+ x="918.51251"
+ id="tspan7105"
+ sodipodi:role="line">}</tspan></text>
+ <text
+ id="text7107"
+ y="185.39926"
+ x="993.43127"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ y="185.39926"
+ x="993.43127"
+ id="tspan7109"
+ sodipodi:role="line">|</tspan></text>
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot7111"
+ style="font-size:12.80000019px;line-height:0.01%;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"><flowRegion
+ id="flowRegion7113"
+ style="stroke-width:1.06666672"><rect
+ id="rect7115"
+ width="12.929953"
+ height="17.239937"
+ x="859.84186"
+ y="230.24284"
+ style="font-size:21.33333397px;font-family:'DejaVu Sans Mono';stroke-width:1.13777781" /></flowRegion><flowPara
+ id="flowPara7117"
+ style="font-size:21.33333397px;line-height:1.25;stroke-width:1.06666672">'&quot;l</flowPara></flowRoot> <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="857.28125"
+ y="264.82532"
+ id="text7119"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan7121"
+ x="857.28125"
+ y="264.82532">&quot;</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="20.090919"
+ y="145.65862"
+ id="text7123"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan7125"
+ x="20.090919"
+ y="145.65862">`</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="18.695885"
+ y="116.14663"
+ id="text7127"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan7129"
+ x="18.695885"
+ y="116.14663">~</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="338.80719"
+ y="208.43478"
+ id="text7245"><tspan
+ sodipodi:role="line"
+ x="338.80719"
+ y="208.43478"
+ id="tspan7366"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ sodipodi:role="line"
+ x="338.80719"
+ y="216.3177"
+ id="tspan7249"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">reload</tspan></text>
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot7342"
+ style="font-size:12.80000019px;line-height:0.01%;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"><flowRegion
+ id="flowRegion7344"
+ style="stroke-width:1.06666672"><rect
+ id="rect7346"
+ width="17.453804"
+ height="36.448208"
+ x="14.546197"
+ y="174.75179"
+ style="font-size:13.86666679px;font-family:'DejaVu Sans Mono';stroke-width:1.13777781" /></flowRegion><flowPara
+ id="flowPara7348"
+ style="font-size:13.86666679px;line-height:1.25;stroke-width:1.06666672">TabTa</flowPara></flowRoot> <text
+ id="text7358"
+ y="199.05951"
+ x="11.713984"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="199.05951"
+ x="11.713984"
+ id="tspan7360"
+ sodipodi:role="line"
+ style="font-size:12.80000019px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">Tab</tspan></text>
+ <rect
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect10890"
+ width="338.15115"
+ height="41.734409"
+ x="101.31554"
+ y="20.999462"
+ ry="3.116843" />
+ <text
+ id="text7404"
+ y="49.597778"
+ x="106.28438"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="49.597778"
+ x="106.28438"
+ id="tspan7406"
+ sodipodi:role="line"
+ style="font-size:23.46666718px;line-height:1;stroke-width:1.06666672">qutebrowser default bindings</tspan></text>
+ <text
+ id="text9514"
+ y="279.05405"
+ x="578.2074"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="279.05405"
+ x="578.2074"
+ sodipodi:role="line"
+ id="tspan9524"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ y="286.93695"
+ x="578.2074"
+ sodipodi:role="line"
+ id="tspan4938"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">scroll</tspan><tspan
+ y="294.61697"
+ x="578.2074"
+ sodipodi:role="line"
+ id="tspan4936"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">down</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="650.2074"
+ y="279.24451"
+ id="text9526"><tspan
+ sodipodi:role="line"
+ x="650.2074"
+ y="279.24451"
+ id="tspan9530"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ sodipodi:role="line"
+ x="650.2074"
+ y="286.9245"
+ id="tspan4942"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">scroll</tspan><tspan
+ id="tspan9532"
+ sodipodi:role="line"
+ x="650.2074"
+ y="294.60449"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">up</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="578.2074"
+ y="247.81595"
+ id="text10515"><tspan
+ sodipodi:role="line"
+ x="578.2074"
+ y="247.81595"
+ id="tspan10517"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ sodipodi:role="line"
+ x="578.2074"
+ y="255.69887"
+ id="tspan10519"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">next</tspan><tspan
+ id="tspan10521"
+ sodipodi:role="line"
+ x="578.2074"
+ y="263.37888"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">tab</tspan></text>
+ <text
+ id="text10523"
+ y="248.00641"
+ x="650.2074"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ id="tspan10525"
+ y="248.00641"
+ x="650.2074"
+ sodipodi:role="line"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ id="tspan10527"
+ y="255.88933"
+ x="650.2074"
+ sodipodi:role="line"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">previous</tspan><tspan
+ y="263.56934"
+ x="650.2074"
+ sodipodi:role="line"
+ id="tspan10529"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">tab</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="501.71222"
+ y="278.67307"
+ id="text10547"><tspan
+ sodipodi:role="line"
+ x="501.71222"
+ y="278.67307"
+ id="tspan10560"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ sodipodi:role="line"
+ x="501.71222"
+ y="286.55597"
+ id="tspan10574"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">scroll</tspan><tspan
+ sodipodi:role="line"
+ x="501.71222"
+ y="294.23599"
+ id="tspan10562"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">left</tspan></text>
+ <text
+ id="text10564"
+ y="278.67307"
+ x="724.62445"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="278.67307"
+ x="724.62445"
+ sodipodi:role="line"
+ id="tspan10566"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ id="tspan10568"
+ y="286.55597"
+ x="724.62445"
+ sodipodi:role="line"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">scroll</tspan><tspan
+ id="tspan10570"
+ y="294.23599"
+ x="724.62445"
+ sodipodi:role="line"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">right</tspan></text>
+ <text
+ id="text10564-6"
+ y="199.11761"
+ x="715.61145"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ id="tspan10570-9"
+ y="199.11761"
+ x="715.61145"
+ sodipodi:role="line"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ y="207.75761"
+ x="715.61145"
+ sodipodi:role="line"
+ id="tspan4975"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ y="215.64053"
+ x="715.61145"
+ sodipodi:role="line"
+ id="tspan4977"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">open <tspan
+ style="fill:#ff0000;stroke-width:1.06666672"
+ id="tspan3697">(6)</tspan></tspan></text>
+ <text
+ id="text10564-3"
+ y="166.45094"
+ x="714.94476"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ id="tspan10570-6"
+ y="166.45094"
+ x="714.94476"
+ sodipodi:role="line"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ y="174.33386"
+ x="714.94476"
+ sodipodi:role="line"
+ id="tspan4996"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">open in</tspan><tspan
+ y="182.01385"
+ x="714.94476"
+ sodipodi:role="line"
+ id="tspan4998"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">new tab<tspan
+ style="fill:#ff0000;stroke-width:1.06666672"
+ id="tspan3699" /></tspan><tspan
+ y="189.69386"
+ x="714.94476"
+ sodipodi:role="line"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"
+ id="tspan3701"><tspan
+ style="fill:#ff0000;stroke-width:1.06666672"
+ id="tspan3703">(6)</tspan></tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="282.57269"
+ y="279.80652"
+ id="text10547-2"><tspan
+ sodipodi:role="line"
+ x="282.57269"
+ y="279.80652"
+ id="tspan10560-6"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ sodipodi:role="line"
+ x="282.57269"
+ y="287.68942"
+ id="tspan10562-1"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">close</tspan><tspan
+ sodipodi:role="line"
+ x="282.57269"
+ y="295.36945"
+ id="tspan5970"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">tab</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="351.18723"
+ y="272.2189"
+ id="text10547-2-1"><tspan
+ sodipodi:role="line"
+ x="351.18723"
+ y="272.2189"
+ id="tspan10560-6-1"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ sodipodi:role="line"
+ x="351.18723"
+ y="280.10181"
+ id="tspan5062"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">hint</tspan><tspan
+ sodipodi:role="line"
+ x="351.18723"
+ y="287.78183"
+ id="tspan5066"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">(label</tspan><tspan
+ sodipodi:role="line"
+ x="351.18723"
+ y="295.46182"
+ id="tspan6140"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">links) <tspan
+ style="font-size:8.53333378px;fill:#ff0000;stroke-width:1.06666672"
+ id="tspan3723">(8)</tspan></tspan></text>
+ <text
+ id="text9514-6"
+ y="201.01891"
+ x="564.76721"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="201.01891"
+ x="564.76721"
+ sodipodi:role="line"
+ id="tspan9524-9"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ y="208.90182"
+ x="564.76721"
+ sodipodi:role="line"
+ id="tspan4936-0"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">undo</tspan><tspan
+ y="216.58182"
+ x="564.76721"
+ sodipodi:role="line"
+ id="tspan5968"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">closing</tspan><tspan
+ y="224.26183"
+ x="564.76721"
+ sodipodi:role="line"
+ id="tspan5436"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">tab</tspan></text>
+ <text
+ id="text9514-4"
+ y="205.01891"
+ x="638.90051"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="205.01891"
+ x="638.90051"
+ sodipodi:role="line"
+ id="tspan4936-5"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ y="212.90182"
+ x="638.90051"
+ sodipodi:role="line"
+ id="tspan5132"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">insert-</tspan><tspan
+ y="220.58182"
+ x="638.90051"
+ sodipodi:role="line"
+ id="tspan5136"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">mode</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="840.11176"
+ y="108.99891"
+ id="text3988-2"><tspan
+ sodipodi:role="line"
+ id="tspan3990-4"
+ x="840.11176"
+ y="108.99891"
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">_</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="913.50781"
+ y="110.18444"
+ id="text3992-3"><tspan
+ style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan3994-3"
+ x="913.50781"
+ y="110.18444">+</tspan></text>
+ <text
+ id="text9514-6-5"
+ y="129.16545"
+ x="856.87421"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="129.16545"
+ x="856.87421"
+ sodipodi:role="line"
+ id="tspan9524-9-4"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ y="137.04837"
+ x="856.87421"
+ sodipodi:role="line"
+ id="tspan4936-0-0"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">zoom</tspan><tspan
+ y="144.72836"
+ x="856.87421"
+ sodipodi:role="line"
+ id="tspan6188"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">out</tspan></text>
+ <text
+ id="text9514-6-1"
+ y="96"
+ x="930.13336"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="96"
+ x="930.13336"
+ sodipodi:role="line"
+ id="tspan9524-9-1"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ y="103.68"
+ x="930.13336"
+ sodipodi:role="line"
+ id="tspan4936-0-6"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">zoom</tspan><tspan
+ y="111.36"
+ x="930.13336"
+ sodipodi:role="line"
+ id="tspan5593"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">in</tspan></text>
+ <text
+ id="text9514-6-1-2"
+ y="133.00302"
+ x="929.7572"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="133.00302"
+ x="929.7572"
+ sodipodi:role="line"
+ id="tspan9524-9-1-6"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">set</tspan><tspan
+ y="140.68301"
+ x="929.7572"
+ sodipodi:role="line"
+ id="tspan5252"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">zoom</tspan><tspan
+ y="148.36302"
+ x="929.7572"
+ sodipodi:role="line"
+ id="tspan4936-0-6-8"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">level</tspan></text>
+ <rect
+ ry="4.7797003"
+ y="14.834106"
+ x="12.374795"
+ height="64"
+ width="63.461262"
+ id="rect3980-8"
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" />
+ <text
+ id="text7358-4"
+ y="29.305208"
+ x="18.544792"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="29.305208"
+ x="18.544792"
+ id="tspan7360-3"
+ sodipodi:role="line"
+ style="font-size:12.80000019px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">Esc</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="351.18723"
+ y="242.80072"
+ id="text10547-2-1-5"><tspan
+ sodipodi:role="line"
+ x="351.18723"
+ y="242.80072"
+ id="tspan10560-6-1-1"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ sodipodi:role="line"
+ x="351.18723"
+ y="250.68364"
+ id="tspan5062-4"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">hint</tspan><tspan
+ sodipodi:role="line"
+ x="351.18723"
+ y="258.36365"
+ id="tspan5066-3"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">(new</tspan><tspan
+ sodipodi:role="line"
+ x="351.18723"
+ y="266.04364"
+ id="tspan6144"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">tab)</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="501.71222"
+ y="251.41891"
+ id="text10547-23"><tspan
+ sodipodi:role="line"
+ x="501.71222"
+ y="251.41891"
+ id="tspan10560-1"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ sodipodi:role="line"
+ x="501.71222"
+ y="259.30182"
+ id="tspan10562-12"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">back <tspan
+ style="font-size:8.53333378px;fill:#ff0000;stroke-width:1.06666672"
+ id="tspan3586">(7)</tspan></tspan></text>
+ <text
+ id="text10564-6-7"
+ y="239.34317"
+ x="724.62445"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ id="tspan10570-9-4"
+ y="239.34317"
+ x="724.62445"
+ sodipodi:role="line"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ y="247.98317"
+ x="724.62445"
+ sodipodi:role="line"
+ id="tspan4975-2"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ y="255.86609"
+ x="724.62445"
+ sodipodi:role="line"
+ id="tspan4977-3"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">forward</tspan><tspan
+ y="263.54608"
+ x="724.62445"
+ sodipodi:role="line"
+ id="tspan3588"
+ style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672">(7)</tspan></text>
+ <text
+ id="text10564-6-7-8"
+ y="347.8989"
+ x="814.39789"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ id="tspan10570-9-4-6"
+ y="347.8989"
+ x="814.39789"
+ sodipodi:role="line"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ y="355.57889"
+ x="814.39789"
+ sodipodi:role="line"
+ id="tspan4975-2-8"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ y="363.25888"
+ x="814.39789"
+ sodipodi:role="line"
+ id="tspan4977-3-1"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">search</tspan></text>
+ <text
+ id="text10564-6-7-8-3"
+ y="238.93333"
+ x="800"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ id="tspan10570-9-4-6-2"
+ y="238.93333"
+ x="800"
+ sodipodi:role="line"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ y="247.57333"
+ x="800"
+ sodipodi:role="line"
+ id="tspan4975-2-8-1"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ y="255.45625"
+ x="800"
+ sodipodi:role="line"
+ id="tspan4977-3-1-5"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">cmd</tspan><tspan
+ y="263.13626"
+ x="800"
+ sodipodi:role="line"
+ id="tspan5435"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">mode</tspan></text>
+ <text
+ id="text9514-60"
+ y="353.55225"
+ x="511.70053"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="353.55225"
+ x="511.70053"
+ sodipodi:role="line"
+ id="tspan9524-92"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ y="361.23224"
+ x="511.70053"
+ sodipodi:role="line"
+ id="tspan4936-8"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">search</tspan><tspan
+ y="368.91223"
+ x="511.70053"
+ sodipodi:role="line"
+ id="tspan5466"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">next</tspan></text>
+ <text
+ id="text9514-60-7"
+ y="319.95224"
+ x="511.99792"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="319.95224"
+ x="511.99792"
+ sodipodi:role="line"
+ id="tspan9524-92-1"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ y="327.63223"
+ x="511.99792"
+ sodipodi:role="line"
+ id="tspan4936-8-5"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">search</tspan><tspan
+ y="335.31223"
+ x="511.99792"
+ sodipodi:role="line"
+ id="tspan5466-8"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">prev</tspan></text>
+ <text
+ id="text9514-60-8"
+ y="355.28558"
+ x="588.79791"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="355.28558"
+ x="588.79791"
+ sodipodi:role="line"
+ id="tspan5524"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">save</tspan><tspan
+ y="362.96558"
+ x="588.79791"
+ sodipodi:role="line"
+ id="tspan5530"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">quick-</tspan><tspan
+ y="370.64557"
+ x="588.79791"
+ sodipodi:role="line"
+ id="tspan5532"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">mark</tspan></text>
+ <text
+ id="text9514-8"
+ y="204.21892"
+ x="490.50494"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="204.21892"
+ x="490.50494"
+ sodipodi:role="line"
+ id="tspan9524-5"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ y="212.10184"
+ x="490.50494"
+ sodipodi:role="line"
+ id="tspan4938-4"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">yank/</tspan><tspan
+ y="219.78183"
+ x="490.50494"
+ sodipodi:role="line"
+ id="tspan4936-1"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">copy <tspan
+ style="font-size:8.53333378px;fill:#ff0000;stroke-width:1.06666672"
+ id="tspan5713">(1)</tspan></tspan></text>
+ <text
+ id="text9514-8-9"
+ y="206.18428"
+ x="788.66119"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="206.18428"
+ x="788.66119"
+ sodipodi:role="line"
+ id="tspan9524-5-1"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ y="214.0672"
+ x="788.66119"
+ sodipodi:role="line"
+ id="tspan6096"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">paste</tspan><tspan
+ y="221.74719"
+ x="788.66119"
+ sodipodi:role="line"
+ id="tspan5366"
+ style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672">(2)</tspan></text>
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot5590"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"><flowRegion
+ id="flowRegion5592"
+ style="font-family:sans-serif;stroke-width:1.06666672px"><rect
+ id="rect5594"
+ width="552"
+ height="56"
+ x="518.66669"
+ y="25.333334"
+ style="font-size:10.66666698px;font-family:sans-serif;stroke-width:1.13777781px" /></flowRegion><flowPara
+ id="flowPara5596"
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;stroke-width:1.06666672px"> </flowPara></flowRoot> <flowRoot
+ xml:space="preserve"
+ id="flowRoot5598"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"><flowRegion
+ id="flowRegion5600"
+ style="font-family:sans-serif;stroke-width:1.06666672"><rect
+ id="rect5602"
+ width="582.66669"
+ height="61.333332"
+ x="501.33334"
+ y="14.933333"
+ style="font-size:10.66666698px;font-family:sans-serif;stroke-width:1.13777781" /></flowRegion><flowPara
+ id="flowPara5604"
+ style="font-size:13.86666679px;line-height:1.25;font-family:sans-serif;stroke-width:1.06666672">Website: https://www.qutebrowser.org/ </flowPara><flowPara
+ id="flowPara5595"
+ style="font-size:13.86666679px;line-height:1.25;font-family:sans-serif;stroke-width:1.06666672">IRC: #qutebrowser on Freenode</flowPara><flowPara
+ id="flowPara5597"
+ style="font-size:13.86666679px;line-height:1.25;font-family:sans-serif;stroke-width:1.06666672">Mailinglist: qutebrowser@lists.qutebrowser.org</flowPara></flowRoot> <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="425.7652"
+ y="241.39365"
+ id="text10547-23-6"><tspan
+ sodipodi:role="line"
+ x="425.7652"
+ y="241.39365"
+ id="tspan10560-1-3"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ sodipodi:role="line"
+ x="425.7652"
+ y="250.03365"
+ id="tspan10574-1-0"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672">s<tspan
+ style="font-size:8.53333378px;stroke-width:1.06666672"
+ id="tspan5591">croll to</tspan></tspan><tspan
+ sodipodi:role="line"
+ x="425.7652"
+ y="257.91656"
+ id="tspan5633"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">bottom/</tspan><tspan
+ sodipodi:role="line"
+ x="425.7652"
+ y="265.59656"
+ id="tspan5461"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">perc.</tspan><tspan
+ sodipodi:role="line"
+ x="425.7652"
+ y="273.27655"
+ id="tspan10562-12-5"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"> </tspan></text>
+ <text
+ id="text9514-60-7-7"
+ y="349.15512"
+ x="437.06458"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="349.15512"
+ x="437.06458"
+ sodipodi:role="line"
+ id="tspan9524-92-1-3"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ y="356.83511"
+ x="437.06458"
+ sodipodi:role="line"
+ id="tspan4936-8-5-9"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">load</tspan><tspan
+ y="364.51511"
+ x="437.06458"
+ sodipodi:role="line"
+ id="tspan5466-8-8"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">quick-</tspan><tspan
+ y="372.19513"
+ x="437.06458"
+ sodipodi:role="line"
+ id="tspan6184"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">mark <tspan
+ style="font-size:8.53333378px;fill:#ff0000;stroke-width:1.06666672"
+ id="tspan3727">(8)</tspan></tspan></text>
+ <text
+ id="text9514-60-7-7-0"
+ y="315.02179"
+ x="436.65286"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="315.02179"
+ x="436.65286"
+ sodipodi:role="line"
+ id="tspan9524-92-1-3-7"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ y="322.70178"
+ x="436.65286"
+ sodipodi:role="line"
+ id="tspan4936-8-5-9-8"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">load</tspan><tspan
+ y="330.38177"
+ x="436.65286"
+ sodipodi:role="line"
+ id="tspan5466-8-8-0"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">quickm.</tspan><tspan
+ y="338.0618"
+ x="436.65286"
+ sodipodi:role="line"
+ id="tspan6186"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">(tab)</tspan><tspan
+ y="345.74179"
+ x="436.65286"
+ sodipodi:role="line"
+ id="tspan5689"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"> </tspan></text>
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot5691"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"><flowRegion
+ id="flowRegion5693"
+ style="font-family:sans-serif;stroke-width:1.06666672"><rect
+ id="rect5695"
+ width="344"
+ height="173.33333"
+ x="18.666666"
+ y="437.55823"
+ style="font-family:sans-serif;fill:#000000;stroke-width:1.13777781" /></flowRegion><flowPara
+ id="flowPara5697"
+ style="font-weight:bold;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#000000;stroke-width:1.06666672"><flowSpan
+ style="font-weight:bold;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#ff0000;stroke-width:1.06666672"
+ id="flowSpan5705">(1)</flowSpan> copying/yanking:</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5701">yy - copy/yank URL</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5703">yY - copy URL to selection</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5707">yt - copy title to clipboard</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5709">yT - copy title to selection</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5711"> </flowPara></flowRoot> <flowRoot
+ xml:space="preserve"
+ id="flowRoot5691-0"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ transform="translate(0,-10)"><flowRegion
+ id="flowRegion5693-7"
+ style="font-family:sans-serif;stroke-width:1.06666672"><rect
+ id="rect5695-0"
+ width="344"
+ height="173.33333"
+ x="19.42783"
+ y="520.07886"
+ style="font-family:sans-serif;fill:#000000;stroke-width:1.13777781" /></flowRegion><flowPara
+ id="flowPara5697-9"
+ style="font-weight:bold;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#000000;stroke-width:1.06666672"><flowSpan
+ style="font-weight:bold;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#ff0000;stroke-width:1.06666672"
+ id="flowSpan5705-5">(2)</flowSpan> pasting:</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5701-9">pp - open URL from clipboard</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5703-8">pP - open URL from selection</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5707-0">Pp - like <flowSpan
+ style="font-style:italic;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';stroke-width:1.06666672"
+ id="flowSpan6101">pp</flowSpan>, in new tab</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5709-3">PP - like <flowSpan
+ style="font-style:italic;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';stroke-width:1.06666672"
+ id="flowSpan6103">pP</flowSpan>, in new tab</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5763">wp - like <flowSpan
+ style="font-style:italic;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';stroke-width:1.06666672"
+ id="flowSpan6105">pp</flowSpan>, in new window</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5765">wP - like <flowSpan
+ style="font-style:italic;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';stroke-width:1.06666672"
+ id="flowSpan6107">pP</flowSpan>, in new window</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5711-1"> </flowPara></flowRoot> <flowRoot
+ xml:space="preserve"
+ id="flowRoot5691-0-9"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"><flowRegion
+ id="flowRegion5693-7-0"
+ style="font-family:sans-serif;stroke-width:1.06666672"><rect
+ id="rect5695-0-5"
+ width="344"
+ height="173.33333"
+ x="201.3311"
+ y="437.55823"
+ style="font-family:sans-serif;fill:#000000;stroke-width:1.13777781" /></flowRegion><flowPara
+ style="font-weight:bold;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#000000;stroke-width:1.06666672"
+ id="flowPara5701-9-6"><flowSpan
+ style="font-weight:bold;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#ff0000;stroke-width:1.06666672"
+ id="flowSpan5705-5-8">(3)</flowSpan> navigation:</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5829">[[ - click &quot;previous&quot;-link on page</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5703-8-2">]] - click &quot;next&quot;-link on page  </flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5707-0-7">{{ - like <flowSpan
+ style="font-style:italic;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';stroke-width:1.06666672"
+ id="flowSpan6111">[[</flowSpan>, in new tab</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5709-3-1">}} - like <flowSpan
+ style="font-style:italic;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';stroke-width:1.06666672"
+ id="flowSpan6109">]]</flowSpan>, in new tab</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5835">&lt;Ctrl-A&gt; - increment no. in URL</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5837">&lt;Ctrl-X&gt; - decrement no. in URL</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5841"> </flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5839" /><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5711-1-8" /></flowRoot> <text
+ id="text9514-8-9-0"
+ y="215.27605"
+ x="867.20831"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="215.27605"
+ x="867.20831"
+ sodipodi:role="line"
+ id="tspan4936-1-1-9"
+ style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672">(3)</tspan></text>
+ <text
+ id="text9514-8-9-0-3"
+ y="184.34271"
+ x="867.20831"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="184.34271"
+ x="867.20831"
+ sodipodi:role="line"
+ id="tspan4936-1-1-9-7"
+ style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672">(3)</tspan></text>
+ <text
+ id="text9514-8-9-0-2"
+ y="215.27605"
+ x="947.20831"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="215.27605"
+ x="947.20831"
+ sodipodi:role="line"
+ id="tspan4936-1-1-9-5"
+ style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672">(3)</tspan></text>
+ <text
+ id="text9514-8-9-0-6"
+ y="184.34271"
+ x="947.20831"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="184.34271"
+ x="947.20831"
+ sodipodi:role="line"
+ id="tspan4936-1-1-9-2"
+ style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672">(3)</tspan></text>
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot5691-4"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"><flowRegion
+ id="flowRegion5693-9"
+ style="font-family:sans-serif;stroke-width:1.06666672"><rect
+ id="rect5695-9"
+ width="344"
+ height="173.33333"
+ x="199.82608"
+ y="546.74548"
+ style="font-family:sans-serif;fill:#000000;stroke-width:1.13777781" /></flowRegion><flowPara
+ id="flowPara5697-3"
+ style="font-weight:bold;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#000000;stroke-width:1.06666672"><flowSpan
+ style="font-weight:bold;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#ff0000;stroke-width:1.06666672"
+ id="flowSpan5705-0">(4)</flowSpan> scrolling:</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5701-8">&lt;Ctrl-F&gt; - page down</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5707-9">&lt;Ctrl-B&gt; - page up</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5962">&lt;Ctrl-D&gt; - half page down</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5711-7">&lt;Ctrl-U&gt; - half page up</flowPara></flowRoot> <flowRoot
+ xml:space="preserve"
+ id="flowRoot5691-4-9"
+ style="font-style:normal;font-weight:bold;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"><flowRegion
+ id="flowRegion5693-9-1"
+ style="font-family:sans-serif;stroke-width:1.06666672"><rect
+ id="rect5695-9-8"
+ width="344"
+ height="173.33333"
+ x="403.53775"
+ y="437.55823"
+ style="font-weight:bold;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#000000;stroke-width:1.13777781" /></flowRegion><flowPara
+ style="font-weight:bold;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#000000;stroke-width:1.06666672"
+ id="flowPara4171">in prompt mode:</flowPara><flowPara
+ style="font-weight:normal;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:Sans;fill:#000000;stroke-width:1.06666672"
+ id="flowPara4175">Enter - accept prompt</flowPara><flowPara
+ style="font-weight:normal;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:Sans;fill:#000000;stroke-width:1.06666672"
+ id="flowPara4177">y - answer yes to prompt</flowPara><flowPara
+ style="font-weight:normal;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:Sans;fill:#000000;stroke-width:1.06666672"
+ id="flowPara4179">n - answer no to prompt</flowPara><flowPara
+ style="font-weight:normal;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:Sans;fill:#000000;stroke-width:1.06666672"
+ id="flowPara6016"> </flowPara></flowRoot> <flowRoot
+ xml:space="preserve"
+ id="flowRoot5691-0-9-9"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;-inkscape-font-specification:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"><flowRegion
+ id="flowRegion5693-7-0-2"
+ style="font-family:sans-serif;stroke-width:1.06666672"><rect
+ id="rect5695-0-5-6"
+ width="344"
+ height="173.33333"
+ x="403.54816"
+ y="496.42233"
+ style="font-style:normal;font-family:sans-serif;-inkscape-font-specification:Sans;fill:#000000;stroke-width:1.13777781" /></flowRegion><flowPara
+ style="font-style:normal;font-weight:bold;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#000000;stroke-width:1.06666672"
+ id="flowPara5701-9-6-8"><flowSpan
+ style="font-style:normal;font-weight:bold;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#ff0000;stroke-width:1.06666672"
+ id="flowSpan5705-5-8-3">(6)</flowSpan> opening:</flowPara><flowPara
+ style="font-style:normal;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:Sans;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5829-1">go - edit &amp; open current URL</flowPara><flowPara
+ style="font-style:normal;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:Sans;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5703-8-2-8">gO - like  <flowSpan
+ style="font-style:italic;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';stroke-width:1.06666672"
+ id="flowSpan6132">go</flowSpan>, in new tab</flowPara><flowPara
+ style="font-style:normal;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:Sans;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3581">xO - like <flowSpan
+ style="font-style:italic;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';stroke-width:1.06666672"
+ id="flowSpan6134">go</flowSpan>, in bg. tab</flowPara><flowPara
+ style="font-style:normal;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:Sans;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5709-3-1-6">xo - open in background tab</flowPara><flowPara
+ style="font-style:normal;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:Sans;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5841-1">wo - open in new window</flowPara><flowPara
+ style="font-style:normal;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:Sans;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5839-8"> </flowPara><flowPara
+ style="font-style:normal;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:Sans;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5711-1-8-7" /></flowRoot> <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="425.7652"
+ y="272.26849"
+ id="text10547-23-6-1"><tspan
+ sodipodi:role="line"
+ x="425.7652"
+ y="272.26849"
+ id="tspan10560-1-3-8"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ sodipodi:role="line"
+ x="425.7652"
+ y="280.1514"
+ id="tspan10574-1-0-7"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">gg: <tspan
+ style="font-size:8.53333378px;fill:#ff0000;stroke-width:1.06666672"
+ id="tspan3812">(10)</tspan></tspan><tspan
+ sodipodi:role="line"
+ x="425.7652"
+ y="287.83142"
+ id="tspan6176"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">scroll</tspan><tspan
+ sodipodi:role="line"
+ x="425.7652"
+ y="295.51141"
+ id="tspan5633-2"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">to top</tspan><tspan
+ sodipodi:role="line"
+ x="425.7652"
+ y="303.19141"
+ id="tspan10562-12-5-9"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"> </tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="26.836851"
+ y="44.101078"
+ id="text10547-2-5"><tspan
+ sodipodi:role="line"
+ x="26.836851"
+ y="44.101078"
+ id="tspan10560-6-4"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ sodipodi:role="line"
+ x="26.836851"
+ y="51.983994"
+ id="tspan5970-5"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">normal</tspan><tspan
+ sodipodi:role="line"
+ x="26.836851"
+ y="59.663994"
+ id="tspan6219"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">mode</tspan></text>
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot5691-4-9-3"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"><flowRegion
+ id="flowRegion5693-9-1-7"
+ style="font-family:sans-serif;stroke-width:1.06666672"><rect
+ id="rect5695-9-8-7"
+ width="344"
+ height="173.33333"
+ x="404.05209"
+ y="582.96967"
+ style="font-family:sans-serif;fill:#000000;stroke-width:1.13777781" /></flowRegion><flowPara
+ id="flowPara5697-3-7-6"
+ style="font-weight:bold;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#000000;stroke-width:1.06666672"><flowSpan
+ style="font-weight:bold;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#ff0000;stroke-width:1.06666672"
+ id="flowSpan5705-0-4-7">(7)</flowSpan> back/forward:</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara5701-8-5-8"><flowSpan
+ style="font-family:sans-serif;fill:#0000ff;stroke-width:1.06666672"
+ id="flowSpan5463">th</flowSpan> - back (in new tab)</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara6016-5"><flowSpan
+ style="font-family:sans-serif;fill:#0000ff;stroke-width:1.06666672"
+ id="flowSpan5465">wh</flowSpan> - back (in new window)</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3628"><flowSpan
+ style="font-family:sans-serif;fill:#0000ff;stroke-width:1.06666672"
+ id="flowSpan5467">tl</flowSpan> - forward (in new tab)</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3630"><flowSpan
+ style="font-family:sans-serif;fill:#0000ff;stroke-width:1.06666672"
+ id="flowSpan5469">wl</flowSpan> - forward (in new window)</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3626"> </flowPara></flowRoot> <text
+ id="text10564-6-7-8-3-5"
+ y="270.24557"
+ x="800"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ id="tspan10570-9-4-6-2-6"
+ y="270.24557"
+ x="800"
+ sodipodi:role="line"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ y="278.88559"
+ x="800"
+ sodipodi:role="line"
+ id="tspan4975-2-8-1-6"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ y="286.76849"
+ x="800"
+ sodipodi:role="line"
+ id="tspan4977-3-1-5-7"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">ext.</tspan><tspan
+ y="294.44849"
+ x="800"
+ sodipodi:role="line"
+ id="tspan5435-7"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">hints <tspan
+ style="font-size:8.53333378px;fill:#ff0000;stroke-width:1.06666672"
+ id="tspan3662">(9)</tspan></tspan></text>
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot5691-4-9-3-6"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"><flowRegion
+ id="flowRegion5693-9-1-7-3"
+ style="font-family:sans-serif;stroke-width:1.06666672"><rect
+ id="rect5695-9-8-7-7"
+ width="344"
+ height="173.33333"
+ x="579.90106"
+ y="437.54779"
+ style="font-family:sans-serif;fill:#000000;stroke-width:1.13777781" /></flowRegion><flowPara
+ id="flowPara5697-3-7-6-8"
+ style="font-weight:bold;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#ff0000;stroke-width:1.06666672">(8)</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3626-7">prefix with w - in new window</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3725"> </flowPara></flowRoot> <flowRoot
+ xml:space="preserve"
+ id="flowRoot5691-4-9-3-1"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"><flowRegion
+ id="flowRegion5693-9-1-7-1"
+ style="font-family:sans-serif;stroke-width:1.06666672"><rect
+ id="rect5695-9-8-7-5"
+ width="344"
+ height="173.33333"
+ x="579.36774"
+ y="489.80301"
+ style="font-family:sans-serif;fill:#000000;stroke-width:1.13777781" /></flowRegion><flowPara
+ id="flowPara5697-3-7-6-1"
+ style="font-weight:bold;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#000000;stroke-width:1.06666672"><flowSpan
+ style="font-weight:bold;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#ff0000;stroke-width:1.06666672"
+ id="flowSpan5705-0-4-7-6">(9)</flowSpan> extended hint mode:</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3626-73">;b - open hint in background tab</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara4051">;f - open hint in foreground tab</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3788">;h - hover over hint (mouse-over)</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3790">;i - hint images</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3792">;I - hint images in new tab</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara6096">;t - hint inputs</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3794">;o - put hinted URL in cmd. line</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3796">;O - like <flowSpan
+ style="font-style:italic;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';stroke-width:1.06666672"
+ id="flowSpan3798">;o</flowSpan>, in new tab</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3800">;y - yank hinted URL to clipboard</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3802">;Y - yank hinted URL to selection</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3804">;r - rapid hinting</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3806">;R - like <flowSpan
+ style="font-style:italic;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';stroke-width:1.06666672"
+ id="flowSpan3810">;r</flowSpan>, in new window</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3808">;d - download hinted URL</flowPara></flowRoot> <flowRoot
+ xml:space="preserve"
+ id="flowRoot5691-4-9-3-6-1"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"><flowRegion
+ id="flowRegion5693-9-1-7-3-5"
+ style="font-family:sans-serif;stroke-width:1.06666672"><rect
+ id="rect5695-9-8-7-7-0"
+ width="165.23355"
+ height="256.78436"
+ x="772.63074"
+ y="437.55823"
+ style="font-family:sans-serif;fill:#000000;stroke-width:1.13777781" /></flowRegion><flowPara
+ id="flowPara5697-3-7-6-8-2"
+ style="font-weight:bold;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#000000;stroke-width:1.06666672"><flowSpan
+ style="font-weight:bold;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#ff0000;stroke-width:1.06666672"
+ id="flowSpan3852">(10)</flowSpan> misc. commands:</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3725-0">gt - switch tabs by name</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara4052"><flowSpan
+ style="font-family:sans-serif;fill:#0000ff;stroke-width:1.06666672"
+ id="flowSpan4054">gm/gl/gr</flowSpan> - move tab</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara4056"> (to index/left/right)</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3858">gC - clone tab  </flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3860">gf - view page source</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3915">gu - navigate up in URL</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3917">gU - like <flowSpan
+ style="font-style:italic;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';stroke-width:1.06666672"
+ id="flowSpan3923">gu</flowSpan>, in new tab</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3921">sf - save config</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3925">ss - set setting</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3927">sl - set temp. setting</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3929">sk - bind key</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3931">Ss - show settings</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3937">wi - open web inspector</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara4167">gd - download page</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara4169"><flowSpan
+ style="font-family:sans-serif;fill:#0000ff;stroke-width:1.06666672"
+ id="flowSpan5438">ad</flowSpan> - cancel download</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara4077">co - close other tabs</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara4081">cd - clear downloads</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3933"> </flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3935" /><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara4079" /></flowRoot> <text
+ id="text9514-8-9-0-8"
+ y="217.88069"
+ x="201.04399"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="217.88069"
+ x="201.04399"
+ sodipodi:role="line"
+ id="tspan4936-1-1-9-59"
+ style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672">(10)</tspan></text>
+ <text
+ id="text9514-8-9-0-8-4"
+ y="257.17371"
+ x="208.27393"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="257.17371"
+ x="208.27393"
+ sodipodi:role="line"
+ id="tspan4936-1-1-9-59-8"
+ style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672">(10)</tspan></text>
+ <text
+ id="text9514-8-9-0-8-7"
+ y="291.00937"
+ x="208.27393"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="291.00937"
+ x="208.27393"
+ sodipodi:role="line"
+ id="tspan4936-1-1-9-59-5"
+ style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672">(10)</tspan></text>
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot5691-4-9-3-6-1-2"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"><flowRegion
+ id="flowRegion5693-9-1-7-3-5-2"
+ style="font-family:sans-serif;stroke-width:1.06666672"><rect
+ id="rect5695-9-8-7-7-0-9"
+ width="350.20157"
+ height="196.89922"
+ x="915.77972"
+ y="437.55823"
+ style="font-family:sans-serif;fill:#000000;stroke-width:1.13777781" /></flowRegion><flowPara
+ id="flowPara5697-3-7-6-8-2-0"
+ style="font-weight:bold;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#000000;stroke-width:1.06666672"><flowSpan
+ style="font-weight:bold;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#ff0000;stroke-width:1.06666672"
+ id="flowSpan3852-6">(11)</flowSpan> modifier commands:</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3933-6">&lt;Alt-num&gt; - select tab</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara4128">&lt;Ctrl-Tab&gt; - select prev. tab</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara4130">&lt;Ctrl-V&gt; - passthrough mode</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara4132">&lt;Ctrl-Q&gt; - quit</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara4136">&lt;Ctrl-H&gt; - home</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara4138">&lt;Ctrl-S&gt; - stop loading</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara4140">&lt;Ctrl-Alt-P&gt; - print</flowPara><flowPara
+ style="font-weight:bold;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#000000;stroke-width:1.06666672"
+ id="flowPara4142">in insert mode:</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara4144">&lt;Ctrl-E&gt; - open editor</flowPara><flowPara
+ style="font-weight:bold;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#000000;stroke-width:1.06666672"
+ id="flowPara4146">in command mode:</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara4148">&lt;Ctrl-P&gt; - prev. history item</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3935-9">&lt;Ctrl-N&gt; - next history item</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara6189">&lt;Ctrl-D&gt; - delete current item</flowPara></flowRoot> <rect
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect3764-9"
+ width="64"
+ height="49.059277"
+ x="179.54729"
+ y="386.13333"
+ ry="3.6638854" />
+ <rect
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect3764-9-3"
+ width="64"
+ height="49.059277"
+ x="51.100777"
+ y="386.13333"
+ ry="3.6638854" />
+ <rect
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect3764-9-1"
+ width="64"
+ height="49.059277"
+ x="654.73492"
+ y="386.13333"
+ ry="3.6638854" />
+ <rect
+ style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ id="rect3764-9-7"
+ width="64"
+ height="49.059277"
+ x="779.16278"
+ y="386.13333"
+ ry="3.6638854" />
+ <g
+ id="g4049"
+ transform="translate(1.4643921,-2.0969564)">
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="66.420761"
+ y="411.5079"
+ id="text7358-8"><tspan
+ style="font-size:12.80000019px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan7360-1"
+ x="66.420761"
+ y="411.5079">Ctrl</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="71.803055"
+ y="426.94736"
+ id="text9514-8-9-0-8-4-0"><tspan
+ style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672"
+ id="tspan4936-1-1-9-59-8-3"
+ sodipodi:role="line"
+ x="71.803055"
+ y="426.94736">(11)</tspan></text>
+ </g>
+ <g
+ id="g4055"
+ transform="translate(1.7364258,-12.763623)">
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="198.77023"
+ y="422.17459"
+ id="text7358-8-3-8-1"><tspan
+ style="font-size:12.80000019px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan7360-1-7-0-2"
+ x="198.77023"
+ y="422.17459">Alt</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="199.97752"
+ y="437.61404"
+ id="text9514-8-9-0-8-4-0-8"><tspan
+ style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672"
+ id="tspan4936-1-1-9-59-8-3-8"
+ sodipodi:role="line"
+ x="199.97752"
+ y="437.61404">(11)</tspan></text>
+ </g>
+ <g
+ id="g4065"
+ transform="translate(6.0870443,-12.763623)">
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="669.60724"
+ y="422.17459"
+ id="text7358-8-3-8"><tspan
+ style="font-size:12.80000019px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan7360-1-7-0"
+ x="669.60724"
+ y="422.17459">Alt</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="670.81451"
+ y="437.61404"
+ id="text9514-8-9-0-8-4-0-7"><tspan
+ style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672"
+ id="tspan4936-1-1-9-59-8-3-82"
+ sodipodi:role="line"
+ x="670.81451"
+ y="437.61404">(11)</tspan></text>
+ </g>
+ <g
+ id="g4071"
+ transform="translate(1.0914714,-12.763623)">
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="794.85565"
+ y="422.17459"
+ id="text7358-8-3"><tspan
+ style="font-size:12.80000019px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"
+ sodipodi:role="line"
+ id="tspan7360-1-7"
+ x="794.85565"
+ y="422.17459">Ctrl</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="800.23798"
+ y="437.61404"
+ id="text9514-8-9-0-8-4-0-3"><tspan
+ style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672"
+ id="tspan4936-1-1-9-59-8-3-4"
+ sodipodi:role="line"
+ x="800.23798"
+ y="437.61404">(11)</tspan></text>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="416.72626"
+ y="171.09129"
+ id="text7245-1"><tspan
+ sodipodi:role="line"
+ x="416.72626"
+ y="171.09129"
+ id="tspan7366-3"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ sodipodi:role="line"
+ x="416.72626"
+ y="178.97421"
+ id="tspan7249-4"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">select</tspan><tspan
+ sodipodi:role="line"
+ x="416.72626"
+ y="186.65421"
+ id="tspan5293"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">tab</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="292.49472"
+ y="366.05417"
+ id="text10547-23-6-7"><tspan
+ sodipodi:role="line"
+ x="292.49472"
+ y="366.05417"
+ id="tspan4052"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">(10)</tspan></text>
+ <text
+ id="text10564-6-7-8-0"
+ y="314.29889"
+ x="814.39789"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ id="tspan10570-9-4-6-1"
+ y="314.29889"
+ x="814.39789"
+ sodipodi:role="line"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ y="321.97888"
+ x="814.39789"
+ sodipodi:role="line"
+ id="tspan4975-2-8-7"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ y="329.65887"
+ x="814.39789"
+ sodipodi:role="line"
+ id="tspan4977-3-1-2"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">search</tspan><tspan
+ y="337.3389"
+ x="814.39789"
+ sodipodi:role="line"
+ id="tspan5364"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">backw.</tspan></text>
+ <text
+ id="text9514-8-9-9"
+ y="171.64418"
+ x="788.19946"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="171.64418"
+ x="788.19946"
+ sodipodi:role="line"
+ id="tspan9524-5-1-5"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ y="179.5271"
+ x="788.19946"
+ sodipodi:role="line"
+ id="tspan6096-4"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">paste</tspan><tspan
+ y="187.20709"
+ x="788.19946"
+ sodipodi:role="line"
+ id="tspan5366-3"
+ style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672">(2)</tspan></text>
+ <text
+ id="text9514-8-0"
+ y="171.09129"
+ x="490.50494"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="171.09129"
+ x="490.50494"
+ sodipodi:role="line"
+ id="tspan9524-5-8"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ y="178.97421"
+ x="490.50494"
+ sodipodi:role="line"
+ id="tspan4938-4-2"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">yank/</tspan><tspan
+ y="186.65421"
+ x="490.50494"
+ sodipodi:role="line"
+ id="tspan4936-1-1"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">copy <tspan
+ style="font-size:8.53333378px;fill:#ff0000;stroke-width:1.06666672"
+ id="tspan5713-7">(1)</tspan></tspan></text>
+ <text
+ id="text9514-8-9-0-8-7-7"
+ y="291.00937"
+ x="133.7375"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="291.00937"
+ x="133.7375"
+ sodipodi:role="line"
+ id="tspan4936-1-1-9-59-5-6"
+ style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672">(10)</tspan></text>
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot5691-4-9-3-6-6"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ transform="translate(0,10)"><flowRegion
+ id="flowRegion5693-9-1-7-3-8"
+ style="font-family:sans-serif;stroke-width:1.06666672"><rect
+ id="rect5695-9-8-7-7-6"
+ width="344"
+ height="173.33333"
+ x="913.12598"
+ y="622.15717"
+ style="font-family:sans-serif;fill:#000000;stroke-width:1.13777781" /></flowRegion><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara3626-7-0"><flowSpan
+ id="flowSpan5520"
+ style="font-weight:bold;font-size:10.66666698px;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#0000ff;stroke-width:1.06666672">blue keys </flowSpan><flowSpan
+ style="font-family:sans-serif;fill:#0000ff;stroke-width:1.06666672"
+ id="flowSpan5528">can be</flowSpan></flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#0000ff;stroke-width:1.06666672"
+ id="flowPara3725-9">prefixed by a count</flowPara></flowRoot> <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="339.1572"
+ y="166.24342"
+ id="text7245-1-7"><tspan
+ sodipodi:role="line"
+ x="339.1572"
+ y="166.24342"
+ id="tspan7366-3-3"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ sodipodi:role="line"
+ x="339.1572"
+ y="174.12634"
+ id="tspan5293-5"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">reload </tspan><tspan
+ sodipodi:role="line"
+ x="339.1572"
+ y="181.80634"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"
+ id="tspan3716">(bypass </tspan><tspan
+ sodipodi:role="line"
+ x="339.1572"
+ y="189.48634"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"
+ id="tspan3719">cache)</tspan></text>
+ <text
+ id="text9514-60-7-7-0-8"
+ y="360.58533"
+ x="365.25357"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="360.58533"
+ x="365.25357"
+ sodipodi:role="line"
+ id="tspan5689-6"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">visual</tspan><tspan
+ y="368.26532"
+ x="365.25357"
+ sodipodi:role="line"
+ id="tspan4112"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">mode</tspan></text>
+ <text
+ id="text10564-5"
+ y="274.2934"
+ x="873.4303"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="274.2934"
+ x="873.4303"
+ sodipodi:role="line"
+ id="tspan10566-6"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ id="tspan10570-91"
+ y="282.1763"
+ x="873.4303"
+ sodipodi:role="line"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">jump to</tspan><tspan
+ y="289.85632"
+ x="873.4303"
+ sodipodi:role="line"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"
+ id="tspan6066">scroll</tspan><tspan
+ y="297.53632"
+ x="873.4303"
+ sodipodi:role="line"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"
+ id="tspan6068">mark</tspan></text>
+ <text
+ id="text10564-2"
+ y="362.50635"
+ x="731.82947"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ id="tspan10568-0"
+ y="362.50635"
+ x="731.82947"
+ sodipodi:role="line"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672">repeat</tspan><tspan
+ id="tspan10570-93"
+ y="370.38925"
+ x="731.82947"
+ sodipodi:role="line"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">cmd</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="183.06667"
+ y="97.639633"
+ id="text7245-1-6"><tspan
+ sodipodi:role="line"
+ x="183.06667"
+ y="97.639633"
+ id="tspan7366-3-0"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ sodipodi:role="line"
+ x="183.06667"
+ y="105.52255"
+ id="tspan7249-4-6"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">run</tspan><tspan
+ sodipodi:role="line"
+ x="183.06667"
+ y="113.20255"
+ id="tspan5293-2"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">macro</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="117.44301"
+ y="203.05061"
+ id="text7245-1-61"><tspan
+ sodipodi:role="line"
+ x="117.44301"
+ y="203.05061"
+ id="tspan7366-3-8"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ sodipodi:role="line"
+ x="117.44301"
+ y="210.93353"
+ id="tspan5293-9"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">record</tspan><tspan
+ sodipodi:role="line"
+ x="117.44301"
+ y="218.61353"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"
+ id="tspan6136">macro</tspan></text>
+ <text
+ id="text10564-5-2"
+ y="125.17836"
+ x="37.344757"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="125.17836"
+ x="37.344757"
+ sodipodi:role="line"
+ id="tspan10566-6-0"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ id="tspan10570-91-2"
+ y="133.06128"
+ x="37.344757"
+ sodipodi:role="line"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">set</tspan><tspan
+ y="140.74127"
+ x="37.344757"
+ sodipodi:role="line"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"
+ id="tspan6066-3">scroll</tspan><tspan
+ y="148.42128"
+ x="37.344757"
+ sodipodi:role="line"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"
+ id="tspan6068-7">mark</tspan></text>
+ <text
+ id="text9514-60-8-5"
+ y="323.89648"
+ x="590.26257"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="323.89648"
+ x="590.26257"
+ sodipodi:role="line"
+ id="tspan5524-9"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">save</tspan><tspan
+ y="331.57648"
+ x="590.26257"
+ sodipodi:role="line"
+ id="tspan5530-2"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">book-</tspan><tspan
+ y="339.25647"
+ x="590.26257"
+ sodipodi:role="line"
+ id="tspan5532-2"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">mark</tspan></text>
+ <text
+ id="text10564-5-2-8"
+ y="200.40416"
+ x="21.280243"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ y="200.40416"
+ x="21.280243"
+ sodipodi:role="line"
+ id="tspan10566-6-0-9"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ id="tspan10570-91-2-7"
+ y="208.28708"
+ x="21.280243"
+ sodipodi:role="line"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">cycle</tspan><tspan
+ y="215.96707"
+ x="21.280243"
+ sodipodi:role="line"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"
+ id="tspan6068-7-6">completion</tspan><tspan
+ y="223.64708"
+ x="21.280243"
+ sodipodi:role="line"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"
+ id="tspan6220">items</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="417.29486"
+ y="205.18887"
+ id="text7245-1-3"><tspan
+ sodipodi:role="line"
+ x="417.29486"
+ y="205.18887"
+ id="tspan7366-3-6"
+ style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan
+ sodipodi:role="line"
+ x="417.29486"
+ y="213.07179"
+ id="tspan5293-53"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">toggle</tspan><tspan
+ sodipodi:role="line"
+ x="417.29486"
+ y="220.75179"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672;fill:#ff0000"
+ id="tspan6091">(12)</tspan><tspan
+ sodipodi:role="line"
+ x="417.29486"
+ y="225.70012"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"
+ id="tspan6087" /><tspan
+ sodipodi:role="line"
+ x="417.29486"
+ y="225.70012"
+ style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"
+ id="tspan6089" /></text>
+ <flowRoot
+ transform="translate(-1.2953814,90.2721)"
+ xml:space="preserve"
+ id="flowRoot5691-0-5"
+ style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"><flowRegion
+ id="flowRegion5693-7-6"
+ style="font-family:sans-serif;stroke-width:1.06666672"><rect
+ id="rect5695-0-2"
+ width="344"
+ height="173.33333"
+ x="19.42783"
+ y="520.07886"
+ style="font-family:sans-serif;fill:#000000;stroke-width:1.13777781" /></flowRegion><flowPara
+ style="font-weight:bold;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#000000;stroke-width:1.06666672"
+ id="flowPara5701-9-2"><flowSpan
+ style="font-weight:bold;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#ff0000;stroke-width:1.06666672"
+ id="flowSpan5705-5-1">(12)</flowSpan> toggling settings:</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara6196">tsh - toggle scripts for the current host (temporarily)</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara6200">tSh - like <flowSpan
+ style="font-style:italic"
+ id="flowSpan6202">tsh</flowSpan>, but permanently</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara6206">tsH/tsu - like <flowSpan
+ style="font-style:italic"
+ id="flowSpan6210">tsh</flowSpan>, but including subdomains / with exact URL</flowPara><flowPara
+ style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672"
+ id="flowPara6208">tph - toggle plugins</flowPara></flowRoot> </g>
+</svg>
diff --git a/.config/qutebrowser/misc/qutebrowser.appdata.xml b/.config/qutebrowser/misc/qutebrowser.appdata.xml
new file mode 100644
index 0000000..bdab55f
--- /dev/null
+++ b/.config/qutebrowser/misc/qutebrowser.appdata.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright 2017 suve <veg@svgames.pl> -->
+<component type="desktop">
+ <id>org.qutebrowser.qutebrowser</id>
+ <metadata_license>CC-BY-SA-3.0</metadata_license>
+ <project_license>GPL-3.0</project_license>
+ <name>qutebrowser</name>
+ <summary>A keyboard-driven web browser</summary>
+ <description>
+ <p>
+ qutebrowser is a keyboard-focused browser with a minimal GUI.
+ It was inspired by other browsers/addons like dwb and Vimperator/Pentadactyl,
+ and is based on Python and PyQt5.
+ </p>
+ </description>
+ <categories>
+ <category>Network</category>
+ <category>WebBrowser</category>
+ </categories>
+ <provides>
+ <binary>qutebrowser</binary>
+ </provides>
+ <launchable type="desktop-id">qutebrowser.desktop</launchable>
+ <screenshots>
+ <screenshot type="default">
+ <image>https://raw.githubusercontent.com/qutebrowser/qutebrowser/master/doc/img/main.png</image>
+ </screenshot>
+ <screenshot>
+ <image>https://raw.githubusercontent.com/qutebrowser/qutebrowser/master/doc/img/downloads.png</image>
+ </screenshot>
+ <screenshot>
+ <image>https://raw.githubusercontent.com/qutebrowser/qutebrowser/master/doc/img/completion.png</image>
+ </screenshot>
+ <screenshot>
+ <image>https://raw.githubusercontent.com/qutebrowser/qutebrowser/master/doc/img/hints.png</image>
+ </screenshot>
+ </screenshots>
+ <url type="homepage">https://www.qutebrowser.org</url>
+ <url type="faq">https://qutebrowser.org/doc/faq.html</url>
+ <url type="help">https://qutebrowser.org/doc/help/</url>
+ <url type="bugtracker">https://github.com/qutebrowser/qutebrowser/issues/</url>
+ <url type="donation">https://github.com/qutebrowser/qutebrowser#donating</url>
+ <releases>
+ <release version="1.3.0" date="2018-05-04"/>
+ <release version="1.2.1" date="2018-03-14"/>
+ <release version="1.2.0" date="2018-03-09"/>
+ </releases>
+</component>
diff --git a/.config/qutebrowser/misc/qutebrowser.desktop b/.config/qutebrowser/misc/qutebrowser.desktop
new file mode 100644
index 0000000..5243b0c
--- /dev/null
+++ b/.config/qutebrowser/misc/qutebrowser.desktop
@@ -0,0 +1,12 @@
+[Desktop Entry]
+Name=qutebrowser
+GenericName=Web Browser
+Comment=A keyboard-driven, vim-like browser based on PyQt5
+Icon=qutebrowser
+Type=Application
+Categories=Network;WebBrowser;
+Exec=qutebrowser %u
+Terminal=false
+StartupNotify=false
+MimeType=text/html;text/xml;application/xhtml+xml;application/xml;application/rdf+xml;image/gif;image/jpeg;image/png;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/qute;
+Keywords=Browser
diff --git a/.config/qutebrowser/misc/qutebrowser.nsi b/.config/qutebrowser/misc/qutebrowser.nsi
new file mode 100644
index 0000000..76f459a
--- /dev/null
+++ b/.config/qutebrowser/misc/qutebrowser.nsi
@@ -0,0 +1,80 @@
+Name "qutebrowser"
+
+Unicode true
+RequestExecutionLevel admin
+SetCompressor /solid lzma
+
+!ifdef X64
+ OutFile "..\dist\qutebrowser-${VERSION}-amd64.exe"
+ InstallDir "$ProgramFiles64\qutebrowser"
+!else
+ OutFile "..\dist\qutebrowser-${VERSION}-win32.exe"
+ InstallDir "$ProgramFiles\qutebrowser"
+!endif
+
+;Default installation folder
+
+!include "MUI2.nsh"
+;!include "MultiUser.nsh"
+
+!define MUI_ABORTWARNING
+;!define MULTIUSER_MUI
+;!define MULTIUSER_INSTALLMODE_COMMANDLINE
+!define MUI_ICON "../icons/qutebrowser.ico"
+!define MUI_UNICON "../icons/qutebrowser.ico"
+
+!insertmacro MUI_PAGE_LICENSE "..\LICENSE"
+!insertmacro MUI_PAGE_DIRECTORY
+!insertmacro MUI_PAGE_INSTFILES
+!insertmacro MUI_UNPAGE_CONFIRM
+!insertmacro MUI_UNPAGE_INSTFILES
+
+!insertmacro MUI_LANGUAGE "English"
+
+; depends on admin status
+;SetShellVarContext current
+
+
+Section "Install"
+
+ ; Uninstall old versions
+ ExecWait 'MsiExec.exe /quiet /qn /norestart /X{633F41F9-FE9B-42D1-9CC4-718CBD01EE11}'
+ ExecWait 'MsiExec.exe /quiet /qn /norestart /X{9331D947-AC86-4542-A755-A833429C6E69}'
+ IfFileExists "$INSTDIR\uninst.exe" 0 +2
+ ExecWait "$INSTDIR\uninst.exe /S _?=$INSTDIR"
+ CreateDirectory "$INSTDIR"
+
+ SetOutPath "$INSTDIR"
+
+ !ifdef X64
+ file /r "..\dist\qutebrowser-${VERSION}-x64\*.*"
+ !else
+ file /r "..\dist\qutebrowser-${VERSION}-x86\*.*"
+ !endif
+
+ SetShellVarContext all
+ CreateShortCut "$SMPROGRAMS\qutebrowser.lnk" "$INSTDIR\qutebrowser.exe"
+
+ ;Create uninstaller
+ WriteUninstaller "$INSTDIR\uninst.exe"
+
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qutebrowser" "DisplayName" "qutebrowser"
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qutebrowser" "UninstallString" '"$INSTDIR\uninst.exe"'
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qutebrowser" "QuietUninstallString" '"$INSTDIR\uninst.exe" /S'
+
+SectionEnd
+
+;--------------------------------
+;Uninstaller Section
+
+Section "Uninstall"
+
+ SetShellVarContext all
+ Delete "$SMPROGRAMS\qutebrowser.lnk"
+
+ RMDir /r "$INSTDIR\*.*"
+ RMDir "$INSTDIR"
+
+ DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qutebrowser"
+
+SectionEnd
diff --git a/.config/qutebrowser/misc/qutebrowser.rcc b/.config/qutebrowser/misc/qutebrowser.rcc
new file mode 100644
index 0000000..2f73b37
--- /dev/null
+++ b/.config/qutebrowser/misc/qutebrowser.rcc
@@ -0,0 +1,13 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+ <file>icons/qutebrowser-16x16.png</file>
+ <file>icons/qutebrowser-24x24.png</file>
+ <file>icons/qutebrowser-32x32.png</file>
+ <file>icons/qutebrowser-48x48.png</file>
+ <file>icons/qutebrowser-64x64.png</file>
+ <file>icons/qutebrowser-96x96.png</file>
+ <file>icons/qutebrowser-128x128.png</file>
+ <file>icons/qutebrowser-256x256.png</file>
+ <file>icons/qutebrowser-512x512.png</file>
+</qresource>
+</RCC>
diff --git a/.config/qutebrowser/misc/qutebrowser.spec b/.config/qutebrowser/misc/qutebrowser.spec
new file mode 100644
index 0000000..c886fb0
--- /dev/null
+++ b/.config/qutebrowser/misc/qutebrowser.spec
@@ -0,0 +1,76 @@
+# -*- mode: python -*-
+
+import sys
+import os
+
+sys.path.insert(0, os.getcwd())
+from scripts import setupcommon
+
+block_cipher = None
+
+
+def get_data_files():
+ data_files = [
+ ('../qutebrowser/html', 'html'),
+ ('../qutebrowser/img', 'img'),
+ ('../qutebrowser/javascript', 'javascript'),
+ ('../qutebrowser/html/doc', 'html/doc'),
+ ('../qutebrowser/git-commit-id', '.'),
+ ('../qutebrowser/config/configdata.yml', 'config'),
+ ]
+
+ # if os.path.exists(os.path.join('qutebrowser', '3rdparty', 'pdfjs')):
+ # data_files.append(('../qutebrowser/3rdparty/pdfjs', '3rdparty/pdfjs'))
+ # else:
+ # print("Warning: excluding pdfjs as it's not present!")
+
+ return data_files
+
+
+setupcommon.write_git_file()
+
+
+if os.name == 'nt':
+ icon = 'icons/qutebrowser.ico'
+elif sys.platform == 'darwin':
+ icon = 'icons/qutebrowser.icns'
+else:
+ icon = None
+
+
+a = Analysis(['../qutebrowser/__main__.py'],
+ pathex=['misc'],
+ binaries=None,
+ datas=get_data_files(),
+ hiddenimports=['PyQt5.QtOpenGL', 'PyQt5._QOpenGLFunctions_2_0'],
+ hookspath=[],
+ runtime_hooks=[],
+ excludes=['tkinter'],
+ win_no_prefer_redirects=False,
+ win_private_assemblies=False,
+ cipher=block_cipher)
+pyz = PYZ(a.pure, a.zipped_data,
+ cipher=block_cipher)
+exe = EXE(pyz,
+ a.scripts,
+ exclude_binaries=True,
+ name='qutebrowser',
+ icon=icon,
+ debug=False,
+ strip=False,
+ upx=False,
+ console=False,
+ version='misc/file_version_info.txt')
+coll = COLLECT(exe,
+ a.binaries,
+ a.zipfiles,
+ a.datas,
+ strip=False,
+ upx=False,
+ name='qutebrowser')
+
+app = BUNDLE(coll,
+ name='qutebrowser.app',
+ icon=icon,
+ # https://github.com/pyinstaller/pyinstaller/blob/b78bfe530cdc2904f65ce098bdf2de08c9037abb/PyInstaller/hooks/hook-PyQt5.QtWebEngineWidgets.py#L24
+ bundle_identifier='org.qt-project.Qt.QtWebEngineCore')
diff --git a/.config/qutebrowser/misc/requirements/README.md b/.config/qutebrowser/misc/requirements/README.md
new file mode 100644
index 0000000..6ae9862
--- /dev/null
+++ b/.config/qutebrowser/misc/requirements/README.md
@@ -0,0 +1,20 @@
+This directory contains various `requirements` files which are used by `tox` to
+have reproducible tests with pinned versions.
+
+The files are generated based on unpinned requirements in `*.txt-raw` files.
+
+Those files can also contain some special commands:
+
+- Add an additional comment to a line: `#@ comment: <package> <comment here>`
+- Filter a line for requirements.io: `#@ filter: <package> <filter>`
+- Don't include a package in the output: `#@ ignore: <package>` (or multiple packages)
+- Replace a part of a frozen package specification with another: `#@ replace <regex> <replacement>`
+
+Some examples:
+
+```
+#@ comment: mypkg blah blub
+#@ filter: mypkg != 1.0.0
+#@ ignore: mypkg, otherpkg
+#@ replace: foo bar
+```
diff --git a/.config/qutebrowser/misc/requirements/requirements-check-manifest.txt b/.config/qutebrowser/misc/requirements/requirements-check-manifest.txt
new file mode 100644
index 0000000..c11a3f7
--- /dev/null
+++ b/.config/qutebrowser/misc/requirements/requirements-check-manifest.txt
@@ -0,0 +1,3 @@
+# This file is automatically generated by scripts/dev/recompile_requirements.py
+
+check-manifest==0.37
diff --git a/.config/qutebrowser/misc/requirements/requirements-check-manifest.txt-raw b/.config/qutebrowser/misc/requirements/requirements-check-manifest.txt-raw
new file mode 100644
index 0000000..dcc0efe
--- /dev/null
+++ b/.config/qutebrowser/misc/requirements/requirements-check-manifest.txt-raw
@@ -0,0 +1 @@
+check-manifest
diff --git a/.config/qutebrowser/misc/requirements/requirements-codecov.txt b/.config/qutebrowser/misc/requirements/requirements-codecov.txt
new file mode 100644
index 0000000..9fed7b3
--- /dev/null
+++ b/.config/qutebrowser/misc/requirements/requirements-codecov.txt
@@ -0,0 +1,9 @@
+# This file is automatically generated by scripts/dev/recompile_requirements.py
+
+certifi==2018.4.16
+chardet==3.0.4
+codecov==2.0.15
+coverage==4.5.1
+idna==2.7
+requests==2.19.1
+urllib3==1.23
diff --git a/.config/qutebrowser/misc/requirements/requirements-codecov.txt-raw b/.config/qutebrowser/misc/requirements/requirements-codecov.txt-raw
new file mode 100644
index 0000000..15f1c72
--- /dev/null
+++ b/.config/qutebrowser/misc/requirements/requirements-codecov.txt-raw
@@ -0,0 +1 @@
+codecov
diff --git a/.config/qutebrowser/misc/requirements/requirements-flake8.txt b/.config/qutebrowser/misc/requirements/requirements-flake8.txt
new file mode 100644
index 0000000..b4f0045
--- /dev/null
+++ b/.config/qutebrowser/misc/requirements/requirements-flake8.txt
@@ -0,0 +1,27 @@
+# This file is automatically generated by scripts/dev/recompile_requirements.py
+
+attrs==18.1.0
+flake8==3.5.0
+flake8-bugbear==18.2.0
+flake8-builtins==1.4.1 # rq.filter: != 1.4.0
+flake8-comprehensions==1.4.1
+flake8-copyright==0.2.0
+flake8-debugger==3.1.0
+flake8-deprecated==1.3
+flake8-docstrings==1.3.0
+flake8-future-import==0.4.5
+flake8-mock==0.3
+flake8-per-file-ignores==0.6
+flake8-polyfill==1.0.2
+flake8-string-format==0.2.3
+flake8-tidy-imports==1.1.0
+flake8-tuple==0.2.13
+mccabe==0.6.1
+pathmatch==0.2.1
+pep8-naming==0.7.0
+pycodestyle==2.3.1 # rq.filter: < 2.4.0
+pydocstyle==2.1.1
+pyflakes==2.0.0
+six==1.11.0
+snowballstemmer==1.2.1
+typing==3.6.4
diff --git a/.config/qutebrowser/misc/requirements/requirements-flake8.txt-raw b/.config/qutebrowser/misc/requirements/requirements-flake8.txt-raw
new file mode 100644
index 0000000..7ccbbce
--- /dev/null
+++ b/.config/qutebrowser/misc/requirements/requirements-flake8.txt-raw
@@ -0,0 +1,23 @@
+flake8
+flake8-bugbear
+flake8-builtins!=1.4.0
+flake8-comprehensions
+flake8-copyright
+flake8-debugger
+flake8-deprecated
+flake8-docstrings
+flake8-future-import
+flake8-mock
+flake8-per-file-ignores
+flake8-string-format
+flake8-tidy-imports
+flake8-tuple
+pep8-naming
+pydocstyle
+pyflakes
+
+# https://github.com/PyCQA/pycodestyle/issues/741
+#@ filter: pycodestyle < 2.4.0
+
+# https://github.com/gforcada/flake8-builtins/issues/36
+#@ filter: flake8-builtins != 1.4.0
diff --git a/.config/qutebrowser/misc/requirements/requirements-pip.txt b/.config/qutebrowser/misc/requirements/requirements-pip.txt
new file mode 100644
index 0000000..bf003fc
--- /dev/null
+++ b/.config/qutebrowser/misc/requirements/requirements-pip.txt
@@ -0,0 +1,8 @@
+# This file is automatically generated by scripts/dev/recompile_requirements.py
+
+appdirs==1.4.3
+packaging==17.1
+pyparsing==2.2.0
+setuptools==40.0.0
+six==1.11.0
+wheel==0.31.1
diff --git a/.config/qutebrowser/misc/requirements/requirements-pyinstaller.txt b/.config/qutebrowser/misc/requirements/requirements-pyinstaller.txt
new file mode 100644
index 0000000..e916393
--- /dev/null
+++ b/.config/qutebrowser/misc/requirements/requirements-pyinstaller.txt
@@ -0,0 +1,7 @@
+# This file is automatically generated by scripts/dev/recompile_requirements.py
+
+altgraph==0.15
+future==0.16.0
+macholib==1.9
+pefile==2017.11.5
+PyInstaller==3.3.1
diff --git a/.config/qutebrowser/misc/requirements/requirements-pyinstaller.txt-raw b/.config/qutebrowser/misc/requirements/requirements-pyinstaller.txt-raw
new file mode 100644
index 0000000..c313980
--- /dev/null
+++ b/.config/qutebrowser/misc/requirements/requirements-pyinstaller.txt-raw
@@ -0,0 +1 @@
+PyInstaller
diff --git a/.config/qutebrowser/misc/requirements/requirements-pylint-master.txt b/.config/qutebrowser/misc/requirements/requirements-pylint-master.txt
new file mode 100644
index 0000000..2df0736
--- /dev/null
+++ b/.config/qutebrowser/misc/requirements/requirements-pylint-master.txt
@@ -0,0 +1,19 @@
+# This file is automatically generated by scripts/dev/recompile_requirements.py
+
+-e git+https://github.com/PyCQA/astroid.git#egg=astroid
+certifi==2018.4.16
+chardet==3.0.4
+github3.py==1.1.0
+idna==2.7
+isort==4.3.4
+lazy-object-proxy==1.3.1
+mccabe==0.6.1
+-e git+https://github.com/PyCQA/pylint.git#egg=pylint
+python-dateutil==2.7.3
+./scripts/dev/pylint_checkers
+requests==2.19.1
+six==1.11.0
+typed-ast==1.1.0
+uritemplate==3.0.0
+urllib3==1.23
+wrapt==1.10.11
diff --git a/.config/qutebrowser/misc/requirements/requirements-pylint-master.txt-raw b/.config/qutebrowser/misc/requirements/requirements-pylint-master.txt-raw
new file mode 100644
index 0000000..405b0ab
--- /dev/null
+++ b/.config/qutebrowser/misc/requirements/requirements-pylint-master.txt-raw
@@ -0,0 +1,11 @@
+-e git+https://github.com/PyCQA/astroid.git#egg=astroid
+-e git+https://github.com/PyCQA/pylint.git#egg=pylint
+./scripts/dev/pylint_checkers
+requests
+github3.py
+
+# remove @commit-id for scm installs
+#@ replace: @.*# #
+
+# fix qute-pylint location
+#@ replace: qute-pylint==.* ./scripts/dev/pylint_checkers
diff --git a/.config/qutebrowser/misc/requirements/requirements-pylint.txt b/.config/qutebrowser/misc/requirements/requirements-pylint.txt
new file mode 100644
index 0000000..e78dfe2
--- /dev/null
+++ b/.config/qutebrowser/misc/requirements/requirements-pylint.txt
@@ -0,0 +1,19 @@
+# This file is automatically generated by scripts/dev/recompile_requirements.py
+
+astroid==2.0.1
+certifi==2018.4.16
+chardet==3.0.4
+github3.py==1.1.0
+idna==2.7
+isort==4.3.4
+lazy-object-proxy==1.3.1
+mccabe==0.6.1
+pylint==2.0.1
+python-dateutil==2.7.3
+./scripts/dev/pylint_checkers
+requests==2.19.1
+six==1.11.0
+typed-ast==1.1.0
+uritemplate==3.0.0
+urllib3==1.23
+wrapt==1.10.11
diff --git a/.config/qutebrowser/misc/requirements/requirements-pylint.txt-raw b/.config/qutebrowser/misc/requirements/requirements-pylint.txt-raw
new file mode 100644
index 0000000..37252ee
--- /dev/null
+++ b/.config/qutebrowser/misc/requirements/requirements-pylint.txt-raw
@@ -0,0 +1,7 @@
+pylint
+./scripts/dev/pylint_checkers
+requests
+github3.py
+
+# fix qute-pylint location
+#@ replace: qute-pylint==.* ./scripts/dev/pylint_checkers
diff --git a/.config/qutebrowser/misc/requirements/requirements-pyqt.txt b/.config/qutebrowser/misc/requirements/requirements-pyqt.txt
new file mode 100644
index 0000000..2878a55
--- /dev/null
+++ b/.config/qutebrowser/misc/requirements/requirements-pyqt.txt
@@ -0,0 +1,4 @@
+# This file is automatically generated by scripts/dev/recompile_requirements.py
+
+PyQt5==5.11.2
+PyQt5-sip==4.19.12
diff --git a/.config/qutebrowser/misc/requirements/requirements-pyqt.txt-raw b/.config/qutebrowser/misc/requirements/requirements-pyqt.txt-raw
new file mode 100644
index 0000000..37a69c4
--- /dev/null
+++ b/.config/qutebrowser/misc/requirements/requirements-pyqt.txt-raw
@@ -0,0 +1 @@
+PyQt5 \ No newline at end of file
diff --git a/.config/qutebrowser/misc/requirements/requirements-pyroma.txt b/.config/qutebrowser/misc/requirements/requirements-pyroma.txt
new file mode 100644
index 0000000..6afd097
--- /dev/null
+++ b/.config/qutebrowser/misc/requirements/requirements-pyroma.txt
@@ -0,0 +1,4 @@
+# This file is automatically generated by scripts/dev/recompile_requirements.py
+
+docutils==0.14
+pyroma==2.3.1
diff --git a/.config/qutebrowser/misc/requirements/requirements-pyroma.txt-raw b/.config/qutebrowser/misc/requirements/requirements-pyroma.txt-raw
new file mode 100644
index 0000000..5ddfb65
--- /dev/null
+++ b/.config/qutebrowser/misc/requirements/requirements-pyroma.txt-raw
@@ -0,0 +1 @@
+pyroma
diff --git a/.config/qutebrowser/misc/requirements/requirements-qutebrowser.txt-raw b/.config/qutebrowser/misc/requirements/requirements-qutebrowser.txt-raw
new file mode 100644
index 0000000..c66c65b
--- /dev/null
+++ b/.config/qutebrowser/misc/requirements/requirements-qutebrowser.txt-raw
@@ -0,0 +1,7 @@
+Jinja2
+Pygments
+pyPEG2
+PyYAML
+colorama
+cssutils
+attrs
diff --git a/.config/qutebrowser/misc/requirements/requirements-tests-git.txt b/.config/qutebrowser/misc/requirements/requirements-tests-git.txt
new file mode 100644
index 0000000..ce00cd3
--- /dev/null
+++ b/.config/qutebrowser/misc/requirements/requirements-tests-git.txt
@@ -0,0 +1,38 @@
+bzr+lp:beautifulsoup
+git+https://github.com/cherrypy/cheroot.git
+hg+https://bitbucket.org/ned/coveragepy
+git+https://github.com/micheles/decorator.git
+git+https://github.com/pallets/flask.git
+git+https://github.com/miracle2k/python-glob2.git
+git+https://github.com/HypothesisWorks/hypothesis-python.git
+git+https://github.com/pallets/itsdangerous.git
+git+https://bitbucket.org/zzzeek/mako.git
+git+https://github.com/r1chardj0n3s/parse.git
+git+https://github.com/jenisys/parse_type.git
+hg+https://bitbucket.org/pytest-dev/py
+git+https://github.com/pytest-dev/pytest.git@features
+git+https://github.com/pytest-dev/pytest-bdd.git
+git+https://github.com/pytest-dev/pytest-cov.git
+git+https://github.com/pytest-dev/pytest-faulthandler.git
+git+https://github.com/pytest-dev/pytest-instafail.git
+git+https://github.com/pytest-dev/pytest-mock.git
+git+https://github.com/pytest-dev/pytest-qt.git
+git+https://github.com/pytest-dev/pytest-repeat.git
+git+https://github.com/pytest-dev/pytest-rerunfailures.git
+git+https://github.com/abusalimov/pytest-travis-fold.git
+git+https://github.com/The-Compiler/pytest-xvfb.git
+hg+https://bitbucket.org/gutworth/six
+hg+https://bitbucket.org/jendrikseipp/vulture
+git+https://github.com/pallets/werkzeug.git
+
+
+## qutebrowser dependencies
+
+git+https://github.com/tartley/colorama.git
+hg+https://bitbucket.org/cthedot/cssutils
+git+https://github.com/pallets/jinja.git
+git+https://github.com/pallets/markupsafe.git
+hg+http://bitbucket.org/birkenfeld/pygments-main
+hg+https://bitbucket.org/fdik/pypeg
+git+https://github.com/python-attrs/attrs.git
+git+https://github.com/yaml/pyyaml.git
diff --git a/.config/qutebrowser/misc/requirements/requirements-tests.txt b/.config/qutebrowser/misc/requirements/requirements-tests.txt
new file mode 100644
index 0000000..07b0378
--- /dev/null
+++ b/.config/qutebrowser/misc/requirements/requirements-tests.txt
@@ -0,0 +1,42 @@
+# This file is automatically generated by scripts/dev/recompile_requirements.py
+
+atomicwrites==1.1.5
+attrs==18.1.0
+backports.functools-lru-cache==1.5
+beautifulsoup4==4.6.0
+cheroot==6.3.3
+click==6.7
+# colorama==0.3.9
+coverage==4.5.1
+EasyProcess==0.2.3
+fields==5.0.0
+Flask==1.0.2
+glob2==0.6
+hunter==2.0.2
+hypothesis==3.66.6
+itsdangerous==0.24
+# Jinja2==2.10
+Mako==1.0.7
+# MarkupSafe==1.0
+more-itertools==4.2.0
+parse==1.8.4
+parse-type==0.4.2
+pluggy==0.6.0
+py==1.5.4
+py-cpuinfo==4.0.0
+pytest==3.6.3
+pytest-bdd==2.21.0
+pytest-benchmark==3.1.1
+pytest-cov==2.5.1
+pytest-faulthandler==1.5.0
+pytest-instafail==0.4.0
+pytest-mock==1.10.0
+pytest-qt==3.0.0
+pytest-repeat==0.5.0
+pytest-rerunfailures==4.1
+pytest-travis-fold==1.3.0
+pytest-xvfb==1.1.0
+PyVirtualDisplay==0.2.1
+six==1.11.0
+vulture==0.28
+Werkzeug==0.14.1
diff --git a/.config/qutebrowser/misc/requirements/requirements-tests.txt-raw b/.config/qutebrowser/misc/requirements/requirements-tests.txt-raw
new file mode 100644
index 0000000..1216899
--- /dev/null
+++ b/.config/qutebrowser/misc/requirements/requirements-tests.txt-raw
@@ -0,0 +1,21 @@
+beautifulsoup4
+cheroot
+coverage
+Flask
+hunter
+hypothesis
+pytest
+pytest-bdd
+pytest-benchmark
+pytest-cov
+pytest-faulthandler
+pytest-instafail
+pytest-mock
+pytest-qt
+pytest-repeat
+pytest-rerunfailures
+pytest-travis-fold
+pytest-xvfb
+vulture
+
+#@ ignore: Jinja2, MarkupSafe, colorama
diff --git a/.config/qutebrowser/misc/requirements/requirements-tox.txt b/.config/qutebrowser/misc/requirements/requirements-tox.txt
new file mode 100644
index 0000000..e8c660e
--- /dev/null
+++ b/.config/qutebrowser/misc/requirements/requirements-tox.txt
@@ -0,0 +1,9 @@
+# This file is automatically generated by scripts/dev/recompile_requirements.py
+
+packaging==17.1
+pluggy==0.6.0
+py==1.5.4
+pyparsing==2.2.0
+six==1.11.0
+tox==3.1.2
+virtualenv==16.0.0
diff --git a/.config/qutebrowser/misc/requirements/requirements-tox.txt-raw b/.config/qutebrowser/misc/requirements/requirements-tox.txt-raw
new file mode 100644
index 0000000..053148f
--- /dev/null
+++ b/.config/qutebrowser/misc/requirements/requirements-tox.txt-raw
@@ -0,0 +1 @@
+tox
diff --git a/.config/qutebrowser/misc/requirements/requirements-vulture.txt b/.config/qutebrowser/misc/requirements/requirements-vulture.txt
new file mode 100644
index 0000000..c8a26e8
--- /dev/null
+++ b/.config/qutebrowser/misc/requirements/requirements-vulture.txt
@@ -0,0 +1,3 @@
+# This file is automatically generated by scripts/dev/recompile_requirements.py
+
+vulture==0.28
diff --git a/.config/qutebrowser/misc/requirements/requirements-vulture.txt-raw b/.config/qutebrowser/misc/requirements/requirements-vulture.txt-raw
new file mode 100644
index 0000000..a10f860
--- /dev/null
+++ b/.config/qutebrowser/misc/requirements/requirements-vulture.txt-raw
@@ -0,0 +1 @@
+vulture
diff --git a/.config/qutebrowser/misc/userscripts/cast b/.config/qutebrowser/misc/userscripts/cast
new file mode 100755
index 0000000..f7b64df
--- /dev/null
+++ b/.config/qutebrowser/misc/userscripts/cast
@@ -0,0 +1,156 @@
+#!/usr/bin/env bash
+#
+# Behaviour
+# Userscript for qutebrowser which casts the url passed in $1 to the default
+# ChromeCast device in the network using the program `castnow`
+#
+# Usage
+# You can launch the script from qutebrowser as follows:
+# spawn --userscript ${PATH_TO_FILE} {url}
+#
+# Then, you can control the chromecast by launching the simple command
+# `castnow` in a shell which will connect to the running castnow instance.
+#
+# For stopping the script, issue the command `pkill -f castnow` which would
+# then let the rest of the userscript execute for cleaning temporary file.
+#
+# Thanks
+# This userscript borrows Thorsten Wißmann's javascript code from his `mpv`
+# userscript.
+#
+# Dependencies
+# - castnow, https://github.com/xat/castnow
+#
+# Author
+# Simon Désaulniers <sim.desaulniers@gmail.com>
+
+if [ -z "$QUTE_FIFO" ] ; then
+ cat 1>&2 <<EOF
+Error: $0 can not be run as a standalone script.
+
+It is a qutebrowser userscript. In order to use it, call it using
+'spawn --userscript' as described in qute://help/userscripts.html
+EOF
+ exit 1
+fi
+
+msg() {
+ local cmd="$1"
+ shift
+ local msg="$*"
+ if [ -z "$QUTE_FIFO" ] ; then
+ echo "$cmd: $msg" >&2
+ else
+ echo "message-$cmd '${msg//\'/\\\'}'" >> "$QUTE_FIFO"
+ fi
+}
+
+js() {
+cat <<EOF
+
+ function descendantOfTagName(child, ancestorTagName) {
+ // tells whether child has some (proper) ancestor
+ // with the tag name ancestorTagName
+ while (child.parentNode != null) {
+ child = child.parentNode;
+ if (typeof child.tagName === 'undefined') break;
+ if (child.tagName.toUpperCase() == ancestorTagName.toUpperCase()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ var App = {};
+
+ var all_videos = [];
+ all_videos.push.apply(all_videos, document.getElementsByTagName("video"));
+ all_videos.push.apply(all_videos, document.getElementsByTagName("object"));
+ all_videos.push.apply(all_videos, document.getElementsByTagName("embed"));
+ App.backup_videos = Array();
+ App.all_replacements = Array();
+ for (i = 0; i < all_videos.length; i++) {
+ var video = all_videos[i];
+ if (descendantOfTagName(video, "object")) {
+ // skip tags that are contained in an object, because we hide
+ // the object anyway.
+ continue;
+ }
+ var replacement = document.createElement("div");
+ replacement.innerHTML = "
+ <p style=\\"margin-bottom: 0.5em\\">
+ The video is being cast on your ChromeCast device.
+ </p>
+ <p>
+ In order to restore this particular video
+ <a style=\\"font-weight: bold;
+ color: white;
+ background: transparent;
+ \\"
+ onClick=\\"restore_video(this, " + i + ");\\"
+ href=\\"javascript: restore_video(this, " + i + ")\\"
+ >click here</a>.
+ </p>
+ ";
+ replacement.style.position = "relative";
+ replacement.style.zIndex = "100003000000";
+ replacement.style.fontSize = "1rem";
+ replacement.style.textAlign = "center";
+ replacement.style.verticalAlign = "middle";
+ replacement.style.height = "100%";
+ replacement.style.background = "#101010";
+ replacement.style.color = "white";
+ replacement.style.border = "4px dashed #545454";
+ replacement.style.padding = "2em";
+ replacement.style.margin = "auto";
+ App.all_replacements[i] = replacement;
+ App.backup_videos[i] = video;
+ video.parentNode.replaceChild(replacement, video);
+ }
+
+ function restore_video(obj, index) {
+ obj = App.all_replacements[index];
+ video = App.backup_videos[index];
+ console.log(video);
+ obj.parentNode.replaceChild(video, obj);
+ }
+
+ /** force repainting the video, thanks to:
+ * http://martinwolf.org/2014/06/10/force-repaint-of-an-element-with-javascript/
+ */
+ var siteHeader = document.getElementById('header');
+ siteHeader.style.display='none';
+ siteHeader.offsetHeight; // no need to store this anywhere, the reference is enough
+ siteHeader.style.display='block';
+
+EOF
+}
+
+printjs() {
+ js | sed 's,//.*$,,' | tr '\n' ' '
+}
+echo "jseval -q $(printjs)" >> "$QUTE_FIFO"
+
+tmpdir=$(mktemp -d)
+file_to_cast=${tmpdir}/qutecast
+program_=$(command -v castnow)
+
+if [[ "${program_}" == "" ]]; then
+ msg error "castnow can't be found..."
+ exit 1
+fi
+
+# kill any running instance of castnow
+pkill -f "${program_}"
+
+# start youtube download in stream mode (-o -) into temporary file
+youtube-dl -qo - "$1" > "${file_to_cast}" &
+ytdl_pid=$!
+
+msg info "Casting $1" >> "$QUTE_FIFO"
+# start castnow in stream mode to cast on ChromeCast
+tail -F "${file_to_cast}" | ${program_} -
+
+# cleanup remaining background process and file on disk
+kill ${ytdl_pid}
+rm -rf "${tmpdir}"
diff --git a/.config/qutebrowser/misc/userscripts/dmenu_qutebrowser b/.config/qutebrowser/misc/userscripts/dmenu_qutebrowser
new file mode 100755
index 0000000..82e6d2f
--- /dev/null
+++ b/.config/qutebrowser/misc/userscripts/dmenu_qutebrowser
@@ -0,0 +1,48 @@
+#!/usr/bin/env bash
+
+# Copyright 2015 Zach-Button <zachrey.button@gmail.com>
+# Copyright 2015-2017 Florian Bruhin (The Compiler) <mail@qutebrowser.org>
+#
+# This file is part of qutebrowser.
+#
+# qutebrowser is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# qutebrowser is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with qutebrowser. If not, see <http://www.gnu.org/licenses/>.
+
+# Pipes history, quickmarks, and URL into dmenu.
+#
+# If run from qutebrowser as a userscript, it runs :open on the URL
+# If not, it opens a new qutebrowser window at the URL
+#
+# Ideal for use with tabs_are_windows. Set a hotkey to launch this script, then:
+# :bind o spawn --userscript dmenu_qutebrowser
+#
+# Use the hotkey to open in new tab/window, press 'o' to open URL in current tab/window
+# You can simulate "go" by pressing "o<tab>", as the current URL is always first in the list
+#
+# I personally use "<Mod4>o" to launch this script. For me, my workflow is:
+# Default keys Keys with this script
+# O <Mod4>o
+# o o
+# go o<Tab>
+# gO gC, then o<Tab>
+# (This is unnecessarily long. I use this rarely, feel free to make this script accept parameters.)
+#
+
+[ -z "$QUTE_URL" ] && QUTE_URL='http://google.com'
+
+url=$(echo "$QUTE_URL" | cat - "$QUTE_CONFIG_DIR/quickmarks" "$QUTE_DATA_DIR/history" | dmenu -l 15 -p qutebrowser)
+url=$(echo "$url" | sed -E 's/[^ ]+ +//g' | grep -E "https?:" || echo "$url")
+
+[ -z "${url// }" ] && exit
+
+echo "open $url" >> "$QUTE_FIFO" || qutebrowser "$url"
diff --git a/.config/qutebrowser/misc/userscripts/format_json b/.config/qutebrowser/misc/userscripts/format_json
new file mode 100755
index 0000000..0d476b3
--- /dev/null
+++ b/.config/qutebrowser/misc/userscripts/format_json
@@ -0,0 +1,42 @@
+#!/bin/sh
+set -euo pipefail
+#
+# Behavior:
+# Userscript for qutebrowser which will take the raw JSON text of the current
+# page, format it using `jq`, will add syntax highlighting using `pygments`,
+# and open the syntax highlighted pretty printed html in a new tab. If the file
+# is larger than 10MB then this script will only indent the json and will forego
+# syntax highlighting using pygments.
+#
+# In order to use this script, just start it using `spawn --userscript` from
+# qutebrowser. I recommend using an alias, e.g. put this in the
+# [alias]-section of qutebrowser.conf:
+#
+# json = spawn --userscript /path/to/json_format
+#
+# Note that the color style defaults to monokai, but a different pygments style
+# can be passed as the first parameter to the script. A full list of the pygments
+# styles can be found at: https://help.farbox.com/pygments.html
+#
+# Bryan Gilbert, 2017
+
+# do not run pygmentize on files larger than this amount of bytes
+MAX_SIZE_PRETTIFY=10485760 # 10 MB
+# default style to monokai if none is provided
+STYLE=${1:-monokai}
+
+TEMP_FILE="$(mktemp)"
+jq . "$QUTE_TEXT" >"$TEMP_FILE"
+
+# try GNU stat first and then OSX stat if the former fails
+FILE_SIZE=$(
+ stat --printf="%s" "$TEMP_FILE" 2>/dev/null ||
+ stat -f%z "$TEMP_FILE" 2>/dev/null
+)
+if [ "$FILE_SIZE" -lt "$MAX_SIZE_PRETTIFY" ]; then
+ pygmentize -l json -f html -O full,style="$STYLE" <"$TEMP_FILE" >"${TEMP_FILE}_"
+ mv -f "${TEMP_FILE}_" "$TEMP_FILE"
+fi
+
+# send the command to qutebrowser to open the new file containing the formatted json
+echo "open -t file://$TEMP_FILE" >> "$QUTE_FIFO"
diff --git a/.config/qutebrowser/misc/userscripts/getbib b/.config/qutebrowser/misc/userscripts/getbib
new file mode 100755
index 0000000..22af7a8
--- /dev/null
+++ b/.config/qutebrowser/misc/userscripts/getbib
@@ -0,0 +1,69 @@
+#!/usr/bin/env python3
+"""Qutebrowser userscript scraping the current web page for DOIs and downloading
+corresponding bibtex information.
+
+Set the environment variable 'QUTE_BIB_FILEPATH' to indicate the path to
+download to. Otherwise, bibtex information is downloaded to '/tmp' and hence
+deleted at reboot.
+
+Installation: see qute://help/userscripts.html
+
+Inspired by
+https://ocefpaf.github.io/python4oceanographers/blog/2014/05/19/doi2bibtex/
+"""
+
+import os
+import sys
+import shutil
+import re
+from collections import Counter
+from urllib import parse as url_parse
+from urllib import request as url_request
+
+
+FIFO_PATH = os.getenv("QUTE_FIFO")
+
+def message_fifo(message, level="warning"):
+ """Send message to qutebrowser FIFO. The level must be one of 'info',
+ 'warning' (default) or 'error'."""
+ with open(FIFO_PATH, "w") as fifo:
+ fifo.write("message-{} '{}'".format(level, message))
+
+
+source = os.getenv("QUTE_TEXT")
+with open(source) as f:
+ text = f.read()
+
+# find DOIs on page using regex
+dval = re.compile(r'(10\.(\d)+/([^(\s\>\"\<)])+)')
+# https://stackoverflow.com/a/10324802/3865876, too strict
+# dval = re.compile(r'\b(10[.][0-9]{4,}(?:[.][0-9]+)*/(?:(?!["&\'<>])\S)+)\b')
+dois = dval.findall(text)
+dois = Counter(e[0] for e in dois)
+try:
+ doi = dois.most_common(1)[0][0]
+except IndexError:
+ message_fifo("No DOIs found on page")
+ sys.exit()
+message_fifo("Found {} DOIs on page, selecting {}".format(len(dois), doi),
+ level="info")
+
+# get bibtex data corresponding to DOI
+url = "http://dx.doi.org/" + url_parse.quote(doi)
+headers = dict(Accept='text/bibliography; style=bibtex')
+request = url_request.Request(url, headers=headers)
+response = url_request.urlopen(request)
+status_code = response.getcode()
+if status_code >= 400:
+ message_fifo("Request returned {}".format(status_code))
+ sys.exit()
+
+# obtain content and format it
+bibtex = response.read().decode("utf-8").strip()
+bibtex = bibtex.replace(" ", "\n ", 1).\
+ replace("}, ", "},\n ").replace("}}", "}\n}")
+
+# append to file
+bib_filepath = os.getenv("QUTE_BIB_FILEPATH", "/tmp/qute.bib")
+with open(bib_filepath, "a") as f:
+ f.write(bibtex + "\n\n")
diff --git a/.config/qutebrowser/misc/userscripts/open_download b/.config/qutebrowser/misc/userscripts/open_download
new file mode 100755
index 0000000..8dbb113
--- /dev/null
+++ b/.config/qutebrowser/misc/userscripts/open_download
@@ -0,0 +1,115 @@
+#!/usr/bin/env bash
+# Both standalone script and qutebrowser userscript that opens a rofi menu with
+# all files from the download director and opens the selected file. It works
+# both as a userscript and a standalone script that is called from outside of
+# qutebrowser.
+#
+# Suggested keybinding (for "show downloads"):
+# spawn --userscript ~/.config/qutebrowser/open_download
+# sd
+#
+# Requirements:
+# - rofi (in a recent version)
+# - xdg-open and xdg-mime
+# - You should configure qutebrowser to download files to a single directory
+# - It comes in handy if you enable downloads.remove_finished. If you want to
+# see the recent downloads, just press "sd".
+#
+# Thorsten Wißmann, 2015 (thorsten` on freenode)
+# Any feedback is welcome!
+
+set -e
+
+# open a file from the download directory using rofi
+DOWNLOAD_DIR=${DOWNLOAD_DIR:-$QUTE_DOWNLOAD_DIR}
+DOWNLOAD_DIR=${DOWNLOAD_DIR:-$HOME/Downloads}
+# the name of the rofi command
+ROFI_CMD=${ROFI_CMD:-rofi}
+ROFI_ARGS=${ROFI_ARGS:-}
+
+msg() {
+ local cmd="$1"
+ shift
+ local msg="$*"
+ if [ -z "$QUTE_FIFO" ] ; then
+ echo "$cmd: $msg" >&2
+ else
+ echo "message-$cmd '${msg//\'/\\\'}'" >> "$QUTE_FIFO"
+ fi
+}
+die() {
+ msg error "$*"
+ if [ -n "$QUTE_FIFO" ] ; then
+ # when run as a userscript, the above error message already informs the
+ # user about the failure, and no additional "userscript exited with status
+ # 1" is needed.
+ exit 0;
+ else
+ exit 1;
+ fi
+}
+
+if ! [ -d "$DOWNLOAD_DIR" ] ; then
+ die "Download directory »$DOWNLOAD_DIR« not found!"
+fi
+if ! command -v "${ROFI_CMD}" > /dev/null ; then
+ die "Rofi command »${ROFI_CMD}« not found in PATH!"
+fi
+
+rofi_default_args=(
+ -monitor -2 # place above window
+ -location 6 # aligned at the bottom
+ -width 100 # use full window width
+ -i
+ -no-custom
+ -format i # make rofi return the index
+ -l 10
+ -p 'Open download:' -dmenu
+ )
+
+crop-first-column() {
+ local maxlength=${1:-40}
+ local expression='s|^\([^\t]\{0,'"$maxlength"'\}\)[^\t]*\t|\1\t|'
+ sed "$expression"
+}
+
+ls-files() {
+ # add the slash at the end of the download dir enforces to follow the
+ # symlink, if the DOWNLOAD_DIR itself is a symlink
+ # shellcheck disable=SC2010
+ ls -Q --quoting-style escape -h -o -1 -A -t "${DOWNLOAD_DIR}/" \
+ | grep '^[-]' \
+ | cut -d' ' -f3- \
+ | sed 's,^\(.*[^\]\) \(.*\)$,\2\t\1,' \
+ | sed 's,\\\(.\),\1,g'
+}
+
+mapfile -t entries < <(ls-files)
+
+# we need to manually check that there are items, because rofi doesn't show up
+# if there are no items and -no-custom is passed to rofi.
+if [ "${#entries[@]}" -eq 0 ] ; then
+ die "Download directory »${DOWNLOAD_DIR}« empty"
+fi
+
+line=$(printf '%s\n' "${entries[@]}" \
+ | crop-first-column 55 \
+ | column -s $'\t' -t \
+ | $ROFI_CMD "${rofi_default_args[@]}" "$ROFI_ARGS") || true
+if [ -z "$line" ]; then
+ exit 0
+fi
+
+file="${entries[$line]}"
+file="${file%%$'\t'*}"
+path="$DOWNLOAD_DIR/$file"
+filetype=$(xdg-mime query filetype "$path")
+application=$(xdg-mime query default "$filetype")
+
+if [ -z "$application" ] ; then
+ die "Do not know how to open »$file« of type $filetype"
+fi
+
+msg info "Opening »$file« (of type $filetype) with ${application%.desktop}"
+
+xdg-open "$path" &
diff --git a/.config/qutebrowser/misc/userscripts/openfeeds b/.config/qutebrowser/misc/userscripts/openfeeds
new file mode 100755
index 0000000..4a1a942
--- /dev/null
+++ b/.config/qutebrowser/misc/userscripts/openfeeds
@@ -0,0 +1,40 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+# Copyright 2015 jnphilipp <me@jnphilipp.org>
+# Copyright 2016-2017 Florian Bruhin (The Compiler) <mail@qutebrowser.org>
+#
+# This file is part of qutebrowser.
+#
+# qutebrowser is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# qutebrowser is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with qutebrowser. If not, see <http://www.gnu.org/licenses/>.
+
+# Opens all links to feeds defined in the head of a site
+#
+# Ideal for use with tabs_are_windows. Set a hotkey to launch this script, then:
+# :bind gF spawn --userscript openfeeds
+#
+# Use the hotkey to open the feeds in new tab/window, press 'gF' to open
+#
+
+import os
+import re
+
+from bs4 import BeautifulSoup
+from urllib.parse import urljoin
+
+with open(os.environ['QUTE_HTML'], 'r') as f:
+ soup = BeautifulSoup(f)
+with open(os.environ['QUTE_FIFO'], 'w') as f:
+ for link in soup.find_all('link', rel='alternate', type=re.compile(r'application/((rss|rdf|atom)\+)?xml|text/xml')):
+ f.write('open -t %s\n' % urljoin(os.environ['QUTE_URL'], link.get('href')))
diff --git a/.config/qutebrowser/misc/userscripts/password_fill b/.config/qutebrowser/misc/userscripts/password_fill
new file mode 100755
index 0000000..a61a42c
--- /dev/null
+++ b/.config/qutebrowser/misc/userscripts/password_fill
@@ -0,0 +1,381 @@
+#!/usr/bin/env bash
+help() {
+ blink=$'\e[1;31m' reset=$'\e[0m'
+cat <<EOF
+This script can only be used as a userscript for qutebrowser
+2015, Thorsten Wißmann <edu _at_ thorsten-wissmann _dot_ de>
+In case of questions or suggestions, do not hesitate to send me an E-Mail or to
+directly ask me via IRC (nickname thorsten\`) in #qutebrowser on freenode.
+
+ $blink!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$reset
+ WARNING: the passwords are stored in qutebrowser's
+ debug log reachable via the url qute://log
+ $blink!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$reset
+
+Usage: run as a userscript form qutebrowser, e.g.:
+ spawn --userscript ~/.config/qutebrowser/password_fill
+
+Pass backend: (see also passwordstore.org)
+ This script expects pass to store the credentials of each page in an extra
+ file, where the filename (or filepath) contains the domain of the respective
+ page. The first line of the file must contain the password, the login name
+ must be contained in a later line beginning with "user:", "login:", or
+ "username:" (configurable by the user_pattern variable).
+
+Behavior:
+ It will try to find a username/password entry in the configured backend
+ (currently only pass) for the current website and will load that pair of
+ username and password to any form on the current page that has some password
+ entry field. If multiple entries are found, a zenity menu is offered.
+
+ If no entry is found, then it crops subdomains from the url if at least one
+ entry is found in the backend. (In that case, it always shows a menu)
+
+Configuration:
+ This script loads the bash script ~/.config/qutebrowser/password_fill_rc (if
+ it exists), so you can change any configuration variable and overwrite any
+ function you like.
+
+EOF
+}
+
+set -o errexit
+set -o pipefail
+shopt -s nocasematch # make regexp matching in bash case insensitive
+
+if [ -z "$QUTE_FIFO" ] ; then
+ help
+ exit
+fi
+
+error() {
+ local msg="$*"
+ echo "message-error '${msg//\'/\\\'}'" >> "$QUTE_FIFO"
+}
+msg() {
+ local msg="$*"
+ echo "message-info '${msg//\'/\\\'}'" >> "$QUTE_FIFO"
+}
+die() {
+ error "$*"
+ exit 0
+}
+
+javascript_escape() {
+ # print the first argument in an escaped way, such that it can safely
+ # be used within javascripts double quotes
+ sed "s,[\\\\'\"],\\\\&,g" <<< "$1"
+}
+
+# ======================================================= #
+# CONFIGURATION
+# ======================================================= #
+# The configuration file is per default located in
+# ~/.config/qutebrowser/password_fill_rc and is a bash script that is loaded
+# later in the present script. So basically you can replace all of the
+# following definitions and make them fit your needs.
+
+# The following simplifies a URL to the domain (e.g. "wiki.qutebrowser.org")
+# which is later used to search the correct entries in the password backend. If
+# you e.g. don't want the "www." to be removed or if you want to distinguish
+# between different paths on the same domain.
+
+simplify_url() {
+ simple_url="${1##*://}" # remove protocol specification
+ simple_url="${simple_url%%\?*}" # remove GET parameters
+ simple_url="${simple_url%%/*}" # remove directory path
+ simple_url="${simple_url%:*}" # remove port
+ simple_url="${simple_url##www.}" # remove www. subdomain
+}
+
+# no_entries_found() is called if the first query_entries() call did not find
+# any matching entries. Multiple implementations are possible:
+# The easiest behavior is to quit:
+#no_entries_found() {
+# if [ 0 -eq "${#files[@]}" ] ; then
+# die "No entry found for »$simple_url«"
+# fi
+#}
+# But you could also fill the files array with all entries from your pass db
+# if the first db query did not find anything
+# no_entries_found() {
+# if [ 0 -eq "${#files[@]}" ] ; then
+# query_entries ""
+# if [ 0 -eq "${#files[@]}" ] ; then
+# die "No entry found for »$simple_url«"
+# fi
+# fi
+# }
+
+# Another behavior is to drop another level of subdomains until search hits
+# are found:
+no_entries_found() {
+ while [ 0 -eq "${#files[@]}" ] && [ -n "$simple_url" ]; do
+ shorter_simple_url=$(sed 's,^[^.]*\.,,' <<< "$simple_url")
+ if [ "$shorter_simple_url" = "$simple_url" ] ; then
+ # if no dot, then even remove the top level domain
+ simple_url=""
+ query_entries "$simple_url"
+ break
+ fi
+ simple_url="$shorter_simple_url"
+ query_entries "$simple_url"
+ #die "No entry found for »$simple_url«"
+ # enforce menu if we do "fuzzy" matching
+ menu_if_one_entry=1
+ done
+ if [ 0 -eq "${#files[@]}" ] ; then
+ die "No entry found for »$simple_url«"
+ fi
+}
+
+# Backend implementations tell, how the actual password store is accessed.
+# Right now, there is only one fully functional password backend, namely for
+# the program "pass".
+# A password backend consists of three actions:
+# - init() initializes backend-specific things and does sanity checks.
+# - query_entries() is called with a simplified url and is expected to fill
+# the bash array $files with the names of matching password entries. There
+# are no requirements how these names should look like.
+# - open_entry() is called with some specific entry of the $files array and is
+# expected to write the username of that entry to the $username variable and
+# the corresponding password to $password
+
+reset_backend() {
+ init() { true ; }
+ query_entries() { true ; }
+ open_entry() { true ; }
+}
+
+# choose_entry() is expected to choose one entry from the array $files and
+# write it to the variable $file.
+choose_entry() {
+ choose_entry_zenity
+}
+
+# The default implementation chooses a random entry from the array. So if there
+# are multiple matching entries, multiple calls to this userscript will
+# eventually pick the "correct" entry. I.e. if this userscript is bound to
+# "zl", the user has to press "zl" until the correct username shows up in the
+# login form.
+choose_entry_random() {
+ local nr=${#files[@]}
+ file="${files[$((RANDOM % nr))]}"
+ # Warn user, that there might be other matching password entries
+ if [ "$nr" -gt 1 ] ; then
+ msg "Picked $file out of $nr entries: ${files[*]}"
+ fi
+}
+
+# another implementation would be to ask the user via some menu (like rofi or
+# dmenu or zenity or even qutebrowser completion in future?) which entry to
+# pick
+MENU_COMMAND=( head -n 1 )
+# whether to show the menu if there is only one entry in it
+menu_if_one_entry=0
+choose_entry_menu() {
+ local nr=${#files[@]}
+ if [ "$nr" -eq 1 ] && ! ((menu_if_one_entry)) ; then
+ file="${files[0]}"
+ else
+ file=$( printf '%s\n' "${files[@]}" | "${MENU_COMMAND[@]}" )
+ fi
+}
+
+choose_entry_rofi() {
+ MENU_COMMAND=( rofi -p "qutebrowser> " -dmenu
+ -mesg $'Pick a password entry for <b>'"${QUTE_URL//&/&amp;}"'</b>' )
+ choose_entry_menu || true
+}
+
+choose_entry_zenity() {
+ MENU_COMMAND=( zenity --list --title "qutebrowser password fill"
+ --text "Pick the password entry:"
+ --column "Name" )
+ choose_entry_menu || true
+}
+
+choose_entry_zenity_radio() {
+ zenity_helper() {
+ awk '{ print $0 ; print $0 }' \
+ | zenity --list --radiolist \
+ --title "qutebrowser password fill" \
+ --text "Pick the password entry:" \
+ --column " " --column "Name"
+ }
+ MENU_COMMAND=( zenity_helper )
+ choose_entry_menu || true
+}
+
+# =======================================================
+# backend: PASS
+
+# configuration options:
+match_filename=1 # whether allowing entry match by filepath
+match_line=0 # whether allowing entry match by URL-Pattern in file
+ # Note: match_line=1 gets very slow, even for small password stores!
+match_line_pattern='^url: .*' # applied using grep -iE
+user_pattern='^(user|username|login): '
+
+GPG_OPTS=( "--quiet" "--yes" "--compress-algo=none" "--no-encrypt-to" )
+GPG="gpg"
+export GPG_TTY="${GPG_TTY:-$(tty 2>/dev/null)}"
+command -v gpg2 &>/dev/null && GPG="gpg2"
+[[ -n $GPG_AGENT_INFO || $GPG == "gpg2" ]] && GPG_OPTS+=( "--batch" "--use-agent" )
+
+pass_backend() {
+ init() {
+ PREFIX="${PASSWORD_STORE_DIR:-$HOME/.password-store}"
+ if ! [ -d "$PREFIX" ] ; then
+ die "Can not open password store dir »$PREFIX«"
+ fi
+ }
+ query_entries() {
+ local url="$1"
+
+ if ((match_line)) ; then
+ # add entries with matching URL-tag
+ while read -r -d "" passfile ; do
+ if $GPG "${GPG_OPTS[@]}" -d "$passfile" \
+ | grep --max-count=1 -iE "${match_line_pattern}${url}" > /dev/null
+ then
+ passfile="${passfile#$PREFIX}"
+ passfile="${passfile#/}"
+ files+=( "${passfile%.gpg}" )
+ fi
+ done < <(find -L "$PREFIX" -iname '*.gpg' -print0)
+ fi
+ if ((match_filename)) ; then
+ # add entries with matching filepath
+ while read -r passfile ; do
+ passfile="${passfile#$PREFIX}"
+ passfile="${passfile#/}"
+ files+=( "${passfile%.gpg}" )
+ done < <(find -L "$PREFIX" -iname '*.gpg' | grep "$url")
+ fi
+ }
+ open_entry() {
+ local path="$PREFIX/${1}.gpg"
+ password=""
+ local firstline=1
+ while read -r line ; do
+ if ((firstline)) ; then
+ password="$line"
+ firstline=0
+ else
+ if [[ $line =~ $user_pattern ]] ; then
+ # remove the matching prefix "user: " from the beginning of the line
+ username=${line#${BASH_REMATCH[0]}}
+ break
+ fi
+ fi
+ done < <($GPG "${GPG_OPTS[@]}" -d "$path" )
+ }
+}
+# =======================================================
+
+# =======================================================
+# backend: secret
+secret_backend() {
+ init() {
+ return
+ }
+ query_entries() {
+ local domain="$1"
+ while read -r line ; do
+ if [[ "$line" == "attribute.username = "* ]] ; then
+ files+=("$domain ${line:21}")
+ fi
+ done < <( secret-tool search --unlock --all domain "$domain" 2>&1 )
+ }
+ open_entry() {
+ local domain="${1%% *}"
+ username="${1#* }"
+ password=$(secret-tool lookup domain "$domain" username "$username")
+ }
+}
+# =======================================================
+
+# load some sane default backend
+reset_backend
+pass_backend
+# load configuration
+QUTE_CONFIG_DIR=${QUTE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/qutebrowser/}
+PWFILL_CONFIG=${PWFILL_CONFIG:-${QUTE_CONFIG_DIR}/password_fill_rc}
+if [ -f "$PWFILL_CONFIG" ] ; then
+ # shellcheck source=/dev/null
+ source "$PWFILL_CONFIG"
+fi
+init
+
+simplify_url "$QUTE_URL"
+query_entries "${simple_url}"
+no_entries_found
+# remove duplicates
+mapfile -t files < <(printf '%s\n' "${files[@]}" | sort | uniq )
+choose_entry
+if [ -z "$file" ] ; then
+ # choose_entry didn't want any of these entries
+ exit 0
+fi
+open_entry "$file"
+#username="$(date)"
+#password="XYZ"
+#msg "$username, ${#password}"
+
+[ -n "$username" ] || die "Username not set in entry $file"
+[ -n "$password" ] || die "Password not set in entry $file"
+
+js() {
+cat <<EOF
+ function isVisible(elem) {
+ var style = elem.ownerDocument.defaultView.getComputedStyle(elem, null);
+
+ if (style.getPropertyValue("visibility") !== "visible" ||
+ style.getPropertyValue("display") === "none" ||
+ style.getPropertyValue("opacity") === "0") {
+ return false;
+ }
+
+ return elem.offsetWidth > 0 && elem.offsetHeight > 0;
+ };
+ function hasPasswordField(form) {
+ var inputs = form.getElementsByTagName("input");
+ for (var j = 0; j < inputs.length; j++) {
+ var input = inputs[j];
+ if (input.type == "password") {
+ return true;
+ }
+ }
+ return false;
+ };
+ function loadData2Form (form) {
+ var inputs = form.getElementsByTagName("input");
+ for (var j = 0; j < inputs.length; j++) {
+ var input = inputs[j];
+ if (isVisible(input) && (input.type == "text" || input.type == "email")) {
+ input.focus();
+ input.value = "$(javascript_escape "${username}")";
+ input.blur();
+ }
+ if (input.type == "password") {
+ input.focus();
+ input.value = "$(javascript_escape "${password}")";
+ input.blur();
+ }
+ }
+ };
+
+ var forms = document.getElementsByTagName("form");
+ for (i = 0; i < forms.length; i++) {
+ if (hasPasswordField(forms[i])) {
+ loadData2Form(forms[i]);
+ }
+ }
+EOF
+}
+
+printjs() {
+ js | sed 's,//.*$,,' | tr '\n' ' '
+}
+echo "jseval -q $(printjs)" >> "$QUTE_FIFO"
diff --git a/.config/qutebrowser/misc/userscripts/qute-keepass b/.config/qutebrowser/misc/userscripts/qute-keepass
new file mode 100755
index 0000000..a21ebc9
--- /dev/null
+++ b/.config/qutebrowser/misc/userscripts/qute-keepass
@@ -0,0 +1,261 @@
+#!/usr/bin/env python3
+
+# Copyright 2018 Jay Kamat <jaygkamat@gmail.com>
+#
+# This file is part of qutebrowser.
+#
+# qutebrowser is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# qutebrowser is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with qutebrowser. If not, see <http://www.gnu.org/licenses/>.
+
+"""This userscript allows for insertion of usernames and passwords from keepass
+databases using pykeepass. Since it is a userscript, it must be run from
+qutebrowser.
+
+A sample invocation of this script is:
+
+:spawn --userscript qute-keepass -p ~/KeePassFiles/MainDatabase.kdbx
+
+And a sample binding
+
+:bind --mode=insert <ctrl-i> spawn --userscript qute-keepass -p ~/KeePassFiles/MainDatabase.kdbx
+
+-p or --path is a required argument.
+
+--keyfile-path allows you to specify a keepass keyfile. If you only use a
+keyfile, also add --no-password as well. Specifying --no-password without
+--keyfile-path will lead to an error.
+
+login information is inserted using :insert-text and :fake-key <Tab>, which
+means you must have a cursor in position before initiating this userscript. If
+you do not do this, you will get 'element not editable' errors.
+
+If keepass takes a while to open the DB, you might want to consider reducing
+the number of transform rounds in your database settings.
+
+Dependencies: pykeepass (in python3), PyQt5. Without pykeepass, you will get an
+exit code of 100.
+
+********************!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!******************
+
+WARNING: The login details are viewable as plaintext in qutebrowser's debug log
+(qute://log) and could be compromised if you decide to submit a crash report!
+
+********************!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!******************
+
+"""
+
+# pylint: disable=bad-builtin
+
+import argparse
+import enum
+import functools
+import os
+import shlex
+import subprocess
+import sys
+
+from PyQt5.QtCore import QUrl
+from PyQt5.QtWidgets import QApplication, QInputDialog, QLineEdit
+
+try:
+ import pykeepass
+except ImportError as e:
+ print("pykeepass not found: {}".format(str(e)), file=sys.stderr)
+
+ # Since this is a common error, try to print it to the FIFO if we can.
+ if 'QUTE_FIFO' in os.environ:
+ with open(os.environ['QUTE_FIFO'], 'w') as fifo:
+ fifo.write('message-error "pykeepass failed to be imported."\n')
+ fifo.flush()
+ sys.exit(100)
+
+argument_parser = argparse.ArgumentParser(
+ description="Fill passwords using keepass.",
+ formatter_class=argparse.RawDescriptionHelpFormatter,
+ epilog=__doc__)
+argument_parser.add_argument('url', nargs='?', default=os.getenv('QUTE_URL'))
+argument_parser.add_argument('--path', '-p', required=True,
+ help='Path to the keepass db.')
+argument_parser.add_argument('--keyfile-path', '-k', default=None,
+ help='Path to a keepass keyfile')
+argument_parser.add_argument(
+ '--no-password', action='store_true',
+ help='Supply if no password is required to unlock this database. '
+ 'Only allowed with --keyfile-path')
+argument_parser.add_argument(
+ '--dmenu-invocation', '-d', default='dmenu',
+ help='Invocation used to execute a dmenu-provider')
+argument_parser.add_argument(
+ '--dmenu-format', '-f', default='{title}: {username}',
+ help='Format string for keys to display in dmenu.'
+ ' Must generate a unique string.')
+argument_parser.add_argument(
+ '--no-insert-mode', '-n', dest='insert_mode', action='store_false',
+ help="Don't automatically enter insert mode")
+argument_parser.add_argument(
+ '--io-encoding', '-i', default='UTF-8',
+ help='Encoding used to communicate with subprocesses')
+group = argument_parser.add_mutually_exclusive_group()
+group.add_argument('--username-fill-only', '-e',
+ action='store_true', help='Only insert username')
+group.add_argument('--password-fill-only', '-w',
+ action='store_true', help='Only insert password')
+
+CMD_DELAY = 50
+
+
+class ExitCodes(enum.IntEnum):
+ """Stores various exit codes groups to use."""
+ SUCCESS = 0
+ FAILURE = 1
+ # 1 is automatically used if Python throws an exception
+ NO_CANDIDATES = 2
+ USER_QUIT = 3
+ DB_OPEN_FAIL = 4
+
+ INTERNAL_ERROR = 10
+
+
+def qute_command(command):
+ with open(os.environ['QUTE_FIFO'], 'w') as fifo:
+ fifo.write(command + '\n')
+ fifo.flush()
+
+
+def stderr(to_print):
+ """Extra functionality to echo out errors to qb ui."""
+ print(to_print, file=sys.stderr)
+ qute_command('message-error "{}"'.format(to_print))
+
+
+def dmenu(items, invocation, encoding):
+ """Runs dmenu with given arguments."""
+ command = shlex.split(invocation)
+ process = subprocess.run(command, input='\n'.join(items).encode(encoding),
+ stdout=subprocess.PIPE)
+ return process.stdout.decode(encoding).strip()
+
+
+def get_password():
+ """Get a keepass db password from user."""
+ _app = QApplication(sys.argv)
+ text, ok = QInputDialog.getText(
+ None, "KeePass DB Password",
+ "Please enter your KeePass Master Password",
+ QLineEdit.Password)
+ if not ok:
+ stderr('Password Prompt Rejected.')
+ sys.exit(ExitCodes.USER_QUIT)
+ return text
+
+
+def find_candidates(args, host):
+ """Finds candidates that match host"""
+ file_path = os.path.expanduser(args.path)
+
+ # TODO find a way to keep the db open, so we don't open (and query
+ # password) it every time
+
+ pw = None
+ if not args.no_password:
+ pw = get_password()
+
+ kf = args.keyfile_path
+ if kf:
+ kf = os.path.expanduser(kf)
+
+ try:
+ kp = pykeepass.PyKeePass(file_path, password=pw, keyfile=kf)
+ except Exception as e:
+ stderr("There was an error opening the DB: {}".format(str(e)))
+
+ return kp.find_entries(url="{}{}{}".format(".*", host, ".*"), regex=True)
+
+
+def candidate_to_str(args, candidate):
+ """Turns candidate into a human readable string for dmenu"""
+ return args.dmenu_format.format(title=candidate.title,
+ url=candidate.url,
+ username=candidate.username,
+ path=candidate.path,
+ uuid=candidate.uuid)
+
+
+def candidate_to_secret(candidate):
+ """Turns candidate into a generic (user, password) tuple"""
+ return (candidate.username, candidate.password)
+
+
+def run(args):
+ """Runs qute-keepass"""
+ if not args.url:
+ argument_parser.print_help()
+ return ExitCodes.FAILURE
+
+ url_host = QUrl(args.url).host()
+
+ if not url_host:
+ stderr('{} was not parsed as a valid URL!'.format(args.url))
+ return ExitCodes.INTERNAL_ERROR
+
+ # Find candidates matching the host of the given URL
+ candidates = find_candidates(args, url_host)
+ if not candidates:
+ stderr('No candidates for URL {!r} found!'.format(args.url))
+ return ExitCodes.NO_CANDIDATES
+
+ # Create a map so we can get turn the resulting string from dmenu back into
+ # a candidate
+ candidates_strs = list(map(functools.partial(candidate_to_str, args),
+ candidates))
+ candidates_map = dict(zip(candidates_strs, candidates))
+
+ if len(candidates) == 1:
+ selection = candidates.pop()
+ else:
+ selection = dmenu(candidates_strs,
+ args.dmenu_invocation,
+ args.io_encoding)
+
+ if selection not in candidates_map:
+ stderr("'{}' was not a valid entry!").format(selection)
+ return ExitCodes.USER_QUIT
+
+ selection = candidates_map[selection]
+
+ username, password = candidate_to_secret(selection)
+
+ insert_mode = ';; enter-mode insert' if args.insert_mode else ''
+ if args.username_fill_only:
+ qute_command('insert-text {}{}'.format(username, insert_mode))
+ elif args.password_fill_only:
+ qute_command('insert-text {}{}'.format(password, insert_mode))
+ else:
+ # Enter username and password using insert-key and fake-key <Tab>
+ # (which supports more passwords than fake-key only), then switch back
+ # into insert-mode, so the form can be directly submitted by hitting
+ # enter afterwards. It dosen't matter when we go into insert mode, but
+ # the other commands need to be be executed sequentially, so we add
+ # delays with later.
+ qute_command('insert-text {} ;;'
+ 'later {} fake-key <Tab> ;;'
+ 'later {} insert-text {}{}'
+ .format(username, CMD_DELAY,
+ CMD_DELAY * 2, password, insert_mode))
+
+ return ExitCodes.SUCCESS
+
+
+if __name__ == '__main__':
+ arguments = argument_parser.parse_args()
+ sys.exit(run(arguments))
diff --git a/.config/qutebrowser/misc/userscripts/qute-lastpass b/.config/qutebrowser/misc/userscripts/qute-lastpass
new file mode 100755
index 0000000..ea88cf8
--- /dev/null
+++ b/.config/qutebrowser/misc/userscripts/qute-lastpass
@@ -0,0 +1,172 @@
+#!/usr/bin/env python3
+
+# Copyright 2017 Chris Braun (cryzed) <cryzed@googlemail.com>
+# Adapted for LastPass by Wayne Cheng (welps) <waynethecheng@gmail.com>
+#
+# This file is part of qutebrowser.
+#
+# qutebrowser is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published bjy
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# qutebrowser is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with qutebrowser. If not, see <http://www.gnu.org/licenses/>.
+
+"""
+Insert login information using lastpass CLI and a dmenu-compatible application (e.g. dmenu, rofi -dmenu, ...).
+A short demonstration can be seen here: https://i.imgur.com/zA61NrF.gifv.
+"""
+
+USAGE = """The domain of the site has to be in the name of the LastPass entry, for example: "github.com/cryzed" or
+"websites/github.com". The login information is inserted by emulating key events using qutebrowser's fake-key command in this manner:
+[USERNAME]<Tab>[PASSWORD], which is compatible with almost all login forms.
+
+You must log into LastPass CLI using `lpass login <email>` prior to use of this script. The LastPass CLI agent only holds your master password for an hour by default. If you wish to change this, please see `man lpass`.
+
+To use in qutebrowser, run: `spawn --userscript qute-lastpass`
+"""
+
+EPILOG = """Dependencies: tldextract (Python 3 module), LastPass CLI (1.3 or newer)
+
+WARNING: The login details are viewable as plaintext in qutebrowser's debug log (qute://log) and might be shared if
+you decide to submit a crash report!"""
+
+import argparse
+import enum
+import fnmatch
+import functools
+import os
+import re
+import shlex
+import subprocess
+import sys
+import json
+import tldextract
+
+argument_parser = argparse.ArgumentParser(
+ description=__doc__, usage=USAGE, epilog=EPILOG)
+argument_parser.add_argument('url', nargs='?', default=os.getenv('QUTE_URL'))
+argument_parser.add_argument('--dmenu-invocation', '-d', default='rofi -dmenu',
+ help='Invocation used to execute a dmenu-provider')
+argument_parser.add_argument('--no-insert-mode', '-n', dest='insert_mode', action='store_false',
+ help="Don't automatically enter insert mode")
+argument_parser.add_argument('--io-encoding', '-i', default='UTF-8',
+ help='Encoding used to communicate with subprocesses')
+argument_parser.add_argument('--merge-candidates', '-m', action='store_true',
+ help='Merge pass candidates for fully-qualified and registered domain name')
+group = argument_parser.add_mutually_exclusive_group()
+group.add_argument('--username-only', '-e',
+ action='store_true', help='Only insert username')
+group.add_argument('--password-only', '-w',
+ action='store_true', help='Only insert password')
+
+stderr = functools.partial(print, file=sys.stderr)
+
+class ExitCodes(enum.IntEnum):
+ SUCCESS = 0
+ FAILURE = 1
+ # 1 is automatically used if Python throws an exception
+ NO_PASS_CANDIDATES = 2
+ COULD_NOT_MATCH_USERNAME = 3
+ COULD_NOT_MATCH_PASSWORD = 4
+
+def qute_command(command):
+ with open(os.environ['QUTE_FIFO'], 'w') as fifo:
+ fifo.write(command + '\n')
+ fifo.flush()
+
+def pass_(domain, encoding):
+ args = ['lpass', 'show', '-x', '-j', '-G', '.*{:s}.*'.format(domain)]
+ process = subprocess.run(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+
+ err = process.stderr.decode(encoding).strip()
+ if err:
+ msg = "LastPass CLI returned for {:s} - {:s}".format(domain, err)
+ stderr(msg)
+ return '[]'
+
+ out = process.stdout.decode(encoding).strip()
+
+ return out
+
+def dmenu(items, invocation, encoding):
+ command = shlex.split(invocation)
+ process = subprocess.run(command, input='\n'.join(
+ items).encode(encoding), stdout=subprocess.PIPE)
+ return process.stdout.decode(encoding).strip()
+
+
+def fake_key_raw(text):
+ for character in text:
+ # Escape all characters by default, space requires special handling
+ sequence = '" "' if character == ' ' else '\{}'.format(character)
+ qute_command('fake-key {}'.format(sequence))
+
+
+def main(arguments):
+ if not arguments.url:
+ argument_parser.print_help()
+ return ExitCodes.FAILURE
+
+ extract_result = tldextract.extract(arguments.url)
+
+ # Try to find candidates using targets in the following order: fully-qualified domain name (includes subdomains),
+ # the registered domain name and finally: the IPv4 address if that's what
+ # the URL represents
+ candidates = []
+ for target in filter(None, [extract_result.fqdn, extract_result.registered_domain, extract_result.subdomain + extract_result.domain, extract_result.domain, extract_result.ipv4]):
+ target_candidates = json.loads(pass_(target, arguments.io_encoding))
+ if not target_candidates:
+ continue
+
+ candidates = candidates + target_candidates
+ if not arguments.merge_candidates:
+ break
+ else:
+ if not candidates:
+ stderr('No pass candidates for URL {!r} found!'.format(
+ arguments.url))
+ return ExitCodes.NO_PASS_CANDIDATES
+
+ if len(candidates) == 1:
+ selection = candidates.pop()
+ else:
+ choices = ["{:s} | {:s} | {:s} | {:s}".format(c["id"], c["name"], c["url"], c["username"]) for c in candidates]
+ choice = dmenu(choices, arguments.dmenu_invocation, arguments.io_encoding)
+ choiceId = choice.split("|")[0].strip()
+ selection = next((c for (i, c) in enumerate(candidates) if c["id"] == choiceId), None)
+
+ # Nothing was selected, simply return
+ if not selection:
+ return ExitCodes.SUCCESS
+
+ username = selection["username"]
+ password = selection["password"]
+
+ if arguments.username_only:
+ fake_key_raw(username)
+ elif arguments.password_only:
+ fake_key_raw(password)
+ else:
+ # Enter username and password using fake-key and <Tab> (which seems to work almost universally), then switch
+ # back into insert-mode, so the form can be directly submitted by
+ # hitting enter afterwards
+ fake_key_raw(username)
+ qute_command('fake-key <Tab>')
+ fake_key_raw(password)
+
+ if arguments.insert_mode:
+ qute_command('enter-mode insert')
+
+ return ExitCodes.SUCCESS
+
+
+if __name__ == '__main__':
+ arguments = argument_parser.parse_args()
+ sys.exit(main(arguments))
diff --git a/.config/qutebrowser/misc/userscripts/qute-pass b/.config/qutebrowser/misc/userscripts/qute-pass
new file mode 100755
index 0000000..4f79e11
--- /dev/null
+++ b/.config/qutebrowser/misc/userscripts/qute-pass
@@ -0,0 +1,207 @@
+#!/usr/bin/env python3
+
+# Copyright 2017 Chris Braun (cryzed) <cryzed@googlemail.com>
+#
+# This file is part of qutebrowser.
+#
+# qutebrowser is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# qutebrowser is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with qutebrowser. If not, see <http://www.gnu.org/licenses/>.
+
+"""
+Insert login information using pass and a dmenu-compatible application (e.g. dmenu, rofi -dmenu, ...). A short
+demonstration can be seen here: https://i.imgur.com/KN3XuZP.gif.
+"""
+
+USAGE = """The domain of the site has to appear as a segment in the pass path, for example: "github.com/cryzed" or
+"websites/github.com". How the username and password are determined is freely configurable using the CLI arguments. The
+login information is inserted by emulating key events using qutebrowser's fake-key command in this manner:
+[USERNAME]<Tab>[PASSWORD], which is compatible with almost all login forms.
+
+Suggested bindings similar to Uzbl's `formfiller` script:
+
+ config.bind('<z><l>', 'spawn --userscript qute-pass')
+ config.bind('<z><u><l>', 'spawn --userscript qute-pass --username-only')
+ config.bind('<z><p><l>', 'spawn --userscript qute-pass --password-only')
+ config.bind('<z><o><l>', 'spawn --userscript qute-pass --otp-only')
+"""
+
+EPILOG = """Dependencies: tldextract (Python 3 module), pass, pass-otp (optional).
+For issues and feedback please use: https://github.com/cryzed/qutebrowser-userscripts.
+
+WARNING: The login details are viewable as plaintext in qutebrowser's debug log (qute://log) and might be shared if
+you decide to submit a crash report!"""
+
+import argparse
+import enum
+import fnmatch
+import functools
+import os
+import re
+import shlex
+import subprocess
+import sys
+
+import tldextract
+
+argument_parser = argparse.ArgumentParser(description=__doc__, usage=USAGE, epilog=EPILOG)
+argument_parser.add_argument('url', nargs='?', default=os.getenv('QUTE_URL'))
+argument_parser.add_argument('--password-store', '-p', default=os.path.expanduser('~/.password-store'),
+ help='Path to your pass password-store')
+argument_parser.add_argument('--username-pattern', '-u', default=r'.*/(.+)',
+ help='Regular expression that matches the username')
+argument_parser.add_argument('--username-target', '-U', choices=['path', 'secret'], default='path',
+ help='The target for the username regular expression')
+argument_parser.add_argument('--password-pattern', '-P', default=r'(.*)',
+ help='Regular expression that matches the password')
+argument_parser.add_argument('--dmenu-invocation', '-d', default='rofi -dmenu',
+ help='Invocation used to execute a dmenu-provider')
+argument_parser.add_argument('--no-insert-mode', '-n', dest='insert_mode', action='store_false',
+ help="Don't automatically enter insert mode")
+argument_parser.add_argument('--io-encoding', '-i', default='UTF-8',
+ help='Encoding used to communicate with subprocesses')
+argument_parser.add_argument('--merge-candidates', '-m', action='store_true',
+ help='Merge pass candidates for fully-qualified and registered domain name')
+group = argument_parser.add_mutually_exclusive_group()
+group.add_argument('--username-only', '-e', action='store_true', help='Only insert username')
+group.add_argument('--password-only', '-w', action='store_true', help='Only insert password')
+group.add_argument('--otp-only', '-o', action='store_true', help='Only insert OTP code')
+
+stderr = functools.partial(print, file=sys.stderr)
+
+
+class ExitCodes(enum.IntEnum):
+ SUCCESS = 0
+ FAILURE = 1
+ # 1 is automatically used if Python throws an exception
+ NO_PASS_CANDIDATES = 2
+ COULD_NOT_MATCH_USERNAME = 3
+ COULD_NOT_MATCH_PASSWORD = 4
+
+
+def qute_command(command):
+ with open(os.environ['QUTE_FIFO'], 'w') as fifo:
+ fifo.write(command + '\n')
+ fifo.flush()
+
+
+def find_pass_candidates(domain, password_store_path):
+ candidates = []
+ for path, directories, file_names in os.walk(password_store_path, followlinks=True):
+ if directories or domain not in path.split(os.path.sep):
+ continue
+
+ # Strip password store path prefix to get the relative pass path
+ pass_path = path[len(password_store_path) + 1:]
+ secrets = fnmatch.filter(file_names, '*.gpg')
+ candidates.extend(os.path.join(pass_path, os.path.splitext(secret)[0]) for secret in secrets)
+ return candidates
+
+
+def _run_pass(command, encoding):
+ process = subprocess.run(command, stdout=subprocess.PIPE)
+ return process.stdout.decode(encoding).strip()
+
+
+def pass_(path, encoding):
+ return _run_pass(['pass', path], encoding)
+
+
+def pass_otp(path, encoding):
+ return _run_pass(['pass', 'otp', path], encoding)
+
+
+def dmenu(items, invocation, encoding):
+ command = shlex.split(invocation)
+ process = subprocess.run(command, input='\n'.join(items).encode(encoding), stdout=subprocess.PIPE)
+ return process.stdout.decode(encoding).strip()
+
+
+def fake_key_raw(text):
+ for character in text:
+ # Escape all characters by default, space requires special handling
+ sequence = '" "' if character == ' ' else '\{}'.format(character)
+ qute_command('fake-key {}'.format(sequence))
+
+
+def main(arguments):
+ if not arguments.url:
+ argument_parser.print_help()
+ return ExitCodes.FAILURE
+
+ extract_result = tldextract.extract(arguments.url)
+
+ # Expand potential ~ in paths, since this script won't be called from a shell that does it for us
+ password_store_path = os.path.expanduser(arguments.password_store)
+
+ # Try to find candidates using targets in the following order: fully-qualified domain name (includes subdomains),
+ # the registered domain name and finally: the IPv4 address if that's what the URL represents
+ candidates = set()
+ for target in filter(None, [extract_result.fqdn, extract_result.registered_domain, extract_result.ipv4]):
+ target_candidates = find_pass_candidates(target, password_store_path)
+ if not target_candidates:
+ continue
+
+ candidates.update(target_candidates)
+ if not arguments.merge_candidates:
+ break
+ else:
+ if not candidates:
+ stderr('No pass candidates for URL {!r} found!'.format(arguments.url))
+ return ExitCodes.NO_PASS_CANDIDATES
+
+ selection = candidates.pop() if len(candidates) == 1 else dmenu(sorted(candidates), arguments.dmenu_invocation,
+ arguments.io_encoding)
+ # Nothing was selected, simply return
+ if not selection:
+ return ExitCodes.SUCCESS
+
+ secret = pass_(selection, arguments.io_encoding)
+
+ # Match username
+ target = selection if arguments.username_target == 'path' else secret
+ match = re.match(arguments.username_pattern, target)
+ if not match:
+ stderr('Failed to match username pattern on {}!'.format(arguments.username_target))
+ return ExitCodes.COULD_NOT_MATCH_USERNAME
+ username = match.group(1)
+
+ # Match password
+ match = re.match(arguments.password_pattern, secret)
+ if not match:
+ stderr('Failed to match password pattern on secret!')
+ return ExitCodes.COULD_NOT_MATCH_PASSWORD
+ password = match.group(1)
+
+ if arguments.username_only:
+ fake_key_raw(username)
+ elif arguments.password_only:
+ fake_key_raw(password)
+ elif arguments.otp_only:
+ otp = pass_otp(selection, arguments.io_encoding)
+ fake_key_raw(otp)
+ else:
+ # Enter username and password using fake-key and <Tab> (which seems to work almost universally), then switch
+ # back into insert-mode, so the form can be directly submitted by hitting enter afterwards
+ fake_key_raw(username)
+ qute_command('fake-key <Tab>')
+ fake_key_raw(password)
+
+ if arguments.insert_mode:
+ qute_command('enter-mode insert')
+
+ return ExitCodes.SUCCESS
+
+
+if __name__ == '__main__':
+ arguments = argument_parser.parse_args()
+ sys.exit(main(arguments))
diff --git a/.config/qutebrowser/misc/userscripts/qutedmenu b/.config/qutebrowser/misc/userscripts/qutedmenu
new file mode 100755
index 0000000..de1b8d6
--- /dev/null
+++ b/.config/qutebrowser/misc/userscripts/qutedmenu
@@ -0,0 +1,54 @@
+#!/usr/bin/env bash
+# Handle open -s && open -t with bemenu
+
+#:bind o spawn --userscript /path/to/userscripts/qutedmenu open
+#:bind O spawn --userscript /path/to/userscripts/qutedmenu tab
+
+# If you would like to set a custom colorscheme/font use these dirs.
+# https://github.com/halfwit/dotfiles/blob/master/.config/dmenu/bemenucolors
+readonly confdir=${XDG_CONFIG_HOME:-$HOME/.config}
+
+readonly optsfile=$confdir/dmenu/bemenucolors
+
+create_menu() {
+ # Check quickmarks
+ while read -r url; do
+ printf -- '%s\n' "$url"
+ done < "$QUTE_CONFIG_DIR"/quickmarks
+
+ # Next bookmarks
+ while read -r url _; do
+ printf -- '%s\n' "$url"
+ done < "$QUTE_CONFIG_DIR"/bookmarks/urls
+
+ # Finally history
+ while read -r _ url; do
+ printf -- '%s\n' "$url"
+ done < "$QUTE_DATA_DIR"/history
+ }
+
+get_selection() {
+ opts+=(-p qutebrowser)
+ #create_menu | dmenu -l 10 "${opts[@]}"
+ create_menu | bemenu -l 10 "${opts[@]}"
+}
+
+# Main
+# https://github.com/halfwit/dotfiles/blob/master/.config/dmenu/font
+[[ -s $confdir/dmenu/font ]] && read -r font < "$confdir"/dmenu/font
+
+[[ $font ]] && opts+=(-fn "$font")
+
+# shellcheck source=/dev/null
+[[ -s $optsfile ]] && source "$optsfile"
+
+url=$(get_selection)
+url=${url/*http/http}
+
+# If no selection is made, exit (escape pressed, e.g.)
+[[ ! $url ]] && exit 0
+
+case $1 in
+ open) printf '%s' "open $url" >> "$QUTE_FIFO" || qutebrowser "$url" ;;
+ tab) printf '%s' "open -t $url" >> "$QUTE_FIFO" || qutebrowser "$url" ;;
+esac
diff --git a/.config/qutebrowser/misc/userscripts/readability b/.config/qutebrowser/misc/userscripts/readability
new file mode 100755
index 0000000..d0ef437
--- /dev/null
+++ b/.config/qutebrowser/misc/userscripts/readability
@@ -0,0 +1,41 @@
+#!/usr/bin/env python
+#
+# Executes python-readability on current page and opens the summary as new tab.
+#
+# Depends on the python-readability package, or its fork:
+#
+# - https://github.com/buriy/python-readability
+# - https://github.com/bookieio/breadability
+#
+# Usage:
+# :spawn --userscript readability
+#
+from __future__ import absolute_import
+import codecs, os
+
+tmpfile = os.path.join(
+ os.environ.get('QUTE_DATA_DIR',
+ os.path.expanduser('~/.local/share/qutebrowser')),
+ 'userscripts/readability.html')
+
+if not os.path.exists(os.path.dirname(tmpfile)):
+ os.makedirs(os.path.dirname(tmpfile))
+
+with codecs.open(os.environ['QUTE_HTML'], 'r', 'utf-8') as source:
+ data = source.read()
+
+ try:
+ from breadability.readable import Article as reader
+ doc = reader(data)
+ content = doc.readable
+ except ImportError:
+ from readability import Document
+ doc = Document(data)
+ content = doc.summary().replace('<html>', '<html><head><title>%s</title></head>' % doc.title())
+
+ with codecs.open(tmpfile, 'w', 'utf-8') as target:
+ target.write('<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />')
+ target.write(content)
+
+ with open(os.environ['QUTE_FIFO'], 'w') as fifo:
+ fifo.write('open -t %s' % tmpfile)
diff --git a/.config/qutebrowser/misc/userscripts/ripbang b/.config/qutebrowser/misc/userscripts/ripbang
new file mode 100755
index 0000000..b35ff77
--- /dev/null
+++ b/.config/qutebrowser/misc/userscripts/ripbang
@@ -0,0 +1,34 @@
+#!/usr/bin/env python
+#
+# Adds DuckDuckGo bang as searchengine.
+#
+# Usage:
+# :spawn --userscript ripbang [bang]...
+#
+# Example:
+# :spawn --userscript ripbang amazon maps
+#
+
+from __future__ import print_function
+import os, re, requests, sys
+
+try:
+ from urllib.parse import unquote
+except ImportError:
+ from urllib import unquote
+
+for argument in sys.argv[1:]:
+ bang = '!' + argument
+ r = requests.get('https://duckduckgo.com/',
+ params={'q': bang + ' SEARCHTEXT'})
+
+ searchengine = unquote(re.search("url=[^']+", r.text).group(0))
+ searchengine = searchengine.replace('url=', '')
+ searchengine = searchengine.replace('/l/?kh=-1&uddg=', '')
+ searchengine = searchengine.replace('SEARCHTEXT', '{}')
+
+ if os.getenv('QUTE_FIFO'):
+ with open(os.environ['QUTE_FIFO'], 'w') as fifo:
+ fifo.write('set searchengines %s %s' % (bang, searchengine))
+ else:
+ print('%s %s' % (bang, searchengine))
diff --git a/.config/qutebrowser/misc/userscripts/rss b/.config/qutebrowser/misc/userscripts/rss
new file mode 100755
index 0000000..f8feebe
--- /dev/null
+++ b/.config/qutebrowser/misc/userscripts/rss
@@ -0,0 +1,122 @@
+#!/bin/sh
+
+# Copyright 2016 Jan Verbeek (blyxxyz) <ring@openmailbox.org>
+#
+# This file is part of qutebrowser.
+#
+# qutebrowser is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# qutebrowser is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with qutebrowser. If not, see <http://www.gnu.org/licenses/>.
+
+# This script keeps track of URLs in RSS feeds and opens new ones.
+# New feeds can be added with ':spawn -u /path/to/userscripts/rss add' or
+# ':spawn -u /path/to/userscripts/rss <url>'.
+# New items can be opened with ':spawn -u /path/to/userscripts/rss'.
+# The script doesn't really parse XML, and searches for things that look like
+# item links. It might open things that aren't real links, and it might miss
+# real links.
+
+config_dir="$HOME/.qute-rss"
+
+add_feed () {
+ touch "feeds"
+ if grep -Fq "$1" "feeds"; then
+ notice "$1 is saved already."
+ else
+ printf '%s\n' "$1" >> "feeds"
+ fi
+}
+
+# Show an error message and exit
+fail () {
+ echo "message-error '$*'" > "$QUTE_FIFO"
+ exit 1
+}
+
+# Get a sorted list of item URLs from a RSS feed
+get_items () {
+ $curl "$@" | grep "$text_only" -zo -e '<guid[^<>]*>[^<>]*</guid>' \
+ -e '<link[^<>]*>[^<>]*</link>' \
+ -e '<link[^<>]*href="[^"]*"' |
+ grep "$text_only" -o 'http[^<>"]*' | sort | uniq
+}
+
+# Show an info message
+notice () {
+ echo "message-info '$*'" > "$QUTE_FIFO"
+}
+
+# Update a database of a feed and open new URLs
+read_items () {
+ cd read_urls || return 1
+ feed_file="$(echo "$1" | tr -d /)"
+ feed_temp_file="$(mktemp "$feed_file.tmp.XXXXXXXXXX")"
+ feed_new_items="$(mktemp "$feed_file.new.XXXXXXXXXX")"
+ get_items "$1" > "$feed_temp_file"
+ if [ ! -s "$feed_temp_file" ]; then
+ notice "No items found for $1."
+ rm "$feed_temp_file" "$feed_new_items"
+ elif [ ! -f "$feed_file" ]; then
+ notice "$1 is a new feed. All items will be marked as read."
+ mv "$feed_temp_file" "$feed_file"
+ rm "$feed_new_items"
+ else
+ sort -o "$feed_file" "$feed_file"
+ comm -2 -3 "$feed_temp_file" "$feed_file" | tee "$feed_new_items"
+ cat "$feed_new_items" >> "$feed_file"
+ sort -o "$feed_file" "$feed_file"
+ rm "$feed_temp_file" "$feed_new_items"
+ fi | while read -r item; do
+ echo "open -t $item" > "$QUTE_FIFO"
+ done
+}
+
+if [ ! -d "$config_dir/read_urls" ]; then
+ notice "Creating configuration directory."
+ mkdir -p "$config_dir/read_urls"
+fi
+
+cd "$config_dir" || exit 1
+
+if [ $# != 0 ]; then
+ for arg in "$@"; do
+ if [ "$arg" = "add" ]; then
+ add_feed "$QUTE_URL"
+ else
+ add_feed "$arg"
+ fi
+ done
+ exit
+fi
+
+if [ ! -f "feeds" ]; then
+ fail "Add feeds by running ':spawn -u rss add' or ':spawn -u rss <url>'."
+fi
+
+if curl --version >&-; then
+ curl="curl -sL"
+elif wget --version >&-; then
+ curl="wget -qO -"
+else
+ fail "Either curl or wget is needed to run this script."
+fi
+
+# Detect GNU grep so we can force it to treat everything as text
+if < /dev/null grep --help 2>&1 | grep -q -- -a; then
+ text_only="-a"
+fi
+
+while read -r feed_url; do
+ read_items "$feed_url" &
+done < "$config_dir/feeds"
+
+wait
diff --git a/.config/qutebrowser/misc/userscripts/taskadd b/.config/qutebrowser/misc/userscripts/taskadd
new file mode 100755
index 0000000..36e1c2c
--- /dev/null
+++ b/.config/qutebrowser/misc/userscripts/taskadd
@@ -0,0 +1,34 @@
+#!/usr/bin/env bash
+#
+# Behavior:
+# Userscript for qutebrowser which adds a task to taskwarrior.
+# If run as a command (:spawn --userscript taskadd), it creates a new task
+# with the description equal to the current page title and annotates it with
+# the current page url. Additional arguments are passed along so you can add
+# mods to the task (e.g. priority, due date, tags).
+#
+# Example:
+# :spawn --userscript taskadd due:eod pri:H
+#
+# To enable passing along extra args, I suggest using a mapping like:
+# :bind <somekey> set-cmd-text -s :spawn --userscript taskadd
+#
+# If run from hint mode, it uses the selected hint text as the description
+# and the selected hint url as the annotation.
+#
+# Ryan Roden-Corrent (rcorre), 2016
+# Any feedback is welcome!
+#
+# For more info on Taskwarrior, see http://taskwarrior.org/
+
+# use either the current page title or the hint text as the task description
+[[ $QUTE_MODE == 'hints' ]] && title=$QUTE_SELECTED_TEXT || title=$QUTE_TITLE
+
+# try to add the task and grab the output
+if msg="$(task add "$title" "$*" 2>&1)"; then
+ # annotate the new task with the url, send the output back to the browser
+ task +LATEST annotate "$QUTE_URL"
+ echo "message-info '$(echo "$msg" | head -n 1)'" >> "$QUTE_FIFO"
+else
+ echo "message-error '$(echo "$msg" | head -n 1)'" >> "$QUTE_FIFO"
+fi
diff --git a/.config/qutebrowser/misc/userscripts/tor_identity b/.config/qutebrowser/misc/userscripts/tor_identity
new file mode 100755
index 0000000..93b6d41
--- /dev/null
+++ b/.config/qutebrowser/misc/userscripts/tor_identity
@@ -0,0 +1,52 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+# Copyright 2018 jnphilipp <mail@jnphilipp.org>
+#
+# This file is part of qutebrowser.
+#
+# qutebrowser is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# qutebrowser is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with qutebrowser. If not, see <http://www.gnu.org/licenses/>.
+
+# Change your tor identity.
+#
+# Set a hotkey to launch this script, then:
+# :bind ti spawn --userscript tor_identity PASSWORD
+#
+# Use the hotkey to change your tor identity, press 'ti' to change it.
+# https://stem.torproject.org/faq.html#how-do-i-request-a-new-identity-from-tor
+#
+
+import os
+import sys
+
+try:
+ from stem import Signal
+ from stem.control import Controller
+except ImportError:
+ if os.getenv('QUTE_FIFO'):
+ with open(os.environ['QUTE_FIFO'], 'w') as f:
+ f.write('message-error "Failed to import stem."')
+ else:
+ print('Failed to import stem.')
+
+
+password = sys.argv[1]
+with Controller.from_port(port=9051) as controller:
+ controller.authenticate(password)
+ controller.signal(Signal.NEWNYM)
+ if os.getenv('QUTE_FIFO'):
+ with open(os.environ['QUTE_FIFO'], 'w') as f:
+ f.write('message-info "Tor identity changed."')
+ else:
+ print('Tor identity changed.')
diff --git a/.config/qutebrowser/misc/userscripts/view_in_mpv b/.config/qutebrowser/misc/userscripts/view_in_mpv
new file mode 100755
index 0000000..16603bd
--- /dev/null
+++ b/.config/qutebrowser/misc/userscripts/view_in_mpv
@@ -0,0 +1,143 @@
+#!/usr/bin/env bash
+#
+# Behavior:
+# Userscript for qutebrowser which views the current web page in mpv using
+# sensible mpv-flags. While viewing the page in MPV, all <video>, <embed>,
+# and <object> tags in the original page are temporarily removed. Clicking on
+# such a removed video restores the respective video.
+#
+# In order to use this script, just start it using `spawn --userscript` from
+# qutebrowser. I recommend using an alias, e.g. put this in the
+# [alias]-section of qutebrowser.conf:
+#
+# mpv = spawn --userscript /path/to/view_in_mpv
+#
+# Background:
+# Most of my machines are too slow to play youtube videos using html5, but
+# they work fine in mpv (and mpv has further advantages like video scaling,
+# etc). Of course, I don't want the video to be played (or even to be
+# downloaded) twice — in MPV and in qwebkit. So I often close the tab after
+# opening it in mpv. However, I actually want to keep the rest of the page
+# (comments and video suggestions), i.e. only the videos should disappear
+# when mpv is started. And that's precisely what the present script does.
+#
+# Thorsten Wißmann, 2015 (thorsten` on freenode)
+# Any feedback is welcome!
+
+set -e
+
+if [ -z "$QUTE_FIFO" ] ; then
+ cat 1>&2 <<EOF
+Error: $0 can not be run as a standalone script.
+
+It is a qutebrowser userscript. In order to use it, call it using
+'spawn --userscript' as described in qute://help/userscripts.html
+EOF
+ exit 1
+fi
+
+msg() {
+ local cmd="$1"
+ shift
+ local msg="$*"
+ if [ -z "$QUTE_FIFO" ] ; then
+ echo "$cmd: $msg" >&2
+ else
+ echo "message-$cmd '${msg//\'/\\\'}'" >> "$QUTE_FIFO"
+ fi
+}
+
+MPV_COMMAND=${MPV_COMMAND:-mpv}
+# Warning: spaces in single flags are not supported
+MPV_FLAGS=${MPV_FLAGS:- --force-window --no-terminal --keep-open=yes --ytdl}
+IFS=" " read -r -a video_command <<< "$MPV_COMMAND $MPV_FLAGS"
+
+js() {
+cat <<EOF
+
+ function descendantOfTagName(child, ancestorTagName) {
+ // tells whether child has some (proper) ancestor
+ // with the tag name ancestorTagName
+ while (child.parentNode != null) {
+ child = child.parentNode;
+ if (typeof child.tagName === 'undefined') break;
+ if (child.tagName.toUpperCase() == ancestorTagName.toUpperCase()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ var App = {};
+
+ var all_videos = [];
+ all_videos.push.apply(all_videos, document.getElementsByTagName("video"));
+ all_videos.push.apply(all_videos, document.getElementsByTagName("object"));
+ all_videos.push.apply(all_videos, document.getElementsByTagName("embed"));
+ App.backup_videos = Array();
+ App.all_replacements = Array();
+ for (i = 0; i < all_videos.length; i++) {
+ var video = all_videos[i];
+ if (descendantOfTagName(video, "object")) {
+ // skip tags that are contained in an object, because we hide
+ // the object anyway.
+ continue;
+ }
+ var replacement = document.createElement("div");
+ replacement.innerHTML = "
+ <p style=\\"margin-bottom: 0.5em\\">
+ Opening page with:
+ <span style=\\"font-family: monospace;\\">${video_command[*]}</span>
+ </p>
+ <p>
+ In order to restore this particular video
+ <a style=\\"font-weight: bold;
+ color: white;
+ background: transparent;
+ \\"
+ onClick=\\"restore_video(this, " + i + ");\\"
+ href=\\"javascript: restore_video(this, " + i + ")\\"
+ >click here</a>.
+ </p>
+ ";
+ replacement.style.position = "relative";
+ replacement.style.zIndex = "100003000000";
+ replacement.style.fontSize = "1rem";
+ replacement.style.textAlign = "center";
+ replacement.style.verticalAlign = "middle";
+ replacement.style.height = "100%";
+ replacement.style.background = "#101010";
+ replacement.style.color = "white";
+ replacement.style.border = "4px dashed #545454";
+ replacement.style.padding = "2em";
+ replacement.style.margin = "auto";
+ App.all_replacements[i] = replacement;
+ App.backup_videos[i] = video;
+ video.parentNode.replaceChild(replacement, video);
+ }
+
+ function restore_video(obj, index) {
+ obj = App.all_replacements[index];
+ video = App.backup_videos[index];
+ console.log(video);
+ obj.parentNode.replaceChild(video, obj);
+ }
+
+ /** force repainting the video, thanks to:
+ * http://martinwolf.org/2014/06/10/force-repaint-of-an-element-with-javascript/
+ */
+ var siteHeader = document.getElementById('header');
+ siteHeader.style.display='none';
+ siteHeader.offsetHeight; // no need to store this anywhere, the reference is enough
+ siteHeader.style.display='block';
+
+EOF
+}
+
+printjs() {
+ js | sed 's,//.*$,,' | tr '\n' ' '
+}
+echo "jseval -q $(printjs)" >> "$QUTE_FIFO"
+
+msg info "Opening $QUTE_URL with mpv"
+"${video_command[@]}" "$@" "$QUTE_URL"