From a39e42097ea7283c2e15bbac1417e5e0b927ad0a Mon Sep 17 00:00:00 2001 From: Doro Wu Date: Wed, 19 Feb 2014 16:51:28 +0800 Subject: [PATCH] Add web vnc on port 6080 --- Dockerfile | 7 +- README.md | 7 +- noVNC/LICENSE.txt | 82 + noVNC/README.md | 137 ++ noVNC/debian/changelog | 35 + noVNC/debian/compat | 1 + noVNC/debian/control | 13 + noVNC/debian/copyright | 37 + noVNC/debian/novnc.install | 30 + noVNC/debian/rules | 14 + noVNC/docs/LICENSE.Apache-2.0 | 202 ++ noVNC/docs/LICENSE.BSD-2-Clause | 22 + noVNC/docs/LICENSE.BSD-3-Clause | 24 + noVNC/docs/LICENSE.GPL-3 | 621 ++++++ noVNC/docs/LICENSE.LGPL-3 | 165 ++ noVNC/docs/LICENSE.MPL-2.0 | 373 ++++ noVNC/docs/LICENSE.OFL-1.1 | 91 + noVNC/docs/LICENSE.zlib | 27 + noVNC/docs/VERSION | 1 + noVNC/docs/flash_policy.txt | 4 + noVNC/docs/links | 76 + noVNC/docs/notes | 17 + noVNC/docs/packaging.txt | 23 + noVNC/docs/release.txt | 9 + noVNC/docs/rfb_notes | 147 ++ noVNC/docs/rfbproto-3.3.pdf | Bin 0 -> 110778 bytes noVNC/docs/rfbproto-3.7.pdf | Bin 0 -> 165552 bytes noVNC/docs/rfbproto-3.8.pdf | Bin 0 -> 143840 bytes noVNC/favicon.ico | 1 + noVNC/images/alt.png | Bin 0 -> 339 bytes noVNC/images/clipboard.png | Bin 0 -> 501 bytes noVNC/images/connect.png | Bin 0 -> 404 bytes noVNC/images/ctrl.png | Bin 0 -> 354 bytes noVNC/images/ctrlaltdel.png | Bin 0 -> 317 bytes noVNC/images/disconnect.png | Bin 0 -> 1378 bytes noVNC/images/drag.png | Bin 0 -> 963 bytes noVNC/images/esc.png | Bin 0 -> 385 bytes noVNC/images/favicon.ico | Bin 0 -> 1150 bytes noVNC/images/favicon.png | Bin 0 -> 453 bytes noVNC/images/keyboard.png | Bin 0 -> 1283 bytes noVNC/images/mouse_left.png | Bin 0 -> 511 bytes noVNC/images/mouse_middle.png | Bin 0 -> 517 bytes noVNC/images/mouse_none.png | Bin 0 -> 497 bytes noVNC/images/mouse_right.png | Bin 0 -> 513 bytes noVNC/images/power.png | Bin 0 -> 390 bytes noVNC/images/screen_320x460.png | Bin 0 -> 12778 bytes noVNC/images/screen_57x57.png | Bin 0 -> 1807 bytes noVNC/images/screen_700x700.png | Bin 0 -> 17930 bytes noVNC/images/settings.png | Bin 0 -> 2495 bytes noVNC/images/showextrakeys.png | Bin 0 -> 735 bytes noVNC/images/tab.png | Bin 0 -> 387 bytes noVNC/include/Orbitron700.ttf | Bin 0 -> 38580 bytes noVNC/include/Orbitron700.woff | Bin 0 -> 17472 bytes noVNC/include/base.css | 512 +++++ noVNC/include/base64.js | 115 + noVNC/include/black.css | 71 + noVNC/include/blue.css | 64 + noVNC/include/chrome-app/tcp-client.js | 321 +++ noVNC/include/des.js | 273 +++ noVNC/include/display.js | 770 +++++++ noVNC/include/input.js | 401 ++++ noVNC/include/jsunzip.js | 676 ++++++ noVNC/include/keyboard.js | 528 +++++ noVNC/include/keysym.js | 376 ++++ noVNC/include/keysymdef.js | 15 + noVNC/include/logo.js | 1 + noVNC/include/playback.js | 102 + noVNC/include/rfb.js | 1982 +++++++++++++++++ noVNC/include/ui.js | 961 ++++++++ noVNC/include/util.js | 383 ++++ noVNC/include/web-socket-js/README.txt | 109 + noVNC/include/web-socket-js/WebSocketMain.swf | Bin 0 -> 177139 bytes noVNC/include/web-socket-js/swfobject.js | 4 + noVNC/include/web-socket-js/web_socket.js | 391 ++++ noVNC/include/websock.js | 422 ++++ noVNC/include/webutil.js | 221 ++ noVNC/tests/arrays.html | 39 + noVNC/tests/arrays.js | 375 ++++ noVNC/tests/base64.html | 91 + noVNC/tests/base64.js | 12 + noVNC/tests/browser.js | 134 ++ noVNC/tests/canvas.html | 148 ++ noVNC/tests/cursor.html | 135 ++ noVNC/tests/face.png | Bin 0 -> 2303 bytes noVNC/tests/face.png.js | 1 + noVNC/tests/input.html | 131 ++ noVNC/tests/keyboard-tests.html | 29 + noVNC/tests/run_from_console.casper.js | 99 + noVNC/tests/run_from_console.js | 288 +++ noVNC/tests/run_from_console.zombie.js | 82 + noVNC/tests/stats.js | 53 + noVNC/tests/test.helper.js | 260 +++ noVNC/tests/test.keyboard.js | 841 +++++++ noVNC/tests/viewport.css | 43 + noVNC/tests/viewport.html | 204 ++ noVNC/tests/vnc_perf.html | 209 ++ noVNC/tests/vnc_playback.html | 138 ++ noVNC/utils/Makefile | 11 + noVNC/utils/README.md | 10 + noVNC/utils/img2js.py | 40 + noVNC/utils/json2graph.py | 206 ++ noVNC/utils/launch.sh | 118 + noVNC/utils/nova-novncproxy | 152 ++ noVNC/utils/parse.js | 97 + noVNC/utils/rebind | 18 + noVNC/utils/rebind.c | 94 + noVNC/utils/u2x11 | 28 + noVNC/utils/web.py | 55 + noVNC/utils/websocket.py | 887 ++++++++ noVNC/utils/websocket.pyc | Bin 0 -> 25156 bytes noVNC/utils/websockify | 393 ++++ noVNC/utils/websockify.py | 1 + noVNC/utils/wsproxy.py | 1 + noVNC/vnc.html | 214 ++ noVNC/vnc_auto.html | 209 ++ screenshots/lxde.png | Bin 0 -> 241258 bytes supervisord.conf | 11 + 117 files changed, 16717 insertions(+), 4 deletions(-) create mode 100644 noVNC/LICENSE.txt create mode 100644 noVNC/README.md create mode 100644 noVNC/debian/changelog create mode 100644 noVNC/debian/compat create mode 100644 noVNC/debian/control create mode 100644 noVNC/debian/copyright create mode 100644 noVNC/debian/novnc.install create mode 100755 noVNC/debian/rules create mode 100644 noVNC/docs/LICENSE.Apache-2.0 create mode 100644 noVNC/docs/LICENSE.BSD-2-Clause create mode 100644 noVNC/docs/LICENSE.BSD-3-Clause create mode 100644 noVNC/docs/LICENSE.GPL-3 create mode 100644 noVNC/docs/LICENSE.LGPL-3 create mode 100644 noVNC/docs/LICENSE.MPL-2.0 create mode 100644 noVNC/docs/LICENSE.OFL-1.1 create mode 100644 noVNC/docs/LICENSE.zlib create mode 100644 noVNC/docs/VERSION create mode 100644 noVNC/docs/flash_policy.txt create mode 100644 noVNC/docs/links create mode 100644 noVNC/docs/notes create mode 100644 noVNC/docs/packaging.txt create mode 100644 noVNC/docs/release.txt create mode 100644 noVNC/docs/rfb_notes create mode 100644 noVNC/docs/rfbproto-3.3.pdf create mode 100644 noVNC/docs/rfbproto-3.7.pdf create mode 100644 noVNC/docs/rfbproto-3.8.pdf create mode 120000 noVNC/favicon.ico create mode 100644 noVNC/images/alt.png create mode 100644 noVNC/images/clipboard.png create mode 100644 noVNC/images/connect.png create mode 100644 noVNC/images/ctrl.png create mode 100644 noVNC/images/ctrlaltdel.png create mode 100644 noVNC/images/disconnect.png create mode 100644 noVNC/images/drag.png create mode 100644 noVNC/images/esc.png create mode 100644 noVNC/images/favicon.ico create mode 100644 noVNC/images/favicon.png create mode 100644 noVNC/images/keyboard.png create mode 100644 noVNC/images/mouse_left.png create mode 100644 noVNC/images/mouse_middle.png create mode 100644 noVNC/images/mouse_none.png create mode 100644 noVNC/images/mouse_right.png create mode 100644 noVNC/images/power.png create mode 100644 noVNC/images/screen_320x460.png create mode 100644 noVNC/images/screen_57x57.png create mode 100644 noVNC/images/screen_700x700.png create mode 100644 noVNC/images/settings.png create mode 100644 noVNC/images/showextrakeys.png create mode 100644 noVNC/images/tab.png create mode 100644 noVNC/include/Orbitron700.ttf create mode 100644 noVNC/include/Orbitron700.woff create mode 100644 noVNC/include/base.css create mode 100644 noVNC/include/base64.js create mode 100644 noVNC/include/black.css create mode 100644 noVNC/include/blue.css create mode 100644 noVNC/include/chrome-app/tcp-client.js create mode 100644 noVNC/include/des.js create mode 100644 noVNC/include/display.js create mode 100644 noVNC/include/input.js create mode 100755 noVNC/include/jsunzip.js create mode 100644 noVNC/include/keyboard.js create mode 100644 noVNC/include/keysym.js create mode 100644 noVNC/include/keysymdef.js create mode 100644 noVNC/include/logo.js create mode 100644 noVNC/include/playback.js create mode 100644 noVNC/include/rfb.js create mode 100644 noVNC/include/ui.js create mode 100644 noVNC/include/util.js create mode 100644 noVNC/include/web-socket-js/README.txt create mode 100644 noVNC/include/web-socket-js/WebSocketMain.swf create mode 100644 noVNC/include/web-socket-js/swfobject.js create mode 100644 noVNC/include/web-socket-js/web_socket.js create mode 100644 noVNC/include/websock.js create mode 100644 noVNC/include/webutil.js create mode 100644 noVNC/tests/arrays.html create mode 100644 noVNC/tests/arrays.js create mode 100644 noVNC/tests/base64.html create mode 100644 noVNC/tests/base64.js create mode 100644 noVNC/tests/browser.js create mode 100644 noVNC/tests/canvas.html create mode 100644 noVNC/tests/cursor.html create mode 100644 noVNC/tests/face.png create mode 100644 noVNC/tests/face.png.js create mode 100644 noVNC/tests/input.html create mode 100644 noVNC/tests/keyboard-tests.html create mode 100644 noVNC/tests/run_from_console.casper.js create mode 100755 noVNC/tests/run_from_console.js create mode 100644 noVNC/tests/run_from_console.zombie.js create mode 100644 noVNC/tests/stats.js create mode 100644 noVNC/tests/test.helper.js create mode 100644 noVNC/tests/test.keyboard.js create mode 100644 noVNC/tests/viewport.css create mode 100644 noVNC/tests/viewport.html create mode 100644 noVNC/tests/vnc_perf.html create mode 100644 noVNC/tests/vnc_playback.html create mode 100644 noVNC/utils/Makefile create mode 100644 noVNC/utils/README.md create mode 100755 noVNC/utils/img2js.py create mode 100755 noVNC/utils/json2graph.py create mode 100755 noVNC/utils/launch.sh create mode 100755 noVNC/utils/nova-novncproxy create mode 100644 noVNC/utils/parse.js create mode 100755 noVNC/utils/rebind create mode 100644 noVNC/utils/rebind.c create mode 100755 noVNC/utils/u2x11 create mode 100755 noVNC/utils/web.py create mode 100644 noVNC/utils/websocket.py create mode 100644 noVNC/utils/websocket.pyc create mode 100755 noVNC/utils/websockify create mode 120000 noVNC/utils/websockify.py create mode 120000 noVNC/utils/wsproxy.py create mode 100644 noVNC/vnc.html create mode 100644 noVNC/vnc_auto.html create mode 100644 screenshots/lxde.png diff --git a/Dockerfile b/Dockerfile index ede9408..4426ee3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,15 +23,18 @@ RUN apt-get install -y --no-install-recommends openssh-server pwgen sudo vim-tin RUN apt-get install -y --no-install-recommends lxde RUN apt-get install -y --no-install-recommends x11vnc xvfb RUN apt-get install -y supervisor -RUN apt-get install -y libreoffice -RUN apt-get install -y firefox +RUN apt-get install -y libreoffice firefox +# noVNC +RUN apt-get install -y net-tools ADD startup.sh / ADD supervisord.conf / +ADD noVNC /noVNC/ # clean up after ourselves RUN apt-get clean +EXPOSE 6080 EXPOSE 5900 EXPOSE 22 WORKDIR / diff --git a/README.md b/README.md index 64188e6..6519657 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,9 @@ docker-ubuntu-vnc-desktop ``` git clone https://github.com/fcwu/docker-ubuntu-vnc-desktop.git docker build --rm -t doro/ubuntu-vnc-desktop docker-ubuntu-vnc-desktop -docker run -i -t --entrypoint=/bin/bash -p 5900:5900 doro/ubuntu-vnc-desktop -vncview 127.0.0.1:5900 +docker run -i -t --entrypoint=/bin/bash -p 6080:6080 doro/ubuntu-vnc-desktop ``` + +Browse http://127.0.0.1:6080/vnc.html + + diff --git a/noVNC/LICENSE.txt b/noVNC/LICENSE.txt new file mode 100644 index 0000000..2d09408 --- /dev/null +++ b/noVNC/LICENSE.txt @@ -0,0 +1,82 @@ +noVNC is Copyright (C) 2011 Joel Martin + +The noVNC core library files are licensed under the MPL 2.0 (Mozilla +Public License 2.0). The noVNC core library is composed of the +Javascript code necessary for full noVNC operation. This includes (but +is not limited to): + + include/base64.js + include/des.js + include/display.js + include/input.js + include/jsunzip.js + include/keysym.js + include/logo.js + include/rfb.js + include/ui.js + include/util.js + include/vnc.js + include/websock.js + include/webutil.js + +The HTML, CSS, font and images files that included with the noVNC +source distibution (or repository) are not considered part of the +noVNC core library and are licensed under more permissive licenses. +The intent is to allow easy integration of noVNC into existing web +sites and web applications. + +The HTML, CSS, font and image files are licensed as follows: + + *.html : 2-Clause BSD license + + include/*.css : 2-Clause BSD license + + include/Orbitron* : SIL Open Font License 1.1 + (Copyright 2009 Matt McInerney) + + images/ : Creative Commons Attribution-ShareAlike + http://creativecommons.org/licenses/by-sa/3.0/ + +Some portions of noVNC are copyright to their individual authors. +Please refer to the individual source files and/or to the noVNC commit +history: https://github.com/kanaka/noVNC/commits/master + +The are several files and projects that have been incorporated into +the noVNC core library. Here is a list of those files and the original +licenses (all MPL 2.0 compatible): + + include/base64.js : MPL 2.0 + + include/des.js : Various BSD style licenses + + include/jsunzip.js : zlib/libpng license + + include/web-socket-js/ : New BSD license (3-clause). Source code at + http://github.com/gimite/web-socket-js + + include/chrome-app/tcp-stream.js + : Apache 2.0 license + + utils/websockify + utils/websocket.py : LGPL 3 + +The following license texts are included: + + docs/LICENSE.MPL-2.0 + docs/LICENSE.LGPL-3 and + docs/LICENSE.GPL-3 + docs/LICENSE.OFL-1.1 + docs/LICENSE.BSD-3-Clause (New BSD) + docs/LICENSE.BSD-2-Clause (Simplified BSD / FreeBSD) + docs/LICENSE.zlib + docs/LICENSE.Apache-2.0 + +Or alternatively the license texts may be found here: + + http://www.mozilla.org/MPL/2.0/ + http://www.gnu.org/licenses/lgpl.html and + http://www.gnu.org/licenses/gpl.html + http://scripts.sil.org/OFL + http://en.wikipedia.org/wiki/BSD_licenses + http://www.gzip.org/zlib/zlib_license.html + http://www.apache.org/licenses/LICENSE-2.0.html diff --git a/noVNC/README.md b/noVNC/README.md new file mode 100644 index 0000000..53d1440 --- /dev/null +++ b/noVNC/README.md @@ -0,0 +1,137 @@ +## noVNC: HTML5 VNC Client + + +### Description + +noVNC is a HTML5 VNC client that runs well in any modern browser +including mobile browsers (iPhone/iPad and Android). + +Many companies/projects have integrated noVNC including [Ganeti Web +Manager](http://code.osuosl.org/projects/ganeti-webmgr), +[OpenStack](http://www.openstack.org), +[OpenNebula](http://opennebula.org/), and +[LibVNCServer](http://libvncserver.sourceforge.net). See [the Projects +and Companies wiki +page](https://github.com/kanaka/noVNC/wiki/ProjectsCompanies-using-noVNC) +for a more complete list with additional info and links. + +### News/help/contact + +Notable commits, announcements and news are posted to +@noVNC + +If you are a noVNC developer/integrator/user (or want to be) please +join the noVNC +discussion group + +Bugs and feature requests can be submitted via [github +issues](https://github.com/kanaka/noVNC/issues). If you are looking +for a place to start contributing to noVNC, a good place to start +would be the issues that are have marked as +["patchwelcome"](https://github.com/kanaka/noVNC/issues?labels=patchwelcome). + +If you want to show appreciation for noVNC you could donate to a great +non-profits such as: [Compassion +International](http://www.compassion.com/), [SIL](http://www.sil.org), +[Habitat for Humanity](http://www.habitat.org), [Electronic Frontier +Foundation](https://www.eff.org/), [Against Malaria +Foundation](http://www.againstmalaria.com/), [Nothing But +Nets](http://www.nothingbutnets.net/), etc. Please tweet @noVNC if you do. + + +### Features + +* Supports all modern browsers including mobile (iOS, Android) +* Supported VNC encodings: raw, copyrect, rre, hextile, tight, tightPNG +* WebSocket SSL/TLS encryption (i.e. "wss://") support +* 24-bit true color and 8 bit colour mapped +* Supports desktop resize notification/pseudo-encoding +* Local or remote cursor +* Clipboard copy/paste +* Clipping or scolling modes for large remote screens +* Easy site integration and theming (3 example themes included) +* Licensed under the [MPL 2.0](http://www.mozilla.org/MPL/2.0/) + +### Screenshots + +Running in Chrome before and after connecting: + +  + +See more screenshots here. + + +### Browser Requirements + +* HTML5 Canvas (with createImageData): Chrome, Firefox 3.6+, iOS + Safari, Opera 11+, Internet Explorer 9+, etc. + +* HTML5 WebSockets: For browsers that do not have builtin + WebSockets support, the project includes + web-socket-js, + a WebSockets emulator using Adobe Flash. iOS 4.2+ has built-in + WebSocket support. + +* Fast Javascript Engine: this is not strictly a requirement, but + without a fast Javascript engine, noVNC might be painfully slow. + +* See the more detailed [browser compatibility wiki page](https://github.com/kanaka/noVNC/wiki/Browser-support). + + +### Server Requirements + +Unless you are using a VNC server with support for WebSockets +connections (such as +[x11vnc/libvncserver](http://libvncserver.sourceforge.net/), +[QEMU](http://www.qemu.org/), or +[PocketVNC](http://www.pocketvnc.com/blog/?page_id=866)), you need to +use a WebSockets to TCP socket proxy. There is a python proxy included +('websockify'). + + +### Quick Start + +* Use the launch script to start a mini-webserver and the WebSockets + proxy (websockify). The `--vnc` option is used to specify the location of + a running VNC server: + + `./utils/launch.sh --vnc localhost:5901` + +* Point your browser to the cut-and-paste URL that is output by the + launch script. Enter a password if the VNC server has one + configured. Hit the Connect button and enjoy! + + +### Other Pages + +* [Encrypted Connections](https://github.com/kanaka/websockify/wiki/Encrypted-Connections). How to setup websockify so that you can use encrypted connections from noVNC. + +* [Advanced Usage](https://github.com/kanaka/noVNC/wiki/Advanced-usage). Starting a VNC server, advanced websockify usage, etc. + +* [Integrating noVNC](https://github.com/kanaka/noVNC/wiki/Integration) into existing projects. + +* [Troubleshooting noVNC](https://github.com/kanaka/noVNC/wiki/Troubleshooting) problems. + + +### Authors/Contributors + +* Core team: + * [Joel Martin](https://github.com/kanaka) + * [Samuel Mannehed](https://github.com/samhed) (Cendio) + * [Peter Åstrand](https://github.com/astrand) (Cendio) + * [Solly Ross](https://github.com/DirectXMan12) (Red Hat / OpenStack) + +* Notable contributions: + * UI and Icons : Chris Gordon + * Original Logo : Michael Sersen + * tight encoding : Michael Tinglof (Mercuri.ca) + +* Included libraries: + * web-socket-js : Hiroshi Ichikawa (github.com/gimite/web-socket-js) + * as3crypto : Henri Torgemane (code.google.com/p/as3crypto) + * base64 : Martijn Pieters (Digital Creations 2), Samuel Sieb (sieb.net) + * jsunzip : Erik Moller (github.com/operasoftware/jsunzip), + * tinflate : Joergen Ibsen (ibsensoftware.com) + * DES : Dave Zimmerman (Widget Workshop), Jef Poskanzer (ACME Labs) diff --git a/noVNC/debian/changelog b/noVNC/debian/changelog new file mode 100644 index 0000000..4d30742 --- /dev/null +++ b/noVNC/debian/changelog @@ -0,0 +1,35 @@ +novnc (0.4) maverick; urgency=low + + * Clarify permissive licenses of HTML, CSS, images. + * Use render queue and requestAnimationFrame + * UltraVNC repeater support + + -- Joel Martin Fri, 14 Sep 2012 05:00:00 -0600 + +novnc (0.3) maverick; urgency=low + + * add tight encoding support + * release pressed key when focus lost (fixes locked Alt key) + * Support Apple Remote Desktop + * Add nova/openstack proxy wrapper + * Better connection close handling/reporting + + -- Joel Martin Fri, 11 May 2012 03:00:00 -0600 + +novnc (0.2) maverick; urgency=low + + * Mobile device support with viewport clipping + * Much better styling that also works on mobile devices well + * Update websockify to support latest WebSocket protocol HyBi 13 + (i.e. support IETF 6455) + * Better support in websockify for python 2.4 through 3.2 + * Support VMWare ESX and Intel AMT KVM + * View only mode + + -- Joel Martin Tue, 05 Jul 2011 01:00:00 -0600 + +novnc (0.1) maverick; urgency=low + + * First upstream release + + -- Joel Martin Tue, 05 Jul 2011 01:00:00 -0600 diff --git a/noVNC/debian/compat b/noVNC/debian/compat new file mode 100644 index 0000000..7f8f011 --- /dev/null +++ b/noVNC/debian/compat @@ -0,0 +1 @@ +7 diff --git a/noVNC/debian/control b/noVNC/debian/control new file mode 100644 index 0000000..f7b92d5 --- /dev/null +++ b/noVNC/debian/control @@ -0,0 +1,13 @@ +Source: novnc +Section: web +Priority: optional +Maintainer: Joel Martin +Build-Depends: debhelper (>= 7.0.0~) +Standards-Version: 3.8.3 +Homepage: https://github.com/kanaka/noVNC/ + +Package: novnc +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, python (>= 2.4) +Description: HTML5 VNC client + VNC client using HTML5 (WebSockets, Canvas) with encryption (wss://) support. diff --git a/noVNC/debian/copyright b/noVNC/debian/copyright new file mode 100644 index 0000000..db00fa1 --- /dev/null +++ b/noVNC/debian/copyright @@ -0,0 +1,37 @@ +Upstream Project: https://github.com/kanaka/noVNC/ + +--------------------- Original LICENSE.txt --------------------------- + +noVNC is Copyright (C) 2012 Joel Martin + +Some portions of noVNC are copyright to their individual authors. +Please refer to the individual source files and/or to the noVNC commit +history: https://github.com/kanaka/noVNC/commits/master + +noVNC is licensed under the MPL 2.0 (Mozilla Public License) with the +following exceptions: + + *.html, *.css : 2-Clause BSD license + + include/Orbitron* : SIL Open Font License 1.1 + (Copyright 2009 Matt McInerney) + + images/ : Creative Commons Attribution-ShareAlike + http://creativecommons.org/licenses/by-sa/3.0/ + + include/base64.js : MPL 2.0 + + include/des.js : Various BSD style licenses + + include/jsunzip.js : zlib/libpng license + + include/web-socket-js/ : New BSD license (3-clause). Source code at + http://github.com/gimite/web-socket-js + + include/chrome-app/tcp-stream.js + : Apache 2.0 license + +---------------------------------------------------------------------- + +The MPL-2.0 license text may be found here: + http://www.mozilla.org/MPL/2.0/ diff --git a/noVNC/debian/novnc.install b/noVNC/debian/novnc.install new file mode 100644 index 0000000..ac51e3c --- /dev/null +++ b/noVNC/debian/novnc.install @@ -0,0 +1,30 @@ +vnc.html /usr/share/novnc +vnc_auto.html /usr/share/novnc +README.md /usr/share/doc/novnc +LICENSE.txt /usr/share/doc/novnc +utils/Makefile /usr/share/novnc/utils +utils/launch.sh /usr/share/novnc/utils +utils/websocket.py /usr/share/novnc/utils +utils/websockify /usr/share/novnc/utils +utils/rebind.c /usr/share/novnc/utils +utils/rebind.so /usr/share/novnc/utils +images /usr/share/novnc +images/favicon.ico /usr/share/novnc +include/base64.js /usr/share/novnc/include +include/des.js /usr/share/novnc/include +include/display.js /usr/share/novnc/include +include/keysymdef.js /usr/share/novnc/include +include/keyboard.js /usr/share/novnc/include +include/input.js /usr/share/novnc/include +include/logo.js /usr/share/novnc/include +include/base.css /usr/share/novnc/include +include/blue.css /usr/share/novnc/include +include/black.css /usr/share/novnc/include +include/playback.js /usr/share/novnc/include +include/rfb.js /usr/share/novnc/include +include/ui.js /usr/share/novnc/include +include/util.js /usr/share/novnc/include +include/websock.js /usr/share/novnc/include +include/webutil.js /usr/share/novnc/include +include/jsunzip.js /usr/share/novnc/include +include/web-socket-js/* /usr/share/novnc/include/web-socket-js diff --git a/noVNC/debian/rules b/noVNC/debian/rules new file mode 100755 index 0000000..25b0812 --- /dev/null +++ b/noVNC/debian/rules @@ -0,0 +1,14 @@ +#!/usr/bin/make -f + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +clean: + make -C utils clean + dh clean + +build: + make -C utils rebind.so + +%: + dh ${@} diff --git a/noVNC/docs/LICENSE.Apache-2.0 b/noVNC/docs/LICENSE.Apache-2.0 new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/noVNC/docs/LICENSE.Apache-2.0 @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/noVNC/docs/LICENSE.BSD-2-Clause b/noVNC/docs/LICENSE.BSD-2-Clause new file mode 100644 index 0000000..9d66ec9 --- /dev/null +++ b/noVNC/docs/LICENSE.BSD-2-Clause @@ -0,0 +1,22 @@ +Copyright (c) , +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/noVNC/docs/LICENSE.BSD-3-Clause b/noVNC/docs/LICENSE.BSD-3-Clause new file mode 100644 index 0000000..e160466 --- /dev/null +++ b/noVNC/docs/LICENSE.BSD-3-Clause @@ -0,0 +1,24 @@ +Copyright (c) , +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/noVNC/docs/LICENSE.GPL-3 b/noVNC/docs/LICENSE.GPL-3 new file mode 100644 index 0000000..94a0453 --- /dev/null +++ b/noVNC/docs/LICENSE.GPL-3 @@ -0,0 +1,621 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS diff --git a/noVNC/docs/LICENSE.LGPL-3 b/noVNC/docs/LICENSE.LGPL-3 new file mode 100644 index 0000000..65c5ca8 --- /dev/null +++ b/noVNC/docs/LICENSE.LGPL-3 @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/noVNC/docs/LICENSE.MPL-2.0 b/noVNC/docs/LICENSE.MPL-2.0 new file mode 100644 index 0000000..14e2f77 --- /dev/null +++ b/noVNC/docs/LICENSE.MPL-2.0 @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/noVNC/docs/LICENSE.OFL-1.1 b/noVNC/docs/LICENSE.OFL-1.1 new file mode 100644 index 0000000..77b1731 --- /dev/null +++ b/noVNC/docs/LICENSE.OFL-1.1 @@ -0,0 +1,91 @@ +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/noVNC/docs/LICENSE.zlib b/noVNC/docs/LICENSE.zlib new file mode 100644 index 0000000..ca15168 --- /dev/null +++ b/noVNC/docs/LICENSE.zlib @@ -0,0 +1,27 @@ +Copyright (c) , +All rights reserved. + +This software is provided 'as-is', without any express +or implied warranty. In no event will the authors be +held liable for any damages arising from the use of +this software. + +Permission is granted to anyone to use this software +for any purpose, including commercial applications, +and to alter it and redistribute it freely, subject to +the following restrictions: + +1. The origin of this software must not be + misrepresented; you must not claim that you + wrote the original software. If you use this + software in a product, an acknowledgment in + the product documentation would be appreciated + but is not required. + +2. Altered source versions must be plainly marked + as such, and must not be misrepresented as + being the original software. + +3. This notice may not be removed or altered from + any source distribution. + diff --git a/noVNC/docs/VERSION b/noVNC/docs/VERSION new file mode 100644 index 0000000..bd73f47 --- /dev/null +++ b/noVNC/docs/VERSION @@ -0,0 +1 @@ +0.4 diff --git a/noVNC/docs/flash_policy.txt b/noVNC/docs/flash_policy.txt new file mode 100644 index 0000000..df325c0 --- /dev/null +++ b/noVNC/docs/flash_policy.txt @@ -0,0 +1,4 @@ +Manual setup: + +DATA="echo \'\'" +/usr/bin/socat -T 1 TCP-L:843,reuseaddr,fork,crlf SYSTEM:"$DATA" diff --git a/noVNC/docs/links b/noVNC/docs/links new file mode 100644 index 0000000..31544ce --- /dev/null +++ b/noVNC/docs/links @@ -0,0 +1,76 @@ +New tight PNG protocol: + http://wiki.qemu.org/VNC_Tight_PNG + http://xf.iksaif.net/blog/index.php?post/2010/06/14/QEMU:-Tight-PNG-and-some-profiling + +RFB protocol and extensions: + http://tigervnc.org/cgi-bin/rfbproto + +Canvas Browser Compatibility: + http://philip.html5.org/tests/canvas/suite/tests/results.html + +WebSockets API standard: + http://www.whatwg.org/specs/web-apps/current-work/complete.html#websocket + http://dev.w3.org/html5/websockets/ + http://www.ietf.org/id/draft-ietf-hybi-thewebsocketprotocol-00.txt + +Browser Keyboard Events detailed: + http://unixpapa.com/js/key.html + +ActionScript (Flash) WebSocket implementation: + http://github.com/gimite/web-socket-js + +ActionScript (Flash) crypto/TLS library: + http://code.google.com/p/as3crypto + http://github.com/lyokato/as3crypto_patched + +TLS Protocol: + http://en.wikipedia.org/wiki/Transport_Layer_Security + +Generate self-signed certificate: + http://docs.python.org/dev/library/ssl.html#certificates + +Cursor appearance/style (for Cursor pseudo-encoding): + http://en.wikipedia.org/wiki/ICO_(file_format) + http://www.daubnet.com/en/file-format-cur + https://developer.mozilla.org/en/Using_URL_values_for_the_cursor_property + http://www.fileformat.info/format/bmp/egff.htm + +Icon/Cursor file format: + http://msdn.microsoft.com/en-us/library/ms997538 + http://msdn.microsoft.com/en-us/library/aa921550.aspx + http://msdn.microsoft.com/en-us/library/aa930622.aspx + + +RDP Protocol specification: + http://msdn.microsoft.com/en-us/library/cc240445(v=PROT.10).aspx + + +Related projects: + + guacamole: http://guacamole.sourceforge.net/ + + - Web client, but Java servlet does pre-processing + + jsvnc: http://code.google.com/p/jsvnc/ + + - No releases + + webvnc: http://code.google.com/p/webvnc/ + + - Jetty web server gateway, no updates since April 2008. + + RealVNC Java applet: http://www.realvnc.com/support/javavncviewer.html + + - Java applet + + Flashlight-VNC: http://www.wizhelp.com/flashlight-vnc/ + + - Adobe Flash implementation + + FVNC: http://osflash.org/fvnc + + - Adbove Flash implementation + + CanVNC: http://canvnc.sourceforge.net/ + + - HTML client with REST to VNC python proxy. Mostly vapor. diff --git a/noVNC/docs/notes b/noVNC/docs/notes new file mode 100644 index 0000000..9bcc6af --- /dev/null +++ b/noVNC/docs/notes @@ -0,0 +1,17 @@ +Some implementation notes: + +There is an included flash object (web-socket-js) that is used to +emulate websocket support on browsers without websocket support +(currently only Chrome has WebSocket support). + +Javascript doesn't have a bytearray type, so what you get out of +a WebSocket object is just Javascript strings. Javascript has UTF-16 +unicode strings and anything sent through the WebSocket gets converted +to UTF-8 and vice-versa. So, one additional (and necessary) function +of websockify is base64 encoding/decoding what is sent to/from the +browser. + +Building web-socket-js emulator: + +cd include/web-socket-js/flash-src +mxmlc -static-link-runtime-shared-libraries WebSocketMain.as diff --git a/noVNC/docs/packaging.txt b/noVNC/docs/packaging.txt new file mode 100644 index 0000000..9552454 --- /dev/null +++ b/noVNC/docs/packaging.txt @@ -0,0 +1,23 @@ +noVNC packaging steps for Debian/Ubuntu: + +- Update the noVNC version in docs/VERSION and add a new entry for the + version in debian/changelog + +- Rename the novnc source directory to match the form "novnc-VERSION". + +- In the novnc source directory, run the packaging command: + + debuild -I -uc -us + + - The -I option ignores the .git directory when generating the + source tarball. + - the -uc and -us may be omitted in order to create a signed + package. + + - Alternatively, use pbuilder instead of debuild in order to build + for other distributions and to guarantee a sanitized package. + +- Verify the package and then commit the changes to docs/VERSION and + debian/changelog. + +- Upload the new package file(s). diff --git a/noVNC/docs/release.txt b/noVNC/docs/release.txt new file mode 100644 index 0000000..596482c --- /dev/null +++ b/noVNC/docs/release.txt @@ -0,0 +1,9 @@ +- Update and commit docs/VERSION and debian/changelog +- Create version tag and tarball from tag + WVER=0.3 + git tag v${WVER} + git push origin master + git push origin v${WVER} + git archive --format=tar --prefix=novnc-${WVER}/ v${WVER} > novnc-${WVER}.tar + gzip novnc-${WVER}.tar +- Upload tarball to repo diff --git a/noVNC/docs/rfb_notes b/noVNC/docs/rfb_notes new file mode 100644 index 0000000..643e16c --- /dev/null +++ b/noVNC/docs/rfb_notes @@ -0,0 +1,147 @@ +5.1.1 ProtocolVersion: 12, 12 bytes + + - Sent by server, max supported + 12 ascii - "RFB 003.008\n" + - Response by client, version to use + 12 ascii - "RFB 003.003\n" + +5.1.2 Authentication: >=4, [16, 4] bytes + + - Sent by server + CARD32 - authentication-scheme + 0 - connection failed + CARD32 - length + length - reason + 1 - no authentication + + 2 - VNC authentication + 16 CARD8 - challenge (random bytes) + + - Response by client (if VNC authentication) + 16 CARD8 - client encrypts the challenge with DES, using user + password as key, sends resulting 16 byte response + + - Response by server (if VNC authentication) + CARD32 - 0 - OK + 1 - failed + 2 - too-many + +5.1.3 ClientInitialisation: 1 byte + - Sent by client + CARD8 - shared-flag, 0 exclusive, non-zero shared + +5.1.4 ServerInitialisation: >=24 bytes + - Sent by server + CARD16 - framebuffer-width + CARD16 - framebuffer-height + 16 byte PIXEL_FORMAT - server-pixel-format + CARD8 - bits-per-pixel + CARD8 - depth + CARD8 - big-endian-flag, non-zero is big endian + CARD8 - true-color-flag, non-zero then next 6 apply + CARD16 - red-max + CARD16 - green-max + CARD16 - blue-max + CARD8 - red-shift + CARD8 - green-shift + CARD8 - blue-shift + 3 bytes - padding + CARD32 - name-length + + CARD8[length] - name-string + + + +Client to Server Messages: + +5.2.1 SetPixelFormat: 20 bytes + CARD8: 0 - message-type + ... + +5.2.2 FixColourMapEntries: >=6 bytes + CARD8: 1 - message-type + ... + +5.2.3 SetEncodings: >=8 bytes + CARD8: 2 - message-type + CARD8 - padding + CARD16 - numer-of-encodings + + CARD32 - encoding-type in preference order + 0 - raw + 1 - copy-rectangle + 2 - RRE + 4 - CoRRE + 5 - hextile + +5.2.4 FramebufferUpdateRequest (10 bytes) + CARD8: 3 - message-type + CARD8 - incremental (0 for full-update, non-zero for incremental) + CARD16 - x-position + CARD16 - y-position + CARD16 - width + CARD16 - height + + +5.2.5 KeyEvent: 8 bytes + CARD8: 4 - message-type + CARD8 - down-flag + 2 bytes - padding + CARD32 - key (X-Windows keysym values) + +5.2.6 PointerEvent: 6 bytes + CARD8: 5 - message-type + CARD8 - button-mask + CARD16 - x-position + CARD16 - y-position + +5.2.7 ClientCutText: >=9 bytes + CARD8: 6 - message-type + ... + + +Server to Client Messages: + +5.3.1 FramebufferUpdate + CARD8: 0 - message-type + 1 byte - padding + CARD16 - number-of-rectangles + + CARD16 - x-position + CARD16 - y-position + CARD16 - width + CARD16 - height + CARD16 - encoding-type: + 0 - raw + 1 - copy rectangle + 2 - RRE + 4 - CoRRE + 5 - hextile + + raw: + - width x height pixel values + + copy rectangle: + CARD16 - src-x-position + CARD16 - src-y-position + + RRE: + CARD32 - N number-of-subrectangles + Nxd bytes - background-pixel-value (d bits-per-pixel) + + ... + +5.3.2 SetColourMapEntries (no support) + CARD8: 1 - message-type + ... + +5.3.3 Bell + CARD8: 2 - message-type + +5.3.4 ServerCutText + CARD8: 3 - message-type + + + + + diff --git a/noVNC/docs/rfbproto-3.3.pdf b/noVNC/docs/rfbproto-3.3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..56b876436a9b18e3fbc0001efa9c3dba498e3558 GIT binary patch literal 110778 zcmb4qW0Yn=v|Zb_rfu7{ZQK0XJ?&}Rw%yaVZQHi(%zMd8R#x&O`FC#JI(OAQ`&8Ac zy-$%Tii*=Q(KExtknJDLEWpDs6EYGy7+b@`@bbdLFvyzOTew&fa7 z5Hg6{8o8K>nwdD5n!&^H^TWe9y8z6L?BHP}!!I>902|^cJ{rm2z_EhX;3oEI=^A7g zRb3ZbRm3CZ^$&t7NxhncO{D0_eq#o0Th5@2K%=(S#67li7-2bQ3oR^L0}~ey4VVm` z;`J9B4=lto741SrPPgbTX zTJx&tFFq^Eq%(RtgWPLml7Ieg;5ScP`P@xB*)WP!!)GYzrzTmjS&*qL0}-NJA;SvE zWZy)a-{AcBr9*YxaoXp zYIu5CGH>8!1=7|a4{Sg5gsufK*g=QUoov~_jTDv1hf6xoYh_e?>#6xx(*1!ER-W(X zGl}7G-oZe*#RL!SxsnJ&T4<&>bkE+|tgb>2I$8s#Yikh(ngjU+8zUDr0zfUj;qRmg z<>3{CKn|hRWgJg-C%1y{=+d`F_Zn*;JiF%4(IjrQkB2XhU;Eu9c%}HyH2c2>tG;R= zX*1hXTLOsE2S^Oj^oiVSZ5=a3oQU??Hue*bIAUcqdk@>eQ9*dO-iI?0NrUTQY<9dG z5FEv1#CRZ+00_E7u-IY+-lLJQ2%`jLdH8Cas=Mimqdo>yd%$ksCwZOJP*h^u!b3qu z$&-kq?qj=OZY_Ud?N>%dHgsNGF+Uh&%Kcr{B=Gj6?gFIW^LruGO+#7p6;|0(#aqwT{!=|Ya?76wf@p2(suJuzl^2CdQ-sqOY-;aK+gQZkg zMMIe!@oCeh(%hi)Vm~4-wTQBzd`%nCXURnSyfUW1x(J&r5nM%t>bBADXPPRyI5(5t z03?GZi2Q|Gguh{KFAR6o!O30RI~et)d0}Lw%FfO5@0S2~mPKhy`L_B>7yeX4w?|eT zA3%e1LE~u;ZZ|NHP$#J&=t6$8{#w9GGr{4|XY|5dE zkuEye+Fd=Nhl0Pj0@?%Ri%sqwXpGa8;6ppsd8{?@psgI9?Ez@Fb0(usJ%r}TmfP~i zhA{5vkUud3#0MCOxkBx#bh>(!*{Z8rw~hnea39klCnOqftMhrBK((CBsXS3om|m;j z^WJRub=1$ch(lOj5(UUb`$*~3GxQCfsHgneP{!LquWc-wESoDu^EGo%qnz?@f$T({ zR?LdemRs}FbNL5@S|)S7M7Ukj?_~5TH^(-zHEtdOldL3870O_9T?@xbL&g4#foOER ziiVE|76jdV^b46??uy10;Jzyk74@3#k;|SC+}>L3&7QK+oL%c%^4~u)$y-ItT?D{= zx@suorIeK!W*y0{H-{wzOl0nssI`)Ys0^>O@7icuJ(Rk4P4zLzt-)&q2uU8$)xZSp z*~a}AM*>v9J3fhajK!~gC?KuPn4(zV*rBkzLW%)x+JWg48jb|NQ{!>){r-^lAKZsJ zuz<{HIMfeZBlr70={-MRr84|X_!*)D{cLl8V<=(l(vrNDe_IBcLiXxR?1!N}g*v)9L zp>K;SQPEx1GKk+gVypili@@oczaLLhpGsaf*9p)mbvySns3i*J`AJA zAzw+7S_vFxYGuiUyLn}O^nt5U`dlk9s$Y#kTC=;-iJQH&+6go@BReWGmE@D6)!{zx zi|&>fwpv;ZKeUt^7X*zjEOyg2NK2VtGDizMaUyP2VO>5}e(7YDM_cEO{94WjcGlXaI6tg3Twsq-KTSsJ2dld2Qqg=3iMBhElCYtgPyMl2~lS4p1Lth`C;za8f zKvR?P9fWUfZCowuIdJ`zamLT`3nT}=-}^g@tZ z(2%{&jz3O}hW?z<4PqehnTJ?G{tS(gh3KtG6*f;CPL&i!p@l=^ygcWm4$(D)p z7eUydh+|{n(KRi+TXSNJ0DC}C1oHG5j-EcSa4K0oz?Il8<_MaCz`v?$f5sb1a%qp~ zp*oX6u=o}IkD;3w-Z&O#D?fL;kzsq@jAcSxfw}v%&Wvxd#!snmP`}k&wA+()2UKt91KUYWLrhMF{G@vG9H^PKuH!Y*S!aGJV*QugEG=MoPMN2A=F(wEF;C+~tQu&V~#lHwoRWY|7d^^gU_xcfgP#TT_lA{68SDOHLdc=cmh7$XMV*lU2FrC?O;cg2EbPm$54=3%gc%zoDW(8s)IYd7THg zry*J>8ZCr7a1VnlN7;^E=i=p1PMusNn>9HA#9Z2mjMFh~f0Es_^_VT+2lk^xpeE%) zIQw)FrdFIa6r44(^R83(EF_mqyJu9`F5%ftkL-#0aQmY!p~w7n5(c7!5!#AvwYjZ_ zGU6e_>oQ!3AQBKT)~)pHN_BfE>t1s5!*^rY)OSbgK7=xcGbm$7R9$s=Kmn{2=-5y9 zggCb{YIk57n@^uH1|&=Qi2uG2!~{`~ps|kaYEQG2Y=-AwYQx-H7^F7ih$@LO#%uQP zhrpbDsx5?LGQ5!BJ;^^ThVstlPVvjd<^N@ga>&}8`f#CxuwLTaDeef8M<(3et61*| z+mRSy_KieY#Q|0MqNTL8K0v5c4Ajkvos$%*^uohCR+WT8`41b_0G#T-Im&VlV0{xO z@+ct(#QgsAQNIPO2^4c!FZW#U5Ql<#U~xMP7pgi z>KAs(8xv!@Cb4#Ll5wXkzK2!z2R+6qK3hqU;@Kj&;WrwvXhBY-ie(JN!ewRq{r84=; zu3PzQWKCiFP+F9V0fe-6Fp10-E;Z#0lPn7OW{49D@8PzHLuqCpmZrnk3@;`bVeMWF zno(W(78995CO168QU{-I6m3s}0n?lHE$eZS#Ul2$y%+MQCUY^ihDxu0Ep#m3+{@Ov zm~d^gvCYk{uP5B9>_xqf*g_XV6~lO7Z@qGgeIO^lay;EKE=qZqmapCqLWpJJDO)tz z^Rx5Zn58Rl)9ma_0Ah58;B{Hju2H0+8C|gd;ux-Ep5kWEY+~1?2?xX-yqqHD0~TJi za7%A(6TV8Ej<2dy3J#cFt#4u?YEy4v$Lk435dAfiCAV3|3tJwfmIGhWh5Ij_ZTafQ z*8+AFK=C{1SIAFJXxIM$F|K8~>D#u-*S+Pq#35a~<@IG{?>vsb6WQ^2vJo3mQ`5lK=t!pTK5jqru^eqR*jiW z6EN|w7jig*FroQ5n$zwk$e96oqm{hX-;CHc*;pp|XW#!qdKHSX3K_@64SikF4)KK0 z&{xDsKYIQ#$HnOj!iG_R2jhkDgcj*T5z8&d5o}UueKKVG*VQ^JxPGhj3aqzituSXA zNzD9;cTi^k-5m?|_#d8I^-Xp87-Y|h`i~+$GX*gYbI;Yh;`U(hI}l6T(Px$yn~F4k zU$d|hKqO$PZO1|Hj4(bH!1{F@?JtHmRg(0hnJw((!Ye}2ih6Z334AM2ae5XU{Qwop zoT&c^;QW6Am>N@oH;E;*f63YjJC2dVn^3<1!ewT=wVuYPd!UV5S9>qE_(0p33cgo# zh($dGF|{4}FBdljX&g*;5MzOg&Oi2$#EGtHdu5K-M=&=$RAK%zYy;9`q*ua}a5;D3X?WCDL4kMUY zlM2XUX|}bK1f1uoHgTp%L~5oAqFvr}Xpie7tSZiME&G2elVIUjEyQ?z< zx73XobD@hifKWjDRpF<%$@TpiK9K0;7`yNz+RDaHMKGHi=PqaRJj|4sHx=f0GMuj? zXBRY_bp|wyFa+qT_B{haKDf;sA~P}UXI$YQS%Bj2M7;R{*&GFw-|UjD=0ux0q+dkV zKUb2;n?5p6Z=?-Jsvx`!sGxH9tECgV9BNX#rhk`xz}ls+K<)TBLTCFamLig0(84vs zqu@XBDHT)^2mS1!RrVt7#TIM$ia&zncrVZ z3=1Y|qiE;IqQ&I)H1#SZ!6}TL9{DmMOY#zD3g{RZ4TFB`AYTU6`f_Y9{G+v?Lt< z2BFKZTkG^L=2=Dkk%)MvTHo0u7{g9*{v_V5DPm)_Jm69QAQwcy@h+}v>Sno3tz#l4 zN_tB8oNY%;?i*Q;mceY0(W(lts68El%FX#1nGR|c>Cj1a-;IT`RoX zuxvQ(EyU^xiRh&jGNgM!f{Zfq_~p`y?E&MVk>cS_+D+uWMPwMX0xzsp2(3B_A`NOg z3UvGE%s6F%Y9&QS$rbNzO2N`k4?|x>8F@RqCN><1r{y2jg`RFNDsI@bAZO~SM=TRa z&b$=_K+^&gghyrB5?3m9&VLMJAv)Wy!ecrfGLNqZ(BaqB{A#b7@Q5dcDG6I#iUcD! z@klk7J)-Sus$c6IjtFjwg7CyJ8VeLGDASfSKJ)^in~3|A4CK~D1OA0PY*y2P7 zfHr82zq|i)Bs3=glCleCx%o3TYu;l-??LM_Ni4Wzt25-;w$6@1FKx8z5ia|?bZQLn zhUY%+1o>qKS3?!_gGto?=Hn3%N9>enIs9WiQp2TTl#2o#W9%?8uu;rPvyR1G0hpO%7fg4k`Zzex&m4iN@CEI#V4H!t?_6HTdH{)beN>G{wt2K@3eTc_SaM=3h6@p^$3 z9UcRCj5q%0f|dx>c6=;s%$Uvkq2(YFFF>&S&z!5?NG~;W&k{~GUMzD>QoCPdIQk70#KTS9_K7#so z9DM?WeqJyUd?<7b( zTK&c_vgi%)JtFrrP=5dQnpcgmaW5A*fSOgn@qD^0 z&Du)Y`>sOUH(^+%bg*+>1GTP zpuA0=(q9TSONdhOT&MB7Tw6Lo=JdqNt=_*yuXE!t;c;{-ze69cg5t z=ZjvL64%ROF8xj)#7jw9>0uu!0^oa!t@xrCXJ-T9+lWZD6Di|DPbecwIX-B z&qNu=#aySnQAo4k?xks=PNUFbJZ@c8;Vh{G=&=(;00c3W9e|k0>}@y2)<_Qc08WnE zpq*iUw!NA-M~*Y!oRgLZaQ9`sW0n&08;>mGS)4gh5=;*9$|>eyPFfi5cizz80j>t=H?uwG^BZ(WSSj3?g`bu1N(tRH2(Q+qJ0MQbypa~ zGerBkGq;NKD~dJS_7TdkS(Q4cfxos_OKu{$H#jO&7owxt&h=T6x(aFi6X6ecu0Qi- zOjNHYHC!}p<=ECq$T2EBjT~qb^A?HselMaN;yf6SH6Hiq4-w`MO5%*m*jISwEGHUY3 z+ny*I#v2uCFkvCAicaIjfnJG*1QHK4IsT6bq?H~+L>AgUefDHTbM91mC;{Y@mHkS( zlhK>ymCh}mIDL*o+#T#ImU0EY{hxlf=`!muDbB5E^z7cgoD7`(<+=>oKjAnX(V$5| zV@F9O>LFI|6vuHm`MkjfzpboQSG@M|&@gJ4+>=9R+V7WZlI%nsjwfajm|0Cg0=h_pso^%mI8zV@j#o^E7rqwvvmjXiNTAOk?9nr2LYjYu$v2R>G!ztdTpw^ z{ZePM?z35X+M~#0@_qpCNMH=a0Mrixk}Sql4)I{H9%MC~=33^6-7?x+v8|ozNCAza ziH*rzLO;Ga4(S1jxpIR+s*!%TKA|0J+|#}A^hchzo}4v(&gh}f()0xk9D>!94RVw6 z&g-@%=_FD?qH*I}n&+4v2q4sf=@NJtGkeqj(qsRb|EcA&{BNSJBEZ2!#mt3JhvA?2 zOUR&V=HWufAZ2G{VJ1wd_a8E^gS`vkf6Bk&%!I7}T$TT$k(H3`zf3kl_Wv^32|50| z`5!VcgP4blgo?{QarnQxOQK-`5=k4Qlo4mp3;FoYYs;`eaH*
  • soRRg(4fNFaOUHNL^!mU2PjY+6DhGfn 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 UdT@3HIk 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 literal 0 HcmV?d00001 diff --git a/noVNC/docs/rfbproto-3.8.pdf b/noVNC/docs/rfbproto-3.8.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8f0730fb7f947147e53d2a3eadd453408ab0ff05 GIT binary patch literal 143840 zcma&NQ;=xOvIW|7&WqD z&YYz3!lJZ{bSzM$BbPDxP^<(D1h$42P&_>J(k3=$PQMA*es&b;Ma`|8OdJU4MXd~+ zOoUC0Y>iELd7&Jg983(Xq1-aBG$kC3Sz&nXF7)nX6Y)j(XeKhE8LWT@(Axh1+d)V` z=s2Op<0bpXbUJC(ygQpJ_9BEYE-G*O)YF_L7`wj~EdV=leOCC&(V5=h1Ydu+6nDhD ze7|0%U>XNhe{r^*Zfh|pToS;5WnQ51O^@rJMur8#Hb3}(YhI$EH`p%a=P-Nz)sK2B zTj3d1x;?MV!Il!@uZTtphJ)h~el&P9pos^3)XmESIG399c1&6mCMj7?>kxn`tj2mq zwyC!h)_tmmVvG&BLC-;<)h9S1utWsI?>sv`1*@WTiCCcFT?d>~cTT|IH1m?5m|W0j zIcI||t^%Csx9W&_P{x~$ZLchkR}eEi3?q>E1Gq?If_pYPNKnFKjp8s~vFzPuO?K2< zD?#k!$iG~B>fl6HocK_gt~}FLhWmS@*NbjljtWiuTqB#WU7SRP7k4Tra^i5?EhCaU zhQ-fW{jg3RKtz~_1(c7C+(bTeAv#a!*=s;FUzsk;-* zWs3=c-ya}sF64vKcQ?(rgym1AeHfwnH;sLmIZ&J_@Af&Ca#zWPw$kk@|1E6))v%U< zZ7VWulrUnfF}2YLA?6M1xW0PYY?iC&3@o5@rb*jJNR$NUphm6clPXH-4;?+Qd^lyV zFs>PM03%uUVJ6<++&G=l864iku=ZA3PRMn?LQwqJKwAtp^dEaptO%z#DFEk*3WRm| zWeVhx^SHy?4LyRZY{l&lfa9O2qVo->pUBV+;egF(Q8|r;$69g7Q{qL`d(o}SFP2d- z1@9>k$Dhi%lDE$p2}MoTIkW-;m6{?yD^S4scO`}S$BpOpA>RX3hr5}$u}SNZaHMI9 z7ZPOF$A|%NR}%rH1r!%@37s7Aku^l_B{YN(0!|WhlnfXkSL^u!mRQN9gu6{AyyG_t z*~qc;**JxYDLdl!diRrxwRkdUx8GC+_{a?}f0dSmg)FV#r8}jW*kff?O~NW1j<%f< zGEH_LvRjYk27-vZ-w8%fRisAEts-U=;n0#x5fNtuSDrj_Y=B~$KlMzVa8>~6W(b<3 z6Wx?>MzN-=wQ1!oHlbKKZ?@pGP9de%OBUE~>npGwg~in?##Hzysz`L7-&7JOuIQO0tRJxH-TX z;UIU*T1#{Z0c3;Sts(6N!iodbgW#P9O}3=Vpn2&;{H#&G_77_SjDPZP?EK|L8UNBk zxYk`*Zq?Hoe@FRR=>{8>&G-5OQ3-&CsU8iDP#nNG`jAp$vY>j^gH?KTI8h;j|NFL3 zL1MDzUE=t4bP#6li=5F-e_y&SsLd$P#dMyy82x-kOM#uPhP3)2bTnhLM`BNm!L@gD zZSltB8qviN)@QpGnSqxQTP{+yE5j2Pi!c1Hsd8jSbI5D0yyQ`F(J0?o@5ZK|r_KNU zdk5h9x>+wfw~q9*gy>*gX4at#<&Pfia|`E@lNBXCFz_1Z4twq00_e7blPFQNLU#Dp?5aNpPZxGSaLX<*vKf^8&Q4aI*h^PGorJ1J z&yzm*JR9En9-b_M6&7BH79SsjCohA2@hrvY{BxP={^rvOy(`z zfomsm&TPXR-Qb(ItHliQ4F`%*L+psycj|3Smd+D+#F`rO#I8%v6u;I6AOak(3wq`` zEsW1bUAnjTEhc2@G%QL$#62#gAAY0+&LqM-=ch>b?h>#TAgm3XJ+aXdV@xA(0NKWr zeJI!Ic~y?_N7hPS=JGQ4xRcJ<5MWWpX2T}zS@U=Ea%5k*?OW-BCv4&lXo$0WO&`9v zB1%q^EVo{nJzyIZ1BiO03RvMo&pBH*7I%)K^t{}M8_)0UQX=ZvWlsS6au}L&@AxL-N*UlUtT^yyk|`Y2&zi*D50I@1hQu z$CbjNkB`06bK=pHHKx8m0Ju$!CN{?ZZQ(yp|Fr#on*Bd3BPTmM)PMIF+5gv_fRW?> zbSX&RvE5)p7}@z$JB_0vi01k7xk|TLZLgZzOo8(}oo8b(rI$Id(fNMEBOT(JkG}*F zwQLDM42qXS8JgL;n@FgE?lU3WFZuNS!Q1sZd?F)_!l$=qV(n3S8BFB;#!!VPvmlPX z@US0>;@H+S0NgeySw>Ek8#8>0lagg6m^mBzD&p1R3H-eqMLRe*%b>?VDFAG5wMNHL zSM@jGaDbtij23oYh_p|PbsjJU@ptC;A`Cn@K|thyWws33I%RdE%m|Q)gLzS}Jr50) zNoxyO&JC*O+H|-*E_|fC=z%{CH6#&S5w7U_&;^Hb6nxq08zm;bmKR0QF)xOkb#lx_ zL%)`b$n_(gE+nBFPmhO0I}Npwl^4|T1k}u3uC^5xPIvoVPNHAhw0cz4DFzUOib6=mqRv@)u;A_|nAt!)2W8hO{W4-tl(4tdhKnToPx`+QDmFHQ zvHPxp>y7}}Sdthw1d$C2#*Bs_@@9-LI1K6>eUSoeT%}Y->_n7tkdI^c^99zx^1EevS#4MVaP1JEth|G*FQ+jV zpz7BRH@LaR@8)-H)!sCF=2#P&$JV8fwA$CPPFn3O?ql%2?aF*ft`UuTMt;4q>y+ef zQPJMkE$%ffkL^EmlV}Qh=5%3b0Gwu9O2AXtjX$JdwZ$pGBHJZeQv+5m%vMuA^4fex zyG;;HVf)S5ezd@GT~=)&9U416)e=i7K0AcTouGn)lk-}Nv1Mw73OhY7$%FmX08+S# z-l#+EV*U+m72*SJquvWj-L^S@hP2c3ZA9Pn%zDuUDT$L5SJh^lj+I!t*r!elURK(E*n~0P*fB*9C z)Q2+s*?>h$9h~?j2z8l#55ajvC$UF-w`9$P(J~Ix3e{9_#r3 z{#WAXQz2zBc~Whlhh7yx82i?13UU%Gn%SXa-rIe2-Nly6KDclrUw*_FSwH1u&sfrh z@~W%#n-q2P%j(?@#2>rGZ6bg07mG~7jlQfYvzglmNW$!U_Wz}P|4Q1w(#Ocb^gq(a z#Pq+UkBRyJBz@i+(Z(b8xrCQWzuuss)SRt>NIU#Wtt&JM^{4YI<49DIs$zyTYbEX&l4Nn#;i5Z}#(isL##DBy`mxjnvZn95_D@ zoZ+8TaPfFxG|X5eNi@!Yr>7e-Hqe|p&S4jh^%dTn*Q5isp`&!@Yf+Q{B>F4V(}v&y z9a%fIuxaf`p>%hjkI?BIjxwdH(cliI2=ItFZjFbYwvY{oe@n}jqsJgm1=_n(c*UGZ z3~b6aBff!+6P8JKv>5rja+7Ixd+;+yvd6a@V$$A}y+cibMHl1Bg~8S(qy~cg zorM8`G&;HbEqB+O-<%}GKYv&b2L$()({aYWOvTol6?mK&*c~e0!2mPJ?Lv^2c5O}gEv88P?hQC15qX_ zRk_%2ncw?~dQ8PFSU8KM$XZ1~(2iZ63R1+D)F!WMpsUeI3E@oluv~p^6sVI=`-+&* zHb9Y7*c%HPFd(+VcbRC5HNU2*`{NQ1g#1?wi*7pWV$Ky6xz32U&sy$Bb_sk_mC>w>2eHEnvFK z6?Bdj+1fM-XqL}R%v4-1Gl|fArZ6m_*4=D%iC&`$4Rw(C6wD~J zA3b9^X_UDlJ@%#%X(+(80hR<#<7F&NALH_$03^OQ?65l;8C>PGa6+!VCCgab>W0$e zchReuw2|_#1*QdOTYdoO^d~R#LMFXaxg+(=H?bv>gh)@~BfX|;7#7Ikzaq_uB?%Hc z;i%aBJh?*oYav7aC6Ng;Z9c5>UW0IhQVFZ>fDDi2{EUQJt>(vxk6RGy>Xw+2yQBgD zBb>1~_09lGCnq+t?;O8=m3?}iFso^?Ma~I;etsGcp~)dScIjG$Tc{8$PGEci6%;ha z8astx|3We%QyEU06i@ZC?dLgQjHH?%x?#MaC{y2L&WEHyDk)Vq;;xhkHn6iT3QV8L z^+|t>YCqPs1P#Xr&S0Dq^qO{Q4WDMhs1>!2(iShMRt~#XzG4>krAY1_?OtI#a<6($ zJ*G)K3ju{)w~V==_X`>JL}yncsjN2%4cFpd~r4m>%j z4HR-N+ndnr5)7IhvK^R-Ae773IB80P6W6i5nF;o}6@BevIu3J^%3gG@wpn)Z;czMg zISq&kq-{0EM>_`tx@c01RV6%)4X`a0towWlwT4y`OK%ydTHhZSb0NNbk*DYtVj$=wCbuhnM4P3o;>y76>~e7p3D$Uk3p4&C zA)W9N0i=$ARuZUdK;IF#akQqrW&lAORj`pv(N&}^2(1AW{XXZgHg#}D1tPKZe9Cn>}t9 zW>ziUuFm^L;CbIpjodzlcD}9xzag_NA9o8<-d94CdOl=cp7p-& z^}cV%^gj0zc6NPzBEMfN_&&J5PL$xk?%)V_JZ?+A{bS+1GHktTsCSNQejUzqPu1`o z=7oG@gk;8i(J%99eqJU#(koPSq41~t8Dl@=-$I#{DAB*;=a$+OGA??MK*jKHSORz< z?h~I@0Qk7^l>~k1;d_g4PM=dy^l;kjl9nK?_mqfrb);9Yb~u^6rw@wt3jk^E)9nW>-+f$b9qy0-nX5yQ-ssn6m;=B82 zv7Y?qEoJo8YOq%^`nqVp%dwp7DaYok#QxUWdI{P4V%P*6Anmiw)N^y9`n5>e4#guT zDwp2b7-60^n@-O!NPe@_yM}R78jRN00c{=V8WWr51N-P7+G&Z;)SSq{qK9Mp-cQa) zI!Pv~wR{1<0CA>$pDIM827UegMHVwK=&|mlm?J$p2ttO;WC$f83!bNGtG>8Y`6#OD z!mv=2$BUrAkb`J6ajfKPpL$gh@J*#OU$>n)gHiZ!d{F$n>?IoZSonI#8!Ydn85|n{ z?FXl5-c@FW&ahTiANb!;USTk`7<0}e2DJ4i3iZYkDbLhxr_3Pct#}nt9~hs4URPV1 z@iL-DGNx=hMZdYvnJDgCwgq`_o9&OP_Gh;7@I0hat#!>m2qZEWUpC1R>l1GO2t!D8 z0OW;Rh-8pyAPeiFG+nL8Ew zf-H9Yhp%I;f7iTo#_qF!L&%tkt@}w!MsW6V zhgw4W z>moQ2)G@Q6)oWta*FM9B+K7gf(tN{qW^$wem*;%?--BN)IR=KmOn8gr$VgOhj}H%v zLB)$6o9lIY2i0+e=H80+guDrea9&e?!mxK1WLQYKBO^T3__yTl4+=Nde=*6H6OI$! zNd&DdkZ{J79ed*ll`qmNtg{ne>ERr`_d4Eg z+swLHa|p#xro?)Bw7`F`bU2Y|vtacG2#reA--F#BAwnZeAqd0P(;G$>s>|+F&IBFR z9!d7kEB*M|$VE(cXnM;Su)0x3HMu4Agg1Y+y;vI7&nj~UCwEZAc+*{Mk4acKgJMxB zqAEnomJe^TVUCr|QtDGvJ<*m{U2MBrWnw^4DHXzI?l;7IWDjZEZri1tks0x|#5AgH z9%9*Ml1<8Aa~}X0`u6=+{;r`orErm3ajT=kr-vZ%*|SfV0UqDpR}O2$O3 zI_GMJfe}Ha>Kcx$UG!Mm!7=qLc`IaMr~S6BTfwMwtmam0-U46wB`sS*JD{4uA}-NF z$fuGu#b3%*B3Y3?tvY;gTRE-sZ;AmXk(dT$kVe+(S!Y?2G54EJA1xvVMzzzL!(~jP zHwh*%KgluCYb0F|llG;bCPIyy5+reDj5EL&8dj7#Zq%9RQXr3+?fTu0s&Z5x*GW5WhnU0^17}us+`RRuYdz#^;d*hP^10Op`#1Ua zV0^dHM6bMZo}$GhgjAi_=afM+yKTS4jIY)eBiKcyNv4|ROIK~Ay#trd*I-6$PQ^1s zk@{~|V8Zjv3+qs>5~{@fY3qOMAc(k_iikE*+QT{d~kttvI^;og^A3%oFr3)9KOn%^aN>T#;ZwkK$Gite3xR)9Z+s4o6tn(nqZSFipp!h^MRpq3n{U z%yH#kIP@`pyqsefFI!IiMXOplf3bze`H7eC)hX1@7rC{-%GwTft8O1( zjcrVmm0yw{i5K76ca@}FZg`(1b9Y??k#_MP-j`wi0Lv-=53pJ1JjRZ!DyBWOI2Zv= zHaVhO1slX6VP}`va}aq>*6M_blCB;QOGnymicXx%LkK!H-2V_=Wh=sE1kr`P0MX0) zMp-Amq}arF&$O|FFpHKY;dzV(?8igK^p6Kzb+Sb0KmU55PjKekN>X-e`%e_kJ8QUN zt6OfWw^M&*i%88axSr5$csj7>H5$ZKOrQH`ME{9mk|K|7Xmm;NSK+*gk_Ks;N93u) ze+Yh#*T5ZJ+c6fod*N}?9?!yx`wq>Xwgr2poh4YktHBiETB?LGbhXwJg(~Wln2Nkm6MRlub@*0$`Fb6%p2Hon8*Lxf3^SEZ}c#A zw{4e&im z%-eiW`X4k~D=dGGdzt({$GydhM|H$Ui;@N8EK{R!qx3ph?y!OoM z0iyOw@^**pi&Zr~SYef|D(4?UwpgNiF?T5qNoS`ge+F+fUH@^Krnx`T{12V}8aQ&f z$?&13>+O#7p=v$_k8`$IF>&c}C;&_RLS$xJl!Pn^?0$~LTEeIvzgCbrWEg_Ic)arMO@jW9rEppT||axZ`{#1vE}T7ve9*Y5WL z!FlcDPnx5f#r*R{46kBZ*gPlVU);o>rP2s}SvPfKsfrmej67Ss$g^KN*+V;Y{jTB#p&&U3hWC(|Zd{TYg28_2mBcpIo# z3Jf6-tb7mTQ$qk1ieOcLcLAD|yrW(DdADWpaC-p15|h2{_4)UB|NOhs#|6~jTiJv^ z^S8NIdvs47jItnqm7z^_r#P(%gijk~JIYb)YWugH(6);_jd|L>JUHOfP1#y=@q?Q@K4J?4HJausqlMIV7q$^C5G<3x!}(>T&FF z%V7+0RZzyElX9L@tESYQ@fB+?IA{kd8DJq~l43Y#cTzM@NYeTvl|UgVJ)$nl7{aV8 z^$KKBW53yGn5joM-Oawps1KT9=16jFp?8}wDIYj*^~1EzzOx*GJqw~4mK6yWeobGZ z-0CF!z8ALra`ztiT36F$G`*4GqOx|;%Lc!EVL~86BBA0#FK9}C$jiqh@(Cgl?18;1 z5kEJe{g2p4T6-lY1iE^4)0vnc*5?HC+W?9t5v-AlQoVB4+Gly2?mNj57|=kPU|ABS zX9v3D>(qS`%(W!`w%+3lz0nzTb;2g=nvCxE?L-t84GFM^#c)*^#}K8ny}ZfxVhCU z*8_IP%0~hCOb@ZZ9~1z0@#NqW;sPWeffO-RYPb8+eMd|cphE>v5HV5IGz#Dd?Gyhw z1?>YOb*vr`idO|#eo#9YrI19XQp$6qNs4>N=@=rAKd}}(pA3m3GwQvs?$BmbR}ZWR%Eo0~b7BxY_4-E$hOHzs zG?Q*X{50bfM8aC#tfg&$q%?mzt%cL??%F$PQ32jD{QwzXj*{Rs(bZJq_jv`?tJ ziBmj*AO^%S78sDn{^C@Af!k-%R@>#`JWD@#i%h#Ynr`-$W3X#}s+yX-(P;IJ$@Uqm zH%VAjnfVoTq=uS7(heN2)FuCBe$lOF(Wgr1B%3p3S&z~+>lX)&9veS_?fjNxJ ztYHS4@Dd(H*=K$Vr8z{a?%Tz}n#oW3<+1O?7b2Va)q%?ZQ9F?a{3qtAqlDh(0Wc6E z`C$r5^$+29z0#;|uykOmAO@rff%YIYol?iV!q9{l(_pD`wBqn>^rtsyIFs|rq@j&^ zs_ZDlnd_CWQ%!^n*H$|M5--`jNyi!Z00;V=>j;yvVx!V1`Mk!)TvRUOp)7q!23-he zC1k%_Z~7aAnFjAQXEsq3p;D3ftuqy*EX4s!EZ`00Vg?F2qaEUbZygPF2N@j&X6G9AhP0*eFCrz#X0#_ z?m4FTl^0!NW3GUPsv(kO^DFcm$=^A`49uK4bxXP^L4n)ql0HC)aB2qGnboD2^90 zAoi@n$Jo9IvPou$D!ZTnmMO@bd&LeMVZ4O9-B~^bH^JWJp)>cc02cWCE?&B z$YbLLhzxS(0O<}!8^Rf>g({t2&{t(oPzi7_-h(zUPIcNuulMyi9UvIw@SG77^_fnS z{LL~^5JKQ*e0-TN)Yq?#U!>rNk8WruWBn7C{VFs4&35t97#Qf#hR0bD76bshz9?s5 z_RNxuv=G=qWMYHmw<|F#i#j;BD_M$qrvlmKww+| zT2Z1gJ|RmVgA!`=xo)31L93e=hOv?0%U5rKUlm}}AD;-Em3&@KT7 z=bp$qVPcKWCtD=JAp-RcL(ON$;@9jx42!K$K z#sWmey|O!B{m4~(qN^UUVFY+%eJn#5{IS6)@J$hW8e@N%U!uad(suV1j5bKx5DG-r zo#J6+OI!A^ht1qt$ z#(wyzpNg34-dcRG0lKQG-E`JEHDU*@GBGdcuhH*DqHBTjJN+t%3g#Gc{@%E#ii!gc z1PBVgKbD~YEdo`TLM4vL%5B&Thsw=RR1-pta5TmrNRn9)g|2eBt!JM#_$3mB2)-@2 z3UT#Me}TS-&(6v)H7_*CF%-xo%C++TGzNUdFVvmeuo-@|kL~2Nd7^|UjQa)|k9dM~ ziNP$!-+KYTvF0;VpgYNJqqN%VA>kP3_S!j{Mu0tN%@D1Tk7u+X4UlMTutY&}c~+49 z&;!XwX<;b2h6c!ZcfvT3KyZjc%7c*Rb}$Zg_msQ^PWu(X|8y|F8nGfdbzv_7Mn%dQ zCUfr~65VGIB+&%B;yJSNGfo-^BQ|&+UMmV&wpM*KMO=2;ODvoleixW}-Huq8y^YY; zekyJx_laHQ1tm|gTvvr^umw;$Mmgy3Uq&;#ZZ|)hlS4&88T+2hm`Ghrj;%e$$X___ z1H_Z1fqU)uT~TWDMb~GXNVj=hf~`Bm(-2;%6d?V?NTD!=H^?Jpp1%Sf*kG;?T5meF z{1CGRnuAcau{a_&KwIVP!m9f6>E}v>z8oHnn_h>eCN@%5=%0(^?V}P?!U7lr^Q5Cy zSYu-oMw@QI9l<1gn%&(1m5y*gLZ?R1Q;7sh%!>G(6KB2g>&s2F%d~^zGEwMM)8<$%~9I8I2@aV2-YSG_2I& z6#FW`N@Vf5nCY&oF^cl5Yj>BQi540DUt@_3JwvO%2&T9FG zcF@m}eS8f^5vSQ0rnm8vM`Z)f9K+@Y5ddcWEYRk`A!pU(nQE z>pxv9p*JMC^BIyspSf*{_Ds^`-sF;sD+`u5Aw%Z~{keGVA{O4Qy&bP6`0|*LJgifC-on&#AStzRi$aYVYE#8 zH@kA1RvGZTk`>vRR$eV^fT%Pp>qX%@TZxrV!N{T+BP#rgeP7APxC6tF06 z`~KEyY>3G%!D7E8Tfxc0Hu0b_qv5j+h)^S)Qia@%2n@ZP?3s*EkVARUoQ)EVt*Uy7 ztuq*2;FKa7*Z6kN_$A}JAyVY(TmI)1ZCZtg2?AA0mKlp^=|#o@eEF1vX2*SO9zr%i zA8AUf>5HRn%XuYEEg`ohtiIkwbm2C^kfi@s7zZ81TAEEV&O@H0M9lUw{gQQ` zl}5>ire$+$s z1AiKn~+aA z?o4X~UTjHYeM`k}Pb-?6TY_X6ycQXX7*eG+k{D&t@LNn#bU*nC5LUFsU>yd`Oy9c3 zxd(PnE|r!Pb+bp+VeC`M8<;!pC0!UjH=pM6^5exHFYGii+7|n6uN+s0VBD8U>b}Lc zOf%yfO&P7Ld%BxLw%bKYQ;$~E^&x{Qr3y$4%X!_aqoAS-o%Nv`4{1{#w*ZUKeW+3u ze##IoPJOE>n&hMzI-q)CX)VKV$2-T>Ow%Y@%x7_-pl7^$#&@1E|` z$`V2Ss0kGCZ2BL6ToqgOFgKB5AlPhXv&rwf=f^jB)f3=4wJV*O$phTU`m)7}^{0E- z#%Ad46eq1!FfUYjyM>}(ZLf6q{@j@KU0>3XbF~+1z4sO44(Kek+Z<^+$1A)W1**}} z??DX^I%gJ^ErkM!*pt$?e?!-dv?3^O+NwnSs0pL#UutQ>B5e9X952yU2%8*01SJcr zpo{Zjq_JL`b^n&?ck1#_79}H~a3NKBU(Jc=v!e7ow$z?O+CawFd$^xOiQ6|FR@#nT zyCz-6StrE0mLD_=w&QNm67M~!>`qg9UOy$^M<(n{?IYM*)@BA*O>NTz%+YFq;x+Da z6V&3Ua|vuBLeku{zqzYK;rl3JKx81hG5fJ*9z%t;F~jqvX;&~aBMBS!#mo-@>BCSF za@0ZA?1e?_)~jgu2WyX039z2lZrqd`LGvW_J3$oyCp${a;XEc@>OWfvh?RGRgo?4` zLzj3g1O?vHR$j)?eu#?uE*@vBTs%vP^iVAby5Gz&q0l|3WQETQD9rTOoz}Z;%MQF; zfbPB2t+i#F9!*)hP<( zo;q`l?xLrtpBxZ`yp-*rF$5UkwF>c|WerltAo32qjKhSmAz&&6j@Zr%cTCaS(4}t4 z3JwHq6Y>5jQqR?1`2wss6p%378RJ6ZsFbASz{AFL9af0wEx$jS`lJFvOmIi`kW}?d zKVD?gH`_X6{Oa_d{Nf+DHM9g>@SOxi{Kb2-I>Jm@;5(o;dw$!HJ2S}27ZzxzA}X*H zt9aQJ#NJD8V3qk=jyyP$p}weYk`({`lshEGjtA5Njf&rKVUa0-FyYzVF+fMQ6~9tK zX7DU1P;F!!IG55FN+~$!WD_bxgV9}=vBnO0 zQfag7Z!|Y7EYcbNoMBcG=%6(QqOIv~LT}sVBAD!)^fWHS-cp8J)eOl#qE0L_x;4XL z0baaLo40^wz3MMMRL1zE|20qc@0{2_^JJXtjI96fJQ?TznkQps_`l4Pb!ltF;Izeo zx$OLrF5%mj%ZfD9%k3XgWQn)H;LINy{X5;{`+zU+_@8uP>%6Rt^OwiqoxKQD27uNjMXfFuZ{kql(v*7{o~#qgl|2A0!Jp^ateIQMQld_NH%8fUCs-c z-U0-HF0O3Lg)Q$GD7kAw(8#xI5bb2GN%PY|`xE!mvX0kf5XWZi2>$9?Cl3^G119hT zomIqNY`{p)&M~Em0dMWOwlx5IK{?*g#^wy+*bq6ZxR}<^KWTxSwKCqlbG-s)Qgk{t zD{Y+Kt|JVX^ntP)MH0F-Mz+N6^Xk*0(?Rdg7p5-{Pm!9{4>HmtmKE~CLwh@_s$B!b zkIZ(dcQW)C&*^7Sw={*`u;!(xz3bAB@`3m*opNf=^I~{*ov@@ zo^F%6UL4Ei0x_KaprpX2!sACI)`jv@iihU;EMB1#)ZVR~v_byc%)OP*URgP}G<_}< z-C2&?0kolp{T}XV$H4Zxhgqk_NftpQ-N~aii$bJ9Nxj zDe)4XQoN|);Y^^u7%}Z2B~)!6#+&QdYX8)J-OkK)Qa19m46>12k$1nVec+!g95Kp3 znFi%hggNQv7;9dTEPPDnW97$dOEE0s;S3+?eBkm=OGdPWDvyP~9Me?Dm?U_kg9DuS z{$Z*bA-7IVbPoQFI?@tO<>@s;a^Ro^D_7wY2?DeNeK4_NMs{z#KdoJv0IBR^j88xJ z4M7gYYcKefj#&d&^VV_b_#m{)7R^Wh7g@Tq$(Z$Px*dwPPF20F!n3AP- z_j7l0`!R|xBZz+5m;FP)uz-Tr2n%k=$dLEjlyw3*EAlqfrCQhP`*Nt~1K^JCrCX-)K&D4rvs(!_~y ztRlRPy*B&M98%*ud3XrvuoIiUoJ?_miI8XpOtJx!^qV!f`SU*Y)%EzWQ4xS;)(m4e z!MP1!PS#w4QbI2@V~k<$Y)ONUf9pi&pq_={5|$hDXZu>LvT(=kv5g?Aoc%Ac9Gk@% zY54*jqVIf-LG?S<+sIEGki}XxU{`QjFG}fDgCunz)K(p!opTHQnn+{X?n22+$xc}E zvZQzYg1sK96sQG}VB(d-vI)c!*q*_eVX__e!tq7^s|_9+ zh}`D^YOj@p)8vx zWDteYkFm*w#&Mti`<4!>J~(!rKDl|414l`h9FEf3{N8?7hYz(z*y(^8w7=*MUR12E zP&pa0>WP$a`oS*_KlhS8P@gtoOgbl4r8O1+v0O;IaIT!lvVV4nz!NzS6R4h~aaeK* zqN+ZjdEe}n_=x}A#eWfcrC8wn1jlS~Uc?fx$BeL|)>h>n7jT@lpje`ebS>JyE6ba& z);AP~i3??J&ZtmssXnOqTc;(P>sSbe3$QQ;Mn$@Q%qbETuBZcl$p%Ry z+^ydYBrPRjX-pg)b)HCYrMGDEF-e1c_dKFA)1P`)nl)}e51I9rjoy=KAC-Y{B{16Y zO3+`A+qWgavAq&)e`QQbuoq37K0pO~c<`#y4q@~$`jSBW6@8$!MT!&S9c9CWt;fB1 zpKAt<4Zx+JIuaB|`AtU5>qezl?6=JGz_>}YCYYV1iuz7z%ACvL)F6YKYz72?KvUhI zcLh)W6e6vb97*cuP-8MNCYQUYL_>l9#h{*I>40O?vjgsiq*66<^s?gaK9?X+JQOl; zhK|u&;*LYc7B#H%b9J{GC3W;VCvI{qlrN8Sc)Xa?2dBMMXtP(eR#n!aTvYEsVuLUa}j@ zHxLmQXHi_4YA`&(O)C`mM2?bokXi)=trfo-3WK9%&ViXTkmt#iM1LbKsxuZ)-p~No zY1$7CWztPW6KQ5+(V>;(UBneDrZzSU??oKD`bzl>odw9lOy%erLVyoyESX2nbPG z_Aa))r10egqHVEd>!TEi;0%g~T1V62?3FYU?e)4I zl48}T++>VaNunm09KB0`?Ip{c47q`al%5wxUNWT&@yptjmDIu_(tlH9^i!W~xEKu@ zWzrZ7-LV_y>mL}*)+ErT%dz;qe||JU8Y%zd7ituDIi=16ODjNBL6_MAkkR0$9O35; zP>pYqc9y-1)XNcqS(j{9yIuKrn@thJ+LWI&_ReXP@LTQwcC|giAZBu1R4ki=^>@I#F><*W>0@F zl~c)~m)aubd@$@Z6+AZnKC;d?PUpKk8*@|ZTt%-@%JK+)T`KIIhf!BT2`XpNIAkCg zBWk;4Bh4Q?q>&Sz6P#{2TT?9s9}Ug|@92rESF&%bhnRgXLA{q1Z4ubEPGcS6ljIBL zg4)%h>Zi~}8$O;@t^s^-lw{y%xug+{WL-5ObPSIQrUCQfsm^2bo$j~6ljxcJ?wyb; zAqJiQeXbZ9bd_>*?ZA&Wf1k=1V^kH$@P3P|MDECUYVMIjdwiX8ds6MBRqGxMX?WaH zAi(4kFQvjHH1@8dAO5tJO+=vei4(rAM4wBa=_%v|K&a*E>pR?3qD%8#tlLO{bJ>}; zQeny?fmwm4U*4w<0|cted>%1Se4p53NG5j=}L;M8Hjhbex1yf%*W3E7}DYd+b>#pv;{r@obPF zwr$(CZQEFB+s<5R+qP}nwr$^4bz9YW*bnFYf%y`%jWK$Uh_4s*AB1Zyb!Sys)&QU( zc!P*bQGhzYndTT{&MUyZizbYIT}*O8wHYY76@d*q1Z!KiK~P#H@1kgVs_=*3qcnzE$y zV6w{b&Z*w&Ad*WS31Z};G>KrPB;ePgsDjO=XFy)V=#1)>dR!FJwb783UZV^qRems)vN^ZO zRUlN)Zi>}fqa-_8TnRR5fw!CWc%{WOzd*eE+fxE91f%}e!>jA42v_)T$W9to;%#eX znC$4*W|Kq{Skd|^E}EkA_k#OyyTg;-ZQmLpV!Bt-4cRjq+C%5S8ZU(5E6z8$%sKtbw7;VcNA_ z&tVuoLgZJ|`<3Ja6rTxY3a%Di$sZY=0^!@;;&>=^h)XK4v8iE|Y2wV%Ybk@9qFfB! z+u*pNWjwBD-!SZZS6|~0vz^Qi25T(Gs&x8Qxeh|zXCXxQHZptCJh9#DPP94yz?YA3fBIataw!_DDoNoBR-e+%MP{MUb)!%<Uy+`=g#3AMQD{kWlxk%zM$rJk@+E-&$%~}D1rjPLt4Gi zvD|UE1Erl76tm4Qfi`KHd=Mqz3@O-%o4AUzbivm`9N!^iyQ;KAERnX=(}GXBFxnec zfwj(X8rB}^uxkt%MIhhsm1+#xUZ^(6UQDjrtDq60z z_KtG^XQKqBtGUQ4c0_<}D|bX^2!pnI%kSNgq1kQ~(X(biJ{;cfRlEOK_7iWYEZU<8 zyl_t2)2e`UIW%;II*bU;zp5svk8dx&H2IE3swXwN6Rjw+REasWhM>$A&v4f{G%E2l z&;V!iui@0{aNlYWQmSO5&sWE_N7D7q-?{yz-3j@^#jK z{$xy-bakhUv;DW$nmPFw?}dEw!JQv}Q>+ME&t1{4Lw9qWs+!v6t4TGfjQZj9PccO z<1h}Ye)mjb-~FhH?e?`)TUh%i6lu?Z2%NV3w5y$Lbt-5n>lu%vYW6!0iUxghWLLJv z2Sl&ye7TIv@>VdBlzD|%aZ=XBDL@=AM3U2S%=Dz^-MdOpMJR4SLr&s2~2GW<3BB6j=za&NxU-DeI7(KIa?!>lJ>w zt-;_w+}{6oasSKhWo2bz{2#ZMndLv--v8n&{aa}%bTyWC6&K{zui7Bi_9mGH3z@le7fHkVBuG&#)n1ZzAld^ z>nvQAAtnKdDWUC^$C#N%6t&R}ha}g_)935Ia2J2Bv#_hp2BQX_S>&vcq#E{*1qb*s z)CX_j2Vz38*|u=fFliY=%=@yW`O^2P-zc*Z#pX+Q@oL&L#BQ$cSQ}7vDkS0jG%4){ zjEmbPNH!$+zGf0B-d69#`3cY46l~r`7G-es;($Fe;NE|?zsMxOR`@tW|3Vs>sxO2q zO6W!sdOd4daB~rKph1}w3N*C}JReH2b`8$AIjvmmqsj>dA`IPa{5GMPdF1HV&fW?T zsKv>(?cY`+q?B5)$knRdj2;sA*!ai8;*U+<-h*<=PLzlAvIUrvEYS>YQ{ok z6D}tF_1b>#1a=}2i9g_1i^x4S)(B)ww1OeuqhZKyOQ0=UXy-+tQkCeBt;37}#|xow zr?RbJjk{!^A8*$n=R(Nl#K&4pu~Nwcw4CaE>4HoRdvOd+U+A4ig+LWzM0J+rpiUY; z=k*&-H?52vSMo~(87wT)XW`Y^a%AC9UzLfLf^79^!;6n|F?++#{<395!oX&e(zaya zIVEm&e5)y6Ti4_Sr^}G^3_n-oc`jMo$MAEaeq%U2orNzJFtHEUgfpsDU7;j%#XMiilhhGgWpATRji)NnRC2<~wmR3oVkoUHW z9Ih8k94&;SIWBSwzf9(50dh9ek~brb%1vTaKWl%cT6w|S1&6mnp>KCO7o!vrUM*FG7S`NFzNSsi$Ox8TQvMhqLBNGjivY}t zKa=FW0f+_|+q*c~G-v16RtO1F{yf+QtU4lL(I{YUFoeMytoObC&Cha^8?B=OU~Kz) z{LX)d{RGdUXqMK@z?xO!h{R?$va5z&mpmw(Saj^VRTk`Ed4ZC;bTb!4&;Q|jkkY=t zjEvH@xKHj6U?sz^fUT@uF*FbSUkC3UM-*_Czo;y7cmTzcaZdzC$AWL+w>`N=F!4^@ z!t=~g8kz1AZ1JP?A@)kAu^|^86;)uPqs39dM6h5?j=A(4oPHceW zIO5)R0C4v67z>gPoSJ*6fkCI;6RiVde9y#|SSYf;+&4;9Jmzpe23+u1(V<9x~igvu^Frlotu) z9$cNrkiHVgb(#;!9>O>!R-uX5z6KFlp81Gbf@BGxc?0)4enIU$*Bu+vK?!*e@;pWX z&gpxnjq4+4wV+}rTW+ts^djyjgE=&H^4e^yX{J{exB1Z*-yC(}r=sW)g;lf&fy5GG zEudY7NSyx-D*+4TwFN-ZTv>;nRS|t^q!L=Fhj=?ciot;uhx&U5hiZ)%2t_7j0S5wv zV*Pu#ncslMirL^4=FtljSHM;lwwV=Z#6Q55hj`zCuKTisHjf_LS?K~XKO$WhJWex` zb{PtqwaMKV2ak>D>Ju1{m*D25DAkZ2dfZY2Q;0PRIz`&d$kj3G&mwtLU_#%jHxEKy z`+%*4Ttwu@=*+E^av@tbFj}`9&7=Q=b>NYfIBs9Q1&)jJ71875d0B0I2A)fvIvYE? zUN*15*_Er|(qK&wG`%D>U2%Z}S_dNf;A4dC9)LW-F=;X)2Uqg!9pMau^M%t_#&pl^=Wl90C z@b8!VoYhg{qNYsiz^Jty!QP*ni;PD_Mr^X*Kpbk%zu_g`dFe;mA8}y}#No3){C5my z%~cMT?7f6s{)V7^LK+izJe;fP0PgFKaiE9xnX*+*v3x4vW`e_G!{N{!L9QIXqy*!T zVhcOs?~KoUS;**CQ({G6@#wvyxsFQbkT&7f~{h^VOhE(!m- zV&Usixchd0kM+aP@0&`-hGKB`1ju9awMAH3`gq2IB?oFq$+NBp>--zpg=fmxJB4N#LtFO<37$^D6w-cBPliyt=JHRL$k^aB|1;H>6D6w*N`fGAM1sKr(3>!L&yN_i5OKE)&ZeOdBLS#Qt7kW!W~~`HL@dPxa7jLNQg7xwkp?n$$cZ4)a>^TKP-?1@rV^Ex z!BdVXQv)&m*fY?Eq<2dQsu3ZE$!CA`C3w6(y%!=sB(7g?lv6Gv<-s$^7f~4z$Vg^I zVK8k@W_>MB&=+Tb^aKwmZp-8^kpa7{cjP=KP_UV5aRTmEwxjah9K|_xOCoS$t8V@9 zz58m1y_$^!Wa2b+3t4jNlG!jCnjvm=(J)wP)ABq*tsk$EKu?*#oWWJcEu!UE$FM#dIHkBps?~5aXeVbQujD1OG!DY*rM>w|wJgWKXuhgvsX(^1W zQ`nCbt#Vt!-VVMu$OkO0=UlK@m!s9Tp5!8NIF4PC&h(r3f3jVVxSaaz|1c_HXXh`q zgvG`{EL2Rmfr!5Dtp8i_4K+DBgmRLsj*@L^} zu8Dnw2WPoYyX=8>LgZ5BiFBMjp1NLxsY?w8eo#&nUOkCOhfc`!`w{`Fp82~fszGZ+ z39+J$n%Au+hvt8|K%36`$~KzU8-Y3l^D|HVv>@{*8*Du2VA{%hBYf+O2-u;Y;pvb8^t=+E+Gvt9GF42$c6#*@f%Q!CMOB zOrBbxw-(wFvqV!1rX7ngWpWH(C{TcgvJzn4N1I$cOFqXpuS(vx*lNLLfU1*IQ07hr zMQP&c`)}3Q{^+ao8cv4}y~VyeHZt)*pj2>@xac*cLGilK1U4#PIkG?h7_@{59x-A~Qn&BC$>c(;3ODS}4-OQM6kaX+yZU|@En}#)-6W-!|5d#%?a#uP5l+YLqFdG@tt_ueT zUom-X8a813ECjvqJY;sA+ZZuoU&ULnwNUEM1IofT=4I~P!j+Yf+$5nf2fTLiYc!Fb zWOc&Y<{%P9jf0PO$OQB8ly+8*3j@{Y>pbNdGW3mU%M^_&9;UX$ms=Z3`*;yj@6cjv z40NHHz@dqDNadDew6bEVQ(M%>O*e-ApSu^SKtpExS@t;9!Gg>(iQDZOOj@~%)7~;| zYV4lr-5eKxb=rW6S_vsTpB!Y+*-j|vm?)n!`6 z&RsBWA0vxvoBSS9b_Mwlt=mnn0sKRONe~}5oJIqZA3OJI#mxUPPsaW92)QIn{ZKVH zjQ{T5O}mo*g>DDc?>nkwvY!uTbY1K;UR+)SXto;G=fU=QwDt0wiF z*;mexIL!FOyrWSAumXcHA~p@tZZ5rP&Q2ZGomYh;XVEtZHo$()H1!qr$6q;n3tf-v z#tLv^sFG5N^df=E5SOkLBK|TkOR8x5@w1_}Ike+Mu24U}M}dNKCw3iScd`*blB;ce z5lAu5@2^GNl+aL+&dB$FWa^+w-Zb(OPf6g&EkFKve>^p*yCP>>=!k$fE>)0#=dDJH z2O?5zsXt{uAaOY)qTzHQaI(R<*6}P3UD-Xo4^%ns9xzZs&5I(vnSch#pEXJrYAV@} zp=t@FK-}WO7@lpc>Ooi+Z|;>Sj5Oe)Y( zbpyV}{gcJY650qjpk)eZN!aDfnw3!z?K2M2KU3$paPtOfVlB%2-?z8x>x zNc)M7+Uee3VXPo@2S}GU`mf#UH?3A!~fS1zNjxI=iToef%T^@GJ7&%^{mvGI24E?-)aTqHy zaQXqwWhyUQi(BP3e)~mgu?TV>GfBeq3iRBj(3O-~Ivh?V12X$W2$zZQI&SW0~(O35jtjkGhQnI;v!rcy;OP%88b0z9hy5C8`(_ zR$nnaJf_V!Gq84y?vb;y+f<4Gr;LrIEaltAb61W_f#Be>zKN1}KgRV4;Y5F#%LK?} zK_T`ObIER))1Z!Z>r+_(b#|d%ZclH&IhZGOL{~Ie>=Ze-ASIyQ0%&{~N%5%nw$*rH znup1ZsR~?rXY0byJbWB}}7MFuSZZw;i}G16)G zBdhiCeHA*oT&p5>hiBg{-+9Z${6~+^(~bOne!pP(l;0Nr zY2Ez~@|=Z}mE(V{yZ;>2Wchy@)U4Lrv_la`NOs?S4?pM=iv;ml ztEy)nuL1P>a~F5yrR|}gh*6Y0+MtjwYr4F4 zcFKBC2rW^TQzn*tph<5B9u;EU(hLmi}xk0v~|0UT^FNdxnsrK zj%mUq+iu|&r9d@8$+_n*ZGV!*kL7+HicT<#4k0XW%LB#>r7Vdy3V)m$%;Gd-B!;l6 zQ))_xO-;}xMc7!;A*Wxg&yRQJs|#)FkVI+bW{M=zRCi2A6GD)A;F;wt$Z+cV_S%!| z6PQR{yFeH;`0p>L?yj>Gy^E zYdSuvd5Y-bfM&kTWBqd((iGx2U@)LeSWXjmF{&X#0XgP;m@pKg#=lwe3T}GwBQauZ zvT&sVUWPyI&LRQ&zZ5gWC;+Lbiq|y-3|}B)c#FM3*uyU24lNjq$&*C-lsK|={ko%9 z`ACe=ses4?1^Ws=QS(3+*eDG@bhW*;2MtOxEW}%X7;)e_58-@XDQNLZqc)MY0O#s^ zaN%yfQ#8p`AJ(5bP9?((kP{s=jq3D7b(9%@*uBblhHnPBPj8?@UohLY3l$0zr}*%u zgh+YBwcRv(#CJ(Z=0gK+VNw16NVlOd0&K2v*z; zQqV>Q(E&K*Dubog-0;?%;PL^txFE;LgwVu#Ag02a@VGuI*CBQD;L|EUrldNhqCVts0e0ZBgHM-SB1~tX!bb*>xl_l!e4{@3(TDISJU+QN z7HknBmBi2nSrs~zcy}ENgD{T7`h>5UiqlLsC2>d>K*7$c!~~szJVrR;f-D_?io^H@ z1%Afu%SbHL9mYHav?M5egBcXz`5rm)uxwC(SPl3dYkYQw>YMS#@EpovJXm^_wW1yQ z`O>^w`^tTYke6bcD<5w$aghVO^9~(*{i>GTER(CPelddYq5Pv@ZH=5VC z)ArHd6!qMbW%N=mev_QS^gL(w`#dnZHDZV#-Ar~~EgWLQ0uS`p_j%mLn{6E|_f0xq zrAxUJC#g(|sr<~H(1g&2f?B!193PtJ=V^>XwC^eCPvSzU3GP>>S^(@Yw^9@A1lNGa zhv2wTVT;A9?U~-Ijc6A^q{x7|7-)8|*PaOegD!yNN>=5W@`B8!e=WQ25mI6fHdGJH z@>-c*(hEPnJce7ryOQ|`qT`P+YU?=RyFrDyge6OGK%BBlcP0tdCmYz#O&ke3NhG3a(PVO#!u1n@Ngzg0nNl z`e802@T4H*90LOf!%n180z>CJoOLaqn$~=8dB{V2Fh6}3duWNd|IUT(=AJ{L%Djrl zt#$(aHbX&lqR;~~+e^P;AIs4)OqKK<2{xrjhEvk<$&EBQ#9|DRZ5Kmi*gSqo+=*!I zhsd{9>hI0^@iSsQ{l~@r-xv0O6MZ=u+5YEZXJ!14o*e6cL4NG6F^~}ms z8#i%a*J3YoIIvGJZoJIy?wh7^4H0zfZN+YWlFoGD>aRMFCxoXQevZ!mPbY<7jgtE_$ zdvP=eLqWh%zwu-0gPGdTn$sYhG>h~Gg&|^9-SIL`OFTv4LGwcg{yd(f@|lF5gF4gH zJjeMP5Pdlw>pv>>-xc_;N-;At|8JrG2SxvXl4w}}3q=2aE!4G^v=h!KY|m}&+JhzA zarV=vLle@Z2M49L*|E{FKmfYzdXyVdkA==p;8WHTE zMKLqk8F$Ro?=+MWR%v@-Y8j23Yczg#JJP+>vZiENYV}JDV{93VAD}}eOj7U1>ASbt z{rlO$L-|Tpih3b!VspK(&$~DEBsIp+y|SKLHEUDR%PiZU03?I>mil)#UTWiz^OJ;; z%Lg5pU$bK4OHwL9A2n+B*Mr{KpA=m%IYh;R$%fuzq@N9|!#2Nxz1**gq^Ip>*Zi2f z1+7gs4rs4Gj4u~^**n7)yf_1+T(Lph~7@pdfUkA+eoyv4(VhdrfF|4`qT=z z)qkds2^>=Kj9EI`#eKveux%Uj?RRjT;~T0IH|S@3^s~PA%{vB92U*yMdY}t3W;|p^ zX2BbOq(j-+k5Z|lA^)V<=q1cgCO1_hyq%`M8ps{@ImLFrmRl%Stm`xTSZ-O{T^$?j z>26Tw8!S)LQ(N{iPpATw31Ksr24=Y3&v}YwHQznwId-Pc_tINsk?GBRR={j(;A$PB ziugrt;7d$wRm0FQYYYQ3i5pJz*+je!tO!yd^7JhCkbL& z1;yz$-H!9157$7U@ZVo)x?w4$Y2ii{V5v3%{xu*Ms7#7AgtywF20{btW~EGy*DYHs zR;sX0e8k26zC$L`bXDub=srrzKpBv+5sv_QW(u18{HnNpBy|Xdok~*W3XZd>IlfuH zV%u~=lcF#+rbuI%0sN5J>8j8Tx+--^2VcOY04`UP)10o(idKtq!2&4o3#XiW`DF?jHnL z3R7fmzvaUAf3k{Q+Nvo@F!D+;cO+auAc*fOJrFVJ{AQ8)tZ)VAKnwKm;S%QWc-OVj zVv}wtDc+QL_{WsW0|Yd} zVq*svt~$tB`toUQ@9;<^R_jzt$5Yvzz0wA4vBXMyAXr124(msotZLeaG~kBl(n-(< z@PfVLrLI4oSR4{pfLU_V5)p1y3>qZ0bB2IyC~*KMZ&e)Y1&0mmgPx8kOW}}7iKIeaS07{1l@0wD$KUh zuv3v#fH_9cV>QqkQ7d<-AGkl`gNLu5lY*82@SLloSN2NAq~{@auD`L?Ka|_ajym5K z#4FjO*OKMn2^;MR7m-`mK+!`VbmpjOzKjkF$&!z94sE9_;_S#ScBt;p2Yja+{biZV zH;TqYw%t2AHtM?f`9MJu!UZX!YJ|<}T5;8^n`Qu>taxAwJ89uSJ>iq#YFL2T6pJHv zRjFK*X~O=j3nW9`B0txJa2W*MCwYC3mj2}68lXh#Y%N@Ol5fv9vu(-bMKb`F1pXHD z84DN;6+bS?#DV}gF0Y!CulX!lSO8zDk>v)i&!2O7w>blN4a4{6#R;~gj}ielbv}yO z^CA*f@7SJNrkU|-QjOQUZ$txSSOmc0%co!%3H=COVs+i4Va>6RbY}o4$kaVu9ozFy zT{!}Tv`r=R)cTlQB{<{_uHR?+fk>b8SaUMd^aj3HOZ`i{0cXoBK1cdai&x@2zPoXN zeWxMEZxbq+kBz&Y^vcOg9PLMkW8uEgL*w9B#xalqd5{5gK_zshUwpEm3=VS;ZIFU#sSy)-QxuQe~|_^^oXZke|;`swl3L#9X)os3J!2 zr_m+7!=5fb;w=aLstLvNglB4_hKB}}UpXt{Sl=;=Y7Bmr9pllVmcS4Qg&ePOJa=Cp zL#>E^)HOY^k?1MWA6eudc+HT;=+1eZ48bMg z(|wL&myVfy8y!Ym-VRzJ#MR>Q`|jn?Qu%sl?TRh-C^oU}kmpN63v(~T3kW$NhCmqdo#K$0#5<0k zEO6ej$c~?Yr7J{3?vp?wKyr$t*f88EK%slOM)x@~T%QsS1b}LuxkewmGj>hT=T1anNH7$sm<9 zaA7tlw2AW}A9ch{RDHS$j4`dLoF&rK9EV zIiDaP+LFuKU-P&gs;_c3asf*SA4vDH2xc{RZbMPgynnH9cY6+X`|fUkQ>=&mDlC9E zcA$8r%Px%7Q4<_HE84ehPc#m6YZ4~-W1x;JXgINp#aR!b`v*Uu3nNj>$@%bHm=Z^M zB_os$t#xt0y?)sxW(gQ|DViD3Z|!H%`048Ob$tD!8O3q4K z=6BwpStyY`G&2bL88UkXhnC+`MuhfJTx*D@Qr>-oe9f;~Q{iuJRe2AUbTJxiYP z&{pC^-pY?5p&#L}BCQP5P16i0>+DN!y}=IuPV%x)1hjWWXWclSYGX#3c3r&YV0(>O zQZP&j@3gbwyeNQ5HAj^Z0_&xI7%~Ls!WZg(|B1nvlY#MDO*}pnTvwh12k`}uy<&*p zqD`%R1;F8Vl`O}ev{d8lXERxnjfHE7jE?kGQ7>FW;pD}_gT9m;_Q7@w4)y3BhEOcj z8S(TSQx@%3uKyQz_wZIGj}L?mojj7Nkh#y33^}sjPs5rYot5K`MKJukqEMO~Y9)re zu2EGf@6XjxLr#z#3MUVCamVD?F&Hp}fr=mD%p_pnhm&M?1IK*^SX3DLRUvWeC*DCH z>->q> zD@hNouDC8+o7BdL#3W-={T1JMmn%7*zblmqx-+%#?k+(#4dROnc*l;mQAC0OAOY|o z<@zf{rPc>OQNMayRXz zzc~E8Sp2=aHUZ%zI#3%JZ?E@{#h24ntYU_qyEZK{fAuKWzXzWILfe|QSAQ}gB}FpA zpr#MqOumLgH}#aohvpNr%2)dEXMfOCz@!LMxRODA7FoYqPKAy?>I;1b6r}FgXw^$v z87wAE?URC8+p?@&mgHs&BHJgHU5`1?SD z>*e}%a(y0N-sl&O*dr#Q6JJ+Orzme~EBx%!Ui{rqeT8f85s%&?6ohwkxoGo%N5TAp zAo1H)nD>;BdiLo}0gAvfAIxFi8dVx)Q4LG>2dTp6GdyqHVr^pNSfZ zdNMoCqV~?TU{IkFZI6ard0#|nZCk!M;<(?;!QB>bWx+CHKV>8S8Jth<;Yco1i zcAF+HWPab}HABLn&s$8DdwA1Ij3oWYwabzLrD`%RvJS;Y$*ZAh8;jyRUy@OatHnxd zeybWG!Mlga$h9!1@$qL(|0iH)9>15@*N4sXwiLkb<*r(i^719?9@e^adygihsq<`T z==a4Z=MW3*F9L}dXo5~aC!lLR;xxq)RL zC?HCKU`>7qG+h3dbAMVBgAd`_y4a?krbaC%|3xT3m1oS<=W-~}7RuhZ;?g?5O-0Yi zsKXusp&Lh(1IhkegNhKHVOMf{uzn1f&MN1Qzl~qap;+^ zcp*y@)1v_ehrPz!aHpTW4kNTVvx=38g>7Tw6ai zM~p1QZl{Luh5lP1F?Ha4-q9In1Ru$n^NO-A2*ge$z|rf8p98&VqLPf9lu7YMJ_u|U zc!@*T$fPiUW#>r6$2bDOY>yTWlhZm{+fK4^X&&v0#n6*%{h^PtsNe>vj(k$#Th}Jw zF-R$1R_|~VBs%^i8BtinS-L7F>wye|n&+&7Mo^feXROMDK(&%ypdh+@aKD}o_lkqf zldLQ>S?Oj*{??GyrbdY@O(1UNLBy~WjUaBE3#U^Y)rLWwLuzZuUQ3+v`r@ADt(Jj5 zm2)A8a9tgLBrHjfH$)oaKvU!_60)>WH9peI7$*e`^8#O0MDq;}LD!(BXLe;) zFw^Q`xF6DB!tfhR)=Y1JKEjLGhnoVV^YPLHNYZnxCIPHq^Y%HlL(|(P|E0FH^PfEIMy@{~^tq)j3j0H# z#&7GAVVUk^ibev01s{3+rRf+{uDOpq<$NWE2m2ZutYJkXH5w1;Oc#aF^4DR-*Fq!K zheSj(`w^kUXpYBH?88Pu8>T?8u`t|2914VqzQd!TO}$ja#2{6BzDj3iC@DT`76XE# zl?G+$i)U!}$L9nDw)C%`f-|0U>qc{q-e1kERS5~hie)BS3m~b#+W7vO z4-PsSksNZ`-VWtM!iYJ*12-_~KacChzT%ifYI78U*` zbi2(bjFvvTp#&yLC{2(&${d2goI-@8bfes z)4{U7qfQGBalql*rd_P4tVA@8pw4a?f>~ypB3u`Y8+?^jUrzRbw;}5SBQ(00rc@4& zeB*d2VFw2 z(w9T+C;(=Qs`ci{bW-QLLE;`>kr2g~#t9$eaz=N}IOVOt?t*)2I;o4gSarfH)|4pc z>~Gf=(aohq@l**}bMBS`FX9QK*;f+kF{vW<#G@eqSf;lP@0>AC{U>n8g<_I)_6d~e z5GO+Ar_FAgLEB} zLk6?L)j|Vy2Q<*SkWZEXN@9=y*JyUhSv-7L0}2#u=^;sI>TY36y}U2xvCid8Xd2mG z8vq(fDFzC>y%ZGxub(af#FAqw?24h8rbXD!AVdR2T%`n0W>{if+J=gO{Tf~Mp`hBt zsZivvy%N!SeZEUa6S4525x#MmVnVoeCgYRupx~*@BGZ(qx!E!YyYHcjS*|IR?5zHt zQ89s0!$G9tc;;*O=@=l*k*y<8w1exOZP!d{X4ne{SZ0_uKC8YdpAo*+v&iP6v_UkV zF{DjhjiQiEfH(<{(I1Tgb9N4u?Z~n+kF1?L_Kc2ydtU7Irsol0=zFdsnRs|L(!+0u z_N=^I4v(!FMdMJoZm_l|Gn@J>OpDSb_)nqQZFMBfC_(Uua2`D-r*w@b z%CAFb{|1@Bci<;$;Y+I-o!%cY=|Hp?)i0nT(>gV9WID#Btj%FQb3SaQcN3=@AKHnE zZfCc)MKtv4x?YY2c}`gt0Scecr$?BNmKrej87uo98{~BwfUxSeK`Mm(4VqG+g(NG4 zO#*#BGL|U}tu*Njs~k*_e2;X1hY$g8NTg+GCu!#y!cnTStzkwAVt|^WqCrp0_Na3e znkUHoyc-hG-1Z=7Uln6ds5LOfb45X+i%{BMC26Ja@qkSotYY`OQA#U@Y1URV;8V48 z^o$?AsaeT(f8gF*kid`YH-(y7fwkE+(du26txnmr{mpYfC>C+!58piwfe1($%Pw*% zEma3$i=^0U6nRy+uy+ubzCG-WpSAA#eXg6S8g2no~T!~d+o?gn0{={nvZaOTdholDjSv%(C+?ANq6 zBF`M+N@DoW3b@81Pq#N#F*!kQl>~Hvi4c;ulBZGvIgHsIp8Sy~V{IuF3^9VrBX2G0 zhgmRY;Z4~mmi}3Jwp03JkFzX}pg^Y;BIU$AHx?K{F`BZl*UbBl%3%t$jFbT(W&PK^b-uQ(@-XjxQS$&8#NY z#8^E@P69Rq5boc0dSL6V1H3mMOIs>#U~#BbUGB&?BX{RV2E|tBsmJ*MnR1~Qr{M40 z?QCFZG4F4I)=lkjn-OEv5P9`o5~|mAg5nO6Zb{cdvzjIBN!1|ykeyyBgyc4kRVf7N zdR48CiwoD$mw4F8-+Ck2uC$lqi@O{+>-*X{5QSo72TJt|%UA3fK_dwq%ZSr#jx;+c zG;BVMj8gaF{Y~wqrx`fZA|WiAI2|#>VPXvvg%aW&D6^-v2>PpzjSf>ax1Nji#`Fdz z82vd3(3g$M<|lP4)vIcrLV4(4i*-2IGG1;Z3hdj;KsRt1YS=oIvgj7|y9m4T6z@H1 z0>*n>i$enku5@ofNPpXjVAec?D0q23@B}68X^~kl?Zi`_!yS*MMmUT}C-3yRTm1uX z^oDfz9}4ZimDm5@Na6h7{9d;Ik!}B{lfw4@l;7K}vH2I79ie)nu-6FByuwJdx)TpF ze=LLql%p${$6qt0e66$2TIlVwiLOPQtA-bO!+j-kbvX?X41@WDGkzew$kkF zi+81uksg2>$tbX36QRl@=!g~ZgOwi_^#MP`8H&?jD|@Lt`I|sA1RgOhfJZD{-fIcN z^at}ctbyaFs><3(@z0~|S1GhOqoY2LlghE<>__5J-b9|xLUJZIpqXZa3Mf#H$uCEW zXq{+KpLb^Oc9E%-p~x|5#ZDH1Mzxgu1T$C+*bvM0uJR}skU@6_82p_$|7`d{_vxya z*Wh_QMcgvwZV>rNn7EY;$}BwLX1Fva5URk|Q|48Ueh{q)2KH=~GVHOHpTBR9u~qQ8 ze=NB~QG#>_43f+!*gg>}9t|MlO>>z{0?30QyqM4!x z(GBJ@0JD@3Np-LZH_0t+tB_QCG4s<*67_`$tED!Whg|reK+6o{6}rv-$I7%1g~*EE~VBhN1WI{hlHG)#q$Tk zUJBiF@pWT&4WYy5NkK&!uRbbq7$t+`A|Fs;6|=;uS*~}7M)U^@aM%tRrU>|giiiiN z98Px+qkubG`i>Okd}(VIdF-NY(YLj*Mg}A(JWynmiAm?2( zEZL8o{oZtD7P(44Rp!yiL4(?ze~wnXbwS2(Y5{6XIrZo9;enC&HrW@$ASZlJAhv%x zv?~P!G_i}8pQuhj1_g*eeb2w^Nj_`C$7~x>sW%2)w4}{1X%<^ul_S8c|CAv=M&Nb) z5ih6@#g!r9x{gB_xo#IJEHP=_LGn^Xy{+NSPXjLAlrKgVL0RA~w?(1ox@L+SRH;^= z*EVtq-Phn1GN5m2B!}P*rNYF2o>^VBLVOw2F)=gTE)r*TbIRh0A9~@w*qDsP`2QID zhA6?>B+9gH+qP}1(yFvGD{b4hZQHhO+o-fByXSPz;-5t?-}-wIaU;%!u>>?6%q+rL zV#uYRvan=mjg#*5V+i}JBpsE{PO&wmIFc3MXHWHgJx7HR#^XuBRbuNz~2OmK0 zHVSFVH3}bpNswo5P;NWcm3bZ_Khzx+A*9A0>JW@wP?j}&`*qq}n{(=fR{|4L76jC# z=v}8-wiTCmQx#s*#e$E*S^bR7>C(?(7|8|U8%6sP9aF*=^1cWuGucWliMdYDw_LOt zwl~TQ;HS;*_|duF-~yC7M>b{ak`dFjvmnOYSGGi7@-& zp=J4i5J!%Q+60so+P7n`?21Sw+s498?(!DQZgA|>t^fA!>Mi1sxn1$ETyFY%<(!B{LVtGs}!FAI98)&GE| z?u1D;uc>Y`MAF!JJ#n49S3FmYn+O$+?SlR4;KZ>TnRS#KUU{`|0D@C8ihmB3e+`R& z^C(!E{!5T#|7S8X`~Q@TJf*IY@H14rpKDS_(v&Mpog&zk6aq7UMhXD@v@XZpHBt@a z(2ry=9kc29cDMsOKA*yf@bT5@;^MVoABGC=tMNNqo37ilj=sJ0VSQ;(DCyZ zhaZ^a)kTRNZQ^nH0`T~_^A^@uYh1PlgpfZEZBSari_N1K6ed`Z2Lz$?U9c49L?*hi zr|)1$Wda5Ol__PE(aX+~lErc4uxDm8aVGJQ5w?x_I6^iked4p!GP&JZroyARyHQGv z)e}i>PS{5ZXRE2kq%21j$BJ$WQHx^qA<&JCh@_c`z`Dibfx+WahI>+fMO5sg$Nrv1 zL!uN@2xWeHC?L1N^>0{;Mc*?jco4+#S58E=!HHk_A7opL)5{mN%9E}dJ{GgE(Tc5P z;$^5MXX)anS2Z21iy74RUzwRX2@Yx3P_d8ROk~wlrjr}a!hdB{t`g4Vs93s294Kph zT65NRNC}m~HGY`rq_GXj;GQzv?Q1?Z14hst%X{T$yScVzu|$JWE=nO4fTl{W#dYeg zROmzp@b)zl!=e>ik7G_j_W2}c>dsWjzPk#VWU|JjMrY&$>LNeuC4$bcNCiJFG+eKC z%}#X+5SvFx?lvXVC$3J*@`)gj2cZsc(+*ds(ybT|wO0D7vdCo_tPFSbvuc!jn1Yaz zzNC$lGC*kh^PN$)D+&)FdTNh;k-<}O(gjDtPXdIMgu*a zv%LiEmj%WWW6i{4@O4QxmcBxN`(YwDCjx}@{o1WIZaCCnOik0p#Ce`Fz{c%GCb}eWod|E2%=PX3%*zd0q;ox+GEtU@cUIYz5&eS6M^^8s zB*BlNVhw%^)gJhMDkB0$mdZX_nX9`O6bv|0MUr`9;skh4q9U(W_bpM0KXXy>@Sw3& z-=yf`yGahR5UqOYV!2Hh*N6i3MEWu?BZ#NU@WS>n018_tg+-zOq;j2W@w#?gT35Yw z!?aaT&L=MxG53Ma;Tpv8=80P&=%Q}Lu{+*vEl(GPD3RERIkh*jnR94u*niuv%Q~`~ z<8A&VNZcqB+VgJJjyO`Y-DHr6kY8gSNv1ODB(j(_?97^43A0u<1n*JDCML4QsBf-* zO+#&ZYas*R6~=`XkO3n}G<+E_#2=1q1e1{3mF!iLDz=W0ZOIYWU}qL|;!R>E*jSk* z*C3tjG4aB6u~tt6R)g0~@beivH_-tsY1vA}w6OUGm0_|(`t9Zs_svLp3Zv?yD;n=9 z;CvkHhfg4R{DdP2*J?70{iv=3(*g#fU0E{U+JWa}Iawd0ObYuX5N#|l6=I|X3{?B= ze=`*Jksw|ZsnCevjkQty&PKX9GU|jPG&o@#vJD4s~1&A!p*7n`WFx)K#qgVbA(g%X zwWBNz!u6#+Ff7&lSdIB2fYy5dqk!ka4`jd!HGVu18opXo7odHI^Q$i@88Z`p-~n*` zTih^vchm%gYZx~j!tcb98;EF$E8Bo@pn233dSsmu{_M?clGvOTC?m{gmvN@!mNMRb z^=flTI7}O|K-v9eXt)zCY?G^y8YS#%IxDV}hb;U3Rj?)?_%8>rc{r-gm35}8`}9Sx z(y5$7_MTFcgD%diNDue8HCw6t(-oL(jGK-PbbxczU@EkhZxj<~`f;00JqhQ|bY~Dc z3e?R63QZq|Cx5&AZ$HK?xm7fehxA5Y?sc~FNA$+3&KdsUTU%}BKM;KDADh5<94QzD zVz;(Km;8e*VranKFIb!=42>vbmY;4=-?*Fg0i*yofb8eH0RvUM^x7|hodq!NV4ed% zuABu~{*Dx_cal>2uM3h=x_lY%_2{+n-dK9DTm%X zMBn_YUb!~Jy2~*+&xFr$c6=0hmQimhkhrg|-v)Q=d5okX|Co6Ho@D=?cx)X1^=@YW z=NiTSKdn(t3UzY8j4)d_)J(_0(9TxmcTnXBG78avgvG#A!BUC+y+5AE<>#7^qKcX5 zC$C*C4hXY?Iw210&gd7HZ0~TJO;@rl7q&LGA%^Si6Laa|!Z5J}?RQ-Pxul4OhEkb| zTZqEDy>!x$y+ctO*J~wsm-%rZUZJ14<$1Pu@Sl3{KqQggD)cBCzMn~61S-?}_*H|W zi1oi`%m~N6irK`Ml;ZKx@pIk??MeAVVn|%9$?S_0;$)?fUzxVqCQP7EDvpxTx#T!e zqDsDO_voKYSwdO4P}AJNq);x`U`g^w>Ue&`LlWu_?+cSk2x+g5f`KqZwVf4|f)4g9 zVId=+@Y9~>h|a74eKU-QNn1^OH+BZ5ywk^I>j`(087J%s9h$bKL$`(BkJavO78eyEQj353 zZ_3*%^c+hUcHGr^ECLcL09zS^mak%@Y;RzwLgOOqcP|291NY0D*X{DOx30^fO|THz zbo0T6jT`=MJCxvXTdM8_p_QW6Cg=w!ndhxu*aCE^sW#l#f|M23UOF~%Ehcy2W)}V6 zkmdM*-|0!p!nbX&2#1D~kmCk%Oa@^DJ2EeXkY-M z8iWFPI;+)6+nBj-+c-@q8u|(6f`Yw9RX#|*T0l78`Ccea3N&G;No-#Xks_&tZN_M7irD$81g01oQv6|?ChF$~#BvLYn;VpyU zjstO(rsvXvHwq)A8h#IY%8Q5qJ~=i_6PCS_kvf(8iUK_7%o7bW4JZ}h`Hv((Txu!K zhR&G{;elyOL0qxY_ULhe`RQ$=FVfk&c4*J2^Fv{>^x}n0j4EEndPnAya!{NfPQ|w} z&QhYty}fOM?73H!Xb6NJ&uqSAs_v4pbuvIduG) zp!zW!kXcP9I3b@tGtMbC7LG@{f4qNz^h=3^*(zwyUtOL7@U@*N zR+iY-W;@i(w~}8!|K<7x;FOO|@Q-@=cOm?%iLo=W{I_2I*~2*grye$>zG1T=hTwIg zc59~*xY70dZMj%*E}sHR3swQcO`&KIjfyggcI9@*w7RdQi_t$GXan?&{lHwZWtOt&fgZrK@u3{fvd$cP#*^nuA=Le!gyJ4aVcN#83ih z0nM`${eg_4iq;jyuWH@Pa%uxCFm_#uDM(b=i>?wmPW!dSTLI=WRPvhsC=@AXQQdx^ zv#$E|55N>{iawgQP$lxFpTtDty)K7fn%RE-4AoLSPnzqfkL;(z@o|HRLuvcJSNka_ zOdvx%@Ps9vcbb^eSwBb}XQ(7S4s*ILOBG9U&u&XfHft_+=8;8MSoO_OQg|Ci@q1kPmU0NCgxwsT7Jy%GH+ z+3NalH^SMTFuB?xec=~f80O5E(VY&2CS!5eu%wQQ*pFm#VW3^k&-^bu(oX(|p(*?e z*b-<&%UU6do)-c!INU_xz7cvuQF6!0AP@3M_hp2c2s-3C`jcKB+Gf)J62b5tKM`tX z0Wed8jZg*Y4ru1QYrfe6mH-j8Q3%K|m7qyC zG_w+fL}6nFbDg+sCtU|+vwSdwq9opSezPk=(XsNfaV4*T>p0J8?R|N?;!CZBURmH@w1q-Mx z{jSDhHcg<#RFEwQ7u)e%50X*`weX!1cL@4ojq_T_p+Kk|@DW<(S=1&)K3_JFW$8!; z$E7@v<^d57LNcSUS#i{oL6%THjOJbC9$Z?wR z+LTP}yxDO3i*X2_$fAXMewTyH6S^j}TU7iUSwNBkHwBp+<+{}n+s#tSHwNkH8{soT z3g#jN6N>ppYXLyjy=KK}0N<%DgrNAitX4#lnqvK<7YlI6r^$;jr%%yRLZxem)o1?CO88YW!FEO9*a{Z>S z69dV~Uh^Y%X6&n`ya}>b##{;bCOW&~K#c_y^@v~I^8Ann2{ zE))vyAEq4MxVCdZ_g{zdv55gI^=_<3_*qQGCvpf?&FAz*9A|cjI#`*I?KWD&XVeEJ z+{gPcW92FJJPaPG8LR0`-4%?PsKq_+G{kH)+q^%sB4pREPI!c&GVU5 z2%L1{MH(gnFO3-1uR1O-=}ICi@1pIQvJ02)B<0?(svT2;HhovPP1PHIG5mF8Cn7kv z6~nxsSU7Ny>*!aCwojCBms&jiG>h{Z2%fMF79Y#IF}2#a0)cI+`*p@JrmOZ1xE|IJ z^Usd`AB4lm%=TZw3gQXNDf__}XUnw=ju zsFcQ?jlSoGGgiPNiWf5x4F>j*gR?0i_(O5!#8-ABnH0QkC&p{#oXy4X%)44!!y-2- zp%dE#5G)tH@S+p8U(+1jg$!^kO89a#PnMn7{En?szW07}tHCF~w0i1gI$v)28dFmR{)o-o3x?ybQ^P7&XQYZNqmCS}dFBQ-``mmn_O5 z1UG3~{uzeCja@ZX1x}Af9?zKQG4tG#hw0&c_q7Xo5;{yMH=5V1X8SBx=5k`aNL}1v zaL}K13Sxh$NlsQu2JMulVz~zF7=HCk{c6m;rSMXPq7w*j@+%I`Ni*7lV$3x8z0!~+ z1ij?}6-Kc$?@5!nv-Qhw)!X~>3BE3&U#4DA)F^% zE?KNNi}0_ZqQn_DRou5WB*@%FY)c9w+}A52=1f87l?&UP8saMAeSg<-xxJ)PHdSM! zb$f1<(BA4s>05U_Bziw6u9rEKAm=6Oj;+J;of4IG&SV^%8iRT zw~^w<+DcEYa9u98LhRB?YaV(8_W8Bz^B~;uS3!W}%RD6|(qRGE z054{xO3XhO)hERTf^6N5ER2P_ryl!83PWC2P01$JH)egR1WYkEfHs_#QodM?Ds~jz zwE7GR@NA1j=JTtSkHAKQ(kJ;>y&uP%2cJiU`$BA2&9md=cfoV&V=Y(eS!of^%yY-{ z!z;L$_@AeL)cwEf`Cmwllj*y&)Yxu)G~ovMr9oZvFQHIy@0{{Hb_raypt61LV%@1z;XulQd7|tj3e>Pda(e z+tayW!MfUm&yuH^o~_x$$lqeGW`dGgpnp|AdP-D0BL_vFwF)?0BHF z-9jg7^{)pcR!sz?4!&WE0LcB2YBi-141eUBG4RH@akXPncQNa%;qfm=`)|q)j0%|} z`{e8-6*JgaegpvM_s|4xDuwaz-^HOd9l99=tQtOeJT$pc`=nYL{sDLD+0fl3xMF90 z5o*Fb5$jo+FWz^CCdsY85Rn?%XlAiaj6>Ut5iz17=W)P%N6zN*3Trm-s$iy-)>K1+ zQcvR)%Khbdaza-t>E|QD=5kw)Jg+h4fFpuABAcBxnQIb{CPeRx86TY9*~cbhrIc@# z3_TVI6rR{FX)}&532E_|l9vlys)$h?7o}t;SoFrC66=v797<9G_fLimI8LCrk`*e7;vU`mEdhL z(N^DJCU2#uJU82;82n-i%GS=u!1JAZGYX>_a2p{gZ| zGu#ADMXouiH|f#`<&@`eV zC86onfoJK7*}O%6DXNqv72qN2u311uBHOs7*x@%;bI%x?WEKg&^dpkVuR(aqkWxjs zpd;hyDl);Gh3HQ}&^gJC&oInn_Bh(4UdPfsXzH#_5A=Dt5aT8!Cq;j~7R@W~rFaYD zXkQllt;eLnV6~{Tbf;VMbohBzaG7?A@$(p@p9PI>QfC-Mf4A+;vpSQMpfq-mufVp9 zkaT?Zy%xWsLu~*3`_F##UmU`~{$Cuz$nZ}f!pQJHA(1JZwP>6c#?YN7(jJCCX^=eD z+aZ2DqhZDzx0HYU0h;wsZ>17`W|BFH)>qtzO}T_~!>Gx#wk0V-;MGz6SUWx1`;fnr zXW#Abw^vt}$3EZ=*SGU_{LczY> zzt+eI{Yd7evY@4E!*SYb7quO_sqjAfpG7hyOS`J;IqR3r>zTzA*Uz44@(Mb+Cj@B{ zv1jR-EQC!Map&RoW@;BcFN6B4yU(;ZZ83bn6Ar?RuQIhndKhzIg8n}IcjdBBn_Tbd ziGJ|0()-cK;Z!4snriV$;7(W4L)MY=tE9TTw0^Pf$Jg7RxOxHZV@@Tu`XKtmx~%(r z5@K?r##c_d0ZtuL+NjIjnTV#vEM~0LC!@(wnQS?d>d|l;ej>DS57HERwOYUgfqr)C z9k(HkZ_|@Ne|~soU=37+rHdnn_H~mS$n9R;(`j3C^pzYPo$oWP@dNDs6|cH8O{xWr zKeu+NLMA-ZdU118Ql-;WF|9`NR@n)^vxke4bgy&b_Btg*1SrD&fSv8Y))CG=(Nk&k z|5zq($a*el28)bAUnd|y2{gR`BUA_ygR%gTJ#b%+me)Y6o!t+}_?HmN^xwYwRs_9j zFOPy@NgPFhLg$V4_Gs9F+Cu%3jRk06_q2cvzeoQ2L1l9-n8E}`oA02{UEw4j|7V?} zo1~*>Oe7;!5OxevrtVgE3Wc^+T0;7!uzBcyfX8?+k>f}BjHNv9e9p*>?yzQFWE>b`G3g9_1Cg8ROKV|rz;S+N$mAoeOLvG?k}=&D=MOXSk%{Um z%n5xzfOCtk%polpS`oky)kHtJtx(Tf0T?jUrM?}%m%%X^mFoM9gosb}VOON@|0t-B z09=&tD1}^_M$~#U>K>ztLsPfs{o4NHwwydKhB|?&=X-*<4dR4`#M=PohPz6e!ml{@ zN}9h4{Bv;M1O>mfQxvd%Mh6-#AiTfTWYL1a7i&?-a#;-`PNFU zQ&NckVnvXFV9o(?nJ8K4FUT_(T-i!q=!Jy-tc}8id&m)4frot16~$D9Iod)=gQXD% zbpMB{6Q#bl2E))3gX8w@acM;jY8Z`QIJ0=M-%P<(AH9Qm$XDARo_M3;&#`}--Dsb_ zjAjEvxQljiY=DR{3Il^IQn7=nI90JC8OW$Dp0_kmlvf5Au>B^`3tp~(PoOI-aC#ct z<=2_3MxvtWPtI=~ghUt^ z5RMAKKK)&75KDtA2uQ>-cz8)CTp;syj+3i+xszuD04jj8 zQyNgSQ_?J(QtM{l?#GwuFfr940dL9Gf!wKpbT`G3H@t&CX6DNxyK~#5VP#&fNq#6F z+R(#u&MM0u$qAE|q0SW4z?7e)m4RD?;~XhTz#^m$Cxl$R(ol2U$43p9@)GL|$P&0l zl}cfCEbOdnk;~_kGA6Y-_i=^4jmdn{(>`W+-t6!`X?TRVijw&cA)oJ0 zQ(o@`y+3$nx>CezLPp|nj0-Kt+6AI1<{jcL{1U+rMHolr%Q9nIf%^xkeBh+5&K@#0 zc=)X$=ZbR;J{V>=M9UW=+h*Z@xeAj|#%kyiNUURSdK%Fhp$rzz=DPpRxF7eXUW@L2H#1K;5Q(R&mej7xk|55R-@RSSJYs;G$38#v z@c-RwOU-p7{^1PVqeaTK#Yq>81TV>EhQS(l++_{%KtK!Z-z1_#AOO;Le-x6Q!plmP zfk>{kM@V2YXMTKJi_gi+12be?h|V4+amIKHO<=oBLI(68dj62EE-bs$=`j&Vu|H^<;wTe0gdfQ}&mvyZJ% zF$v1ooB$mtL>3i?2KAJ~i=M9G8V@N<2NJJ33nB%C%*OH8ry60*-CCL@rN3rSv5D7e)tCwl!M@RIrn}39}cQ>gy2U1%CXuzYOpQ`ff z9H<>*1(J?f$BanK`YPd#(|AZ+g|{dU?@F!O>w&mL7S~_=G5TH+DaNJDMjsvI3Jy#O)}-2SR*Pm?>N+CXWl?%{FPIf^N23(47ENk> z?lP-62px7*FeoZJqY(^1V>1j(V(sU!y$s<3y-+8%4RsyO=YGXtrWmSdDd_78nGdqo z2wv?|pH>VR2**NxVd>%o$ei4a?j^dY(Ac4 z(vQ_K3NJTF0mR2svxE^B>UymfiznlNh@lMdx{PmP`-B3;GMksYb#uz;k1@H5F^n}v z;_zQAV;m51*eyK+trZV`;eW3cwKi+7vclv9YPE0!_rjqDO_ke5UgtxJtnbKD^KoJ;v|92c|GL^Ek76Nsd`IFTYg)}*)>;sR7@vmOnYCsJfNp7qJs8Ny>;Bsfs9<7q%MXG;1QB^P?-_nOnM%3^pZm zO{NzEnn)V9I)wcTlVkZ3D;PDhz8Kdiy3D+^%rCpk!7XYmt*e$lmT?q8lTx`qZlO~S zveA7Tqkt@b%D1-KiubZ?U!_)7BOm(IJ6R~&a6rpk=>>x)d+@#ZqwUMer^il%RH|M$ z%JrBei&KcI`lkN!nWiUx_#Ig6NltoVr8jG6&(33&`sPv!NW!c-U`|jw=!|j%65FOFEUDvZnU=gj$m|> z$!_&z))odbVEF7$fbqN>7yDFiemM8!q3JDpEKV%N-1Vbm$h#)6Ur8!i$fwN(Vd6a0 zm7-pS6?SKa8j}0tzMcR457G)M=Xp%cc0}22UB@^_0xF{IkOjQ)tzxR&jh?7#rSH-7 z1?JOs+=!J5h0-VKk*27rf7~teWjvQ%B{xu8^vUVaY{;$;Dd zm{&~^W{}$A>SEAZ)`=dnGijpj>m&TVk3A)E(St-UzXl+!{gG z;DpLY+I~PII^pdzf2NvNi)GGIcPk3NWuv{Bn7m*E$xvUDwjDVnmSLr6qUdS8reEZX zwkViu<}HTfQxdOO>nMO*(9q2RlnpGC5B1%bb;ak}i5a_tYG?~S#O05ut%N<&lR1E4 z2s;SCK)M>h`QQ*6_>ta^L5ba*p@T6r`9`AIrgeJBEa{^^AK7?va`hI74<(1q1DMQd z;W_)QvSb-t?HJda4S~Ydu*QH+`lJ0?~cLSf_@JGO_n%)jwu}vbE6o7v* z)KK7f*Yz#E0Ugc!230P)>u)rI@YkSpK*K&j>0IV+J|3mGo-R|~ta^{=|+S2%o zHz?`I7Kqww9rA=D!Rw_^@Z!<%;5 zu?b46X-rTQvQrG?wKi$DXQIZb<0 z@MvcRq(J{>q?9Pg@yUTenKjEL{~{L;)Tzv}hICUjYOJqzeuG8`7G(xk5#m{2V<_-B zD!iZ``C#m~r`pcp1x{aQ2*y7Tl81!)_+lelp6oldvoB; zpQmMjafXBX*0sZv>TTQRmky|bnY$35;=+gR()chzK!9f=Jpqod#17g1XI}GcwbU?A z1Ksm#WrOYrfhKIu8FcD*U@_Q~(t)96K6kjYT{&nSubio^j_zhNIU}ICOKMa}1eM*} zk$J!9>HfX;RVg4)x#M5x5kv=XyX;KhyR}LUh5}m%N`Fp9}=0 zN(!%R)NRr2v1!^-@fRlDm;ZKg+4g*GsDO*XR_q$y893eoix*t_UdyVeX*N5g2B52q zU3zjRcKr#tAC*w$hFEF^7jn?yJZPKkUe9LlVbX&BKqzGDZ7t700D4|;_;Vp4b{LVq;|c|W5) zZrvfQgP#N%cpT&@JoBZ<4_JHbn>`Sps4DA zZ!}(vfaT3ROTV#*BWgZ6pd8D%wFRufIRGGspI`YcTKZ(phl%c#dwHR~iBBAzmbD1Y&9TnwD6*#l_2A@jmgwqrUj{ zbO}IgW{Cm9B*(gwPQP^B?EJncYhb>J?2jc9nS9tEfLcY#2v&a+p&(Dfb-~ctlvH@_ z05s>^{EpZP-YEmAu-wC&;wz8%9OTbiWo=9#wZ3GE9K?tVtTy&xb!S(_C^&Ay=3K&C zGzTC+l>l&lIl(J&R21cHaYHM*)B~c|meWlTSSrafe%JgnGG9jgxuPXMrx8rGv11$C z!kmo40wvdGe{VwlPYuKLfL=4{fXgnKMW{^)c#mAzLoYG7@b&DsT;N>OvNm)8P(lZN z6u!o*2!381(Sdc@c|N&C5-Z}q6xO;KG$HdtyEdc_N@Yz!Ye?q&n_^>^H-+#4&z!IO@pCdrmaez?sW;S z0WnX%%0dP+pmQkt9HFVdtx?J7#oVa2Mt*=v3VOF>6<6@p$ID=oNccNuFvJW;M-EXI z57`o2t7MZ{SLHhTn>{gTG;HeK{iEZPU#bI3-#OSxum%Hcqi8BRQ$({!QVb$q35UX~ zm#7*C^i(76b6wZ-TnWf*KF1tVLN;rnkjFNTmQ)4PfX)&iDwWJD}_XG zg+#%1a7O&153)|#ua1d}Mk`8C?_tQji91ZNp9CeD^f3N4%^5kjCw~H4=;{C2(f-}1 z{>=nsWd5)Afsyf_!ETI<|5LJClZLbdHakrAnPQJY%%)rusl@G));dqI^?K*xL+n|f zot5}6NoSlP*|!Vm_zq2lj`cx%uCz$=a3DYUUT_3&wJ|U%%40ZGi=aiaaNz=2f)$SG{ZbWuEWhXnPZ=QCwPAXtw556BNAyvx~9<~?%F+a&_%~SCeFrAo@ zto;KcI?A=m_uGj^6P(IZo(!)KLIG@NxHK)hu- z0QyNpU#Xp%dn8Dg*XRctwO->ChOc!ap|5`)Yvms2(}^l;G^VTHHSLuU#vn|m=2+!| zE#Oe%#6l)NETFL0t$OXOh&17@{b5xE3BG0g?|uCmFlWr7A;^76`DffB6}L`$1q+xt z+@Wwll|fj*OM))ob_d(@2?OqH*#^(*zT2WNqlZ!Wbe}1Qb3Jr`?V8pML+`P8vIIz{ zXP#QCU<>)*1lqZLtq}Dhg>xFnf+c-MqJ1!)nQQo3AT%=nh8LpIF-q={mt60oDnvQb zc^s{zW099xH>!x1qK3+QP5&M3TAMjHdN@{f3tz>uCW~YPtg9Q1veD<*HbX9Ln5V-2 zY;;}>2h}LniL==F>|c0$^Z_1}1KcOAlhN}f2@OrS0SGOzday>h#3Oeu%&?@sOUB)Y zto?EJ9V!vFS|)g6TYUC5x>QRUii@;cWNq00A?kN?6rZFp7WYLPXFssidvQxF=-`_h zkmrSG-_ty1_On zICbF`f2ImH+sSGQfr1vQ5z^)*K zwrjbbsWNWNXw86CE|V5#K1~c2fHMB-8VF(KOc!3E&z@(FF0DEvRcSj!UFokSh$H)_ z#G}(#z}J9)6qF<0$OKBK19DDl;h*Y)Qt+zZei#)s`yHzAU3YV=J02snJ?jUfs zf!gxOcO<xwtgEKfmC2e3XB6;0iD+OKBO!`u`%rwye_%HA0REh>TJea?gNGjD*! zG>n?;=Ak@? zI_&-Zru1-x7d&=I&hUJm3zPkTz?*P~2$(_!u#n~vEgE=H$eBlgORNa9(IiOa$8t=RF_cuciuzS^rfF9<9TH80#!AL zQ;kDas2EH#X$ESNHD5mE(C-+2`x#7Vm|+fH?!t(6{TJKS34Ao-12}0fR~#23W2?)N zdXYhcZMXNe8nRZ!pnhvmiB}?!&V^p~vnp$>7w3z^1t0)owHn| zlDt4euFLVFyq`vzj@Ua{xv!3avU4bNw7UlPD@4)iY*(*4=pPZs(M5c`d>>Y>8in5l z6Nl@~!ybb9c1{z5#PclTrUa0O3FB5saMwPb$L5`2SgXnEt1g zXGn7+8hZp0bf4WD6yMa}cK%spzgbdbB?3bG`eSz8o5U ze>uS>OvcX#Q}icaY=D|q{`jKR#v`S#8?%drnGGsQFCgeAUwrQC6j=cIs1K7?VJX&B zHbo&8zhOr@SOz68MYw~`$WRSe)NC?0EMutf!XF4BDSE*!P$Ea3TIkfI)<(sG;g#9I zs4I3s1&E!VSG{A!1xgDxux>8~v-nGD{4mLXT+s~r!zE3V%XQ!MCEFU;5?eV?(??ED zHyYA6#D3{`adxu3?ZaRA1eOYIh8EG410uDfKz-EFz!M4+lALkU2vh2s4x#?pJva)V z7^Z-XwSFTgyk%h_>Q}*Q@!_Ng*&V0=_CIvGl`!uszxrdg#IS=wR=%Y&8D zZ$8xZTM-F#V8twaCkz=(0DdrZOiZylCt* zGA0yI>q4M<4+GsLq<#W|O?Wy2AbVtFgB*LvtB+r@g!xGM(Y$R{l&yq?r8aY$;6@)U z=B$xJV7#VQ4-*n%u()~!fKUnsTH;UU_7E5?!O~g0ze^}xNMk?$ur+Ns4RNm4oY{-I z5eFUWb8D0NO~Q=k`%3e63r`EA+9=rDC>AFpFdY$YCU%a+Px{<5R#v%A1M|Ei6f>BB zV=QiXBWL<%%6j7G!y6Bxez0Bs2|?b!#ZuAzU9u0(u~u!dQ@tnv8QM(rc4Tbf3l9}P zH0lp8WJ$#Qe8)U~*@479$1qp%o8sBisw!?EwjwXJ#1n!P%_6c!(9NDVaEq07goLkn z-0-D1Z=r~e!E2>{AhC$fdz;#+3+C=jkk&kt>F$iM4R-EX6zkCUNFml!*q6U>k}{;< z=Or{WA_L$Yu!8_@GVKZ&#`ib~-P3AGOxJ)PM%X*yrSTIOiO_8Pr#qn)1I#ia!J44g zs+;pB=x~Vgkv52#>?#Ef^x(=6=LtCRDk5?6LKuB?3uWT(v7E1lSeF{`wKGO0mTL>! zeSj~U?yQV%srO?BwU4vdE()l^tKB}iA)vk>a4d)&`4()bfn;k@H*%H#@B?pd@$s3_ zggrnXlWYEpCUf@EPzu84#lriRX$-{eX^psE!9nN0xiFO<%BHA$*DG_0-=eXlsQNPW zjhlg}frn@Xt&VA)KT}$mn^vKwl|r)8&jM3-T?{S>PjBox%w^d<+Wn%)l!1wSTLbd{ z>6}-`tEcZx3lDO}yo;heA*O4yF|xb@5i3#Rm|}{#;TFJ@3$qp+uA2$2-72MVnSV!Tvf1(Rh@Y(Uk=W&3wZc(C z?UXxFmpbb=crQDDhj|~DY#Oh7452)TSs1cLvS9Af?R#FD&gH$=!d0d|GKV#%pPN!w z`-aR1KcQ0p_09=HP!wOGeLFsf}3=rgCbHa4=bSLSnvsi&RYD=O} z@AnRMR|5IYv;jpU7{1~sfWqZl84vR?GxQ1ntz69$FdHJ=07r_=`mL@}U{uxIq7Q8{ zsL?bZ=0(v%%iZ)u57QKlW70JLrm12mE^6 z*8bHZs{MC;LO;fe1tsjNl~L=Z2zpm)SM@`$qlIJ58dtu$>L9osBe^(s(llo|x zuyDH~Y_t>c?C~CfXRx6rYdBhTl_hKlb*M@$9DAPf0jjB-o$?KW+|E*>KUd>NYDF*p zUuxwWLh|@N?L&Qb`|1z{QGL=hkC$in(`GnkM94K7A3MC{PbzLbkU<{!CM4JiR}As# zle`Ni9xmY!Hk+_Kj7jBGD$PC(Q+rE6@-qKtXY`~0{SnegYT4!XgFKIXl7dsH=hqo?&zF5e1sz0+onMc)yF=X68@b ziOji5m_JN2vjwrabvFIsbcGJ6lQ$Z!^L`?kdRZBOk_I{K-6bFB?MXd_WJqpCC#vH% zG72w%v>d7#E}-ZvSuf5mZwvT~=PFp}0D}TX6V7?bU=sfiW9QT)TG%D&vR!q` zwr$(CZQHhO+qP}nwr!m`(-DJ+{x14%|A04ktd%SCNv0U=YtdPk_<;(4%Os9>z7#J( zD(Jm2>}aC1r1^iP0o|L(lR8!=+zYo=O9t7tvF>-$H!Uia@TO)Wfo{8z2evB(5!L-0 z$9fqq2;L5VQ}X%g8|6n2KQDKnF%l zjWO)g+M_6ZhOO-VE;f32rH|Y*ey5m?%t(GQEDrPL#GS7sDZJGwPCf5znBH@0P|3@YiDHwjmjax_mFC#`xzP= zZe_+j_MK5v>~#R(S|Qk~>{fhbO68*=-}poh?GH_M0D6s&#&vi)F9uQTu{x(DvB>_qq7LrrrN7oH4R7|KIo_ z1LJ=X&KUnk!r8yM*b%!8vF7o}cZ7Skv=Lbwv#tB&(2?YXy`kkH>KZ&0rJ~|G5~(9{ z`c9meJ!T39Gbn>#q~yl2gB=JfrWZTg7T|lnK9+6zZr!gL=jnJo93)0M=mr$2kOGs|ZMg4ZGQHI(4pi%NIhWeS`c8{G)njt@S zf$llXIiOp=kYgoI`pRD~u3>wE76e;;?{){-EuBA%u|bCOzCnlD{`#dmc5Xo0 z;FE`BY&jxSn|)&f(4{^nWeg+5K)UDewpJS8f)%e{`7#m(WI$X6-5Q-gTIj0UlxpF` zC)m-_dlPMZ)+JXkY&U98ofE@&Z+!rZtcZ;YtNR$pL~hH$^O?^dUzEq~aRqw|<+B_YVoq z8A8f2?*A;$2hd1`Q7BL#FDAIX zCz>=AegConki`D4dSirccbTGpj=)|Xl#Y2HfK5Kho1TkC3@1#c2q#3@*`Mc8l1mCg^8btxGgua~; zj!NV}e0hlm8i z!#g_+ELTlH+Kh8d=>7kpVpPlUGz*PZ{p4@Z5)4ZYPBIC!B7WtzAWoVU{TmZ+M+%}t z<~s_7sR=U7@A}H4gx^P0md9^`cST8fU{Bk9y^3EIwYXtW5;2?RCathb7n85Tb&|t; z*O5Hr+>s{W_3^vsZKav6z95fg@z?iDMJ4$X9UtNcBV@LN`G4w>Y-KUOVt^W*PbnhZ zbtS|{SCtrf@jq?`yD51fOM;w-u|%nk0ddc zKijH0$xZaoo&9FFLZATtqcd}IMH-^;E{Z%=cI2*^kvi8rNxq>c*4Ch=xATXh31#~a zyr{6=>0B-&2Vw{1P?QYxD6;g(VJ;-L>0OxxUV^{-ImJaT9Q*^y>2b2ZWGMwY{q)VC z=~?@e09*_&4^*iCgshb~g0yw63`L{krN#T8F~~SSkZwXID@GHINg~ z6dDx~kyB|h%SjE%?LHUwvG>o==bwTCh7<|fwZJ8udDQ?U<{;AC9W58|Va&CYN!EVF zx$l+dGs^5orjfnvLX_ZQh0vd%NSEDV--xcT`S}F8C2OC?g4V=qiZ2H=;?$0mhS(&W zLAKsWLvC88AUuONWHT@fBFj07^#!*jz>5M$5koNId`R6$B!B3HE93NKFehot4FN8Y z6|vdEkg@?qBigmdqtj+4Y#>7>K#jCZig(b6hNy)tjD8|X&&fpSab!j>(c$2tr!Eu8YlMR|q)Q;n z!Ztr)^3ikUMY@9}kW(e!7&eDWayqI;jTrdM_Kv$O^Qv3eVEeL9aN3-32AB(5hS*im zb$Wlz`DO=cyL9b;X(Q3m>@<1+OKm-`Uh|Y8FxP&48sJT1s_PbN`qZdX2|Gx1`(!91 z(eu0_+X{`$KSsJotD29kRmWA1fna=|5ko~(r}slB_B9?gr6pgQ;~9;)p@*mRh@-qe zy5zqt^NPfhxM4J;(|Qz~H1Pde;fx7V{;+tzW^mee)4gTcvH5Fe%3;j{V2;4%)(Sgq zi(AWco{T08ovv(Nx&OpY4M9q>MSf7hhTpXx!)9^b+Sw~)Ybn_Poe&X{)}d`YEPab& z=NyGv3}b2nb_-d>dVoAEPME!$IG244*ZrUt72{Cdfmi^?;h#)XXm|L??En0vI{kfC z<}ScSrN#7}Miv7Heb2EB4>}rW!a)(A-CkcD;5#dQ0j;q6p8bF#H%5Y%4j5#9v_=U8 zZYJj#IzyGM2cT9J7epbSesiyq0@f3fYqyykh*y6ZF1FK}NngO+ zLQHHxV5|@f9;J^}6wyywW;!~rN??0nuK;{T`nCM*@m2I@COsm_P>+g8?Jdh^koe65 zG_v8mRR%S}W{>vfMGWne0`@~i;TE;7_~5~|{n?5+QLo}X3FPq*f{VkJa`Ctwfl4x+ zalfuwOu0N}pi?iS(%DD7$aL68n_VM5R6nl4hj(f!rRLtxt8~jk41T+yd#bMXB>r3G z?|AA7Jkqi(b>p0K>RuwYS}gn5murBOtsPn@0W}@LWHjLn&BBy3sNn0L4N6~;Xh!k& z7z|^I=imFo{(A8mxjtZj)Q0~TIKcfaoFU`{9=AXVvpC*hPyU^mCpObBnU=iz-XoPS zr$4svk!@3_{-sRQ$e5~Dr)}CGOuQDO(WGk%5#a;QQN;AqTuN_>`>jk22}QiSYs>lz ztlCk!_a8>k|0B&ZvT*!giVp+he~@OG{zua64%UVvwg_Y3*vG%ViVc0wuG`8n9)FXd z9oT7Vx=?TfjmLiRM~2bxy1nVj%iHQI7TkeA$S|QAMORhTU9p#{m-(g_|G$TGW^7e_ zd<<7tY*hw77~g%mJ(>*g^|5@pJJo+Xf$_UctMQ)u*Se}!=DDgui~*BULpxrYN5M9x zS`=FGigoU6Rpq#PF!s^LLJW22*tE{H?MiNb!L9~5ER^3yOrhtrEoeLE9x}MhYHoQU zuM}Y$zu5elXg~BjcTA^Bu1Xs3$EEE8B5(N&79^K^Lh4{G5hNQy#*$)iJSS2vdtcX+ z_c?*r9Yc&SZuNXM7z(t3kP?_IguP?UzNSRmcj=dWRL5j=zg^$v`c?L~_R$?#!h>r{ zLZ8@k8{?5t6VLoZ86wT7n$HjBu4?3aR-lAkHJ}Vk<>(59gKv3B4BcbG;#VCvbmHCY zx}BHv4?a4;0U;xAyI_NwtVX-qlHb&XQ=dORqQ76FkNcW}^%O^Skz$oJV?jmZPA8^+ z>n*4AJJnE*v;q^lKfuyX=*i2-A0wOFFIkXHd%g@?zLu0Kv)q#Vf5eipj+g6^+a{TQ z-UGWIxT~GakPVT1XTp9RhKS>bnL<5LM6*y{MqnIa@D%f>x0J#M}-Iuu+sj~w8`6+-HmwSqI`EhU&&Yrb zp8$y$bZbdHwRMNvD^UR90Vb)U^K;IF)dTyuyT)CCY0G!$$k0q(Au95<2c2SR{#>VS z=sEL5v?K}DlR{%V{7PY5-_C%&oMm^}(AuGUYSgj-+VoFWSZyr=4>}WO7m{uB%kx5% zV~&a_LsVJ#+a7-MUgGVZ$-`3g)3+-C+yrun^?c(_g zyddFm!D1T<4XHp0^sZQS^p_77M9Wnv0w&17p$H`9C?MjFWR?DdNb_WD5hg8hLd>`t z1Xu=tN#k03l)y`U0*~w&4QNk3?eyY8NqQOKXdtSRGUA9DW z2zP9E2aO3mpm7GtA${?;EXO2}Nom)oCxhK`Ql4^r5cT{R2Zc`IXi=Jog{|QV!*3Pp zYEsc<4PJ~<*a!c&0$oQ&hP1PWNX`lESVYj{1YV&bvjNT9@Ju{-S+AF?sG<9h?daGDPwQ{c`Hi`)4qrRp%>uyMjGt+ zIG5wtyZ1MX3l!o2cO5wBxXYozbn$CFGh>@Ob^6jD-SM%!*Kix2K=4~~j1-W3p_ zQg#)89C*`uBuVDrUX+Tb1M-D;&4UX=k(?Dhy7L<_!4@-z-pJ4q(6#Rv^TugvU*jZu zClDZuVXvkXgYif-4Y==11Lu-JX)Gzlr>;3)AIwzdnj=b>!7c2Gp2wFF0R z5hcdHN4UN=VzwZkXuoHWoMrE~Y&I^xitKSZdX|Hh3 zL-@G3Ve~gen8G^!Amt~w=oG4=a)4=uXg&qEu)tVq5IM~9-??W*0eFljJ2;YXFp(oK zu=K|7#Pib4mme+Bi3tsep`Bm4kbV9Mc-U`$9W%Fb_*WfF_n9&nq*RfAO1a>qm5#Qk4*)dbn0Snb$uh)-^+?)^l5?HWGKGO` zq;K3}5hV5zIXth3H~DNcJdSn+3DTgCAz}z}wV5eKBI+*);gi_`E*QEv79HG-{g>Ay zEsPBz5f4Ke1bD6VN&PU6x!uH8#SE7~J)bU*axJM8?|@r18&#A0J{|x$(GUPqxEQcF zh5vX$_}aVJgtnHFU{cj-c{My6Bek=d=VlK(9QSSA&Gozkb;^~G8LfsqcV^DpE}V>Z zJ}oQWOq0G-RfWMdGTPiZE0VeG;6p5F>NL0@VI>m~qz((}{t99S>P0IuLfdkFx*{%A z4UN*UGXr8ZBT%s znhI`KAOHm8CZZ$CeipuM3zD7?JDHk=LUSM-M6x}d$m&cwfrzMw(a~B{$_^h5AGK*GUzLt9C>ibt#v2){naIw?MX*nO zmUL$LQyGIv{~~PiqhL%>ea0x^fq(zHG?-hk82Ca|(_ZSCpzay=pI<(8n8gW|y&Bs+ z_3-!g=Vy;`Bn9E|Sc9VWyd)kNQ%R4*dMPBHeuV?;1Rwd_9dTQ zLsT}CDdvFBlmfF`WaH7CnGbLqKtMuKDJVX2G!kt%aUx2jzj7}h$a@ns_z6JYD=0ZJ72*bTB8K_8`J#Ln^?;#3n_Zbi}K9C4y`*eu0{KN$S&Z4|aU$ zHe~e6%O%nAS0s;je_X%0d(znq!Q)Cd2-v<_8aJUtwY74odhlU>lG{GT5NqOV2*xqW zqkCAkN=53)-Iiu`Gb)Ha3OUG>Ry)0Zgp0>A8^+zJBW|j7`i7@jDyhESBsE3XmeJ`c zov+Z1mEzr(H^(-Esb%s7Oh17r1RD`vDJ_9Iq0%q7mW?JN#!I=cU(7>3S_$l&Q{c>Q$)vrT_g z4Ls+=%MY_c4m<0ei5(S6f*WhBL8$z^pB-H;6FF+bd_y1#y%Et{gNK>)h8dPp3%0pK zy9W`Z%PF_(P>+P+T|X52BLsghUYWZi-zC7zRgir8(J;I~w2w@ey$4*~PC#cafUnOU zV_y08oE%^Ie6{%&9VR8?wI>vB-19uZr%}tNBawgNb0-ouo=wu0-Tdkk%q$6v`>NSd z-KXU_NBKhpK8VHOS(CB5Yi1CQCx%Y+Q{SoHM1hH%IIr#YoJ@z3@an>TT3@i*A1d5E zc4(mVk1c>^o&$Z6*Gyy34eO|Y%4wIihM695*s^g%=$u_d%J=FC2bFg3CDZp~CIEloHtz3=I!%-kULtU7(Jp_O<{L$ox zCp*OWYGhv(_(GH$X+*@= zAQY3M8|~KQLQmhd&LH=LyB`kxzn!kY_EL00@gDp=`W5ZRG)aYRz;m62QH;QGFeR`F z8{i?v3jOn- z_=aYL2S^p(>3D`LDN-T|g=OL8pZ%4|Mfg@y`d%KSZ>*~D<4@vh7`x)jAcPK7+{Ho= zGaeue%;8d!IMmRQMLOJZ31B1_e(u!J_b2N)+>#>4HpU=;`5?^9v_^#$2y?;7J^z*6 z7c%j^agE(Th^r!r#F=@4*gYsYn#`Tth|AAji`AzhIq#lDIYoj#Q%Dn>qF8AQ0QG7A zz(3CpqyP7X?Z4Kr|9vxHVy6Fp@d2j)a5G@~AKeUEv^C<0M-Wr5+dLlh%qJ2nTF)JK z!%Q>=Sx2qz0izp8uETUp&Dvz&cs~8`n zaIQXLL;gPQ&E3}ez9j7Mc=?RD-VOYntL<$+Y#5^b`*Cgi)@5~m?3(>HP2bSf+hf?{ zCQ6wr$~fuRhqcMB)U&B^<5{|W`+0l0G<%Kl{f|EGu~zjn;I+qf(zz$p^{lJ0<5SPq z-!v~eeyiY)y31wO>88}RDDC1Ga{CWwXzkX+2XW$6g2U~&#icIt*0y|}e8US@$1qc@ znjQVHu-l*uS<@wVXs!vxbZL*kNj>H47crA5bt93+{SQZRdM3Ta<#pjTW%IWCyna6N zSNktV0aQD~9B^d>iFX;y{1Iq~JU)bpkL-|r>==hQk=MJ2TYRURDDaf6CaJPJSgiO` zPaj%kn_~N|1-<|Wnev-yTm#HHdxg#0%kG;lg@wZ&8hV_Q$uUTe;9ICvSJ&_U91NnwC&9URa_}*x*KZNR1rTx>H!j=c3E+O^jsa_rGrZB`&1?R8HoW;RKPWAH zvG?j!on}T7_yA$Bh12vO4=#inOq{T~6Wh;ws)EQftApg|?P(VFV1W;Jw3FP(^%`AI zY3F!)1qX<(e|O8$NbY~#wQ^nDd}Tk$KKy6g^b%1Xeql^=m zsgo1}>+7`yEc#L-b&&N;dvJej)ncQ(K6xVhZ7D>Oe1i3YT? z9ceUjAH8;+bb!N%`0Ew8fCo0{e!Uv3-by;^V>$^5uaiDSkuMps>$otkJu?Q804nU30wGO(Ns0Ksi|cmGg1PmnSFlG(`*%no@-VJ*Tt9 zDM9dnSV}j_2~>GRtjd3K7%f+e72!x81#J*^OxJ3iDyZi<%RuL4aX^G22p}e;TujfU z0j_v2tlppa3z!5=K*RnB2a-pDc%2_v6FLF83P&Y4-RmYol*N2Xqr0%v(>*dbG4)jc zZ8pAxq06O@SGC!JA;oO)3#TnHe?{npMM-rgk{gmULVT*xFTEw@j%wQG9cXr-;8Ck3 z3Oj{g-DQUHMh`_7q!~E%?Q9d>H6~Y1+zqA>^g)tkqW{YOjvG=%)>su zDDJhW;YiaKaZTYVZD}SwLOeRRRHJ>F*zD8&QzRPubrc$*s2S!q_9$ryafl^{HT=O) zAI3b8R5!T7SR51Hz9%F+SMNI!wyW1XVST~ySue;OmAgu&T6l$<;OYD_4;<1N#9Fj#Mn`}#)OV53q>{Mv^FzGxXJQVMa{opjzeWvi?&_BQ>+gmJD zx(6;MmC{M`+S8yh>j(Zxxkj$XsW;d4oZdl_!#}opePNi@#t8*K*ffa{f7ua;KF+G| zv@)T>sI7S<+)q*3&C>2+l1Anaf5TpvZS;c~H4$CLD@z?;M#{3nDg^_lKQN}~TFL1gEwx*8ZQgkyFt2rv zl@4+IM2Gw&R9HilLY6ZJ+)4f0h9DQgV}C>Jcclj=uEjm+U*4B!H(kW5Pn)bzkS3%R zQ9y`WNE$Th6ZD&3P{rLtjwcF(|7?AQhtD3GbjLjGoxVp||dHnQx8iVHh}2+)ufrAfF}ubl#7 z=Mrz!BHi`DbHM*Q#};^m%9RtI@-^{yYYGlS;9>W6ffe0^qi->p(g_RGVFU|6;0BK4 z-J??Ip0KqzJWgo=ig-XK0Ebcll%*yOP0?G}8%4JxkT!uV;j_Q@<0^)>O^xzT#xsvH zo1wHW{i~-lyA{m*DD)-AbhrUS5PZh{T8g-a<|d?oX;;tswh%5+FF}eA@)&lEGdiPK zZM6RdL8b|Y(c^1Ho*_s!&g!-lelEx!3Txpz z<`SNYC1|3rH?lG{&hh95c{b`Z*Q73!wwWu&$)xffxcWspI0acTewcnj%y11kod_l2Xty;~r-J z!Y3Nr0>b*?i(Q1(lq1^EX3IGnMe~G?Fr1@d+o|}@S~g=T_@>-B6~qOutQMO@W3()6 zwAi~%h!qF5Zt&H`Q1FXj`#6S(^C=l@va?>Ot@CjsKO4w8`V`HBOMopyw=T5Kk(8Wm zjk7mFC#+K$v3LN;tuv*6C7vKaSiU#Nl_?6E&|?cZ>+DA{z%M$vE^V67cPzm!QZJe? zTG3lec%_PCM4ZLE5+y|&fgeH!)xa-A!wdjT=%*E+<)a}WK9v~hVF7>+t*p?Ze}3DJ ziIyxzwMf+mNZ11AFeHv2#~&^LkiP(g%85{aN^CenfF=zk4QR-xbVEG>$kC!?W_aX> zTY;LhJ=CG)VK0^d;jv@~?)L5M1Pg>dExG&>W3qN3<>XSQy<@t|(3ySm1tPW`OoX$e zopzOn?YE%6>Ys{;8SXh@Yn&F;y;lj!vL}|D&gk#vCnlA0mpS_RY9}n)4zVFQt(U@r zIBUV5-XLCPg1rt>;dc_{a!O8#yD=#1=IEZtx8s*wLPEBq!FmEysJh2q-TgHR}z>(i$R7lLaum3!*- z`&!g`SWvF|XCX2R;1m~UcHk*{S6+iBnV_5&(~ba~5^ufH5?;V=D=0taPv#R(+Jy0m zrNbaaVcJr%YHdOG%-dVD!lqVv^2*x^&cn?0RImpz;xkZ zEP~1Tb%Vh?_Hqxr%{|=f=XC+dDYwSPfz!MA4s$|Rd+CIY4Ot|Yq234A`yBs z>;P*Rqqzl-od;1j0`JBPX&>D4v+^me691t?p-6QDLIZ1RS10;M?nO!Zt`|ZN-Fui# z?^S+<7$zg_&_#S$`bT+-6AQ?34jB+=t9LY6vQa8wB=X4nyC3Z|;K?)IkL)u%6)WJa z#pUfWXuQGg%%#Ml4lVv!fkTXFD9q!WZtF8G(8W(BJ@~REi!jCNARRu0jAlU!aExRg zHz7cPKTfG}Wo8)CJW2nU;M#xn(dhaV2;n)#sZf5p{qvR`gPv^M%8pz zG;s8cOaf=4Vq+2?6aVIdw$}vBA&HaKCs4p~Bjz*zq|#zZRY@EX0}}y3b<6n3F$)D; z&wP=bSf&=iv*_Z}7!cvZqh4Im;w_>ArUo9>sx}FUnQ0UK*ItQ1G+W@rAs50i`Q<-o zHm7eAv||%?iZS9GD7RUFM2W286#bAGxX=N#EW1jCFN7|p)~({#pouq5w=@$j;Kh!_ z-?znj6@P^M?h8c0XVjD-XWy~gF`Q!{A7?TlSQM_yZ6es}gQwG(Z!mUDeJ%A%fDPDK zb^MX-)+&cWEIY^z7d4{xxJ;VS@j99yHVwF!b|;bCwGWBBUFI7frI9ECPxx6m>;<5u zSP{o9QU{l_K0~S;$(hO+3>&h7Ssa~k7s2^rujV+w8fBV=@_Y(^9wcXac<_( zZ}T9@5DCqWF|l zV^E;=)PbOpMLY}j-DowK#MRu9owZNG2^RP+y=$j%=+X3jE8W=DPZP+*Dmx_ADq;O# z$mrCp3ue_JcasOhAo(7#T9_tELr3-3T?k`2RV83>xY1@=8i5M7oC< z3_g$;rxTjr7Ce`5BSZ4f%(FbYo#>*X8zlY5iJwq_lstR#Wi9rO-f`;}(qBW=Ll9&++-c5e;e8tBs%1lv_=S z3VRO)^GQbliLsEO?TL5_8jEO7WSxJjxOuyI*?V8&tL7|y>H}>GPLTw~h<)dvZE5|+ z?dlAMS00EiFtKx;6V8QO87*_V4*z_`l6EelW;*WZS9xj*#O(@)sdP2|BihfFhDR=T z49AM2J=;r@5{odZ?Cl8$ZZu@8Xfx?0WS+C?7`Ib)h9q>TDG!vYRQ^$39 z%qhOOit+wgT8A!hVaRFKDAT5lsOJGbKU~<}O$j_Z5Z>iJ?v`#g^6)-JqTI|3A9%jM z4zFi2q>)ii_~hE6z|ZI@sEe;dkS!g4zonlU*lmnUkE7EZ8t{?^pG^;J&O;!ho^Ce$ zINMO}`4lXux^}767)E*1=YK#)U7|;~Zp%)fdQ)5^-T3y~A{ju|e6q%3{*-=kNvBPc zA9OvPNM@{KVeKn@^7d17hI!DV@9~V93_{t&7&GJ21f9n;wtkT)G--BB1gA8*Q?LEd z!2Y{C8!JIMSaj3wo!GvmalYz)-hO#(8Xx%0`Auts_C}B=RA~@98engeQO*jAsGE=4 z5jQPvzDQP#NN(}6Llb&}QSnA^Yu@S7in(edEA}Pa;WWyZ}bdBp%Yj)???$6{$z*KE+qAUlXjCj?Iu#BS>WA;m=IsMj^i(;W9FKkPe2}@7gMW19hS*D> zr`6NwywzP4DB#E87b8(`jL3|6Ju-;i|_$(>BEdqs}^Gs=Nk_3yW-mV&sy%6Z| z1ku?{1Z6{>!4a=37VU}h0LO=RJ&sP?`6>YkYSoWcZq9nspa`053#Q<7ERiX)pWv`4 zqe#whhC4Vdm3OH9Vvpt38{7c750mu)4O$2tKYppmmf0EAH>7iEj~aNMy4H#=nl(x3 z^--@zxzruc{^dy$5xJi(V_j~90Q2?=S}8{#c$vkq8!{O)9;!z{snF^ZPtuOo zHN7yg^X4(pQn;JyR<;x(=_pvrQ#6Pj%6ptFw@GbC0HTX)i;kpV?n1!XgL4CODRJ`6 z+WRr-D9zP$JD1h_81k)!YvcNJen7c zOj;Sag*78))DtnXL|rcFMbfZtantro;w9rl3zi~@5m zAlG*Cukz;o&H2@76cXbGB|Gfhhq4AuMS0rmsl2@lH!u^Z|Dm>D`3@R9Vt0lguy8pq z4vsJv0q2)vP{y-uhVyCn3%d$%2@Jr1I#u3&68JFB9#mM~u5>hsJfc6OkLYa=)(Jap z+zI=Y=W-@Bmg(X|^ZOMgDDpbB}P3#4{3Fo3>L!*(`~gvdU;P zr_`w~Vy_9Q$ED(pQ(N)S{psU!5Ml2?s9Fv>s3g);shMW&85LCCC_1_)5@Y&hcr~WS zTs3KhC*FMQl^X+i-!B+tApB1OU@KZ~Sm!Aa_M!$BtD0VPz zUvyQ<%SVdgik*RJz|iW^&^m->j`=W~Ymf`Pd%yHg2py7nej%pi0qh;q5m|^QVAMhc z7Gl$b?@(Qp2}aL;B`fH9RPW8@m6GY?QMb;&E6(kzr(|B#NTcFX9J;Tup*B8B?Gy|I zL005J1^1M;>XHUa0vXLGXE^K7Q zixOwn)1=Z7W_g_f-H7k##O{iNHFAzOihu)>`N(i0V3~(Qp#X2PgD%~I2VTfO0J;J_Ke@dz zZeT|Iq?JJ(tzyX4_3D~v6;#CG26JAakF3g|wNiz4h9~9srU7TqD36G5%-Qga1v@YI zHpWE zUPOHe(}5`BUi{n*gL&;SnQU|zn7J1;w7_4WZ=EEQPC-MJYNn!w9tYd7|Ms^c@I}|JPFK?$Y3z_D5*`cl$67)E z3?woC3eH<*|4j8YkV#l`LB@wb*;j!Lj{WS?YbXbQ2Nla}{$#vK|-P=RMgBFuGAm~>}Qtls!n$=XQ0<(@c8`9;5DZUHX}DRf1Fszbsj>0A^) zS#a8LAl*4DO)0&HOMOOB%ggW#NceMYsNJ&7YjSHp;9z19{Bh#AkV)_+6&ND zApHN5hXH7j)}a8Vj06OjFFrxGsNL0X+)a_ z9H{$VO3%;yf`p1j-M{QdLrCxNvIE%MV1beov_ftl%EtLl;{V7THBlC^E<1fwX5l-1 zi&`D#uxuk{(w^$3Lz&lM4m(DH{%2LMgXJBH7pzw|mg$KDAuCNP)IsmkxQGyK;e!NZjo1@^(HUs0Ewf@m->ou$mKzfTesD~DXJ^)lNZ|%wBAl9FRa_D$ek%^rcx6jdQ z!DGRdO!CSHWM`Pc;MI5VLXghNBwc$rO1BBH#5gXK!+@zlIP4L<` zzIw3oPvWK$KmtDDQ@?TrP5_{<@!F`OPublscjm=rpJC$KAZP^bZUD<;w8kl7<4~J-egh~-A5Xp2s2E5Rox;gEYxMLhqjN5X1Y*#^i(~uY#9jQa4 zwT`9H+mX)!gv_!I|3YWDcD1f>h!{vhgX#5w_B&K};(pC40Us%JhUwPrV_%#UP(!xG z3(FbnLz6ErDwngW(poV6qPJ13E;g|wQx z-kql=T`lj{cghZ&b3+{&nV5m=SEpR3?Db(E$$?MJoMkRryamcLg5EOW#nj$#eQNFl zwp+l;>ox1aE_KJFYH4o3sX{bghoo1~SS55GV^P*hFrc5M_j7*GFx6S2tQ_@D5CP)j z3}lrGqI(As;3+xQF4k^3JnA0$%2fiY%cDXetg3>auZYn)1YMv6f1>k zar@yKKT_9;tn^wn!Aivf&_hVlI<8dwgAER}?s+@tvFhzo$w5A{ZZD;lQ?1uY(>gwf zuQ-hP@7)3(Nm{S9YLcjhupcwD4HQa3?g-`61NjB*1Kd%RJYc-}96- z%K;X|7vVP+l`+2OD(oC6`#*LseJjJFWcsEjK(CPwIu~^I#ahZSu^K{yN9Efklnz=_ zv~s4%)Z8trOG6cu_E=(%qTZ-QYcI1}pb$kcJE&H(4)5N}=%$+agYX8?gZpKs*j>KL zD6nJP2+HW4i>DL6&IN^u&SeTje0s!y7+h-gjpVl{wiYkd`8Hd$V38Y@jg)AVnb)V( z$T~${Fp$@cOY8CMqs$kF#@PuAT$)gDt$i;>bb{)8W9=0xjeA3bm0GguX~@sq9d@ zr|G3s=!VfDuFUJGdY;m8GNfeyKe-aEVZPZn{hhDo7+C^dA6Whcdv_M)M5m13le6HMf6Npv8?T zDO08hj$gL<>}e76s$>g{4EcS`J%hXq*hH=i=4>M=50`*5Rb`#Pp$)6?Ux8oq%Oonx*C~m*eD8&tA{7 zuDUjlm8Ld?RdBU0q~(5>Ly1rJOVUZ@Z^W1Y`G8H2wPpdg(&hmYwUfEX548=a$yM3` zQ*FmG6ch#>=2!-j=2~4LGtED+uXzZZX~t(&p)LD;!9X~WM@)g=A1 zB^bgF#Q(!0&M>W|N6&Jt38uYjcWK}XA+jWd87lU(8)MfKpQ`UD(=O3dB%pn_O0xL# ziMV;hlBBrSHbzOmyJZ1dVT<(f55Yu&oakoTV*$Zd$Pyaxlnige5dLt4DWpM|R~VBa zEIFJ;kkFKip=jrY$0)lUHMoGoVAZx35fd5uCiJQNNwiekPYuCb8d{C(geF(klF)M1 zRz#rbk5y_O8-&A^Asd&dogiSWz4Sy^yrXTp!VY6|{y@jHO%fmg zK_aHLFsF2hZmClKM^aHZV)t--E6lic)~FbU)qNv}B)boj(5t;M4vCV%dNx2sae^Ri zPhaBRecj<+8eQxh`zZju>B=yCTdxiZbO6i(aBxf_{=T`~Zi&2z8ERK8YK0f6_uk1z zfLICHEh0~2ydHZGONoNGX&nJv$!I;bKmoQ8`4#l_g5iNtZfrOzdxS$ys((Z5lz6ku zT{#$NuF?AXr5G&w>?<6+Cg^}`1O&B2DN(=xS)mYjruqS(;B>4Q%v)pZ!q~UR&6JrV z*ydv zsdb73*HC)Lm&QL=@VqWpCa*o0PVL~G+cV^5;((xb*j+q~*^;R72;4t{dW0ZM>ePXI z#FiqiPZc!nVR;GI55}0V!E^yowhnvf!{DcV2H)^I@ol&+uQAzZwx$FTr@omm=wb^E z0ScuFG3DdVx3BKFKA`@GcWe#%+J*wn}qs4AC^j}CxZb}WZ zq0vt4*#W@`$Qbo5mcjmdBcw(|L*X?Q?K1?KefM9ZFJGC(OBG-M>5oEI9YyYlFuN~! zF8B~AIf+#F^_%QVf>_AmxJ2zoI*W;!ze?gY%Wb?)~!)YxW!g)@BF;pR_@f z|BJDAiVm&Knnq*WcCusJws&l2$F^95NBx`i~M$IeY(fCDF?Te0Lbt>;I)iH-s@T>Zgrc}OqaA)(Hz+h}2fr{LK!wBA2 zS}K$37Xq}@Ldh__lM0NV2Y~EA`1d_c5lB(TYN$}IcvTt=r8Pt>w^qy*0IAk$5oR6` zF6HgE>D(1Y?o>WdJs0)Q5tR9C%PDiJ2P)sAx=SqK83ujePFXhGt{VV`_|?n2nVusW z?7u!1^4G6Hz|0ic{p<6^ilTOU?+1OpbY%|yVKD#yO6^Z)-G7x@=6_IXS^g)bwn$Cg z=BE$Y`?zLjzaD_i13!kxKQ}0YC@dZQ7koLqh%X5j>-@rZcLVsSdVD@0cyQj~ALkz_ z%*G`7O@nF70`2SWc(Km?acik#IDFA&$4Awx>R)Zh!;5ua#=w%*N12TM!d-1u|7}Bl zB=}Do@)k~o)K42S{J+|emH%HG@*UMk(es$O{cK|`+8Ts}H@wBaijO;G?TgZgYy`5P zNmEHPic!aY7vWO36~T29_>kuPPWFUYPc>1b(phocW*1GGN%xFgYD6)~pMk>NU_6*6 zU(zzyEj8NL`Wea`%{kboWrxX~>djHC-di7W@}L{3$AF88NIF!&x2_6;onc@j~FKqq>___KN%>oC zHJX7B3|6R(_Gyz@P~o`n*Y>@i7D^;dDLQ$XGDJ4J5l9V-#=8lD3U`xy7D zaO?+=9W=+*WnF(!p2Am|gbJvh-Mp;~rkq3?P$A@sRGy&1MaS?1fyfX?_N$eCN!&qB zFmN67ML$#vpiohskxiUKs5LyS?@`rrAS=y5I_G(~4&v(ONWzRf?tSPRaHytydPO2FocdjjuxxL>gbN^=mEbIFA^9w8dEWj_PE z2QMJmK>9u3UAEO7!FG8kEh!Naa3+S98???>33^V(0_;HE3^8SvjPuMHOCO022Wm<8 zu!u{SS;&<8LJqnbBE-z8m>D0zDwf@A>IK7tw_J1lFlHX!EDEEAdEHXEx-^{DhK(-@jD7n-W}@-QV4R zcU7Pm<$uAk*%p~2YX(%sBqeeh*~a3O!&@vryavVJ)2mBc1s420fF^C1-j<;RTxiq8 z$R!*()l$b3B3~k8w@&lRgV!MkRDg|{)8Ib^RZs^;c12n&28@g}Wo%2{?4%>pr0N9~ zM`#nq`ChSg?NiXHp70m=a@$}J{1s_`b2b~o#@)@#t&d5fowEDM8XacbcndKA+B1wE zZ|!5k9@Q2Og96n}fssl|XG-AcIqE>~dAgI0nkkUd$Bf9>30s9%^+G9kv+C2oD#$N@ z*&5Lzsrl!NvYQA}KUGWI;(8|a_!t+-oTXtUZ@(dJ@Z4&@PZxgcdM~`eKj&p^nE9kM6JpoR@H^nAHNM-y@$tu^~OS(qF`oR-XHKTb}4n z1M7>i8x;o3wRVmE0SUNeu0RR=?{TxrtRRohoLRM@BB=h~FmsquVll;-ZX91hVj+8C z0V0+WyLjLxVV2)#4(#_w-Tgwx<1h3f_*<$JOc-AX-LHrbyHJ2BF+pT=1w9Y_aGgD1 zzIQT49i9o9+tWYAgi|$yE<(N{-pjzAWNGZZwu1prKt)J&ZlBZ8G915pp+UQ#C&P4* zHe6Ld;l0whng8#@|L^Dg-vQ3dO#dlYWnlRSM#l0#F|sOk83zoulZwt}zdGbEFAaRA`L!(d-eU5x1`U~t_fw~yetMW9fJF zE-0uZM-Swsv6+&cH5qVO*SmZ#(EtpZj;9h@Z_Jsrr{|CKI?0xvAyZWU=Vr!d<|>26 zdLvp)f&F#9IhdaWXLDye?3vR$Ed!60Qv#gUr%@xD-9aDL9%Cg)HcW#2^cE1TMie=D zmcVdz5{xe}MdjYUYPdXFERK~yvh2cGT|HtD&Y`wgbfLYM;3 zttR*H=J%Tw;t_Eo*DE@iaGCR~c#>vSk--7}~jylH4%`u$wZC=Po3<3wUamodo$5(fewDA zTb0>0u`tZviu%Hql?4Zkd8>#5{=eR$iP0-khRcujvw;UH8={(2R^pH3O6*lZABr=e z4!K)IZTiSV;WR6#SBd0?5lscuJiz4)N$*TX=a& zh|lBIfc>&Js(ouE6+YS98~+xF*Eac_!jL*8ro%II%^nD2KU)KZ&z{SGC)%0V*Beom7TH!CVkrqC~rvd1}UjDm*&WYidl=+IHyDB1w6aKdV)0>uss)6TqYl%aKZO&m4pA~Th5yPYYp}Ok+B$M z6s$2v@*2XOUA`E3Gdbbws8^DR^Z1rE&c$laFEFzl`U1&dWT=PETRxd7YpN#s^a`Ul zJl8%O7>96q`24}nSHfgYfC6YD`uyYJ!-adADyY}ZP0bf9eCdV28!X37pK@2i6y$W` z3c$YuT-wx%Q{c$ALXoSZ!G|GD;0aZzQyyaD9V2GRy7Gv`&4dslsC zI`D2aD)suW6nS!UsI7^)sj? z)Gah4CMN$b2LFI!o&+X3=1d2Ym_l&CnX&yN*pybb&S6*}FtVWH03V87L7)Gt%uXWX3H=3(nO}pWhP@@_fwT(h{B z820_({QJT#BGKf7q%H=jOz$G1e)h*pB(0J^h<*6neb+57FPmv5!xJ(-4>@4PgVtmAtlJ0&;akKnKpEkFRR+8cvsGtu;YNmkc;?*6>Nuo zMKY&3^7+`9hcnPlQpXqwx$4ikC=mP(BB5k!9UO1QG-YGB>G6$&%UccUcuM$IUlvsw+{R0ExFqH$_y3F z?i#WAUz;~#5c6f*ODX7563S*y99<&_EZj9Vi%6SWbU0>c-g@MCK;J^yHZ`PdNLmoVJTrA?hpzzoYhO&P!*px) zf8AUSqy)k5CpB{Q{V7Tss(rlv?djOCQWGZ@jShhZUB_`@u&9b3p={)1$sQ0K;`4gF zzCNj|yLz;_AIzq^|Lu|ygB=Q-{&9S1bsvKZXAcXo9~@!g(y%+hMT|-!A*y~eIRmc6 zu&8#4p<2DVX}#50y#KNjv@pZCY1Q>SL9yI@)%+50q)7Fr2L@h|d{X(n+#!=9&*`1G z8%hw;S`4^Za6h5tvKn|C$9(n+noBv>a(%kvra)DtWxHs(5wZT0tTE_$Dot{OZ=YHN zDqt@kp-B7P3n%YKV~v_J52$BsX|VFSE;L26e0Pd#x!IHJut6>l#ePPRm!b6&#cUjo zz!DT7a4gCi0FdX<{Fla>QME9E8AaQX&Y1@=P2eG%{zL_|Bt$Rxa|zb*>v~HRhJ|gV zJ6Z_AboFZkaLt;(u}8jU3t_V}yt69-Z1bJ}fE*H5CTamZXgOc;Y zipOd%&Gze&6ZpbUj3d=di<)&{FLoXi)XW;4ZiziqjmBvv4%INiB_9$xMXnKqa_PBc z4ZJ|%RXFtFzZZy}qo8j&V;-96C7&P6*W&NuI$qL$?EvW}-Q?Qgdz^BC^hvV5Qo%f| zMB$)FknzlnsjJso|H{6D)IHC9X%O{#a7r+XLEHL%LLxbioO*$pIJa7lp6u_obIYI0 zDI{6djH8jvOO6*JJrZZ_TVISw|0S+w-t~pFpt3zl{f$9He>MIjPhr2@6Tv6kz8i4( z1+Q&@ab$B8b~j_@nDf|eys5HF7C7T06r3F|h$O9rp}>)slBz?Txs^zXffIGyMe&=b zwD%o!q~HN%>dtnzFf@BO3jSC^t=J9f{I?!*d9)>xD)j@-2W5V4zB>ZIe8CRSjJ<#B zP^l&{9Guu6;ZA=Jwacsp){t}ZC=JeNBjD)3zM45v!%8HYQyo}(vk_ti0y`g+^A;Ww zJBmN2$c$3dofSK)Q2lX@_U$CFjJ@ty0r&CJ@TmH+eu@+%b)#h>8*^9Y)IX`Z`O?On zE&QFhZXpf9v)99F2&OO{GINLl)0f>KTO|uo9JA9*U<%Gn_;>QakAJ%+>-2g8&p zhPEyK?9GS0;IYF_@yid$Ocr%QNol9sh4Wr_zBX2pqq@kO2a_0pve+Vm|;`5@BJTVS!*|PW8|Uz5EpZ`g<=+hwGC2OQUziz)|{4@_8B61 zX-JkZqI?aV3mxBs1GDhCd=dVT!1@gbRX&y6?dj#p>jyLs^yVE40)yURS60A&7$h$_ zYR5BYSVMr1tX<;durt~o}Ky8MVDS7yT~CJ)GmV1 zt|Buula4u(-ydIGDJ*{R6LxV8WJ%DWEHP#^%ttc|hM4uf^6(m%EMQOeI881SMi|%V zM0bm=S&XUuf`_hX@%s2^7P0J}Ki*jhX8eTNarMe96O0}*>fjY6JV)+zi7sR`^eD=Z z%-Iu|4<+L8Us2hCThM7*(!MCmEFRb4HP(N=g?_=_jZA044a~T#O@p^K?fab;qx$DM zZ|Ebc`0H)oz6a=WLoaF=BGJ8lmKPc-i z$tt!~kO&VpIy%GWjJMsu>OaOheD=7y91uj}`^G-0e928^=Yt;}G}1U4{{84|D4|y) z{#_grfLukN&_J1a9riWBfwugvXuDu4H%G;cDavBRld6}qj=bK~IFrGBPUZfi-w{ZNB^uPE9j}4{u3@A_-hQ? zkA>|Ja(JX*Eb3Xo`ebIB)w1d9TQDg>uEnrMS!NVDk8ItfJcX zuYoX0H9xg&i;sjsDUJ&9hk-5(7UFg0;-5|QBvHAXznIfwb4h)dqf%#)FhkIp`V4lA zwq;CUQA1a5eoUpJgd!JxMWY}*QSSl0i))3hVmqP<15&+l+#qd~&t<&a?U|Qv~ ze@{RB$U+<^KAJ>umEJ6%o4{C(@Fu9BoLC=0<*E964-5{S{4~%?2cZ@ML=A6r0azCQ zJQi~}FSkIF4C_d)kDk6W#mJ5wRin7pHw+I$R|tdl0k)NTD=hw^j|{*nNh`y?n3zNp z{hVcR(T!ynFvf2{C{clmCy^U7>r01A@-7>K|k_sGuL8QC) ztXwUx@fy)qvx!rZdLC`e#5#-$xLQQ#EOtp%Bk31vKV~$yFN?n&#Nrag3TtY5?q6II zA0l{9UI;HC@#vI5R-ThlPSzT(3}Xf4RjV*CG&5?{Xkzh9HZF&*{KVKljw;j0Xtr!Dm+ z&?W9XpR`R_W058~f3WJC(?ugFLTb4$fqP7k+87)$Z_U`hYEYs3)bdTb_rquX29EBrB-!Z(5tc?FbO|1VQf3W^f^2easdh|Lg0_fdI%?z=!5_O2nQ^h z5}OyqUG1tS>`I2wKJ%nYBmPDnd4!NevrCgz0D)S1elXK9&J@gJ9uf{E;oT=pmS_4WI`jKgV2r> z%y0qdp(hk}yF3C9AjeI;sKMI5Z8gyoV_R98T8VVLBceA2t{_z`4nOekNNi{sF)>4M@=lV~1jiEl04fkN)GTw|>s;@SxY(6ED$y)E5mx^p zBT`8<+hjoEez0`q+MqCp71QDf0dM88v=XOuHP-T55ovZw4v~p(R#6evoSaev4#&1q zs&8|r=gq8=o%%fnm1|QWrgh=_sUS7k`dkqsmP<+ z(-+x`lP!h;(p;(CD@>?#S1mtxb;3;G-&eJ2p{S&@=*trg7fzPvHM}e1T^A#7PRB4C z2l1ZPhA3IUp;F5D7r%j^grTG?8!ZKuM{^yOG_{n2X=w~$9;ihrcyquL(;y*mqDW28 zd^?NQ054FGVolSs7VfHQH&^N8sAum;kupSNyx=M*IkiDErLa*@hJM{6v5ogCZUMZk z2+t~7Q4?)E6;voxf;O5T10Y=EF+EEA+!G3sGuKQ+-p z!BWl7HX0ts(5Hl8S6qmjbpL*ro%D<-O*d&5cVM72mOd_o9+B5XDO@6Qd-VMTgUHgl zaGyj6x3>}2Cmr{^^|@5R^c!KgCLx*|L?E?0EG}3QBF>`4 zH(y8^vSBgbyIXepPMOETonMvo7I`Xs4!%D318ExWu%5`FbY>ZPW@_jlswC0!yxiI- zE!C4iA{+{es?XZam~ZX&w#Wv)Fg*fWDN#n+`Cdyiq>c^|4BVXXL^Oa0rGMLFUkZ!F z23ic8W7W~QR-hlWGz2~Rn?r6ON zq{727oYd0thzSooUDg5GKP-*)l>Pw<;8J?Ol=|3j65~a&y8;#C6k;=vwwj| zxKkbW_J7!)8s!KoQ2`PZHTP@z`@!6 zCk~#a+$Xz1kI;2Y<>^RSb&eS`{8ZNn(Uh+g)QCRdr?^txD3xcaeEXb5LS{!mjigbv zlon~amGOMhrM%=@fBEZM$FjU-Sb*l5vI6d)qtcq{1WD2927sQs5D*1sl2WEE_TLkW@tGgF+L3CQKIW7)QnRu_jw&WWkj)>N|5(#T00p0c%Fo-9}J4NhN;D+Ns5er2HddAlr@_r=dEmP!_wcmyo)3^ zG)V66DTFqIAXoJ}BY<&MkfG^8lLosDkw@Ic@o&VTKI{}!yUJ(0qoKF@Lw*LL)5rGg zzKAXQ*4*^|ayJLccoMDHrcALgMBHs{8)X?)$7CmL%DkKi_ z-v{!D6mUe5a^}A|Li<+Og_jmbs}r6VhzS_b)fgIfE#nGqOA|3CJ;(hhQ1{t@P2LY*fMAH!>q5mQ4H&B1Ui#yXfN%|#(JLr73Q1}PI z^b%60-Ws{A(Tox7U3|4P61B<>-mW`MO!tTU2o!}4g#>IvJCh0A84>mZcS3HPQ*&Hd zT_Bdu`36y&+bJfy+=tQ%bh02ZK?SH~Qi*HW^29i{c+gYN-*=$G1>N_MMHBgAv#KDS zv5HPUW!#C|W7WhMx=0hDB@EGx&rKY00Z=7-ARx?2YC&@+BYxVj?%TU|;&XMKscMk} zXrWAPu7_VHD|7I}WaBhCQ1g$)r5-FE@uj&-{=xqD@4xhznuqc{{Xhw{wJ{Y zV={>O*)@6R=+4GmiCbwozq(692!=sGV7RKgu3QX?cc`yeMSnh1ta~Mzwu74?3O=+} zoWGn^^n02m28tH(_4k;vW&E=7ba3iXm~?paXnL*pqn?5J&fH}7v6LWZ22kWE%D6lf z9mU8LAWz3}51n)bgCb?!0xP3uUeA~ev#rXw)VyJgMc+fkHJG~?oM-KdJgIV3;BAn_zEyQ! zVhG-$bfRlOwP+-EQioh4_!>n*i;PNo*kR3O>%T`>zpe_K3qYSX^`gS}-uTj%C*4pA z3^bR3WIiF!F13Jw4L~?L&Ij{7KaFIH*I~=5V`P`2;Np}13)4A3NIbNN*(R<)koRXm zTM8@@@K<+}f+z?}H=F=*S2jt`6y*C@(j&~96?W4DgL(D7SjR8RL^2U*elsdujBQI@ z%jTY}!blm&uL1wgKU~NG%qUApz%<0%zNo_$F|oAAf(!6 zx4Oof1u%WWw_Z0uRCjhzU09#Oh^bItma9KL2)YhTG9nRYVJ-xG5H6p-m*I~qmyJ!0 zSWY6s zX_15fl-1Iud7x6z6h*p{7_GZmP(VB7-62e`-k)U7?={PSFma00mjO7GX`wAcjGb#| zDc4)E1gZzQfG*mPK`P@s>Z}^&Vaqt`6^dAd7xlw4Uh_6+v{Ll}*QJ2>2%244Pftyc z>Xv5!B+q1v;2rII_c%8ai}gbYEFvo^ky0gHuQHG^U@hu!W8!6LS0$7gUj^uB*<~}C z72#ZC{9d_Tz4$%-(Lq&SR-sIKPs3H@xkFjqbM-FlDWshgu|}7bpJ~x%Oa#6_$tY}M zA(%~UNxO;W6wPSQihR{LlQJge!8PXs00?`VfowUP>fR)M9v$YuB3(GmueJ|JiHIgc z__3oz*2z-$qT-wFZVk2;gK86i^CLL^mT}#fPRu&>LSAKK4FO{D$5Qs!az@MW({sNJ^2vnjGJCqr z8f?bVxSL-`l~i9Wd*IuPeQ1Dln|pPwv9+7IOrM`>^bxn4UwVGJH`X-;U`*)P?~K5% z(q7(=efQEdr!4WYODanwd%P0uDx);`^A#t@Qr+h5A!j#$dKjPfOP| zD#`Y${&xpF6e=ztY`;b6mkDUw7RKx&En_hALN-+3kc45T*kl`EA^KV)S0hkz8k&+Y z*3)#y1?ImB*|zJ~Bh5=n^3iBFa8=;#mj`|YO}|YDs|ti1vVE>%hYHdT;Wj^*8$Mo{ zx2K5Qe41S3#&d3YdVEr+`RL}{cFz|5h&6eyWSksG3>%l;7rL#V>@k=GiOn07U@bpT zagyS<^!wsMT-)vG*mHjAu+UbY-9#HO%D`|3OVAV0&`S@!;L90e{~`2s<=_9S9oe{d ze)`}$)FAeb>Bjw)B(@wGOtqq-8p|DFVKgi?|2XD#91f4mS_HrAGAnV&{z2jSOm*V1 zhQ&?G9EbQ>^nEMgLY&&1nq<6ZTZhryCgd&CmH||G=fT~ZLy`cV%F1m{r$p&CjQyO^ zoQ-?{s(5YSV8AV5-MRGvKUE+Q@qaPYzn}j9XGmcC?;eBgA21aA|Ae6yHMCM6dMKbGPO;)POP=o_tze4ri;WSLb&3cRra}2g6pv0 zL^d6+mI+yGuqc#>=X>s+&#dncp|>|W*GG=9zkC|p8Wc8vTnTOM7TsI7g)`)&g$eDe zpY?G>V5Z`SNjPq(8T!%^NDHpmfrT>{SFC)^SAusTrBTXNw&?2^1rR7};}KOTq6tY0 zUrER0G8%7BkhAU>OxQK)_DCdchN%A#(l8gXd0OY#JGTa*-- z88&o2lQV{~&0UhqV-mzd@9v$CSj87^YE)MK*0)m`c26DA$PyZ}AbM6ozlYd5Ofxp| zy)9kbV9y)PzCmquwJljlw=ud8iYP#2J_h`xnw>DbVcB&06M3e3{3I;%n?JOk)|?(^ z8jT`9X6SmYerk^$svDwaPaX=bMQqA=2%4xbR3lf@cQ!bV$&(u2`qp2B4Yo*~>z)jyW_eEw5NP?Rz=cA~&qNb;mmQ zdzC4J5b1U@ZAq;OktzB40=RlBY=%j&DwS0#jA|X$ZZ#}V>G!fE(fGFJ5;gj!)Zgrx zPppk>nM?O4&5$SwY>bU~Y*e6a>RIZiZqp&4ES*IH=hG9MZfB>c83CugXOr5+x16LO zc;D$^FEc*fS13q=Yjc! zxCM)#FP1U{w@tzHoP^R@> z?hcr-cdP{5`7exTs=SfMH)4ai zUXyV1Y$;Cm33R?@)F!US31OLv&}#N`s3NM0svwJPz!gy(%?Ou2^itHP-XoU9Zb3C{ zB%+m-W@ow233s?L!1a^jKsi2UJhxOTZ*=iqB=3NvX`uF=0#=9g(cn z3u_#)Vdt##(-sm2Q>!22&{IfV22$htrk;q%L(urKJi%BR3Fq!b;o`Un%%Cfuai1Q7 z)EY$tzLN5o80b!s8u)bgA9NkwF1n61$H-T*1eH9l0#QLR1rW+Dc>urqhMYn4EQ~Y8b_@LkX&r zFib-fm^zisC~o}5Ift4xCU<>Z6aNk~w)Lsl!yUwPPk;MzC!k{1&F{$x01-HVu3Gsk zdpx!2kmN8V?!|_Svyze3J`c{4b^G>)RbK!z3&{J-)zWtiPw&)sr{g}Bsj(uj*P}6C zyTWU26p=o}sE!s>hc?&pvaU+Zpz3N!6a=bmDti-{a+c2Sk zxFvUR^XszvIUo3Ngv`??pu?%j_xHevAqGBD@7Im&dt3SEil6?f4=G zdG(4t?3L}QNX*&uvC%v{s~{;v9qq0k2qTz|KjT;72ST61t6hH}axNVq4;vF0fAWQC z@~IDTp3=LC=)S?k1$>tv>&NM0Q1L@WYVYb2#mU=%3ne3227)+%C$eieRCb3`nU7st ztR=OmXjsx?T;DnQx%cx(?~z}`zCSy76W~MQx`)^sDcA*P$`dF`xZ$HaMg#h15SQyk zhVxKKYd5v>_A4c`N*ev_Y>YJdau11nD9@Ct5C=CL{l1#aewzTg{cWTJu#6&m5$`dp zg=azTe9Sy`r#w0E=-P3{Hh?}G`TYOI8vjNR|5pF$S?T|y{D!Q!(Z=;b2tk)vU4Z`we`{pA0sg+ zr!Gw>^5ZWx?;g&j-tK2-6&aFC@F(BOkJbJp@-9A8aF3g~kgr($;#A6A9hHR;Tjqh4 zqxk{y@E!yTdY6&tNM2oBO4HaKaSw##R=J4I4X}g|G2LxFtCD%BSYeabB)~sT$4R=z zg+7b@biScYkNrD+?h?V9tvd(!p~D7p!l(tX-NUOE7+>i`KqB8rJo84`mt08;mWJf2 z1}uPT(~2sz2dAz@QCEu*u49MJ0MaO5xX$Lu`PsFew2zWW6-MfpfXFhHlXAa6C%FRxbH@cB}hygRiVf&PU0yNyAQl)9?=@<|2Xm{)zq?rc2db@SwR)WOb`#7BX5w8No$SJSBcP9x0r|N zbdN-c)0qYp6W!Pq#EL_D9o#+Rhx6Y@MjU4{O-2Nxj>?rS3AY?ZUdA94jq!-_aeJrdXTTK5#Bv>Zx|bL< zIlWwtB2VW*mTa}GQy)$;uLa=Ic4w+4ymevh89tkU43ee>s1JJM8smaadvDI8q7JM6 zVugf^9NgROHtLPm{MwylF5g7QIi@%x6_-VYQ}fR~v*K>q0cwf@0vvY-8Wa=H@vHKtkK(eIt_=%eZ_QCq-#ZuWH9czxQ147LlzTtk+fo1nDJ(W6^OW|ku?9wXN$WwEcC^WFkIR>rXtM5$6zIOuJh zgA!E5Sdt!#C%k7^Z<|LPu3P%JMU$l|RgBuYQRr`w*~b@eUGB>tv+T|i4RHgaTK}l_ zAP;U^#6-JJx87mLpe_K72?-l_-g-F@_=LSO3RHH!(qU>=XWX>LC+z#cEu1I43M~!!o1!gBr$s z$(KP?jO>Nbsu^8_E&C|m+LLUy&F>!iik#OuLSbXexjvh zFiyZ`UZqf8MVFOT)oIz!c*bu+pg%F?(lT=K5asWL{-2F~3WH|x1AQIp;OG%BEHEEY zt;V%6>&|MZ-R1x_VPugp6W@Z^GG@L^JEjje5hs4Js01o zb1&os>r42JR>Gm-|ND^nIV<3G08i$3^BbB+A$IY2s;OR+GsEQGA~TsfFPFWL&CuPa ztB~?!L>K^~-xf-!mld6!C4;gLp3l?{__Nvi>^S~W*##*NAa_z2F2;AZ5qRc=@l^D% zQHY|7xg}n4k@G|D7t7Taeo9R6;hek`1RYGBPFnf+mfp?DrJ(ae8?URL^cNi`|L&;K zFo(g4&&X`g-E-==!DbdA8CwP%hrP<3G%_|Lh=GS^m4xX8#BN%<(_* z=O%S^n+;Y3u(#HK@#p+;d)NCq^l&th2$J=Dku~t)w!o`3*-D(RXI#Aa;Kar)P8$DS zW*NBSm!pilm*QO*EWEG7oRs0olo+e~Gw1${>)Y>&$qd*5P?;|~H_Ps=eWGOmdh6Cd zPjqaVZl;C)B%|ce-I&L|RK-{oxcg%)@B2q)7R@+5w}R$>(pIlJ|K$MmZrQXW3!2kv z;@ihUkhER*4iGxcT4??>PXBbq`a*buyv|~B+{I9rfRBMGunAuXdcXYNU4*cIhjtHs}v3 z;p!#9#NU>X+2-hnBb$~y_j6cLCD$MrU;vkz^){qr=<_e;9Vbgq{3zcJ*oB&8k%dn) zRl@F={X~HerKL6C^Uf`1l}%=Jb2E^e-P`^K3J&&0jWYIrvDng2Gh4yxgKbakm(grR zsCI~AFI5vR&*^uko|uay;(!bn{eRW8KTNMdBy%7tXKfT9d%32AHR<=R;X6Whtb3G_U#@X_%$eitH%48viQNgA#tP97$lOF@BGpP|QK@;en6v z!=!DfkHb1LQ^g?{Uhk=v11Y43st{@c>f)86Ao9!=C&Z>JEoXL1fKgWjQTNJFu?2>1 z&v%(ITOc($X2>YWBZ<5+@@FPIS$ADdX3a z7`YZakKT59sZ!A8O0<3@4;fg?EAY;>3uxA#3~FYuxaiJIbNT}ra&!pHUJX8#(~k&D zLm}^zJ+QK>!-ZyMUwZ7lkDMEQfAwx%& zj|qfQM8dq0k}y(2Vk;SH+2x-ExhkMK@na4hu4I+Xp_Zcf)P)yqN2Qu<)50H21u{i% zMA`=$FVq1wI7nAq83AlGppLe$ob#pPKi;c!(faBo>+I@GI>?zr1xf zw#i}MBSp&=A-l_+u|x_z55uDh0mFnk@*Nw>PD_|IG(XZ)4Dsh!t6@WeY{B5x!?`H^lxR-&m~ehMp^p7Y?!& zVdu0~N@Kh+Zk$pj;w3Lk_Yfn{O8!2q@s=5Ib}j}43547hWmh7*;X)!d7gv(eUnVpi zvE0a8@O-ko^1&LWy0%OYH(&Nx>YtoWYH-VKlIMkMXhP1Aydpc&1S7hm_>=!@Q{avV z2U4RH6X#fPGtfr4-PJ8P8OzCEz8lR0(9{b>%b<2RRTTO$-ckPl$ZFYtDy#+>rV!+L?9-?^5E3;UTQnqG$FzI{5D6bs)NrlnM?D|V2ZMooroyL zBS2?PBt*9M_)Oldzy7}QN*zH5Q3O0V?W*IfOET$$+$hd@H^=X5Mx*b-JNfN1B8Wi! zt|XZrDaF8|=hgk@jT`d1^Qd*e{aIK-Yr3WsDpf3GkI#9vYcDGqAcU?T)H)p9UaRs6 zu7^zhrZalA=%j)X720CrP3Q0~^G7VpqX-uLF&Q@d>$#k?6~;1D)|8qn7Q{%CLPTfXyjU5aDC$aILv%K4Q5ooaX!jd+ z&min{_U}UUz#f%|yrRNNXdzOhDb>2_lkoF-KcmUxM7ktu`?!K^?>0!Fbi@a(v}C4> zPuq!ZWpHQS-N;`m^Pk59B`@Ig07%OouT|(p`Rq2owOiiOeHrYnf1b3Va_N9lBxR`-z@oERI$yFMoe(sqAHzg-E|Y)!hZME%_H#J2sz43VxVxgBGwcBG4IO2F1HPFVjVtqZW92}EpCN~NI(W9-JXS}C znRYcZ$5r~|P~vS4lC3g%2t)Z3*jBWpSMFCNWa_e69$*K5OMQ2>bG(1DIp6O+Vy=5a zef!uwonyj-WIW_lWK8PP`Honzw5 z4t$=%eA_I!-)|A`V@}Yx#i!+s0Ro7aa6loDoMszanRQdJr-E#8_l_R7m0jjY5skh% zo@`qvV8Uv2&>rWqV~k{kq?^2%oS<<7NrHgg<6`0NZyDpr3(g5(Hyf;Y{iInvNuRq2 zr_-S>B2OfI_|w{$5kWUa>;243Pu!)tG$VE}4ghp;gQcnxX;u@`PkI=4$2k6h)dS+d z!NC2?xuCKqeOv4+FdqhsPlKXYPoS-4P&ljtgsVLg9Dq#6^u_=oRihx`UCd09<*d9YkIXChN+A_{N>+ zVff$dxzmAx_RcHXQ$8!#+ezk}=#ep!8Iv3-1u7aQpS}1Oe_;9FF3}!F0v&^JO9v_1 zUD$9v6y01}4k9$7`n;avK&LNj9m^jGNxLrrqJYpY|8A7h(2=;|={lt3X6xa1FX&OL z6Z6DfgmF-j56J<~2*5;M#lS!42QGF2vc(g!l0L?Zr7Mu1KOYBqy5X{zT9$DL+BJ#9 zN|=b6l=vq38;M!X*=I9z?c%z`adQ}ZN(mZmX-Np5e=3jTM+OvQ;a*zK>b_^2Q zx#VU-$KjXCarJBih>kBnNIy!ym{hLi6ShAU5$D=fAKm%g3bkA^@VQIoWj1)@EE|$o zwYgY1oD!C9Vcst|8^<5II~@Ec{8@TM3NbLSUPfz=^FB~vx40J;(f`Jk0ADEAzXtW= zceRLxmM&V^6$cPMW>s*^84)3M*LmwD;Z+z_yP(9i$zijd0@$I*j1QU@03{Wz))Sy) zj$bOd0f`D^=(zYHgUkyNM5hMHb0Nf-Ffc1%bIpEutZgu9>hIVhY*hUd^|~<>TLL1A zpi#L;;`ke=~H`A_(ib|h( z=)~E(I4l@=K!{1kkL1AE@?*iD95{tro0RyWLG;A{qgqa*G5i)BN$^XVxEG>cfbN3n zmyYy(0?07FU%XK@{{J6i@7Ntmz%A>>wr$(CZQHh!72CFLJ6W-9+qSuK^X@awxgYla zu>U~!7~MU(yJ|kODp*{h(`a4pUN8uobeB9GoNdAad$1V48zsaf#41k|Yt&m)8t04* zgg6ZMJKLyph}vlwH&`Hp`d?H!OADft#v3;Xw#A)ILGENLX8$ZuN0^YGdKRz8j44sW z?`PL?c)%HbUS8^sc=MI{>o3q$LEb)F>R&4Vkn8?$KTBwl?&Esv@@Cxvk(FlcQ2MRu z;7GcPktgb~_4u4OdErIAC?g+xd8+-Jw!N$=>BudgqpYCJ+O!J^)?&rwJoE5iB2@eiCR53#3-`Bxp+IaZ zdT@^dye4|?`Y&Iq?u3}egL4Di!yEyQ6+#&U43}pIqPAkwHq0|YM%8Tp)xOOHEAG2z zCMD-XIZBYo$RMpY5$alt{Bg^uReKaS*9f#%(z~5eQ-MnHhi0*6NbK%NHKD0w>|>?! zSQ6JbSXL5_)w7hD3XZ2b*=`tB+03d;02dkIsp%pnia3_!dlxT7RgJ~HqtF8mReH<* zMqf?oT+1{r&ymP5)pw}T9EI=^UqtaD(-wSe9ZH?~y@hd$>S8QiO@elDqZpfTuEUU= zS2L@U;j~pq z8i+*P$>Wpq*u=eRH_(TdgDA+ZxRtOV`uL5idpWOAPC)5-Tm%(fVwFc+93?zQ#oVON zWJc+S)9;Me8y=8Q77G)txRk{o0h1?ey)Bq&gc z=Wok#6t!$J*o)~&+7e?Um$LVg)hABq0%T()V3qyKD2U(0W;befi*pXZo%U(r>1M?D z+U4SvWWG@FfIw3&Q1LrDJRgw?Xs5hUSjDEA7Kh0J8}uM* z=y;&DXA=#uEtd{KZz9N+dU4`frZyO0*O>@!37S@3BC~cV=L#aU>>5y~^1qp2j&TO$ z+3&y&Q5vacmpmAVKtv?gv&OGp+XTOHB0-hX=u4OKH9--y;GP3oTR zd2*>iM-(HF$)Tn|AxJ$L(YvheqW8#%a|TVZA6fY>h)eRF;A9;%Wm{Sa-(q@>c+PcA z%>yf3(u;G|%nl*euFJ00*qPaQqDMo&|33}nm2q%BaEbU7E{y?-w`q6R} zxWW6mx42DbI~WxxDDgl85i&=G96fGx#1sLVzRu(~+FCX$xE2u4sEdZT42*w)RgU&u zR>LmP*S{=L&W$VQY+Yobnb?DZ(w$}fJ=t#$=t4#(N1L01lOz8*!~&Fp@aY)x>V$%o zg*u7IvjlJY^>A+`sHWb;B%r&Mv9FlyThgbRy~*SU>p|k)s_t5}KPJH5A`E zX>y6b_%L<_V87+NB{Pjq@OBMu9(1e_#U z`plWr1VCG?QRx82XJ75o_NtrV0Oic0_TZ(4QNWCh1l@fvbDWr>7ncF?jf-{|lU%(9 zp^);~I;SpZH%+s5Z!4l9lqM_8JDv6FlOvY%?#+tVr1xf!HhN_%cM-Lt!-=*p3r^&y zyU7e&HAZOrn-YR0TW+EOxA+~=^9d7f^-{1quhGd*PFi%hN5^fBQHWbwTIxt)^sexL zw8d&&Zut?_uKDgEjpz-EX+pYK;Y8CaC~B(B19hRQWBxe?ldW8A&=*HL*8wyat!T%G zk}#_>VWnK>@225=ztzW- z5GwDU<9h0zSf>pAF(yCWB!eyskIUUBQ4Qh@`XO0Q7i_~WJyx;64gNg?ot-xN77{p@ zD~71m>CPnz`2>x8bwxhaXiz;nC8a=TZq&E04=UTf6l_lD6<6(4{jCLXW@1@1!Ydu~ z0AjU3Xkmb(qXss3Q=(ipKhbLlc{511{wd&NkyoHu(fqbG>QZ}-fy5z21)&$Y9d+B~ zfj3%arR4x^6v-SfYjo4rKbEgv+yz8D51)W7#Mv^yE=8Y$l6~G`(b0VQ1uEK6(LqV= zyfk?s5((NHb`X_TJ9ODq?SWvtM$nkw*IndXS47A|xZVYs%(6SNY=~I4Ie0- zi8bWW*7}a7VuqmEtgZ__W@?hd95A;*fcDvxVC9>93E}nUpYY(eG8%f(&NU%qOP;5q z?heOvZ>UglHTj4**g zZ>z?!SMXxY8lzIW@spXxlq0!zti_A3nT})Pv`Hjj&I2)_vdpq%j9hrYxyY<1>DVR7 zu3Yy|s14C`F;f&$2;SGRnipii9cIW(MWNqTb@6;_S^llC)p+y6r&xkyN{bdUehQg-*ap#4`*|KoY6 zoFui+YVS09L<*;fKKHuERdZ#+mepYv^U0<2yR_+vzqziMdRY*1c`jF}Zu(@?(t>jjnxN-DM} zdHBBpoMAdK4lX0`@!575!=R%*Larbn`yb#+L7pM(yR;CY72%M@DTXFxj1vg)OEU_N zfd~33S4R#{aF^3Ra6T^T_%2vp8Ib&f~IH?3atfo~I{7-nQ>;5*jgm{0xfS&8&3Kk*JvZ zIlVRV{{(Z|Xw)s(uV4;CS9&yL+01$Mb(w&TYvpE>Dqv9_DOZ#Ol%kZW zh{=AXzu$z5nKpR%MzM8gM!j@~aXQDQ{Fzvr+?@B~f;)S#rgc%UT)pk^k*`0TXxVRz`als?7y~_GHv;SZgMsF4}}{u{fYH`e|R8|m-OU`=i2~m2h6LrBZm)> zO-OM|0#e8X2SN=Y5CB>u6>aNY!Vl#lm8Ua-d$vrS9}G#6$aEu;W5}>=4|LR@&kSY5 z&P^v)%Mw$ck4L;(lRUHy+UfP(7XW%XOdwWisTE zOAhp5uDI{r#-+24Khc~@Kpy>yS98vVXsnWeQ!u>ig9?ctSXKa#jWb2|gM|&7{BOQZ z)abvW^5h_bcsg}QxoZ~%<;83&-avxI^VhNrF-8P`#C#r2JW6Na${~tsS_RzG`^HRg zMY0&M^E6}@%6KA(#aqB&tq&02&UNy_O}Kmol5Bv)sC_0pzYPdZ6bgiunAD09xG+V# z-a+nt13Cbb3v)wWh*(W^sIaG6wWk#l8NN8<}2157TF?~5j-v_QMCAcB8I^;0a#V*RTDos?hkO>%QNagIj3R3^ebBLI?7Mg?RNYF3QjILn1rgo#K`#$m{1S24tWYW@SMp5&3U z)P*k)YWjAp7_jwPJW?SrT0Wrf98oQ?R1lq{AnzRwi%WdvS|Io_?%n9j4(=x~Sm2=v zTk29e`9xOf1RT`XV-R$8D!0G)!~52V{!FCdGaCc(KHM3{|DDbCr1WofL&dKySB^12(po$$^Y4>_U`zb^-v!)lh$YxM0O~&n&TE z)ZCZHR7iYzhJ5jijYZ0ukqDX!rYn(}K^h>2SZEeS2Yk52t1cEyVCv@E3PUd0(aM_W z6bez^nzW2NUi&NEz=&DYhun^}AT|}Jhvv&}FnOG@3P*Gb=@sE6jf{5$ebWPM=8DpqMp;{4so*jhRrsH?5`-9#M_ z;XlkG-Pef9eMSwf*$ky_JQ!N@ z5jl2D$(Pb8VT~MB5?JCpfbW*x?~#;dJ~MQmHBIv=jQi$x0(4PHM}Y0DsJA^OLX!_gAJWKNQcMH$MfchET;rANV_e zN@Z|@2ZjeMDx{t;I)S{sSTQ+fOrZL~^nj5WawCp`2q56nh~-F^!TMTE7fDN_aqQR( zlJG@C5QMVdvdtn!S2u=cEpF~ySGN!iNZ+esZWgRUmn5CHiW!yqPn|Mzf8)#{(C8I` zn|TEi6JM__ftzzGG|k_CKAC1Z!OSK96eIqI(4$D)?sQLfOjl(e5?jP0Wpuycz;O_# z(gVjfZEFS6xlr>@E`SjNNO21#HfYqLRsN$YK-nFX1DoNaXI2&R?t5fbM!A1eq0>51 z@%UjgpS3ao)ZP*HpH7bKh$)jg6x3BVv0Y*zW9J2QS zI&UD5sMx`Soe)9LyqrCX@7BT~+CaLWz|v5_=xm@-!0gD51FQiOHuOi$sU2M-kP!MD zZUnfkakeEjIYe({mtZvj08^mi0eqD5DjNMAfF}-kQbMpH792@#u4yKGRmlmJnyaFP(Z9(8<(OE8#mqDjlJ2cC z@j95VWtF|m?`MZvx(z$~Ec#0B+TS440Fh^yo!Nwn$QV3<=m%I~bE=lxwBc@n&wkqn zmqcY=F*8ciF}0$a%mZ7Kf`@~2AJXR@-0bX1VCLuYVu}&8R|Hfrv!DStrr^Zc0kvzK zTv^b8vvUk;zx^pWVfdQhI(UlL3&LL9CWeXox6nq2oMceTwe_w*>eZioA*itZa=*Z0 zvnFulGqxuxqpmH!rCH9PLt64Yh*(+kn$FzzVpFZf0)^sMX^C@R(4YuI(Xbxp?@`Rxo>oI{^7@`e$ts;|{DU7B*>E987 zmX?{H)IOVd{JLVOxMVxAI(Hy}N3-==1?{0rg3nngFd4LBxEG;=XW+hCAM-&b0he52 zPt7ZW>Mk%!UsoQ6CBUz|>~+npqcDC4lc|QLC;c$qE~cQ0cGT=1r!#|hlOwMoEc=p0zB75GXPss0Kn*rQ|NF9GxkcG0dH< zn7C!*mn)THc$9|qeRq2Q8cg-2qZ!ga(^r8cfW4c6c!OzcIv91T(0_u|4uGPULx0A{F~c4@DEQd@V09H{)79)_9IvB6Rk?rpQnN-|}TDq52JMMG&) zbD(KssEq;x+6*G_t>P@042Y~Jn`fR5DvC(Rg>+kOKb2{-1D1rTdO^2W@9`;VR_o)E zLI<9(8{!r*^@=c&ty>vZH!I@4mlO4UdPBKoCbDafTLt?ZrFO_zBm69MM=GcQT^kAW zlZa;HRB;qiQd}9~qt;iix**T>7%$Weus2W-sU^qOOxZHiNT_7>*|+?CK7zFIO5jKL zMRE4H*aiz6%s69l7@^XUZZv4W9Y_-m9daXe9H(m)vxTdUtbR!A5}S%Z_2xHusi6;x z9PRWnAOb$VvV}03wv7LrT0EJTdkby1?&9>V!>57#6=dt{2zEA!p4x*A_k zP`^3LGsV-;_4WM&>e%h+`(RYC1z<49tem^zvAQ%I6v|Quhuf@IFD|q#aW;xsu^mXo z;eSH4Est`sNjZZX_R!5YsS(Ws3K$Rv4%$t@Y|!$7(x+%?Z0zn0u(f@|LNuq0QKA2C z8R>SLJC*zMimSS3d&*3~>>?_E@N3W9x5nz+8=k)4r=p*tLLCbLYc~#b9M@8#V0D9~ z)!i{$HMe=l*^is7fT7+tvXLs|I*tOt;kLu`3>sQ>aKqJzT~gD9wvpxf8)EKY7AQDE z0n1l8Q};xoa=rH&IuRCw){TUSA9vKgI+F!m-Nl$3g$cD3Bu6_V3A*!VKgRDY^boJ{ z)5RCk`P6!rWoXUNdXbZ4H< zygY_>L}7?@{Bdzos!$CT_M%dd1XqJH6(@SQxdO;|Vxoj-7>V_~NfdlF0MGeaWaG{a zuC86W9FG)3Aahn_K1~hed9=Ii^R%RF1v;(4kn6Ec99NX+v>lVNzHP8YBJLt`lB==Z zHl-fG)6B?v54PcHAw5>l|*~rrVw0WV55e0CCwwV!rLM^$>-s zYbHM3+Gw42PQ&($vn@*U>+6%BF(DhKKrv;a!yW4ePQqN1a!_LKx}c|q)z_;V$K+c~ zuu**A|%tX>ga|<=Nkz~(=ZQB24%`maq)4t zq)nyVd%C;QTjnN6^Iu6RC+>{q^N|6X;a?1I8qM-=2vT^2ihgbFvO*lO)?Ex%@1D{v zTMOG!%DZyH5#0#2$B;pkTCOw?|kx z-Bfgx2??Q0VVWq059X-rNII_~js$)cLJ(j|dXdeb(Fly290C2F>AtU&1jmnYa7Lnx z#Wt#J-$KEXB7q#%fdH`XA~#buKP}F(VBTs4T63VlVx4VB1(h8ZgJfLTs>P_N+(t1_ zw$fa(djV=1&e7d3Ko>aw40yU7GR##gKS&?f$<(eM72yhv?nHq2ibc5V(_j|%w@gc~ zOR*j)I<06Y_DlBz|W6Y$h>IekcfErC1cBFk$Q`|iY(GiV1yF7EdWJEM%0G;|eo(}Ewy3OSyW;GLKXy7qmTq4~^G)2=$Pk*-j%)aKfdK!?E5Ueoi)u0G5HJo9dRJylAtCI_K)hT~%REP;xsiOkJw1ln8T8gQ&)iv6XLKO4_tAaQ*OmFig+dEbt0z=eQQLESunp7e zbXq`AtJ|r7lp0z|8M=-pf_!uq7_(sC(q`3qg57@_oLK5OelhC+p+|){i!{VlZ+Z0L``dfZ zY(fd%vteY{&k(UHc@jP7m$o84d6@QS9P>9rCU6M*+~$;!Y%c{{^qH*zq7P+Y;Di)h zq1^V1E8y|Py99R@H8YT6W)*Y)$-iVb!>h@~QwDCjwM{i(#{;&M7SzY8Bk1Nh9Vc)- zXgA$OrMDE_L({v>f5PGY8uiZFA-4-O9s{K@W6`O1Z0>M&{@`6w%wh3SJj1b;Cah|av-kX z$@k8l_$igAZ^K8Cq7*KKb~h8+B`XzsCA)z`=g>!6tioc48LP&*YX8o@`)^{T1NV&R zO(_eMz0OasJQnF=W#>8lh3YciBCOsrCh649KCjt<%6?eQ93rF~Di3qRg)%0p)gQdk z8UGjN9I9%0=2I?Jj)#uj<P0Hwkq9%?c$8DZYH=5a187F$$R>HQog9USK5-Rj~Ir z2fk&?4~tloRUA0P2Qhz=_w^Z!dvVPg32hz=9O{|eDr*7`q=sR!WrfO}jDH6XfmAf*B&D>{g#4}n9FgAr7#<}>^d{nRS zSCi{mpMOev>u%J0KdLl$`D)KToZo)jo)05KATOUzm%l&S&>6;SF^N@_dwSY66%VS> z5{FZoS*B_}8O2Bwtcz$07Ha8l)OTIHg!jV^g&JbdrdK${tDCncr&E#oO9~r5nWqeO zoUA%``->dZC>Fm!$tw}e?Om9KlLZn=Ir5-OPE5u)`>&b00qlWoUM#5?+ z^gv4V0Kv1KF|}PQP^v*IUeCHs$3yA<_N&F)U@5zpd;1Hu)M@b7 zX|x_1?~8pE`se-aL{zu$9kTazeBk$(5-e!TP`g%txEg8u%?RvHH`L&W!g9Bu$BrQ} zj@#N_cw&Po3X_$93IwRdzHFw%*@1YjdR?W_q6kaEXz)cfih+=ZZNf3y3^zK9jMxWb z#kb$f2q|5h>H%~HO=d3E;R}@gtb3Pwl(=!@qmdB^i0bQz9~yJ8!RlWUImiT2@4ykB zTEB&8<5fG<@{<$O+C}V+tE4ogEu+ z&mc7jHiTGAVs%^XhmO>dp#X}=ew1)kH-rKx9(5ZnMSIt|j(kt-ccOaQbDa0Gw-VV}Jw zITc})eoz7Sn)-OMSvInINv7e4oq@B8BxB~O+lY(AK}b@5sk7h$3n(Q^0jqfE8F&$a zLXoz=_i=$1+%Yxi45C7GMtqW?=oPKYSGatuZD%NYW$(ryM5o0(qi@U$-1z&(@CE^p zsgldx)Sh>YQg#^?fpasntU~Pwm>=_DjXSnm@tCXG!4%=O2Ph-UJ~8<_i1v+w!}0tf zhBMU8(|9$(?e*;kQ;lcGZyxP5voX_;^FnoeVt~!{^Xw5CapL_TGzQ#r#QWdc!92KdgF z;RWzs{qp3jDFxQyp12}bm@Zi2)8nMA15g46Wfkl3HLCML1Mr71U5qn-4()M z=!T4wZv2EV4pe1uW3T&c5_-CWc(Rc|!6l@&ZDACr33MUew_|5^+hE(~_m}_m@m(hX zvj6KhJ-@VZ1cjja_8RQD6Z}QfP81j+11Vp-CgrhtLJFiA&y)Zv zBE?AY`X(;?o;2ILosTb1u+h$+rtyT*xiQF~-bwPZlS*eC?Gso6KgGuJs)kU($b8D@ zpn+N5;pY|`gL6n>m%UGYlc2nn=ChHvMFpc5n_I)pzdE>``&thMiHcIXpYIRCI?CBI z+um@0RAmB2fnq(gs(s32N860uO5k7b-vm;6^l9S(s2W-)OHn1a?{6gvO30k2Ro?6d z1rB$#XyvfA;eT9IujvHilR<-;M>M%Cmqw9MO!PHXey;DMm4{pk{z@l5i~R7Z1y0!k<#gpA3tol5YEUz|*)f4?Y|82Sd{1P{Stt4Co8KJ|N}x=H za^>SrOgDVZ!KyW6Y^A&;Z*qoFtIl?jehrI=%+nB%-4L#C_IZdA5&;Zmf; zk+8j7Tlrw34}_-z=PL=m86i~}UV_n1hz5jyn3=Irt#(3_=Be1GzN}0h1+iOsRa_Yk z79H>huyX@POmRX<4FV)8zPepADiOgA_4J7rVP8GuvN5Yl$IjhTww8?5>*rG`C$srb z4s=}(*aFwK^F4DmM#mV$q3a@OjZBqAcGC!P>a9wiK;HUX4^@O)(0qYxGYrQ>vx2aX-~wrKj6Xi&a< zsYi+q`kFL^omk$Qy8jzGG97{X}%cmc@M-DXo(G4Ko8lk1qVAi@jDbuAw zV~mfBi)8ex(ulZ^Sf)jyk$i_7Hos;4iJ?zhi`ywS%VoyDCq{{l$ICk!)r+2J5+C9? z5T_ZL?eReTm!%sp>xAR+p$Mm618pUspGIu|#-;1&#&ESBw20b9i=zA>upUFM-kM)r53&bN^(zGN0=(oVt-*0P=X7jhu`*RR zb8$(w!Kcs@eZ;tW;ED&hq1xEoU|`DPC~O zdEF|7hN#H7i}WtVbK^ecDu9$M4FcC>m8JWBj zL*DX)OZg%1#E_0X{B-X7EeGTtJx6XzxeEI$JKu500f$1h10}4Lc~AL=-Gfff3PF_g z?%69wPHk5r3t$~LT-xGIjrB+)KtJ@M$-_Rgqe>Z|%95aP9d2CQR|7dr(4v>ET4{n-^jC}6)wb!4N)x&E-;p9@9kY1n642_poAvCOBk z6ApYqm;Rt6G|XzNTpS}$1fubnZ>J*32AXYOM#u#-V17}|L>%ff6u~dKR-oY78m3$t ztoX<`xx3HEBeC6n_rXYe5G~|#JE|wKe1Vm;p}Kt}VXnu*XF*2~HntaFE2*)vj%l9a z(Q3uSXS5SOfM&>eP5g0jm~$Kusl3>GMx9o#`T^opvh)8Re&7EuFu=sg`2PrdCWik3 z7-0Ng0Rz)Ko3SKquKtf~zwvI{f}KO3q5^ma9=2l$NSYfMLL|IbvKy^`+*Y`2s*86e z_&84EX;wH%s#?uSh64y}Si?kfxo2aZ+j7#6O!LXt1toVT$XMfO_~KT6GbV7j}?Krv_Jv>76iUFGiVc(=HN z1M(LxsNImebBth=84Uaz-=`p}iAFX1v1bscDhl5Hq2{^3Xny|m(--q=1Z!vq9S6p4T^xjLTV;14P1XwDSCPCf04PIk#Da`Ou0zm46H z>(|VmnZ(9x0(4y)J zz>yylb`22!oIBjP|LhMC+VGi#0KJRjPWb?%L9y8)d95tg1n=bV>5*%P z;FL0mRvv9D=mY%(II!0;rKAzi=w5xZJgyb&TR`rkVo+twqYJ8ACPtJsxk%jpvqqv% zl!(W!Lg>#^8)8er+IJJN$WIv^cz@+!rg>(-TvEZs5m_})4(CMw3{+qt_n!oYkV*_jK~ zEMLA|+~kZvmQkN|d33Xm~r_t6JOJ>o2N<)f!wbWS5aVfjFou<-5cpL`ZD7fwvlJY>f& zX>*81%^7yvnIfSW}Jh! zP%CEI1<27}ZU9Nn&z`9Y`6OIbqCyp~&nEk0k;eB%^AFI>s5RS5dJ{%k+-W4xo`6Bv zhnuY9ohC*itJ$oUEN4E}Ls1%aULQ4(^2&+Igo*7o8nz(9lxD0W)w+++ShSMd7p^6I zik6%|8pT2+Nl69sjn6-qlixiNhPQBNU+{g-QcU+p=hJz1Fa{le-~*}|xyw+puN>X~ z6s3q8RuP|O(YF?E^JyeAly+|l27|!NHV{SdQSMoo8n(jpaC6WY6@MI>^W~3@^d6A$ zYS`attI>{ps}IrqdnYIf zj@MwGegABj^KR;3_LQIq;pZ_dS=2@#uL zS%j;P?vEy?4;a5;L<0&D$C|8khnLX6S}G>#tQg?)apS*^b=@s&4C8-c(dWO1SR67h zcRV*2K=QWsv1aNT|6%7!@1pR1A;y)SqwZd7uHa8G=sA!tLP+Wd7X(C8p)*>bz{xTZ zu}(>$iOc6?r*L03D>CSZ6K-(qF&sbM7sjx4!ZCbTHaKq~Lt;7ct!xy@ICE5_#s$p= zit+>TvTG5g_&MM+LCrMtjKMIU#4HkbnhvD zJFn7;swEOHMN}1nHW9910ce-km5T;O!G(YcBOH?YxO1B}SRdx+=E91>$MClbvZX4h zgzp9)L>ky!4;-F6OIO>3n<8s)V15H7YSL#!MTo+SGlw(&9Db&?77#8dx#5a&8s$qM zcN@tkT}as!^QsJ=VF5tS5^Zz!T3L)9aZq{|M+d7z-vVc{Fw)o>rSW5N4$_$hU(uxdS+h-!D2yaGo$7Aox1BTo~iHZ#s! zd4p+m!x7jS^~00Roe9PoowAdW`4_>;x&~HCL|l+YS`d14^O#@5jQSZO(;{$CI*3I0 zR4kmQ$2c>n5}ZObXRNhpJrh z+kYHhUgq43t?VkS{im6Wm)TrmWEw zaGZ04Bp9d6-0%qkcuQ>Lx+VawYVg!p!biaq{cP`-gh1QICSDGCr(E$h&nC8+NFO%R z8={2I57BF6OpDeA1-qw^h%%ogvmPW#e=!OVLLU)eVs;YgM$y1ZaPUy`aIL4D?r`1q~Cu9#XR}s8QE)dRx>=S z+J=SaoB;hQHVaMjN8bfub7PxR^j$GSE#iP`fKV=t=~}thlA)IE-~1$)(uL4=r*H&A zUC1uF$(tcSEyiQxju{$-P)bVy{vNInPEKBnJA$ZJ*REg^>f$;4U1mM0HF_>)^=stt zpZfSaOe~(L#*XdO!+vwHUCU5zO2~L{?&l>TNrOWUlVPK9lzj;Iyu-G%n=O4t#fin@%BFiVkQLe7(;L_YtaEL1c;QUwrS zP|>SS7EWjA-7%?sNbiKgHNi|BMjz-O+4W8n_av7vo?Q&yWB)p8c7UKU^rKT$!wHTA zi*CmYj>N*rnv)h55~DIB{wGE5nAW;Cjx1si&0&U8c+g{4GxM4#$t>c7N5nL(bDF{~ zxu<9}GZvRx+hA*W<!J3TSv}skp(yis%5qSk9V_la`VSm+IY~-ToJ(2V5du9f6%18D2EGpZp5ARHWmI|ZgAS|@lGSSb`Zn68uM zRGiI~cyz%)Eh-LEh{7sVviM*`6-{yLI+Btqf1O;&!}XUpv?A-0ZlPKu2&Clj;?yh< z%CW|+di{=PLtKy$U*#w>v=0acwnkvU?rv`>3#r~l1mJN<#2LNFuXGvqtU&xMbY)5RV%k+9OaKUrWnQR)6vYcr^4D{in^a_DNAu2sd z{S8L{oAlibG>hsD*Vpr&Di*F5$Szot#!j8T%&ZhQLr-3oFA8h5!mOSVY-L~q2Ciy_ zI9)N*l002CK$LHx+$qiNiI~NakFfomf}9@P;y+U)G3A^!q1Z6-Xj@6Gyc&8o3j>&% zdty7?S2T>;Qd`2|6v_cHpqj<4d#)|xhIPWZEMc4URxasou5`IYY!Be_o14Xo9M&JQ zT_@vbQHB4gbVo5rgsxfqihjaIC882lI`x_vNtL5(DOhDd%_)_vMeXnDsB9I0(4XF8 z!ZWy#8hsC{(d%f)s7mACQMKJAach=^0z+N_5t&t)R+6(Uzq7LVxbz_+8f#9{jE^H7 zo_)BzH5e>!sWXl36xX{f4=SF6eO0nwrn0)7Liq@oZ;f4RsE(3k?2A}!blz-lIX#JI z$&@|WCK9dYUH{n?(PsP3SqJ!UEhT*!zZ?q7KDVZGj~Ub8VUS>}>lUE*Yb>77&xBWS zA00=n%u})Ek8m`jzZC8jhxX=+8o=~IeE6BFp3;cG_S;{j;(-t8n0hv*l8Q#`D{n?? z-vn)K)s5i&tDdcC+CeM&aVeI7(=^Jm6qD(#q^-_NNt5|(j-)>y4eZ={^w;A^&#H17 zBNk2DH*f&pc<%AiWHJ4~`T~-@mUjpbWH=g8f7VK8wehgKy5gat5{Y{gIeTYK<_e?< z7qT5zXHJkJd{OJ53BrZzqyb=e7EuR@7KhmCnxlMlghThgEL-KwkCryP9*W&W%wO@f}1`%oN$ zURm8I9Uk%1I?u|LZNMQ-zOTQdktxAS|I=O1dXTxv6L;<|`I_)CN29BHPR)x6zuZjS zSot$LX^InJ^03x!E0E&W#ts&1?;v|IHmF_3D#4Bcehk9F^m6Nh2yOy`wnljgz#B%p zZ`udV$_w<{jytD-Q{@CJzVQ!hW&oa=0f#ZJBQy#165E&Llv{-gL%}joAJ>y4(4lfr zl7utxnl-zJN6=ep#q6uknnM(db|_C!k&=cOzBf`~c&=~400x<_n^I;}nk@toCZeiT zVND@AhLzQ470EYvaonqS{YI5*zqv!#XWu~2jfXtO>ftue zp2zD{if7-wp6If4h6luJc=5@pqiex871EOG<1?JOICys30IpeHH<~MZctGrS5MiO399cwxth-`%}e<+VSNUNDW5l-jR($>K-oLx(ur|~} z@<vhjFe$c| z!LzUm8y5S=xGDC$HSW1z5_R{A8^H_}0YvY4cCuA!qzFh%WfIzvw{)NY(zk=lWkx z>VF{<%$#ihH`RoR@qa)j82?wu#I=sLJ;|sm+}D^sBR!xQl5E*c8i1#R&2T&+N#isI zpb77ov?c3|gF0GA;!5w%Zbjt{pQ=xWA$>~~z_01rq@nA2^LnE1UYNu!_>~U0Oq5b) zZhK*JnYHbmUGE-u@BsY(c&^<4@m&A@daj3qiY{81)KmZX8~%^y3Kho%X8ZlGcVt;V zE-r8G57lpKy5BAP;UT_7SiO)oac}##tr!47Bn4zZboUnK>0bm@*c!9Bk^78TPOEFK zlBJt+Tl8#D)|GD{~vE}0T9&|?GICe zq=R4pPc~`_VV25;hmze}FF}L5!_3^z1S#MlvAs`F7tz05$PIYjjZ25p*@ThQZgA!=r_}pZ>k-n45*JhhMHZG z=D%~)5hy-9swjjU}wdoi?D%>!WXL>tk6Zdz14_O4_H!;1gVl z2a8ldDK=DI-a+~OyJHiIl24HD6Y2YZW3StGkZi^{h|J}37O^c=>j|8ng?98oz?g(XmZ5_!_g*tIu) zB@{>E4ot~zj@SV7wFR~!sXQ)`s3^bGug9W-MML)EFbAcbL~-JGam1*0_)BWiw|=Oj zA;$t8gQt#bFm!rQYUQ~(`?)m3_x$7WDScR?b$|gRAEyr1;E{~o_yvI3%LhFcIOfww zt#IqSW{+aOb(0J$PFm#9vNx=|%I?Za#)CxSyd0Hl331w5sPQzD;rj*d@WwX|C(hfJBA__F@#CVJBNELMz!WM?iU?GlIEr@oey_DHqODEtal^MB!Rt(3!2qsz>tiew1G}rC={GESFAS8Rm&RpI|Ny{>S1xykMKVIO08B$6Jr!}NBSvRq4XlH znWvyP?|@A}zX~vO_agDRPMM`I1_(%fMnn1LVVPF`3nA#dUjHMpBXKU`E; zu85TVg^`9)Ys;~3R?|@HsWFZa;dV|&uyTr^Q2%_<%eCx}m=n_~Oy4QDp3PC~>d^@r zzi#%DoyHP}E3FVftI|!Bh{$JqAojuZrn3-=nyEkRCn756a7_lE+7;^Ec}*t)4GEE& z*!kDIqdjEO_6|zBc^@m`2GFqDFL2^+K;vaP3Yn0HeX3v?B*jT(M)0>X3ArU zWT(r&MSY@}B?!iZu}ABl~n=7Tq$*F7RLkrm;>q+jq!O`FxgEzdn5 z1Xhqh1+DA5*oX{vE;;z3GrhF8MWZcv|FG=!aW5A>UgWUnI^MM>nLE#WB%iE6b?I{* z6>sCO#$pS`5_e0hH{>GWH{FF>l<8WS5i+`lsrZH|0iI6C%z)sAj$V$q;`qX@DYkM? zJ53%=1%4Kl%L9Siw>UXaFhdiO95sme-P=fiuv~vvg#T!QveS~w0%MNIR7D}kp@eox zo!L&}8rB98p9W$FI-j+wI$pB!2P;O4MP4gwjGCgdjn-j{R5O#^7t~!#H)J<;5pv3X zmXs@ULYSEZX`gJul_{8Yf9H{Mfx#+O){JC&Za(KjSBw!U_1T+1tGetPzgf0R$1yW) zap>m{OcmdZp-TN_9tvoR0>>-AnTNz%7F4_>dA21|>~ixJXI_vODqjmNK0T@9&^P!U zdKi_lgu=s)2?ibK;>!7#6gNUi`zs|mg0ky%BM1&X6Nw9lyfi;DR9FuF==78!xvyRP z_AWb(!jC943Zz$u$gZTapV7$Q6I;27xvQ|)NNVU=4n7)srBZRXY^>0ZPV0kIdN2

    GwFe>b=0IJITgXgI_UKOkWb^@Z0S0GRXwSX7R& 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%0DXNY31vj)5}Qz|8@U=jss3>TK|jt|J2{p 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 literal 0 HcmV?d00001 diff --git a/noVNC/favicon.ico b/noVNC/favicon.ico new file mode 120000 index 0000000..45399c8 --- /dev/null +++ b/noVNC/favicon.ico @@ -0,0 +1 @@ +images/favicon.ico \ No newline at end of file diff --git a/noVNC/images/alt.png b/noVNC/images/alt.png new file mode 100644 index 0000000000000000000000000000000000000000..d42af7b421b9f1193620cb4a7114f1df27886d1c GIT binary patch literal 339 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAIY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)y9AGfn3c|@SfJ1YPZ!4!kK=DA?d4@Mvg-UsUjQv!4@3E(23Sx$<4+2dh>^&G&f67BAwO*^{~A)gQHlw4ThU?9=P7U#iY$ zoU@gULH+&Szpr+?q{tjL>$J>$WYr(E@cJVsj=AZ~_m3?|T-1=LlQ4TyhX?0_FWA34~+4uP000>X1^@s6#OZ}&0005JNklLQsoytXHG%qsDu&24?kb6(gJMZNIUjQci;%GE_^nL#i=bVU0+3)v%yWQ@~-6FHu z?1ydJziiuX0zj=+gYWxKhGG0P3X&k2nr5MT4Y|wp8MrATn@2jALL#zx6ke_*NzM*Q(LB=qxlTR{ z-;+rcMIa&o#WNuyL{XG4;(6ZLfhv-T5CWd(<%>9ubKQ3ik|dGupG+on52n*8WzD<# rPah746vwf&3n2ssgTZ}w#D9YiP?b1W?a7*e00000NkvXXu0mjf;r`$= literal 0 HcmV?d00001 diff --git a/noVNC/images/connect.png b/noVNC/images/connect.png new file mode 100644 index 0000000000000000000000000000000000000000..79e71adb85cbdd2da5b59d9e2c38609dd526d1be GIT binary patch literal 404 zcmV;F0c-w=P)P000>X1^@s6#OZ}&00047NklS9D+ncfe;N96$KSXNI`*e04{(81y?{Ei6R9Of(lMRK|`ICPyi+&eiUAZ zm9zdypa3aP8p(P)``(OKvkOZEAgLANt&n8Es+ql)h-}pOd;)L4*vyoZaUk(X(h2YZ zD6n1y173kMNkcPx$w|M`b>JGf1FjY{IRJKnLo*x0Y$q|00GDQVGp9jbXaej5Yrr!= z6v_iSix@a`oW`_)kjbxOY4Z0?^0`QVpqcM2o%j@J13gJ2vf(nCK`weuV_Im@L}d5R zDRAuZbw>Wp5CivAbYhOP!dl(+VukP6=Za^N0FPdB9#J3{kN0zN8cC>vtYm2u*aKRw zgA~{TE`S}r|8)dB0q4NbGfRO7GaHt4T@FcoWtg~-r2gDO6$V{N1I=O}sav-{^k{{! y4cr3b0^fFPm1r~rl2*vhD1?cbjhg8Ee|!N&_KPMesy;aY0000?EKa`a+$6maEEblBXv zqublI^Z5ssChmi=1rK>`n#>Cpc5LscXyxJQ&70LIB0IC{X&RH3tZ?$3uhC)uAAQ%~ z=dm#0#6w#pC2J)m-^*`i-jt|dOLJh#dSJNyOLkI^a{|+uvu}bz`JFkM*S+>@X!rHq z_o7j{y!=7c)kEp~_RqX&X~247rqA8G!CuF+|LYjD=OyU#_5bp}sYKbLh*2~7a?){X-J literal 0 HcmV?d00001 diff --git a/noVNC/images/ctrlaltdel.png b/noVNC/images/ctrlaltdel.png new file mode 100644 index 0000000000000000000000000000000000000000..31922e53242fe85fb1db641a15339e2c33670e5b GIT binary patch literal 317 zcmV-D0mA-?P)P000>X1^@s6#OZ}&00035NklEIGHbhH+fhROmqGP}QpED4br)*+f` z_?l_{ec#LO+c)rEu-peF-2wwZk-8P|U}oc72a=w3m0px=;itmLe1 z#^)NUsv0@xQqw6Qf3i;eeYVpf={%ANX10{n1-g;U+RRoliQfnwftyI?tt`uHNl#|h z+ZT|ukaT5ci zMJI${Kqr++6=)XZJ#Ys&cHgZ7UcC3Sx~_*sQC#x%+c;nbytZig#9=-FEZMBb(?pXA P00000NkvXXu0mjfvjB`6 literal 0 HcmV?d00001 diff --git a/noVNC/images/disconnect.png b/noVNC/images/disconnect.png new file mode 100644 index 0000000000000000000000000000000000000000..8832f5ea7e2bdde7016b9429917fd453e42aadb8 GIT binary patch literal 1378 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 literal 0 HcmV?d00001 diff --git a/noVNC/images/esc.png b/noVNC/images/esc.png new file mode 100644 index 0000000000000000000000000000000000000000..ece5f7cbef684a41f4a7bb9d632e4cb2310d6b5d GIT binary patch literal 385 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAIY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)y9AG<$XUxK0|o|0K2I0N5Rc<;r)=~(;vmpwt~763 z(rf03YMC%Gv!>p;`x=s-3jg3Sv+J08Hk7^Wk+j5=)(kI8VZ)Z0e~+b2TwvK-mAbF2 z{@d)ElGk?5n>TO1$DHDGXL8aMJSYA45_?{oD9s()th9+WhB^2Fuf*zCdB(y{77Tew z&kS1%{uE|Re6Mm~@64I2-aW6}r=)cIK&W#;RvKH+>Qzztr;B)Z{7}kVtXRpGB`8_- zo?X|~X2#5`rF$<%rB3&A;!r=3y(X+NI`nR)$B{ESr#C&d_Xb*BZ7(n}k>jDxsd>+C zaTaJQEjIC;?vf&+TE00gNaUzi!N1irSGT2d zB?5_@acqyryU7ALyz3h9c@D1yz$pMUXc)psjw1kIZjC@DSJ!pvuZF$S5EEVD`sO-K zwz~vXl@a^8vuXCdXQVt?^|DBBs};`<&ZW>?Y2J;;?7QO=uH&8|a7?raW54z=y-+UK zVvcb1_^ff#m~1{1q4bC`vi{NXgX{e4l9BSnCkyj_O)k$bT-NXTtaW?GeaRR8=>9={ zI559(gopow&Y>}1=uA{k`xoEyx2KvRChM%TiVOhwVpN6^_0yNId8osL^rTNZQIULc_^3E@(-y%Spc5Q~vy(d8L!)(x1n*7)_*losOPO6XtxtI&bNw>fdLNZ8Dwf z$IIAo{quy`M$-j;DK3=%w?ZjAaObK&H{HAptRzKWIeQ7*KiU)h_)g-r{Sm_V_d7i@ ze&ymaw?pTfHml?IIZTe*dmMBUR5LfIWL5K>i#m4b+qJBy1&05xz4K!eX8XL_`Om8f zVbx5BqIT4GSlSgy?m1KRiH|?#SMyHA8TzN@`>bi|&VIbRcH2a6i~WBVl#% zWRl#M`RQ-2?~glB>Kmrt@$!yDk*4p)b3T2KBbe4c{Fv#s_FrD!=E(K=v)<*pOqy(B slDTM#cEa+F0UAq7I2|-YE9TfUc1w106`8X%0>hZW)78&qol`;+0Ig`bxBvhE literal 0 HcmV?d00001 diff --git a/noVNC/images/keyboard.png b/noVNC/images/keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..f797952513b39cc75d0f0dd4d6716608e10217ed GIT binary patch literal 1283 zcmV+e1^oJnP)X1^@s6sPETi000EaNklRNjzKsl+3H2fX*Se?>)crik)8OqXL!g(Zk)QUl+u@eZ{N?8!v_!lURzreuTz#~)o$Ou{ncK!u58uobz4={SGnacq(;4w(VW_$&Tn0? zLI}}g46&zAPcHz$ULt<47-LVhIeLJBh>%XF$y!}QAP_(_7UAhsnk>u0Krn#eSd^ug z(`1!b(Ld0S;X^TADCEg3n(+F)h>wnk)A;$yRWL9yH#>)^$thg9d>IhH?CdP2Ca3Y! z+$BH=%+FuP)Z`TAlCx;HT3FcjvlqAg;`IegPfj5@GlR{|O)M-fVtR5KKVFzYty=4~ ztKG0fWOsT+R-mdX6o&#p2t`()soJ)OkYyQ)Cd1*7006QqL)A1WiV6n6AuCW-4T`LS zfkAdSplT`{vJ3_WiE(J^mfypX-^W&bH_NSCXW|FATe*W}`{>?%qSaUdQqGj>F}4;qINgs8wq? z^3GB8_xJJpckYp8Sr|P$hDapBQ%_PN7+mkKYV`y^?C#TK0kuNAd)jltXu2&tkJ-U z58kKbOcIrH1t&i_iO8AL;_9U4fg~KzHkK$PNeru;=_E_bY=I=X`e&0s?}Fa+y5r zwvA|P7!KKiTsDVhqk(8N3e~A{qhL_AR>R<62)ak-s}+kXoMV4j#+H5vY>}A`x{LY_0?>}|w)ThJ4!xj6} t2m;U`qQbdz=l(i-_H6Z4&i6*0`Va9a7RbS?<+lI;002ovPDHLkV1f&1X|4bO literal 0 HcmV?d00001 diff --git a/noVNC/images/mouse_left.png b/noVNC/images/mouse_left.png new file mode 100644 index 0000000000000000000000000000000000000000..1de7a486c76ff1b95efd7e5ee36dd6943cc6dd3a GIT binary patch literal 511 zcmVX1^@s6HR9gx0005TNkly zKhD}f5XIlxu*TB5qC!GGMv9cV1WC&YKqwXxk_(^!S^NKxY&N7`ufy{^BuRp5wTe=yggB0|-EL8<)l{q1 zx;aUA_riL;R!Ne;vMfj`A*BRk49#Zq*`4x_>nA1i%`P>6%qjo?002ovPDHLkV1jL+ B<81%{ literal 0 HcmV?d00001 diff --git a/noVNC/images/mouse_middle.png b/noVNC/images/mouse_middle.png new file mode 100644 index 0000000000000000000000000000000000000000..81fbd9bd375b2daa88b6bac6a7972c58b708a67b GIT binary patch literal 517 zcmV+g0{Z=lP)X1^@s6HR9gx0005ZNkly zzltJ35XQfr(H;kS;J`?bd5jA#-1w4>%zXkyP6VL?HBbltU?dpHCifEe1osR^UUJ;X z1cRfFO!r0W*)ulkvb)@VSrz^Ls=KHz;G>D86P$Co+wG9g=OLv;9LE3v%d!9faU4Sk z0ZJ)M)5PI$kc1H8c^=V%XS3OlAP62f=cn9oIK=l~k4o{cpPta^bWZVPGJ%v5jYi|d zGtLd0&F0HF6aW}wnP(OX1tqT6>xiOAoaYoUrBrnQux&d7zLc{pOJOO25CUo4noE*I zi4|}h#~H_VyUjqND9Ysa`@OyurfFsjK@i*orj#nNG8Nr!Hwl7(FvbWWnMwR-A_P)O z06>x?5`bikq19@gZk9VY9FIqgMk75@QwIR)^?LeNJm2CTJ%6CI*SK`}9;JKxYG9q- z4g6|_(xBgO0(KndX)qYP2xQx~epfV`&2PT%-wkcI+i+d?rxpwVuIv8sJnv@cVzB_F zbX%!ZK3_dN9*>iLzb~(8I-N?+d2)%N{l4@0T&z|rQZAR_I1a)vM6p;zE|-Jv`&h5n zD3waGR;yi{q^o;jxm?OH3}F}sgb)xyfH8(@wR-PP`Oozit@F&YG*W3V00000NkvXX Hu0mjf=bh+1 literal 0 HcmV?d00001 diff --git a/noVNC/images/mouse_none.png b/noVNC/images/mouse_none.png new file mode 100644 index 0000000000000000000000000000000000000000..93dbf5780777973578edaf7ae35f65ed01e5718e GIT binary patch literal 497 zcmVX1^@s6HR9gx0005FNkly z!HVKQ5QhIwv}2%i@+3$eV-E8o-hBc+tO#O*=)n*Y#FOAj_Br+m_8B~RS~ikHFlwZ` z_b|+0CpM$Y>@fS^{-W!vqNpz5e-kMOIOpnkJfdE&Ln(!#C;$MC;{X7PqJWeVlv3EX zjq~}e2q7d4!wTz7%jNRNWHM3L3W7kDH6D*OAIGtZqDWn{tZTF1@1Hs6S~130rGZAH zq4|Elk37$%5lku7GXS`*TLIsSIgX>TG$W-%S@*_-5SrJ(MNw2T4u?YplIM9Pb~>HR zqp)qel8~n9U0_P7=Cu`>PNyPGQ^FV{gqXL75CWxMmOu!h04T;7hQr}oXSM5u%jJS7 zip)eq9ROrDo0&)P+QlP!{Xpeh>(=8(RG#gJflc}}@P`#DgMR%Ju;+Q-gCO`Tkn6hU zTQL|6z9mWWFmyB;!T0^2Mlb;QzW+N6!@HsD^%|7YL#NYudiQZ0$6`L8R}Oqxi^W25 z&c!W;@%ye;E4kfnNxR*K=XuDo49#W}wOS2Hl3=&nq19@sUaxm^lis}xo6SaLSq96p nAf<$q5{xl)yWK}`$`{uk{?qW@S6u}n00000NkvXXu0mjfItA$@ literal 0 HcmV?d00001 diff --git a/noVNC/images/mouse_right.png b/noVNC/images/mouse_right.png new file mode 100644 index 0000000000000000000000000000000000000000..355b25dc9a03e6d8dc4b956dc51185b5ff8f63e9 GIT binary patch literal 513 zcmV+c0{;DpP)X1^@s6HR9gx0005VNkly zv8ozD6o&uV)may2D=R@3@)EbWW$N@+xA6%C$s!2bXrV5OSP52gU*WcSf;@wyunJk3 zz~ZVSJ9DdRoLvVs+=S%s&SC!V%pA@f;C~azC&DmPyWI}uav4e~2q6Ffj^h9TgbH|GwsANd6d{B}QACX3*=+WObN(?5!&7cF8X*XRd~v+|d^*KXA6}r8Lc85Q@vL*h zX0v%bhXMd&tnkcArJ}{p-##HtQ+b}#z?4$m0l;9)~m zJX}3InM|_5V4$vPI-RO846{oNJ>(2+?q>Rf`4Fzff;%=K%nq(i6F}{53M#?;U zLBZzq!>RXNprLZ*hUsB!Gewso}{}^ zyS5zqsqt+q$3eS=bG3syL}aJxswlO({ZMz^<8@I+aHiGz+=bUm8NM^#j@;<7{?FO# zrb}1(?6I-+nz%_ndc~vpE9T2SE8eKOh+S~6fqC~wzI*9n-{OAGRx&S`su`qNAN+(V z&&XBkX?|VBYQH4q-F|DjwzF)~vb(lB%jUA~j<{R9onkH8Tw^2Zl+T|DXQ^pge?vdW h@Q(gJk3Tz4NXMlvaGP>8%>o!=44$rjF6*2UngBV_o1g#y literal 0 HcmV?d00001 diff --git a/noVNC/images/screen_320x460.png b/noVNC/images/screen_320x460.png new file mode 100644 index 0000000000000000000000000000000000000000..172ec555c304fdcd2cd34c3f920af2cce1009406 GIT binary patch literal 12778 zcmch8XEdDAxA*9bGDHo7M2ZAKqIVIA6eUrD=+TlGz4sO^S`b8!Nc2wh%oq~{QKB=L z8AG(_oiTGC`LFeUdcWMe-utpF^PK0{XP4jEXYYNsn5Wtrj9_js2n1q$^iW+F1R_%f zetywX10!GNUFm>dWbV2eYM{yi=nC*a{ql*1I*4@s{povA3NS+F^3d2F1fpj>{~-fq zW^)09G#-z%?$e;@*jWUaeR-h3yi1@*>UZ^hrq^e^156Eb4z~xJz5Ra2Wg5VGgwk?y zKUN#RFfzZnB@#-dHmgd0)q_Kg?(NsF@0l-LB2$A@U$wbOPnrCb0%A)6yX4Cet!KLE zG?i>?Tzj?b*RMb#SHDs6;*XX$5{E&Us&tFD7ahu*7yW~mX50sFJ4{r1GP7)7ev+lC z&K4pd09IvTq52dZP5x9}o$Q9dXAm39Gtj%}8=(9DZ(slaTe&gq; zyIHxrcQ4}c_&vVmMO6&h0}Tx%ndSN8J){`hlULyN<=2Dok5m84pR_DVCe zze<5(*=Aj2viH7*GZLtelq7FCe=aRuEq>hPnvG{_&&X^oC@6qUx5a2$Q;U)d*w!;L zzNdnd9hhg0@s`m=p(KL5sXmFYx8~>LRwD>B)HKu=%lY4?nm5~MmVyn*icsx^WK5fi znx%I<^;4W0`dig5?RgvyHP@xgbjryh-e$JcH9s|KH^xfJ?h#8k(KU~*Ug!)lWHn05 z6#ec_*TL|Vtc`{G1DkKQ91V%R@T=IXy1_! zNu*llBi1^_M`hIq;km|n*eY zON>iW7wNsgpZ+-&NTPV&VYzsTh6(yq&j^^f>%qks=Z0+$4ZyiWDRTTz{cyGmr>yai zgqEd_1V@FRHh28q06Q}`nPMP{SHVkMS(*67AOSDSaFyoLpOkex$l+4@&l<-yX{m_& zWXsJU)10aWY3Dh@7xn>F5=ip&l{1$mn-4Vu6JxD2MwwUQGidJv^ZT%*B$mj?$lU5< z^aMH`qKYuP`eK(fH9M;%on`QkF)NA~Lh!-f9$Vg8PS4hmxa0}!RF;*KPC=yy_48-6 zQ}oZz^dI)gGwU&zvFHz7 zBLdD8Y0b0)F++dX)`Y$2qKoNF-&iSXpirne=i!0hlan74q@IENelIT>oNSOTS;%f&Ft>2Sd9s#-fD?M@S#yk@4F*q zP&g9%`R&g*q!gr1l+!6pWZ@|U-M|^hv*_0Bd#cS%edP^#?0?fs{*QcWu4UZs2k&dy zhpyjXNyysEIC1xH_-mZ3%FW9gu`Cee3^;E?w?U-kC5p*90uGFAxk748pZj_$kP#!E zrA4$0%}yYD20HNoX-d+Zx#_ioAXSm31!IeOF5z5^Xu@xR&WcM5!SJ9`{7mbF03p!=M}IjCg$49 zFPh+>HJn{F#oG`SPd%xsydYTPn58a| zzpBF)0`Et}q#(Y3(9)2)kO!Z*qf>t-NvgvWodu6Ci=Hh+wL) z)f;T{AM~`X&<&1zp8LqzMgMlH@Vl9rnT2oj)SfC{3`xK<$E&|Kn|%>b0qi;Cz}<gHDAorvD@tGir@As<@dOAv};WQApE$rRMsHlrPJXf-A zefRyUmd~8@@U6PQT~ALbq-AvziQP{Z{A>D~1LwDLH)yv3t+KJi??eP?0aL){EUi_w zH9E>}VG!~aYGZzMPI<9fi#cCUw3`% za7eT5KebP6#3*B)qH=ortmFXBfSfB07 zt%S=3K9J@6^CMxrKwHw9VU0+n#Ty@<3YoK5d!F{zwtS3BOx*o>h399Luegb^w#vG? z2s+oGnz!zzv@4nXj*5M_6oHAq!EpS|Jh^Ig4W6EqTq8 z$NbSM*7UqZIe*c@pKnLPr2BGbl)dETp8vwtDSHHE=dI^iDcJLVF6-v<|8-`M+396* zIx>5|7|&??jFH>=XPmvy?o!wBjzX9H*{=6@?#d&K$V&0q7t%n@b<{2B295GTu&CF7NB;v2m=3n7g%vDXwd zR$wa60?)9rv3h4O=zVt@MrF1O(~%*u6u&h85_X*<7V)iH`1#B(u9MS~i;wu{&C)fq zi|r0@AEuZ{I~QXc8WxSxq--Pq93Ly~BG5AOI7tW2@O$^%H}phk(rgQ1gLoyexZ4a6 z{y(_>#I4VV{4cj$eQ+i3;|AIs1E+Q}CM)T`+wFx7(DKG>#Hi$AJtrV;6HzlcMo8Kj zALE2w3z>EEOY_` z&j=BpC=#et&Tfw8)MT{B2r@H8D7IFK&^I_w|JVq*%$GPaJ?&?T8RNPa9ITR~Ab*Uc zaKUA0yrY<1QmEyXZ}hwa7Y+`U+aJ~AglT=ELTENtyj~Qv2w@Dz7RI@UxT}zHj>rA} zj_`hz)@7Q>`s*{W!3{VWw{sf;uF0HUp{q?qwL0}VcWYk1cRdB!;JCWF`seV|onuxx zH+fjg1P(i{&HuLu=9-Wrx*_v)Uj?M660kp}U0BO73Ea@gCJ zrwNblpxrw(31@>O^2h_Pq<*`=XJmGD#tlyB-hD&3}=!j)|?Z zNm|MvZtaM^T&gu0=k2{m21n+tjqCVdkoLakxK$C?5DhrJ%9Q;6{?i-kT3TAJBoX!9 zPO{uXvZnPhYZ$t=PsZRhWqrai%X@bZBHOkiw{hbBl_9IWiwlM>{PrzoZI0}oG3PBS z3QBAphSJ|B8i%tQd>$GR`@nfoIq1;!(BLCkWq^dHv#N)OhX}#jW#{y0xC&V|v0=Xn z4}>?}+_53^DXvIAtx|A%7z-h?l4eYbZ5G8ik8>u&mBErcq(owhiULNMo zww(qZvug8_E7P~Dku>^tsFn8yBiBWHNgWs!5?Hq8%?Bkjv)q}>XEdi5OL*oppUfD7 z!xK?io3bbSK*ZO{pJ&LZ;sZ@qG66zMICN-Z0qS?^@4Nj(|LphfND?U0|}xV&GOon#iou zsnQ6WbXPSH#Si$5S&6>(#O!$n(KwTcqZ25cI1nVzOQ)^&cymjtK*j?FpG^F5gs(xM z%RGO|8*jqcLRjnUMIe<}Ip+-7*Sws9axP=umM+emSFT*iEhgT<Z&CQ^+YoH zOM(Pxth!gdoK6no+ctw{l;W8JRz;i2yguSkQ8C>wZJQDFdQptyoA|jtSDEE0ko8vK zMEg=jc*!3xBDyDXCrc#n7f8x8NVg2k)!8g;>7`~0;$-k%Y zII`ibx|%psdjEh_SM_&qh_@1@mFYmnE3ArWMCI!-OmC`ijbrOo;j)e@ zy;I4fMMmQRzd`EpY(MgYA6MMLs0=A-X?vXZxd$E3K~_9B#$F>)^UKu_3BWN@o!*_LABDO6E1gv`Jk5 z2jLR^(goBHSL~iQ((H=0smJW|=M^hPL*d_N4D|KcS|tf=A@sgbldoI%4S%fp;&w0h z{q07u%a3Ec=xt6;xuD!a$6M~usG8rm4-UL`Ys5kwXS6(48BkyOvzm23uB+$l{x0=2 zpp$n&rfzlBG5v0KH0;?k=pD}G2c(ElOsLR3s+HOwi<{%0uRH7yGPT61zX=cum^YoQ z4?KLvQ$6ZcX>0sd1=3Ke`?3VHY|5ny54MVyW55M2=!7Grv{2JF)Kb{Tr zk&Z_LU0h9M0%=aA{NqG2lZ!!Q(}v%6lgcbd`|+1qRdx<6+Ucyr8MJ^30+pcE7#uQaUeBKj_2rHB5kqu#NoFUK2k`eP+QB2=#Io_^lBNh_4nY$J%Fl!iE zbm4bXW8>!KK=tdi;fRPO_}Rmenb`=kj{PmH#pTA=5>qhk%m3&;m1>mQiuLZuV`}2z z2&WkIS0Y${MJ3GozYEn9LejVt2ftsIyApuw+{lD8iC440w+ad{KoVh|jFo981+bW( zR$NIGYC%6_b_zWW`e3~jxo^YiL;Ln&k7BBMF}b0L2{JX$%~#;!B|5~hGIV+6X2~k@ zBY|8j=R5jn+mRJB^-G>#ygkYSWH$1mxuT-t3Ez>oDftA+!|5!vD>Q)<70AzxuhD2s z9lfs!;DejF*)$+^BxHokUQtwp4` zPz?lSqf_pQ-_;A3Gc?nFRHs8MpxAWu(h$F_t09SB8Qj?B7Gl3+!+4vOpj^qBPkTJi~OE6SpM${$hkT#%0eRNC`~$ zti-y9pEoDd4}{Ph3|6QNxng;}J9e#SVVl!MkDs>jhfqoNm0p}>!wIXn%h-P+yFjAF z1hB(qYrG#RjGTuMjt3s=_+fNic4+G&C@z%beTDF5Y4otPv^2UKe~p!C#pB({4>$7@ z@N&*QKAx0Kfu=x-?2FU*tj_VyC9-8%CO|I-4PL}EUh&A*notnw#8Fn^j%IK$DcL}y zi;J3ursw&_Qf4~#O#`QO$i55FV8koe76`-;*uf_Q5Au1e7pkPPw@tY^&$L+ZA*>;- zo1wW{S+a_EJ_|i<;|+;;bBmewX-(0)-O6sysAOxb^#pRf!X(}1gwPT4SBuAcCru3X zt~#s1Sy{D`2!duFJooh6Pu6lL*_>84+fvbx-ec!^W^RQU+*o8}R^lBeQBpT}2!T3J zwJfa}y0~6Eufh@&QF#rm3ZZcngK%hWdgQGC;Vt48vo)8Zr23dJ#2xRuaZj<1&I#_n zx)!P$0{F*dhPNG?qjSHz%=qJ6rV^K=^K$U2XH=1*2QC`@;BGz^3L`}?mckgRZO*2WxVIyUnb9k7(a23=ki%OY&z35I4xI>L(YK5| zGNNzTo7~q#wS68XELD0;#L2WfJ4bG6n~+Jefu8|i95hC<&_6#69Gdoww+#P0rPC(N zI3U33Ib(hB4X0T)mQ8BQZO(d;=@;C`lk}FsU4c}ti&D(oyo*=?#@HU4JA083mkHjD ztUy_p{df(;#N3>@G|fl6?At3=nYvnv1r%OPt^9lxmLg5ZG%j{dGP5)%V^9v~^YG(K z+3>=F{#GZZ1qN1NR;CK_l!Kw?zF`eM-Hyy@^>*zvboampl@_0xLrAkq`}@<=FFJ58 zQ`vhFkKu)tk-bRj+@PtMiAEP8oJP*msgV^lfIvYqBOkRdzP_x6-^V|*ddE`BF)6N( zY-P8gJiNWdmLItnlb8!i!rKnRVr~bBmLfuFmo* zz?c4=L7i@fo`kf&0@3pj|5?TauaF`H{oL?;b)5sIP5H9!$K`rNaL8CX zqkDhJhPIQn<+7m*>bssrqPjrm-ND6Dmr&UnYbhD{&p(kQ1r|HeR$3@cngwN^|Li45 z)usrMMf??Xp;KLM+V40@&$5iFuYdE zdk*P>`4l+2rul1IM}_^nC#~x7kII<>d)_lzE%(EL#ho?h1Gqh&QpYNtGIb zw6)Gufh{~nt=67192Etiag)jt_euNeg&{Lk)aKX8%gSqocJzc*iR!?$1UX3YH<8$Z ziktxK^{B^oD!*SNm&`#BZHH6QETgr_GQr)Q!o@hJa$H;Evux(ESywX24*pGVuIUm0 zj0I#y%MK>y7TpsTw#|MmpIi>N7i5sl!V-UHzByQY=c=kiJu!t}YiX@jrU$_gCqiCH6=2%o6%S*Ge}*Ho zSAD(vSe*#GuJdgEal|Td#v5gl7Z}}d;`Pc?4k$QtWa>DM3Hu@)t}_vh`S1}#Z96o~ z%9E&}p&?g8lZe+Fjm{V(qapsy=aB$(dH`ucl97?I({d};MfTTff`KUkHo5W3wZ@ZP zdE33I{CgAyP5oqxj|hk!`CjuHSF1{gLh#!%sxHR&t09Nxv^|Qcugb>ASWW4WG#<2cyI6p@7pGGgw zy$~fUq&8tQ4kaiXR)gSfr$+;JHhc%wfVNnNxe= zSH%E+b1&vjj*mY+npHABfK4y=(Z~9SV&PcjMv4q5>lHhNzu? z#!-e2f`v&-_`x(9J*Lw+dUIb#ZqddmD7N35-xI@c^opH;mvULVA2nH5^rY@lY~y)y zw7R->bei~?P(3j#4yGygmkS`~x&NK4Su0kE>f$J@oM#s>=#|gO)Dio<5o=>IiK81D`xWJ4Y>DZ=HhMS4me}`mVoyUE+vMUFrZ; zI)U-BTbYCRJUlFW{W=ox;?nXDCgwydn>j@APL&8vv9{H;0*nI;Cc*?xD@nDylkv&d zSb}u&a#9KsTY)*|B3ReQqM|g0e$jzdb*L;$h3>z)_aSlSk6)#huH#k@Co+xK|L3Ax zXKA^EA%sM@C0oT|xcK$<)@c^5CR`6wT2j)Zf)VMSsWLDyplrB>uP;Jg+SrW2f~<~+ zvrH&|Z>!M@&q01AFI}Kf31ekP!&*ZWm3FbNArnE60Vdu*mLyP`?QMDaUL$uIk|)as z-;q@N1E0?BA~*~!9UmXxqTma?JUKb~aN{={Cp_56otFHEc7#R{*mJrbtXc(>_(zHI z10=3WLG8}4!2nh-=RruqTzwF|^BL{cxYog|G|p{Yh4H?kO#aVC4v#WX73;SM8zZ;P z{kms34c`z{Tu|(9sDwdEMzCSijKS z?}sRF(w+T%)k~_@)&&V2#?-h~R+Hv6PwB=Pi%HD1=x0#2Tk>Rs)|0-+$^o}F>>i7& za%~WqWSgG_5%1Bqygtz;{9F|4IW*G(u9pgLzZMmBLR!Ap(^gJ8%(g$;ynVTb38Y`D?>Gs+L3W=^_DsEJ(XGC+cqwqHgU^&H!3$fm6z(|F?=9W}sXW^G zy(uLl<1pC=y;of;uN6M_LqaUmKlsy!aiWbX^=%wcq~to-85<7 zv!5jO2K)kF#`CkWu`!kybpRjWb~$tGn>VFXJFSiz&UdIsEq0Eae2@RtE zt5+X1yVkx|US*p>fzXZ)=pRG3$)2`ZxsKZ%s%MquX*0RW*Tg2qYfGy3hGO{ zrFYbC{dLIoC4C}cLVQ!+`)ySlhd1g2hwgy*{Eh}@M>|?sS2nHjrS-Q#L{?YHB%fC70 zsIZFqq3advZHEOSF!IcR{lj!oe=j~1Ac zKuMk{SQ=1iwF?!j*}o6s*x>HMyZUWtyLIMqE-!rixV-1T8A`gCd-7a_;|fQtR>=z+ zqA=1&VBk(sXz(%3q*B6K=lGJ|9bWs>Ln{^T3ir0u%``I;<3=amH6Rfg61~!=BN%-< z@?b1JV8g-^wMCFgf?krKGz?x}KAfJO_OKC4KI!sPQ`%QNmHPF%X8-s?%>C*En&!>R z*RZhg*ZG`vJ7cC?z;%$$k4JW8%_}DECc$2XTN2dpeXvom&#Hf4x>$FE24!SZgS5>oaf!W2R3gDg4>M^LxFs3F+M&3{|*#vN6hS?p4_!= z+OyZQXmrdfEfv!8XrUY$J}w0&g!?fTJ)-AD;5L$8-p)a!gy zSl!n!C(F%1vY@?2xdRq0Mc?X8uO@tciSxCTN2O(Do*!=ITZ;drbCCBrmD~FH6Ut$d zN0U01IvO{=J=6E6X*lNwXsN(>czkq#r}FKLDboXrJ*3Kar^xqX>P1iH*u0=o4<*&y z>m&5?$Q2%>JB4_NrWfSbgjQfmvE|;#$sbhua>XFiWKi6LD{%z*f%}+_GhK6v zFU;Uaa7y!Ko;|{W{)Q)F{Pye{8yZ%-G-4vK?+V#HNXq^0Rh}x}rUJ|YOiWDV2v2!? zsGHUWp}xMR5n87fMFbw?EKoP?m@a3J_nN^2e0?i6*HR=z)B9@P>_6T> zi2mep?hju7dbAp0T~O1U%UY&`;}wJat|oVC5e|Nuanq{g{fmcW2xm~Yt5HLFnnhbt zR$@fm7f85gHpQSsj?0Mki1e#Vss;vQAFk`%G*FYMp^%R9My10U@?-X~iQZdh2c%nx z1d#x5YX-rb00GPq*1DW)@F|bYxG?G>J+anz13k-iPn-)os;6yzxS?cvJS>P_Aoo&h{v}SRZ8CG5AOH8-* z^jP>&e}u*mS6AJE*(TDbGp6KOG2n0$5)v*Z9^>UW!NK+c0ojZ^(m-ED z<#73s`Zp2aFIp{SSUJDYnL3@BM-bZy{I6acudKQcuSmwIe-_C*supn==HEOt;W+Si zbi4&rsAJ7N2S=|mQHN){_1=_}kx5^?udihZ$z}tU=)Ze<cuV?iSPfT>Tw}XJr2Aew>KT0dt06orC`raqL;${86d&9m*gr)di4iWuP}UeR09WH70`qxW^bu-TQ+i%X$bRY<5D21G>8mZStjyhM5mIH@ zjsS}AFS$61$=O(R41*%J>Ku7M)^X==qCDia#JRF{k8gtR{}@TdEGWQ7gjImvIG-0H z9Kv(kN*w2(D^KVt$@TU16|Ig!ox-A{yD7u(0v5A}?UVu}2cHLZap{(fx|05pj9XoO zLmrAxlrjMLidhv)eau2jnOl$10UFeDllm5mi;I0aaH2r3+P2LiXKW`>c0ZI z2RKe}1ke#ySNZR89LLEN1)##q;GDZJ<*2IC(q7NSA`lzUz=cq~^b~e5klID|?%~wi zJX_<@@$mt)JoFW(ncX6@qFYu*7`aZ3%7rs_WI!J}o;G zz^R9-E%&V;=mS)G41)j|1J|URsd+$S;NylJcc^{uFVS7If6LndHzxeFR4$6P}>aMT~Af|3|ss(UiwbgqrBfR1t_jiEu9mlsF;ivqcqD71s4Y^iphrIm_ z&KD{vDaqKE=PNxIN*FMdQ3Gr$ObM3{23D0OaGcOV&S|>gIB6-1OG<7&4|rm5Ttd#4 zbiaxK#x;(n<^h&7uHO zdZ2ed!y+sMk}hRvl7F!IXTqO~eT!~C@UF={Ha#b%FfY z9-a>9Jy((d)-#@JF!S>EV+RZ2j-Ub1^F!kt5T9#nFZAga0HByJ*ou8n@J08gK>#2E ziIQK{*7n-(SM{*85`Dlr*(m1|LLlHPwga}b_~u{6ZSOO40t_c+wsvs=fpmqMaWQ7Cn1=EFWf#FS>WpdebtUCz5KY$`JC`MBYpOvDs1tC+vTtq)o$s$)2*OCDa9{46Q!pGz835LS9xNWf2hS&B zCAyg7A3Q1=(KBZSXxRg`Dxlehot^!yTK@bR_}stQ3&YiZe$_3xNzWPs*lQQK3XD-F zM>j~--v=n1l~ysk0hz&DwaZFfg#ZIOM_+Ys3M55GHUJH61l9nY%SQkdFSkn0rT39P z0;hZ^99fwsUjQou#EZfq?X~6eEzp)$0OQ+Q=c)tT+<%^Q#tdI=P?MAG@19$Y1@N7~ zp$f3>?G3=4NUPje3s?<+%IvHGpiR_XL^nO#IcjudJn!W*_t+#`iWj%G0t3Ns0gMTx zKDI)8)eP%(p6dy=e3v-j1Z3gd@!Gy-fG%>G5CEU^IkV&j=lB|=&T~Yo7d%Vu`68qY zv^=YX4Z3E}XSSx4%ma$@X({1J?2b*WjJW~oJ2DsRI&IsbWuk2@`yt-uT&8VkU{7h>4DxBtV8{1FU&og+30!1p#_A_7Z5nr#wr z^%|kpN%pJs=v+9bKh)%*FFR$uVaRRX$D88erK=GK;f$!tDnJjz_0OXOgao#TSx7Qm?D>@UXiv-nXM(z3?5 z%=aIs42nMw*Y67?%}eT+9-OldL3H3>M<_IhZ2Wl#tZA|yfwB@vdgux+T^Y*_I~V3= z7uUZN9@eYJy^20JPvx|*;@4-zdjJllvavP zBLO??si$(rKZwjQ&{j^#)HOs2$Y2D+zg zws8{s93RDiHkIH+_#^Z6`ChP$M^F5&KIm4oARu;t5 j?wtSAnX9}_A~URo-hb0(*9iP02I$d!ZS_hu%dr0f{x4}r literal 0 HcmV?d00001 diff --git a/noVNC/images/screen_57x57.png b/noVNC/images/screen_57x57.png new file mode 100644 index 0000000000000000000000000000000000000000..e2085f29fc2ca0147251b8327d06081670943f0c GIT binary patch literal 1807 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 literal 0 HcmV?d00001 diff --git a/noVNC/images/settings.png b/noVNC/images/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..a43f5e100b3dc9b5aa30812521b036e085b44a39 GIT binary patch literal 2495 zcmZWq2{ap67mm@f1(k}e3~4G-RY|Rth{RgU#IA}GOAR0Knplb(*-?ZwKD}lgz1@N<{mC zgt7iq{!H2pO9THaZ)1wiuP9-HDzwN87W5^b67wj}f|6FgVcZV{$DmL``DtHF2@-Q8d zh$%I5K+clPszf)Il|p}A@vJD$n9C{WNhDL*ayESt3FAtrNO}?%Fwlnclx;Su=g?hr zKNRRh8TTkZ0;x3fJ~1eF7Rl@^SJfjh1?8tcPLH$#DO@0bJe%9UxMr7LaZkHdTg!Fz z!=hd0p?QtY^^Kp;t~EBlA4$6<_(2C-q&j%TaJPALJtSc^JbiioiDL4=+J$tq^T^0d z&x7O7JDB!3ehcH66a~_W$uwh8Z#J=`!hU^z>uFf@9NwVdygn1Vh1Wlc3n9Y%=mI8(BcN1nS zEePZnwlVha!*sbf9kX`AfW4X-pJ2ZnaS?4STPA!y87N{KE7P9U`tFa{{2(ZQ#% zrMZqhT???c__y<<`qqSX<1X2)n;Ir=oEBy4y9ub3Kka~U0cOlRciJ8KUNE=mmB-X} zgHSml%67OZC-EzY}Wq@|xUU!dVO-_)Phm|uA*BXtD6VUSWHDOXk5 zQW@ner1m7A7+_V+um$kLs5V)vKi*mbT?0nMJyMTPE%iBn(^gG{mMu!i619A6F^s6t zPhI4%bsY5IQanRZt0(Dm@?W3NBhH)?Ajm!I3q{D}X@$)QS40p_%}b3aVRGxD)AUD( zVd1yP(_7%tX$G?7L{c#~*8WCV*!-$w%g7#4cprIH!m5EeBsC=|^yfPO=u z_x*z~5(@bSVO%tTx>(ymOlTowh&DnSaTnlwsRxA~|A*v%Jf`GOVhDxKpwNOK2fW@s zv@nJN6naqT`}#*GiTJ$^JuD>fTNM%!Ne(1a$w7=zqy|C*`JH?}7egYVL&JOm$VA3B z-QVfHHDK)Rhx}I?9Ukd+e|66pwf2;@w`F)mHky)IW5dd(g$I{fu$wG|d ze9__p6WkgfAMeb09B}J?dhyshtD+}vXUM0e9zf;!?ae{B&)zxhEoBoisbXBO1aw(x zl*GMvTX_S=d^jd{A8$~k#v&fHc)T}DPR%wg=#JtcHbZEq@Y^?@@9p%W_V&W>U55SA z#A#Rvpi(2J=jXq??(U9%IX+GZHZp4a`f@ara5j$gw!dF0pk})#DJiKmI5@b4Kp+Tb zHLG3D^a=}Ghle!m6jxNx<31D>7Mg8;{_I{@os%Q~;p4}WS=N*H0|OrXi@AW<*QQRYsojc=jg3?QgV&x94`)Xbi3K4M5j#eB{HqJOxw)QjW#!*4*0??F^CwA5 zON(A=-u=D2yxa|k!%Oz#1|QV&Q{*^0IE>%4P(BuDGkIG$vn{WW0DGDD z<(w>>;B_?i2aDQK-)hxZ?e@O&qA!N7L-o4)I!+on&f4Jd#cw+6GOfspzWpOk>Z9$l z4Vjsl>&IS4eC5r~dUSVpZym9x&(8QO$;oXAq8jR2TlYi_m@x`CnPjPYm4_uIRyNkw zkqS~$VX;m4%$ml=#_HPI4M6oA2(#IBx3Q?t-+^u>4Fa{rYkGKiRNon7Zf|enF@31) ziXp0(*W|-cO^Q22aAR(c0_=*Dvf`KxX@N7Qg9lj>L+#T%psklIsw{7K)eV@tgTFql zxu=^-@3?*YwymG9Z_?w!wqW7H^7(}Y#?&}CSqeWTk!e+!n3A%={jh}-I`?*e+7rea z_@vQ>1{5wu<)|8u$8*jYr+HOnFMRqG6{ivzb7&%ZW%Si6yuIYrJ;9^(;gOM%A;G~K z>YAEW5=`n}D@&(yMPV@5-rSV?^e+)&ChVLX{WlR40s;bOO|1CqGcz(6bp-{)=OEB! zTiae>{#7Qwgq7X?J9Kh%T$Q7vqHSAFz{OQ`JcOcKRDYZCFw}&Ux3om%I>yw`#|z|n zUlKHYQJnLb55uSVnr?6NtOE5cX-q_q{|&zGO$v7#sNWPVA1%QlSze#%Y5)KL literal 0 HcmV?d00001 diff --git a/noVNC/images/showextrakeys.png b/noVNC/images/showextrakeys.png new file mode 100644 index 0000000000000000000000000000000000000000..ad8e0a70d3eb7b5f4462f808ab987053fa4b0e56 GIT binary patch literal 735 zcmV<50wDc~P)P000>X1^@s6#OZ}&00006VoOIv0RI60 z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru-3J*792=g7&T0Sv0&Gb{ zK~zY`y;U)56hRdJ-ppi!CtQjM#~p&_LBP(=X7C5tSO^h>^eIGa36M2V8-Xh|B|c z0YCsW^8Y^p1OTrA>=4nxq$KMA7Do8L0eDPA`$bOYTou6Q5WwB?-B01PwB;o+fp z@6A9JPGh|HW^;3MYIb&(lu~2>JOprWOfs+X(zO7*G{&IWY)S}WI)qTwS_1&I)`+60 zs=k~97!Nf5{J2{SKSYZsk! zq|T{@Q;fA%^7^l4S+>${x24zX0RVcv9@_1;WLdVNwO;Mx$$S4qYyEJ{)3QZGpGKVQ zol@%Q+}s@P?d=IOf3Vg*D|!~HBfiQIZhFw~y}v0UHRs&Y_V#w_oLlObbksbl7bJR= zW!a-Biry2^oe}TWL6&6?c6WEL1K79Lh9b~<$*uY=B349xlweX3xmDIsHAW{M0OxBN zM#hm`x?LGbnNFs>_XJ?74D&DZq%~Aq4WMI;iJAF}QtEy|Z#01TB4*CS_6MPNtqWrX RMSuVR002ovPDHLkV1j-yMWX-! literal 0 HcmV?d00001 diff --git a/noVNC/images/tab.png b/noVNC/images/tab.png new file mode 100644 index 0000000000000000000000000000000000000000..84134872a881a627f745a432a3c951254cda26cb GIT binary patch literal 387 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAIY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)y9AGr(VqkNfCexMc)B=-cpQH_#nA7tgMe!?hZ5_{ zMsAl!Od$nK=NL4coJ!_2I4fwan^WPez236Q zxV~)Pmbreb!~RE$eG$IAmU)pz*R|Ls(Q=zi{&XKq&Aq}nY2Dc~42<~)YG*C`o4+Gi zfzhrp-BY~xz4ptrjS(^y&#NZ29sIEF7IV+@&p+#?rS3j(MVx!X=$#3b5uMxna)02 zw(86+ea1O6Bj-JL&z$wG@ph=1;^e&(PHLnW`jei;9RARTq fhprAg`;}G9rs2;o<>%Ld!NuU|>gTe~DWM4f3=5y^ literal 0 HcmV?d00001 diff --git a/noVNC/include/Orbitron700.ttf b/noVNC/include/Orbitron700.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e28729dc56b0662b5d2506ddfde5a368784f5755 GIT binary patch literal 38580 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 YaN=?Mu0Qj~2_>(2Mry;V1-x;lBPyVI3Q(tVP1 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 aYg+X)x}OQee;ks?lK=p?0sn=t1dRYj;d3$o literal 0 HcmV?d00001 diff --git a/noVNC/include/base.css b/noVNC/include/base.css new file mode 100644 index 0000000..e2c9a96 --- /dev/null +++ b/noVNC/include/base.css @@ -0,0 +1,512 @@ +/* + * noVNC base CSS + * Copyright (C) 2012 Joel Martin + * Copyright (C) 2013 Samuel Mannehed for Cendio AB + * noVNC is licensed under the MPL 2.0 (see LICENSE.txt) + * This file is licensed under the 2-Clause BSD license (see LICENSE.txt). + */ + +body { + margin:0; + padding:0; + font-family: Helvetica; + /*Background image with light grey curve.*/ + background-color:#494949; + background-repeat:no-repeat; + background-position:right bottom; + height:100%; +} + +html { + height:100%; +} + +#noVNC_controls ul { + list-style: none; + margin: 0px; + padding: 0px; +} +#noVNC_controls li { + padding-bottom:8px; +} + +#noVNC_host { + width:150px; +} +#noVNC_port { + width: 80px; +} +#noVNC_password { + width: 150px; +} +#noVNC_encrypt { +} +#noVNC_path { + width: 100px; +} +#noVNC_connect_button { + width: 110px; + float:right; +} + +#noVNC_buttons { + white-space: nowrap; +} + +#noVNC_view_drag_button { + display: none; +} +#sendCtrlAltDelButton { + display: none; +} +#noVNC_xvp_buttons { + display: none; +} +#noVNC_mobile_buttons { + display: none; +} + +#noVNC_extra_keys { + display: inline; + list-style-type: none; + padding: 0px; + margin: 0px; + position: relative; +} + +.noVNC-buttons-left { + float: left; + z-index: 1; + position: relative; +} + +.noVNC-buttons-right { + float:right; + right: 0px; + z-index: 2; + position: absolute; +} + +#noVNC_status { + font-size: 12px; + padding-top: 4px; + height:32px; + text-align: center; + font-weight: bold; + color: #fff; +} + +#noVNC_settings_menu { + margin: 3px; + text-align: left; +} +#noVNC_settings_menu ul { + list-style: none; + margin: 0px; + padding: 0px; +} + +#noVNC_apply { + float:right; +} + +/* Do not set width/height for VNC_screen or VNC_canvas or incorrect + * scaling will occur. Canvas resizes to remote VNC settings */ +#noVNC_screen_pad { + margin: 0px; + padding: 0px; + height: 36px; +} +#noVNC_screen { + text-align: center; + display: table; + width:100%; + height:100%; + background-color:#313131; + border-bottom-right-radius: 800px 600px; + /*border-top-left-radius: 800px 600px;*/ +} + +#noVNC_container, #noVNC_canvas { + margin: 0px; + padding: 0px; +} + +#noVNC_canvas { + left: 0px; +} + +#VNC_clipboard_clear_button { + float:right; +} +#VNC_clipboard_text { + font-size: 11px; +} + +#noVNC_clipboard_clear_button { + float:right; +} + +/*Bubble contents divs*/ +#noVNC_settings { + display:none; + margin-top:73px; + right:20px; + position:fixed; +} + +#noVNC_controls { + display:none; + margin-top:73px; + right:12px; + position:fixed; +} +#noVNC_controls.top:after { + right:15px; +} + +#noVNC_description { + display:none; + position:fixed; + + margin-top:73px; + right:20px; + left:20px; + padding:15px; + color:#000; + background:#eee; /* default background for browsers without gradient support */ + + border:2px solid #E0E0E0; + -webkit-border-radius:10px; + -moz-border-radius:10px; + border-radius:10px; +} + +#noVNC_popup_status_panel { + display:none; + position: fixed; + z-index: 1; + + margin:15px; + margin-top:60px; + padding:15px; + width:auto; + + text-align:center; + font-weight:bold; + word-wrap:break-word; + color:#fff; + background:rgba(0,0,0,0.65); + + -webkit-border-radius:10px; + -moz-border-radius:10px; + border-radius:10px; +} + +#noVNC_xvp { + display:none; + margin-top:73px; + right:30px; + position:fixed; +} +#noVNC_xvp.top:after { + right:125px; +} + +#noVNC_clipboard { + display:none; + margin-top:73px; + right:30px; + position:fixed; +} +#noVNC_clipboard.top:after { + right:85px; +} + +#keyboardinput { + width:1px; + height:1px; + background-color:#fff; + color:#fff; + border:0; + position: relative; + left: -40px; + z-index: -1; +} + +/* + * Advanced Styling + */ + +.noVNC_status_normal { + background: #b2bdcd; /* Old browsers */ + background: -moz-linear-gradient(top, #b2bdcd 0%, #899cb3 49%, #7e93af 51%, #6e84a3 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#b2bdcd), color-stop(49%,#899cb3), color-stop(51%,#7e93af), color-stop(100%,#6e84a3)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #b2bdcd 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #b2bdcd 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, #b2bdcd 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* IE10+ */ + background: linear-gradient(top, #b2bdcd 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* W3C */ +} +.noVNC_status_error { + background: #f04040; /* Old browsers */ + background: -moz-linear-gradient(top, #f04040 0%, #899cb3 49%, #7e93af 51%, #6e84a3 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f04040), color-stop(49%,#899cb3), color-stop(51%,#7e93af), color-stop(100%,#6e84a3)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #f04040 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #f04040 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, #f04040 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* IE10+ */ + background: linear-gradient(top, #f04040 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* W3C */ +} +.noVNC_status_warn { + background: #f0f040; /* Old browsers */ + background: -moz-linear-gradient(top, #f0f040 0%, #899cb3 49%, #7e93af 51%, #6e84a3 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f0f040), color-stop(49%,#899cb3), color-stop(51%,#7e93af), color-stop(100%,#6e84a3)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #f0f040 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #f0f040 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, #f0f040 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* IE10+ */ + background: linear-gradient(top, #f0f040 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* W3C */ +} + +/* Control bar */ +#noVNC-control-bar { + position:fixed; + + display:block; + height:36px; + left:0; + top:0; + width:100%; + z-index:200; +} + +.noVNC_status_button { + padding: 4px 4px; + vertical-align: middle; + border:1px solid #869dbc; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + background: #b2bdcd; /* Old browsers */ + background: -moz-linear-gradient(top, #b2bdcd 0%, #899cb3 49%, #7e93af 51%, #6e84a3 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#b2bdcd), color-stop(49%,#899cb3), color-stop(51%,#7e93af), color-stop(100%,#6e84a3)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #b2bdcd 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #b2bdcd 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, #b2bdcd 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* IE10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#b2bdcd', endColorstr='#6e84a3',GradientType=0 ); /* IE6-9 */ + background: linear-gradient(top, #b2bdcd 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* W3C */ + /*box-shadow:inset 0.4px 0.4px 0.4px #000000;*/ +} + +.noVNC_status_button_selected { + padding: 4px 4px; + vertical-align: middle; + border:1px solid #4366a9; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + background: #779ced; /* Old browsers */ + background: -moz-linear-gradient(top, #779ced 0%, #3970e0 49%, #2160dd 51%, #2463df 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#779ced), color-stop(49%,#3970e0), color-stop(51%,#2160dd), color-stop(100%,#2463df)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #779ced 0%,#3970e0 49%,#2160dd 51%,#2463df 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #779ced 0%,#3970e0 49%,#2160dd 51%,#2463df 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, #779ced 0%,#3970e0 49%,#2160dd 51%,#2463df 100%); /* IE10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#779ced', endColorstr='#2463df',GradientType=0 ); /* IE6-9 */ + background: linear-gradient(top, #779ced 0%,#3970e0 49%,#2160dd 51%,#2463df 100%); /* W3C */ + /*box-shadow:inset 0.4px 0.4px 0.4px #000000;*/ +} + + +/*Settings Bubble*/ +.triangle-right { + position:relative; + padding:15px; + margin:1em 0 3em; + color:#fff; + background:#fff; /* default background for browsers without gradient support */ + /* css3 */ + /*background:-webkit-gradient(linear, 0 0, 0 100%, from(#2e88c4), to(#075698)); + background:-moz-linear-gradient(#2e88c4, #075698); + background:-o-linear-gradient(#2e88c4, #075698); + background:linear-gradient(#2e88c4, #075698);*/ + -webkit-border-radius:10px; + -moz-border-radius:10px; + border-radius:10px; + color:#000; + border:2px solid #E0E0E0; +} + +.triangle-right.top:after { + border-color: transparent #E0E0E0; + border-width: 20px 20px 0 0; + bottom: auto; + left: auto; + right: 50px; + top: -20px; +} + +.triangle-right:after { + content:""; + position:absolute; + bottom:-20px; /* value = - border-top-width - border-bottom-width */ + left:50px; /* controls horizontal position */ + border-width:20px 0 0 20px; /* vary these values to change the angle of the vertex */ + border-style:solid; + border-color:#E0E0E0 transparent; + /* reduce the damage in FF3.0 */ + display:block; + width:0; +} + +.triangle-right.top:after { + top:-40px; /* value = - border-top-width - border-bottom-width */ + right:50px; /* controls horizontal position */ + bottom:auto; + left:auto; + border-width:40px 40px 0 0; /* vary these values to change the angle of the vertex */ + border-color:transparent #E0E0E0; +} + +/*Default noVNC logo.*/ +/* From: http://fonts.googleapis.com/css?family=Orbitron:700 */ +@font-face { + font-family: 'Orbitron'; + font-style: normal; + font-weight: 700; + src: local('?'), url('Orbitron700.woff') format('woff'), + url('Orbitron700.ttf') format('truetype'); +} + +#noVNC_logo { + margin-top: 170px; + margin-left: 10px; + color:yellow; + text-align:left; + font-family: 'Orbitron', 'OrbitronTTF', sans-serif; + line-height:90%; + text-shadow: + 5px 5px 0 #000, + -1px -1px 0 #000, + 1px -1px 0 #000, + -1px 1px 0 #000, + 1px 1px 0 #000; +} + + +#noVNC_logo span{ + color:green; +} + +/* ---------------------------------------- + * Media sizing + * ---------------------------------------- + */ + + +.noVNC_status_button { + font-size: 12px; +} + +#noVNC_clipboard_text { + width: 500px; +} + +#noVNC_logo { + font-size: 180px; +} + +.noVNC-buttons-left { + padding-left: 10px; +} + +.noVNC-buttons-right { + padding-right: 10px; +} + +#noVNC_status { + z-index: 0; + position: absolute; + width: 100%; + margin-left: 0px; +} + +#showExtraKeysButton { display: none; } +#toggleCtrlButton { display: inline; } +#toggleAltButton { display: inline; } +#sendTabButton { display: inline; } +#sendEscButton { display: inline; } + +/* left-align the status text on lower resolutions */ +@media screen and (max-width: 800px){ + #noVNC_status { + z-index: 1; + position: relative; + width: auto; + float: left; + margin-left: 4px; + } +} + +@media screen and (max-width: 640px){ + #noVNC_clipboard_text { + width: 410px; + } + #noVNC_logo { + font-size: 150px; + } + .noVNC_status_button { + font-size: 10px; + } + .noVNC-buttons-left { + padding-left: 0px; + } + .noVNC-buttons-right { + padding-right: 0px; + } + /* collapse the extra keys on lower resolutions */ + #showExtraKeysButton { + display: inline; + } + #toggleCtrlButton { + display: none; + position: absolute; + top: 30px; + left: 0px; + } + #toggleAltButton { + display: none; + position: absolute; + top: 65px; + left: 0px; + } + #sendTabButton { + display: none; + position: absolute; + top: 100px; + left: 0px; + } + #sendEscButton { + display: none; + position: absolute; + top: 135px; + left: 0px; + } +} + +@media screen and (min-width: 321px) and (max-width: 480px) { + #noVNC_clipboard_text { + width: 250px; + } + #noVNC_logo { + font-size: 110px; + } +} + +@media screen and (max-width: 320px) { + .noVNC_status_button { + font-size: 9px; + } + #noVNC_clipboard_text { + width: 220px; + } + #noVNC_logo { + font-size: 90px; + } +} diff --git a/noVNC/include/base64.js b/noVNC/include/base64.js new file mode 100644 index 0000000..5a6890a --- /dev/null +++ b/noVNC/include/base64.js @@ -0,0 +1,115 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// From: http://hg.mozilla.org/mozilla-central/raw-file/ec10630b1a54/js/src/devtools/jint/sunspider/string-base64.js + +/*jslint white: false, bitwise: false, plusplus: false */ +/*global console */ + +var Base64 = { + +/* Convert data (an array of integers) to a Base64 string. */ +toBase64Table : 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.split(''), +base64Pad : '=', + +encode: function (data) { + "use strict"; + var result = ''; + var toBase64Table = Base64.toBase64Table; + var length = data.length + var lengthpad = (length%3); + var i = 0, j = 0; + // Convert every three bytes to 4 ascii characters. + /* BEGIN LOOP */ + for (i = 0; i < (length - 2); i += 3) { + result += toBase64Table[data[i] >> 2]; + result += toBase64Table[((data[i] & 0x03) << 4) + (data[i+1] >> 4)]; + result += toBase64Table[((data[i+1] & 0x0f) << 2) + (data[i+2] >> 6)]; + result += toBase64Table[data[i+2] & 0x3f]; + } + /* END LOOP */ + + // Convert the remaining 1 or 2 bytes, pad out to 4 characters. + if (lengthpad === 2) { + j = length - lengthpad; + result += toBase64Table[data[j] >> 2]; + result += toBase64Table[((data[j] & 0x03) << 4) + (data[j+1] >> 4)]; + result += toBase64Table[(data[j+1] & 0x0f) << 2]; + result += toBase64Table[64]; + } else if (lengthpad === 1) { + j = length - lengthpad; + result += toBase64Table[data[j] >> 2]; + result += toBase64Table[(data[j] & 0x03) << 4]; + result += toBase64Table[64]; + result += toBase64Table[64]; + } + + return result; +}, + +/* Convert Base64 data to a string */ +toBinaryTable : [ + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63, + 52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1, 0,-1,-1, + -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14, + 15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1, + -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40, + 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1 +], + +decode: function (data, offset) { + "use strict"; + offset = typeof(offset) !== 'undefined' ? offset : 0; + var toBinaryTable = Base64.toBinaryTable; + var base64Pad = Base64.base64Pad; + var result, result_length, idx, i, c, padding; + var leftbits = 0; // number of bits decoded, but yet to be appended + var leftdata = 0; // bits decoded, but yet to be appended + var data_length = data.indexOf('=') - offset; + + if (data_length < 0) { data_length = data.length - offset; } + + /* Every four characters is 3 resulting numbers */ + result_length = (data_length >> 2) * 3 + Math.floor((data_length%4)/1.5); + result = new Array(result_length); + + // Convert one by one. + /* BEGIN LOOP */ + for (idx = 0, i = offset; i < data.length; i++) { + c = toBinaryTable[data.charCodeAt(i) & 0x7f]; + padding = (data.charAt(i) === base64Pad); + // Skip illegal characters and whitespace + if (c === -1) { + console.error("Illegal character code " + data.charCodeAt(i) + " at position " + i); + continue; + } + + // Collect data into leftdata, update bitcount + leftdata = (leftdata << 6) | c; + leftbits += 6; + + // If we have 8 or more bits, append 8 bits to the result + if (leftbits >= 8) { + leftbits -= 8; + // Append if not padding. + if (!padding) { + result[idx++] = (leftdata >> leftbits) & 0xff; + } + leftdata &= (1 << leftbits) - 1; + } + } + /* END LOOP */ + + // If there are any bits left, the base64 string was corrupted + if (leftbits) { + throw {name: 'Base64-Error', + message: 'Corrupted base64 string'}; + } + + return result; +} + +}; /* End of Base64 namespace */ diff --git a/noVNC/include/black.css b/noVNC/include/black.css new file mode 100644 index 0000000..7d940c5 --- /dev/null +++ b/noVNC/include/black.css @@ -0,0 +1,71 @@ +/* + * noVNC black CSS + * Copyright (C) 2012 Joel Martin + * Copyright (C) 2013 Samuel Mannehed for Cendio AB + * noVNC is licensed under the MPL 2.0 (see LICENSE.txt) + * This file is licensed under the 2-Clause BSD license (see LICENSE.txt). + */ + +#keyboardinput { + background-color:#000; +} + +.noVNC_status_normal { + background: #4c4c4c; /* Old browsers */ + background: -moz-linear-gradient(top, #4c4c4c 0%, #2c2c2c 50%, #000000 51%, #131313 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#4c4c4c), color-stop(50%,#2c2c2c), color-stop(51%,#000000), color-stop(100%,#131313)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #4c4c4c 0%,#2c2c2c 50%,#000000 51%,#131313 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #4c4c4c 0%,#2c2c2c 50%,#000000 51%,#131313 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, #4c4c4c 0%,#2c2c2c 50%,#000000 51%,#131313 100%); /* IE10+ */ + background: linear-gradient(top, #4c4c4c 0%,#2c2c2c 50%,#000000 51%,#131313 100%); /* W3C */ +} +.noVNC_status_error { + background: #f04040; /* Old browsers */ + background: -moz-linear-gradient(top, #f04040 0%, #2c2c2c 50%, #000000 51%, #131313 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f04040), color-stop(50%,#2c2c2c), color-stop(51%,#000000), color-stop(100%,#131313)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #f04040 0%,#2c2c2c 50%,#000000 51%,#131313 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #f04040 0%,#2c2c2c 50%,#000000 51%,#131313 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, #f04040 0%,#2c2c2c 50%,#000000 51%,#131313 100%); /* IE10+ */ + background: linear-gradient(top, #f04040 0%,#2c2c2c 50%,#000000 51%,#131313 100%); /* W3C */ +} +.noVNC_status_warn { + background: #f0f040; /* Old browsers */ + background: -moz-linear-gradient(top, #f0f040 0%, #2c2c2c 50%, #000000 51%, #131313 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f0f040), color-stop(50%,#2c2c2c), color-stop(51%,#000000), color-stop(100%,#131313)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #f0f040 0%,#2c2c2c 50%,#000000 51%,#131313 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #f0f040 0%,#2c2c2c 50%,#000000 51%,#131313 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, #f0f040 0%,#2c2c2c 50%,#000000 51%,#131313 100%); /* IE10+ */ + background: linear-gradient(top, #f0f040 0%,#2c2c2c 50%,#000000 51%,#131313 100%); /* W3C */ +} + +.triangle-right { + border:2px solid #fff; + background:#000; + color:#fff; +} + +.noVNC_status_button { + font-size: 12px; + vertical-align: middle; + border:1px solid #4c4c4c; + + background: #4c4c4c; /* Old browsers */ + background: -moz-linear-gradient(top, #4c4c4c 0%, #2c2c2c 50%, #000000 51%, #131313 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#4c4c4c), color-stop(50%,#2c2c2c), color-stop(51%,#000000), color-stop(100%,#131313)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #4c4c4c 0%,#2c2c2c 50%,#000000 51%,#131313 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #4c4c4c 0%,#2c2c2c 50%,#000000 51%,#131313 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, #4c4c4c 0%,#2c2c2c 50%,#000000 51%,#131313 100%); /* IE10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#4c4c4c', endColorstr='#131313',GradientType=0 ); /* IE6-9 */ + background: linear-gradient(top, #4c4c4c 0%,#2c2c2c 50%,#000000 51%,#131313 100%); /* W3C */ +} + +.noVNC_status_button_selected { + background: #9dd53a; /* Old browsers */ + background: -moz-linear-gradient(top, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#9dd53a), color-stop(50%,#a1d54f), color-stop(51%,#80c217), color-stop(100%,#7cbc0a)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #9dd53a 0%,#a1d54f 50%,#80c217 51%,#7cbc0a 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #9dd53a 0%,#a1d54f 50%,#80c217 51%,#7cbc0a 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, #9dd53a 0%,#a1d54f 50%,#80c217 51%,#7cbc0a 100%); /* IE10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#9dd53a', endColorstr='#7cbc0a',GradientType=0 ); /* IE6-9 */ + background: linear-gradient(top, #9dd53a 0%,#a1d54f 50%,#80c217 51%,#7cbc0a 100%); /* W3C */ +} diff --git a/noVNC/include/blue.css b/noVNC/include/blue.css new file mode 100644 index 0000000..b2a0adc --- /dev/null +++ b/noVNC/include/blue.css @@ -0,0 +1,64 @@ +/* + * noVNC blue CSS + * Copyright (C) 2012 Joel Martin + * Copyright (C) 2013 Samuel Mannehed for Cendio AB + * noVNC is licensed under the MPL 2.0 (see LICENSE.txt) + * This file is licensed under the 2-Clause BSD license (see LICENSE.txt). + */ + +.noVNC_status_normal { + background-color:#04073d; + background-image: -webkit-gradient( + linear, + left bottom, + left top, + color-stop(0.54, rgb(10,15,79)), + color-stop(0.5, rgb(4,7,61)) + ); + background-image: -moz-linear-gradient( + center bottom, + rgb(10,15,79) 54%, + rgb(4,7,61) 50% + ); +} +.noVNC_status_error { + background-color:#f04040; + background-image: -webkit-gradient( + linear, + left bottom, + left top, + color-stop(0.54, rgb(240,64,64)), + color-stop(0.5, rgb(4,7,61)) + ); + background-image: -moz-linear-gradient( + center bottom, + rgb(4,7,61) 54%, + rgb(249,64,64) 50% + ); +} +.noVNC_status_warn { + background-color:#f0f040; + background-image: -webkit-gradient( + linear, + left bottom, + left top, + color-stop(0.54, rgb(240,240,64)), + color-stop(0.5, rgb(4,7,61)) + ); + background-image: -moz-linear-gradient( + center bottom, + rgb(4,7,61) 54%, + rgb(240,240,64) 50% + ); +} + +.triangle-right { + border:2px solid #fff; + background:#04073d; + color:#fff; +} + +#keyboardinput { + background-color:#04073d; +} + diff --git a/noVNC/include/chrome-app/tcp-client.js b/noVNC/include/chrome-app/tcp-client.js new file mode 100644 index 0000000..b8c125f --- /dev/null +++ b/noVNC/include/chrome-app/tcp-client.js @@ -0,0 +1,321 @@ +/* +Copyright 2012 Google Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Author: Boris Smus (smus@chromium.org) +*/ + +(function(exports) { + + // Define some local variables here. + var socket = chrome.socket || chrome.experimental.socket; + var dns = chrome.experimental.dns; + + /** + * Creates an instance of the client + * + * @param {String} host The remote host to connect to + * @param {Number} port The port to connect to at the remote host + */ + function TcpClient(host, port, pollInterval) { + this.host = host; + this.port = port; + this.pollInterval = pollInterval || 15; + + // Callback functions. + this.callbacks = { + connect: null, // Called when socket is connected. + disconnect: null, // Called when socket is disconnected. + recvBuffer: null, // Called (as ArrayBuffer) when client receives data from server. + recvString: null, // Called (as string) when client receives data from server. + sent: null // Called when client sends data to server. + }; + + // Socket. + this.socketId = null; + this.isConnected = false; + + log('initialized tcp client'); + } + + /** + * Connects to the TCP socket, and creates an open socket. + * + * @see http://developer.chrome.com/trunk/apps/socket.html#method-create + * @param {Function} callback The function to call on connection + */ + TcpClient.prototype.connect = function(callback) { + // First resolve the hostname to an IP. + dns.resolve(this.host, function(result) { + this.addr = result.address; + socket.create('tcp', {}, this._onCreate.bind(this)); + + // Register connect callback. + this.callbacks.connect = callback; + }.bind(this)); + }; + + /** + * Sends an arraybuffer/view down the wire to the remote side + * + * @see http://developer.chrome.com/trunk/apps/socket.html#method-write + * @param {String} msg The arraybuffer/view to send + * @param {Function} callback The function to call when the message has sent + */ + TcpClient.prototype.sendBuffer = function(buf, callback) { + if (buf.buffer) { + buf = buf.buffer; + } + + /* + // Debug + var bytes = [], u8 = new Uint8Array(buf); + for (var i = 0; i < u8.length; i++) { + bytes.push(u8[i]); + } + log("sending bytes: " + (bytes.join(','))); + */ + + socket.write(this.socketId, buf, this._onWriteComplete.bind(this)); + + // Register sent callback. + this.callbacks.sent = callback; + }; + + /** + * Sends a string down the wire to the remote side + * + * @see http://developer.chrome.com/trunk/apps/socket.html#method-write + * @param {String} msg The string to send + * @param {Function} callback The function to call when the message has sent + */ + TcpClient.prototype.sendString = function(msg, callback) { + /* + // Debug + log("sending string: " + msg); + */ + + this._stringToArrayBuffer(msg, function(arrayBuffer) { + socket.write(this.socketId, arrayBuffer, this._onWriteComplete.bind(this)); + }.bind(this)); + + // Register sent callback. + this.callbacks.sent = callback; + }; + + /** + * Sets the callback for when a message is received + * + * @param {Function} callback The function to call when a message has arrived + * @param {String} type The callback argument type: "arraybuffer" or "string" + */ + TcpClient.prototype.addResponseListener = function(callback, type) { + if (typeof type === "undefined") { + type = "arraybuffer"; + } + // Register received callback. + if (type === "string") { + this.callbacks.recvString = callback; + } else { + this.callbacks.recvBuffer = callback; + } + }; + + /** + * Sets the callback for when the socket disconnects + * + * @param {Function} callback The function to call when the socket disconnects + * @param {String} type The callback argument type: "arraybuffer" or "string" + */ + TcpClient.prototype.addDisconnectListener = function(callback) { + // Register disconnect callback. + this.callbacks.disconnect = callback; + }; + + /** + * Disconnects from the remote side + * + * @see http://developer.chrome.com/trunk/apps/socket.html#method-disconnect + */ + TcpClient.prototype.disconnect = function() { + if (this.isConnected) { + this.isConnected = false; + socket.disconnect(this.socketId); + if (this.callbacks.disconnect) { + this.callbacks.disconnect(); + } + log('socket disconnected'); + } + }; + + /** + * The callback function used for when we attempt to have Chrome + * create a socket. If the socket is successfully created + * we go ahead and connect to the remote side. + * + * @private + * @see http://developer.chrome.com/trunk/apps/socket.html#method-connect + * @param {Object} createInfo The socket details + */ + TcpClient.prototype._onCreate = function(createInfo) { + this.socketId = createInfo.socketId; + if (this.socketId > 0) { + socket.connect(this.socketId, this.addr, this.port, this._onConnectComplete.bind(this)); + } else { + error('Unable to create socket'); + } + }; + + /** + * The callback function used for when we attempt to have Chrome + * connect to the remote side. If a successful connection is + * made then polling starts to check for data to read + * + * @private + * @param {Number} resultCode Indicates whether the connection was successful + */ + TcpClient.prototype._onConnectComplete = function(resultCode) { + // Start polling for reads. + this.isConnected = true; + setTimeout(this._periodicallyRead.bind(this), this.pollInterval); + + if (this.callbacks.connect) { + log('connect complete'); + this.callbacks.connect(); + } + log('onConnectComplete'); + }; + + /** + * Checks for new data to read from the socket + * + * @see http://developer.chrome.com/trunk/apps/socket.html#method-read + */ + TcpClient.prototype._periodicallyRead = function() { + var that = this; + socket.getInfo(this.socketId, function (info) { + if (info.connected) { + setTimeout(that._periodicallyRead.bind(that), that.pollInterval); + socket.read(that.socketId, null, that._onDataRead.bind(that)); + } else if (that.isConnected) { + log('socket disconnect detected'); + that.disconnect(); + } + }); + }; + + /** + * Callback function for when data has been read from the socket. + * Converts the array buffer that is read in to a string + * and sends it on for further processing by passing it to + * the previously assigned callback function. + * + * @private + * @see TcpClient.prototype.addResponseListener + * @param {Object} readInfo The incoming message + */ + TcpClient.prototype._onDataRead = function(readInfo) { + // Call received callback if there's data in the response. + if (readInfo.resultCode > 0) { + log('onDataRead'); + + /* + // Debug + var bytes = [], u8 = new Uint8Array(readInfo.data); + for (var i = 0; i < u8.length; i++) { + bytes.push(u8[i]); + } + log("received bytes: " + (bytes.join(','))); + */ + + if (this.callbacks.recvBuffer) { + // Return raw ArrayBuffer directly. + this.callbacks.recvBuffer(readInfo.data); + } + if (this.callbacks.recvString) { + // Convert ArrayBuffer to string. + this._arrayBufferToString(readInfo.data, function(str) { + this.callbacks.recvString(str); + }.bind(this)); + } + + // Trigger another read right away + setTimeout(this._periodicallyRead.bind(this), 0); + } + }; + + /** + * Callback for when data has been successfully + * written to the socket. + * + * @private + * @param {Object} writeInfo The outgoing message + */ + TcpClient.prototype._onWriteComplete = function(writeInfo) { + log('onWriteComplete'); + // Call sent callback. + if (this.callbacks.sent) { + this.callbacks.sent(writeInfo); + } + }; + + /** + * Converts an array buffer to a string + * + * @private + * @param {ArrayBuffer} buf The buffer to convert + * @param {Function} callback The function to call when conversion is complete + */ + TcpClient.prototype._arrayBufferToString = function(buf, callback) { + var bb = new Blob([new Uint8Array(buf)]); + var f = new FileReader(); + f.onload = function(e) { + callback(e.target.result); + }; + f.readAsText(bb); + }; + + /** + * Converts a string to an array buffer + * + * @private + * @param {String} str The string to convert + * @param {Function} callback The function to call when conversion is complete + */ + TcpClient.prototype._stringToArrayBuffer = function(str, callback) { + var bb = new Blob([str]); + var f = new FileReader(); + f.onload = function(e) { + callback(e.target.result); + }; + f.readAsArrayBuffer(bb); + }; + + /** + * Wrapper function for logging + */ + function log(msg) { + console.log(msg); + } + + /** + * Wrapper function for error logging + */ + function error(msg) { + console.error(msg); + } + + exports.TcpClient = TcpClient; + +})(window); diff --git a/noVNC/include/des.js b/noVNC/include/des.js new file mode 100644 index 0000000..1f95285 --- /dev/null +++ b/noVNC/include/des.js @@ -0,0 +1,273 @@ +/* + * Ported from Flashlight VNC ActionScript implementation: + * http://www.wizhelp.com/flashlight-vnc/ + * + * Full attribution follows: + * + * ------------------------------------------------------------------------- + * + * This DES class has been extracted from package Acme.Crypto for use in VNC. + * The unnecessary odd parity code has been removed. + * + * These changes are: + * Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. + * + * This software 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. + * + + * DesCipher - the DES encryption method + * + * The meat of this code is by Dave Zimmerman , and is: + * + * Copyright (c) 1996 Widget Workshop, Inc. All Rights Reserved. + * + * Permission to use, copy, modify, and distribute this software + * and its documentation for NON-COMMERCIAL or COMMERCIAL purposes and + * without fee is hereby granted, provided that this copyright notice is kept + * intact. + * + * WIDGET WORKSHOP MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY + * OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED + * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. WIDGET WORKSHOP SHALL NOT BE LIABLE + * FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. + * + * THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE + * CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE + * PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT + * NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE + * SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE + * SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE + * PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES"). WIDGET WORKSHOP + * SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR + * HIGH RISK ACTIVITIES. + * + * + * The rest is: + * + * Copyright (C) 1996 by Jef Poskanzer . All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Visit the ACME Labs Java page for up-to-date versions of this and other + * fine Java utilities: http://www.acme.com/java/ + */ + +"use strict"; +/*jslint white: false, bitwise: false, plusplus: false */ + +function DES(passwd) { + +// Tables, permutations, S-boxes, etc. +var PC2 = [13,16,10,23, 0, 4, 2,27,14, 5,20, 9,22,18,11, 3, + 25, 7,15, 6,26,19,12, 1,40,51,30,36,46,54,29,39, + 50,44,32,47,43,48,38,55,33,52,45,41,49,35,28,31 ], + totrot = [ 1, 2, 4, 6, 8,10,12,14,15,17,19,21,23,25,27,28], + z = 0x0, a,b,c,d,e,f, SP1,SP2,SP3,SP4,SP5,SP6,SP7,SP8, + keys = []; + +a=1<<16; b=1<<24; c=a|b; d=1<<2; e=1<<10; f=d|e; +SP1 = [c|e,z|z,a|z,c|f,c|d,a|f,z|d,a|z,z|e,c|e,c|f,z|e,b|f,c|d,b|z,z|d, + z|f,b|e,b|e,a|e,a|e,c|z,c|z,b|f,a|d,b|d,b|d,a|d,z|z,z|f,a|f,b|z, + a|z,c|f,z|d,c|z,c|e,b|z,b|z,z|e,c|d,a|z,a|e,b|d,z|e,z|d,b|f,a|f, + c|f,a|d,c|z,b|f,b|d,z|f,a|f,c|e,z|f,b|e,b|e,z|z,a|d,a|e,z|z,c|d]; +a=1<<20; b=1<<31; c=a|b; d=1<<5; e=1<<15; f=d|e; +SP2 = [c|f,b|e,z|e,a|f,a|z,z|d,c|d,b|f,b|d,c|f,c|e,b|z,b|e,a|z,z|d,c|d, + a|e,a|d,b|f,z|z,b|z,z|e,a|f,c|z,a|d,b|d,z|z,a|e,z|f,c|e,c|z,z|f, + z|z,a|f,c|d,a|z,b|f,c|z,c|e,z|e,c|z,b|e,z|d,c|f,a|f,z|d,z|e,b|z, + z|f,c|e,a|z,b|d,a|d,b|f,b|d,a|d,a|e,z|z,b|e,z|f,b|z,c|d,c|f,a|e]; +a=1<<17; b=1<<27; c=a|b; d=1<<3; e=1<<9; f=d|e; +SP3 = [z|f,c|e,z|z,c|d,b|e,z|z,a|f,b|e,a|d,b|d,b|d,a|z,c|f,a|d,c|z,z|f, + b|z,z|d,c|e,z|e,a|e,c|z,c|d,a|f,b|f,a|e,a|z,b|f,z|d,c|f,z|e,b|z, + c|e,b|z,a|d,z|f,a|z,c|e,b|e,z|z,z|e,a|d,c|f,b|e,b|d,z|e,z|z,c|d, + b|f,a|z,b|z,c|f,z|d,a|f,a|e,b|d,c|z,b|f,z|f,c|z,a|f,z|d,c|d,a|e]; +a=1<<13; b=1<<23; c=a|b; d=1<<0; e=1<<7; f=d|e; +SP4 = [c|d,a|f,a|f,z|e,c|e,b|f,b|d,a|d,z|z,c|z,c|z,c|f,z|f,z|z,b|e,b|d, + z|d,a|z,b|z,c|d,z|e,b|z,a|d,a|e,b|f,z|d,a|e,b|e,a|z,c|e,c|f,z|f, + b|e,b|d,c|z,c|f,z|f,z|z,z|z,c|z,a|e,b|e,b|f,z|d,c|d,a|f,a|f,z|e, + c|f,z|f,z|d,a|z,b|d,a|d,c|e,b|f,a|d,a|e,b|z,c|d,z|e,b|z,a|z,c|e]; +a=1<<25; b=1<<30; c=a|b; d=1<<8; e=1<<19; f=d|e; +SP5 = [z|d,a|f,a|e,c|d,z|e,z|d,b|z,a|e,b|f,z|e,a|d,b|f,c|d,c|e,z|f,b|z, + a|z,b|e,b|e,z|z,b|d,c|f,c|f,a|d,c|e,b|d,z|z,c|z,a|f,a|z,c|z,z|f, + z|e,c|d,z|d,a|z,b|z,a|e,c|d,b|f,a|d,b|z,c|e,a|f,b|f,z|d,a|z,c|e, + c|f,z|f,c|z,c|f,a|e,z|z,b|e,c|z,z|f,a|d,b|d,z|e,z|z,b|e,a|f,b|d]; +a=1<<22; b=1<<29; c=a|b; d=1<<4; e=1<<14; f=d|e; +SP6 = [b|d,c|z,z|e,c|f,c|z,z|d,c|f,a|z,b|e,a|f,a|z,b|d,a|d,b|e,b|z,z|f, + z|z,a|d,b|f,z|e,a|e,b|f,z|d,c|d,c|d,z|z,a|f,c|e,z|f,a|e,c|e,b|z, + b|e,z|d,c|d,a|e,c|f,a|z,z|f,b|d,a|z,b|e,b|z,z|f,b|d,c|f,a|e,c|z, + a|f,c|e,z|z,c|d,z|d,z|e,c|z,a|f,z|e,a|d,b|f,z|z,c|e,b|z,a|d,b|f]; +a=1<<21; b=1<<26; c=a|b; d=1<<1; e=1<<11; f=d|e; +SP7 = [a|z,c|d,b|f,z|z,z|e,b|f,a|f,c|e,c|f,a|z,z|z,b|d,z|d,b|z,c|d,z|f, + b|e,a|f,a|d,b|e,b|d,c|z,c|e,a|d,c|z,z|e,z|f,c|f,a|e,z|d,b|z,a|e, + b|z,a|e,a|z,b|f,b|f,c|d,c|d,z|d,a|d,b|z,b|e,a|z,c|e,z|f,a|f,c|e, + z|f,b|d,c|f,c|z,a|e,z|z,z|d,c|f,z|z,a|f,c|z,z|e,b|d,b|e,z|e,a|d]; +a=1<<18; b=1<<28; c=a|b; d=1<<6; e=1<<12; f=d|e; +SP8 = [b|f,z|e,a|z,c|f,b|z,b|f,z|d,b|z,a|d,c|z,c|f,a|e,c|e,a|f,z|e,z|d, + c|z,b|d,b|e,z|f,a|e,a|d,c|d,c|e,z|f,z|z,z|z,c|d,b|d,b|e,a|f,a|z, + a|f,a|z,c|e,z|e,z|d,c|d,z|e,a|f,b|e,z|d,b|d,c|z,c|d,b|z,a|z,b|f, + z|z,c|f,a|d,b|d,c|z,b|e,b|f,z|z,c|f,a|e,a|e,z|f,z|f,a|d,b|z,c|e]; + +// Set the key. +function setKeys(keyBlock) { + var i, j, l, m, n, o, pc1m = [], pcr = [], kn = [], + raw0, raw1, rawi, KnLi; + + for (j = 0, l = 56; j < 56; ++j, l-=8) { + l += l<-5 ? 65 : l<-3 ? 31 : l<-1 ? 63 : l===27 ? 35 : 0; // PC1 + m = l & 0x7; + pc1m[j] = ((keyBlock[l >>> 3] & (1<>> 10; + keys[KnLi] |= (raw1 & 0x00000fc0) >>> 6; + ++KnLi; + keys[KnLi] = (raw0 & 0x0003f000) << 12; + keys[KnLi] |= (raw0 & 0x0000003f) << 16; + keys[KnLi] |= (raw1 & 0x0003f000) >>> 4; + keys[KnLi] |= (raw1 & 0x0000003f); + ++KnLi; + } +} + +// Encrypt 8 bytes of text +function enc8(text) { + var i = 0, b = text.slice(), fval, keysi = 0, + l, r, x; // left, right, accumulator + + // Squash 8 bytes to 2 ints + l = b[i++]<<24 | b[i++]<<16 | b[i++]<<8 | b[i++]; + r = b[i++]<<24 | b[i++]<<16 | b[i++]<<8 | b[i++]; + + x = ((l >>> 4) ^ r) & 0x0f0f0f0f; + r ^= x; + l ^= (x << 4); + x = ((l >>> 16) ^ r) & 0x0000ffff; + r ^= x; + l ^= (x << 16); + x = ((r >>> 2) ^ l) & 0x33333333; + l ^= x; + r ^= (x << 2); + x = ((r >>> 8) ^ l) & 0x00ff00ff; + l ^= x; + r ^= (x << 8); + r = (r << 1) | ((r >>> 31) & 1); + x = (l ^ r) & 0xaaaaaaaa; + l ^= x; + r ^= x; + l = (l << 1) | ((l >>> 31) & 1); + + for (i = 0; i < 8; ++i) { + x = (r << 28) | (r >>> 4); + x ^= keys[keysi++]; + fval = SP7[x & 0x3f]; + fval |= SP5[(x >>> 8) & 0x3f]; + fval |= SP3[(x >>> 16) & 0x3f]; + fval |= SP1[(x >>> 24) & 0x3f]; + x = r ^ keys[keysi++]; + fval |= SP8[x & 0x3f]; + fval |= SP6[(x >>> 8) & 0x3f]; + fval |= SP4[(x >>> 16) & 0x3f]; + fval |= SP2[(x >>> 24) & 0x3f]; + l ^= fval; + x = (l << 28) | (l >>> 4); + x ^= keys[keysi++]; + fval = SP7[x & 0x3f]; + fval |= SP5[(x >>> 8) & 0x3f]; + fval |= SP3[(x >>> 16) & 0x3f]; + fval |= SP1[(x >>> 24) & 0x3f]; + x = l ^ keys[keysi++]; + fval |= SP8[x & 0x0000003f]; + fval |= SP6[(x >>> 8) & 0x3f]; + fval |= SP4[(x >>> 16) & 0x3f]; + fval |= SP2[(x >>> 24) & 0x3f]; + r ^= fval; + } + + r = (r << 31) | (r >>> 1); + x = (l ^ r) & 0xaaaaaaaa; + l ^= x; + r ^= x; + l = (l << 31) | (l >>> 1); + x = ((l >>> 8) ^ r) & 0x00ff00ff; + r ^= x; + l ^= (x << 8); + x = ((l >>> 2) ^ r) & 0x33333333; + r ^= x; + l ^= (x << 2); + x = ((r >>> 16) ^ l) & 0x0000ffff; + l ^= x; + r ^= (x << 16); + x = ((r >>> 4) ^ l) & 0x0f0f0f0f; + l ^= x; + r ^= (x << 4); + + // Spread ints to bytes + x = [r, l]; + for (i = 0; i < 8; i++) { + b[i] = (x[i>>>2] >>> (8*(3 - (i%4)))) % 256; + if (b[i] < 0) { b[i] += 256; } // unsigned + } + return b; +} + +// Encrypt 16 bytes of text using passwd as key +function encrypt(t) { + return enc8(t.slice(0,8)).concat(enc8(t.slice(8,16))); +} + +setKeys(passwd); // Setup keys +return {'encrypt': encrypt}; // Public interface + +} // function DES diff --git a/noVNC/include/display.js b/noVNC/include/display.js new file mode 100644 index 0000000..9f2d6b8 --- /dev/null +++ b/noVNC/include/display.js @@ -0,0 +1,770 @@ +/* + * noVNC: HTML5 VNC client + * Copyright (C) 2012 Joel Martin + * Licensed under MPL 2.0 (see LICENSE.txt) + * + * See README.md for usage and integration instructions. + */ + +/*jslint browser: true, white: false, bitwise: false */ +/*global Util, Base64, changeCursor */ + +function Display(defaults) { +"use strict"; + +var that = {}, // Public API methods + conf = {}, // Configuration attributes + + // Private Display namespace variables + c_ctx = null, + c_forceCanvas = false, + + // Queued drawing actions for in-order rendering + renderQ = [], + + // Predefine function variables (jslint) + imageDataGet, rgbImageData, bgrxImageData, cmapImageData, + setFillColor, rescale, scan_renderQ, + + // The full frame buffer (logical canvas) size + fb_width = 0, + fb_height = 0, + // The visible "physical canvas" viewport + viewport = {'x': 0, 'y': 0, 'w' : 0, 'h' : 0 }, + cleanRect = {'x1': 0, 'y1': 0, 'x2': -1, 'y2': -1}, + + c_prevStyle = "", + tile = null, + tile16x16 = null, + tile_x = 0, + tile_y = 0; + + +// Configuration attributes +Util.conf_defaults(conf, that, defaults, [ + ['target', 'wo', 'dom', null, 'Canvas element for rendering'], + ['context', 'ro', 'raw', null, 'Canvas 2D context for rendering (read-only)'], + ['logo', 'rw', 'raw', null, 'Logo to display when cleared: {"width": width, "height": height, "data": data}'], + ['true_color', 'rw', 'bool', true, 'Use true-color pixel data'], + ['colourMap', 'rw', 'arr', [], 'Colour map array (when not true-color)'], + ['scale', 'rw', 'float', 1.0, 'Display area scale factor 0.0 - 1.0'], + ['viewport', 'rw', 'bool', false, 'Use a viewport set with viewportChange()'], + ['width', 'rw', 'int', null, 'Display area width'], + ['height', 'rw', 'int', null, 'Display area height'], + + ['render_mode', 'ro', 'str', '', 'Canvas rendering mode (read-only)'], + + ['prefer_js', 'rw', 'str', null, 'Prefer Javascript over canvas methods'], + ['cursor_uri', 'rw', 'raw', null, 'Can we render cursor using data URI'] + ]); + +// Override some specific getters/setters +that.get_context = function () { return c_ctx; }; + +that.set_scale = function(scale) { rescale(scale); }; + +that.set_width = function (val) { that.resize(val, fb_height); }; +that.get_width = function() { return fb_width; }; + +that.set_height = function (val) { that.resize(fb_width, val); }; +that.get_height = function() { return fb_height; }; + + + +// +// Private functions +// + +// Create the public API interface +function constructor() { + Util.Debug(">> Display.constructor"); + + var c, func, i, curDat, curSave, + has_imageData = false, UE = Util.Engine; + + if (! conf.target) { throw("target must be set"); } + + if (typeof conf.target === 'string') { + throw("target must be a DOM element"); + } + + c = conf.target; + + if (! c.getContext) { throw("no getContext method"); } + + if (! c_ctx) { c_ctx = c.getContext('2d'); } + + Util.Debug("User Agent: " + navigator.userAgent); + if (UE.gecko) { Util.Debug("Browser: gecko " + UE.gecko); } + if (UE.webkit) { Util.Debug("Browser: webkit " + UE.webkit); } + if (UE.trident) { Util.Debug("Browser: trident " + UE.trident); } + if (UE.presto) { Util.Debug("Browser: presto " + UE.presto); } + + that.clear(); + + // Check canvas features + if ('createImageData' in c_ctx) { + conf.render_mode = "canvas rendering"; + } else { + throw("Canvas does not support createImageData"); + } + if (conf.prefer_js === null) { + Util.Info("Prefering javascript operations"); + conf.prefer_js = true; + } + + // Initialize cached tile imageData + tile16x16 = c_ctx.createImageData(16, 16); + + /* + * Determine browser support for setting the cursor via data URI + * scheme + */ + curDat = []; + for (i=0; i < 8 * 8 * 4; i += 1) { + curDat.push(255); + } + try { + curSave = c.style.cursor; + changeCursor(conf.target, curDat, curDat, 2, 2, 8, 8); + if (c.style.cursor) { + if (conf.cursor_uri === null) { + conf.cursor_uri = true; + } + Util.Info("Data URI scheme cursor supported"); + } else { + if (conf.cursor_uri === null) { + conf.cursor_uri = false; + } + Util.Warn("Data URI scheme cursor not supported"); + } + c.style.cursor = curSave; + } catch (exc2) { + Util.Error("Data URI scheme cursor test exception: " + exc2); + conf.cursor_uri = false; + } + + Util.Debug("<< Display.constructor"); + return that ; +} + +rescale = function(factor) { + var c, tp, x, y, + properties = ['transform', 'WebkitTransform', 'MozTransform', null]; + c = conf.target; + tp = properties.shift(); + while (tp) { + if (typeof c.style[tp] !== 'undefined') { + break; + } + tp = properties.shift(); + } + + if (tp === null) { + Util.Debug("No scaling support"); + return; + } + + + if (typeof(factor) === "undefined") { + factor = conf.scale; + } else if (factor > 1.0) { + factor = 1.0; + } else if (factor < 0.1) { + factor = 0.1; + } + + if (conf.scale === factor) { + //Util.Debug("Display already scaled to '" + factor + "'"); + return; + } + + conf.scale = factor; + x = c.width - c.width * factor; + y = c.height - c.height * factor; + c.style[tp] = "scale(" + conf.scale + ") translate(-" + x + "px, -" + y + "px)"; +}; + +setFillColor = function(color) { + var bgr, newStyle; + if (conf.true_color) { + bgr = color; + } else { + bgr = conf.colourMap[color[0]]; + } + newStyle = "rgb(" + bgr[2] + "," + bgr[1] + "," + bgr[0] + ")"; + if (newStyle !== c_prevStyle) { + c_ctx.fillStyle = newStyle; + c_prevStyle = newStyle; + } +}; + + +// +// Public API interface functions +// + +// Shift and/or resize the visible viewport +that.viewportChange = function(deltaX, deltaY, width, height) { + var c = conf.target, v = viewport, cr = cleanRect, + saveImg = null, saveStyle, x1, y1, vx2, vy2, w, h; + + if (!conf.viewport) { + Util.Debug("Setting viewport to full display region"); + deltaX = -v.w; // Clamped later if out of bounds + deltaY = -v.h; // Clamped later if out of bounds + width = fb_width; + height = fb_height; + } + + if (typeof(deltaX) === "undefined") { deltaX = 0; } + if (typeof(deltaY) === "undefined") { deltaY = 0; } + if (typeof(width) === "undefined") { width = v.w; } + if (typeof(height) === "undefined") { height = v.h; } + + // Size change + + if (width > fb_width) { width = fb_width; } + if (height > fb_height) { height = fb_height; } + + if ((v.w !== width) || (v.h !== height)) { + // Change width + if ((width < v.w) && (cr.x2 > v.x + width -1)) { + cr.x2 = v.x + width - 1; + } + v.w = width; + + // Change height + if ((height < v.h) && (cr.y2 > v.y + height -1)) { + cr.y2 = v.y + height - 1; + } + v.h = height; + + + if (v.w > 0 && v.h > 0 && c.width > 0 && c.height > 0) { + saveImg = c_ctx.getImageData(0, 0, + (c.width < v.w) ? c.width : v.w, + (c.height < v.h) ? c.height : v.h); + } + + c.width = v.w; + c.height = v.h; + + if (saveImg) { + c_ctx.putImageData(saveImg, 0, 0); + } + } + + vx2 = v.x + v.w - 1; + vy2 = v.y + v.h - 1; + + + // Position change + + if ((deltaX < 0) && ((v.x + deltaX) < 0)) { + deltaX = - v.x; + } + if ((vx2 + deltaX) >= fb_width) { + deltaX -= ((vx2 + deltaX) - fb_width + 1); + } + + if ((v.y + deltaY) < 0) { + deltaY = - v.y; + } + if ((vy2 + deltaY) >= fb_height) { + deltaY -= ((vy2 + deltaY) - fb_height + 1); + } + + if ((deltaX === 0) && (deltaY === 0)) { + //Util.Debug("skipping viewport change"); + return; + } + Util.Debug("viewportChange deltaX: " + deltaX + ", deltaY: " + deltaY); + + v.x += deltaX; + vx2 += deltaX; + v.y += deltaY; + vy2 += deltaY; + + // Update the clean rectangle + if (v.x > cr.x1) { + cr.x1 = v.x; + } + if (vx2 < cr.x2) { + cr.x2 = vx2; + } + if (v.y > cr.y1) { + cr.y1 = v.y; + } + if (vy2 < cr.y2) { + cr.y2 = vy2; + } + + if (deltaX < 0) { + // Shift viewport left, redraw left section + x1 = 0; + w = - deltaX; + } else { + // Shift viewport right, redraw right section + x1 = v.w - deltaX; + w = deltaX; + } + if (deltaY < 0) { + // Shift viewport up, redraw top section + y1 = 0; + h = - deltaY; + } else { + // Shift viewport down, redraw bottom section + y1 = v.h - deltaY; + h = deltaY; + } + + // Copy the valid part of the viewport to the shifted location + saveStyle = c_ctx.fillStyle; + c_ctx.fillStyle = "rgb(255,255,255)"; + if (deltaX !== 0) { + //that.copyImage(0, 0, -deltaX, 0, v.w, v.h); + //that.fillRect(x1, 0, w, v.h, [255,255,255]); + c_ctx.drawImage(c, 0, 0, v.w, v.h, -deltaX, 0, v.w, v.h); + c_ctx.fillRect(x1, 0, w, v.h); + } + if (deltaY !== 0) { + //that.copyImage(0, 0, 0, -deltaY, v.w, v.h); + //that.fillRect(0, y1, v.w, h, [255,255,255]); + c_ctx.drawImage(c, 0, 0, v.w, v.h, 0, -deltaY, v.w, v.h); + c_ctx.fillRect(0, y1, v.w, h); + } + c_ctx.fillStyle = saveStyle; +}; + + +// Return a map of clean and dirty areas of the viewport and reset the +// tracking of clean and dirty areas. +// +// Returns: {'cleanBox': {'x': x, 'y': y, 'w': w, 'h': h}, +// 'dirtyBoxes': [{'x': x, 'y': y, 'w': w, 'h': h}, ...]} +that.getCleanDirtyReset = function() { + var v = viewport, c = cleanRect, cleanBox, dirtyBoxes = [], + vx2 = v.x + v.w - 1, vy2 = v.y + v.h - 1; + + + // Copy the cleanRect + cleanBox = {'x': c.x1, 'y': c.y1, + 'w': c.x2 - c.x1 + 1, 'h': c.y2 - c.y1 + 1}; + + if ((c.x1 >= c.x2) || (c.y1 >= c.y2)) { + // Whole viewport is dirty + dirtyBoxes.push({'x': v.x, 'y': v.y, 'w': v.w, 'h': v.h}); + } else { + // Redraw dirty regions + if (v.x < c.x1) { + // left side dirty region + dirtyBoxes.push({'x': v.x, 'y': v.y, + 'w': c.x1 - v.x + 1, 'h': v.h}); + } + if (vx2 > c.x2) { + // right side dirty region + dirtyBoxes.push({'x': c.x2 + 1, 'y': v.y, + 'w': vx2 - c.x2, 'h': v.h}); + } + if (v.y < c.y1) { + // top/middle dirty region + dirtyBoxes.push({'x': c.x1, 'y': v.y, + 'w': c.x2 - c.x1 + 1, 'h': c.y1 - v.y}); + } + if (vy2 > c.y2) { + // bottom/middle dirty region + dirtyBoxes.push({'x': c.x1, 'y': c.y2 + 1, + 'w': c.x2 - c.x1 + 1, 'h': vy2 - c.y2}); + } + } + + // Reset the cleanRect to the whole viewport + cleanRect = {'x1': v.x, 'y1': v.y, + 'x2': v.x + v.w - 1, 'y2': v.y + v.h - 1}; + + return {'cleanBox': cleanBox, 'dirtyBoxes': dirtyBoxes}; +}; + +// Translate viewport coordinates to absolute coordinates +that.absX = function(x) { + return x + viewport.x; +}; +that.absY = function(y) { + return y + viewport.y; +}; + + +that.resize = function(width, height) { + c_prevStyle = ""; + + fb_width = width; + fb_height = height; + + rescale(conf.scale); + that.viewportChange(); +}; + +that.clear = function() { + + if (conf.logo) { + that.resize(conf.logo.width, conf.logo.height); + that.blitStringImage(conf.logo.data, 0, 0); + } else { + that.resize(640, 20); + c_ctx.clearRect(0, 0, viewport.w, viewport.h); + } + + renderQ = []; + + // No benefit over default ("source-over") in Chrome and firefox + //c_ctx.globalCompositeOperation = "copy"; +}; + +that.fillRect = function(x, y, width, height, color) { + setFillColor(color); + c_ctx.fillRect(x - viewport.x, y - viewport.y, width, height); +}; + +that.copyImage = function(old_x, old_y, new_x, new_y, w, h) { + var x1 = old_x - viewport.x, y1 = old_y - viewport.y, + x2 = new_x - viewport.x, y2 = new_y - viewport.y; + c_ctx.drawImage(conf.target, x1, y1, w, h, x2, y2, w, h); +}; + + +// Start updating a tile +that.startTile = function(x, y, width, height, color) { + var data, bgr, red, green, blue, i; + tile_x = x; + tile_y = y; + if ((width === 16) && (height === 16)) { + tile = tile16x16; + } else { + tile = c_ctx.createImageData(width, height); + } + data = tile.data; + if (conf.prefer_js) { + if (conf.true_color) { + bgr = color; + } else { + bgr = conf.colourMap[color[0]]; + } + red = bgr[2]; + green = bgr[1]; + blue = bgr[0]; + for (i = 0; i < (width * height * 4); i+=4) { + data[i ] = red; + data[i + 1] = green; + data[i + 2] = blue; + data[i + 3] = 255; + } + } else { + that.fillRect(x, y, width, height, color); + } +}; + +// Update sub-rectangle of the current tile +that.subTile = function(x, y, w, h, color) { + var data, p, bgr, red, green, blue, width, j, i, xend, yend; + if (conf.prefer_js) { + data = tile.data; + width = tile.width; + if (conf.true_color) { + bgr = color; + } else { + bgr = conf.colourMap[color[0]]; + } + red = bgr[2]; + green = bgr[1]; + blue = bgr[0]; + xend = x + w; + yend = y + h; + for (j = y; j < yend; j += 1) { + for (i = x; i < xend; i += 1) { + p = (i + (j * width) ) * 4; + data[p ] = red; + data[p + 1] = green; + data[p + 2] = blue; + data[p + 3] = 255; + } + } + } else { + that.fillRect(tile_x + x, tile_y + y, w, h, color); + } +}; + +// Draw the current tile to the screen +that.finishTile = function() { + if (conf.prefer_js) { + c_ctx.putImageData(tile, tile_x - viewport.x, tile_y - viewport.y); + } + // else: No-op, if not prefer_js then already done by setSubTile +}; + +rgbImageData = function(x, y, vx, vy, width, height, arr, offset) { + var img, i, j, data; + /* + if ((x - v.x >= v.w) || (y - v.y >= v.h) || + (x - v.x + width < 0) || (y - v.y + height < 0)) { + // Skipping because outside of viewport + return; + } + */ + img = c_ctx.createImageData(width, height); + data = img.data; + for (i=0, j=offset; i < (width * height * 4); i=i+4, j=j+3) { + data[i ] = arr[j ]; + data[i + 1] = arr[j + 1]; + data[i + 2] = arr[j + 2]; + data[i + 3] = 255; // Set Alpha + } + c_ctx.putImageData(img, x - vx, y - vy); +}; + +bgrxImageData = function(x, y, vx, vy, width, height, arr, offset) { + var img, i, j, data; + /* + if ((x - v.x >= v.w) || (y - v.y >= v.h) || + (x - v.x + width < 0) || (y - v.y + height < 0)) { + // Skipping because outside of viewport + return; + } + */ + img = c_ctx.createImageData(width, height); + data = img.data; + for (i=0, j=offset; i < (width * height * 4); i=i+4, j=j+4) { + data[i ] = arr[j + 2]; + data[i + 1] = arr[j + 1]; + data[i + 2] = arr[j ]; + data[i + 3] = 255; // Set Alpha + } + c_ctx.putImageData(img, x - vx, y - vy); +}; + +cmapImageData = function(x, y, vx, vy, width, height, arr, offset) { + var img, i, j, data, bgr, cmap; + img = c_ctx.createImageData(width, height); + data = img.data; + cmap = conf.colourMap; + for (i=0, j=offset; i < (width * height * 4); i+=4, j+=1) { + bgr = cmap[arr[j]]; + data[i ] = bgr[2]; + data[i + 1] = bgr[1]; + data[i + 2] = bgr[0]; + data[i + 3] = 255; // Set Alpha + } + c_ctx.putImageData(img, x - vx, y - vy); +}; + +that.blitImage = function(x, y, width, height, arr, offset) { + if (conf.true_color) { + bgrxImageData(x, y, viewport.x, viewport.y, width, height, arr, offset); + } else { + cmapImageData(x, y, viewport.x, viewport.y, width, height, arr, offset); + } +}; + +that.blitRgbImage = function(x, y, width, height, arr, offset) { + if (conf.true_color) { + rgbImageData(x, y, viewport.x, viewport.y, width, height, arr, offset); + } else { + // prolly wrong... + cmapImageData(x, y, viewport.x, viewport.y, width, height, arr, offset); + } +}; + +that.blitStringImage = function(str, x, y) { + var img = new Image(); + img.onload = function () { + c_ctx.drawImage(img, x - viewport.x, y - viewport.y); + }; + img.src = str; +}; + +// Wrap ctx.drawImage but relative to viewport +that.drawImage = function(img, x, y) { + c_ctx.drawImage(img, x - viewport.x, y - viewport.y); +}; + +that.renderQ_push = function(action) { + renderQ.push(action); + if (renderQ.length === 1) { + // If this can be rendered immediately it will be, otherwise + // the scanner will start polling the queue (every + // requestAnimationFrame interval) + scan_renderQ(); + } +}; + +scan_renderQ = function() { + var a, ready = true; + while (ready && renderQ.length > 0) { + a = renderQ[0]; + switch (a.type) { + case 'copy': + that.copyImage(a.old_x, a.old_y, a.x, a.y, a.width, a.height); + break; + case 'fill': + that.fillRect(a.x, a.y, a.width, a.height, a.color); + break; + case 'blit': + that.blitImage(a.x, a.y, a.width, a.height, a.data, 0); + break; + case 'blitRgb': + that.blitRgbImage(a.x, a.y, a.width, a.height, a.data, 0); + break; + case 'img': + if (a.img.complete) { + that.drawImage(a.img, a.x, a.y); + } else { + // We need to wait for this image to 'load' + // to keep things in-order + ready = false; + } + break; + } + if (ready) { + a = renderQ.shift(); + } + } + if (renderQ.length > 0) { + requestAnimFrame(scan_renderQ); + } +}; + + +that.changeCursor = function(pixels, mask, hotx, hoty, w, h) { + if (conf.cursor_uri === false) { + Util.Warn("changeCursor called but no cursor data URI support"); + return; + } + + if (conf.true_color) { + changeCursor(conf.target, pixels, mask, hotx, hoty, w, h); + } else { + changeCursor(conf.target, pixels, mask, hotx, hoty, w, h, conf.colourMap); + } +}; + +that.defaultCursor = function() { + conf.target.style.cursor = "default"; +}; + +return constructor(); // Return the public API interface + +} // End of Display() + + +/* Set CSS cursor property using data URI encoded cursor file */ +function changeCursor(target, pixels, mask, hotx, hoty, w0, h0, cmap) { + "use strict"; + var cur = [], rgb, IHDRsz, RGBsz, ANDsz, XORsz, url, idx, alpha, x, y; + //Util.Debug(">> changeCursor, x: " + hotx + ", y: " + hoty + ", w0: " + w0 + ", h0: " + h0); + + var w = w0; + var h = h0; + if (h < w) + h = w; // increase h to make it square + else + w = h; // increace w to make it square + + // Push multi-byte little-endian values + cur.push16le = function (num) { + this.push((num ) & 0xFF, + (num >> 8) & 0xFF ); + }; + cur.push32le = function (num) { + this.push((num ) & 0xFF, + (num >> 8) & 0xFF, + (num >> 16) & 0xFF, + (num >> 24) & 0xFF ); + }; + + IHDRsz = 40; + RGBsz = w * h * 4; + XORsz = Math.ceil( (w * h) / 8.0 ); + ANDsz = Math.ceil( (w * h) / 8.0 ); + + // Main header + cur.push16le(0); // 0: Reserved + cur.push16le(2); // 2: .CUR type + cur.push16le(1); // 4: Number of images, 1 for non-animated ico + + // Cursor #1 header (ICONDIRENTRY) + cur.push(w); // 6: width + cur.push(h); // 7: height + cur.push(0); // 8: colors, 0 -> true-color + cur.push(0); // 9: reserved + cur.push16le(hotx); // 10: hotspot x coordinate + cur.push16le(hoty); // 12: hotspot y coordinate + cur.push32le(IHDRsz + RGBsz + XORsz + ANDsz); + // 14: cursor data byte size + cur.push32le(22); // 18: offset of cursor data in the file + + + // Cursor #1 InfoHeader (ICONIMAGE/BITMAPINFO) + cur.push32le(IHDRsz); // 22: Infoheader size + cur.push32le(w); // 26: Cursor width + cur.push32le(h*2); // 30: XOR+AND height + cur.push16le(1); // 34: number of planes + cur.push16le(32); // 36: bits per pixel + cur.push32le(0); // 38: Type of compression + + cur.push32le(XORsz + ANDsz); // 43: Size of Image + // Gimp leaves this as 0 + + cur.push32le(0); // 46: reserved + cur.push32le(0); // 50: reserved + cur.push32le(0); // 54: reserved + cur.push32le(0); // 58: reserved + + // 62: color data (RGBQUAD icColors[]) + for (y = h-1; y >= 0; y -= 1) { + for (x = 0; x < w; x += 1) { + if (x >= w0 || y >= h0) { + cur.push(0); // blue + cur.push(0); // green + cur.push(0); // red + cur.push(0); // alpha + } else { + idx = y * Math.ceil(w0 / 8) + Math.floor(x/8); + alpha = (mask[idx] << (x % 8)) & 0x80 ? 255 : 0; + if (cmap) { + idx = (w0 * y) + x; + rgb = cmap[pixels[idx]]; + cur.push(rgb[2]); // blue + cur.push(rgb[1]); // green + cur.push(rgb[0]); // red + cur.push(alpha); // alpha + } else { + idx = ((w0 * y) + x) * 4; + cur.push(pixels[idx + 2]); // blue + cur.push(pixels[idx + 1]); // green + cur.push(pixels[idx ]); // red + cur.push(alpha); // alpha + } + } + } + } + + // XOR/bitmask data (BYTE icXOR[]) + // (ignored, just needs to be right size) + for (y = 0; y < h; y += 1) { + for (x = 0; x < Math.ceil(w / 8); x += 1) { + cur.push(0x00); + } + } + + // AND/bitmask data (BYTE icAND[]) + // (ignored, just needs to be right size) + for (y = 0; y < h; y += 1) { + for (x = 0; x < Math.ceil(w / 8); x += 1) { + cur.push(0x00); + } + } + + url = "data:image/x-icon;base64," + Base64.encode(cur); + target.style.cursor = "url(" + url + ") " + hotx + " " + hoty + ", default"; + //Util.Debug("<< changeCursor, cur.length: " + cur.length); +} diff --git a/noVNC/include/input.js b/noVNC/include/input.js new file mode 100644 index 0000000..392b410 --- /dev/null +++ b/noVNC/include/input.js @@ -0,0 +1,401 @@ +/* + * noVNC: HTML5 VNC client + * Copyright (C) 2012 Joel Martin + * Copyright (C) 2013 Samuel Mannehed for Cendio AB + * Licensed under MPL 2.0 or any later version (see LICENSE.txt) + */ + +/*jslint browser: true, white: false, bitwise: false */ +/*global window, Util */ + + +// +// Keyboard event handler +// + +function Keyboard(defaults) { +"use strict"; + +var that = {}, // Public API methods + conf = {}, // Configuration attributes + + keyDownList = []; // List of depressed keys + // (even if they are happy) + +// Configuration attributes +Util.conf_defaults(conf, that, defaults, [ + ['target', 'wo', 'dom', document, 'DOM element that captures keyboard input'], + ['focused', 'rw', 'bool', true, 'Capture and send key events'], + + ['onKeyPress', 'rw', 'func', null, 'Handler for key press/release'] + ]); + + +// +// Private functions +// + +/////// setup + +function onRfbEvent(evt) { + if (conf.onKeyPress) { + Util.Debug("onKeyPress " + (evt.type == 'keydown' ? "down" : "up") + + ", keysym: " + evt.keysym.keysym + "(" + evt.keysym.keyname + ")"); + conf.onKeyPress(evt.keysym.keysym, evt.type == 'keydown'); + } +} + +// create the keyboard handler +var k = KeyEventDecoder(kbdUtil.ModifierSync(), + VerifyCharModifier( + TrackKeyState( + EscapeModifiers(onRfbEvent) + ) + ) +); + +function onKeyDown(e) { + if (! conf.focused) { + return true; + } + if (k.keydown(e)) { + // Suppress bubbling/default actions + Util.stopEvent(e); + return false; + } else { + // Allow the event to bubble and become a keyPress event which + // will have the character code translated + return true; + } +} +function onKeyPress(e) { + if (! conf.focused) { + return true; + } + if (k.keypress(e)) { + // Suppress bubbling/default actions + Util.stopEvent(e); + return false; + } else { + // Allow the event to bubble and become a keyPress event which + // will have the character code translated + return true; + } +} + +function onKeyUp(e) { + if (! conf.focused) { + return true; + } + if (k.keyup(e)) { + // Suppress bubbling/default actions + Util.stopEvent(e); + return false; + } else { + // Allow the event to bubble and become a keyPress event which + // will have the character code translated + return true; + } +} + +function onOther(e) { + k.syncModifiers(e); +} + +function allKeysUp() { + Util.Debug(">> Keyboard.allKeysUp"); + + k.releaseAll(); + Util.Debug("<< Keyboard.allKeysUp"); +} + +// +// Public API interface functions +// + +that.grab = function() { + //Util.Debug(">> Keyboard.grab"); + var c = conf.target; + + Util.addEvent(c, 'keydown', onKeyDown); + Util.addEvent(c, 'keyup', onKeyUp); + Util.addEvent(c, 'keypress', onKeyPress); + + // Release (key up) if window loses focus + Util.addEvent(window, 'blur', allKeysUp); + + //Util.Debug("<< Keyboard.grab"); +}; + +that.ungrab = function() { + //Util.Debug(">> Keyboard.ungrab"); + var c = conf.target; + + Util.removeEvent(c, 'keydown', onKeyDown); + Util.removeEvent(c, 'keyup', onKeyUp); + Util.removeEvent(c, 'keypress', onKeyPress); + Util.removeEvent(window, 'blur', allKeysUp); + + // Release (key up) all keys that are in a down state + allKeysUp(); + + //Util.Debug(">> Keyboard.ungrab"); +}; + +that.sync = function(e) { + k.syncModifiers(e); +} + +return that; // Return the public API interface + +} // End of Keyboard() + + +// +// Mouse event handler +// + +function Mouse(defaults) { +"use strict"; + +var that = {}, // Public API methods + conf = {}, // Configuration attributes + mouseCaptured = false; + +var doubleClickTimer = null, + lastTouchPos = null; + +// Configuration attributes +Util.conf_defaults(conf, that, defaults, [ + ['target', 'ro', 'dom', document, 'DOM element that captures mouse input'], + ['notify', 'ro', 'func', null, 'Function to call to notify whenever a mouse event is received'], + ['focused', 'rw', 'bool', true, 'Capture and send mouse clicks/movement'], + ['scale', 'rw', 'float', 1.0, 'Viewport scale factor 0.0 - 1.0'], + + ['onMouseButton', 'rw', 'func', null, 'Handler for mouse button click/release'], + ['onMouseMove', 'rw', 'func', null, 'Handler for mouse movement'], + ['touchButton', 'rw', 'int', 1, 'Button mask (1, 2, 4) for touch devices (0 means ignore clicks)'] + ]); + +function captureMouse() { + // capturing the mouse ensures we get the mouseup event + if (conf.target.setCapture) { + conf.target.setCapture(); + } + + // some browsers give us mouseup events regardless, + // so if we never captured the mouse, we can disregard the event + mouseCaptured = true; +} + +function releaseMouse() { + if (conf.target.releaseCapture) { + conf.target.releaseCapture(); + } + mouseCaptured = false; +} +// +// Private functions +// + +function resetDoubleClickTimer() { + doubleClickTimer = null; +} + +function onMouseButton(e, down) { + var evt, pos, bmask; + if (! conf.focused) { + return true; + } + + if (conf.notify) { + conf.notify(e); + } + + evt = (e ? e : window.event); + pos = Util.getEventPosition(e, conf.target, conf.scale); + + if (e.touches || e.changedTouches) { + // Touch device + + // When two touches occur within 500 ms of each other and are + // closer than 20 pixels together a double click is triggered. + if (down == 1) { + if (doubleClickTimer == null) { + lastTouchPos = pos; + } else { + clearTimeout(doubleClickTimer); + + // When the distance between the two touches is small enough + // force the position of the latter touch to the position of + // the first. + + var xs = lastTouchPos.x - pos.x; + var ys = lastTouchPos.y - pos.y; + var d = Math.sqrt((xs * xs) + (ys * ys)); + + // The goal is to trigger on a certain physical width, the + // devicePixelRatio brings us a bit closer but is not optimal. + if (d < 20 * window.devicePixelRatio) { + pos = lastTouchPos; + } + } + doubleClickTimer = setTimeout(resetDoubleClickTimer, 500); + } + bmask = conf.touchButton; + // If bmask is set + } else if (evt.which) { + /* everything except IE */ + bmask = 1 << evt.button; + } else { + /* IE including 9 */ + bmask = (evt.button & 0x1) + // Left + (evt.button & 0x2) * 2 + // Right + (evt.button & 0x4) / 2; // Middle + } + //Util.Debug("mouse " + pos.x + "," + pos.y + " down: " + down + + // " bmask: " + bmask + "(evt.button: " + evt.button + ")"); + if (conf.onMouseButton) { + Util.Debug("onMouseButton " + (down ? "down" : "up") + + ", x: " + pos.x + ", y: " + pos.y + ", bmask: " + bmask); + conf.onMouseButton(pos.x, pos.y, down, bmask); + } + Util.stopEvent(e); + return false; +} + +function onMouseDown(e) { + captureMouse(); + onMouseButton(e, 1); +} + +function onMouseUp(e) { + if (!mouseCaptured) { + return; + } + + onMouseButton(e, 0); + releaseMouse(); +} + +function onMouseWheel(e) { + var evt, pos, bmask, wheelData; + if (! conf.focused) { + return true; + } + if (conf.notify) { + conf.notify(e); + } + + evt = (e ? e : window.event); + pos = Util.getEventPosition(e, conf.target, conf.scale); + wheelData = evt.detail ? evt.detail * -1 : evt.wheelDelta / 40; + if (wheelData > 0) { + bmask = 1 << 3; + } else { + bmask = 1 << 4; + } + //Util.Debug('mouse scroll by ' + wheelData + ':' + pos.x + "," + pos.y); + if (conf.onMouseButton) { + conf.onMouseButton(pos.x, pos.y, 1, bmask); + conf.onMouseButton(pos.x, pos.y, 0, bmask); + } + Util.stopEvent(e); + return false; +} + +function onMouseMove(e) { + var evt, pos; + if (! conf.focused) { + return true; + } + if (conf.notify) { + conf.notify(e); + } + + evt = (e ? e : window.event); + pos = Util.getEventPosition(e, conf.target, conf.scale); + //Util.Debug('mouse ' + evt.which + '/' + evt.button + ' up:' + pos.x + "," + pos.y); + if (conf.onMouseMove) { + conf.onMouseMove(pos.x, pos.y); + } + Util.stopEvent(e); + return false; +} + +function onMouseDisable(e) { + var evt, pos; + if (! conf.focused) { + return true; + } + evt = (e ? e : window.event); + pos = Util.getEventPosition(e, conf.target, conf.scale); + /* Stop propagation if inside canvas area */ + if ((pos.realx >= 0) && (pos.realy >= 0) && + (pos.realx < conf.target.offsetWidth) && + (pos.realy < conf.target.offsetHeight)) { + //Util.Debug("mouse event disabled"); + Util.stopEvent(e); + return false; + } + //Util.Debug("mouse event not disabled"); + return true; +} + +// +// Public API interface functions +// + +that.grab = function() { + //Util.Debug(">> Mouse.grab"); + var c = conf.target; + + if ('ontouchstart' in document.documentElement) { + Util.addEvent(c, 'touchstart', onMouseDown); + Util.addEvent(window, 'touchend', onMouseUp); + Util.addEvent(c, 'touchend', onMouseUp); + Util.addEvent(c, 'touchmove', onMouseMove); + } else { + Util.addEvent(c, 'mousedown', onMouseDown); + Util.addEvent(window, 'mouseup', onMouseUp); + Util.addEvent(c, 'mouseup', onMouseUp); + Util.addEvent(c, 'mousemove', onMouseMove); + Util.addEvent(c, (Util.Engine.gecko) ? 'DOMMouseScroll' : 'mousewheel', + onMouseWheel); + } + + /* Work around right and middle click browser behaviors */ + Util.addEvent(document, 'click', onMouseDisable); + Util.addEvent(document.body, 'contextmenu', onMouseDisable); + + //Util.Debug("<< Mouse.grab"); +}; + +that.ungrab = function() { + //Util.Debug(">> Mouse.ungrab"); + var c = conf.target; + + if ('ontouchstart' in document.documentElement) { + Util.removeEvent(c, 'touchstart', onMouseDown); + Util.removeEvent(window, 'touchend', onMouseUp); + Util.removeEvent(c, 'touchend', onMouseUp); + Util.removeEvent(c, 'touchmove', onMouseMove); + } else { + Util.removeEvent(c, 'mousedown', onMouseDown); + Util.removeEvent(window, 'mouseup', onMouseUp); + Util.removeEvent(c, 'mouseup', onMouseUp); + Util.removeEvent(c, 'mousemove', onMouseMove); + Util.removeEvent(c, (Util.Engine.gecko) ? 'DOMMouseScroll' : 'mousewheel', + onMouseWheel); + } + + /* Work around right and middle click browser behaviors */ + Util.removeEvent(document, 'click', onMouseDisable); + Util.removeEvent(document.body, 'contextmenu', onMouseDisable); + + //Util.Debug(">> Mouse.ungrab"); +}; + +return that; // Return the public API interface + +} // End of Mouse() diff --git a/noVNC/include/jsunzip.js b/noVNC/include/jsunzip.js new file mode 100755 index 0000000..8968f86 --- /dev/null +++ b/noVNC/include/jsunzip.js @@ -0,0 +1,676 @@ +/* + * JSUnzip + * + * Copyright (c) 2011 by Erik Moller + * All Rights Reserved + * + * This software is provided 'as-is', without any express + * or implied warranty. In no event will the authors be + * held liable for any damages arising from the use of + * this software. + * + * Permission is granted to anyone to use this software + * for any purpose, including commercial applications, + * and to alter it and redistribute it freely, subject to + * the following restrictions: + * + * 1. The origin of this software must not be + * misrepresented; you must not claim that you + * wrote the original software. If you use this + * software in a product, an acknowledgment in + * the product documentation would be appreciated + * but is not required. + * + * 2. Altered source versions must be plainly marked + * as such, and must not be misrepresented as + * being the original software. + * + * 3. This notice may not be removed or altered from + * any source distribution. + */ + +var tinf; + +function JSUnzip() { + + this.getInt = function(offset, size) { + switch (size) { + case 4: + return (this.data.charCodeAt(offset + 3) & 0xff) << 24 | + (this.data.charCodeAt(offset + 2) & 0xff) << 16 | + (this.data.charCodeAt(offset + 1) & 0xff) << 8 | + (this.data.charCodeAt(offset + 0) & 0xff); + break; + case 2: + return (this.data.charCodeAt(offset + 1) & 0xff) << 8 | + (this.data.charCodeAt(offset + 0) & 0xff); + break; + default: + return this.data.charCodeAt(offset) & 0xff; + break; + } + }; + + this.getDOSDate = function(dosdate, dostime) { + var day = dosdate & 0x1f; + var month = ((dosdate >> 5) & 0xf) - 1; + var year = 1980 + ((dosdate >> 9) & 0x7f) + var second = (dostime & 0x1f) * 2; + var minute = (dostime >> 5) & 0x3f; + hour = (dostime >> 11) & 0x1f; + return new Date(year, month, day, hour, minute, second); + } + + this.open = function(data) { + this.data = data; + this.files = []; + + if (this.data.length < 22) + return { 'status' : false, 'error' : 'Invalid data' }; + var endOfCentralDirectory = this.data.length - 22; + while (endOfCentralDirectory >= 0 && this.getInt(endOfCentralDirectory, 4) != 0x06054b50) + --endOfCentralDirectory; + if (endOfCentralDirectory < 0) + return { 'status' : false, 'error' : 'Invalid data' }; + if (this.getInt(endOfCentralDirectory + 4, 2) != 0 || this.getInt(endOfCentralDirectory + 6, 2) != 0) + return { 'status' : false, 'error' : 'No multidisk support' }; + + var entriesInThisDisk = this.getInt(endOfCentralDirectory + 8, 2); + var centralDirectoryOffset = this.getInt(endOfCentralDirectory + 16, 4); + var globalCommentLength = this.getInt(endOfCentralDirectory + 20, 2); + this.comment = this.data.slice(endOfCentralDirectory + 22, endOfCentralDirectory + 22 + globalCommentLength); + + var fileOffset = centralDirectoryOffset; + + for (var i = 0; i < entriesInThisDisk; ++i) { + if (this.getInt(fileOffset + 0, 4) != 0x02014b50) + return { 'status' : false, 'error' : 'Invalid data' }; + if (this.getInt(fileOffset + 6, 2) > 20) + return { 'status' : false, 'error' : 'Unsupported version' }; + if (this.getInt(fileOffset + 8, 2) & 1) + return { 'status' : false, 'error' : 'Encryption not implemented' }; + + var compressionMethod = this.getInt(fileOffset + 10, 2); + if (compressionMethod != 0 && compressionMethod != 8) + return { 'status' : false, 'error' : 'Unsupported compression method' }; + + var lastModFileTime = this.getInt(fileOffset + 12, 2); + var lastModFileDate = this.getInt(fileOffset + 14, 2); + var lastModifiedDate = this.getDOSDate(lastModFileDate, lastModFileTime); + + var crc = this.getInt(fileOffset + 16, 4); + // TODO: crc + + var compressedSize = this.getInt(fileOffset + 20, 4); + var uncompressedSize = this.getInt(fileOffset + 24, 4); + + var fileNameLength = this.getInt(fileOffset + 28, 2); + var extraFieldLength = this.getInt(fileOffset + 30, 2); + var fileCommentLength = this.getInt(fileOffset + 32, 2); + + var relativeOffsetOfLocalHeader = this.getInt(fileOffset + 42, 4); + + var fileName = this.data.slice(fileOffset + 46, fileOffset + 46 + fileNameLength); + var fileComment = this.data.slice(fileOffset + 46 + fileNameLength + extraFieldLength, fileOffset + 46 + fileNameLength + extraFieldLength + fileCommentLength); + + if (this.getInt(relativeOffsetOfLocalHeader + 0, 4) != 0x04034b50) + return { 'status' : false, 'error' : 'Invalid data' }; + var localFileNameLength = this.getInt(relativeOffsetOfLocalHeader + 26, 2); + var localExtraFieldLength = this.getInt(relativeOffsetOfLocalHeader + 28, 2); + var localFileContent = relativeOffsetOfLocalHeader + 30 + localFileNameLength + localExtraFieldLength; + + this.files[fileName] = + { + 'fileComment' : fileComment, + 'compressionMethod' : compressionMethod, + 'compressedSize' : compressedSize, + 'uncompressedSize' : uncompressedSize, + 'localFileContent' : localFileContent, + 'lastModifiedDate' : lastModifiedDate + }; + + fileOffset += 46 + fileNameLength + extraFieldLength + fileCommentLength; + } + return { 'status' : true } + }; + + + this.read = function(fileName) { + var fileInfo = this.files[fileName]; + if (fileInfo) { + if (fileInfo.compressionMethod == 8) { + if (!tinf) { + tinf = new TINF(); + tinf.init(); + } + var result = tinf.uncompress(this.data, fileInfo.localFileContent); + if (result.status == tinf.OK) + return { 'status' : true, 'data' : result.data }; + else + return { 'status' : false, 'error' : result.error }; + } else { + return { 'status' : true, 'data' : this.data.slice(fileInfo.localFileContent, fileInfo.localFileContent + fileInfo.uncompressedSize) }; + } + } + return { 'status' : false, 'error' : "File '" + fileName + "' doesn't exist in zip" }; + }; + +}; + + + +/* + * tinflate - tiny inflate + * + * Copyright (c) 2003 by Joergen Ibsen / Jibz + * All Rights Reserved + * + * http://www.ibsensoftware.com/ + * + * This software is provided 'as-is', without any express + * or implied warranty. In no event will the authors be + * held liable for any damages arising from the use of + * this software. + * + * Permission is granted to anyone to use this software + * for any purpose, including commercial applications, + * and to alter it and redistribute it freely, subject to + * the following restrictions: + * + * 1. The origin of this software must not be + * misrepresented; you must not claim that you + * wrote the original software. If you use this + * software in a product, an acknowledgment in + * the product documentation would be appreciated + * but is not required. + * + * 2. Altered source versions must be plainly marked + * as such, and must not be misrepresented as + * being the original software. + * + * 3. This notice may not be removed or altered from + * any source distribution. + */ + +/* + * tinflate javascript port by Erik Moller in May 2011. + * emoller@opera.com + * + * read_bits() patched by mike@imidio.com to allow + * reading more then 8 bits (needed in some zlib streams) + */ + +"use strict"; + +function TINF() { + +this.OK = 0; +this.DATA_ERROR = (-3); +this.WINDOW_SIZE = 32768; + +/* ------------------------------ * + * -- internal data structures -- * + * ------------------------------ */ + +this.TREE = function() { + this.table = new Array(16); /* table of code length counts */ + this.trans = new Array(288); /* code -> symbol translation table */ +}; + +this.DATA = function(that) { + this.source = ''; + this.sourceIndex = 0; + this.tag = 0; + this.bitcount = 0; + + this.dest = []; + + this.history = []; + + this.ltree = new that.TREE(); /* dynamic length/symbol tree */ + this.dtree = new that.TREE(); /* dynamic distance tree */ +}; + +/* --------------------------------------------------- * + * -- uninitialized global data (static structures) -- * + * --------------------------------------------------- */ + +this.sltree = new this.TREE(); /* fixed length/symbol tree */ +this.sdtree = new this.TREE(); /* fixed distance tree */ + +/* extra bits and base tables for length codes */ +this.length_bits = new Array(30); +this.length_base = new Array(30); + +/* extra bits and base tables for distance codes */ +this.dist_bits = new Array(30); +this.dist_base = new Array(30); + +/* special ordering of code length codes */ +this.clcidx = [ + 16, 17, 18, 0, 8, 7, 9, 6, + 10, 5, 11, 4, 12, 3, 13, 2, + 14, 1, 15 +]; + +/* ----------------------- * + * -- utility functions -- * + * ----------------------- */ + +/* build extra bits and base tables */ +this.build_bits_base = function(bits, base, delta, first) +{ + var i, sum; + + /* build bits table */ + for (i = 0; i < delta; ++i) bits[i] = 0; + for (i = 0; i < 30 - delta; ++i) bits[i + delta] = Math.floor(i / delta); + + /* build base table */ + for (sum = first, i = 0; i < 30; ++i) + { + base[i] = sum; + sum += 1 << bits[i]; + } +} + +/* build the fixed huffman trees */ +this.build_fixed_trees = function(lt, dt) +{ + var i; + + /* build fixed length tree */ + for (i = 0; i < 7; ++i) lt.table[i] = 0; + + lt.table[7] = 24; + lt.table[8] = 152; + lt.table[9] = 112; + + for (i = 0; i < 24; ++i) lt.trans[i] = 256 + i; + for (i = 0; i < 144; ++i) lt.trans[24 + i] = i; + for (i = 0; i < 8; ++i) lt.trans[24 + 144 + i] = 280 + i; + for (i = 0; i < 112; ++i) lt.trans[24 + 144 + 8 + i] = 144 + i; + + /* build fixed distance tree */ + for (i = 0; i < 5; ++i) dt.table[i] = 0; + + dt.table[5] = 32; + + for (i = 0; i < 32; ++i) dt.trans[i] = i; +} + +/* given an array of code lengths, build a tree */ +this.build_tree = function(t, lengths, loffset, num) +{ + var offs = new Array(16); + var i, sum; + + /* clear code length count table */ + for (i = 0; i < 16; ++i) t.table[i] = 0; + + /* scan symbol lengths, and sum code length counts */ + for (i = 0; i < num; ++i) t.table[lengths[loffset + i]]++; + + t.table[0] = 0; + + /* compute offset table for distribution sort */ + for (sum = 0, i = 0; i < 16; ++i) + { + offs[i] = sum; + sum += t.table[i]; + } + + /* create code->symbol translation table (symbols sorted by code) */ + for (i = 0; i < num; ++i) + { + if (lengths[loffset + i]) t.trans[offs[lengths[loffset + i]]++] = i; + } +} + +/* ---------------------- * + * -- decode functions -- * + * ---------------------- */ + +/* get one bit from source stream */ +this.getbit = function(d) +{ + var bit; + + /* check if tag is empty */ + if (!d.bitcount--) + { + /* load next tag */ + d.tag = d.source[d.sourceIndex++] & 0xff; + d.bitcount = 7; + } + + /* shift bit out of tag */ + bit = d.tag & 0x01; + d.tag >>= 1; + + return bit; +} + +/* read a num bit value from a stream and add base */ +function read_bits_direct(source, bitcount, tag, idx, num) +{ + var val = 0; + while (bitcount < 24) { + tag = tag | (source[idx++] & 0xff) << bitcount; + bitcount += 8; + } + val = tag & (0xffff >> (16 - num)); + tag >>= num; + bitcount -= num; + return [bitcount, tag, idx, val]; +} +this.read_bits = function(d, num, base) +{ + if (!num) + return base; + + var ret = read_bits_direct(d.source, d.bitcount, d.tag, d.sourceIndex, num); + d.bitcount = ret[0]; + d.tag = ret[1]; + d.sourceIndex = ret[2]; + return ret[3] + base; +} + +/* given a data stream and a tree, decode a symbol */ +this.decode_symbol = function(d, t) +{ + while (d.bitcount < 16) { + d.tag = d.tag | (d.source[d.sourceIndex++] & 0xff) << d.bitcount; + d.bitcount += 8; + } + + var sum = 0, cur = 0, len = 0; + do { + cur = 2 * cur + ((d.tag & (1 << len)) >> len); + + ++len; + + sum += t.table[len]; + cur -= t.table[len]; + + } while (cur >= 0); + + d.tag >>= len; + d.bitcount -= len; + + return t.trans[sum + cur]; +} + +/* given a data stream, decode dynamic trees from it */ +this.decode_trees = function(d, lt, dt) +{ + var code_tree = new this.TREE(); + var lengths = new Array(288+32); + var hlit, hdist, hclen; + var i, num, length; + + /* get 5 bits HLIT (257-286) */ + hlit = this.read_bits(d, 5, 257); + + /* get 5 bits HDIST (1-32) */ + hdist = this.read_bits(d, 5, 1); + + /* get 4 bits HCLEN (4-19) */ + hclen = this.read_bits(d, 4, 4); + + for (i = 0; i < 19; ++i) lengths[i] = 0; + + /* read code lengths for code length alphabet */ + for (i = 0; i < hclen; ++i) + { + /* get 3 bits code length (0-7) */ + var clen = this.read_bits(d, 3, 0); + + lengths[this.clcidx[i]] = clen; + } + + /* build code length tree */ + this.build_tree(code_tree, lengths, 0, 19); + + /* decode code lengths for the dynamic trees */ + for (num = 0; num < hlit + hdist; ) + { + var sym = this.decode_symbol(d, code_tree); + + switch (sym) + { + case 16: + /* copy previous code length 3-6 times (read 2 bits) */ + { + var prev = lengths[num - 1]; + for (length = this.read_bits(d, 2, 3); length; --length) + { + lengths[num++] = prev; + } + } + break; + case 17: + /* repeat code length 0 for 3-10 times (read 3 bits) */ + for (length = this.read_bits(d, 3, 3); length; --length) + { + lengths[num++] = 0; + } + break; + case 18: + /* repeat code length 0 for 11-138 times (read 7 bits) */ + for (length = this.read_bits(d, 7, 11); length; --length) + { + lengths[num++] = 0; + } + break; + default: + /* values 0-15 represent the actual code lengths */ + lengths[num++] = sym; + break; + } + } + + /* build dynamic trees */ + this.build_tree(lt, lengths, 0, hlit); + this.build_tree(dt, lengths, hlit, hdist); +} + +/* ----------------------------- * + * -- block inflate functions -- * + * ----------------------------- */ + +/* given a stream and two trees, inflate a block of data */ +this.inflate_block_data = function(d, lt, dt) +{ + // js optimization. + var ddest = d.dest; + var ddestlength = ddest.length; + + while (1) + { + var sym = this.decode_symbol(d, lt); + + /* check for end of block */ + if (sym == 256) + { + return this.OK; + } + + if (sym < 256) + { + ddest[ddestlength++] = sym; // ? String.fromCharCode(sym); + d.history.push(sym); + } else { + + var length, dist, offs; + var i; + + sym -= 257; + + /* possibly get more bits from length code */ + length = this.read_bits(d, this.length_bits[sym], this.length_base[sym]); + + dist = this.decode_symbol(d, dt); + + /* possibly get more bits from distance code */ + offs = d.history.length - this.read_bits(d, this.dist_bits[dist], this.dist_base[dist]); + + if (offs < 0) + throw ("Invalid zlib offset " + offs); + + /* copy match */ + for (i = offs; i < offs + length; ++i) { + //ddest[ddestlength++] = ddest[i]; + ddest[ddestlength++] = d.history[i]; + d.history.push(d.history[i]); + } + } + } +} + +/* inflate an uncompressed block of data */ +this.inflate_uncompressed_block = function(d) +{ + var length, invlength; + var i; + + if (d.bitcount > 7) { + var overflow = Math.floor(d.bitcount / 8); + d.sourceIndex -= overflow; + d.bitcount = 0; + d.tag = 0; + } + + /* get length */ + length = d.source[d.sourceIndex+1]; + length = 256*length + d.source[d.sourceIndex]; + + /* get one's complement of length */ + invlength = d.source[d.sourceIndex+3]; + invlength = 256*invlength + d.source[d.sourceIndex+2]; + + /* check length */ + if (length != (~invlength & 0x0000ffff)) return this.DATA_ERROR; + + d.sourceIndex += 4; + + /* copy block */ + for (i = length; i; --i) { + d.history.push(d.source[d.sourceIndex]); + d.dest[d.dest.length] = d.source[d.sourceIndex++]; + } + + /* make sure we start next block on a byte boundary */ + d.bitcount = 0; + + return this.OK; +} + +/* inflate a block of data compressed with fixed huffman trees */ +this.inflate_fixed_block = function(d) +{ + /* decode block using fixed trees */ + return this.inflate_block_data(d, this.sltree, this.sdtree); +} + +/* inflate a block of data compressed with dynamic huffman trees */ +this.inflate_dynamic_block = function(d) +{ + /* decode trees from stream */ + this.decode_trees(d, d.ltree, d.dtree); + + /* decode block using decoded trees */ + return this.inflate_block_data(d, d.ltree, d.dtree); +} + +/* ---------------------- * + * -- public functions -- * + * ---------------------- */ + +/* initialize global (static) data */ +this.init = function() +{ + /* build fixed huffman trees */ + this.build_fixed_trees(this.sltree, this.sdtree); + + /* build extra bits and base tables */ + this.build_bits_base(this.length_bits, this.length_base, 4, 3); + this.build_bits_base(this.dist_bits, this.dist_base, 2, 1); + + /* fix a special case */ + this.length_bits[28] = 0; + this.length_base[28] = 258; + + this.reset(); +} + +this.reset = function() +{ + this.d = new this.DATA(this); + delete this.header; +} + +/* inflate stream from source to dest */ +this.uncompress = function(source, offset) +{ + + var d = this.d; + var bfinal; + + /* initialise data */ + d.source = source; + d.sourceIndex = offset; + d.bitcount = 0; + + d.dest = []; + + // Skip zlib header at start of stream + if (typeof this.header == 'undefined') { + this.header = this.read_bits(d, 16, 0); + /* byte 0: 0x78, 7 = 32k window size, 8 = deflate */ + /* byte 1: check bits for header and other flags */ + } + + var blocks = 0; + + do { + + var btype; + var res; + + /* read final block flag */ + bfinal = this.getbit(d); + + /* read block type (2 bits) */ + btype = this.read_bits(d, 2, 0); + + /* decompress block */ + switch (btype) + { + case 0: + /* decompress uncompressed block */ + res = this.inflate_uncompressed_block(d); + break; + case 1: + /* decompress block with fixed huffman trees */ + res = this.inflate_fixed_block(d); + break; + case 2: + /* decompress block with dynamic huffman trees */ + res = this.inflate_dynamic_block(d); + break; + default: + return { 'status' : this.DATA_ERROR }; + } + + if (res != this.OK) return { 'status' : this.DATA_ERROR }; + blocks++; + + } while (!bfinal && d.sourceIndex < d.source.length); + + d.history = d.history.slice(-this.WINDOW_SIZE); + + return { 'status' : this.OK, 'data' : d.dest }; +} + +}; diff --git a/noVNC/include/keyboard.js b/noVNC/include/keyboard.js new file mode 100644 index 0000000..f21f976 --- /dev/null +++ b/noVNC/include/keyboard.js @@ -0,0 +1,528 @@ +var kbdUtil = (function() { + "use strict"; + + function substituteCodepoint(cp) { + // Any Unicode code points which do not have corresponding keysym entries + // can be swapped out for another code point by adding them to this table + var substitutions = { + // {S,s} with comma below -> {S,s} with cedilla + 0x218 : 0x15e, + 0x219 : 0x15f, + // {T,t} with comma below -> {T,t} with cedilla + 0x21a : 0x162, + 0x21b : 0x163 + }; + + var sub = substitutions[cp]; + return sub ? sub : cp; + }; + + function isMac() { + return navigator && !!(/macintosh/i).exec(navigator.appVersion); + } + function isWindows() { + return navigator && !!(/windows/i).exec(navigator.appVersion); + } + function isLinux() { + return navigator && !!(/linux/i).exec(navigator.appVersion); + } + + // Return true if a modifier which is not the specified char modifier (and is not shift) is down + function hasShortcutModifier(charModifier, currentModifiers) { + var mods = {}; + for (var key in currentModifiers) { + if (parseInt(key) !== 0xffe1) { + mods[key] = currentModifiers[key]; + } + } + + var sum = 0; + for (var k in currentModifiers) { + if (mods[k]) { + ++sum; + } + } + if (hasCharModifier(charModifier, mods)) { + return sum > charModifier.length; + } + else { + return sum > 0; + } + } + + // Return true if the specified char modifier is currently down + function hasCharModifier(charModifier, currentModifiers) { + if (charModifier.length === 0) { return false; } + + for (var i = 0; i < charModifier.length; ++i) { + if (!currentModifiers[charModifier[i]]) { + return false; + } + } + return true; + } + + // Helper object tracking modifier key state + // and generates fake key events to compensate if it gets out of sync + function ModifierSync(charModifier) { + var ctrl = 0xffe3; + var alt = 0xffe9; + var altGr = 0xfe03; + var shift = 0xffe1; + var meta = 0xffe7; + + if (!charModifier) { + if (isMac()) { + // on Mac, Option (AKA Alt) is used as a char modifier + charModifier = [alt]; + } + else if (isWindows()) { + // on Windows, Ctrl+Alt is used as a char modifier + charModifier = [alt, ctrl]; + } + else if (isLinux()) { + // on Linux, AltGr is used as a char modifier + charModifier = [altGr]; + } + else { + charModifier = []; + } + } + + var state = {}; + state[ctrl] = false; + state[alt] = false; + state[altGr] = false; + state[shift] = false; + state[meta] = false; + + function sync(evt, keysym) { + var result = []; + function syncKey(keysym) { + return {keysym: keysyms.lookup(keysym), type: state[keysym] ? 'keydown' : 'keyup'}; + } + + if (evt.ctrlKey !== undefined && evt.ctrlKey !== state[ctrl] && keysym !== ctrl) { + state[ctrl] = evt.ctrlKey; + result.push(syncKey(ctrl)); + } + if (evt.altKey !== undefined && evt.altKey !== state[alt] && keysym !== alt) { + state[alt] = evt.altKey; + result.push(syncKey(alt)); + } + if (evt.altGraphKey !== undefined && evt.altGraphKey !== state[altGr] && keysym !== altGr) { + state[altGr] = evt.altGraphKey; + result.push(syncKey(altGr)); + } + if (evt.shiftKey !== undefined && evt.shiftKey !== state[shift] && keysym !== shift) { + state[shift] = evt.shiftKey; + result.push(syncKey(shift)); + } + if (evt.metaKey !== undefined && evt.metaKey !== state[meta] && keysym !== meta) { + state[meta] = evt.metaKey; + result.push(syncKey(meta)); + } + return result; + } + function syncKeyEvent(evt, down) { + var obj = getKeysym(evt); + var keysym = obj ? obj.keysym : null; + + // first, apply the event itself, if relevant + if (keysym !== null && state[keysym] !== undefined) { + state[keysym] = down; + } + return sync(evt, keysym); + } + + return { + // sync on the appropriate keyboard event + keydown: function(evt) { return syncKeyEvent(evt, true);}, + keyup: function(evt) { return syncKeyEvent(evt, false);}, + // Call this with a non-keyboard event (such as mouse events) to use its modifier state to synchronize anyway + syncAny: function(evt) { return sync(evt);}, + + // is a shortcut modifier down? + hasShortcutModifier: function() { return hasShortcutModifier(charModifier, state); }, + // if a char modifier is down, return the keys it consists of, otherwise return null + activeCharModifier: function() { return hasCharModifier(charModifier, state) ? charModifier : null; } + }; + } + + // Get a key ID from a keyboard event + // May be a string or an integer depending on the available properties + function getKey(evt){ + if (evt.key) { + return evt.key; + } + else { + return evt.keyCode; + } + } + + // Get the most reliable keysym value we can get from a key event + // if char/charCode is available, prefer those, otherwise fall back to key/keyCode/which + function getKeysym(evt){ + var codepoint; + if (evt.char && evt.char.length === 1) { + codepoint = evt.char.charCodeAt(); + } + else if (evt.charCode) { + codepoint = evt.charCode; + } + + if (codepoint) { + var res = keysyms.fromUnicode(substituteCodepoint(codepoint)); + if (res) { + return res; + } + } + // we could check evt.key here. + // Legal values are defined in http://www.w3.org/TR/DOM-Level-3-Events/#key-values-list, + // so we "just" need to map them to keysym, but AFAIK this is only available in IE10, which also provides evt.key + // so we don't *need* it yet + if (evt.keyCode) { + return keysyms.lookup(keysymFromKeyCode(evt.keyCode, evt.shiftKey)); + } + if (evt.which) { + return keysyms.lookup(keysymFromKeyCode(evt.which, evt.shiftKey)); + } + return null; + } + + // Given a keycode, try to predict which keysym it might be. + // If the keycode is unknown, null is returned. + function keysymFromKeyCode(keycode, shiftPressed) { + if (typeof(keycode) !== 'number') { + return null; + } + // won't be accurate for azerty + if (keycode >= 0x30 && keycode <= 0x39) { + return keycode; // digit + } + if (keycode >= 0x41 && keycode <= 0x5a) { + // remap to lowercase unless shift is down + return shiftPressed ? keycode : keycode + 32; // A-Z + } + if (keycode >= 0x60 && keycode <= 0x69) { + return 0xffb0 + (keycode - 0x60); // numpad 0-9 + } + + switch(keycode) { + case 0x20: return 0x20; // space + case 0x6a: return 0xffaa; // multiply + case 0x6b: return 0xffab; // add + case 0x6c: return 0xffac; // separator + case 0x6d: return 0xffad; // subtract + case 0x6e: return 0xffae; // decimal + case 0x6f: return 0xffaf; // divide + case 0xbb: return 0x2b; // + + case 0xbc: return 0x2c; // , + case 0xbd: return 0x2d; // - + case 0xbe: return 0x2e; // . + } + + return nonCharacterKey({keyCode: keycode}); + } + + // if the key is a known non-character key (any key which doesn't generate character data) + // return its keysym value. Otherwise return null + function nonCharacterKey(evt) { + // evt.key not implemented yet + if (!evt.keyCode) { return null; } + var keycode = evt.keyCode; + + if (keycode >= 0x70 && keycode <= 0x87) { + return 0xffbe + keycode - 0x70; // F1-F24 + } + switch (keycode) { + + case 8 : return 0xFF08; // BACKSPACE + case 13 : return 0xFF0D; // ENTER + + case 9 : return 0xFF09; // TAB + + case 27 : return 0xFF1B; // ESCAPE + case 46 : return 0xFFFF; // DELETE + + case 36 : return 0xFF50; // HOME + case 35 : return 0xFF57; // END + case 33 : return 0xFF55; // PAGE_UP + case 34 : return 0xFF56; // PAGE_DOWN + case 45 : return 0xFF63; // INSERT + + case 37 : return 0xFF51; // LEFT + case 38 : return 0xFF52; // UP + case 39 : return 0xFF53; // RIGHT + case 40 : return 0xFF54; // DOWN + case 16 : return 0xFFE1; // SHIFT + case 17 : return 0xFFE3; // CONTROL + case 18 : return 0xFFE9; // Left ALT (Mac Option) + + case 224 : return 0xFE07; // Meta + case 225 : return 0xFE03; // AltGr + case 91 : return 0xFFEC; // Super_L (Win Key) + case 92 : return 0xFFED; // Super_R (Win Key) + case 93 : return 0xFF67; // Menu (Win Menu), Mac Command + default: return null; + } + } + return { + hasShortcutModifier : hasShortcutModifier, + hasCharModifier : hasCharModifier, + ModifierSync : ModifierSync, + getKey : getKey, + getKeysym : getKeysym, + keysymFromKeyCode : keysymFromKeyCode, + nonCharacterKey : nonCharacterKey, + substituteCodepoint : substituteCodepoint + }; +})(); + +// Takes a DOM keyboard event and: +// - determines which keysym it represents +// - determines a keyId identifying the key that was pressed (corresponding to the key/keyCode properties on the DOM event) +// - synthesizes events to synchronize modifier key state between which modifiers are actually down, and which we thought were down +// - marks each event with an 'escape' property if a modifier was down which should be "escaped" +// - generates a "stall" event in cases where it might be necessary to wait and see if a keypress event follows a keydown +// This information is collected into an object which is passed to the next() function. (one call per event) +function KeyEventDecoder(modifierState, next) { + "use strict"; + function sendAll(evts) { + for (var i = 0; i < evts.length; ++i) { + next(evts[i]); + } + } + function process(evt, type) { + var result = {type: type}; + var keyId = kbdUtil.getKey(evt); + if (keyId) { + result.keyId = keyId; + } + + var keysym = kbdUtil.getKeysym(evt); + + var hasModifier = modifierState.hasShortcutModifier() || !!modifierState.activeCharModifier(); + // Is this a case where we have to decide on the keysym right away, rather than waiting for the keypress? + // "special" keys like enter, tab or backspace don't send keypress events, + // and some browsers don't send keypresses at all if a modifier is down + if (keysym && (type !== 'keydown' || kbdUtil.nonCharacterKey(evt) || hasModifier)) { + result.keysym = keysym; + } + + var isShift = evt.keyCode === 0x10 || evt.key === 'Shift'; + + // Should we prevent the browser from handling the event? + // Doing so on a keydown (in most browsers) prevents keypress from being generated + // so only do that if we have to. + var suppress = !isShift && (type !== 'keydown' || modifierState.hasShortcutModifier() || !!kbdUtil.nonCharacterKey(evt)); + + // If a char modifier is down on a keydown, we need to insert a stall, + // so VerifyCharModifier knows to wait and see if a keypress is comnig + var stall = type === 'keydown' && modifierState.activeCharModifier() && !kbdUtil.nonCharacterKey(evt); + + // if a char modifier is pressed, get the keys it consists of (on Windows, AltGr is equivalent to Ctrl+Alt) + var active = modifierState.activeCharModifier(); + + // If we have a char modifier down, and we're able to determine a keysym reliably + // then (a) we know to treat the modifier as a char modifier, + // and (b) we'll have to "escape" the modifier to undo the modifier when sending the char. + if (active && keysym) { + var isCharModifier = false; + for (var i = 0; i < active.length; ++i) { + if (active[i] === keysym.keysym) { + isCharModifier = true; + } + } + if (type === 'keypress' && !isCharModifier) { + result.escape = modifierState.activeCharModifier(); + } + } + + if (stall) { + // insert a fake "stall" event + next({type: 'stall'}); + } + next(result); + + return suppress; + } + + return { + keydown: function(evt) { + sendAll(modifierState.keydown(evt)); + return process(evt, 'keydown'); + }, + keypress: function(evt) { + return process(evt, 'keypress'); + }, + keyup: function(evt) { + sendAll(modifierState.keyup(evt)); + return process(evt, 'keyup'); + }, + syncModifiers: function(evt) { + sendAll(modifierState.syncAny(evt)); + }, + releaseAll: function() { next({type: 'releaseall'}); } + }; +} + +// Combines keydown and keypress events where necessary to handle char modifiers. +// On some OS'es, a char modifier is sometimes used as a shortcut modifier. +// For example, on Windows, AltGr is synonymous with Ctrl-Alt. On a Danish keyboard layout, AltGr-2 yields a @, but Ctrl-Alt-D does nothing +// so when used with the '2' key, Ctrl-Alt counts as a char modifier (and should be escaped), but when used with 'D', it does not. +// The only way we can distinguish these cases is to wait and see if a keypress event arrives +// When we receive a "stall" event, wait a few ms before processing the next keydown. If a keypress has also arrived, merge the two +function VerifyCharModifier(next) { + "use strict"; + var queue = []; + var timer = null; + function process() { + if (timer) { + return; + } + while (queue.length !== 0) { + var cur = queue[0]; + queue = queue.splice(1); + switch (cur.type) { + case 'stall': + // insert a delay before processing available events. + timer = setTimeout(function() { + clearTimeout(timer); + timer = null; + process(); + }, 5); + return; + case 'keydown': + // is the next element a keypress? Then we should merge the two + if (queue.length !== 0 && queue[0].type === 'keypress') { + // Firefox sends keypress even when no char is generated. + // so, if keypress keysym is the same as we'd have guessed from keydown, + // the modifier didn't have any effect, and should not be escaped + if (queue[0].escape && (!cur.keysym || cur.keysym.keysym !== queue[0].keysym.keysym)) { + cur.escape = queue[0].escape; + } + cur.keysym = queue[0].keysym; + queue = queue.splice(1); + } + break; + } + + // swallow stall events, and pass all others to the next stage + if (cur.type !== 'stall') { + next(cur); + } + } + } + return function(evt) { + queue.push(evt); + process(); + }; +} + +// Keeps track of which keys we (and the server) believe are down +// When a keyup is received, match it against this list, to determine the corresponding keysym(s) +// in some cases, a single key may produce multiple keysyms, so the corresponding keyup event must release all of these chars +// key repeat events should be merged into a single entry. +// Because we can't always identify which entry a keydown or keyup event corresponds to, we sometimes have to guess +function TrackKeyState(next) { + "use strict"; + var state = []; + + return function (evt) { + var last = state.length !== 0 ? state[state.length-1] : null; + + switch (evt.type) { + case 'keydown': + // insert a new entry if last seen key was different. + if (!last || !evt.keyId || last.keyId !== evt.keyId) { + last = {keyId: evt.keyId, keysyms: {}}; + state.push(last); + } + if (evt.keysym) { + // make sure last event contains this keysym (a single "logical" keyevent + // can cause multiple key events to be sent to the VNC server) + last.keysyms[evt.keysym.keysym] = evt.keysym; + last.ignoreKeyPress = true; + next(evt); + } + break; + case 'keypress': + if (!last) { + last = {keyId: evt.keyId, keysyms: {}}; + state.push(last); + } + if (!evt.keysym) { + console.log('keypress with no keysym:', evt); + } + + // If we didn't expect a keypress, and already sent a keydown to the VNC server + // based on the keydown, make sure to skip this event. + if (evt.keysym && !last.ignoreKeyPress) { + last.keysyms[evt.keysym.keysym] = evt.keysym; + evt.type = 'keydown'; + next(evt); + } + break; + case 'keyup': + if (state.length === 0) { + return; + } + var idx = null; + // do we have a matching key tracked as being down? + for (var i = 0; i !== state.length; ++i) { + if (state[i].keyId === evt.keyId) { + idx = i; + break; + } + } + // if we couldn't find a match (it happens), assume it was the last key pressed + if (idx === null) { + idx = state.length - 1; + } + + var item = state.splice(idx, 1)[0]; + // for each keysym tracked by this key entry, clone the current event and override the keysym + for (var key in item.keysyms) { + var clone = (function(){ + function Clone(){} + return function (obj) { Clone.prototype=obj; return new Clone(); }; + }()); + var out = clone(evt); + out.keysym = item.keysyms[key]; + next(out); + } + break; + case 'releaseall': + for (var i = 0; i < state.length; ++i) { + for (var key in state[i].keysyms) { + var keysym = state[i].keysyms[key]; + next({keyId: 0, keysym: keysym, type: 'keyup'}); + } + } + state = []; + } + }; +} + +// Handles "escaping" of modifiers: if a char modifier is used to produce a keysym (such as AltGr-2 to generate an @), +// then the modifier must be "undone" before sending the @, and "redone" afterwards. +function EscapeModifiers(next) { + "use strict"; + return function(evt) { + if (evt.type !== 'keydown' || evt.escape === undefined) { + next(evt); + return; + } + // undo modifiers + for (var i = 0; i < evt.escape.length; ++i) { + next({type: 'keyup', keyId: 0, keysym: keysyms.lookup(evt.escape[i])}); + } + // send the character event + next(evt); + // redo modifiers + for (var i = 0; i < evt.escape.length; ++i) { + next({type: 'keydown', keyId: 0, keysym: keysyms.lookup(evt.escape[i])}); + } + }; +} diff --git a/noVNC/include/keysym.js b/noVNC/include/keysym.js new file mode 100644 index 0000000..a00d595 --- /dev/null +++ b/noVNC/include/keysym.js @@ -0,0 +1,376 @@ +var XK_VoidSymbol = 0xffffff, /* Void symbol */ + +XK_BackSpace = 0xff08, /* Back space, back char */ +XK_Tab = 0xff09, +XK_Linefeed = 0xff0a, /* Linefeed, LF */ +XK_Clear = 0xff0b, +XK_Return = 0xff0d, /* Return, enter */ +XK_Pause = 0xff13, /* Pause, hold */ +XK_Scroll_Lock = 0xff14, +XK_Sys_Req = 0xff15, +XK_Escape = 0xff1b, +XK_Delete = 0xffff, /* Delete, rubout */ + +/* Cursor control & motion */ + +XK_Home = 0xff50, +XK_Left = 0xff51, /* Move left, left arrow */ +XK_Up = 0xff52, /* Move up, up arrow */ +XK_Right = 0xff53, /* Move right, right arrow */ +XK_Down = 0xff54, /* Move down, down arrow */ +XK_Prior = 0xff55, /* Prior, previous */ +XK_Page_Up = 0xff55, +XK_Next = 0xff56, /* Next */ +XK_Page_Down = 0xff56, +XK_End = 0xff57, /* EOL */ +XK_Begin = 0xff58, /* BOL */ + + +/* Misc functions */ + +XK_Select = 0xff60, /* Select, mark */ +XK_Print = 0xff61, +XK_Execute = 0xff62, /* Execute, run, do */ +XK_Insert = 0xff63, /* Insert, insert here */ +XK_Undo = 0xff65, +XK_Redo = 0xff66, /* Redo, again */ +XK_Menu = 0xff67, +XK_Find = 0xff68, /* Find, search */ +XK_Cancel = 0xff69, /* Cancel, stop, abort, exit */ +XK_Help = 0xff6a, /* Help */ +XK_Break = 0xff6b, +XK_Mode_switch = 0xff7e, /* Character set switch */ +XK_script_switch = 0xff7e, /* Alias for mode_switch */ +XK_Num_Lock = 0xff7f, + +/* Keypad functions, keypad numbers cleverly chosen to map to ASCII */ + +XK_KP_Space = 0xff80, /* Space */ +XK_KP_Tab = 0xff89, +XK_KP_Enter = 0xff8d, /* Enter */ +XK_KP_F1 = 0xff91, /* PF1, KP_A, ... */ +XK_KP_F2 = 0xff92, +XK_KP_F3 = 0xff93, +XK_KP_F4 = 0xff94, +XK_KP_Home = 0xff95, +XK_KP_Left = 0xff96, +XK_KP_Up = 0xff97, +XK_KP_Right = 0xff98, +XK_KP_Down = 0xff99, +XK_KP_Prior = 0xff9a, +XK_KP_Page_Up = 0xff9a +XK_KP_Next = 0xff9b, +XK_KP_Page_Down = 0xff9b, +XK_KP_End = 0xff9c, +XK_KP_Begin = 0xff9d, +XK_KP_Insert = 0xff9e, +XK_KP_Delete = 0xff9f, +XK_KP_Equal = 0xffbd, /* Equals */ +XK_KP_Multiply = 0xffaa, +XK_KP_Add = 0xffab, +XK_KP_Separator = 0xffac, /* Separator, often comma */ +XK_KP_Subtract = 0xffad, +XK_KP_Decimal = 0xffae, +XK_KP_Divide = 0xffaf, + +XK_KP_0 = 0xffb0, +XK_KP_1 = 0xffb1, +XK_KP_2 = 0xffb2, +XK_KP_3 = 0xffb3, +XK_KP_4 = 0xffb4, +XK_KP_5 = 0xffb5, +XK_KP_6 = 0xffb6, +XK_KP_7 = 0xffb7, +XK_KP_8 = 0xffb8, +XK_KP_9 = 0xffb9, + +/* + * Auxiliary functions; note the duplicate definitions for left and right + * function keys; Sun keyboards and a few other manufacturers have such + * function key groups on the left and/or right sides of the keyboard. + * We've not found a keyboard with more than 35 function keys total. + */ + +XK_F1 = 0xffbe, +XK_F2 = 0xffbf, +XK_F3 = 0xffc0, +XK_F4 = 0xffc1, +XK_F5 = 0xffc2, +XK_F6 = 0xffc3, +XK_F7 = 0xffc4, +XK_F8 = 0xffc5, +XK_F9 = 0xffc6, +XK_F10 = 0xffc7, +XK_F11 = 0xffc8, +XK_L1 = 0xffc8, +XK_F12 = 0xffc9, +XK_L2 = 0xffc9, +XK_F13 = 0xffca, +XK_L3 = 0xffca, +XK_F14 = 0xffcb, +XK_L4 = 0xffcb, +XK_F15 = 0xffcc, +XK_L5 = 0xffcc, +XK_F16 = 0xffcd, +XK_L6 = 0xffcd, +XK_F17 = 0xffce, +XK_L7 = 0xffce, +XK_F18 = 0xffcf, +XK_L8 = 0xffcf, +XK_F19 = 0xffd0, +XK_L9 = 0xffd0, +XK_F20 = 0xffd1, +XK_L10 = 0xffd1, +XK_F21 = 0xffd2, +XK_R1 = 0xffd2, +XK_F22 = 0xffd3, +XK_R2 = 0xffd3, +XK_F23 = 0xffd4, +XK_R3 = 0xffd4, +XK_F24 = 0xffd5, +XK_R4 = 0xffd5, +XK_F25 = 0xffd6, +XK_R5 = 0xffd6, +XK_F26 = 0xffd7, +XK_R6 = 0xffd7, +XK_F27 = 0xffd8, +XK_R7 = 0xffd8, +XK_F28 = 0xffd9, +XK_R8 = 0xffd9, +XK_F29 = 0xffda, +XK_R9 = 0xffda, +XK_F30 = 0xffdb, +XK_R10 = 0xffdb, +XK_F31 = 0xffdc, +XK_R11 = 0xffdc, +XK_F32 = 0xffdd, +XK_R12 = 0xffdd, +XK_F33 = 0xffde, +XK_R13 = 0xffde, +XK_F34 = 0xffdf, +XK_R14 = 0xffdf, +XK_F35 = 0xffe0, +XK_R15 = 0xffe0, + +/* Modifiers */ + +XK_Shift_L = 0xffe1, /* Left shift */ +XK_Shift_R = 0xffe2, /* Right shift */ +XK_Control_L = 0xffe3, /* Left control */ +XK_Control_R = 0xffe4, /* Right control */ +XK_Caps_Lock = 0xffe5, /* Caps lock */ +XK_Shift_Lock = 0xffe6, /* Shift lock */ + +XK_Meta_L = 0xffe7, /* Left meta */ +XK_Meta_R = 0xffe8, /* Right meta */ +XK_Alt_L = 0xffe9, /* Left alt */ +XK_Alt_R = 0xffea, /* Right alt */ +XK_Super_L = 0xffeb, /* Left super */ +XK_Super_R = 0xffec, /* Right super */ +XK_Hyper_L = 0xffed, /* Left hyper */ +XK_Hyper_R = 0xffee, /* Right hyper */ + +/* + * Latin 1 + * (ISO/IEC 8859-1 = Unicode U+0020..U+00FF) + * Byte 3 = 0 + */ + +XK_space = 0x0020, /* U+0020 SPACE */ +XK_exclam = 0x0021, /* U+0021 EXCLAMATION MARK */ +XK_quotedbl = 0x0022, /* U+0022 QUOTATION MARK */ +XK_numbersign = 0x0023, /* U+0023 NUMBER SIGN */ +XK_dollar = 0x0024, /* U+0024 DOLLAR SIGN */ +XK_percent = 0x0025, /* U+0025 PERCENT SIGN */ +XK_ampersand = 0x0026, /* U+0026 AMPERSAND */ +XK_apostrophe = 0x0027, /* U+0027 APOSTROPHE */ +XK_quoteright = 0x0027, /* deprecated */ +XK_parenleft = 0x0028, /* U+0028 LEFT PARENTHESIS */ +XK_parenright = 0x0029, /* U+0029 RIGHT PARENTHESIS */ +XK_asterisk = 0x002a, /* U+002A ASTERISK */ +XK_plus = 0x002b, /* U+002B PLUS SIGN */ +XK_comma = 0x002c, /* U+002C COMMA */ +XK_minus = 0x002d, /* U+002D HYPHEN-MINUS */ +XK_period = 0x002e, /* U+002E FULL STOP */ +XK_slash = 0x002f, /* U+002F SOLIDUS */ +XK_0 = 0x0030, /* U+0030 DIGIT ZERO */ +XK_1 = 0x0031, /* U+0031 DIGIT ONE */ +XK_2 = 0x0032, /* U+0032 DIGIT TWO */ +XK_3 = 0x0033, /* U+0033 DIGIT THREE */ +XK_4 = 0x0034, /* U+0034 DIGIT FOUR */ +XK_5 = 0x0035, /* U+0035 DIGIT FIVE */ +XK_6 = 0x0036, /* U+0036 DIGIT SIX */ +XK_7 = 0x0037, /* U+0037 DIGIT SEVEN */ +XK_8 = 0x0038, /* U+0038 DIGIT EIGHT */ +XK_9 = 0x0039, /* U+0039 DIGIT NINE */ +XK_colon = 0x003a, /* U+003A COLON */ +XK_semicolon = 0x003b, /* U+003B SEMICOLON */ +XK_less = 0x003c, /* U+003C LESS-THAN SIGN */ +XK_equal = 0x003d, /* U+003D EQUALS SIGN */ +XK_greater = 0x003e, /* U+003E GREATER-THAN SIGN */ +XK_question = 0x003f, /* U+003F QUESTION MARK */ +XK_at = 0x0040, /* U+0040 COMMERCIAL AT */ +XK_A = 0x0041, /* U+0041 LATIN CAPITAL LETTER A */ +XK_B = 0x0042, /* U+0042 LATIN CAPITAL LETTER B */ +XK_C = 0x0043, /* U+0043 LATIN CAPITAL LETTER C */ +XK_D = 0x0044, /* U+0044 LATIN CAPITAL LETTER D */ +XK_E = 0x0045, /* U+0045 LATIN CAPITAL LETTER E */ +XK_F = 0x0046, /* U+0046 LATIN CAPITAL LETTER F */ +XK_G = 0x0047, /* U+0047 LATIN CAPITAL LETTER G */ +XK_H = 0x0048, /* U+0048 LATIN CAPITAL LETTER H */ +XK_I = 0x0049, /* U+0049 LATIN CAPITAL LETTER I */ +XK_J = 0x004a, /* U+004A LATIN CAPITAL LETTER J */ +XK_K = 0x004b, /* U+004B LATIN CAPITAL LETTER K */ +XK_L = 0x004c, /* U+004C LATIN CAPITAL LETTER L */ +XK_M = 0x004d, /* U+004D LATIN CAPITAL LETTER M */ +XK_N = 0x004e, /* U+004E LATIN CAPITAL LETTER N */ +XK_O = 0x004f, /* U+004F LATIN CAPITAL LETTER O */ +XK_P = 0x0050, /* U+0050 LATIN CAPITAL LETTER P */ +XK_Q = 0x0051, /* U+0051 LATIN CAPITAL LETTER Q */ +XK_R = 0x0052, /* U+0052 LATIN CAPITAL LETTER R */ +XK_S = 0x0053, /* U+0053 LATIN CAPITAL LETTER S */ +XK_T = 0x0054, /* U+0054 LATIN CAPITAL LETTER T */ +XK_U = 0x0055, /* U+0055 LATIN CAPITAL LETTER U */ +XK_V = 0x0056, /* U+0056 LATIN CAPITAL LETTER V */ +XK_W = 0x0057, /* U+0057 LATIN CAPITAL LETTER W */ +XK_X = 0x0058, /* U+0058 LATIN CAPITAL LETTER X */ +XK_Y = 0x0059, /* U+0059 LATIN CAPITAL LETTER Y */ +XK_Z = 0x005a, /* U+005A LATIN CAPITAL LETTER Z */ +XK_bracketleft = 0x005b, /* U+005B LEFT SQUARE BRACKET */ +XK_backslash = 0x005c, /* U+005C REVERSE SOLIDUS */ +XK_bracketright = 0x005d, /* U+005D RIGHT SQUARE BRACKET */ +XK_asciicircum = 0x005e, /* U+005E CIRCUMFLEX ACCENT */ +XK_underscore = 0x005f, /* U+005F LOW LINE */ +XK_grave = 0x0060, /* U+0060 GRAVE ACCENT */ +XK_quoteleft = 0x0060, /* deprecated */ +XK_a = 0x0061, /* U+0061 LATIN SMALL LETTER A */ +XK_b = 0x0062, /* U+0062 LATIN SMALL LETTER B */ +XK_c = 0x0063, /* U+0063 LATIN SMALL LETTER C */ +XK_d = 0x0064, /* U+0064 LATIN SMALL LETTER D */ +XK_e = 0x0065, /* U+0065 LATIN SMALL LETTER E */ +XK_f = 0x0066, /* U+0066 LATIN SMALL LETTER F */ +XK_g = 0x0067, /* U+0067 LATIN SMALL LETTER G */ +XK_h = 0x0068, /* U+0068 LATIN SMALL LETTER H */ +XK_i = 0x0069, /* U+0069 LATIN SMALL LETTER I */ +XK_j = 0x006a, /* U+006A LATIN SMALL LETTER J */ +XK_k = 0x006b, /* U+006B LATIN SMALL LETTER K */ +XK_l = 0x006c, /* U+006C LATIN SMALL LETTER L */ +XK_m = 0x006d, /* U+006D LATIN SMALL LETTER M */ +XK_n = 0x006e, /* U+006E LATIN SMALL LETTER N */ +XK_o = 0x006f, /* U+006F LATIN SMALL LETTER O */ +XK_p = 0x0070, /* U+0070 LATIN SMALL LETTER P */ +XK_q = 0x0071, /* U+0071 LATIN SMALL LETTER Q */ +XK_r = 0x0072, /* U+0072 LATIN SMALL LETTER R */ +XK_s = 0x0073, /* U+0073 LATIN SMALL LETTER S */ +XK_t = 0x0074, /* U+0074 LATIN SMALL LETTER T */ +XK_u = 0x0075, /* U+0075 LATIN SMALL LETTER U */ +XK_v = 0x0076, /* U+0076 LATIN SMALL LETTER V */ +XK_w = 0x0077, /* U+0077 LATIN SMALL LETTER W */ +XK_x = 0x0078, /* U+0078 LATIN SMALL LETTER X */ +XK_y = 0x0079, /* U+0079 LATIN SMALL LETTER Y */ +XK_z = 0x007a, /* U+007A LATIN SMALL LETTER Z */ +XK_braceleft = 0x007b, /* U+007B LEFT CURLY BRACKET */ +XK_bar = 0x007c, /* U+007C VERTICAL LINE */ +XK_braceright = 0x007d, /* U+007D RIGHT CURLY BRACKET */ +XK_asciitilde = 0x007e, /* U+007E TILDE */ + +XK_nobreakspace = 0x00a0, /* U+00A0 NO-BREAK SPACE */ +XK_exclamdown = 0x00a1, /* U+00A1 INVERTED EXCLAMATION MARK */ +XK_cent = 0x00a2, /* U+00A2 CENT SIGN */ +XK_sterling = 0x00a3, /* U+00A3 POUND SIGN */ +XK_currency = 0x00a4, /* U+00A4 CURRENCY SIGN */ +XK_yen = 0x00a5, /* U+00A5 YEN SIGN */ +XK_brokenbar = 0x00a6, /* U+00A6 BROKEN BAR */ +XK_section = 0x00a7, /* U+00A7 SECTION SIGN */ +XK_diaeresis = 0x00a8, /* U+00A8 DIAERESIS */ +XK_copyright = 0x00a9, /* U+00A9 COPYRIGHT SIGN */ +XK_ordfeminine = 0x00aa, /* U+00AA FEMININE ORDINAL INDICATOR */ +XK_guillemotleft = 0x00ab, /* U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ +XK_notsign = 0x00ac, /* U+00AC NOT SIGN */ +XK_hyphen = 0x00ad, /* U+00AD SOFT HYPHEN */ +XK_registered = 0x00ae, /* U+00AE REGISTERED SIGN */ +XK_macron = 0x00af, /* U+00AF MACRON */ +XK_degree = 0x00b0, /* U+00B0 DEGREE SIGN */ +XK_plusminus = 0x00b1, /* U+00B1 PLUS-MINUS SIGN */ +XK_twosuperior = 0x00b2, /* U+00B2 SUPERSCRIPT TWO */ +XK_threesuperior = 0x00b3, /* U+00B3 SUPERSCRIPT THREE */ +XK_acute = 0x00b4, /* U+00B4 ACUTE ACCENT */ +XK_mu = 0x00b5, /* U+00B5 MICRO SIGN */ +XK_paragraph = 0x00b6, /* U+00B6 PILCROW SIGN */ +XK_periodcentered = 0x00b7, /* U+00B7 MIDDLE DOT */ +XK_cedilla = 0x00b8, /* U+00B8 CEDILLA */ +XK_onesuperior = 0x00b9, /* U+00B9 SUPERSCRIPT ONE */ +XK_masculine = 0x00ba, /* U+00BA MASCULINE ORDINAL INDICATOR */ +XK_guillemotright = 0x00bb, /* U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ +XK_onequarter = 0x00bc, /* U+00BC VULGAR FRACTION ONE QUARTER */ +XK_onehalf = 0x00bd, /* U+00BD VULGAR FRACTION ONE HALF */ +XK_threequarters = 0x00be, /* U+00BE VULGAR FRACTION THREE QUARTERS */ +XK_questiondown = 0x00bf, /* U+00BF INVERTED QUESTION MARK */ +XK_Agrave = 0x00c0, /* U+00C0 LATIN CAPITAL LETTER A WITH GRAVE */ +XK_Aacute = 0x00c1, /* U+00C1 LATIN CAPITAL LETTER A WITH ACUTE */ +XK_Acircumflex = 0x00c2, /* U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ +XK_Atilde = 0x00c3, /* U+00C3 LATIN CAPITAL LETTER A WITH TILDE */ +XK_Adiaeresis = 0x00c4, /* U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS */ +XK_Aring = 0x00c5, /* U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE */ +XK_AE = 0x00c6, /* U+00C6 LATIN CAPITAL LETTER AE */ +XK_Ccedilla = 0x00c7, /* U+00C7 LATIN CAPITAL LETTER C WITH CEDILLA */ +XK_Egrave = 0x00c8, /* U+00C8 LATIN CAPITAL LETTER E WITH GRAVE */ +XK_Eacute = 0x00c9, /* U+00C9 LATIN CAPITAL LETTER E WITH ACUTE */ +XK_Ecircumflex = 0x00ca, /* U+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ +XK_Ediaeresis = 0x00cb, /* U+00CB LATIN CAPITAL LETTER E WITH DIAERESIS */ +XK_Igrave = 0x00cc, /* U+00CC LATIN CAPITAL LETTER I WITH GRAVE */ +XK_Iacute = 0x00cd, /* U+00CD LATIN CAPITAL LETTER I WITH ACUTE */ +XK_Icircumflex = 0x00ce, /* U+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ +XK_Idiaeresis = 0x00cf, /* U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS */ +XK_ETH = 0x00d0, /* U+00D0 LATIN CAPITAL LETTER ETH */ +XK_Eth = 0x00d0, /* deprecated */ +XK_Ntilde = 0x00d1, /* U+00D1 LATIN CAPITAL LETTER N WITH TILDE */ +XK_Ograve = 0x00d2, /* U+00D2 LATIN CAPITAL LETTER O WITH GRAVE */ +XK_Oacute = 0x00d3, /* U+00D3 LATIN CAPITAL LETTER O WITH ACUTE */ +XK_Ocircumflex = 0x00d4, /* U+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ +XK_Otilde = 0x00d5, /* U+00D5 LATIN CAPITAL LETTER O WITH TILDE */ +XK_Odiaeresis = 0x00d6, /* U+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS */ +XK_multiply = 0x00d7, /* U+00D7 MULTIPLICATION SIGN */ +XK_Oslash = 0x00d8, /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */ +XK_Ooblique = 0x00d8, /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */ +XK_Ugrave = 0x00d9, /* U+00D9 LATIN CAPITAL LETTER U WITH GRAVE */ +XK_Uacute = 0x00da, /* U+00DA LATIN CAPITAL LETTER U WITH ACUTE */ +XK_Ucircumflex = 0x00db, /* U+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ +XK_Udiaeresis = 0x00dc, /* U+00DC LATIN CAPITAL LETTER U WITH DIAERESIS */ +XK_Yacute = 0x00dd, /* U+00DD LATIN CAPITAL LETTER Y WITH ACUTE */ +XK_THORN = 0x00de, /* U+00DE LATIN CAPITAL LETTER THORN */ +XK_Thorn = 0x00de, /* deprecated */ +XK_ssharp = 0x00df, /* U+00DF LATIN SMALL LETTER SHARP S */ +XK_agrave = 0x00e0, /* U+00E0 LATIN SMALL LETTER A WITH GRAVE */ +XK_aacute = 0x00e1, /* U+00E1 LATIN SMALL LETTER A WITH ACUTE */ +XK_acircumflex = 0x00e2, /* U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX */ +XK_atilde = 0x00e3, /* U+00E3 LATIN SMALL LETTER A WITH TILDE */ +XK_adiaeresis = 0x00e4, /* U+00E4 LATIN SMALL LETTER A WITH DIAERESIS */ +XK_aring = 0x00e5, /* U+00E5 LATIN SMALL LETTER A WITH RING ABOVE */ +XK_ae = 0x00e6, /* U+00E6 LATIN SMALL LETTER AE */ +XK_ccedilla = 0x00e7, /* U+00E7 LATIN SMALL LETTER C WITH CEDILLA */ +XK_egrave = 0x00e8, /* U+00E8 LATIN SMALL LETTER E WITH GRAVE */ +XK_eacute = 0x00e9, /* U+00E9 LATIN SMALL LETTER E WITH ACUTE */ +XK_ecircumflex = 0x00ea, /* U+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX */ +XK_ediaeresis = 0x00eb, /* U+00EB LATIN SMALL LETTER E WITH DIAERESIS */ +XK_igrave = 0x00ec, /* U+00EC LATIN SMALL LETTER I WITH GRAVE */ +XK_iacute = 0x00ed, /* U+00ED LATIN SMALL LETTER I WITH ACUTE */ +XK_icircumflex = 0x00ee, /* U+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX */ +XK_idiaeresis = 0x00ef, /* U+00EF LATIN SMALL LETTER I WITH DIAERESIS */ +XK_eth = 0x00f0, /* U+00F0 LATIN SMALL LETTER ETH */ +XK_ntilde = 0x00f1, /* U+00F1 LATIN SMALL LETTER N WITH TILDE */ +XK_ograve = 0x00f2, /* U+00F2 LATIN SMALL LETTER O WITH GRAVE */ +XK_oacute = 0x00f3, /* U+00F3 LATIN SMALL LETTER O WITH ACUTE */ +XK_ocircumflex = 0x00f4, /* U+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX */ +XK_otilde = 0x00f5, /* U+00F5 LATIN SMALL LETTER O WITH TILDE */ +XK_odiaeresis = 0x00f6, /* U+00F6 LATIN SMALL LETTER O WITH DIAERESIS */ +XK_division = 0x00f7, /* U+00F7 DIVISION SIGN */ +XK_oslash = 0x00f8, /* U+00F8 LATIN SMALL LETTER O WITH STROKE */ +XK_ooblique = 0x00f8, /* U+00F8 LATIN SMALL LETTER O WITH STROKE */ +XK_ugrave = 0x00f9, /* U+00F9 LATIN SMALL LETTER U WITH GRAVE */ +XK_uacute = 0x00fa, /* U+00FA LATIN SMALL LETTER U WITH ACUTE */ +XK_ucircumflex = 0x00fb, /* U+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX */ +XK_udiaeresis = 0x00fc, /* U+00FC LATIN SMALL LETTER U WITH DIAERESIS */ +XK_yacute = 0x00fd, /* U+00FD LATIN SMALL LETTER Y WITH ACUTE */ +XK_thorn = 0x00fe, /* U+00FE LATIN SMALL LETTER THORN */ +XK_ydiaeresis = 0x00ff; /* U+00FF LATIN SMALL LETTER Y WITH DIAERESIS */ diff --git a/noVNC/include/keysymdef.js b/noVNC/include/keysymdef.js new file mode 100644 index 0000000..f94445c --- /dev/null +++ b/noVNC/include/keysymdef.js @@ -0,0 +1,15 @@ +// This file describes mappings from Unicode codepoints to the keysym values +// (and optionally, key names) expected by the RFB protocol +// How this file was generated: +// node /Users/jalf/dev/mi/novnc/utils/parse.js /opt/X11/include/X11/keysymdef.h +var keysyms = (function(){ + "use strict"; + var keynames = null; + var codepoints = {"32":32,"33":33,"34":34,"35":35,"36":36,"37":37,"38":38,"39":39,"40":40,"41":41,"42":42,"43":43,"44":44,"45":45,"46":46,"47":47,"48":48,"49":49,"50":50,"51":51,"52":52,"53":53,"54":54,"55":55,"56":56,"57":57,"58":58,"59":59,"60":60,"61":61,"62":62,"63":63,"64":64,"65":65,"66":66,"67":67,"68":68,"69":69,"70":70,"71":71,"72":72,"73":73,"74":74,"75":75,"76":76,"77":77,"78":78,"79":79,"80":80,"81":81,"82":82,"83":83,"84":84,"85":85,"86":86,"87":87,"88":88,"89":89,"90":90,"91":91,"92":92,"93":93,"94":94,"95":95,"96":96,"97":97,"98":98,"99":99,"100":100,"101":101,"102":102,"103":103,"104":104,"105":105,"106":106,"107":107,"108":108,"109":109,"110":110,"111":111,"112":112,"113":113,"114":114,"115":115,"116":116,"117":117,"118":118,"119":119,"120":120,"121":121,"122":122,"123":123,"124":124,"125":125,"126":126,"160":160,"161":161,"162":162,"163":163,"164":164,"165":165,"166":166,"167":167,"168":168,"169":169,"170":170,"171":171,"172":172,"173":173,"174":174,"175":175,"176":176,"177":177,"178":178,"179":179,"180":180,"181":181,"182":182,"183":183,"184":184,"185":185,"186":186,"187":187,"188":188,"189":189,"190":190,"191":191,"192":192,"193":193,"194":194,"195":195,"196":196,"197":197,"198":198,"199":199,"200":200,"201":201,"202":202,"203":203,"204":204,"205":205,"206":206,"207":207,"208":208,"209":209,"210":210,"211":211,"212":212,"213":213,"214":214,"215":215,"216":216,"217":217,"218":218,"219":219,"220":220,"221":221,"222":222,"223":223,"224":224,"225":225,"226":226,"227":227,"228":228,"229":229,"230":230,"231":231,"232":232,"233":233,"234":234,"235":235,"236":236,"237":237,"238":238,"239":239,"240":240,"241":241,"242":242,"243":243,"244":244,"245":245,"246":246,"247":247,"248":248,"249":249,"250":250,"251":251,"252":252,"253":253,"254":254,"255":255,"256":960,"257":992,"258":451,"259":483,"260":417,"261":433,"262":454,"263":486,"264":710,"265":742,"266":709,"267":741,"268":456,"269":488,"270":463,"271":495,"272":464,"273":496,"274":938,"275":954,"278":972,"279":1004,"280":458,"281":490,"282":460,"283":492,"284":728,"285":760,"286":683,"287":699,"288":725,"289":757,"290":939,"291":955,"292":678,"293":694,"294":673,"295":689,"296":933,"297":949,"298":975,"299":1007,"300":16777516,"301":16777517,"302":967,"303":999,"304":681,"305":697,"308":684,"309":700,"310":979,"311":1011,"312":930,"313":453,"314":485,"315":934,"316":950,"317":421,"318":437,"321":419,"322":435,"323":465,"324":497,"325":977,"326":1009,"327":466,"328":498,"330":957,"331":959,"332":978,"333":1010,"336":469,"337":501,"338":5052,"339":5053,"340":448,"341":480,"342":931,"343":947,"344":472,"345":504,"346":422,"347":438,"348":734,"349":766,"350":426,"351":442,"352":425,"353":441,"354":478,"355":510,"356":427,"357":443,"358":940,"359":956,"360":989,"361":1021,"362":990,"363":1022,"364":733,"365":765,"366":473,"367":505,"368":475,"369":507,"370":985,"371":1017,"372":16777588,"373":16777589,"374":16777590,"375":16777591,"376":5054,"377":428,"378":444,"379":431,"380":447,"381":430,"382":446,"399":16777615,"402":2294,"415":16777631,"416":16777632,"417":16777633,"431":16777647,"432":16777648,"437":16777653,"438":16777654,"439":16777655,"466":16777681,"486":16777702,"487":16777703,"601":16777817,"629":16777845,"658":16777874,"711":439,"728":418,"729":511,"731":434,"733":445,"901":1966,"902":1953,"904":1954,"905":1955,"906":1956,"908":1959,"910":1960,"911":1963,"912":1974,"913":1985,"914":1986,"915":1987,"916":1988,"917":1989,"918":1990,"919":1991,"920":1992,"921":1993,"922":1994,"923":1995,"924":1996,"925":1997,"926":1998,"927":1999,"928":2000,"929":2001,"931":2002,"932":2004,"933":2005,"934":2006,"935":2007,"936":2008,"937":2009,"938":1957,"939":1961,"940":1969,"941":1970,"942":1971,"943":1972,"944":1978,"945":2017,"946":2018,"947":2019,"948":2020,"949":2021,"950":2022,"951":2023,"952":2024,"953":2025,"954":2026,"955":2027,"956":2028,"957":2029,"958":2030,"959":2031,"960":2032,"961":2033,"962":2035,"963":2034,"964":2036,"965":2037,"966":2038,"967":2039,"968":2040,"969":2041,"970":1973,"971":1977,"972":1975,"973":1976,"974":1979,"1025":1715,"1026":1713,"1027":1714,"1028":1716,"1029":1717,"1030":1718,"1031":1719,"1032":1720,"1033":1721,"1034":1722,"1035":1723,"1036":1724,"1038":1726,"1039":1727,"1040":1761,"1041":1762,"1042":1783,"1043":1767,"1044":1764,"1045":1765,"1046":1782,"1047":1786,"1048":1769,"1049":1770,"1050":1771,"1051":1772,"1052":1773,"1053":1774,"1054":1775,"1055":1776,"1056":1778,"1057":1779,"1058":1780,"1059":1781,"1060":1766,"1061":1768,"1062":1763,"1063":1790,"1064":1787,"1065":1789,"1066":1791,"1067":1785,"1068":1784,"1069":1788,"1070":1760,"1071":1777,"1072":1729,"1073":1730,"1074":1751,"1075":1735,"1076":1732,"1077":1733,"1078":1750,"1079":1754,"1080":1737,"1081":1738,"1082":1739,"1083":1740,"1084":1741,"1085":1742,"1086":1743,"1087":1744,"1088":1746,"1089":1747,"1090":1748,"1091":1749,"1092":1734,"1093":1736,"1094":1731,"1095":1758,"1096":1755,"1097":1757,"1098":1759,"1099":1753,"1100":1752,"1101":1756,"1102":1728,"1103":1745,"1105":1699,"1106":1697,"1107":1698,"1108":1700,"1109":1701,"1110":1702,"1111":1703,"1112":1704,"1113":1705,"1114":1706,"1115":1707,"1116":1708,"1118":1710,"1119":1711,"1168":1725,"1169":1709,"1170":16778386,"1171":16778387,"1174":16778390,"1175":16778391,"1178":16778394,"1179":16778395,"1180":16778396,"1181":16778397,"1186":16778402,"1187":16778403,"1198":16778414,"1199":16778415,"1200":16778416,"1201":16778417,"1202":16778418,"1203":16778419,"1206":16778422,"1207":16778423,"1208":16778424,"1209":16778425,"1210":16778426,"1211":16778427,"1240":16778456,"1241":16778457,"1250":16778466,"1251":16778467,"1256":16778472,"1257":16778473,"1262":16778478,"1263":16778479,"1329":16778545,"1330":16778546,"1331":16778547,"1332":16778548,"1333":16778549,"1334":16778550,"1335":16778551,"1336":16778552,"1337":16778553,"1338":16778554,"1339":16778555,"1340":16778556,"1341":16778557,"1342":16778558,"1343":16778559,"1344":16778560,"1345":16778561,"1346":16778562,"1347":16778563,"1348":16778564,"1349":16778565,"1350":16778566,"1351":16778567,"1352":16778568,"1353":16778569,"1354":16778570,"1355":16778571,"1356":16778572,"1357":16778573,"1358":16778574,"1359":16778575,"1360":16778576,"1361":16778577,"1362":16778578,"1363":16778579,"1364":16778580,"1365":16778581,"1366":16778582,"1370":16778586,"1371":16778587,"1372":16778588,"1373":16778589,"1374":16778590,"1377":16778593,"1378":16778594,"1379":16778595,"1380":16778596,"1381":16778597,"1382":16778598,"1383":16778599,"1384":16778600,"1385":16778601,"1386":16778602,"1387":16778603,"1388":16778604,"1389":16778605,"1390":16778606,"1391":16778607,"1392":16778608,"1393":16778609,"1394":16778610,"1395":16778611,"1396":16778612,"1397":16778613,"1398":16778614,"1399":16778615,"1400":16778616,"1401":16778617,"1402":16778618,"1403":16778619,"1404":16778620,"1405":16778621,"1406":16778622,"1407":16778623,"1408":16778624,"1409":16778625,"1410":16778626,"1411":16778627,"1412":16778628,"1413":16778629,"1414":16778630,"1415":16778631,"1417":16778633,"1418":16778634,"1488":3296,"1489":3297,"1490":3298,"1491":3299,"1492":3300,"1493":3301,"1494":3302,"1495":3303,"1496":3304,"1497":3305,"1498":3306,"1499":3307,"1500":3308,"1501":3309,"1502":3310,"1503":3311,"1504":3312,"1505":3313,"1506":3314,"1507":3315,"1508":3316,"1509":3317,"1510":3318,"1511":3319,"1512":3320,"1513":3321,"1514":3322,"1548":1452,"1563":1467,"1567":1471,"1569":1473,"1570":1474,"1571":1475,"1572":1476,"1573":1477,"1574":1478,"1575":1479,"1576":1480,"1577":1481,"1578":1482,"1579":1483,"1580":1484,"1581":1485,"1582":1486,"1583":1487,"1584":1488,"1585":1489,"1586":1490,"1587":1491,"1588":1492,"1589":1493,"1590":1494,"1591":1495,"1592":1496,"1593":1497,"1594":1498,"1600":1504,"1601":1505,"1602":1506,"1603":1507,"1604":1508,"1605":1509,"1606":1510,"1607":1511,"1608":1512,"1609":1513,"1610":1514,"1611":1515,"1612":1516,"1613":1517,"1614":1518,"1615":1519,"1616":1520,"1617":1521,"1618":1522,"1619":16778835,"1620":16778836,"1621":16778837,"1632":16778848,"1633":16778849,"1634":16778850,"1635":16778851,"1636":16778852,"1637":16778853,"1638":16778854,"1639":16778855,"1640":16778856,"1641":16778857,"1642":16778858,"1648":16778864,"1657":16778873,"1662":16778878,"1670":16778886,"1672":16778888,"1681":16778897,"1688":16778904,"1700":16778916,"1705":16778921,"1711":16778927,"1722":16778938,"1726":16778942,"1729":16778945,"1740":16778956,"1746":16778962,"1748":16778964,"1776":16778992,"1777":16778993,"1778":16778994,"1779":16778995,"1780":16778996,"1781":16778997,"1782":16778998,"1783":16778999,"1784":16779000,"1785":16779001,"3458":16780674,"3459":16780675,"3461":16780677,"3462":16780678,"3463":16780679,"3464":16780680,"3465":16780681,"3466":16780682,"3467":16780683,"3468":16780684,"3469":16780685,"3470":16780686,"3471":16780687,"3472":16780688,"3473":16780689,"3474":16780690,"3475":16780691,"3476":16780692,"3477":16780693,"3478":16780694,"3482":16780698,"3483":16780699,"3484":16780700,"3485":16780701,"3486":16780702,"3487":16780703,"3488":16780704,"3489":16780705,"3490":16780706,"3491":16780707,"3492":16780708,"3493":16780709,"3494":16780710,"3495":16780711,"3496":16780712,"3497":16780713,"3498":16780714,"3499":16780715,"3500":16780716,"3501":16780717,"3502":16780718,"3503":16780719,"3504":16780720,"3505":16780721,"3507":16780723,"3508":16780724,"3509":16780725,"3510":16780726,"3511":16780727,"3512":16780728,"3513":16780729,"3514":16780730,"3515":16780731,"3517":16780733,"3520":16780736,"3521":16780737,"3522":16780738,"3523":16780739,"3524":16780740,"3525":16780741,"3526":16780742,"3530":16780746,"3535":16780751,"3536":16780752,"3537":16780753,"3538":16780754,"3539":16780755,"3540":16780756,"3542":16780758,"3544":16780760,"3545":16780761,"3546":16780762,"3547":16780763,"3548":16780764,"3549":16780765,"3550":16780766,"3551":16780767,"3570":16780786,"3571":16780787,"3572":16780788,"3585":3489,"3586":3490,"3587":3491,"3588":3492,"3589":3493,"3590":3494,"3591":3495,"3592":3496,"3593":3497,"3594":3498,"3595":3499,"3596":3500,"3597":3501,"3598":3502,"3599":3503,"3600":3504,"3601":3505,"3602":3506,"3603":3507,"3604":3508,"3605":3509,"3606":3510,"3607":3511,"3608":3512,"3609":3513,"3610":3514,"3611":3515,"3612":3516,"3613":3517,"3614":3518,"3615":3519,"3616":3520,"3617":3521,"3618":3522,"3619":3523,"3620":3524,"3621":3525,"3622":3526,"3623":3527,"3624":3528,"3625":3529,"3626":3530,"3627":3531,"3628":3532,"3629":3533,"3630":3534,"3631":3535,"3632":3536,"3633":3537,"3634":3538,"3635":3539,"3636":3540,"3637":3541,"3638":3542,"3639":3543,"3640":3544,"3641":3545,"3642":3546,"3647":3551,"3648":3552,"3649":3553,"3650":3554,"3651":3555,"3652":3556,"3653":3557,"3654":3558,"3655":3559,"3656":3560,"3657":3561,"3658":3562,"3659":3563,"3660":3564,"3661":3565,"3664":3568,"3665":3569,"3666":3570,"3667":3571,"3668":3572,"3669":3573,"3670":3574,"3671":3575,"3672":3576,"3673":3577,"4304":16781520,"4305":16781521,"4306":16781522,"4307":16781523,"4308":16781524,"4309":16781525,"4310":16781526,"4311":16781527,"4312":16781528,"4313":16781529,"4314":16781530,"4315":16781531,"4316":16781532,"4317":16781533,"4318":16781534,"4319":16781535,"4320":16781536,"4321":16781537,"4322":16781538,"4323":16781539,"4324":16781540,"4325":16781541,"4326":16781542,"4327":16781543,"4328":16781544,"4329":16781545,"4330":16781546,"4331":16781547,"4332":16781548,"4333":16781549,"4334":16781550,"4335":16781551,"4336":16781552,"4337":16781553,"4338":16781554,"4339":16781555,"4340":16781556,"4341":16781557,"4342":16781558,"7682":16784898,"7683":16784899,"7690":16784906,"7691":16784907,"7710":16784926,"7711":16784927,"7734":16784950,"7735":16784951,"7744":16784960,"7745":16784961,"7766":16784982,"7767":16784983,"7776":16784992,"7777":16784993,"7786":16785002,"7787":16785003,"7808":16785024,"7809":16785025,"7810":16785026,"7811":16785027,"7812":16785028,"7813":16785029,"7818":16785034,"7819":16785035,"7840":16785056,"7841":16785057,"7842":16785058,"7843":16785059,"7844":16785060,"7845":16785061,"7846":16785062,"7847":16785063,"7848":16785064,"7849":16785065,"7850":16785066,"7851":16785067,"7852":16785068,"7853":16785069,"7854":16785070,"7855":16785071,"7856":16785072,"7857":16785073,"7858":16785074,"7859":16785075,"7860":16785076,"7861":16785077,"7862":16785078,"7863":16785079,"7864":16785080,"7865":16785081,"7866":16785082,"7867":16785083,"7868":16785084,"7869":16785085,"7870":16785086,"7871":16785087,"7872":16785088,"7873":16785089,"7874":16785090,"7875":16785091,"7876":16785092,"7877":16785093,"7878":16785094,"7879":16785095,"7880":16785096,"7881":16785097,"7882":16785098,"7883":16785099,"7884":16785100,"7885":16785101,"7886":16785102,"7887":16785103,"7888":16785104,"7889":16785105,"7890":16785106,"7891":16785107,"7892":16785108,"7893":16785109,"7894":16785110,"7895":16785111,"7896":16785112,"7897":16785113,"7898":16785114,"7899":16785115,"7900":16785116,"7901":16785117,"7902":16785118,"7903":16785119,"7904":16785120,"7905":16785121,"7906":16785122,"7907":16785123,"7908":16785124,"7909":16785125,"7910":16785126,"7911":16785127,"7912":16785128,"7913":16785129,"7914":16785130,"7915":16785131,"7916":16785132,"7917":16785133,"7918":16785134,"7919":16785135,"7920":16785136,"7921":16785137,"7922":16785138,"7923":16785139,"7924":16785140,"7925":16785141,"7926":16785142,"7927":16785143,"7928":16785144,"7929":16785145,"8194":2722,"8195":2721,"8196":2723,"8197":2724,"8199":2725,"8200":2726,"8201":2727,"8202":2728,"8210":2747,"8211":2730,"8212":2729,"8213":1967,"8215":3295,"8216":2768,"8217":2769,"8218":2813,"8220":2770,"8221":2771,"8222":2814,"8224":2801,"8225":2802,"8226":2790,"8229":2735,"8230":2734,"8240":2773,"8242":2774,"8243":2775,"8248":2812,"8254":1150,"8304":16785520,"8308":16785524,"8309":16785525,"8310":16785526,"8311":16785527,"8312":16785528,"8313":16785529,"8320":16785536,"8321":16785537,"8322":16785538,"8323":16785539,"8324":16785540,"8325":16785541,"8326":16785542,"8327":16785543,"8328":16785544,"8329":16785545,"8352":16785568,"8353":16785569,"8354":16785570,"8355":16785571,"8356":16785572,"8357":16785573,"8358":16785574,"8359":16785575,"8360":16785576,"8361":3839,"8362":16785578,"8363":16785579,"8364":8364,"8453":2744,"8470":1712,"8471":2811,"8478":2772,"8482":2761,"8531":2736,"8532":2737,"8533":2738,"8534":2739,"8535":2740,"8536":2741,"8537":2742,"8538":2743,"8539":2755,"8540":2756,"8541":2757,"8542":2758,"8592":2299,"8593":2300,"8594":2301,"8595":2302,"8658":2254,"8660":2253,"8706":2287,"8709":16785925,"8711":2245,"8712":16785928,"8713":16785929,"8715":16785931,"8728":3018,"8730":2262,"8731":16785947,"8732":16785948,"8733":2241,"8734":2242,"8743":2270,"8744":2271,"8745":2268,"8746":2269,"8747":2239,"8748":16785964,"8749":16785965,"8756":2240,"8757":16785973,"8764":2248,"8771":2249,"8773":16785992,"8775":16785991,"8800":2237,"8801":2255,"8802":16786018,"8803":16786019,"8804":2236,"8805":2238,"8834":2266,"8835":2267,"8866":3068,"8867":3036,"8868":3010,"8869":3022,"8968":3027,"8970":3012,"8981":2810,"8992":2212,"8993":2213,"9109":3020,"9115":2219,"9117":2220,"9118":2221,"9120":2222,"9121":2215,"9123":2216,"9124":2217,"9126":2218,"9128":2223,"9132":2224,"9143":2209,"9146":2543,"9147":2544,"9148":2546,"9149":2547,"9225":2530,"9226":2533,"9227":2537,"9228":2531,"9229":2532,"9251":2732,"9252":2536,"9472":2211,"9474":2214,"9484":2210,"9488":2539,"9492":2541,"9496":2538,"9500":2548,"9508":2549,"9516":2551,"9524":2550,"9532":2542,"9618":2529,"9642":2791,"9643":2785,"9644":2779,"9645":2786,"9646":2783,"9647":2767,"9650":2792,"9651":2787,"9654":2781,"9655":2765,"9660":2793,"9661":2788,"9664":2780,"9665":2764,"9670":2528,"9675":2766,"9679":2782,"9702":2784,"9734":2789,"9742":2809,"9747":2762,"9756":2794,"9758":2795,"9792":2808,"9794":2807,"9827":2796,"9829":2798,"9830":2797,"9837":2806,"9839":2805,"10003":2803,"10007":2804,"10013":2777,"10016":2800,"10216":2748,"10217":2750,"10240":16787456,"10241":16787457,"10242":16787458,"10243":16787459,"10244":16787460,"10245":16787461,"10246":16787462,"10247":16787463,"10248":16787464,"10249":16787465,"10250":16787466,"10251":16787467,"10252":16787468,"10253":16787469,"10254":16787470,"10255":16787471,"10256":16787472,"10257":16787473,"10258":16787474,"10259":16787475,"10260":16787476,"10261":16787477,"10262":16787478,"10263":16787479,"10264":16787480,"10265":16787481,"10266":16787482,"10267":16787483,"10268":16787484,"10269":16787485,"10270":16787486,"10271":16787487,"10272":16787488,"10273":16787489,"10274":16787490,"10275":16787491,"10276":16787492,"10277":16787493,"10278":16787494,"10279":16787495,"10280":16787496,"10281":16787497,"10282":16787498,"10283":16787499,"10284":16787500,"10285":16787501,"10286":16787502,"10287":16787503,"10288":16787504,"10289":16787505,"10290":16787506,"10291":16787507,"10292":16787508,"10293":16787509,"10294":16787510,"10295":16787511,"10296":16787512,"10297":16787513,"10298":16787514,"10299":16787515,"10300":16787516,"10301":16787517,"10302":16787518,"10303":16787519,"10304":16787520,"10305":16787521,"10306":16787522,"10307":16787523,"10308":16787524,"10309":16787525,"10310":16787526,"10311":16787527,"10312":16787528,"10313":16787529,"10314":16787530,"10315":16787531,"10316":16787532,"10317":16787533,"10318":16787534,"10319":16787535,"10320":16787536,"10321":16787537,"10322":16787538,"10323":16787539,"10324":16787540,"10325":16787541,"10326":16787542,"10327":16787543,"10328":16787544,"10329":16787545,"10330":16787546,"10331":16787547,"10332":16787548,"10333":16787549,"10334":16787550,"10335":16787551,"10336":16787552,"10337":16787553,"10338":16787554,"10339":16787555,"10340":16787556,"10341":16787557,"10342":16787558,"10343":16787559,"10344":16787560,"10345":16787561,"10346":16787562,"10347":16787563,"10348":16787564,"10349":16787565,"10350":16787566,"10351":16787567,"10352":16787568,"10353":16787569,"10354":16787570,"10355":16787571,"10356":16787572,"10357":16787573,"10358":16787574,"10359":16787575,"10360":16787576,"10361":16787577,"10362":16787578,"10363":16787579,"10364":16787580,"10365":16787581,"10366":16787582,"10367":16787583,"10368":16787584,"10369":16787585,"10370":16787586,"10371":16787587,"10372":16787588,"10373":16787589,"10374":16787590,"10375":16787591,"10376":16787592,"10377":16787593,"10378":16787594,"10379":16787595,"10380":16787596,"10381":16787597,"10382":16787598,"10383":16787599,"10384":16787600,"10385":16787601,"10386":16787602,"10387":16787603,"10388":16787604,"10389":16787605,"10390":16787606,"10391":16787607,"10392":16787608,"10393":16787609,"10394":16787610,"10395":16787611,"10396":16787612,"10397":16787613,"10398":16787614,"10399":16787615,"10400":16787616,"10401":16787617,"10402":16787618,"10403":16787619,"10404":16787620,"10405":16787621,"10406":16787622,"10407":16787623,"10408":16787624,"10409":16787625,"10410":16787626,"10411":16787627,"10412":16787628,"10413":16787629,"10414":16787630,"10415":16787631,"10416":16787632,"10417":16787633,"10418":16787634,"10419":16787635,"10420":16787636,"10421":16787637,"10422":16787638,"10423":16787639,"10424":16787640,"10425":16787641,"10426":16787642,"10427":16787643,"10428":16787644,"10429":16787645,"10430":16787646,"10431":16787647,"10432":16787648,"10433":16787649,"10434":16787650,"10435":16787651,"10436":16787652,"10437":16787653,"10438":16787654,"10439":16787655,"10440":16787656,"10441":16787657,"10442":16787658,"10443":16787659,"10444":16787660,"10445":16787661,"10446":16787662,"10447":16787663,"10448":16787664,"10449":16787665,"10450":16787666,"10451":16787667,"10452":16787668,"10453":16787669,"10454":16787670,"10455":16787671,"10456":16787672,"10457":16787673,"10458":16787674,"10459":16787675,"10460":16787676,"10461":16787677,"10462":16787678,"10463":16787679,"10464":16787680,"10465":16787681,"10466":16787682,"10467":16787683,"10468":16787684,"10469":16787685,"10470":16787686,"10471":16787687,"10472":16787688,"10473":16787689,"10474":16787690,"10475":16787691,"10476":16787692,"10477":16787693,"10478":16787694,"10479":16787695,"10480":16787696,"10481":16787697,"10482":16787698,"10483":16787699,"10484":16787700,"10485":16787701,"10486":16787702,"10487":16787703,"10488":16787704,"10489":16787705,"10490":16787706,"10491":16787707,"10492":16787708,"10493":16787709,"10494":16787710,"10495":16787711,"12289":1188,"12290":1185,"12300":1186,"12301":1187,"12443":1246,"12444":1247,"12449":1191,"12450":1201,"12451":1192,"12452":1202,"12453":1193,"12454":1203,"12455":1194,"12456":1204,"12457":1195,"12458":1205,"12459":1206,"12461":1207,"12463":1208,"12465":1209,"12467":1210,"12469":1211,"12471":1212,"12473":1213,"12475":1214,"12477":1215,"12479":1216,"12481":1217,"12483":1199,"12484":1218,"12486":1219,"12488":1220,"12490":1221,"12491":1222,"12492":1223,"12493":1224,"12494":1225,"12495":1226,"12498":1227,"12501":1228,"12504":1229,"12507":1230,"12510":1231,"12511":1232,"12512":1233,"12513":1234,"12514":1235,"12515":1196,"12516":1236,"12517":1197,"12518":1237,"12519":1198,"12520":1238,"12521":1239,"12522":1240,"12523":1241,"12524":1242,"12525":1243,"12527":1244,"12530":1190,"12531":1245,"12539":1189,"12540":1200}; + + function lookup(k) { return k ? {keysym: k, keyname: keynames ? keynames[k] : k} : undefined; } + return { + fromUnicode : function(u) { return lookup(codepoints[u]); }, + lookup : lookup + }; +})(); diff --git a/noVNC/include/logo.js b/noVNC/include/logo.js new file mode 100644 index 0000000..befa598 --- /dev/null +++ b/noVNC/include/logo.js @@ -0,0 +1 @@ +noVNC_logo = {"width": 640, "height": 435, "data": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAGzCAYAAAC/y6a9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAStAAAErQBBHTWggAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7N13fBvlwQfw3522ZMm2vPdIGCFkA4GyoYyGsCmjk+7dQksHL2/H2/dtC4W2tLTlfelu2VA2lEILFCgQIHEGJCQkdjzkLdmWZGvfvX8oOkmJEy/pNO73/Xz44DtLzz2RT7qfnnXC8uXLZUxDlqfdnUYQhIP+bjbPn+5xhypzrmUf6rGzOc5cjzVduXN9/nTPyfRrMt/jzOcY05U5n3L2f95s/34LPW4m/p6FbLp/73xe+5nKnWuZs/07ZOOcnusx5nucbJU727LneuxslDmdTBxn/2NmusyEuZS7kHMxG/XP5Gf3TOVmQzY+u/PhPMnkMcSsH5WIiIiI8goDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHG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"}; diff --git a/noVNC/include/playback.js b/noVNC/include/playback.js new file mode 100644 index 0000000..7756529 --- /dev/null +++ b/noVNC/include/playback.js @@ -0,0 +1,102 @@ +/* + * noVNC: HTML5 VNC client + * Copyright (C) 2012 Joel Martin + * Licensed under MPL 2.0 (see LICENSE.txt) + */ + +"use strict"; +/*jslint browser: true, white: false */ +/*global Util, VNC_frame_data, finish */ + +var rfb, mode, test_state, frame_idx, frame_length, + iteration, iterations, istart_time, + + // Pre-declarations for jslint + send_array, next_iteration, queue_next_packet, do_packet; + +// Override send_array +send_array = function (arr) { + // Stub out send_array +}; + +next_iteration = function () { + if (iteration === 0) { + frame_length = VNC_frame_data.length; + test_state = 'running'; + } else { + rfb.disconnect(); + } + + if (test_state !== 'running') { return; } + + iteration += 1; + if (iteration > iterations) { + finish(); + return; + } + + frame_idx = 0; + istart_time = (new Date()).getTime(); + rfb.connect('test', 0, "bogus"); + + queue_next_packet(); + +}; + +queue_next_packet = function () { + var frame, foffset, toffset, delay; + if (test_state !== 'running') { return; } + + frame = VNC_frame_data[frame_idx]; + while ((frame_idx < frame_length) && (frame.charAt(0) === "}")) { + //Util.Debug("Send frame " + frame_idx); + frame_idx += 1; + frame = VNC_frame_data[frame_idx]; + } + + if (frame === 'EOF') { + Util.Debug("Finished, found EOF"); + next_iteration(); + return; + } + if (frame_idx >= frame_length) { + Util.Debug("Finished, no more frames"); + next_iteration(); + return; + } + + if (mode === 'realtime') { + foffset = frame.slice(1, frame.indexOf('{', 1)); + toffset = (new Date()).getTime() - istart_time; + delay = foffset - toffset; + if (delay < 1) { + delay = 1; + } + + setTimeout(do_packet, delay); + } else { + setTimeout(do_packet, 1); + } +}; + +var bytes_processed = 0; + +do_packet = function () { + //Util.Debug("Processing frame: " + frame_idx); + var frame = VNC_frame_data[frame_idx], + start = frame.indexOf('{', 1) + 1; + bytes_processed += frame.length - start; + if (VNC_frame_encoding === 'binary') { + var u8 = new Uint8Array(frame.length - start); + for (var i = 0; i < frame.length - start; i++) { + u8[i] = frame.charCodeAt(start + i); + } + rfb.recv_message({'data' : u8}); + } else { + rfb.recv_message({'data' : frame.slice(start)}); + } + frame_idx += 1; + + queue_next_packet(); +}; + diff --git a/noVNC/include/rfb.js b/noVNC/include/rfb.js new file mode 100644 index 0000000..700e5a8 --- /dev/null +++ b/noVNC/include/rfb.js @@ -0,0 +1,1982 @@ +/* + * noVNC: HTML5 VNC client + * Copyright (C) 2012 Joel Martin + * Copyright (C) 2013 Samuel Mannehed for Cendio AB + * Licensed under MPL 2.0 (see LICENSE.txt) + * + * See README.md for usage and integration instructions. + * + * TIGHT decoder portion: + * (c) 2012 Michael Tinglof, Joe Balaz, Les Piech (Mercuri.ca) + */ + +/*jslint white: false, browser: true, bitwise: false, plusplus: false */ +/*global window, Util, Display, Keyboard, Mouse, Websock, Websock_native, Base64, DES */ + + +function RFB(defaults) { +"use strict"; + +var that = {}, // Public API methods + conf = {}, // Configuration attributes + + // Pre-declare private functions used before definitions (jslint) + init_vars, updateState, fail, handle_message, + init_msg, normal_msg, framebufferUpdate, print_stats, + + pixelFormat, clientEncodings, fbUpdateRequest, fbUpdateRequests, + keyEvent, pointerEvent, clientCutText, + + getTightCLength, extract_data_uri, + keyPress, mouseButton, mouseMove, + + checkEvents, // Overridable for testing + + + // + // Private RFB namespace variables + // + rfb_host = '', + rfb_port = 5900, + rfb_password = '', + rfb_path = '', + + rfb_state = 'disconnected', + rfb_version = 0, + rfb_max_version= 3.8, + rfb_auth_scheme= '', + rfb_tightvnc = false, + + rfb_xvp_ver = 0, + + + // In preference order + encodings = [ + ['COPYRECT', 0x01 ], + ['TIGHT', 0x07 ], + ['TIGHT_PNG', -260 ], + ['HEXTILE', 0x05 ], + ['RRE', 0x02 ], + ['RAW', 0x00 ], + ['DesktopSize', -223 ], + ['Cursor', -239 ], + + // Psuedo-encoding settings + //['JPEG_quality_lo', -32 ], + ['JPEG_quality_med', -26 ], + //['JPEG_quality_hi', -23 ], + //['compress_lo', -255 ], + ['compress_hi', -247 ], + ['last_rect', -224 ], + ['xvp', -309 ] + ], + + encHandlers = {}, + encNames = {}, + encStats = {}, // [rectCnt, rectCntTot] + + ws = null, // Websock object + display = null, // Display object + keyboard = null, // Keyboard input handler object + mouse = null, // Mouse input handler object + sendTimer = null, // Send Queue check timer + disconnTimer = null, // disconnection timer + msgTimer = null, // queued handle_message timer + + // Frame buffer update state + FBU = { + rects : 0, + subrects : 0, // RRE + lines : 0, // RAW + tiles : 0, // HEXTILE + bytes : 0, + x : 0, + y : 0, + width : 0, + height : 0, + encoding : 0, + subencoding : -1, + background : null, + zlibs : [] // TIGHT zlib streams + }, + + fb_Bpp = 4, + fb_depth = 3, + fb_width = 0, + fb_height = 0, + fb_name = "", + + rre_chunk_sz = 100, + + timing = { + last_fbu : 0, + fbu_total : 0, + fbu_total_cnt : 0, + full_fbu_total : 0, + full_fbu_cnt : 0, + + fbu_rt_start : 0, + fbu_rt_total : 0, + fbu_rt_cnt : 0, + pixels : 0 + }, + + test_mode = false, + + /* Mouse state */ + mouse_buttonMask = 0, + mouse_arr = [], + viewportDragging = false, + viewportDragPos = {}; + +// Configuration attributes +Util.conf_defaults(conf, that, defaults, [ + ['target', 'wo', 'dom', null, 'VNC display rendering Canvas object'], + ['focusContainer', 'wo', 'dom', document, 'DOM element that captures keyboard input'], + + ['encrypt', 'rw', 'bool', false, 'Use TLS/SSL/wss encryption'], + ['true_color', 'rw', 'bool', true, 'Request true color pixel data'], + ['local_cursor', 'rw', 'bool', false, 'Request locally rendered cursor'], + ['shared', 'rw', 'bool', true, 'Request shared mode'], + ['view_only', 'rw', 'bool', false, 'Disable client mouse/keyboard'], + ['xvp_password_sep', 'rw', 'str', '@', 'Separator for XVP password fields'], + ['disconnectTimeout', 'rw', 'int', 3, 'Time (s) to wait for disconnection'], + + // UltraVNC repeater ID to connect to + ['repeaterID', 'rw', 'str', '', 'RepeaterID to connect to'], + + ['viewportDrag', 'rw', 'bool', false, 'Move the viewport on mouse drags'], + + // Callback functions + ['onUpdateState', 'rw', 'func', function() { }, + 'onUpdateState(rfb, state, oldstate, statusMsg): RFB state update/change '], + ['onPasswordRequired', 'rw', 'func', function() { }, + 'onPasswordRequired(rfb): VNC password is required '], + ['onClipboard', 'rw', 'func', function() { }, + 'onClipboard(rfb, text): RFB clipboard contents received'], + ['onBell', 'rw', 'func', function() { }, + 'onBell(rfb): RFB Bell message received '], + ['onFBUReceive', 'rw', 'func', function() { }, + 'onFBUReceive(rfb, fbu): RFB FBU received but not yet processed '], + ['onFBUComplete', 'rw', 'func', function() { }, + 'onFBUComplete(rfb, fbu): RFB FBU received and processed '], + ['onFBResize', 'rw', 'func', function() { }, + 'onFBResize(rfb, width, height): frame buffer resized'], + ['onDesktopName', 'rw', 'func', function() { }, + 'onDesktopName(rfb, name): desktop name received'], + ['onXvpInit', 'rw', 'func', function() { }, + 'onXvpInit(version): XVP extensions active for this connection'], + + // These callback names are deprecated + ['updateState', 'rw', 'func', function() { }, + 'obsolete, use onUpdateState'], + ['clipboardReceive', 'rw', 'func', function() { }, + 'obsolete, use onClipboard'] + ]); + + +// Override/add some specific configuration getters/setters +that.set_local_cursor = function(cursor) { + if ((!cursor) || (cursor in {'0':1, 'no':1, 'false':1})) { + conf.local_cursor = false; + } else { + if (display.get_cursor_uri()) { + conf.local_cursor = true; + } else { + Util.Warn("Browser does not support local cursor"); + } + } +}; + +// These are fake configuration getters +that.get_display = function() { return display; }; + +that.get_keyboard = function() { return keyboard; }; + +that.get_mouse = function() { return mouse; }; + + + +// +// Setup routines +// + +// Create the public API interface and initialize values that stay +// constant across connect/disconnect +function constructor() { + var i, rmode; + Util.Debug(">> RFB.constructor"); + + // Create lookup tables based encoding number + for (i=0; i < encodings.length; i+=1) { + encHandlers[encodings[i][1]] = encHandlers[encodings[i][0]]; + encNames[encodings[i][1]] = encodings[i][0]; + encStats[encodings[i][1]] = [0, 0]; + } + // Initialize display, mouse, keyboard, and websock + try { + display = new Display({'target': conf.target}); + } catch (exc) { + Util.Error("Display exception: " + exc); + updateState('fatal', "No working Display"); + } + keyboard = new Keyboard({'target': conf.focusContainer, + 'onKeyPress': keyPress}); + mouse = new Mouse({'target': conf.target, + 'onMouseButton': mouseButton, + 'onMouseMove': mouseMove, + 'notify': keyboard.sync}); + + rmode = display.get_render_mode(); + + ws = new Websock(); + ws.on('message', handle_message); + ws.on('open', function() { + if (rfb_state === "connect") { + updateState('ProtocolVersion', "Starting VNC handshake"); + } else { + fail("Got unexpected WebSockets connection"); + } + }); + ws.on('close', function(e) { + Util.Warn("WebSocket on-close event"); + var msg = ""; + if (e.code) { + msg = " (code: " + e.code; + if (e.reason) { + msg += ", reason: " + e.reason; + } + msg += ")"; + } + if (rfb_state === 'disconnect') { + updateState('disconnected', 'VNC disconnected' + msg); + } else if (rfb_state === 'ProtocolVersion') { + fail('Failed to connect to server' + msg); + } else if (rfb_state in {'failed':1, 'disconnected':1}) { + Util.Error("Received onclose while disconnected" + msg); + } else { + fail('Server disconnected' + msg); + } + }); + ws.on('error', function(e) { + Util.Warn("WebSocket on-error event"); + //fail("WebSock reported an error"); + }); + + + init_vars(); + + /* Check web-socket-js if no builtin WebSocket support */ + if (Websock_native) { + Util.Info("Using native WebSockets"); + updateState('loaded', 'noVNC ready: native WebSockets, ' + rmode); + } else { + Util.Warn("Using web-socket-js bridge. Flash version: " + + Util.Flash.version); + if ((! Util.Flash) || + (Util.Flash.version < 9)) { + updateState('fatal', "WebSockets or Adobe Flash<\/a> is required"); + } else if (document.location.href.substr(0, 7) === "file://") { + updateState('fatal', + "'file://' URL is incompatible with Adobe Flash"); + } else { + updateState('loaded', 'noVNC ready: WebSockets emulation, ' + rmode); + } + } + + Util.Debug("<< RFB.constructor"); + return that; // Return the public API interface +} + +function connect() { + Util.Debug(">> RFB.connect"); + var uri; + + if (typeof UsingSocketIO !== "undefined") { + uri = "http://" + rfb_host + ":" + rfb_port + "/" + rfb_path; + } else { + if (conf.encrypt) { + uri = "wss://"; + } else { + uri = "ws://"; + } + uri += rfb_host + ":" + rfb_port + "/" + rfb_path; + } + Util.Info("connecting to " + uri); + // TODO: make protocols a configurable + ws.open(uri, ['binary', 'base64']); + + Util.Debug("<< RFB.connect"); +} + +// Initialize variables that are reset before each connection +init_vars = function() { + var i; + + /* Reset state */ + ws.init(); + + FBU.rects = 0; + FBU.subrects = 0; // RRE and HEXTILE + FBU.lines = 0; // RAW + FBU.tiles = 0; // HEXTILE + FBU.zlibs = []; // TIGHT zlib encoders + mouse_buttonMask = 0; + mouse_arr = []; + + // Clear the per connection encoding stats + for (i=0; i < encodings.length; i+=1) { + encStats[encodings[i][1]][0] = 0; + } + + for (i=0; i < 4; i++) { + //FBU.zlibs[i] = new InflateStream(); + FBU.zlibs[i] = new TINF(); + FBU.zlibs[i].init(); + } +}; + +// Print statistics +print_stats = function() { + var i, s; + Util.Info("Encoding stats for this connection:"); + for (i=0; i < encodings.length; i+=1) { + s = encStats[encodings[i][1]]; + if ((s[0] + s[1]) > 0) { + Util.Info(" " + encodings[i][0] + ": " + + s[0] + " rects"); + } + } + Util.Info("Encoding stats since page load:"); + for (i=0; i < encodings.length; i+=1) { + s = encStats[encodings[i][1]]; + if ((s[0] + s[1]) > 0) { + Util.Info(" " + encodings[i][0] + ": " + + s[1] + " rects"); + } + } +}; + +// +// Utility routines +// + + +/* + * Page states: + * loaded - page load, equivalent to disconnected + * disconnected - idle state + * connect - starting to connect (to ProtocolVersion) + * normal - connected + * disconnect - starting to disconnect + * failed - abnormal disconnect + * fatal - failed to load page, or fatal error + * + * RFB protocol initialization states: + * ProtocolVersion + * Security + * Authentication + * password - waiting for password, not part of RFB + * SecurityResult + * ClientInitialization - not triggered by server message + * ServerInitialization (to normal) + */ +updateState = function(state, statusMsg) { + var func, cmsg, oldstate = rfb_state; + + if (state === oldstate) { + /* Already here, ignore */ + Util.Debug("Already in state '" + state + "', ignoring."); + return; + } + + /* + * These are disconnected states. A previous connect may + * asynchronously cause a connection so make sure we are closed. + */ + if (state in {'disconnected':1, 'loaded':1, 'connect':1, + 'disconnect':1, 'failed':1, 'fatal':1}) { + if (sendTimer) { + clearInterval(sendTimer); + sendTimer = null; + } + + if (msgTimer) { + clearTimeout(msgTimer); + msgTimer = null; + } + + if (display && display.get_context()) { + keyboard.ungrab(); + mouse.ungrab(); + display.defaultCursor(); + if ((Util.get_logging() !== 'debug') || + (state === 'loaded')) { + // Show noVNC logo on load and when disconnected if + // debug is off + display.clear(); + } + } + + ws.close(); + } + + if (oldstate === 'fatal') { + Util.Error("Fatal error, cannot continue"); + } + + if ((state === 'failed') || (state === 'fatal')) { + func = Util.Error; + } else { + func = Util.Warn; + } + + cmsg = typeof(statusMsg) !== 'undefined' ? (" Msg: " + statusMsg) : ""; + func("New state '" + state + "', was '" + oldstate + "'." + cmsg); + + if ((oldstate === 'failed') && (state === 'disconnected')) { + // Do disconnect action, but stay in failed state + rfb_state = 'failed'; + } else { + rfb_state = state; + } + + if (disconnTimer && (rfb_state !== 'disconnect')) { + Util.Debug("Clearing disconnect timer"); + clearTimeout(disconnTimer); + disconnTimer = null; + } + + switch (state) { + case 'normal': + if ((oldstate === 'disconnected') || (oldstate === 'failed')) { + Util.Error("Invalid transition from 'disconnected' or 'failed' to 'normal'"); + } + + break; + + + case 'connect': + + init_vars(); + connect(); + + // WebSocket.onopen transitions to 'ProtocolVersion' + break; + + + case 'disconnect': + + if (! test_mode) { + disconnTimer = setTimeout(function () { + fail("Disconnect timeout"); + }, conf.disconnectTimeout * 1000); + } + + print_stats(); + + // WebSocket.onclose transitions to 'disconnected' + break; + + + case 'failed': + if (oldstate === 'disconnected') { + Util.Error("Invalid transition from 'disconnected' to 'failed'"); + } + if (oldstate === 'normal') { + Util.Error("Error while connected."); + } + if (oldstate === 'init') { + Util.Error("Error while initializing."); + } + + // Make sure we transition to disconnected + setTimeout(function() { updateState('disconnected'); }, 50); + + break; + + + default: + // No state change action to take + + } + + if ((oldstate === 'failed') && (state === 'disconnected')) { + // Leave the failed message + conf.updateState(that, state, oldstate); // Obsolete + conf.onUpdateState(that, state, oldstate); + } else { + conf.updateState(that, state, oldstate, statusMsg); // Obsolete + conf.onUpdateState(that, state, oldstate, statusMsg); + } +}; + +fail = function(msg) { + updateState('failed', msg); + return false; +}; + +handle_message = function() { + //Util.Debug(">> handle_message ws.rQlen(): " + ws.rQlen()); + //Util.Debug("ws.rQslice(0,20): " + ws.rQslice(0,20) + " (" + ws.rQlen() + ")"); + if (ws.rQlen() === 0) { + Util.Warn("handle_message called on empty receive queue"); + return; + } + switch (rfb_state) { + case 'disconnected': + case 'failed': + Util.Error("Got data while disconnected"); + break; + case 'normal': + if (normal_msg() && ws.rQlen() > 0) { + // true means we can continue processing + // Give other events a chance to run + if (msgTimer === null) { + Util.Debug("More data to process, creating timer"); + msgTimer = setTimeout(function () { + msgTimer = null; + handle_message(); + }, 10); + } else { + Util.Debug("More data to process, existing timer"); + } + } + break; + default: + init_msg(); + break; + } +}; + + +function genDES(password, challenge) { + var i, passwd = []; + for (i=0; i < password.length; i += 1) { + passwd.push(password.charCodeAt(i)); + } + return (new DES(passwd)).encrypt(challenge); +} + +// overridable for testing +checkEvents = function() { + if (rfb_state === 'normal' && !viewportDragging && mouse_arr.length > 0) { + ws.send(mouse_arr); + mouse_arr = []; + } +}; + +keyPress = function(keysym, down) { + if (conf.view_only) { return; } // View only, skip keyboard events + + ws.send(keyEvent(keysym, down)); +}; + +mouseButton = function(x, y, down, bmask) { + if (down) { + mouse_buttonMask |= bmask; + } else { + mouse_buttonMask ^= bmask; + } + + if (conf.viewportDrag) { + if (down && !viewportDragging) { + viewportDragging = true; + viewportDragPos = {'x': x, 'y': y}; + + // Skip sending mouse events + return; + } else { + viewportDragging = false; + } + } + + if (conf.view_only) { return; } // View only, skip mouse events + + mouse_arr = mouse_arr.concat( + pointerEvent(display.absX(x), display.absY(y)) ); + ws.send(mouse_arr); + mouse_arr = []; +}; + +mouseMove = function(x, y) { + //Util.Debug('>> mouseMove ' + x + "," + y); + var deltaX, deltaY; + + if (viewportDragging) { + //deltaX = x - viewportDragPos.x; // drag viewport + deltaX = viewportDragPos.x - x; // drag frame buffer + //deltaY = y - viewportDragPos.y; // drag viewport + deltaY = viewportDragPos.y - y; // drag frame buffer + viewportDragPos = {'x': x, 'y': y}; + + display.viewportChange(deltaX, deltaY); + + // Skip sending mouse events + return; + } + + if (conf.view_only) { return; } // View only, skip mouse events + + mouse_arr = mouse_arr.concat( + pointerEvent(display.absX(x), display.absY(y))); + + checkEvents(); +}; + + +// +// Server message handlers +// + +// RFB/VNC initialisation message handler +init_msg = function() { + //Util.Debug(">> init_msg [rfb_state '" + rfb_state + "']"); + + var strlen, reason, length, sversion, cversion, repeaterID, + i, types, num_types, challenge, response, bpp, depth, + big_endian, red_max, green_max, blue_max, red_shift, + green_shift, blue_shift, true_color, name_length, is_repeater, + xvp_sep, xvp_auth, xvp_auth_str; + + //Util.Debug("ws.rQ (" + ws.rQlen() + ") " + ws.rQslice(0)); + switch (rfb_state) { + + case 'ProtocolVersion' : + if (ws.rQlen() < 12) { + return fail("Incomplete protocol version"); + } + sversion = ws.rQshiftStr(12).substr(4,7); + Util.Info("Server ProtocolVersion: " + sversion); + is_repeater = 0; + switch (sversion) { + case "000.000": is_repeater = 1; break; // UltraVNC repeater + case "003.003": rfb_version = 3.3; break; + case "003.006": rfb_version = 3.3; break; // UltraVNC + case "003.889": rfb_version = 3.3; break; // Apple Remote Desktop + case "003.007": rfb_version = 3.7; break; + case "003.008": rfb_version = 3.8; break; + case "004.000": rfb_version = 3.8; break; // Intel AMT KVM + case "004.001": rfb_version = 3.8; break; // RealVNC 4.6 + default: + return fail("Invalid server version " + sversion); + } + if (is_repeater) { + repeaterID = conf.repeaterID; + while (repeaterID.length < 250) { + repeaterID += "\0"; + } + ws.send_string(repeaterID); + break; + } + if (rfb_version > rfb_max_version) { + rfb_version = rfb_max_version; + } + + if (! test_mode) { + sendTimer = setInterval(function() { + // Send updates either at a rate of one update + // every 50ms, or whatever slower rate the network + // can handle. + ws.flush(); + }, 50); + } + + cversion = "00" + parseInt(rfb_version,10) + + ".00" + ((rfb_version * 10) % 10); + ws.send_string("RFB " + cversion + "\n"); + updateState('Security', "Sent ProtocolVersion: " + cversion); + break; + + case 'Security' : + if (rfb_version >= 3.7) { + // Server sends supported list, client decides + num_types = ws.rQshift8(); + if (ws.rQwait("security type", num_types, 1)) { return false; } + if (num_types === 0) { + strlen = ws.rQshift32(); + reason = ws.rQshiftStr(strlen); + return fail("Security failure: " + reason); + } + rfb_auth_scheme = 0; + types = ws.rQshiftBytes(num_types); + Util.Debug("Server security types: " + types); + for (i=0; i < types.length; i+=1) { + if ((types[i] > rfb_auth_scheme) && (types[i] <= 16 || types[i] == 22)) { + rfb_auth_scheme = types[i]; + } + } + if (rfb_auth_scheme === 0) { + return fail("Unsupported security types: " + types); + } + + ws.send([rfb_auth_scheme]); + } else { + // Server decides + if (ws.rQwait("security scheme", 4)) { return false; } + rfb_auth_scheme = ws.rQshift32(); + } + updateState('Authentication', + "Authenticating using scheme: " + rfb_auth_scheme); + init_msg(); // Recursive fallthrough (workaround JSLint complaint) + break; + + // Triggered by fallthough, not by server message + case 'Authentication' : + //Util.Debug("Security auth scheme: " + rfb_auth_scheme); + switch (rfb_auth_scheme) { + case 0: // connection failed + if (ws.rQwait("auth reason", 4)) { return false; } + strlen = ws.rQshift32(); + reason = ws.rQshiftStr(strlen); + return fail("Auth failure: " + reason); + case 1: // no authentication + if (rfb_version >= 3.8) { + updateState('SecurityResult'); + return; + } + // Fall through to ClientInitialisation + break; + case 22: // XVP authentication + xvp_sep = conf.xvp_password_sep; + xvp_auth = rfb_password.split(xvp_sep); + if (xvp_auth.length < 3) { + updateState('password', "XVP credentials required (user" + xvp_sep + + "target" + xvp_sep + "password) -- got only " + rfb_password); + conf.onPasswordRequired(that); + return; + } + xvp_auth_str = String.fromCharCode(xvp_auth[0].length) + + String.fromCharCode(xvp_auth[1].length) + + xvp_auth[0] + + xvp_auth[1]; + ws.send_string(xvp_auth_str); + rfb_password = xvp_auth.slice(2).join(xvp_sep); + rfb_auth_scheme = 2; + // Fall through to standard VNC authentication with remaining part of password + case 2: // VNC authentication + if (rfb_password.length === 0) { + // Notify via both callbacks since it is kind of + // a RFB state change and a UI interface issue. + updateState('password', "Password Required"); + conf.onPasswordRequired(that); + return; + } + if (ws.rQwait("auth challenge", 16)) { return false; } + challenge = ws.rQshiftBytes(16); + //Util.Debug("Password: " + rfb_password); + //Util.Debug("Challenge: " + challenge + + // " (" + challenge.length + ")"); + response = genDES(rfb_password, challenge); + //Util.Debug("Response: " + response + + // " (" + response.length + ")"); + + //Util.Debug("Sending DES encrypted auth response"); + ws.send(response); + updateState('SecurityResult'); + return; + case 16: // TightVNC Security Type + if (ws.rQwait("num tunnels", 4)) { return false; } + var numTunnels = ws.rQshift32(); + //console.log("Number of tunnels: "+numTunnels); + + rfb_tightvnc = true; + + if (numTunnels != 0) + { + fail("Protocol requested tunnels, not currently supported. numTunnels: " + numTunnels); + return; + } + + var clientSupportedTypes = { + 'STDVNOAUTH__': 1, + 'STDVVNCAUTH_': 2 + }; + + var serverSupportedTypes = []; + + if (ws.rQwait("sub auth count", 4)) { return false; } + var subAuthCount = ws.rQshift32(); + //console.log("Sub auth count: "+subAuthCount); + for (var i=0;i= 3.8) { + length = ws.rQshift32(); + if (ws.rQwait("SecurityResult reason", length, 8)) { + return false; + } + reason = ws.rQshiftStr(length); + fail(reason); + } else { + fail("Authentication failed"); + } + return; + case 2: // too-many + return fail("Too many auth attempts"); + } + updateState('ClientInitialisation', "Authentication OK"); + init_msg(); // Recursive fallthrough (workaround JSLint complaint) + break; + + // Triggered by fallthough, not by server message + case 'ClientInitialisation' : + ws.send([conf.shared ? 1 : 0]); // ClientInitialisation + updateState('ServerInitialisation', "Authentication OK"); + break; + + case 'ServerInitialisation' : + if (ws.rQwait("server initialization", 24)) { return false; } + + /* Screen size */ + fb_width = ws.rQshift16(); + fb_height = ws.rQshift16(); + + /* PIXEL_FORMAT */ + bpp = ws.rQshift8(); + depth = ws.rQshift8(); + big_endian = ws.rQshift8(); + true_color = ws.rQshift8(); + + red_max = ws.rQshift16(); + green_max = ws.rQshift16(); + blue_max = ws.rQshift16(); + red_shift = ws.rQshift8(); + green_shift = ws.rQshift8(); + blue_shift = ws.rQshift8(); + ws.rQshiftStr(3); // padding + + Util.Info("Screen: " + fb_width + "x" + fb_height + + ", bpp: " + bpp + ", depth: " + depth + + ", big_endian: " + big_endian + + ", true_color: " + true_color + + ", red_max: " + red_max + + ", green_max: " + green_max + + ", blue_max: " + blue_max + + ", red_shift: " + red_shift + + ", green_shift: " + green_shift + + ", blue_shift: " + blue_shift); + + if (big_endian !== 0) { + Util.Warn("Server native endian is not little endian"); + } + if (red_shift !== 16) { + Util.Warn("Server native red-shift is not 16"); + } + if (blue_shift !== 0) { + Util.Warn("Server native blue-shift is not 0"); + } + + /* Connection name/title */ + name_length = ws.rQshift32(); + fb_name = ws.rQshiftStr(name_length); + conf.onDesktopName(that, fb_name); + + if (conf.true_color && fb_name === "Intel(r) AMT KVM") + { + Util.Warn("Intel AMT KVM only support 8/16 bit depths. Disabling true color"); + conf.true_color = false; + } + + if (rfb_tightvnc) + { + // In TightVNC mode, ServerInit message is extended + var numServerMessages = ws.rQshift16(); + var numClientMessages = ws.rQshift16(); + var numEncodings = ws.rQshift16(); + ws.rQshift16(); // padding + //console.log("numServerMessages "+numServerMessages); + //console.log("numClientMessages "+numClientMessages); + //console.log("numEncodings "+numEncodings); + + for (var i=0;i> normal_msg"); + + var ret = true, msg_type, length, text, + c, first_colour, num_colours, red, green, blue, + xvp_ver, xvp_msg; + + if (FBU.rects > 0) { + msg_type = 0; + } else { + msg_type = ws.rQshift8(); + } + switch (msg_type) { + case 0: // FramebufferUpdate + ret = framebufferUpdate(); // false means need more data + if (ret) { + // only allow one outstanding fbu-request at a time + ws.send(fbUpdateRequests()); + } + break; + case 1: // SetColourMapEntries + Util.Debug("SetColourMapEntries"); + ws.rQshift8(); // Padding + first_colour = ws.rQshift16(); // First colour + num_colours = ws.rQshift16(); + if (ws.rQwait("SetColourMapEntries", num_colours*6, 6)) { return false; } + + for (c=0; c < num_colours; c+=1) { + red = ws.rQshift16(); + //Util.Debug("red before: " + red); + red = parseInt(red / 256, 10); + //Util.Debug("red after: " + red); + green = parseInt(ws.rQshift16() / 256, 10); + blue = parseInt(ws.rQshift16() / 256, 10); + display.set_colourMap([blue, green, red], first_colour + c); + } + Util.Debug("colourMap: " + display.get_colourMap()); + Util.Info("Registered " + num_colours + " colourMap entries"); + //Util.Debug("colourMap: " + display.get_colourMap()); + break; + case 2: // Bell + Util.Debug("Bell"); + conf.onBell(that); + break; + case 3: // ServerCutText + Util.Debug("ServerCutText"); + if (ws.rQwait("ServerCutText header", 7, 1)) { return false; } + ws.rQshiftBytes(3); // Padding + length = ws.rQshift32(); + if (ws.rQwait("ServerCutText", length, 8)) { return false; } + + text = ws.rQshiftStr(length); + conf.clipboardReceive(that, text); // Obsolete + conf.onClipboard(that, text); + break; + case 250: // XVP + ws.rQshift8(); // Padding + xvp_ver = ws.rQshift8(); + xvp_msg = ws.rQshift8(); + switch (xvp_msg) { + case 0: // XVP_FAIL + updateState(rfb_state, "Operation failed"); + break; + case 1: // XVP_INIT + rfb_xvp_ver = xvp_ver; + Util.Info("XVP extensions enabled (version " + rfb_xvp_ver + ")"); + conf.onXvpInit(rfb_xvp_ver); + break; + default: + fail("Disconnected: illegal server XVP message " + xvp_msg); + break; + } + break; + default: + fail("Disconnected: illegal server message type " + msg_type); + Util.Debug("ws.rQslice(0,30):" + ws.rQslice(0,30)); + break; + } + //Util.Debug("<< normal_msg"); + return ret; +}; + +framebufferUpdate = function() { + var now, hdr, fbu_rt_diff, ret = true; + + if (FBU.rects === 0) { + //Util.Debug("New FBU: ws.rQslice(0,20): " + ws.rQslice(0,20)); + if (ws.rQwait("FBU header", 3)) { + ws.rQunshift8(0); // FBU msg_type + return false; + } + ws.rQshift8(); // padding + FBU.rects = ws.rQshift16(); + //Util.Debug("FramebufferUpdate, rects:" + FBU.rects); + FBU.bytes = 0; + timing.cur_fbu = 0; + if (timing.fbu_rt_start > 0) { + now = (new Date()).getTime(); + Util.Info("First FBU latency: " + (now - timing.fbu_rt_start)); + } + } + + while (FBU.rects > 0) { + if (rfb_state !== "normal") { + return false; + } + if (ws.rQwait("FBU", FBU.bytes)) { return false; } + if (FBU.bytes === 0) { + if (ws.rQwait("rect header", 12)) { return false; } + /* New FramebufferUpdate */ + + hdr = ws.rQshiftBytes(12); + FBU.x = (hdr[0] << 8) + hdr[1]; + FBU.y = (hdr[2] << 8) + hdr[3]; + FBU.width = (hdr[4] << 8) + hdr[5]; + FBU.height = (hdr[6] << 8) + hdr[7]; + FBU.encoding = parseInt((hdr[8] << 24) + (hdr[9] << 16) + + (hdr[10] << 8) + hdr[11], 10); + + conf.onFBUReceive(that, + {'x': FBU.x, 'y': FBU.y, + 'width': FBU.width, 'height': FBU.height, + 'encoding': FBU.encoding, + 'encodingName': encNames[FBU.encoding]}); + + if (encNames[FBU.encoding]) { + // Debug: + /* + var msg = "FramebufferUpdate rects:" + FBU.rects; + msg += " x: " + FBU.x + " y: " + FBU.y; + msg += " width: " + FBU.width + " height: " + FBU.height; + msg += " encoding:" + FBU.encoding; + msg += "(" + encNames[FBU.encoding] + ")"; + msg += ", ws.rQlen(): " + ws.rQlen(); + Util.Debug(msg); + */ + } else { + fail("Disconnected: unsupported encoding " + + FBU.encoding); + return false; + } + } + + timing.last_fbu = (new Date()).getTime(); + + ret = encHandlers[FBU.encoding](); + + now = (new Date()).getTime(); + timing.cur_fbu += (now - timing.last_fbu); + + if (ret) { + encStats[FBU.encoding][0] += 1; + encStats[FBU.encoding][1] += 1; + timing.pixels += FBU.width * FBU.height; + } + + if (timing.pixels >= (fb_width * fb_height)) { + if (((FBU.width === fb_width) && + (FBU.height === fb_height)) || + (timing.fbu_rt_start > 0)) { + timing.full_fbu_total += timing.cur_fbu; + timing.full_fbu_cnt += 1; + Util.Info("Timing of full FBU, cur: " + + timing.cur_fbu + ", total: " + + timing.full_fbu_total + ", cnt: " + + timing.full_fbu_cnt + ", avg: " + + (timing.full_fbu_total / + timing.full_fbu_cnt)); + } + if (timing.fbu_rt_start > 0) { + fbu_rt_diff = now - timing.fbu_rt_start; + timing.fbu_rt_total += fbu_rt_diff; + timing.fbu_rt_cnt += 1; + Util.Info("full FBU round-trip, cur: " + + fbu_rt_diff + ", total: " + + timing.fbu_rt_total + ", cnt: " + + timing.fbu_rt_cnt + ", avg: " + + (timing.fbu_rt_total / + timing.fbu_rt_cnt)); + timing.fbu_rt_start = 0; + } + } + if (! ret) { + return ret; // false ret means need more data + } + } + + conf.onFBUComplete(that, + {'x': FBU.x, 'y': FBU.y, + 'width': FBU.width, 'height': FBU.height, + 'encoding': FBU.encoding, + 'encodingName': encNames[FBU.encoding]}); + + return true; // We finished this FBU +}; + +// +// FramebufferUpdate encodings +// + +encHandlers.RAW = function display_raw() { + //Util.Debug(">> display_raw (" + ws.rQlen() + " bytes)"); + + var cur_y, cur_height; + + if (FBU.lines === 0) { + FBU.lines = FBU.height; + } + FBU.bytes = FBU.width * fb_Bpp; // At least a line + if (ws.rQwait("RAW", FBU.bytes)) { return false; } + cur_y = FBU.y + (FBU.height - FBU.lines); + cur_height = Math.min(FBU.lines, + Math.floor(ws.rQlen()/(FBU.width * fb_Bpp))); + display.blitImage(FBU.x, cur_y, FBU.width, cur_height, + ws.get_rQ(), ws.get_rQi()); + ws.rQshiftBytes(FBU.width * cur_height * fb_Bpp); + FBU.lines -= cur_height; + + if (FBU.lines > 0) { + FBU.bytes = FBU.width * fb_Bpp; // At least another line + } else { + FBU.rects -= 1; + FBU.bytes = 0; + } + //Util.Debug("<< display_raw (" + ws.rQlen() + " bytes)"); + return true; +}; + +encHandlers.COPYRECT = function display_copy_rect() { + //Util.Debug(">> display_copy_rect"); + + var old_x, old_y; + + FBU.bytes = 4; + if (ws.rQwait("COPYRECT", 4)) { return false; } + display.renderQ_push({ + 'type': 'copy', + 'old_x': ws.rQshift16(), + 'old_y': ws.rQshift16(), + 'x': FBU.x, + 'y': FBU.y, + 'width': FBU.width, + 'height': FBU.height}); + FBU.rects -= 1; + FBU.bytes = 0; + return true; +}; + +encHandlers.RRE = function display_rre() { + //Util.Debug(">> display_rre (" + ws.rQlen() + " bytes)"); + var color, x, y, width, height, chunk; + + if (FBU.subrects === 0) { + FBU.bytes = 4+fb_Bpp; + if (ws.rQwait("RRE", 4+fb_Bpp)) { return false; } + FBU.subrects = ws.rQshift32(); + color = ws.rQshiftBytes(fb_Bpp); // Background + display.fillRect(FBU.x, FBU.y, FBU.width, FBU.height, color); + } + while ((FBU.subrects > 0) && (ws.rQlen() >= (fb_Bpp + 8))) { + color = ws.rQshiftBytes(fb_Bpp); + x = ws.rQshift16(); + y = ws.rQshift16(); + width = ws.rQshift16(); + height = ws.rQshift16(); + display.fillRect(FBU.x + x, FBU.y + y, width, height, color); + FBU.subrects -= 1; + } + //Util.Debug(" display_rre: rects: " + FBU.rects + + // ", FBU.subrects: " + FBU.subrects); + + if (FBU.subrects > 0) { + chunk = Math.min(rre_chunk_sz, FBU.subrects); + FBU.bytes = (fb_Bpp + 8) * chunk; + } else { + FBU.rects -= 1; + FBU.bytes = 0; + } + //Util.Debug("<< display_rre, FBU.bytes: " + FBU.bytes); + return true; +}; + +encHandlers.HEXTILE = function display_hextile() { + //Util.Debug(">> display_hextile"); + var subencoding, subrects, color, cur_tile, + tile_x, x, w, tile_y, y, h, xy, s, sx, sy, wh, sw, sh, + rQ = ws.get_rQ(), rQi = ws.get_rQi(); + + if (FBU.tiles === 0) { + FBU.tiles_x = Math.ceil(FBU.width/16); + FBU.tiles_y = Math.ceil(FBU.height/16); + FBU.total_tiles = FBU.tiles_x * FBU.tiles_y; + FBU.tiles = FBU.total_tiles; + } + + /* FBU.bytes comes in as 1, ws.rQlen() at least 1 */ + while (FBU.tiles > 0) { + FBU.bytes = 1; + if (ws.rQwait("HEXTILE subencoding", FBU.bytes)) { return false; } + subencoding = rQ[rQi]; // Peek + if (subencoding > 30) { // Raw + fail("Disconnected: illegal hextile subencoding " + subencoding); + //Util.Debug("ws.rQslice(0,30):" + ws.rQslice(0,30)); + return false; + } + subrects = 0; + cur_tile = FBU.total_tiles - FBU.tiles; + tile_x = cur_tile % FBU.tiles_x; + tile_y = Math.floor(cur_tile / FBU.tiles_x); + x = FBU.x + tile_x * 16; + y = FBU.y + tile_y * 16; + w = Math.min(16, (FBU.x + FBU.width) - x); + h = Math.min(16, (FBU.y + FBU.height) - y); + + /* Figure out how much we are expecting */ + if (subencoding & 0x01) { // Raw + //Util.Debug(" Raw subencoding"); + FBU.bytes += w * h * fb_Bpp; + } else { + if (subencoding & 0x02) { // Background + FBU.bytes += fb_Bpp; + } + if (subencoding & 0x04) { // Foreground + FBU.bytes += fb_Bpp; + } + if (subencoding & 0x08) { // AnySubrects + FBU.bytes += 1; // Since we aren't shifting it off + if (ws.rQwait("hextile subrects header", FBU.bytes)) { return false; } + subrects = rQ[rQi + FBU.bytes-1]; // Peek + if (subencoding & 0x10) { // SubrectsColoured + FBU.bytes += subrects * (fb_Bpp + 2); + } else { + FBU.bytes += subrects * 2; + } + } + } + + /* + Util.Debug(" tile:" + cur_tile + "/" + (FBU.total_tiles - 1) + + " (" + tile_x + "," + tile_y + ")" + + " [" + x + "," + y + "]@" + w + "x" + h + + ", subenc:" + subencoding + + "(last: " + FBU.lastsubencoding + "), subrects:" + + subrects + + ", ws.rQlen():" + ws.rQlen() + ", FBU.bytes:" + FBU.bytes + + " last:" + ws.rQslice(FBU.bytes-10, FBU.bytes) + + " next:" + ws.rQslice(FBU.bytes-1, FBU.bytes+10)); + */ + if (ws.rQwait("hextile", FBU.bytes)) { return false; } + + /* We know the encoding and have a whole tile */ + FBU.subencoding = rQ[rQi]; + rQi += 1; + if (FBU.subencoding === 0) { + if (FBU.lastsubencoding & 0x01) { + /* Weird: ignore blanks after RAW */ + Util.Debug(" Ignoring blank after RAW"); + } else { + display.fillRect(x, y, w, h, FBU.background); + } + } else if (FBU.subencoding & 0x01) { // Raw + display.blitImage(x, y, w, h, rQ, rQi); + rQi += FBU.bytes - 1; + } else { + if (FBU.subencoding & 0x02) { // Background + FBU.background = rQ.slice(rQi, rQi + fb_Bpp); + rQi += fb_Bpp; + } + if (FBU.subencoding & 0x04) { // Foreground + FBU.foreground = rQ.slice(rQi, rQi + fb_Bpp); + rQi += fb_Bpp; + } + + display.startTile(x, y, w, h, FBU.background); + if (FBU.subencoding & 0x08) { // AnySubrects + subrects = rQ[rQi]; + rQi += 1; + for (s = 0; s < subrects; s += 1) { + if (FBU.subencoding & 0x10) { // SubrectsColoured + color = rQ.slice(rQi, rQi + fb_Bpp); + rQi += fb_Bpp; + } else { + color = FBU.foreground; + } + xy = rQ[rQi]; + rQi += 1; + sx = (xy >> 4); + sy = (xy & 0x0f); + + wh = rQ[rQi]; + rQi += 1; + sw = (wh >> 4) + 1; + sh = (wh & 0x0f) + 1; + + display.subTile(sx, sy, sw, sh, color); + } + } + display.finishTile(); + } + ws.set_rQi(rQi); + FBU.lastsubencoding = FBU.subencoding; + FBU.bytes = 0; + FBU.tiles -= 1; + } + + if (FBU.tiles === 0) { + FBU.rects -= 1; + } + + //Util.Debug("<< display_hextile"); + return true; +}; + + +// Get 'compact length' header and data size +getTightCLength = function (arr) { + var header = 1, data = 0; + data += arr[0] & 0x7f; + if (arr[0] & 0x80) { + header += 1; + data += (arr[1] & 0x7f) << 7; + if (arr[1] & 0x80) { + header += 1; + data += arr[2] << 14; + } + } + return [header, data]; +}; + +function display_tight(isTightPNG) { + //Util.Debug(">> display_tight"); + + if (fb_depth === 1) { + fail("Tight protocol handler only implements true color mode"); + } + + var ctl, cmode, clength, color, img, data; + var filterId = -1, resetStreams = 0, streamId = -1; + var rQ = ws.get_rQ(), rQi = ws.get_rQi(); + + FBU.bytes = 1; // compression-control byte + if (ws.rQwait("TIGHT compression-control", FBU.bytes)) { return false; } + + var checksum = function(data) { + var sum=0, i; + for (i=0; i 65536) sum -= 65536; + } + return sum; + } + + var decompress = function(data) { + for (var i=0; i<4; i++) { + if ((resetStreams >> i) & 1) { + FBU.zlibs[i].reset(); + Util.Info("Reset zlib stream " + i); + } + } + var uncompressed = FBU.zlibs[streamId].uncompress(data, 0); + if (uncompressed.status !== 0) { + Util.Error("Invalid data in zlib stream"); + } + //Util.Warn("Decompressed " + data.length + " to " + + // uncompressed.data.length + " checksums " + + // checksum(data) + ":" + checksum(uncompressed.data)); + + return uncompressed.data; + } + + var indexedToRGB = function (data, numColors, palette, width, height) { + // Convert indexed (palette based) image data to RGB + // TODO: reduce number of calculations inside loop + var dest = []; + var x, y, b, w, w1, dp, sp; + if (numColors === 2) { + w = Math.floor((width + 7) / 8); + w1 = Math.floor(width / 8); + for (y = 0; y < height; y++) { + for (x = 0; x < w1; x++) { + for (b = 7; b >= 0; b--) { + dp = (y*width + x*8 + 7-b) * 3; + sp = (data[y*w + x] >> b & 1) * 3; + dest[dp ] = palette[sp ]; + dest[dp+1] = palette[sp+1]; + dest[dp+2] = palette[sp+2]; + } + } + for (b = 7; b >= 8 - width % 8; b--) { + dp = (y*width + x*8 + 7-b) * 3; + sp = (data[y*w + x] >> b & 1) * 3; + dest[dp ] = palette[sp ]; + dest[dp+1] = palette[sp+1]; + dest[dp+2] = palette[sp+2]; + } + } + } else { + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + dp = (y*width + x) * 3; + sp = data[y*width + x] * 3; + dest[dp ] = palette[sp ]; + dest[dp+1] = palette[sp+1]; + dest[dp+2] = palette[sp+2]; + } + } + } + return dest; + }; + var handlePalette = function() { + var numColors = rQ[rQi + 2] + 1; + var paletteSize = numColors * fb_depth; + FBU.bytes += paletteSize; + if (ws.rQwait("TIGHT palette " + cmode, FBU.bytes)) { return false; } + + var bpp = (numColors <= 2) ? 1 : 8; + var rowSize = Math.floor((FBU.width * bpp + 7) / 8); + var raw = false; + if (rowSize * FBU.height < 12) { + raw = true; + clength = [0, rowSize * FBU.height]; + } else { + clength = getTightCLength(ws.rQslice(3 + paletteSize, + 3 + paletteSize + 3)); + } + FBU.bytes += clength[0] + clength[1]; + if (ws.rQwait("TIGHT " + cmode, FBU.bytes)) { return false; } + + // Shift ctl, filter id, num colors, palette entries, and clength off + ws.rQshiftBytes(3); + var palette = ws.rQshiftBytes(paletteSize); + ws.rQshiftBytes(clength[0]); + + if (raw) { + data = ws.rQshiftBytes(clength[1]); + } else { + data = decompress(ws.rQshiftBytes(clength[1])); + } + + // Convert indexed (palette based) image data to RGB + var rgb = indexedToRGB(data, numColors, palette, FBU.width, FBU.height); + + // Add it to the render queue + display.renderQ_push({ + 'type': 'blitRgb', + 'data': rgb, + 'x': FBU.x, + 'y': FBU.y, + 'width': FBU.width, + 'height': FBU.height}); + return true; + } + + var handleCopy = function() { + var raw = false; + var uncompressedSize = FBU.width * FBU.height * fb_depth; + if (uncompressedSize < 12) { + raw = true; + clength = [0, uncompressedSize]; + } else { + clength = getTightCLength(ws.rQslice(1, 4)); + } + FBU.bytes = 1 + clength[0] + clength[1]; + if (ws.rQwait("TIGHT " + cmode, FBU.bytes)) { return false; } + + // Shift ctl, clength off + ws.rQshiftBytes(1 + clength[0]); + + if (raw) { + data = ws.rQshiftBytes(clength[1]); + } else { + data = decompress(ws.rQshiftBytes(clength[1])); + } + + display.renderQ_push({ + 'type': 'blitRgb', + 'data': data, + 'x': FBU.x, + 'y': FBU.y, + 'width': FBU.width, + 'height': FBU.height}); + return true; + } + + ctl = ws.rQpeek8(); + + // Keep tight reset bits + resetStreams = ctl & 0xF; + + // Figure out filter + ctl = ctl >> 4; + streamId = ctl & 0x3; + + if (ctl === 0x08) cmode = "fill"; + else if (ctl === 0x09) cmode = "jpeg"; + else if (ctl === 0x0A) cmode = "png"; + else if (ctl & 0x04) cmode = "filter"; + else if (ctl < 0x04) cmode = "copy"; + else return fail("Illegal tight compression received, ctl: " + ctl); + + if (isTightPNG && (cmode === "filter" || cmode === "copy")) { + return fail("filter/copy received in tightPNG mode"); + } + + switch (cmode) { + // fill uses fb_depth because TPIXELs drop the padding byte + case "fill": FBU.bytes += fb_depth; break; // TPIXEL + case "jpeg": FBU.bytes += 3; break; // max clength + case "png": FBU.bytes += 3; break; // max clength + case "filter": FBU.bytes += 2; break; // filter id + num colors if palette + case "copy": break; + } + + if (ws.rQwait("TIGHT " + cmode, FBU.bytes)) { return false; } + + //Util.Debug(" ws.rQslice(0,20): " + ws.rQslice(0,20) + " (" + ws.rQlen() + ")"); + //Util.Debug(" cmode: " + cmode); + + // Determine FBU.bytes + switch (cmode) { + case "fill": + ws.rQshift8(); // shift off ctl + color = ws.rQshiftBytes(fb_depth); + display.renderQ_push({ + 'type': 'fill', + 'x': FBU.x, + 'y': FBU.y, + 'width': FBU.width, + 'height': FBU.height, + 'color': [color[2], color[1], color[0]] }); + break; + case "png": + case "jpeg": + clength = getTightCLength(ws.rQslice(1, 4)); + FBU.bytes = 1 + clength[0] + clength[1]; // ctl + clength size + jpeg-data + if (ws.rQwait("TIGHT " + cmode, FBU.bytes)) { return false; } + + // We have everything, render it + //Util.Debug(" jpeg, ws.rQlen(): " + ws.rQlen() + ", clength[0]: " + + // clength[0] + ", clength[1]: " + clength[1]); + ws.rQshiftBytes(1 + clength[0]); // shift off ctl + compact length + img = new Image(); + img.src = "data:image/" + cmode + + extract_data_uri(ws.rQshiftBytes(clength[1])); + display.renderQ_push({ + 'type': 'img', + 'img': img, + 'x': FBU.x, + 'y': FBU.y}); + img = null; + break; + case "filter": + filterId = rQ[rQi + 1]; + if (filterId === 1) { + if (!handlePalette()) { return false; } + } else { + // Filter 0, Copy could be valid here, but servers don't send it as an explicit filter + // Filter 2, Gradient is valid but not used if jpeg is enabled + throw("Unsupported tight subencoding received, filter: " + filterId); + } + break; + case "copy": + if (!handleCopy()) { return false; } + break; + } + + FBU.bytes = 0; + FBU.rects -= 1; + //Util.Debug(" ending ws.rQslice(0,20): " + ws.rQslice(0,20) + " (" + ws.rQlen() + ")"); + //Util.Debug("<< display_tight_png"); + return true; +} + +extract_data_uri = function(arr) { + //var i, stra = []; + //for (i=0; i< arr.length; i += 1) { + // stra.push(String.fromCharCode(arr[i])); + //} + //return "," + escape(stra.join('')); + return ";base64," + Base64.encode(arr); +}; + +encHandlers.TIGHT = function () { return display_tight(false); }; +encHandlers.TIGHT_PNG = function () { return display_tight(true); }; + +encHandlers.last_rect = function last_rect() { + //Util.Debug(">> last_rect"); + FBU.rects = 0; + //Util.Debug("<< last_rect"); + return true; +}; + +encHandlers.DesktopSize = function set_desktopsize() { + Util.Debug(">> set_desktopsize"); + fb_width = FBU.width; + fb_height = FBU.height; + conf.onFBResize(that, fb_width, fb_height); + display.resize(fb_width, fb_height); + timing.fbu_rt_start = (new Date()).getTime(); + + FBU.bytes = 0; + FBU.rects -= 1; + + Util.Debug("<< set_desktopsize"); + return true; +}; + +encHandlers.Cursor = function set_cursor() { + var x, y, w, h, pixelslength, masklength; + Util.Debug(">> set_cursor"); + x = FBU.x; // hotspot-x + y = FBU.y; // hotspot-y + w = FBU.width; + h = FBU.height; + + pixelslength = w * h * fb_Bpp; + masklength = Math.floor((w + 7) / 8) * h; + + FBU.bytes = pixelslength + masklength; + if (ws.rQwait("cursor encoding", FBU.bytes)) { return false; } + + //Util.Debug(" set_cursor, x: " + x + ", y: " + y + ", w: " + w + ", h: " + h); + + display.changeCursor(ws.rQshiftBytes(pixelslength), + ws.rQshiftBytes(masklength), + x, y, w, h); + + FBU.bytes = 0; + FBU.rects -= 1; + + Util.Debug("<< set_cursor"); + return true; +}; + +encHandlers.JPEG_quality_lo = function set_jpeg_quality() { + Util.Error("Server sent jpeg_quality pseudo-encoding"); +}; + +encHandlers.compress_lo = function set_compress_level() { + Util.Error("Server sent compress level pseudo-encoding"); +}; + +/* + * Client message routines + */ + +pixelFormat = function() { + //Util.Debug(">> pixelFormat"); + var arr; + arr = [0]; // msg-type + arr.push8(0); // padding + arr.push8(0); // padding + arr.push8(0); // padding + + arr.push8(fb_Bpp * 8); // bits-per-pixel + arr.push8(fb_depth * 8); // depth + arr.push8(0); // little-endian + arr.push8(conf.true_color ? 1 : 0); // true-color + + arr.push16(255); // red-max + arr.push16(255); // green-max + arr.push16(255); // blue-max + arr.push8(16); // red-shift + arr.push8(8); // green-shift + arr.push8(0); // blue-shift + + arr.push8(0); // padding + arr.push8(0); // padding + arr.push8(0); // padding + //Util.Debug("<< pixelFormat"); + return arr; +}; + +clientEncodings = function() { + //Util.Debug(">> clientEncodings"); + var arr, i, encList = []; + + for (i=0; i> fbUpdateRequest"); + if (typeof(x) === "undefined") { x = 0; } + if (typeof(y) === "undefined") { y = 0; } + if (typeof(xw) === "undefined") { xw = fb_width; } + if (typeof(yw) === "undefined") { yw = fb_height; } + var arr; + arr = [3]; // msg-type + arr.push8(incremental); + arr.push16(x); + arr.push16(y); + arr.push16(xw); + arr.push16(yw); + //Util.Debug("<< fbUpdateRequest"); + return arr; +}; + +// Based on clean/dirty areas, generate requests to send +fbUpdateRequests = function() { + var cleanDirty = display.getCleanDirtyReset(), + arr = [], i, cb, db; + + cb = cleanDirty.cleanBox; + if (cb.w > 0 && cb.h > 0) { + // Request incremental for clean box + arr = arr.concat(fbUpdateRequest(1, cb.x, cb.y, cb.w, cb.h)); + } + for (i = 0; i < cleanDirty.dirtyBoxes.length; i++) { + db = cleanDirty.dirtyBoxes[i]; + // Force all (non-incremental for dirty box + arr = arr.concat(fbUpdateRequest(0, db.x, db.y, db.w, db.h)); + } + return arr; +}; + + + +keyEvent = function(keysym, down) { + //Util.Debug(">> keyEvent, keysym: " + keysym + ", down: " + down); + var arr; + arr = [4]; // msg-type + arr.push8(down); + arr.push16(0); + arr.push32(keysym); + //Util.Debug("<< keyEvent"); + return arr; +}; + +pointerEvent = function(x, y) { + //Util.Debug(">> pointerEvent, x,y: " + x + "," + y + + // " , mask: " + mouse_buttonMask); + var arr; + arr = [5]; // msg-type + arr.push8(mouse_buttonMask); + arr.push16(x); + arr.push16(y); + //Util.Debug("<< pointerEvent"); + return arr; +}; + +clientCutText = function(text) { + //Util.Debug(">> clientCutText"); + var arr, i, n; + arr = [6]; // msg-type + arr.push8(0); // padding + arr.push8(0); // padding + arr.push8(0); // padding + arr.push32(text.length); + n = text.length; + for (i=0; i < n; i+=1) { + arr.push(text.charCodeAt(i)); + } + //Util.Debug("<< clientCutText:" + arr); + return arr; +}; + + + +// +// Public API interface functions +// + +that.connect = function(host, port, password, path) { + //Util.Debug(">> connect"); + + rfb_host = host; + rfb_port = port; + rfb_password = (password !== undefined) ? password : ""; + rfb_path = (path !== undefined) ? path : ""; + + if ((!rfb_host) || (!rfb_port)) { + return fail("Must set host and port"); + } + + updateState('connect'); + //Util.Debug("<< connect"); + +}; + +that.disconnect = function() { + //Util.Debug(">> disconnect"); + updateState('disconnect', 'Disconnecting'); + //Util.Debug("<< disconnect"); +}; + +that.sendPassword = function(passwd) { + rfb_password = passwd; + rfb_state = "Authentication"; + setTimeout(init_msg, 1); +}; + +that.sendCtrlAltDel = function() { + if (rfb_state !== "normal" || conf.view_only) { return false; } + Util.Info("Sending Ctrl-Alt-Del"); + var arr = []; + arr = arr.concat(keyEvent(0xFFE3, 1)); // Control + arr = arr.concat(keyEvent(0xFFE9, 1)); // Alt + arr = arr.concat(keyEvent(0xFFFF, 1)); // Delete + arr = arr.concat(keyEvent(0xFFFF, 0)); // Delete + arr = arr.concat(keyEvent(0xFFE9, 0)); // Alt + arr = arr.concat(keyEvent(0xFFE3, 0)); // Control + ws.send(arr); +}; + +that.xvpOp = function(ver, op) { + if (rfb_xvp_ver < ver) { return false; } + Util.Info("Sending XVP operation " + op + " (version " + ver + ")") + ws.send_string("\xFA\x00" + String.fromCharCode(ver) + String.fromCharCode(op)); + return true; +}; + +that.xvpShutdown = function() { + return that.xvpOp(1, 2); +}; + +that.xvpReboot = function() { + return that.xvpOp(1, 3); +}; + +that.xvpReset = function() { + return that.xvpOp(1, 4); +}; + +// Send a key press. If 'down' is not specified then send a down key +// followed by an up key. +that.sendKey = function(code, down) { + if (rfb_state !== "normal" || conf.view_only) { return false; } + var arr = []; + if (typeof down !== 'undefined') { + Util.Info("Sending key code (" + (down ? "down" : "up") + "): " + code); + arr = arr.concat(keyEvent(code, down ? 1 : 0)); + } else { + Util.Info("Sending key code (down + up): " + code); + arr = arr.concat(keyEvent(code, 1)); + arr = arr.concat(keyEvent(code, 0)); + } + ws.send(arr); +}; + +that.clipboardPasteFrom = function(text) { + if (rfb_state !== "normal") { return; } + //Util.Debug(">> clipboardPasteFrom: " + text.substr(0,40) + "..."); + ws.send(clientCutText(text)); + //Util.Debug("<< clipboardPasteFrom"); +}; + +// Override internal functions for testing +that.testMode = function(override_send, data_mode) { + test_mode = true; + that.recv_message = ws.testMode(override_send, data_mode); + + checkEvents = function () { /* Stub Out */ }; + that.connect = function(host, port, password) { + rfb_host = host; + rfb_port = port; + rfb_password = password; + init_vars(); + updateState('ProtocolVersion', "Starting VNC handshake"); + }; +}; + + +return constructor(); // Return the public API interface + +} // End of RFB() diff --git a/noVNC/include/ui.js b/noVNC/include/ui.js new file mode 100644 index 0000000..f852463 --- /dev/null +++ b/noVNC/include/ui.js @@ -0,0 +1,961 @@ +/* + * noVNC: HTML5 VNC client + * Copyright (C) 2012 Joel Martin + * Copyright (C) 2013 Samuel Mannehed for Cendio AB + * Licensed under MPL 2.0 (see LICENSE.txt) + * + * See README.md for usage and integration instructions. + */ + +"use strict"; +/*jslint white: false, browser: true */ +/*global window, $D, Util, WebUtil, RFB, Display */ + +// Load supporting scripts +window.onscriptsload = function () { UI.load(); }; +Util.load_scripts(["webutil.js", "base64.js", "websock.js", "des.js", + "keysymdef.js", "keyboard.js", "input.js", "display.js", + "jsunzip.js", "rfb.js", "keysym.js"]); + +var UI = { + +rfb_state : 'loaded', +settingsOpen : false, +connSettingsOpen : false, +popupStatusOpen : false, +clipboardOpen: false, +keyboardVisible: false, +hideKeyboardTimeout: null, +extraKeysVisible: false, +ctrlOn: false, +altOn: false, +isTouchDevice: false, + +// Setup rfb object, load settings from browser storage, then call +// UI.init to setup the UI/menus +load: function (callback) { + WebUtil.initSettings(UI.start, callback); +}, + +// Render default UI and initialize settings menu +start: function(callback) { + var html = '', i, sheet, sheets, llevels, port, autoconnect; + + UI.isTouchDevice = 'ontouchstart' in document.documentElement; + + // Stylesheet selection dropdown + sheet = WebUtil.selectStylesheet(); + sheets = WebUtil.getStylesheets(); + for (i = 0; i < sheets.length; i += 1) { + UI.addOption($D('noVNC_stylesheet'),sheets[i].title, sheets[i].title); + } + + // Logging selection dropdown + llevels = ['error', 'warn', 'info', 'debug']; + for (i = 0; i < llevels.length; i += 1) { + UI.addOption($D('noVNC_logging'),llevels[i], llevels[i]); + } + + // Settings with immediate effects + UI.initSetting('logging', 'warn'); + WebUtil.init_logging(UI.getSetting('logging')); + + UI.initSetting('stylesheet', 'default'); + WebUtil.selectStylesheet(null); + // call twice to get around webkit bug + WebUtil.selectStylesheet(UI.getSetting('stylesheet')); + + // if port == 80 (or 443) then it won't be present and should be + // set manually + port = window.location.port; + if (!port) { + if (window.location.protocol.substring(0,5) == 'https') { + port = 443; + } + else if (window.location.protocol.substring(0,4) == 'http') { + port = 80; + } + } + + /* Populate the controls if defaults are provided in the URL */ + UI.initSetting('host', window.location.hostname); + UI.initSetting('port', port); + UI.initSetting('password', ''); + UI.initSetting('encrypt', (window.location.protocol === "https:")); + UI.initSetting('true_color', true); + UI.initSetting('cursor', !UI.isTouchDevice); + UI.initSetting('shared', true); + UI.initSetting('view_only', false); + UI.initSetting('path', 'websockify'); + UI.initSetting('repeaterID', ''); + + UI.rfb = RFB({'target': $D('noVNC_canvas'), + 'onUpdateState': UI.updateState, + 'onXvpInit': UI.updateXvpVisualState, + 'onClipboard': UI.clipReceive, + 'onDesktopName': UI.updateDocumentTitle}); + + autoconnect = WebUtil.getQueryVar('autoconnect', false); + if (autoconnect === 'true' || autoconnect == '1') { + autoconnect = true; + UI.connect(); + } else { + autoconnect = false; + } + + UI.updateVisualState(); + + // Unfocus clipboard when over the VNC area + //$D('VNC_screen').onmousemove = function () { + // var keyboard = UI.rfb.get_keyboard(); + // if ((! keyboard) || (! keyboard.get_focused())) { + // $D('VNC_clipboard_text').blur(); + // } + // }; + + // Show mouse selector buttons on touch screen devices + if (UI.isTouchDevice) { + // Show mobile buttons + $D('noVNC_mobile_buttons').style.display = "inline"; + UI.setMouseButton(); + // Remove the address bar + setTimeout(function() { window.scrollTo(0, 1); }, 100); + UI.forceSetting('clip', true); + $D('noVNC_clip').disabled = true; + } else { + UI.initSetting('clip', false); + } + + //iOS Safari does not support CSS position:fixed. + //This detects iOS devices and enables javascript workaround. + if ((navigator.userAgent.match(/iPhone/i)) || + (navigator.userAgent.match(/iPod/i)) || + (navigator.userAgent.match(/iPad/i))) { + //UI.setOnscroll(); + //UI.setResize(); + } + UI.setBarPosition(); + + $D('noVNC_host').focus(); + + UI.setViewClip(); + Util.addEvent(window, 'resize', UI.setViewClip); + + Util.addEvent(window, 'beforeunload', function () { + if (UI.rfb_state === 'normal') { + return "You are currently connected."; + } + } ); + + // Show description by default when hosted at for kanaka.github.com + if (location.host === "kanaka.github.io") { + // Open the description dialog + $D('noVNC_description').style.display = "block"; + } else { + // Show the connect panel on first load unless autoconnecting + if (autoconnect === UI.connSettingsOpen) { + UI.toggleConnectPanel(); + } + } + + // Add mouse event click/focus/blur event handlers to the UI + UI.addMouseHandlers(); + + if (typeof callback === "function") { + callback(UI.rfb); + } +}, + +addMouseHandlers: function() { + // Setup interface handlers that can't be inline + $D("noVNC_view_drag_button").onclick = UI.setViewDrag; + $D("noVNC_mouse_button0").onclick = function () { UI.setMouseButton(1); }; + $D("noVNC_mouse_button1").onclick = function () { UI.setMouseButton(2); }; + $D("noVNC_mouse_button2").onclick = function () { UI.setMouseButton(4); }; + $D("noVNC_mouse_button4").onclick = function () { UI.setMouseButton(0); }; + $D("showKeyboard").onclick = UI.showKeyboard; + + $D("keyboardinput").oninput = UI.keyInput; + $D("keyboardinput").onblur = UI.keyInputBlur; + + $D("showExtraKeysButton").onclick = UI.showExtraKeys; + $D("toggleCtrlButton").onclick = UI.toggleCtrl; + $D("toggleAltButton").onclick = UI.toggleAlt; + $D("sendTabButton").onclick = UI.sendTab; + $D("sendEscButton").onclick = UI.sendEsc; + + $D("sendCtrlAltDelButton").onclick = UI.sendCtrlAltDel; + $D("xvpShutdownButton").onclick = UI.xvpShutdown; + $D("xvpRebootButton").onclick = UI.xvpReboot; + $D("xvpResetButton").onclick = UI.xvpReset; + $D("noVNC_status").onclick = UI.togglePopupStatusPanel; + $D("noVNC_popup_status_panel").onclick = UI.togglePopupStatusPanel; + $D("xvpButton").onclick = UI.toggleXvpPanel; + $D("clipboardButton").onclick = UI.toggleClipboardPanel; + $D("settingsButton").onclick = UI.toggleSettingsPanel; + $D("connectButton").onclick = UI.toggleConnectPanel; + $D("disconnectButton").onclick = UI.disconnect; + $D("descriptionButton").onclick = UI.toggleConnectPanel; + + $D("noVNC_clipboard_text").onfocus = UI.displayBlur; + $D("noVNC_clipboard_text").onblur = UI.displayFocus; + $D("noVNC_clipboard_text").onchange = UI.clipSend; + $D("noVNC_clipboard_clear_button").onclick = UI.clipClear; + + $D("noVNC_settings_menu").onmouseover = UI.displayBlur; + $D("noVNC_settings_menu").onmouseover = UI.displayFocus; + $D("noVNC_apply").onclick = UI.settingsApply; + + $D("noVNC_connect_button").onclick = UI.connect; +}, + +// Read form control compatible setting from cookie +getSetting: function(name) { + var val, ctrl = $D('noVNC_' + name); + val = WebUtil.readSetting(name); + if (val !== null && ctrl.type === 'checkbox') { + if (val.toString().toLowerCase() in {'0':1, 'no':1, 'false':1}) { + val = false; + } else { + val = true; + } + } + return val; +}, + +// Update cookie and form control setting. If value is not set, then +// updates from control to current cookie setting. +updateSetting: function(name, value) { + + var i, ctrl = $D('noVNC_' + name); + // Save the cookie for this session + if (typeof value !== 'undefined') { + WebUtil.writeSetting(name, value); + } + + // Update the settings control + value = UI.getSetting(name); + + if (ctrl.type === 'checkbox') { + ctrl.checked = value; + + } else if (typeof ctrl.options !== 'undefined') { + for (i = 0; i < ctrl.options.length; i += 1) { + if (ctrl.options[i].value === value) { + ctrl.selectedIndex = i; + break; + } + } + } else { + /*Weird IE9 error leads to 'null' appearring + in textboxes instead of ''.*/ + if (value === null) { + value = ""; + } + ctrl.value = value; + } +}, + +// Save control setting to cookie +saveSetting: function(name) { + var val, ctrl = $D('noVNC_' + name); + if (ctrl.type === 'checkbox') { + val = ctrl.checked; + } else if (typeof ctrl.options !== 'undefined') { + val = ctrl.options[ctrl.selectedIndex].value; + } else { + val = ctrl.value; + } + WebUtil.writeSetting(name, val); + //Util.Debug("Setting saved '" + name + "=" + val + "'"); + return val; +}, + +// Initial page load read/initialization of settings +initSetting: function(name, defVal) { + var val; + + // Check Query string followed by cookie + val = WebUtil.getQueryVar(name); + if (val === null) { + val = WebUtil.readSetting(name, defVal); + } + UI.updateSetting(name, val); + //Util.Debug("Setting '" + name + "' initialized to '" + val + "'"); + return val; +}, + +// Force a setting to be a certain value +forceSetting: function(name, val) { + UI.updateSetting(name, val); + return val; +}, + + +// Show the popup status panel +togglePopupStatusPanel: function() { + var psp = $D('noVNC_popup_status_panel'); + if (UI.popupStatusOpen === true) { + psp.style.display = "none"; + UI.popupStatusOpen = false; + } else { + psp.innerHTML = $D('noVNC_status').innerHTML; + psp.style.display = "block"; + psp.style.left = window.innerWidth/2 - + parseInt(window.getComputedStyle(psp, false).width)/2 -30 + "px"; + UI.popupStatusOpen = true; + } +}, + +// Show the XVP panel +toggleXvpPanel: function() { + // Close the description panel + $D('noVNC_description').style.display = "none"; + // Close settings if open + if (UI.settingsOpen === true) { + UI.settingsApply(); + UI.closeSettingsMenu(); + } + // Close connection settings if open + if (UI.connSettingsOpen === true) { + UI.toggleConnectPanel(); + } + // Close popup status panel if open + if (UI.popupStatusOpen === true) { + UI.togglePopupStatusPanel(); + } + // Close clipboard panel if open + if (UI.clipboardOpen === true) { + UI.toggleClipboardPanel(); + } + // Toggle XVP panel + if (UI.xvpOpen === true) { + $D('noVNC_xvp').style.display = "none"; + $D('xvpButton').className = "noVNC_status_button"; + UI.xvpOpen = false; + } else { + $D('noVNC_xvp').style.display = "block"; + $D('xvpButton').className = "noVNC_status_button_selected"; + UI.xvpOpen = true; + } +}, + +// Show the clipboard panel +toggleClipboardPanel: function() { + // Close the description panel + $D('noVNC_description').style.display = "none"; + // Close settings if open + if (UI.settingsOpen === true) { + UI.settingsApply(); + UI.closeSettingsMenu(); + } + // Close connection settings if open + if (UI.connSettingsOpen === true) { + UI.toggleConnectPanel(); + } + // Close popup status panel if open + if (UI.popupStatusOpen === true) { + UI.togglePopupStatusPanel(); + } + // Close XVP panel if open + if (UI.xvpOpen === true) { + UI.toggleXvpPanel(); + } + // Toggle Clipboard Panel + if (UI.clipboardOpen === true) { + $D('noVNC_clipboard').style.display = "none"; + $D('clipboardButton').className = "noVNC_status_button"; + UI.clipboardOpen = false; + } else { + $D('noVNC_clipboard').style.display = "block"; + $D('clipboardButton').className = "noVNC_status_button_selected"; + UI.clipboardOpen = true; + } +}, + +// Show the connection settings panel/menu +toggleConnectPanel: function() { + // Close the description panel + $D('noVNC_description').style.display = "none"; + // Close connection settings if open + if (UI.settingsOpen === true) { + UI.settingsApply(); + UI.closeSettingsMenu(); + $D('connectButton').className = "noVNC_status_button"; + } + // Close clipboard panel if open + if (UI.clipboardOpen === true) { + UI.toggleClipboardPanel(); + } + // Close popup status panel if open + if (UI.popupStatusOpen === true) { + UI.togglePopupStatusPanel(); + } + // Close XVP panel if open + if (UI.xvpOpen === true) { + UI.toggleXvpPanel(); + } + + // Toggle Connection Panel + if (UI.connSettingsOpen === true) { + $D('noVNC_controls').style.display = "none"; + $D('connectButton').className = "noVNC_status_button"; + UI.connSettingsOpen = false; + UI.saveSetting('host'); + UI.saveSetting('port'); + //UI.saveSetting('password'); + } else { + $D('noVNC_controls').style.display = "block"; + $D('connectButton').className = "noVNC_status_button_selected"; + UI.connSettingsOpen = true; + $D('noVNC_host').focus(); + } +}, + +// Toggle the settings menu: +// On open, settings are refreshed from saved cookies. +// On close, settings are applied +toggleSettingsPanel: function() { + // Close the description panel + $D('noVNC_description').style.display = "none"; + if (UI.settingsOpen) { + UI.settingsApply(); + UI.closeSettingsMenu(); + } else { + UI.updateSetting('encrypt'); + UI.updateSetting('true_color'); + if (UI.rfb.get_display().get_cursor_uri()) { + UI.updateSetting('cursor'); + } else { + UI.updateSetting('cursor', !UI.isTouchDevice); + $D('noVNC_cursor').disabled = true; + } + UI.updateSetting('clip'); + UI.updateSetting('shared'); + UI.updateSetting('view_only'); + UI.updateSetting('path'); + UI.updateSetting('repeaterID'); + UI.updateSetting('stylesheet'); + UI.updateSetting('logging'); + + UI.openSettingsMenu(); + } +}, + +// Open menu +openSettingsMenu: function() { + // Close the description panel + $D('noVNC_description').style.display = "none"; + // Close clipboard panel if open + if (UI.clipboardOpen === true) { + UI.toggleClipboardPanel(); + } + // Close connection settings if open + if (UI.connSettingsOpen === true) { + UI.toggleConnectPanel(); + } + // Close popup status panel if open + if (UI.popupStatusOpen === true) { + UI.togglePopupStatusPanel(); + } + // Close XVP panel if open + if (UI.xvpOpen === true) { + UI.toggleXvpPanel(); + } + $D('noVNC_settings').style.display = "block"; + $D('settingsButton').className = "noVNC_status_button_selected"; + UI.settingsOpen = true; +}, + +// Close menu (without applying settings) +closeSettingsMenu: function() { + $D('noVNC_settings').style.display = "none"; + $D('settingsButton').className = "noVNC_status_button"; + UI.settingsOpen = false; +}, + +// Save/apply settings when 'Apply' button is pressed +settingsApply: function() { + //Util.Debug(">> settingsApply"); + UI.saveSetting('encrypt'); + UI.saveSetting('true_color'); + if (UI.rfb.get_display().get_cursor_uri()) { + UI.saveSetting('cursor'); + } + UI.saveSetting('clip'); + UI.saveSetting('shared'); + UI.saveSetting('view_only'); + UI.saveSetting('path'); + UI.saveSetting('repeaterID'); + UI.saveSetting('stylesheet'); + UI.saveSetting('logging'); + + // Settings with immediate (non-connected related) effect + WebUtil.selectStylesheet(UI.getSetting('stylesheet')); + WebUtil.init_logging(UI.getSetting('logging')); + UI.setViewClip(); + UI.setViewDrag(UI.rfb.get_viewportDrag()); + //Util.Debug("<< settingsApply"); +}, + + + +setPassword: function() { + UI.rfb.sendPassword($D('noVNC_password').value); + //Reset connect button. + $D('noVNC_connect_button').value = "Connect"; + $D('noVNC_connect_button').onclick = UI.Connect; + //Hide connection panel. + UI.toggleConnectPanel(); + return false; +}, + +sendCtrlAltDel: function() { + UI.rfb.sendCtrlAltDel(); +}, + +xvpShutdown: function() { + UI.rfb.xvpShutdown(); +}, + +xvpReboot: function() { + UI.rfb.xvpReboot(); +}, + +xvpReset: function() { + UI.rfb.xvpReset(); +}, + +setMouseButton: function(num) { + var b, blist = [0, 1,2,4], button; + + if (typeof num === 'undefined') { + // Disable mouse buttons + num = -1; + } + if (UI.rfb) { + UI.rfb.get_mouse().set_touchButton(num); + } + + for (b = 0; b < blist.length; b++) { + button = $D('noVNC_mouse_button' + blist[b]); + if (blist[b] === num) { + button.style.display = ""; + } else { + button.style.display = "none"; + /* + button.style.backgroundColor = "black"; + button.style.color = "lightgray"; + button.style.backgroundColor = ""; + button.style.color = ""; + */ + } + } +}, + +updateState: function(rfb, state, oldstate, msg) { + var s, sb, c, d, cad, vd, klass; + UI.rfb_state = state; + switch (state) { + case 'failed': + case 'fatal': + klass = "noVNC_status_error"; + break; + case 'normal': + klass = "noVNC_status_normal"; + break; + case 'disconnected': + $D('noVNC_logo').style.display = "block"; + // Fall through + case 'loaded': + klass = "noVNC_status_normal"; + break; + case 'password': + UI.toggleConnectPanel(); + + $D('noVNC_connect_button').value = "Send Password"; + $D('noVNC_connect_button').onclick = UI.setPassword; + $D('noVNC_password').focus(); + + klass = "noVNC_status_warn"; + break; + default: + klass = "noVNC_status_warn"; + break; + } + + if (typeof(msg) !== 'undefined') { + $D('noVNC-control-bar').setAttribute("class", klass); + $D('noVNC_status').innerHTML = msg; + } + + UI.updateVisualState(); +}, + +// Disable/enable controls depending on connection state +updateVisualState: function() { + var connected = UI.rfb_state === 'normal' ? true : false; + + //Util.Debug(">> updateVisualState"); + $D('noVNC_encrypt').disabled = connected; + $D('noVNC_true_color').disabled = connected; + if (UI.rfb && UI.rfb.get_display() && + UI.rfb.get_display().get_cursor_uri()) { + $D('noVNC_cursor').disabled = connected; + } else { + UI.updateSetting('cursor', !UI.isTouchDevice); + $D('noVNC_cursor').disabled = true; + } + $D('noVNC_shared').disabled = connected; + $D('noVNC_view_only').disabled = connected; + $D('noVNC_path').disabled = connected; + $D('noVNC_repeaterID').disabled = connected; + + if (connected) { + UI.setViewClip(); + UI.setMouseButton(1); + $D('clipboardButton').style.display = "inline"; + $D('showKeyboard').style.display = "inline"; + $D('noVNC_extra_keys').style.display = ""; + $D('sendCtrlAltDelButton').style.display = "inline"; + } else { + UI.setMouseButton(); + $D('clipboardButton').style.display = "none"; + $D('showKeyboard').style.display = "none"; + $D('noVNC_extra_keys').style.display = "none"; + $D('sendCtrlAltDelButton').style.display = "none"; + UI.updateXvpVisualState(0); + } + + // State change disables viewport dragging. + // It is enabled (toggled) by direct click on the button + UI.setViewDrag(false); + + switch (UI.rfb_state) { + case 'fatal': + case 'failed': + case 'loaded': + case 'disconnected': + $D('connectButton').style.display = ""; + $D('disconnectButton').style.display = "none"; + break; + default: + $D('connectButton').style.display = "none"; + $D('disconnectButton').style.display = ""; + break; + } + + //Util.Debug("<< updateVisualState"); +}, + +// Disable/enable XVP button +updateXvpVisualState: function(ver) { + if (ver >= 1) { + $D('xvpButton').style.display = 'inline'; + } else { + $D('xvpButton').style.display = 'none'; + // Close XVP panel if open + if (UI.xvpOpen === true) { + UI.toggleXvpPanel(); + } + } +}, + + +// Display the desktop name in the document title +updateDocumentTitle: function(rfb, name) { + document.title = name + " - noVNC"; +}, + + +clipReceive: function(rfb, text) { + Util.Debug(">> UI.clipReceive: " + text.substr(0,40) + "..."); + $D('noVNC_clipboard_text').value = text; + Util.Debug("<< UI.clipReceive"); +}, + + +connect: function() { + var host, port, password, path; + + UI.closeSettingsMenu(); + UI.toggleConnectPanel(); + + host = $D('noVNC_host').value; + port = $D('noVNC_port').value; + password = $D('noVNC_password').value; + path = $D('noVNC_path').value; + if ((!host) || (!port)) { + throw("Must set host and port"); + } + + UI.rfb.set_encrypt(UI.getSetting('encrypt')); + UI.rfb.set_true_color(UI.getSetting('true_color')); + UI.rfb.set_local_cursor(UI.getSetting('cursor')); + UI.rfb.set_shared(UI.getSetting('shared')); + UI.rfb.set_view_only(UI.getSetting('view_only')); + UI.rfb.set_repeaterID(UI.getSetting('repeaterID')); + + UI.rfb.connect(host, port, password, path); + + //Close dialog. + setTimeout(UI.setBarPosition, 100); + $D('noVNC_logo').style.display = "none"; +}, + +disconnect: function() { + UI.closeSettingsMenu(); + UI.rfb.disconnect(); + + $D('noVNC_logo').style.display = "block"; + UI.connSettingsOpen = false; + UI.toggleConnectPanel(); +}, + +displayBlur: function() { + UI.rfb.get_keyboard().set_focused(false); + UI.rfb.get_mouse().set_focused(false); +}, + +displayFocus: function() { + UI.rfb.get_keyboard().set_focused(true); + UI.rfb.get_mouse().set_focused(true); +}, + +clipClear: function() { + $D('noVNC_clipboard_text').value = ""; + UI.rfb.clipboardPasteFrom(""); +}, + +clipSend: function() { + var text = $D('noVNC_clipboard_text').value; + Util.Debug(">> UI.clipSend: " + text.substr(0,40) + "..."); + UI.rfb.clipboardPasteFrom(text); + Util.Debug("<< UI.clipSend"); +}, + + +// Enable/disable and configure viewport clipping +setViewClip: function(clip) { + var display, cur_clip, pos, new_w, new_h; + + if (UI.rfb) { + display = UI.rfb.get_display(); + } else { + return; + } + + cur_clip = display.get_viewport(); + + if (typeof(clip) !== 'boolean') { + // Use current setting + clip = UI.getSetting('clip'); + } + + if (clip && !cur_clip) { + // Turn clipping on + UI.updateSetting('clip', true); + } else if (!clip && cur_clip) { + // Turn clipping off + UI.updateSetting('clip', false); + display.set_viewport(false); + $D('noVNC_canvas').style.position = 'static'; + display.viewportChange(); + } + if (UI.getSetting('clip')) { + // If clipping, update clipping settings + $D('noVNC_canvas').style.position = 'absolute'; + pos = Util.getPosition($D('noVNC_canvas')); + new_w = window.innerWidth - pos.x; + new_h = window.innerHeight - pos.y; + display.set_viewport(true); + display.viewportChange(0, 0, new_w, new_h); + } +}, + +// Toggle/set/unset the viewport drag/move button +setViewDrag: function(drag) { + var vmb = $D('noVNC_view_drag_button'); + if (!UI.rfb) { return; } + + if (UI.rfb_state === 'normal' && + UI.rfb.get_display().get_viewport()) { + vmb.style.display = "inline"; + } else { + vmb.style.display = "none"; + } + + if (typeof(drag) === "undefined" || + typeof(drag) === "object") { + // If not specified, then toggle + drag = !UI.rfb.get_viewportDrag(); + } + if (drag) { + vmb.className = "noVNC_status_button_selected"; + UI.rfb.set_viewportDrag(true); + } else { + vmb.className = "noVNC_status_button"; + UI.rfb.set_viewportDrag(false); + } +}, + +// On touch devices, show the OS keyboard +showKeyboard: function() { + var kbi, skb, l; + kbi = $D('keyboardinput'); + skb = $D('showKeyboard'); + l = kbi.value.length; + if(UI.keyboardVisible === false) { + kbi.focus(); + kbi.setSelectionRange(l, l); // Move the caret to the end + UI.keyboardVisible = true; + skb.className = "noVNC_status_button_selected"; + } else if(UI.keyboardVisible === true) { + kbi.blur(); + skb.className = "noVNC_status_button"; + UI.keyboardVisible = false; + } +}, + +keepKeyboard: function() { + clearTimeout(UI.hideKeyboardTimeout); + if(UI.keyboardVisible === true) { + $D('keyboardinput').focus(); + $D('showKeyboard').className = "noVNC_status_button_selected"; + } else if(UI.keyboardVisible === false) { + $D('keyboardinput').blur(); + $D('showKeyboard').className = "noVNC_status_button"; + } +}, + +// When keypress events are left uncought, catch the input events from +// the keyboardinput element instead and send the corresponding key events. +keyInput: function(event) { + var elem, input, len; + elem = $D('keyboardinput'); + input = event.target.value; + len = (elem.selectionStart > input.length) ? elem.selectionStart : input.length; + + if (len < 1) { // something removed? + UI.rfb.sendKey(0xff08); // send BACKSPACE + } else if (len > 1) { // new input? + for (var i = len-1; i > 0; i -= 1) { + // HTML does not consider trailing whitespaces as a part of the string + // and they are therefore undefined. + if (input[len-i] !== undefined) { + UI.rfb.sendKey(input.charCodeAt(len-i)); // send charCode + } else { + UI.rfb.sendKey(0x0020); // send SPACE + } + } + } + + // In order to be able to delete text which has been written in + // another session there has to always be text in the + // keyboardinput element with which backspace can interact. + // We also need to reset the input field text to avoid overflow. + elem.value = "x"; +}, + +keyInputBlur: function() { + $D('showKeyboard').className = "noVNC_status_button"; + //Weird bug in iOS if you change keyboardVisible + //here it does not actually occur so next time + //you click keyboard icon it doesnt work. + UI.hideKeyboardTimeout = setTimeout(function() { UI.setKeyboard(); },100); +}, + +showExtraKeys: function() { + UI.keepKeyboard(); + if(UI.extraKeysVisible === false) { + $D('toggleCtrlButton').style.display = "inline"; + $D('toggleAltButton').style.display = "inline"; + $D('sendTabButton').style.display = "inline"; + $D('sendEscButton').style.display = "inline"; + $D('showExtraKeysButton').className = "noVNC_status_button_selected"; + UI.extraKeysVisible = true; + } else if(UI.extraKeysVisible === true) { + $D('toggleCtrlButton').style.display = ""; + $D('toggleAltButton').style.display = ""; + $D('sendTabButton').style.display = ""; + $D('sendEscButton').style.display = ""; + $D('showExtraKeysButton').className = "noVNC_status_button"; + UI.extraKeysVisible = false; + } +}, + +toggleCtrl: function() { + UI.keepKeyboard(); + if(UI.ctrlOn === false) { + UI.rfb.sendKey(XK_Control_L, true); + $D('toggleCtrlButton').className = "noVNC_status_button_selected"; + UI.ctrlOn = true; + } else if(UI.ctrlOn === true) { + UI.rfb.sendKey(XK_Control_L, false); + $D('toggleCtrlButton').className = "noVNC_status_button"; + UI.ctrlOn = false; + } +}, + +toggleAlt: function() { + UI.keepKeyboard(); + if(UI.altOn === false) { + UI.rfb.sendKey(XK_Alt_L, true); + $D('toggleAltButton').className = "noVNC_status_button_selected"; + UI.altOn = true; + } else if(UI.altOn === true) { + UI.rfb.sendKey(XK_Alt_L, false); + $D('toggleAltButton').className = "noVNC_status_button"; + UI.altOn = false; + } +}, + +sendTab: function() { + UI.keepKeyboard(); + UI.rfb.sendKey(XK_Tab); +}, + +sendEsc: function() { + UI.keepKeyboard(); + UI.rfb.sendKey(XK_Escape); +}, + +setKeyboard: function() { + UI.keyboardVisible = false; +}, + +// iOS < Version 5 does not support position fixed. Javascript workaround: +setOnscroll: function() { + window.onscroll = function() { + UI.setBarPosition(); + }; +}, + +setResize: function () { + window.onResize = function() { + UI.setBarPosition(); + }; +}, + +//Helper to add options to dropdown. +addOption: function(selectbox,text,value ) +{ + var optn = document.createElement("OPTION"); + optn.text = text; + optn.value = value; + selectbox.options.add(optn); +}, + +setBarPosition: function() { + $D('noVNC-control-bar').style.top = (window.pageYOffset) + 'px'; + $D('noVNC_mobile_buttons').style.left = (window.pageXOffset) + 'px'; + + var vncwidth = $D('noVNC_screen').style.offsetWidth; + $D('noVNC-control-bar').style.width = vncwidth + 'px'; +} + +}; + + + + diff --git a/noVNC/include/util.js b/noVNC/include/util.js new file mode 100644 index 0000000..8893591 --- /dev/null +++ b/noVNC/include/util.js @@ -0,0 +1,383 @@ +/* + * noVNC: HTML5 VNC client + * Copyright (C) 2012 Joel Martin + * Licensed under MPL 2.0 (see LICENSE.txt) + * + * See README.md for usage and integration instructions. + */ + +"use strict"; +/*jslint bitwise: false, white: false */ +/*global window, console, document, navigator, ActiveXObject */ + +// Globals defined here +var Util = {}; + + +/* + * Make arrays quack + */ + +Array.prototype.push8 = function (num) { + this.push(num & 0xFF); +}; + +Array.prototype.push16 = function (num) { + this.push((num >> 8) & 0xFF, + (num ) & 0xFF ); +}; +Array.prototype.push32 = function (num) { + this.push((num >> 24) & 0xFF, + (num >> 16) & 0xFF, + (num >> 8) & 0xFF, + (num ) & 0xFF ); +}; + +// IE does not support map (even in IE9) +//This prototype is provided by the Mozilla foundation and +//is distributed under the MIT license. +//http://www.ibiblio.org/pub/Linux/LICENSES/mit.license +if (!Array.prototype.map) +{ + Array.prototype.map = function(fun /*, thisp*/) + { + var len = this.length; + if (typeof fun != "function") + throw new TypeError(); + + var res = new Array(len); + var thisp = arguments[1]; + for (var i = 0; i < len; i++) + { + if (i in this) + res[i] = fun.call(thisp, this[i], i, this); + } + + return res; + }; +} + +// +// requestAnimationFrame shim with setTimeout fallback +// + +window.requestAnimFrame = (function(){ + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function(callback){ + window.setTimeout(callback, 1000 / 60); + }; +})(); + +/* + * ------------------------------------------------------ + * Namespaced in Util + * ------------------------------------------------------ + */ + +/* + * Logging/debug routines + */ + +Util._log_level = 'warn'; +Util.init_logging = function (level) { + if (typeof level === 'undefined') { + level = Util._log_level; + } else { + Util._log_level = level; + } + if (typeof window.console === "undefined") { + if (typeof window.opera !== "undefined") { + window.console = { + 'log' : window.opera.postError, + 'warn' : window.opera.postError, + 'error': window.opera.postError }; + } else { + window.console = { + 'log' : function(m) {}, + 'warn' : function(m) {}, + 'error': function(m) {}}; + } + } + + Util.Debug = Util.Info = Util.Warn = Util.Error = function (msg) {}; + switch (level) { + case 'debug': Util.Debug = function (msg) { console.log(msg); }; + case 'info': Util.Info = function (msg) { console.log(msg); }; + case 'warn': Util.Warn = function (msg) { console.warn(msg); }; + case 'error': Util.Error = function (msg) { console.error(msg); }; + case 'none': + break; + default: + throw("invalid logging type '" + level + "'"); + } +}; +Util.get_logging = function () { + return Util._log_level; +}; +// Initialize logging level +Util.init_logging(); + + +// Set configuration default for Crockford style function namespaces +Util.conf_default = function(cfg, api, defaults, v, mode, type, defval, desc) { + var getter, setter; + + // Default getter function + getter = function (idx) { + if ((type in {'arr':1, 'array':1}) && + (typeof idx !== 'undefined')) { + return cfg[v][idx]; + } else { + return cfg[v]; + } + }; + + // Default setter function + setter = function (val, idx) { + if (type in {'boolean':1, 'bool':1}) { + if ((!val) || (val in {'0':1, 'no':1, 'false':1})) { + val = false; + } else { + val = true; + } + } else if (type in {'integer':1, 'int':1}) { + val = parseInt(val, 10); + } else if (type === 'str') { + val = String(val); + } else if (type === 'func') { + if (!val) { + val = function () {}; + } + } + if (typeof idx !== 'undefined') { + cfg[v][idx] = val; + } else { + cfg[v] = val; + } + }; + + // Set the description + api[v + '_description'] = desc; + + // Set the getter function + if (typeof api['get_' + v] === 'undefined') { + api['get_' + v] = getter; + } + + // Set the setter function with extra sanity checks + if (typeof api['set_' + v] === 'undefined') { + api['set_' + v] = function (val, idx) { + if (mode in {'RO':1, 'ro':1}) { + throw(v + " is read-only"); + } else if ((mode in {'WO':1, 'wo':1}) && + (typeof cfg[v] !== 'undefined')) { + throw(v + " can only be set once"); + } + setter(val, idx); + }; + } + + // Set the default value + if (typeof defaults[v] !== 'undefined') { + defval = defaults[v]; + } else if ((type in {'arr':1, 'array':1}) && + (! (defval instanceof Array))) { + defval = []; + } + // Coerce existing setting to the right type + //Util.Debug("v: " + v + ", defval: " + defval + ", defaults[v]: " + defaults[v]); + setter(defval); +}; + +// Set group of configuration defaults +Util.conf_defaults = function(cfg, api, defaults, arr) { + var i; + for (i = 0; i < arr.length; i++) { + Util.conf_default(cfg, api, defaults, arr[i][0], arr[i][1], + arr[i][2], arr[i][3], arr[i][4]); + } +}; + + +/* + * Cross-browser routines + */ + + +// Dynamically load scripts without using document.write() +// Reference: http://unixpapa.com/js/dyna.html +// +// Handles the case where load_scripts is invoked from a script that +// itself is loaded via load_scripts. Once all scripts are loaded the +// window.onscriptsloaded handler is called (if set). +Util.get_include_uri = function() { + return (typeof INCLUDE_URI !== "undefined") ? INCLUDE_URI : "include/"; +} +Util._loading_scripts = []; +Util._pending_scripts = []; +Util.load_scripts = function(files) { + var head = document.getElementsByTagName('head')[0], script, + ls = Util._loading_scripts, ps = Util._pending_scripts; + for (var f=0; f 0 && (ls[0].readyState === 'loaded' || + ls[0].readyState === 'complete')) { + // For IE, append the script to trigger execution + var s = ls.shift(); + //console.log("loaded script: " + s.src); + head.appendChild(s); + } + if (!this.readyState || + (Util.Engine.presto && this.readyState === 'loaded') || + this.readyState === 'complete') { + if (ps.indexOf(this) >= 0) { + this.onload = this.onreadystatechange = null; + //console.log("completed script: " + this.src); + ps.splice(ps.indexOf(this), 1); + + // Call window.onscriptsload after last script loads + if (ps.length === 0 && window.onscriptsload) { + window.onscriptsload(); + } + } + } + }; + // In-order script execution tricks + if (Util.Engine.trident) { + // For IE wait until readyState is 'loaded' before + // appending it which will trigger execution + // http://wiki.whatwg.org/wiki/Dynamic_Script_Execution_Order + ls.push(script); + } else { + // For webkit and firefox set async=false and append now + // https://developer.mozilla.org/en-US/docs/HTML/Element/script + script.async = false; + head.appendChild(script); + } + ps.push(script); + } +} + +// Get DOM element position on page +Util.getPosition = function (obj) { + var x = 0, y = 0; + if (obj.offsetParent) { + do { + x += obj.offsetLeft; + y += obj.offsetTop; + obj = obj.offsetParent; + } while (obj); + } + return {'x': x, 'y': y}; +}; + +// Get mouse event position in DOM element +Util.getEventPosition = function (e, obj, scale) { + var evt, docX, docY, pos; + //if (!e) evt = window.event; + evt = (e ? e : window.event); + evt = (evt.changedTouches ? evt.changedTouches[0] : evt.touches ? evt.touches[0] : evt); + if (evt.pageX || evt.pageY) { + docX = evt.pageX; + docY = evt.pageY; + } else if (evt.clientX || evt.clientY) { + docX = evt.clientX + document.body.scrollLeft + + document.documentElement.scrollLeft; + docY = evt.clientY + document.body.scrollTop + + document.documentElement.scrollTop; + } + pos = Util.getPosition(obj); + if (typeof scale === "undefined") { + scale = 1; + } + var realx = docX - pos.x; + var realy = docY - pos.y; + var x = Math.max(Math.min(realx, obj.width-1), 0); + var y = Math.max(Math.min(realy, obj.height-1), 0); + return {'x': x / scale, 'y': y / scale, 'realx': realx / scale, 'realy': realy / scale}; +}; + + +// Event registration. Based on: http://www.scottandrew.com/weblog/articles/cbs-events +Util.addEvent = function (obj, evType, fn){ + if (obj.attachEvent){ + var r = obj.attachEvent("on"+evType, fn); + return r; + } else if (obj.addEventListener){ + obj.addEventListener(evType, fn, false); + return true; + } else { + throw("Handler could not be attached"); + } +}; + +Util.removeEvent = function(obj, evType, fn){ + if (obj.detachEvent){ + var r = obj.detachEvent("on"+evType, fn); + return r; + } else if (obj.removeEventListener){ + obj.removeEventListener(evType, fn, false); + return true; + } else { + throw("Handler could not be removed"); + } +}; + +Util.stopEvent = function(e) { + if (e.stopPropagation) { e.stopPropagation(); } + else { e.cancelBubble = true; } + + if (e.preventDefault) { e.preventDefault(); } + else { e.returnValue = false; } +}; + + +// Set browser engine versions. Based on mootools. +Util.Features = {xpath: !!(document.evaluate), air: !!(window.runtime), query: !!(document.querySelector)}; + +Util.Engine = { + // Version detection break in Opera 11.60 (errors on arguments.callee.caller reference) + //'presto': (function() { + // return (!window.opera) ? false : ((arguments.callee.caller) ? 960 : ((document.getElementsByClassName) ? 950 : 925)); }()), + 'presto': (function() { return (!window.opera) ? false : true; }()), + + 'trident': (function() { + return (!window.ActiveXObject) ? false : ((window.XMLHttpRequest) ? ((document.querySelectorAll) ? 6 : 5) : 4); }()), + 'webkit': (function() { + try { return (navigator.taintEnabled) ? false : ((Util.Features.xpath) ? ((Util.Features.query) ? 525 : 420) : 419); } catch (e) { return false; } }()), + //'webkit': (function() { + // return ((typeof navigator.taintEnabled !== "unknown") && navigator.taintEnabled) ? false : ((Util.Features.xpath) ? ((Util.Features.query) ? 525 : 420) : 419); }()), + 'gecko': (function() { + return (!document.getBoxObjectFor && window.mozInnerScreenX == null) ? false : ((document.getElementsByClassName) ? 19 : 18); }()) +}; +if (Util.Engine.webkit) { + // Extract actual webkit version if available + Util.Engine.webkit = (function(v) { + var re = new RegExp('WebKit/([0-9\.]*) '); + v = (navigator.userAgent.match(re) || ['', v])[1]; + return parseFloat(v, 10); + })(Util.Engine.webkit); +} + +Util.Flash = (function(){ + var v, version; + try { + v = navigator.plugins['Shockwave Flash'].description; + } catch(err1) { + try { + v = new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version'); + } catch(err2) { + v = '0 r0'; + } + } + version = v.match(/\d+/g); + return {version: parseInt(version[0] || 0 + '.' + version[1], 10) || 0, build: parseInt(version[2], 10) || 0}; +}()); diff --git a/noVNC/include/web-socket-js/README.txt b/noVNC/include/web-socket-js/README.txt new file mode 100644 index 0000000..2e32ea7 --- /dev/null +++ b/noVNC/include/web-socket-js/README.txt @@ -0,0 +1,109 @@ +* How to try + +Assuming you have Web server (e.g. Apache) running at http://example.com/ . + +- Download web_socket.rb from: + http://github.com/gimite/web-socket-ruby/tree/master +- Run sample Web Socket server (echo server) in example.com with: (#1) + $ ruby web-socket-ruby/samples/echo_server.rb example.com 10081 +- If your server already provides socket policy file at port 843, modify the file to allow access to port 10081. Otherwise you can skip this step. See below for details. +- Publish the web-socket-js directory with your Web server (e.g. put it in ~/public_html). +- Change ws://localhost:10081 to ws://example.com:10081 in sample.html. +- Open sample.html in your browser. +- After "onopen" is shown, input something, click [Send] and confirm echo back. + +#1: First argument of echo_server.rb means that it accepts Web Socket connection from HTML pages in example.com. + + +* Troubleshooting + +If it doesn't work, try these: + +1. Try Chrome and Firefox 3.x. +- It doesn't work on Chrome: +-- It's likely an issue of your code or the server. Debug your code as usual e.g. using console.log. +- It works on Chrome but it doesn't work on Firefox: +-- It's likely an issue of web-socket-js specific configuration (e.g. 3 and 4 below). +- It works on both Chrome and Firefox, but it doesn't work on your browser: +-- Check "Supported environment" section below. Your browser may not be supported by web-socket-js. + +2. Add this line before your code: + WEB_SOCKET_DEBUG = true; +and use Developer Tools (Chrome/Safari) or Firebug (Firefox) to see if console.log outputs any errors. + +3. Make sure you do NOT open your HTML page as local file e.g. file:///.../sample.html. web-socket-js doesn't work on local file. Open it via Web server e.g. http:///.../sample.html. + +4. If you are NOT using web-socket-ruby as your WebSocket server, you need to place Flash socket policy file on your server. See "Flash socket policy file" section below for details. + +5. Check if sample.html bundled with web-socket-js works. + +6. Make sure the port used for WebSocket (10081 in example above) is not blocked by your server/client's firewall. + +7. Install debugger version of Flash Player available here to see Flash errors: +http://www.adobe.com/support/flashplayer/downloads.html + + +* Supported environments + +It should work on: +- Google Chrome 4 or later (just uses native implementation) +- Firefox 3.x, Internet Explorer 8 + Flash Player 9 or later + +It may or may not work on other browsers such as Safari, Opera or IE 6. Patch for these browsers are appreciated, but I will not work on fixing issues specific to these browsers by myself. + + +* Flash socket policy file + +This implementation uses Flash's socket, which means that your server must provide Flash socket policy file to declare the server accepts connections from Flash. + +If you use web-socket-ruby available at +http://github.com/gimite/web-socket-ruby/tree/master +, you don't need anything special, because web-socket-ruby handles Flash socket policy file request. But if you already provide socket policy file at port 843, you need to modify the file to allow access to Web Socket port, because it precedes what web-socket-ruby provides. + +If you use other Web Socket server implementation, you need to provide socket policy file yourself. See +http://www.lightsphere.com/dev/articles/flash_socket_policy.html +for details and sample script to run socket policy file server. node.js implementation is available here: +http://github.com/LearnBoost/Socket.IO-node/blob/master/lib/socket.io/transports/flashsocket.js + +Actually, it's still better to provide socket policy file at port 843 even if you use web-socket-ruby. Flash always try to connect to port 843 first, so providing the file at port 843 makes startup faster. + + +* Cookie considerations + +Cookie is sent if Web Socket host is the same as the origin of JavaScript. Otherwise it is not sent, because I don't know way to send right Cookie (which is Cookie of the host of Web Socket, I heard). + +Note that it's technically possible that client sends arbitrary string as Cookie and any other headers (by modifying this library for example) once you place Flash socket policy file in your server. So don't trust Cookie and other headers if you allow connection from untrusted origin. + + +* Proxy considerations + +The WebSocket spec (http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol) specifies instructions for User Agents to support proxied connections by implementing the HTTP CONNECT method. + +The AS3 Socket class doesn't implement this mechanism, which renders it useless for the scenarios where the user trying to open a socket is behind a proxy. + +The class RFC2817Socket (by Christian Cantrell) effectively lets us implement this, as long as the proxy settings are known and provided by the interface that instantiates the WebSocket. As such, if you want to support proxied conncetions, you'll have to supply this information to the WebSocket constructor when Flash is being used. One way to go about it would be to ask the user for proxy settings information if the initial connection fails. + + +* How to host HTML file and SWF file in different domains + +By default, HTML file and SWF file must be in the same domain. You can follow steps below to allow hosting them in different domain. + +WARNING: If you use the method below, HTML files in ANY domains can send arbitrary TCP data to your WebSocket server, regardless of configuration in Flash socket policy file. Arbitrary TCP data means that they can even fake request headers including Origin and Cookie. + +- Unzip WebSocketMainInsecure.zip to extract WebSocketMainInsecure.swf. +- Put WebSocketMainInsecure.swf on your server, instead of WebSocketMain.swf. +- In JavaScript, set WEB_SOCKET_SWF_LOCATION to URL of your WebSocketMainInsecure.swf. + + +* How to build WebSocketMain.swf + +Install Flex 4 SDK: +http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+4 + +$ cd flash-src +$ ./build.sh + + +* License + +New BSD License. diff --git a/noVNC/include/web-socket-js/WebSocketMain.swf b/noVNC/include/web-socket-js/WebSocketMain.swf new file mode 100644 index 0000000000000000000000000000000000000000..f286c81aacc954953086a97dfff7e4e18e78b6bc GIT binary patch literal 177139 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�{?S0&?Rq)c&c-(}SFHOPy4tz`b5gun?zakh{ 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:-!a@ddza^dI1O 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 D+>;X~ literal 0 HcmV?d00001 diff --git a/noVNC/include/web-socket-js/swfobject.js b/noVNC/include/web-socket-js/swfobject.js new file mode 100644 index 0000000..8eafe9d --- /dev/null +++ b/noVNC/include/web-socket-js/swfobject.js @@ -0,0 +1,4 @@ +/* SWFObject v2.2 + is released under the MIT License +*/ +var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y0){for(var af=0;af0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad'}}aa.outerHTML='"+af+"";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab +// License: New BSD License +// Reference: http://dev.w3.org/html5/websockets/ +// Reference: http://tools.ietf.org/html/rfc6455 + +(function() { + + if (window.WEB_SOCKET_FORCE_FLASH) { + // Keeps going. + } else if (window.WebSocket) { + return; + } else if (window.MozWebSocket) { + // Firefox. + window.WebSocket = MozWebSocket; + return; + } + + var logger; + if (window.WEB_SOCKET_LOGGER) { + logger = WEB_SOCKET_LOGGER; + } else if (window.console && window.console.log && window.console.error) { + // In some environment, console is defined but console.log or console.error is missing. + logger = window.console; + } else { + logger = {log: function(){ }, error: function(){ }}; + } + + // swfobject.hasFlashPlayerVersion("10.0.0") doesn't work with Gnash. + if (swfobject.getFlashPlayerVersion().major < 10) { + logger.error("Flash Player >= 10.0.0 is required."); + return; + } + if (location.protocol == "file:") { + logger.error( + "WARNING: web-socket-js doesn't work in file:///... URL " + + "unless you set Flash Security Settings properly. " + + "Open the page via Web server i.e. http://..."); + } + + /** + * Our own implementation of WebSocket class using Flash. + * @param {string} url + * @param {array or string} protocols + * @param {string} proxyHost + * @param {int} proxyPort + * @param {string} headers + */ + window.WebSocket = function(url, protocols, proxyHost, proxyPort, headers) { + var self = this; + self.__id = WebSocket.__nextId++; + WebSocket.__instances[self.__id] = self; + self.readyState = WebSocket.CONNECTING; + self.bufferedAmount = 0; + self.__events = {}; + if (!protocols) { + protocols = []; + } else if (typeof protocols == "string") { + protocols = [protocols]; + } + // Uses setTimeout() to make sure __createFlash() runs after the caller sets ws.onopen etc. + // Otherwise, when onopen fires immediately, onopen is called before it is set. + self.__createTask = setTimeout(function() { + WebSocket.__addTask(function() { + self.__createTask = null; + WebSocket.__flash.create( + self.__id, url, protocols, proxyHost || null, proxyPort || 0, headers || null); + }); + }, 0); + }; + + /** + * Send data to the web socket. + * @param {string} data The data to send to the socket. + * @return {boolean} True for success, false for failure. + */ + WebSocket.prototype.send = function(data) { + if (this.readyState == WebSocket.CONNECTING) { + throw "INVALID_STATE_ERR: Web Socket connection has not been established"; + } + // We use encodeURIComponent() here, because FABridge doesn't work if + // the argument includes some characters. We don't use escape() here + // because of this: + // https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Functions#escape_and_unescape_Functions + // But it looks decodeURIComponent(encodeURIComponent(s)) doesn't + // preserve all Unicode characters either e.g. "\uffff" in Firefox. + // Note by wtritch: Hopefully this will not be necessary using ExternalInterface. Will require + // additional testing. + var result = WebSocket.__flash.send(this.__id, encodeURIComponent(data)); + if (result < 0) { // success + return true; + } else { + this.bufferedAmount += result; + return false; + } + }; + + /** + * Close this web socket gracefully. + */ + WebSocket.prototype.close = function() { + if (this.__createTask) { + clearTimeout(this.__createTask); + this.__createTask = null; + this.readyState = WebSocket.CLOSED; + return; + } + if (this.readyState == WebSocket.CLOSED || this.readyState == WebSocket.CLOSING) { + return; + } + this.readyState = WebSocket.CLOSING; + WebSocket.__flash.close(this.__id); + }; + + /** + * Implementation of {@link DOM 2 EventTarget Interface} + * + * @param {string} type + * @param {function} listener + * @param {boolean} useCapture + * @return void + */ + WebSocket.prototype.addEventListener = function(type, listener, useCapture) { + if (!(type in this.__events)) { + this.__events[type] = []; + } + this.__events[type].push(listener); + }; + + /** + * Implementation of {@link DOM 2 EventTarget Interface} + * + * @param {string} type + * @param {function} listener + * @param {boolean} useCapture + * @return void + */ + WebSocket.prototype.removeEventListener = function(type, listener, useCapture) { + if (!(type in this.__events)) return; + var events = this.__events[type]; + for (var i = events.length - 1; i >= 0; --i) { + if (events[i] === listener) { + events.splice(i, 1); + break; + } + } + }; + + /** + * Implementation of {@link DOM 2 EventTarget Interface} + * + * @param {Event} event + * @return void + */ + WebSocket.prototype.dispatchEvent = function(event) { + var events = this.__events[event.type] || []; + for (var i = 0; i < events.length; ++i) { + events[i](event); + } + var handler = this["on" + event.type]; + if (handler) handler.apply(this, [event]); + }; + + /** + * Handles an event from Flash. + * @param {Object} flashEvent + */ + WebSocket.prototype.__handleEvent = function(flashEvent) { + + if ("readyState" in flashEvent) { + this.readyState = flashEvent.readyState; + } + if ("protocol" in flashEvent) { + this.protocol = flashEvent.protocol; + } + + var jsEvent; + if (flashEvent.type == "open" || flashEvent.type == "error") { + jsEvent = this.__createSimpleEvent(flashEvent.type); + } else if (flashEvent.type == "close") { + jsEvent = this.__createSimpleEvent("close"); + jsEvent.wasClean = flashEvent.wasClean ? true : false; + jsEvent.code = flashEvent.code; + jsEvent.reason = flashEvent.reason; + } else if (flashEvent.type == "message") { + var data = decodeURIComponent(flashEvent.message); + jsEvent = this.__createMessageEvent("message", data); + } else { + throw "unknown event type: " + flashEvent.type; + } + + this.dispatchEvent(jsEvent); + + }; + + WebSocket.prototype.__createSimpleEvent = function(type) { + if (document.createEvent && window.Event) { + var event = document.createEvent("Event"); + event.initEvent(type, false, false); + return event; + } else { + return {type: type, bubbles: false, cancelable: false}; + } + }; + + WebSocket.prototype.__createMessageEvent = function(type, data) { + if (document.createEvent && window.MessageEvent && !window.opera) { + var event = document.createEvent("MessageEvent"); + event.initMessageEvent("message", false, false, data, null, null, window, null); + return event; + } else { + // IE and Opera, the latter one truncates the data parameter after any 0x00 bytes. + return {type: type, data: data, bubbles: false, cancelable: false}; + } + }; + + /** + * Define the WebSocket readyState enumeration. + */ + WebSocket.CONNECTING = 0; + WebSocket.OPEN = 1; + WebSocket.CLOSING = 2; + WebSocket.CLOSED = 3; + + // Field to check implementation of WebSocket. + WebSocket.__isFlashImplementation = true; + WebSocket.__initialized = false; + WebSocket.__flash = null; + WebSocket.__instances = {}; + WebSocket.__tasks = []; + WebSocket.__nextId = 0; + + /** + * Load a new flash security policy file. + * @param {string} url + */ + WebSocket.loadFlashPolicyFile = function(url){ + WebSocket.__addTask(function() { + WebSocket.__flash.loadManualPolicyFile(url); + }); + }; + + /** + * Loads WebSocketMain.swf and creates WebSocketMain object in Flash. + */ + WebSocket.__initialize = function() { + + if (WebSocket.__initialized) return; + WebSocket.__initialized = true; + + if (WebSocket.__swfLocation) { + // For backword compatibility. + window.WEB_SOCKET_SWF_LOCATION = WebSocket.__swfLocation; + } + if (!window.WEB_SOCKET_SWF_LOCATION) { + logger.error("[WebSocket] set WEB_SOCKET_SWF_LOCATION to location of WebSocketMain.swf"); + return; + } + if (!window.WEB_SOCKET_SUPPRESS_CROSS_DOMAIN_SWF_ERROR && + !WEB_SOCKET_SWF_LOCATION.match(/(^|\/)WebSocketMainInsecure\.swf(\?.*)?$/) && + WEB_SOCKET_SWF_LOCATION.match(/^\w+:\/\/([^\/]+)/)) { + var swfHost = RegExp.$1; + if (location.host != swfHost) { + logger.error( + "[WebSocket] You must host HTML and WebSocketMain.swf in the same host " + + "('" + location.host + "' != '" + swfHost + "'). " + + "See also 'How to host HTML file and SWF file in different domains' section " + + "in README.md. If you use WebSocketMainInsecure.swf, you can suppress this message " + + "by WEB_SOCKET_SUPPRESS_CROSS_DOMAIN_SWF_ERROR = true;"); + } + } + var container = document.createElement("div"); + container.id = "webSocketContainer"; + // Hides Flash box. We cannot use display: none or visibility: hidden because it prevents + // Flash from loading at least in IE. So we move it out of the screen at (-100, -100). + // But this even doesn't work with Flash Lite (e.g. in Droid Incredible). So with Flash + // Lite, we put it at (0, 0). This shows 1x1 box visible at left-top corner but this is + // the best we can do as far as we know now. + container.style.position = "absolute"; + if (WebSocket.__isFlashLite()) { + container.style.left = "0px"; + container.style.top = "0px"; + } else { + container.style.left = "-100px"; + container.style.top = "-100px"; + } + var holder = document.createElement("div"); + holder.id = "webSocketFlash"; + container.appendChild(holder); + document.body.appendChild(container); + // See this article for hasPriority: + // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html + swfobject.embedSWF( + WEB_SOCKET_SWF_LOCATION, + "webSocketFlash", + "1" /* width */, + "1" /* height */, + "10.0.0" /* SWF version */, + null, + null, + {hasPriority: true, swliveconnect : true, allowScriptAccess: "always"}, + null, + function(e) { + if (!e.success) { + logger.error("[WebSocket] swfobject.embedSWF failed"); + } + } + ); + + }; + + /** + * Called by Flash to notify JS that it's fully loaded and ready + * for communication. + */ + WebSocket.__onFlashInitialized = function() { + // We need to set a timeout here to avoid round-trip calls + // to flash during the initialization process. + setTimeout(function() { + WebSocket.__flash = document.getElementById("webSocketFlash"); + WebSocket.__flash.setCallerUrl(location.href); + WebSocket.__flash.setDebug(!!window.WEB_SOCKET_DEBUG); + for (var i = 0; i < WebSocket.__tasks.length; ++i) { + WebSocket.__tasks[i](); + } + WebSocket.__tasks = []; + }, 0); + }; + + /** + * Called by Flash to notify WebSockets events are fired. + */ + WebSocket.__onFlashEvent = function() { + setTimeout(function() { + try { + // Gets events using receiveEvents() instead of getting it from event object + // of Flash event. This is to make sure to keep message order. + // It seems sometimes Flash events don't arrive in the same order as they are sent. + var events = WebSocket.__flash.receiveEvents(); + for (var i = 0; i < events.length; ++i) { + WebSocket.__instances[events[i].webSocketId].__handleEvent(events[i]); + } + } catch (e) { + logger.error(e); + } + }, 0); + return true; + }; + + // Called by Flash. + WebSocket.__log = function(message) { + logger.log(decodeURIComponent(message)); + }; + + // Called by Flash. + WebSocket.__error = function(message) { + logger.error(decodeURIComponent(message)); + }; + + WebSocket.__addTask = function(task) { + if (WebSocket.__flash) { + task(); + } else { + WebSocket.__tasks.push(task); + } + }; + + /** + * Test if the browser is running flash lite. + * @return {boolean} True if flash lite is running, false otherwise. + */ + WebSocket.__isFlashLite = function() { + if (!window.navigator || !window.navigator.mimeTypes) { + return false; + } + var mimeType = window.navigator.mimeTypes["application/x-shockwave-flash"]; + if (!mimeType || !mimeType.enabledPlugin || !mimeType.enabledPlugin.filename) { + return false; + } + return mimeType.enabledPlugin.filename.match(/flashlite/i) ? true : false; + }; + + if (!window.WEB_SOCKET_DISABLE_AUTO_INITIALIZATION) { + // NOTE: + // This fires immediately if web_socket.js is dynamically loaded after + // the document is loaded. + swfobject.addDomLoadEvent(function() { + WebSocket.__initialize(); + }); + } + +})(); diff --git a/noVNC/include/websock.js b/noVNC/include/websock.js new file mode 100644 index 0000000..b8cc46f --- /dev/null +++ b/noVNC/include/websock.js @@ -0,0 +1,422 @@ +/* + * Websock: high-performance binary WebSockets + * Copyright (C) 2012 Joel Martin + * Licensed under MPL 2.0 (see LICENSE.txt) + * + * Websock is similar to the standard WebSocket object but Websock + * enables communication with raw TCP sockets (i.e. the binary stream) + * via websockify. This is accomplished by base64 encoding the data + * stream between Websock and websockify. + * + * Websock has built-in receive queue buffering; the message event + * does not contain actual data but is simply a notification that + * there is new data available. Several rQ* methods are available to + * read binary data off of the receive queue. + */ + +/*jslint browser: true, bitwise: false, plusplus: false */ +/*global Util, Base64 */ + + +// Load Flash WebSocket emulator if needed + +// To force WebSocket emulator even when native WebSocket available +//window.WEB_SOCKET_FORCE_FLASH = true; +// To enable WebSocket emulator debug: +//window.WEB_SOCKET_DEBUG=1; + +if (window.WebSocket && !window.WEB_SOCKET_FORCE_FLASH) { + Websock_native = true; +} else if (window.MozWebSocket && !window.WEB_SOCKET_FORCE_FLASH) { + Websock_native = true; + window.WebSocket = window.MozWebSocket; +} else { + /* no builtin WebSocket so load web_socket.js */ + + Websock_native = false; + (function () { + window.WEB_SOCKET_SWF_LOCATION = Util.get_include_uri() + + "web-socket-js/WebSocketMain.swf"; + if (Util.Engine.trident) { + Util.Debug("Forcing uncached load of WebSocketMain.swf"); + window.WEB_SOCKET_SWF_LOCATION += "?" + Math.random(); + } + Util.load_scripts(["web-socket-js/swfobject.js", + "web-socket-js/web_socket.js"]); + }()); +} + + +function Websock() { +"use strict"; + +var api = {}, // Public API + websocket = null, // WebSocket object + mode = 'base64', // Current WebSocket mode: 'binary', 'base64' + rQ = [], // Receive queue + rQi = 0, // Receive queue index + rQmax = 10000, // Max receive queue size before compacting + sQ = [], // Send queue + + eventHandlers = { + 'message' : function() {}, + 'open' : function() {}, + 'close' : function() {}, + 'error' : function() {} + }, + + test_mode = false; + + +// +// Queue public functions +// + +function get_sQ() { + return sQ; +} + +function get_rQ() { + return rQ; +} +function get_rQi() { + return rQi; +} +function set_rQi(val) { + rQi = val; +} + +function rQlen() { + return rQ.length - rQi; +} + +function rQpeek8() { + return (rQ[rQi] ); +} +function rQshift8() { + return (rQ[rQi++] ); +} +function rQunshift8(num) { + if (rQi === 0) { + rQ.unshift(num); + } else { + rQi -= 1; + rQ[rQi] = num; + } + +} +function rQshift16() { + return (rQ[rQi++] << 8) + + (rQ[rQi++] ); +} +function rQshift32() { + return (rQ[rQi++] << 24) + + (rQ[rQi++] << 16) + + (rQ[rQi++] << 8) + + (rQ[rQi++] ); +} +function rQshiftStr(len) { + if (typeof(len) === 'undefined') { len = rQlen(); } + var arr = rQ.slice(rQi, rQi + len); + rQi += len; + return String.fromCharCode.apply(null, arr); +} +function rQshiftBytes(len) { + if (typeof(len) === 'undefined') { len = rQlen(); } + rQi += len; + return rQ.slice(rQi-len, rQi); +} + +function rQslice(start, end) { + if (end) { + return rQ.slice(rQi + start, rQi + end); + } else { + return rQ.slice(rQi + start); + } +} + +// Check to see if we must wait for 'num' bytes (default to FBU.bytes) +// to be available in the receive queue. Return true if we need to +// wait (and possibly print a debug message), otherwise false. +function rQwait(msg, num, goback) { + var rQlen = rQ.length - rQi; // Skip rQlen() function call + if (rQlen < num) { + if (goback) { + if (rQi < goback) { + throw("rQwait cannot backup " + goback + " bytes"); + } + rQi -= goback; + } + //Util.Debug(" waiting for " + (num-rQlen) + + // " " + msg + " byte(s)"); + return true; // true means need more data + } + return false; +} + +// +// Private utility routines +// + +function encode_message() { + if (mode === 'binary') { + // Put in a binary arraybuffer + return (new Uint8Array(sQ)).buffer; + } else { + // base64 encode + return Base64.encode(sQ); + } +} + +function decode_message(data) { + //Util.Debug(">> decode_message: " + data); + if (mode === 'binary') { + // push arraybuffer values onto the end + var u8 = new Uint8Array(data); + for (var i = 0; i < u8.length; i++) { + rQ.push(u8[i]); + } + } else { + // base64 decode and concat to the end + rQ = rQ.concat(Base64.decode(data, 0)); + } + //Util.Debug(">> decode_message, rQ: " + rQ); +} + + +// +// Public Send functions +// + +function flush() { + if (websocket.bufferedAmount !== 0) { + Util.Debug("bufferedAmount: " + websocket.bufferedAmount); + } + if (websocket.bufferedAmount < api.maxBufferedAmount) { + //Util.Debug("arr: " + arr); + //Util.Debug("sQ: " + sQ); + if (sQ.length > 0) { + websocket.send(encode_message(sQ)); + sQ = []; + } + return true; + } else { + Util.Info("Delaying send, bufferedAmount: " + + websocket.bufferedAmount); + return false; + } +} + +// overridable for testing +function send(arr) { + //Util.Debug(">> send_array: " + arr); + sQ = sQ.concat(arr); + return flush(); +} + +function send_string(str) { + //Util.Debug(">> send_string: " + str); + api.send(str.split('').map( + function (chr) { return chr.charCodeAt(0); } ) ); +} + +// +// Other public functions + +function recv_message(e) { + //Util.Debug(">> recv_message: " + e.data.length); + + try { + decode_message(e.data); + if (rQlen() > 0) { + eventHandlers.message(); + // Compact the receive queue + if (rQ.length > rQmax) { + //Util.Debug("Compacting receive queue"); + rQ = rQ.slice(rQi); + rQi = 0; + } + } else { + Util.Debug("Ignoring empty message"); + } + } catch (exc) { + if (typeof exc.stack !== 'undefined') { + Util.Warn("recv_message, caught exception: " + exc.stack); + } else if (typeof exc.description !== 'undefined') { + Util.Warn("recv_message, caught exception: " + exc.description); + } else { + Util.Warn("recv_message, caught exception:" + exc); + } + if (typeof exc.name !== 'undefined') { + eventHandlers.error(exc.name + ": " + exc.message); + } else { + eventHandlers.error(exc); + } + } + //Util.Debug("<< recv_message"); +} + + +// Set event handlers +function on(evt, handler) { + eventHandlers[evt] = handler; +} + +function init(protocols) { + rQ = []; + rQi = 0; + sQ = []; + websocket = null; + + var bt = false, + wsbt = false, + try_binary = false; + + // Check for full typed array support + if (('Uint8Array' in window) && + ('set' in Uint8Array.prototype)) { + bt = true; + } + + // Check for full binary type support in WebSockets + // TODO: this sucks, the property should exist on the prototype + // but it does not. + try { + if (bt && ('binaryType' in (new WebSocket("wss://localhost:17523")))) { + Util.Info("Detected binaryType support in WebSockets"); + wsbt = true; + } + } catch (exc) { + // Just ignore failed test localhost connections + } + + // Default protocols if not specified + if (typeof(protocols) === "undefined") { + if (wsbt) { + protocols = ['binary', 'base64']; + } else { + protocols = 'base64'; + } + } + + // If no binary support, make sure it was not requested + if (!wsbt) { + if (protocols === 'binary') { + throw("WebSocket binary sub-protocol requested but not supported"); + } + if (typeof(protocols) === "object") { + var new_protocols = []; + for (var i = 0; i < protocols.length; i++) { + if (protocols[i] === 'binary') { + Util.Error("Skipping unsupported WebSocket binary sub-protocol"); + } else { + new_protocols.push(protocols[i]); + } + } + if (new_protocols.length > 0) { + protocols = new_protocols; + } else { + throw("Only WebSocket binary sub-protocol was requested and not supported."); + } + } + } + + return protocols; +} + +function open(uri, protocols) { + protocols = init(protocols); + + if (test_mode) { + websocket = {}; + } else { + websocket = new WebSocket(uri, protocols); + if (protocols.indexOf('binary') >= 0) { + websocket.binaryType = 'arraybuffer'; + } + } + + websocket.onmessage = recv_message; + websocket.onopen = function() { + Util.Debug(">> WebSock.onopen"); + if (websocket.protocol) { + mode = websocket.protocol; + Util.Info("Server chose sub-protocol: " + websocket.protocol); + } else { + mode = 'base64'; + Util.Error("Server select no sub-protocol!: " + websocket.protocol); + } + eventHandlers.open(); + Util.Debug("<< WebSock.onopen"); + }; + websocket.onclose = function(e) { + Util.Debug(">> WebSock.onclose"); + eventHandlers.close(e); + Util.Debug("<< WebSock.onclose"); + }; + websocket.onerror = function(e) { + Util.Debug(">> WebSock.onerror: " + e); + eventHandlers.error(e); + Util.Debug("<< WebSock.onerror"); + }; +} + +function close() { + if (websocket) { + if ((websocket.readyState === WebSocket.OPEN) || + (websocket.readyState === WebSocket.CONNECTING)) { + Util.Info("Closing WebSocket connection"); + websocket.close(); + } + websocket.onmessage = function (e) { return; }; + } +} + +// Override internal functions for testing +// Takes a send function, returns reference to recv function +function testMode(override_send, data_mode) { + test_mode = true; + mode = data_mode; + api.send = override_send; + api.close = function () {}; + return recv_message; +} + +function constructor() { + // Configuration settings + api.maxBufferedAmount = 200; + + // Direct access to send and receive queues + api.get_sQ = get_sQ; + api.get_rQ = get_rQ; + api.get_rQi = get_rQi; + api.set_rQi = set_rQi; + + // Routines to read from the receive queue + api.rQlen = rQlen; + api.rQpeek8 = rQpeek8; + api.rQshift8 = rQshift8; + api.rQunshift8 = rQunshift8; + api.rQshift16 = rQshift16; + api.rQshift32 = rQshift32; + api.rQshiftStr = rQshiftStr; + api.rQshiftBytes = rQshiftBytes; + api.rQslice = rQslice; + api.rQwait = rQwait; + + api.flush = flush; + api.send = send; + api.send_string = send_string; + + api.on = on; + api.init = init; + api.open = open; + api.close = close; + api.testMode = testMode; + + return api; +} + +return constructor(); + +} diff --git a/noVNC/include/webutil.js b/noVNC/include/webutil.js new file mode 100644 index 0000000..5ceccbe --- /dev/null +++ b/noVNC/include/webutil.js @@ -0,0 +1,221 @@ +/* + * noVNC: HTML5 VNC client + * Copyright (C) 2012 Joel Martin + * Copyright (C) 2013 NTT corp. + * Licensed under MPL 2.0 (see LICENSE.txt) + * + * See README.md for usage and integration instructions. + */ + +"use strict"; +/*jslint bitwise: false, white: false */ +/*global Util, window, document */ + +// Globals defined here +var WebUtil = {}, $D; + +/* + * Simple DOM selector by ID + */ +if (!window.$D) { + window.$D = function (id) { + if (document.getElementById) { + return document.getElementById(id); + } else if (document.all) { + return document.all[id]; + } else if (document.layers) { + return document.layers[id]; + } + return undefined; + }; +} + + +/* + * ------------------------------------------------------ + * Namespaced in WebUtil + * ------------------------------------------------------ + */ + +// init log level reading the logging HTTP param +WebUtil.init_logging = function(level) { + if (typeof level !== "undefined") { + Util._log_level = level; + } else { + Util._log_level = (document.location.href.match( + /logging=([A-Za-z0-9\._\-]*)/) || + ['', Util._log_level])[1]; + } + Util.init_logging(); +}; + + +WebUtil.dirObj = function (obj, depth, parent) { + var i, msg = "", val = ""; + if (! depth) { depth=2; } + if (! parent) { parent= ""; } + + // Print the properties of the passed-in object + for (i in obj) { + if ((depth > 1) && (typeof obj[i] === "object")) { + // Recurse attributes that are objects + msg += WebUtil.dirObj(obj[i], depth-1, parent + "." + i); + } else { + //val = new String(obj[i]).replace("\n", " "); + if (typeof(obj[i]) === "undefined") { + val = "undefined"; + } else { + val = obj[i].toString().replace("\n", " "); + } + if (val.length > 30) { + val = val.substr(0,30) + "..."; + } + msg += parent + "." + i + ": " + val + "\n"; + } + } + return msg; +}; + +// Read a query string variable +WebUtil.getQueryVar = function(name, defVal) { + var re = new RegExp('[?][^#]*' + name + '=([^&#]*)'), + match = document.location.href.match(re); + if (typeof defVal === 'undefined') { defVal = null; } + if (match) { + return decodeURIComponent(match[1]); + } else { + return defVal; + } +}; + + +/* + * Cookie handling. Dervied from: http://www.quirksmode.org/js/cookies.html + */ + +// No days means only for this browser session +WebUtil.createCookie = function(name,value,days) { + var date, expires, secure; + if (days) { + date = new Date(); + date.setTime(date.getTime()+(days*24*60*60*1000)); + expires = "; expires="+date.toGMTString(); + } else { + expires = ""; + } + if (document.location.protocol === "https:") { + secure = "; secure"; + } else { + secure = ""; + } + document.cookie = name+"="+value+expires+"; path=/"+secure; +}; + +WebUtil.readCookie = function(name, defaultValue) { + var i, c, nameEQ = name + "=", ca = document.cookie.split(';'); + for(i=0; i < ca.length; i += 1) { + c = ca[i]; + while (c.charAt(0) === ' ') { c = c.substring(1,c.length); } + if (c.indexOf(nameEQ) === 0) { return c.substring(nameEQ.length,c.length); } + } + return (typeof defaultValue !== 'undefined') ? defaultValue : null; +}; + +WebUtil.eraseCookie = function(name) { + WebUtil.createCookie(name,"",-1); +}; + +/* + * Setting handling. + */ + +WebUtil.initSettings = function(callback) { + var callbackArgs = Array.prototype.slice.call(arguments, 1); + if (window.chrome && window.chrome.storage) { + window.chrome.storage.sync.get(function (cfg) { + WebUtil.settings = cfg; + console.log(WebUtil.settings); + if (callback) { + callback.apply(this, callbackArgs); + } + }); + } else { + // No-op + if (callback) { + callback.apply(this, callbackArgs); + } + } +}; + +// No days means only for this browser session +WebUtil.writeSetting = function(name, value) { + if (window.chrome && window.chrome.storage) { + //console.log("writeSetting:", name, value); + if (WebUtil.settings[name] !== value) { + WebUtil.settings[name] = value; + window.chrome.storage.sync.set(WebUtil.settings); + } + } else { + localStorage.setItem(name, value); + } +}; + +WebUtil.readSetting = function(name, defaultValue) { + var value; + if (window.chrome && window.chrome.storage) { + value = WebUtil.settings[name]; + } else { + value = localStorage.getItem(name); + } + if (typeof value === "undefined") { + value = null; + } + if (value === null && typeof defaultValue !== undefined) { + return defaultValue; + } else { + return value; + } +}; + +WebUtil.eraseSetting = function(name) { + if (window.chrome && window.chrome.storage) { + window.chrome.storage.sync.remove(name); + delete WebUtil.settings[name]; + } else { + localStorage.removeItem(name); + } +}; + +/* + * Alternate stylesheet selection + */ +WebUtil.getStylesheets = function() { var i, links, sheets = []; + links = document.getElementsByTagName("link"); + for (i = 0; i < links.length; i += 1) { + if (links[i].title && + links[i].rel.toUpperCase().indexOf("STYLESHEET") > -1) { + sheets.push(links[i]); + } + } + return sheets; +}; + +// No sheet means try and use value from cookie, null sheet used to +// clear all alternates. +WebUtil.selectStylesheet = function(sheet) { + var i, link, sheets = WebUtil.getStylesheets(); + if (typeof sheet === 'undefined') { + sheet = 'default'; + } + for (i=0; i < sheets.length; i += 1) { + link = sheets[i]; + if (link.title === sheet) { + Util.Debug("Using stylesheet " + sheet); + link.disabled = false; + } else { + //Util.Debug("Skipping stylesheet " + link.title); + link.disabled = true; + } + } + return sheet; +}; diff --git a/noVNC/tests/arrays.html b/noVNC/tests/arrays.html new file mode 100644 index 0000000..257df26 --- /dev/null +++ b/noVNC/tests/arrays.html @@ -0,0 +1,39 @@ + + + + Javascript Arrays Performance Test + + + + + + + + +

    Javascript Arrays Performance Test

    + Iterations:   + Array Size: *1024  + +   + +

    + Results:
    + +
    + + + + + + diff --git a/noVNC/tests/arrays.js b/noVNC/tests/arrays.js new file mode 100644 index 0000000..69da7fb --- /dev/null +++ b/noVNC/tests/arrays.js @@ -0,0 +1,375 @@ +/* + * Javascript binary array performance tests + * Copyright (C) 2012 Joel Martin + * Licensed under MPL 2.0 (see LICENSE.txt) + */ + +var ctx, i, j, randlist, + new_normal, new_imageData, new_arrayBuffer, + browser = Browser.browser + " " + + Browser.version + " on " + + Browser.OS, + do_imageData = false, + do_arrayBuffer = false, + conf = { + 'create_cnt' : 2000, + 'read_cnt' : 5000000, + 'write_cnt' : 5000000, + 'iterations' : 0, + 'order_l1' : [browser], + 'order_l2' : ['normal', + 'imageData', + 'arrayBuffer'], + 'order_l3' : ['create', + 'sequentialRead', + 'randomRead', + 'sequentialWrite'] + }, + stats = {}, + testFunc = {}, + iteration, arraySize; + +var newline = "\n"; +if (Util.Engine.trident) { + var newline = "
    \n"; +} +function message(str) { + //console.log(str); + cell = $D('messages'); + cell.innerHTML += str + newline; + cell.scrollTop = cell.scrollHeight; +} + +function vmessage(str) { + if (verbose) { + message(str); + } else { + console.log(str); + } +} + +new_normal = function() { + var arr = [], i; + for (i = 0; i < arraySize; i++) { + arr[i] = 0; + } + return arr; +} + +/* Will be overridden with real function */ +new_imageData = function() { + throw("imageData not supported"); +}; + +new_imageData_createImageData = function() { + var imageData = ctx.createImageData(1024/4, arraySize / 1024); + return imageData.data; +}; + +new_imageData_getImageData = function() { + var imageData = ctx.getImageData(0, 0, 1024/4, arraySize / 1024), + arr = imageData.data; + for (i = 0; i < arraySize; i++) { + arr[i] = 0; + } + return arr; +}; + +new_arrayBuffer = function() { + var arr = new ArrayBuffer(arraySize); + return new Uint8Array(arr); +} + +function init_randlist() { + randlist = []; + for (var i=0; i < arraySize; i++) { + randlist[i] = parseInt(Math.random() * 256, 10); + } +} +function copy_randlist(arr) { + for (var i=0; i < arraySize; i++) { + arr[i] = randlist[i]; + } +} + +function begin() { + var i, j; + conf.iterations = parseInt($D('iterations').value, 10); + arraySize = parseInt($D('arraySize').value, 10) * 1024; + + init_randlist(); + + // TODO: randomize test_list + + stats = {}; + for (i = 0; i < conf.order_l2.length; i++) { + stats[conf.order_l2[i]] = {}; + for (j = 0; j < conf.order_l3.length; j++) { + stats[conf.order_l2[i]][conf.order_l3[j]] = []; + } + } + + $D('startButton').value = "Running"; + $D('startButton').disabled = true; + + message("running " + conf.iterations + " test iterations"); + iteration = 1; + setTimeout(run_next_iteration, 250); +} + +function finish() { + var totalTime, arrayType, testType, times; + message("tests finished"); + + for (j = 0; j < conf.order_l3.length; j++) { + testType = conf.order_l3[j]; + message("Test '" + testType + "'"); + for (i = 0; i < conf.order_l2.length; i++) { + arrayType = conf.order_l2[i]; + message(" Array Type '" + arrayType); + times = stats[arrayType][testType]; + message(" Average : " + times.mean() + "ms" + + " (Total: " + times.sum() + "ms)"); + message(" Min/Max : " + times.min() + "ms/" + + times.max() + "ms"); + message(" StdDev : " + times.stdDev() + "ms"); + } + } + + vmessage("array_chart.py JSON data:"); + chart_data = {'conf' : conf, 'stats' : { } }; + chart_data.stats[browser] = stats; + chart_data.stats['next_browser'] = {}; + vmessage(JSON.stringify(chart_data, null, 2)); + + $D('startButton').disabled = false; + $D('startButton').value = "Run Tests"; +} + +function run_next_iteration() { + var arrayType, testType, deltaTime; + + for (i = 0; i < conf.order_l2.length; i++) { + arrayType = conf.order_l2[i]; + if (arrayType === 'imageData' && (!do_imageData)) { + continue; + } + if (arrayType === 'arrayBuffer' && (!do_arrayBuffer)) { + continue; + } + for (j = 0; j < conf.order_l3.length; j++) { + testType = conf.order_l3[j]; + + deltaTime = testFunc[arrayType + "_" + testType](); + + stats[arrayType][testType].push(deltaTime); + vmessage("test " + (arrayType + "_" + testType) + + " time: " + (deltaTime) + "ms"); + } + } + + message("finished test iteration " + iteration); + if (iteration >= conf.iterations) { + setTimeout(finish, 1); + return; + } + iteration++; + setTimeout(run_next_iteration, 1); +} + +/* + * Test functions + */ + +testFunc["normal_create"] = function() { + var cnt, arrNormal, startTime, endTime; + vmessage("create normal array " + conf.create_cnt + "x, initialized to 0"); + + startTime = (new Date()).getTime(); + for (cnt = 0; cnt < conf.create_cnt; cnt++) { + arrNormal = new_normal(); + } + endTime = (new Date()).getTime(); + + return endTime - startTime; +}; + +testFunc["imageData_create"] = function() { + var cnt, arrImage, startTime, endTime; + vmessage("create imageData array " + conf.create_cnt + "x, initialized to 0"); + + startTime = (new Date()).getTime(); + for (cnt = 0; cnt < conf.create_cnt; cnt++) { + arrImage = new_imageData(); + } + endTime = (new Date()).getTime(); + + if (arrImage[103] !== 0) { + message("Initialization failed, arrImage[103] is: " + arrImage[103]); + throw("Initialization failed, arrImage[103] is: " + arrImage[103]); + } + return endTime - startTime; +}; + +testFunc["arrayBuffer_create"] = function() { + var cnt, arrBuffer, startTime, endTime; + vmessage("create arrayBuffer array " + conf.create_cnt + "x, initialized to 0"); + + startTime = (new Date()).getTime(); + for (cnt = 0; cnt < conf.create_cnt; cnt++) { + arrBuffer = new_arrayBuffer(); + } + endTime = (new Date()).getTime(); + + if (arrBuffer[103] !== 0) { + message("Initialization failed, arrBuffer[103] is: " + arrBuffer[103]); + throw("Initialization failed, arrBuffer[103] is: " + arrBuffer[103]); + } + return endTime - startTime; +}; + +function test_sequentialRead(arr) { + var i, j, cnt, startTime, endTime; + /* Initialize the array */ + copy_randlist(arr); + + startTime = (new Date()).getTime(); + i = 0; + j = 0; + for (cnt = 0; cnt < conf.read_cnt; cnt++) { + j = arr[i]; + i++; + if (i >= arraySize) { + i = 0; + } + } + endTime = (new Date()).getTime(); + + return endTime - startTime; +} + +function test_randomRead(arr) { + var i, cnt, startTime, endTime; + /* Initialize the array */ + copy_randlist(arr); // used as jumplist + + startTime = (new Date()).getTime(); + i = 0; + for (cnt = 0; cnt < conf.read_cnt; cnt++) { + i = (arr[i] + cnt) % arraySize; + } + endTime = (new Date()).getTime(); + + return endTime - startTime; +} + +function test_sequentialWrite(arr) { + var i, cnt, startTime, endTime; + /* Initialize the array */ + copy_randlist(arr); + + startTime = (new Date()).getTime(); + i = 0; + for (cnt = 0; cnt < conf.write_cnt; cnt++) { + arr[i] = (cnt % 256); + i++; + if (i >= arraySize) { + i = 0; + } + } + endTime = (new Date()).getTime(); + + return endTime - startTime; +} + +/* Sequential Read Tests */ +testFunc["normal_sequentialRead"] = function() { + vmessage("read normal array " + conf.read_cnt + "x"); + return test_sequentialRead(new_normal()); +}; + +testFunc["imageData_sequentialRead"] = function() { + vmessage("read imageData array " + conf.read_cnt + "x"); + return test_sequentialRead(new_imageData()); +}; + +testFunc["arrayBuffer_sequentialRead"] = function() { + vmessage("read arrayBuffer array " + conf.read_cnt + "x"); + return test_sequentialRead(new_arrayBuffer()); +}; + + +/* Random Read Tests */ +testFunc["normal_randomRead"] = function() { + vmessage("read normal array " + conf.read_cnt + "x"); + return test_randomRead(new_normal()); +}; + +testFunc["imageData_randomRead"] = function() { + vmessage("read imageData array " + conf.read_cnt + "x"); + return test_randomRead(new_imageData()); +}; + +testFunc["arrayBuffer_randomRead"] = function() { + vmessage("read arrayBuffer array " + conf.read_cnt + "x"); + return test_randomRead(new_arrayBuffer()); +}; + + +/* Sequential Write Tests */ +testFunc["normal_sequentialWrite"] = function() { + vmessage("write normal array " + conf.write_cnt + "x"); + return test_sequentialWrite(new_normal()); +}; + +testFunc["imageData_sequentialWrite"] = function() { + vmessage("write imageData array " + conf.write_cnt + "x"); + return test_sequentialWrite(new_imageData()); +}; + +testFunc["arrayBuffer_sequentialWrite"] = function() { + vmessage("write arrayBuffer array " + conf.write_cnt + "x"); + return test_sequentialWrite(new_arrayBuffer()); +}; + +init = function() { + vmessage(">> init"); + + $D('iterations').value = 10; + $D('arraySize').value = 10; + arraySize = parseInt($D('arraySize').value, 10) * 1024; + + message("Browser: " + browser); + + /* Determine browser binary array support */ + try { + ctx = $D('canvas').getContext('2d'); + new_imageData = new_imageData_createImageData; + new_imageData(); + do_imageData = true; + } catch (exc) { + vmessage("createImageData not supported: " + exc); + try { + ctx = $D('canvas').getContext('2d'); + new_imageData = new_imageData_getImageData; + blah = new_imageData(); + do_imageData = true; + } catch (exc) { + vmessage("getImageData not supported: " + exc); + } + } + if (! do_imageData) { + message("imageData arrays not supported"); + } + + try { + new_arrayBuffer(); + do_arrayBuffer = true; + } catch (exc) { + vmessage("Typed Arrays not supported: " + exc); + } + if (! do_arrayBuffer) { + message("Typed Arrays (ArrayBuffers) not suppoted"); + } + vmessage("<< init"); +} diff --git a/noVNC/tests/base64.html b/noVNC/tests/base64.html new file mode 100644 index 0000000..dc45fdd --- /dev/null +++ b/noVNC/tests/base64.html @@ -0,0 +1,91 @@ + + + + Native Base64 Tests + + + + + +

    Native Base64 Tests

    + +
    + Messages:
    + + +
    + + + diff --git a/noVNC/tests/base64.js b/noVNC/tests/base64.js new file mode 100644 index 0000000..6ade00a --- /dev/null +++ b/noVNC/tests/base64.js @@ -0,0 +1,12 @@ +// The following results in 'hello [MANGLED]' +// +// Filed as https://github.com/ry/node/issues/issue/402 + +var sys = require("sys"), + buf = new Buffer(1024), len, + str1 = "aGVsbG8g", // 'hello ' + str2 = "d29ybGQ=", // 'world' + +len = buf.write(str1, 0, 'base64'); +len += buf.write(str2, len, 'base64'); +sys.log("decoded result: " + buf.toString('binary', 0, len)); diff --git a/noVNC/tests/browser.js b/noVNC/tests/browser.js new file mode 100644 index 0000000..7cf8279 --- /dev/null +++ b/noVNC/tests/browser.js @@ -0,0 +1,134 @@ +/* + * From: + * http://www.quirksmode.org/js/detect.html + */ + +var Browser = { + init: function () { + this.browser = this.searchString(this.dataBrowser) || "An unknown browser"; + this.version = this.searchVersion(navigator.userAgent) + || this.searchVersion(navigator.appVersion) + || "an unknown version"; + this.majorVersion = this.searchMajorVersion(navigator.userAgent) + || this.searchMajorVersion(navigator.appVersion) + || "an unknown version"; + this.fullVersion = this.searchFullVersion(navigator.userAgent) + || this.searchFullVersion(navigator.appVersion) + || "an unknown version"; + this.OS = this.searchString(this.dataOS) || "an unknown OS"; + }, + searchString: function (data) { + for (var i=0;i + + + Canvas Performance Test + + + + + + + + + Iterations:   + + Width:   + Height:   + +   + +

    + + Canvas (should see three squares and two happy faces):
    + + Canvas not supported. + + +
    + Results:
    + + + + + diff --git a/noVNC/tests/cursor.html b/noVNC/tests/cursor.html new file mode 100644 index 0000000..91e621b --- /dev/null +++ b/noVNC/tests/cursor.html @@ -0,0 +1,135 @@ + + + + Cursor Change test + + + + + + + + +

    Roll over the buttons to test cursors

    +
    + + + +
    +
    +
    + Debug:
    + +
    +
    + + Canvas not supported. + + + + + diff --git a/noVNC/tests/face.png b/noVNC/tests/face.png new file mode 100644 index 0000000000000000000000000000000000000000..74c30d82f9736beffef5db259b3e40bb6de4ea2b GIT binary patch literal 2303 zcmVDcqz&LP?>7h(O|oIKntKx%ray+TL^a+~)T0!`f>n3cTgh|6ym( z?DyOM%r~>k`rm(L+4(DM%f`8sHkw5f14ij{imA#v*WJ|Q00hwIJr+{BoC65U{pI4W zU}}#{ib*uVz}!qTPqpNmuB>m}lqp;|fAU$yL}^e;Q60pI*t4&1c<9(`|Ju24|G~27 zSu((R_><5N$zql^I-kpZ zxo72fZ~prFbr*Ln>Byv0XOf=!`#-n6^y-54_LC<^95UH_mW+wwC=H*dHC zfI|R*;zVqF>9sA7|5}LTvB!Vsx+y6{6er9w%vO%8vxXRB+;yMd{=%EPb`#NtYp-%s z?wYlidY&JIfvN;VOc`SgrP8T$t8I>iF=`wHvRWC>A@;>qrt&O#}eAoZo%xO_yA}?zTJc5judC%A~baBA-Me zF2r#V1p#RlRD2k9LH8npY{z6l-EsE? zJ*)M-x6P7>0DNonSO2(bMgPIR6|25f_R6QmN2aGrNf?A-XpAvhDJ3hF%3q(|N=QJW z_u;#5z5Rj4=2kbACZn|079&FpaGIK$8|v#zr4qC3d++#8V|^Y(EGZ325m!4aPE3C9 zj=K(ha&*DM#TTvYUcF|0ds|DPPzQin$YwKNxpYlyYrSP@P;68%Q5xC1_e0;CG$w=z zeZMqO9No8n;=O(T)O5J8z46b#-}2SV*VfJxYUio7rST8Frsuldjw8V@1i%;r7+?Wx z_q%&;zU7`rANlE~4QoO2-SaJK*B)rQ8VEl)fRXpq|e(t8a}ZCjpv8Kwdg z0TN(f7QjfIOy?Fe%S4sInz=LoitxsFwRe9T`Xpe1B9KFjgE4@EIS2M1jKXkyYy>cX zIM6o`g~|BnF@Vi}>FNS71{nESOULr^*c<8Y^XGc1DVW+**Senc7*PZh*4hFTNROO6 zas2o(Arg?BHx#p;n?9JD$IWhb?Ac-PSa{b1Ojt@Km6MzDcs>TG+WCTbODIzo9*fB;+kyHn6x>3ss zn^~X)WX~qk097`dv7-bOgOX|yC4ijWPGv|KBLG*4Y3>$k=BM>!r&?7sYNu^b1;msH zoK!PNf$`aBnHf_`KoKY=2#^2?K!Bu@0VpC9gXL8+<)+)_?Gph+)yfqv^NM?6)f2@q zQQyv9Ehj;h+44dD>~aO5h$yP^s?BK?^u4pon9%5mIh}rKI9GpF&D@&*b6eN4Vf@HW zW;KE$qA-(f3MLQ3RA4+9f2PQXslWte0#F1~CB>k`pDLzvd81=vLW?h(939HHY&;|7 zGsQE@lnmp_0JG{rLC30%gZrNIihVP%8AgSuLKJ|i>7QxKE1eiRxPMW1kI@xopO;id zjIw!VNzI&vwW2S7wZO0V?3EN@$R^}`hJft4#4Cx#AecQbX33s>d}?WtU&a>2k+SxsGkmkfP8BAe9nAB#BI-(csv9J=Z>v&Nw6wgXI`s2IqWc zH-qJ2)iG8Fs{k07X);qJPpI(UGI&$P!&dq-sTx21;MM$jTT_{ZsT6lzmpcvs7LLu4 zq>zb_Qp(8xSe1UW>gxM5xh#nfK^m}O6`0)$mIcd!fs9Y8q>}+HhO{mlo!Hq;B5^+b zV29h?l8i7W zHYPGUG&*E_xt(4&J$Crmq5n87zepEWyDqO%T$fvxHA@QoY7mvyQb-}CluAe$hbMID zx9MD}YxPZ;x&=laC3Tc^*_dfE5^xA<<}7A>N$eMo_U}$Y!&`b&*+nkroI5V(+~w6x z0>FZ?{wVNjsjtGMQc^0VlvFAyzhnHrrBd0}&Q2hq_c5KJCYp`m#=aUXamD5ObJf(~_N^7l+Hku681c23KG260j+j4B%vMuhM$(Xxg z&;I|PG0r(STq0xWG!h5^!)YYTVl}{74V}+@QX_)d7PBquiza;mp++)VGluGdoI5eb Z{tpYglKBOBdFlWF002ovPDHLkV1m%%QeprA literal 0 HcmV?d00001 diff --git a/noVNC/tests/face.png.js b/noVNC/tests/face.png.js new file mode 100644 index 0000000..e0b5d6c --- /dev/null +++ b/noVNC/tests/face.png.js @@ -0,0 +1 @@ +var face64 = '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'; diff --git a/noVNC/tests/input.html b/noVNC/tests/input.html new file mode 100644 index 0000000..bc5d2e1 --- /dev/null +++ b/noVNC/tests/input.html @@ -0,0 +1,131 @@ + + + Input Test + +

    + + Canvas: + +
    + + Canvas not supported. + + +
    + Results:
    + + + + + + + + + + + + + diff --git a/noVNC/tests/keyboard-tests.html b/noVNC/tests/keyboard-tests.html new file mode 100644 index 0000000..a30aa6e --- /dev/null +++ b/noVNC/tests/keyboard-tests.html @@ -0,0 +1,29 @@ + + + + + Mocha Tests + + + + +
    + + + + + + + + + + diff --git a/noVNC/tests/run_from_console.casper.js b/noVNC/tests/run_from_console.casper.js new file mode 100644 index 0000000..63b6b20 --- /dev/null +++ b/noVNC/tests/run_from_console.casper.js @@ -0,0 +1,99 @@ +var Spooky = require('spooky'); +var path = require('path'); + +var phantom_path = require('phantomjs').path; +var casper_path = path.resolve(__dirname, 'node_modules/casperjs/bin/casperjs'); +process.env.PHANTOMJS_EXECUTABLE = phantom_path; +var casper_opts = { + child: { + transport: 'http', + command: casper_path + }, + casper: { + logLevel: 'debug', + verbose: true + } +}; + +var provide_emitter = function(file_paths) { + var spooky = new Spooky(casper_opts, function(err) { + if (err) { + if (err.stack) console.warn(err.stack); + else console.warn(err); + return; + } + spooky.start('about:blank'); + + file_paths.forEach(function(file_path, path_ind) { + spooky.thenOpen('file://'+file_path); + spooky.then([{ path_ind: path_ind }, function() { + var res_json = { + file_ind: path_ind + }; + + res_json.num_tests = this.evaluate(function() { return document.querySelectorAll('li.test').length; }); + res_json.num_passes = this.evaluate(function() { return document.querySelectorAll('li.test.pass').length; }); + res_json.num_fails = this.evaluate(function() { return document.querySelectorAll('li.test.fail').length; }); + res_json.num_slow = this.evaluate(function() { return document.querySelectorAll('li.test.pass:not(.fast):not(.pending)').length; }); + res_json.num_skipped = this.evaluate(function () { return document.querySelectorAll('li.test.pending').length; }); + res_json.duration = this.evaluate(function() { return document.querySelector('li.duration em').textContent; }); + + res_json.suites = this.evaluate(function() { + var traverse_node = function(elem) { + var res; + if (elem.classList.contains('suite')) { + res = { + type: 'suite', + name: elem.querySelector('h1').textContent, + has_subfailures: elem.querySelectorAll('li.test.fail').length > 0, + }; + + var child_elems = elem.querySelector('ul').children; + res.children = Array.prototype.map.call(child_elems, traverse_node); + return res; + } + else { + var h2_content = elem.querySelector('h2').childNodes; + res = { + type: 'test', + text: h2_content[0].textContent, + }; + + if (elem.classList.contains('pass')) { + res.pass = true; + if (elem.classList.contains('pending')) { + res.slow = false; + res.skipped = true; + } + else { + res.slow = !elem.classList.contains('fast'); + res.skipped = false; + res.duration = h2_content[1].textContent; + } + } + else { + res.error = elem.querySelector('pre.error').textContent; + } + + return res; + } + }; + var top_suites = document.querySelectorAll('#mocha-report > li.suite'); + return Array.prototype.map.call(top_suites, traverse_node); + }); + + res_json.replay = this.evaluate(function() { return document.querySelector('a.replay').textContent; }); + + this.emit('test_ready', res_json); + }]); + }); + spooky.run(); + }); + + return spooky; +}; + +module.exports = { + provide_emitter: provide_emitter, + name: 'SpookyJS (CapserJS on PhantomJS)' +}; diff --git a/noVNC/tests/run_from_console.js b/noVNC/tests/run_from_console.js new file mode 100755 index 0000000..7525c8b --- /dev/null +++ b/noVNC/tests/run_from_console.js @@ -0,0 +1,288 @@ +#!/usr/bin/env node +var ansi = require('ansi'); +var program = require('commander'); +var path = require('path'); +var fs = require('fs'); + +var make_list = function(val) { + return val.split(','); +}; + +program + .option('-t, --tests ', 'Run the specified html-file-based test(s). \'testlist\' should be a comma-separated list', make_list, []) + .option('-a, --print-all', 'Print all tests, not just the failures') + .option('--disable-color', 'Explicitly disable color') + .option('-c, --color', 'Explicitly enable color (default is to use color when not outputting to a pipe)') + .option('-i, --auto-inject ', 'Treat the test list as a set of mocha JS files, and automatically generate HTML files with which to test test. \'includefiles\' should be a comma-separated list of paths to javascript files to include in each of the generated HTML files', make_list, null) + .option('-p, --provider ', 'Use the given provider (defaults to "casper"). Currently, may be "casper" or "zombie"', 'casper') + .option('-g, --generate-html', 'Instead of running the tests, just return the path to the generated HTML file, then wait for user interaction to exit (should be used with .js tests)') + .option('-o, --output-html', 'Instead of running the tests, just output the generated HTML source to STDOUT (should be used with .js tests)') + .option('-d, --debug', 'Show debug output (the "console" event) from the provider') + .parse(process.argv); + +if (program.tests.length === 0) { + program.tests = fs.readdirSync(__dirname).filter(function(f) { return (/^test\.(\w|\.|-)+\.js$/).test(f); }); + console.log('using files %s', program.tests); +} + +var file_paths = []; + +var all_js = program.tests.reduce(function(a,e) { return a && e.slice(-3) == '.js'; }, true); + +if (all_js && !program.autoInject) { + var all_modules = {}; + + // uses the first instance of the string 'requires local modules: ' + program.tests.forEach(function (testname) { + var full_path = path.resolve(process.cwd(), testname); + var content = fs.readFileSync(full_path).toString(); + var ind = content.indexOf('requires local modules: '); + if (ind > -1) { + ind += 'requires local modules: '.length; + var eol = content.indexOf('\n', ind); + var modules = content.slice(ind, eol).split(/,\s*/); + modules.forEach(function (mod) { + all_modules[path.resolve(__dirname, '../include/', mod)+'.js'] = 1; + }); + } + }); + + program.autoInject = Object.keys(all_modules); +} + +if (program.autoInject) { + var temp = require('temp'); + temp.track(); + + var template = { + header: "\n\n\n\n\n
    ", + script_tag: function(p) { return ""; }, + footer: "\n\n" + }; + + template.header += "\n" + template.script_tag(path.resolve(__dirname, 'node_modules/chai/chai.js')); + template.header += "\n" + template.script_tag(path.resolve(__dirname, 'node_modules/mocha/mocha.js')); + template.header += "\n" + template.script_tag(path.resolve(__dirname, 'node_modules/sinon/pkg/sinon.js')); + template.header += "\n" + template.script_tag(path.resolve(__dirname, 'node_modules/sinon-chai/lib/sinon-chai.js')); + template.header += "\n"; + + + template.header = program.autoInject.reduce(function(acc, sn) { + return acc + "\n" + template.script_tag(path.resolve(process.cwd(), sn)); + }, template.header); + + file_paths = program.tests.map(function(jsn, ind) { + var templ = template.header; + templ += "\n"; + templ += template.script_tag(path.resolve(process.cwd(), jsn)); + templ += template.footer; + + var tempfile = temp.openSync({ prefix: 'novnc-zombie-inject-', suffix: '-file_num-'+ind+'.html' }); + fs.writeSync(tempfile.fd, templ); + fs.closeSync(tempfile.fd); + return tempfile.path; + }); + +} +else { + file_paths = program.tests.map(function(fn) { + return path.resolve(process.cwd(), fn); + }); +} + +var use_ansi = false; +if (program.color) use_ansi = true; +else if (program.disableColor) use_ansi = false; +else if (process.stdout.isTTY) use_ansi = true; + +var cursor = ansi(process.stdout, { enabled: use_ansi }); + +if (program.outputHtml) { + file_paths.forEach(function(path, path_ind) { + fs.readFile(path, function(err, data) { + if (err) { + console.warn(error.stack); + return; + } + + cursor + .bold() + .write(program.tests[path_ind]) + .reset() + .write("\n") + .write(Array(program.tests[path_ind].length+1).join('=')) + .write("\n\n") + .write(data) + .write("\n"); + }); + }); +} + +if (program.generateHtml) { + file_paths.forEach(function(path, path_ind) { + cursor + .bold() + .write(program.tests[path_ind]) + .write(": ") + .reset() + .write(path) + .write("\n"); + }); + console.log(''); +} + +if (program.generateHtml) { + process.stdin.resume(); // pause until C-c + process.on('SIGINT', function() { + process.stdin.pause(); // exit + }); +} + +if (!program.outputHtml && !program.generateHtml) { + var failure_count = 0; + + var prov = require(path.resolve(__dirname, 'run_from_console.'+program.provider+'.js')); + + cursor + .write("Running tests ") + .bold() + .write(program.tests.join(', ')) + .reset() + .grey() + .write(' using provider '+prov.name) + .reset() + .write("\n"); + //console.log("Running tests %s using provider %s", program.tests.join(', '), prov.name); + + var provider = prov.provide_emitter(file_paths); + provider.on('test_ready', function(test_json) { + console.log(''); + + filename = program.tests[test_json.file_ind]; + + cursor.bold(); + console.log('Results for %s:', filename); + console.log(Array('Results for :'.length+filename.length+1).join('=')); + cursor.reset(); + + console.log(''); + + cursor + .write(''+test_json.num_tests+' tests run, ') + .green() + .write(''+test_json.num_passes+' passed'); + if (test_json.num_slow > 0) { + cursor + .reset() + .write(' ('); + cursor + .yellow() + .write(''+test_json.num_slow+' slow') + .reset() + .write(')'); + } + cursor + .reset() + .write(', '); + cursor + .red() + .write(''+test_json.num_fails+' failed'); + if (test_json.num_skipped > 0) { + cursor + .reset() + .write(', ') + .grey() + .write(''+test_json.num_skipped+' skipped'); + } + cursor + .reset() + .write(' -- duration: '+test_json.duration+"s\n"); + + console.log(''); + + if (test_json.num_fails > 0 || program.printAll) { + var traverse_tree = function(indentation, node) { + if (node.type == 'suite') { + if (!node.has_subfailures && !program.printAll) return; + + if (indentation === 0) { + cursor.bold(); + console.log(node.name); + console.log(Array(node.name.length+1).join('-')); + cursor.reset(); + } + else { + cursor + .write(Array(indentation+3).join('#')) + .bold() + .write(' '+node.name+' ') + .reset() + .write(Array(indentation+3).join('#')) + .write("\n"); + } + + console.log(''); + + for (var i = 0; i < node.children.length; i++) { + traverse_tree(indentation+1, node.children[i]); + } + } + else { + if (!node.pass) { + cursor.magenta(); + console.log('- failed: '+node.text+test_json.replay); + cursor.red(); + console.log(' '+node.error.split("\n")[0]); // the split is to avoid a weird thing where in PhantomJS where we get a stack trace too + cursor.reset(); + console.log(''); + } + else if (program.printAll) { + if (node.skipped) { + cursor + .grey() + .write('- skipped: '+node.text); + } + else { + if (node.slow) cursor.yellow(); + else cursor.green(); + + cursor + .write('- pass: '+node.text) + .grey() + .write(' ('+node.duration+') '); + } + /*if (node.slow) cursor.yellow(); + else cursor.green();*/ + cursor + //.write(test_json.replay) + .reset() + .write("\n"); + console.log(''); + } + } + }; + + for (var i = 0; i < test_json.suites.length; i++) { + traverse_tree(0, test_json.suites[i]); + } + } + + if (test_json.num_fails === 0) { + cursor.fg.green(); + console.log('all tests passed :-)'); + cursor.reset(); + } + }); + + if (program.debug) { + provider.on('console', function(line) { + console.log(line); + }); + } + + /*gprom.finally(function(ph) { + ph.exit(); + // exit with a status code that actually gives information + if (program.exitWithFailureCount) process.exit(failure_count); + });*/ +} diff --git a/noVNC/tests/run_from_console.zombie.js b/noVNC/tests/run_from_console.zombie.js new file mode 100644 index 0000000..7280f75 --- /dev/null +++ b/noVNC/tests/run_from_console.zombie.js @@ -0,0 +1,82 @@ +var Browser = require('zombie'); +var path = require('path'); +var EventEmitter = require('events').EventEmitter; +var Q = require('q'); + +var provide_emitter = function(file_paths) { + var emitter = new EventEmitter(); + + file_paths.reduce(function(prom, file_path, path_ind) { + return prom.then(function(browser) { + browser.visit('file://'+file_path, function() { + if (browser.error) throw new Error(browser.errors); + + var res_json = {}; + res_json.file_ind = path_ind; + + res_json.num_tests = browser.querySelectorAll('li.test').length; + res_json.num_fails = browser.querySelectorAll('li.test.fail').length; + res_json.num_passes = browser.querySelectorAll('li.test.pass').length; + res_json.num_slow = browser.querySelectorAll('li.test.pass:not(.fast)').length; + res_json.num_skipped = browser.querySelectorAll('li.test.pending').length; + res_json.duration = browser.text('li.duration em'); + + var traverse_node = function(elem) { + var classList = elem.className.split(' '); + var res; + if (classList.indexOf('suite') > -1) { + res = { + type: 'suite', + name: elem.querySelector('h1').textContent, + has_subfailures: elem.querySelectorAll('li.test.fail').length > 0 + }; + + var child_elems = elem.querySelector('ul').children; + res.children = Array.prototype.map.call(child_elems, traverse_node); + return res; + } + else { + var h2_content = elem.querySelector('h2').childNodes; + res = { + type: 'test', + text: h2_content[0].textContent + }; + + if (classList.indexOf('pass') > -1) { + res.pass = true; + if (classList.indexOf('pending') > -1) { + res.slow = false; + res.skipped = true; + } + else { + res.slow = classList.indexOf('fast') < 0; + res.skipped = false; + res.duration = h2_content[1].textContent; + } + } + else { + res.error = elem.querySelector('pre.error').textContent; + } + + return res; + } + }; + + var top_suites = browser.querySelectorAll('#mocha-report > li.suite'); + res_json.suites = Array.prototype.map.call(top_suites, traverse_node); + res_json.replay = browser.querySelector('a.replay').textContent; + + emitter.emit('test_ready', res_json); + }); + + return new Browser(); + }); + }, Q(new Browser())); + + return emitter; +}; + +module.exports = { + provide_emitter: provide_emitter, + name: 'ZombieJS' +}; diff --git a/noVNC/tests/stats.js b/noVNC/tests/stats.js new file mode 100644 index 0000000..cd3011c --- /dev/null +++ b/noVNC/tests/stats.js @@ -0,0 +1,53 @@ +/* + * Define some useful statistical functions on arrays of numbers + */ + +Array.prototype.sum = function() { + var i, sum = 0; + for (i = 0; i < this.length; i++) { + sum += this[i]; + } + return sum; +} + +Array.prototype.max = function() { + return Math.max.apply(null, this); +} + +Array.prototype.min = function() { + return Math.min.apply(null, this); +} + +Array.prototype.mean = function() { + return this.sum() / this.length; +} +Array.prototype.average = Array.prototype.mean; + +Array.prototype.median = function() { + var sorted = this.sort( function(a,b) { return a-b; }), + len = sorted.length; + if (len % 2) { + return sorted[Math.floor(len / 2)]; // Odd + } else { + return (sorted[len/2 - 1] + sorted[len/2]) / 2; // Even + } +} + +Array.prototype.stdDev = function(sample) { + var i, sumSqr = 0, mean = this.mean(), N; + + if (sample) { + // Population correction if this is a sample + N = this.length - 1; + } else { + // Standard deviation of just the array + N = this.length; + } + + for (i = 0; i < this.length; i++) { + sumSqr += Math.pow(this[i] - mean, 2); + } + + return Math.sqrt(sumSqr / N); +} + diff --git a/noVNC/tests/test.helper.js b/noVNC/tests/test.helper.js new file mode 100644 index 0000000..d9e8e14 --- /dev/null +++ b/noVNC/tests/test.helper.js @@ -0,0 +1,260 @@ +var assert = chai.assert; +var expect = chai.expect; + +describe('Helpers', function() { + "use strict"; + describe('keysymFromKeyCode', function() { + it('should map known keycodes to keysyms', function() { + expect(kbdUtil.keysymFromKeyCode(0x41, false), 'a').to.be.equal(0x61); + expect(kbdUtil.keysymFromKeyCode(0x41, true), 'A').to.be.equal(0x41); + expect(kbdUtil.keysymFromKeyCode(0xd, false), 'enter').to.be.equal(0xFF0D); + expect(kbdUtil.keysymFromKeyCode(0x11, false), 'ctrl').to.be.equal(0xFFE3); + expect(kbdUtil.keysymFromKeyCode(0x12, false), 'alt').to.be.equal(0xFFE9); + expect(kbdUtil.keysymFromKeyCode(0xe1, false), 'altgr').to.be.equal(0xFE03); + expect(kbdUtil.keysymFromKeyCode(0x1b, false), 'esc').to.be.equal(0xFF1B); + expect(kbdUtil.keysymFromKeyCode(0x26, false), 'up').to.be.equal(0xFF52); + }); + it('should return null for unknown keycodes', function() { + expect(kbdUtil.keysymFromKeyCode(0xc0, false), 'DK æ').to.be.null; + expect(kbdUtil.keysymFromKeyCode(0xde, false), 'DK ø').to.be.null; + }); + }); + + describe('keysyms.fromUnicode', function() { + it('should map ASCII characters to keysyms', function() { + expect(keysyms.fromUnicode('a'.charCodeAt())).to.have.property('keysym', 0x61); + expect(keysyms.fromUnicode('A'.charCodeAt())).to.have.property('keysym', 0x41); + }); + it('should map Latin-1 characters to keysyms', function() { + expect(keysyms.fromUnicode('ø'.charCodeAt())).to.have.property('keysym', 0xf8); + + expect(keysyms.fromUnicode('é'.charCodeAt())).to.have.property('keysym', 0xe9); + }); + it('should map characters that are in Windows-1252 but not in Latin-1 to keysyms', function() { + expect(keysyms.fromUnicode('Š'.charCodeAt())).to.have.property('keysym', 0x01a9); + }); + it('should map characters which aren\'t in Latin1 *or* Windows-1252 to keysyms', function() { + expect(keysyms.fromUnicode('ŵ'.charCodeAt())).to.have.property('keysym', 0x1000175); + }); + it('should return undefined for unknown codepoints', function() { + expect(keysyms.fromUnicode('\n'.charCodeAt())).to.be.undefined; + expect(keysyms.fromUnicode('\u1F686'.charCodeAt())).to.be.undefined; + }); + }); + + describe('substituteCodepoint', function() { + it('should replace characters which don\'t have a keysym', function() { + expect(kbdUtil.substituteCodepoint('Ș'.charCodeAt())).to.equal('Ş'.charCodeAt()); + expect(kbdUtil.substituteCodepoint('ș'.charCodeAt())).to.equal('ş'.charCodeAt()); + expect(kbdUtil.substituteCodepoint('Ț'.charCodeAt())).to.equal('Ţ'.charCodeAt()); + expect(kbdUtil.substituteCodepoint('ț'.charCodeAt())).to.equal('ţ'.charCodeAt()); + }); + it('should pass other characters through unchanged', function() { + expect(kbdUtil.substituteCodepoint('T'.charCodeAt())).to.equal('T'.charCodeAt()); + }); + }); + + describe('nonCharacterKey', function() { + it('should recognize the right keys', function() { + expect(kbdUtil.nonCharacterKey({keyCode: 0xd}), 'enter').to.be.defined; + expect(kbdUtil.nonCharacterKey({keyCode: 0x08}), 'backspace').to.be.defined; + expect(kbdUtil.nonCharacterKey({keyCode: 0x09}), 'tab').to.be.defined; + expect(kbdUtil.nonCharacterKey({keyCode: 0x10}), 'shift').to.be.defined; + expect(kbdUtil.nonCharacterKey({keyCode: 0x11}), 'ctrl').to.be.defined; + expect(kbdUtil.nonCharacterKey({keyCode: 0x12}), 'alt').to.be.defined; + expect(kbdUtil.nonCharacterKey({keyCode: 0xe0}), 'meta').to.be.defined; + }); + it('should not recognize character keys', function() { + expect(kbdUtil.nonCharacterKey({keyCode: 'A'}), 'A').to.be.null; + expect(kbdUtil.nonCharacterKey({keyCode: '1'}), '1').to.be.null; + expect(kbdUtil.nonCharacterKey({keyCode: '.'}), '.').to.be.null; + expect(kbdUtil.nonCharacterKey({keyCode: ' '}), 'space').to.be.null; + }); + }); + + describe('getKeysym', function() { + it('should prefer char', function() { + expect(kbdUtil.getKeysym({char : 'a', charCode: 'Š'.charCodeAt(), keyCode: 0x42, which: 0x43})).to.have.property('keysym', 0x61); + }); + it('should use charCode if no char', function() { + expect(kbdUtil.getKeysym({char : '', charCode: 'Š'.charCodeAt(), keyCode: 0x42, which: 0x43})).to.have.property('keysym', 0x01a9); + expect(kbdUtil.getKeysym({charCode: 'Š'.charCodeAt(), keyCode: 0x42, which: 0x43})).to.have.property('keysym', 0x01a9); + expect(kbdUtil.getKeysym({char : 'hello', charCode: 'Š'.charCodeAt(), keyCode: 0x42, which: 0x43})).to.have.property('keysym', 0x01a9); + }); + it('should use keyCode if no charCode', function() { + expect(kbdUtil.getKeysym({keyCode: 0x42, which: 0x43, shiftKey: false})).to.have.property('keysym', 0x62); + expect(kbdUtil.getKeysym({keyCode: 0x42, which: 0x43, shiftKey: true})).to.have.property('keysym', 0x42); + }); + it('should use which if no keyCode', function() { + expect(kbdUtil.getKeysym({which: 0x43, shiftKey: false})).to.have.property('keysym', 0x63); + expect(kbdUtil.getKeysym({which: 0x43, shiftKey: true})).to.have.property('keysym', 0x43); + }); + it('should substitute where applicable', function() { + expect(kbdUtil.getKeysym({char : 'Ș'})).to.have.property('keysym', 0x1aa); + }); + }); + + describe('Modifier Sync', function() { // return a list of fake events necessary to fix modifier state + describe('Toggle all modifiers', function() { + var sync = kbdUtil.ModifierSync(); + it ('should do nothing if all modifiers are up as expected', function() { + expect(sync.keydown({ + keyCode: 0x41, + ctrlKey: false, + altKey: false, + altGraphKey: false, + shiftKey: false, + metaKey: false}) + ).to.have.lengthOf(0); + }); + it ('should synthesize events if all keys are unexpectedly down', function() { + var result = sync.keydown({ + keyCode: 0x41, + ctrlKey: true, + altKey: true, + altGraphKey: true, + shiftKey: true, + metaKey: true + }); + expect(result).to.have.lengthOf(5); + var keysyms = {}; + for (var i = 0; i < result.length; ++i) { + keysyms[result[i].keysym] = (result[i].type == 'keydown'); + } + expect(keysyms[0xffe3]); + expect(keysyms[0xffe9]); + expect(keysyms[0xfe03]); + expect(keysyms[0xffe1]); + expect(keysyms[0xffe7]); + }); + it ('should do nothing if all modifiers are down as expected', function() { + expect(sync.keydown({ + keyCode: 0x41, + ctrlKey: true, + altKey: true, + altGraphKey: true, + shiftKey: true, + metaKey: true + })).to.have.lengthOf(0); + }); + }); + describe('Toggle Ctrl', function() { + var sync = kbdUtil.ModifierSync(); + it('should sync if modifier is suddenly down', function() { + expect(sync.keydown({ + keyCode: 0x41, + ctrlKey: true, + })).to.be.deep.equal([{keysym: keysyms.lookup(0xffe3), type: 'keydown'}]); + }); + it('should sync if modifier is suddenly up', function() { + expect(sync.keydown({ + keyCode: 0x41, + ctrlKey: false + })).to.be.deep.equal([{keysym: keysyms.lookup(0xffe3), type: 'keyup'}]); + }); + }); + describe('Toggle Alt', function() { + var sync = kbdUtil.ModifierSync(); + it('should sync if modifier is suddenly down', function() { + expect(sync.keydown({ + keyCode: 0x41, + altKey: true, + })).to.be.deep.equal([{keysym: keysyms.lookup(0xffe9), type: 'keydown'}]); + }); + it('should sync if modifier is suddenly up', function() { + expect(sync.keydown({ + keyCode: 0x41, + altKey: false + })).to.be.deep.equal([{keysym: keysyms.lookup(0xffe9), type: 'keyup'}]); + }); + }); + describe('Toggle AltGr', function() { + var sync = kbdUtil.ModifierSync(); + it('should sync if modifier is suddenly down', function() { + expect(sync.keydown({ + keyCode: 0x41, + altGraphKey: true, + })).to.be.deep.equal([{keysym: keysyms.lookup(0xfe03), type: 'keydown'}]); + }); + it('should sync if modifier is suddenly up', function() { + expect(sync.keydown({ + keyCode: 0x41, + altGraphKey: false + })).to.be.deep.equal([{keysym: keysyms.lookup(0xfe03), type: 'keyup'}]); + }); + }); + describe('Toggle Shift', function() { + var sync = kbdUtil.ModifierSync(); + it('should sync if modifier is suddenly down', function() { + expect(sync.keydown({ + keyCode: 0x41, + shiftKey: true, + })).to.be.deep.equal([{keysym: keysyms.lookup(0xffe1), type: 'keydown'}]); + }); + it('should sync if modifier is suddenly up', function() { + expect(sync.keydown({ + keyCode: 0x41, + shiftKey: false + })).to.be.deep.equal([{keysym: keysyms.lookup(0xffe1), type: 'keyup'}]); + }); + }); + describe('Toggle Meta', function() { + var sync = kbdUtil.ModifierSync(); + it('should sync if modifier is suddenly down', function() { + expect(sync.keydown({ + keyCode: 0x41, + metaKey: true, + })).to.be.deep.equal([{keysym: keysyms.lookup(0xffe7), type: 'keydown'}]); + }); + it('should sync if modifier is suddenly up', function() { + expect(sync.keydown({ + keyCode: 0x41, + metaKey: false + })).to.be.deep.equal([{keysym: keysyms.lookup(0xffe7), type: 'keyup'}]); + }); + }); + describe('Modifier keyevents', function() { + it('should not sync a modifier on its own events', function() { + expect(kbdUtil.ModifierSync().keydown({ + keyCode: 0x11, + ctrlKey: false + })).to.be.deep.equal([]); + expect(kbdUtil.ModifierSync().keydown({ + keyCode: 0x11, + ctrlKey: true + }), 'B').to.be.deep.equal([]); + }) + it('should update state on modifier keyevents', function() { + var sync = kbdUtil.ModifierSync(); + sync.keydown({ + keyCode: 0x11, + }); + expect(sync.keydown({ + keyCode: 0x41, + ctrlKey: true, + })).to.be.deep.equal([]); + }); + it('should sync other modifiers on ctrl events', function() { + expect(kbdUtil.ModifierSync().keydown({ + keyCode: 0x11, + altKey: true + })).to.be.deep.equal([{keysym: keysyms.lookup(0xffe9), type: 'keydown'}]); + }) + }); + describe('sync modifiers on non-key events', function() { + it('should generate sync events when receiving non-keyboard events', function() { + expect(kbdUtil.ModifierSync().syncAny({ + altKey: true + })).to.be.deep.equal([{keysym: keysyms.lookup(0xffe9), type: 'keydown'}]); + }); + }); + describe('do not treat shift as a modifier key', function() { + it('should not treat shift as a shortcut modifier', function() { + expect(kbdUtil.hasShortcutModifier([], {0xffe1 : true})).to.be.false; + }); + it('should not treat shift as a char modifier', function() { + expect(kbdUtil.hasCharModifier([], {0xffe1 : true})).to.be.false; + }); + }); + }); +}); diff --git a/noVNC/tests/test.keyboard.js b/noVNC/tests/test.keyboard.js new file mode 100644 index 0000000..80d1fee --- /dev/null +++ b/noVNC/tests/test.keyboard.js @@ -0,0 +1,841 @@ +var assert = chai.assert; +var expect = chai.expect; + + +describe('Key Event Pipeline Stages', function() { + "use strict"; + describe('Decode Keyboard Events', function() { + it('should pass events to the next stage', function(done) { + KeyEventDecoder(kbdUtil.ModifierSync(), function(evt) { + expect(evt).to.be.an.object; + done(); + }).keydown({keyCode: 0x41}); + }); + it('should pass the right keysym through', function(done) { + KeyEventDecoder(kbdUtil.ModifierSync(), function(evt) { + expect(evt.keysym).to.be.deep.equal(keysyms.lookup(0x61)); + done(); + }).keypress({keyCode: 0x41}); + }); + it('should pass the right keyid through', function(done) { + KeyEventDecoder(kbdUtil.ModifierSync(), function(evt) { + expect(evt).to.have.property('keyId', 0x41); + done(); + }).keydown({keyCode: 0x41}); + }); + it('should not sync modifiers on a keypress', function() { + // Firefox provides unreliable modifier state on keypress events + var count = 0; + KeyEventDecoder(kbdUtil.ModifierSync(), function(evt) { + ++count; + }).keypress({keyCode: 0x41, ctrlKey: true}); + expect(count).to.be.equal(1); + }); + it('should sync modifiers if necessary', function(done) { + var count = 0; + KeyEventDecoder(kbdUtil.ModifierSync(), function(evt) { + switch (count) { + case 0: // fake a ctrl keydown + expect(evt).to.be.deep.equal({keysym: keysyms.lookup(0xffe3), type: 'keydown'}); + ++count; + break; + case 1: + expect(evt).to.be.deep.equal({keyId: 0x41, type: 'keydown', keysym: keysyms.lookup(0x61)}); + done(); + break; + } + }).keydown({keyCode: 0x41, ctrlKey: true}); + }); + it('should forward keydown events with the right type', function(done) { + KeyEventDecoder(kbdUtil.ModifierSync(), function(evt) { + expect(evt).to.be.deep.equal({keyId: 0x41, type: 'keydown'}); + done(); + }).keydown({keyCode: 0x41}) + }); + it('should forward keyup events with the right type', function(done) { + KeyEventDecoder(kbdUtil.ModifierSync(), function(evt) { + expect(evt).to.be.deep.equal({keyId: 0x41, keysym: keysyms.lookup(0x61), type: 'keyup'}); + done(); + }).keyup({keyCode: 0x41}); + }); + it('should forward keypress events with the right type', function(done) { + KeyEventDecoder(kbdUtil.ModifierSync(), function(evt) { + expect(evt).to.be.deep.equal({keyId: 0x41, keysym: keysyms.lookup(0x61), type: 'keypress'}); + done(); + }).keypress({keyCode: 0x41}); + }); + it('should generate stalls if a char modifier is down while a key is pressed', function(done) { + var count = 0; + KeyEventDecoder(kbdUtil.ModifierSync([0xfe03]), function(evt) { + switch (count) { + case 0: // fake altgr + expect(evt).to.be.deep.equal({keysym: keysyms.lookup(0xfe03), type: 'keydown'}); + ++count; + break; + case 1: // stall before processing the 'a' keydown + expect(evt).to.be.deep.equal({type: 'stall'}); + ++count; + break; + case 2: // 'a' + expect(evt).to.be.deep.equal({ + type: 'keydown', + keyId: 0x41, + keysym: keysyms.lookup(0x61) + }); + + done(); + break; + } + }).keydown({keyCode: 0x41, altGraphKey: true}); + + }); + describe('suppress the right events at the right time', function() { + it('should suppress anything while a shortcut modifier is down', function() { + var obj = KeyEventDecoder(kbdUtil.ModifierSync(), function(evt) {}); + + obj.keydown({keyCode: 0x11}); // press ctrl + expect(obj.keydown({keyCode: 'A'.charCodeAt()})).to.be.true; + expect(obj.keydown({keyCode: ' '.charCodeAt()})).to.be.true; + expect(obj.keydown({keyCode: '1'.charCodeAt()})).to.be.true; + expect(obj.keydown({keyCode: 0x3c})).to.be.true; // < key on DK Windows + expect(obj.keydown({keyCode: 0xde})).to.be.true; // Ø key on DK + }); + it('should suppress non-character keys', function() { + var obj = KeyEventDecoder(kbdUtil.ModifierSync(), function(evt) {}); + + expect(obj.keydown({keyCode: 0x08}), 'a').to.be.true; + expect(obj.keydown({keyCode: 0x09}), 'b').to.be.true; + expect(obj.keydown({keyCode: 0x11}), 'd').to.be.true; + expect(obj.keydown({keyCode: 0x12}), 'e').to.be.true; + }); + it('should not suppress shift', function() { + var obj = KeyEventDecoder(kbdUtil.ModifierSync(), function(evt) {}); + + expect(obj.keydown({keyCode: 0x10}), 'd').to.be.false; + }); + it('should generate event for shift keydown', function() { + var called = false; + var obj = KeyEventDecoder(kbdUtil.ModifierSync(), function(evt) { + expect(evt).to.have.property('keysym'); + called = true; + }).keydown({keyCode: 0x10}); + expect(called).to.be.true; + }); + it('should not suppress character keys', function() { + var obj = KeyEventDecoder(kbdUtil.ModifierSync(), function(evt) {}); + + expect(obj.keydown({keyCode: 'A'.charCodeAt()})).to.be.false; + expect(obj.keydown({keyCode: ' '.charCodeAt()})).to.be.false; + expect(obj.keydown({keyCode: '1'.charCodeAt()})).to.be.false; + expect(obj.keydown({keyCode: 0x3c})).to.be.false; // < key on DK Windows + expect(obj.keydown({keyCode: 0xde})).to.be.false; // Ø key on DK + }); + it('should not suppress if a char modifier is down', function() { + var obj = KeyEventDecoder(kbdUtil.ModifierSync([0xfe03]), function(evt) {}); + + obj.keydown({keyCode: 0xe1}); // press altgr + expect(obj.keydown({keyCode: 'A'.charCodeAt()})).to.be.false; + expect(obj.keydown({keyCode: ' '.charCodeAt()})).to.be.false; + expect(obj.keydown({keyCode: '1'.charCodeAt()})).to.be.false; + expect(obj.keydown({keyCode: 0x3c})).to.be.false; // < key on DK Windows + expect(obj.keydown({keyCode: 0xde})).to.be.false; // Ø key on DK + }); + }); + describe('Keypress and keyup events', function() { + it('should always suppress event propagation', function() { + var obj = KeyEventDecoder(kbdUtil.ModifierSync(), function(evt) {}); + + expect(obj.keypress({keyCode: 'A'.charCodeAt()})).to.be.true; + expect(obj.keypress({keyCode: 0x3c})).to.be.true; // < key on DK Windows + expect(obj.keypress({keyCode: 0x11})).to.be.true; + + expect(obj.keyup({keyCode: 'A'.charCodeAt()})).to.be.true; + expect(obj.keyup({keyCode: 0x3c})).to.be.true; // < key on DK Windows + expect(obj.keyup({keyCode: 0x11})).to.be.true; + }); + it('should never generate stalls', function() { + var obj = KeyEventDecoder(kbdUtil.ModifierSync(), function(evt) { + expect(evt.type).to.not.be.equal('stall'); + }); + + obj.keypress({keyCode: 'A'.charCodeAt()}); + obj.keypress({keyCode: 0x3c}); + obj.keypress({keyCode: 0x11}); + + obj.keyup({keyCode: 'A'.charCodeAt()}); + obj.keyup({keyCode: 0x3c}); + obj.keyup({keyCode: 0x11}); + }); + }); + describe('mark events if a char modifier is down', function() { + it('should not mark modifiers on a keydown event', function() { + var times_called = 0; + var obj = KeyEventDecoder(kbdUtil.ModifierSync([0xfe03]), function(evt) { + switch (times_called++) { + case 0: //altgr + break; + case 1: // 'a' + expect(evt).to.not.have.property('escape'); + break; + } + }); + + obj.keydown({keyCode: 0xe1}); // press altgr + obj.keydown({keyCode: 'A'.charCodeAt()}); + }); + + it('should indicate on events if a single-key char modifier is down', function(done) { + var times_called = 0; + var obj = KeyEventDecoder(kbdUtil.ModifierSync([0xfe03]), function(evt) { + switch (times_called++) { + case 0: //altgr + break; + case 1: // 'a' + expect(evt).to.be.deep.equal({ + type: 'keypress', + keyId: 'A'.charCodeAt(), + keysym: keysyms.lookup('a'.charCodeAt()), + escape: [0xfe03] + }); + done(); + return; + } + }); + + obj.keydown({keyCode: 0xe1}); // press altgr + obj.keypress({keyCode: 'A'.charCodeAt()}); + }); + it('should indicate on events if a multi-key char modifier is down', function(done) { + var times_called = 0; + var obj = KeyEventDecoder(kbdUtil.ModifierSync([0xffe9, 0xffe3]), function(evt) { + switch (times_called++) { + case 0: //ctrl + break; + case 1: //alt + break; + case 2: // 'a' + expect(evt).to.be.deep.equal({ + type: 'keypress', + keyId: 'A'.charCodeAt(), + keysym: keysyms.lookup('a'.charCodeAt()), + escape: [0xffe9, 0xffe3] + }); + done(); + return; + } + }); + + obj.keydown({keyCode: 0x11}); // press ctrl + obj.keydown({keyCode: 0x12}); // press alt + obj.keypress({keyCode: 'A'.charCodeAt()}); + }); + it('should not consider a char modifier to be down on the modifier key itself', function() { + var obj = KeyEventDecoder(kbdUtil.ModifierSync([0xfe03]), function(evt) { + expect(evt).to.not.have.property('escape'); + }); + + obj.keydown({keyCode: 0xe1}); // press altgr + + }); + }); + describe('add/remove keysym', function() { + it('should remove keysym from keydown if a char key and no modifier', function() { + KeyEventDecoder(kbdUtil.ModifierSync(), function(evt) { + expect(evt).to.be.deep.equal({keyId: 0x41, type: 'keydown'}); + }).keydown({keyCode: 0x41}); + }); + it('should not remove keysym from keydown if a shortcut modifier is down', function() { + var times_called = 0; + KeyEventDecoder(kbdUtil.ModifierSync(), function(evt) { + switch (times_called++) { + case 1: + expect(evt).to.be.deep.equal({keyId: 0x41, keysym: keysyms.lookup(0x61), type: 'keydown'}); + break; + } + }).keydown({keyCode: 0x41, ctrlKey: true}); + expect(times_called).to.be.equal(2); + }); + it('should not remove keysym from keydown if a char modifier is down', function() { + var times_called = 0; + KeyEventDecoder(kbdUtil.ModifierSync([0xfe03]), function(evt) { + switch (times_called++) { + case 2: + expect(evt).to.be.deep.equal({keyId: 0x41, keysym: keysyms.lookup(0x61), type: 'keydown'}); + break; + } + }).keydown({keyCode: 0x41, altGraphKey: true}); + expect(times_called).to.be.equal(3); + }); + it('should not remove keysym from keydown if key is noncharacter', function() { + KeyEventDecoder(kbdUtil.ModifierSync(), function(evt) { + expect(evt, 'bacobjpace').to.be.deep.equal({keyId: 0x09, keysym: keysyms.lookup(0xff09), type: 'keydown'}); + }).keydown({keyCode: 0x09}); + + KeyEventDecoder(kbdUtil.ModifierSync(), function(evt) { + expect(evt, 'ctrl').to.be.deep.equal({keyId: 0x11, keysym: keysyms.lookup(0xffe3), type: 'keydown'}); + }).keydown({keyCode: 0x11}); + }); + it('should never remove keysym from keypress', function() { + KeyEventDecoder(kbdUtil.ModifierSync(), function(evt) { + expect(evt).to.be.deep.equal({keyId: 0x41, keysym: keysyms.lookup(0x61), type: 'keypress'}); + }).keypress({keyCode: 0x41}); + }); + it('should never remove keysym from keyup', function() { + KeyEventDecoder(kbdUtil.ModifierSync(), function(evt) { + expect(evt).to.be.deep.equal({keyId: 0x41, keysym: keysyms.lookup(0x61), type: 'keyup'}); + }).keyup({keyCode: 0x41}); + }); + }); + // on keypress, keyup(?), always set keysym + // on keydown, only do it if we don't expect a keypress: if noncharacter OR modifier is down + }); + + describe('Verify that char modifiers are active', function() { + it('should pass keydown events through if there is no stall', function(done) { + var obj = VerifyCharModifier(function(evt){ + expect(evt).to.deep.equal({type: 'keydown', keyId: 0x41, keysym: keysyms.lookup(0x41)}); + done(); + })({type: 'keydown', keyId: 0x41, keysym: keysyms.lookup(0x41)}); + }); + it('should pass keyup events through if there is no stall', function(done) { + var obj = VerifyCharModifier(function(evt){ + expect(evt).to.deep.equal({type: 'keyup', keyId: 0x41, keysym: keysyms.lookup(0x41)}); + done(); + })({type: 'keyup', keyId: 0x41, keysym: keysyms.lookup(0x41)}); + }); + it('should pass keypress events through if there is no stall', function(done) { + var obj = VerifyCharModifier(function(evt){ + expect(evt).to.deep.equal({type: 'keypress', keyId: 0x41, keysym: keysyms.lookup(0x41)}); + done(); + })({type: 'keypress', keyId: 0x41, keysym: keysyms.lookup(0x41)}); + }); + it('should not pass stall events through', function(done){ + var obj = VerifyCharModifier(function(evt){ + // should only be called once, for the keydown + expect(evt).to.deep.equal({type: 'keydown', keyId: 0x41, keysym: keysyms.lookup(0x41)}); + done(); + }); + + obj({type: 'stall'}); + obj({type: 'keydown', keyId: 0x41, keysym: keysyms.lookup(0x41)}); + }); + it('should merge keydown and keypress events if they come after a stall', function(done) { + var next_called = false; + var obj = VerifyCharModifier(function(evt){ + // should only be called once, for the keydown + expect(next_called).to.be.false; + next_called = true; + expect(evt).to.deep.equal({type: 'keydown', keyId: 0x41, keysym: keysyms.lookup(0x44)}); + done(); + }); + + obj({type: 'stall'}); + obj({type: 'keydown', keyId: 0x41, keysym: keysyms.lookup(0x42)}); + obj({type: 'keypress', keyId: 0x43, keysym: keysyms.lookup(0x44)}); + expect(next_called).to.be.false; + }); + it('should preserve modifier attribute when merging if keysyms differ', function(done) { + var next_called = false; + var obj = VerifyCharModifier(function(evt){ + // should only be called once, for the keydown + expect(next_called).to.be.false; + next_called = true; + expect(evt).to.deep.equal({type: 'keydown', keyId: 0x41, keysym: keysyms.lookup(0x44), escape: [0xffe3]}); + done(); + }); + + obj({type: 'stall'}); + obj({type: 'keydown', keyId: 0x41, keysym: keysyms.lookup(0x42)}); + obj({type: 'keypress', keyId: 0x43, keysym: keysyms.lookup(0x44), escape: [0xffe3]}); + expect(next_called).to.be.false; + }); + it('should not preserve modifier attribute when merging if keysyms are the same', function() { + var obj = VerifyCharModifier(function(evt){ + expect(evt).to.not.have.property('escape'); + }); + + obj({type: 'stall'}); + obj({type: 'keydown', keyId: 0x41, keysym: keysyms.lookup(0x42)}); + obj({type: 'keypress', keyId: 0x43, keysym: keysyms.lookup(0x42), escape: [0xffe3]}); + }); + it('should not merge keydown and keypress events if there is no stall', function(done) { + var times_called = 0; + var obj = VerifyCharModifier(function(evt){ + switch(times_called) { + case 0: + expect(evt).to.deep.equal({type: 'keydown', keyId: 0x41, keysym: keysyms.lookup(0x42)}); + break; + case 1: + expect(evt).to.deep.equal({type: 'keypress', keyId: 0x43, keysym: keysyms.lookup(0x44)}); + done(); + break; + } + + ++times_called; + }); + + obj({type: 'keydown', keyId: 0x41, keysym: keysyms.lookup(0x42)}); + obj({type: 'keypress', keyId: 0x43, keysym: keysyms.lookup(0x44)}); + }); + it('should not merge keydown and keypress events if separated by another event', function(done) { + var times_called = 0; + var obj = VerifyCharModifier(function(evt){ + switch(times_called) { + case 0: + expect(evt,1).to.deep.equal({type: 'keydown', keyId: 0x41, keysym: keysyms.lookup(0x42)}); + break; + case 1: + expect(evt,2).to.deep.equal({type: 'keyup', keyId: 0x43, keysym: keysyms.lookup(0x44)}); + break; + case 2: + expect(evt,3).to.deep.equal({type: 'keypress', keyId: 0x45, keysym: keysyms.lookup(0x46)}); + done(); + break; + } + + ++times_called; + }); + + obj({type: 'stall'}); + obj({type: 'keydown', keyId: 0x41, keysym: keysyms.lookup(0x42)}); + obj({type: 'keyup', keyId: 0x43, keysym: keysyms.lookup(0x44)}); + obj({type: 'keypress', keyId: 0x45, keysym: keysyms.lookup(0x46)}); + }); + }); + + describe('Track Key State', function() { + it('should do nothing on keyup events if no keys are down', function() { + var obj = TrackKeyState(function(evt) { + expect(true).to.be.false; + }); + obj({type: 'keyup', keyId: 0x41}); + }); + it('should insert into the queue on keydown if no keys are down', function() { + var times_called = 0; + var elem = null; + var keysymsdown = {}; + var obj = TrackKeyState(function(evt) { + ++times_called; + if (elem.type == 'keyup') { + expect(evt).to.have.property('keysym'); + expect (keysymsdown[evt.keysym.keysym]).to.not.be.undefined; + delete keysymsdown[evt.keysym.keysym]; + } + else { + expect(evt).to.be.deep.equal(elem); + expect (keysymsdown[evt.keysym.keysym]).to.not.be.undefined; + } + elem = null; + }); + + expect(elem).to.be.null; + elem = {type: 'keydown', keyId: 0x41, keysym: keysyms.lookup(0x42)}; + keysymsdown[keysyms.lookup(0x42).keysym] = true; + obj(elem); + expect(elem).to.be.null; + elem = {type: 'keyup', keyId: 0x41}; + obj(elem); + expect(elem).to.be.null; + expect(times_called).to.be.equal(2); + }); + it('should insert into the queue on keypress if no keys are down', function() { + var times_called = 0; + var elem = null; + var keysymsdown = {}; + var obj = TrackKeyState(function(evt) { + ++times_called; + if (elem.type == 'keyup') { + expect(evt).to.have.property('keysym'); + expect (keysymsdown[evt.keysym.keysym]).to.not.be.undefined; + delete keysymsdown[evt.keysym.keysym]; + } + else { + expect(evt).to.be.deep.equal(elem); + expect (keysymsdown[evt.keysym.keysym]).to.not.be.undefined; + } + elem = null; + }); + + expect(elem).to.be.null; + elem = {type: 'keypress', keyId: 0x41, keysym: keysyms.lookup(0x42)}; + keysymsdown[keysyms.lookup(0x42).keysym] = true; + obj(elem); + expect(elem).to.be.null; + elem = {type: 'keyup', keyId: 0x41}; + obj(elem); + expect(elem).to.be.null; + expect(times_called).to.be.equal(2); + }); + it('should add keysym to last key entry if keyId matches', function() { + // this implies that a single keyup will release both keysyms + var times_called = 0; + var elem = null; + var keysymsdown = {}; + var obj = TrackKeyState(function(evt) { + ++times_called; + if (elem.type == 'keyup') { + expect(evt).to.have.property('keysym'); + expect (keysymsdown[evt.keysym.keysym]).to.not.be.undefined; + delete keysymsdown[evt.keysym.keysym]; + } + else { + expect(evt).to.be.deep.equal(elem); + expect (keysymsdown[evt.keysym.keysym]).to.not.be.undefined; + elem = null; + } + }); + + expect(elem).to.be.null; + elem = {type: 'keypress', keyId: 0x41, keysym: keysyms.lookup(0x42)}; + keysymsdown[keysyms.lookup(0x42).keysym] = true; + obj(elem); + expect(elem).to.be.null; + elem = {type: 'keypress', keyId: 0x41, keysym: keysyms.lookup(0x43)}; + keysymsdown[keysyms.lookup(0x43).keysym] = true; + obj(elem); + expect(elem).to.be.null; + elem = {type: 'keyup', keyId: 0x41}; + obj(elem); + expect(times_called).to.be.equal(4); + }); + it('should create new key entry if keyId matches and keysym does not', function() { + // this implies that a single keyup will release both keysyms + var times_called = 0; + var elem = null; + var keysymsdown = {}; + var obj = TrackKeyState(function(evt) { + ++times_called; + if (elem.type == 'keyup') { + expect(evt).to.have.property('keysym'); + expect (keysymsdown[evt.keysym.keysym]).to.not.be.undefined; + delete keysymsdown[evt.keysym.keysym]; + } + else { + expect(evt).to.be.deep.equal(elem); + expect (keysymsdown[evt.keysym.keysym]).to.not.be.undefined; + elem = null; + } + }); + + expect(elem).to.be.null; + elem = {type: 'keydown', keyId: 0, keysym: keysyms.lookup(0x42)}; + keysymsdown[keysyms.lookup(0x42).keysym] = true; + obj(elem); + expect(elem).to.be.null; + elem = {type: 'keydown', keyId: 0, keysym: keysyms.lookup(0x43)}; + keysymsdown[keysyms.lookup(0x43).keysym] = true; + obj(elem); + expect(times_called).to.be.equal(2); + expect(elem).to.be.null; + elem = {type: 'keyup', keyId: 0}; + obj(elem); + expect(times_called).to.be.equal(3); + elem = {type: 'keyup', keyId: 0}; + obj(elem); + expect(times_called).to.be.equal(4); + }); + it('should merge key entry if keyIds are zero and keysyms match', function() { + // this implies that a single keyup will release both keysyms + var times_called = 0; + var elem = null; + var keysymsdown = {}; + var obj = TrackKeyState(function(evt) { + ++times_called; + if (elem.type == 'keyup') { + expect(evt).to.have.property('keysym'); + expect (keysymsdown[evt.keysym.keysym]).to.not.be.undefined; + delete keysymsdown[evt.keysym.keysym]; + } + else { + expect(evt).to.be.deep.equal(elem); + expect (keysymsdown[evt.keysym.keysym]).to.not.be.undefined; + elem = null; + } + }); + + expect(elem).to.be.null; + elem = {type: 'keydown', keyId: 0, keysym: keysyms.lookup(0x42)}; + keysymsdown[keysyms.lookup(0x42).keysym] = true; + obj(elem); + expect(elem).to.be.null; + elem = {type: 'keydown', keyId: 0, keysym: keysyms.lookup(0x42)}; + keysymsdown[keysyms.lookup(0x42).keysym] = true; + obj(elem); + expect(times_called).to.be.equal(2); + expect(elem).to.be.null; + elem = {type: 'keyup', keyId: 0}; + obj(elem); + expect(times_called).to.be.equal(3); + }); + it('should add keysym as separate entry if keyId does not match last event', function() { + // this implies that separate keyups are required + var times_called = 0; + var elem = null; + var keysymsdown = {}; + var obj = TrackKeyState(function(evt) { + ++times_called; + if (elem.type == 'keyup') { + expect(evt).to.have.property('keysym'); + expect (keysymsdown[evt.keysym.keysym]).to.not.be.undefined; + delete keysymsdown[evt.keysym.keysym]; + } + else { + expect(evt).to.be.deep.equal(elem); + expect (keysymsdown[evt.keysym.keysym]).to.not.be.undefined; + elem = null; + } + }); + + expect(elem).to.be.null; + elem = {type: 'keypress', keyId: 0x41, keysym: keysyms.lookup(0x42)}; + keysymsdown[keysyms.lookup(0x42).keysym] = true; + obj(elem); + expect(elem).to.be.null; + elem = {type: 'keypress', keyId: 0x42, keysym: keysyms.lookup(0x43)}; + keysymsdown[keysyms.lookup(0x43).keysym] = true; + obj(elem); + expect(elem).to.be.null; + elem = {type: 'keyup', keyId: 0x41}; + obj(elem); + expect(times_called).to.be.equal(4); + elem = {type: 'keyup', keyId: 0x42}; + obj(elem); + expect(times_called).to.be.equal(4); + }); + it('should add keysym as separate entry if keyId does not match last event and first is zero', function() { + // this implies that separate keyups are required + var times_called = 0; + var elem = null; + var keysymsdown = {}; + var obj = TrackKeyState(function(evt) { + ++times_called; + if (elem.type == 'keyup') { + expect(evt).to.have.property('keysym'); + expect (keysymsdown[evt.keysym.keysym]).to.not.be.undefined; + delete keysymsdown[evt.keysym.keysym]; + } + else { + expect(evt).to.be.deep.equal(elem); + expect (keysymsdown[evt.keysym.keysym]).to.not.be.undefined; + elem = null; + } + }); + + expect(elem).to.be.null; + elem = {type: 'keydown', keyId: 0, keysym: keysyms.lookup(0x42)}; + keysymsdown[keysyms.lookup(0x42).keysym] = true; + obj(elem); + expect(elem).to.be.null; + elem = {type: 'keydown', keyId: 0x42, keysym: keysyms.lookup(0x43)}; + keysymsdown[keysyms.lookup(0x43).keysym] = true; + obj(elem); + expect(elem).to.be.null; + expect(times_called).to.be.equal(2); + elem = {type: 'keyup', keyId: 0}; + obj(elem); + expect(times_called).to.be.equal(3); + elem = {type: 'keyup', keyId: 0x42}; + obj(elem); + expect(times_called).to.be.equal(4); + }); + it('should add keysym as separate entry if keyId does not match last event and second is zero', function() { + // this implies that a separate keyups are required + var times_called = 0; + var elem = null; + var keysymsdown = {}; + var obj = TrackKeyState(function(evt) { + ++times_called; + if (elem.type == 'keyup') { + expect(evt).to.have.property('keysym'); + expect (keysymsdown[evt.keysym.keysym]).to.not.be.undefined; + delete keysymsdown[evt.keysym.keysym]; + } + else { + expect(evt).to.be.deep.equal(elem); + expect (keysymsdown[evt.keysym.keysym]).to.not.be.undefined; + elem = null; + } + }); + + expect(elem).to.be.null; + elem = {type: 'keydown', keyId: 0x41, keysym: keysyms.lookup(0x42)}; + keysymsdown[keysyms.lookup(0x42).keysym] = true; + obj(elem); + expect(elem).to.be.null; + elem = {type: 'keydown', keyId: 0, keysym: keysyms.lookup(0x43)}; + keysymsdown[keysyms.lookup(0x43).keysym] = true; + obj(elem); + expect(elem).to.be.null; + elem = {type: 'keyup', keyId: 0x41}; + obj(elem); + expect(times_called).to.be.equal(3); + elem = {type: 'keyup', keyId: 0}; + obj(elem); + expect(times_called).to.be.equal(4); + }); + it('should pop matching key event on keyup', function() { + var times_called = 0; + var obj = TrackKeyState(function(evt) { + switch (times_called++) { + case 0: + case 1: + case 2: + expect(evt.type).to.be.equal('keydown'); + break; + case 3: + expect(evt).to.be.deep.equal({type: 'keyup', keyId: 0x42, keysym: keysyms.lookup(0x62)}); + break; + } + }); + + obj({type: 'keydown', keyId: 0x41, keysym: keysyms.lookup(0x61)}); + obj({type: 'keydown', keyId: 0x42, keysym: keysyms.lookup(0x62)}); + obj({type: 'keydown', keyId: 0x43, keysym: keysyms.lookup(0x63)}); + obj({type: 'keyup', keyId: 0x42}); + expect(times_called).to.equal(4); + }); + it('should pop the first zero keyevent on keyup with zero keyId', function() { + var times_called = 0; + var obj = TrackKeyState(function(evt) { + switch (times_called++) { + case 0: + case 1: + case 2: + expect(evt.type).to.be.equal('keydown'); + break; + case 3: + expect(evt).to.be.deep.equal({type: 'keyup', keyId: 0, keysym: keysyms.lookup(0x61)}); + break; + } + }); + + obj({type: 'keydown', keyId: 0, keysym: keysyms.lookup(0x61)}); + obj({type: 'keydown', keyId: 0, keysym: keysyms.lookup(0x62)}); + obj({type: 'keydown', keyId: 0x41, keysym: keysyms.lookup(0x63)}); + obj({type: 'keyup', keyId: 0x0}); + expect(times_called).to.equal(4); + }); + it('should pop the last keyevents keysym if no match is found for keyId', function() { + var times_called = 0; + var obj = TrackKeyState(function(evt) { + switch (times_called++) { + case 0: + case 1: + case 2: + expect(evt.type).to.be.equal('keydown'); + break; + case 3: + expect(evt).to.be.deep.equal({type: 'keyup', keyId: 0x44, keysym: keysyms.lookup(0x63)}); + break; + } + }); + + obj({type: 'keydown', keyId: 0x41, keysym: keysyms.lookup(0x61)}); + obj({type: 'keydown', keyId: 0x42, keysym: keysyms.lookup(0x62)}); + obj({type: 'keydown', keyId: 0x43, keysym: keysyms.lookup(0x63)}); + obj({type: 'keyup', keyId: 0x44}); + expect(times_called).to.equal(4); + }); + describe('Firefox sends keypress even when keydown is suppressed', function() { + it('should discard the keypress', function() { + var times_called = 0; + var obj = TrackKeyState(function(evt) { + expect(times_called).to.be.equal(0); + ++times_called; + }); + + obj({type: 'keydown', keyId: 0x41, keysym: keysyms.lookup(0x42)}); + expect(times_called).to.be.equal(1); + obj({type: 'keypress', keyId: 0x41, keysym: keysyms.lookup(0x43)}); + }); + }); + describe('releaseAll', function() { + it('should do nothing if no keys have been pressed', function() { + var times_called = 0; + var obj = TrackKeyState(function(evt) { + ++times_called; + }); + obj({type: 'releaseall'}); + expect(times_called).to.be.equal(0); + }); + it('should release the keys that have been pressed', function() { + var times_called = 0; + var obj = TrackKeyState(function(evt) { + switch (times_called++) { + case 2: + expect(evt).to.be.deep.equal({type: 'keyup', keyId: 0, keysym: keysyms.lookup(0x41)}); + break; + case 3: + expect(evt).to.be.deep.equal({type: 'keyup', keyId: 0, keysym: keysyms.lookup(0x42)}); + break; + } + }); + obj({type: 'keydown', keyId: 0x41, keysym: keysyms.lookup(0x41)}); + obj({type: 'keydown', keyId: 0x42, keysym: keysyms.lookup(0x42)}); + expect(times_called).to.be.equal(2); + obj({type: 'releaseall'}); + expect(times_called).to.be.equal(4); + obj({type: 'releaseall'}); + expect(times_called).to.be.equal(4); + }); + }); + + }); + + describe('Escape Modifiers', function() { + describe('Keydown', function() { + it('should pass through when a char modifier is not down', function() { + var times_called = 0; + EscapeModifiers(function(evt) { + expect(times_called).to.be.equal(0); + ++times_called; + expect(evt).to.be.deep.equal({type: 'keydown', keyId: 0x41, keysym: keysyms.lookup(0x42)}); + })({type: 'keydown', keyId: 0x41, keysym: keysyms.lookup(0x42)}); + expect(times_called).to.be.equal(1); + }); + it('should generate fake undo/redo events when a char modifier is down', function() { + var times_called = 0; + EscapeModifiers(function(evt) { + switch(times_called++) { + case 0: + expect(evt).to.be.deep.equal({type: 'keyup', keyId: 0, keysym: keysyms.lookup(0xffe9)}); + break; + case 1: + expect(evt).to.be.deep.equal({type: 'keyup', keyId: 0, keysym: keysyms.lookup(0xffe3)}); + break; + case 2: + expect(evt).to.be.deep.equal({type: 'keydown', keyId: 0x41, keysym: keysyms.lookup(0x42), escape: [0xffe9, 0xffe3]}); + break; + case 3: + expect(evt).to.be.deep.equal({type: 'keydown', keyId: 0, keysym: keysyms.lookup(0xffe9)}); + break; + case 4: + expect(evt).to.be.deep.equal({type: 'keydown', keyId: 0, keysym: keysyms.lookup(0xffe3)}); + break; + } + })({type: 'keydown', keyId: 0x41, keysym: keysyms.lookup(0x42), escape: [0xffe9, 0xffe3]}); + expect(times_called).to.be.equal(5); + }); + }); + describe('Keyup', function() { + it('should pass through when a char modifier is down', function() { + var times_called = 0; + EscapeModifiers(function(evt) { + expect(times_called).to.be.equal(0); + ++times_called; + expect(evt).to.be.deep.equal({type: 'keyup', keyId: 0x41, keysym: keysyms.lookup(0x42), escape: [0xfe03]}); + })({type: 'keyup', keyId: 0x41, keysym: keysyms.lookup(0x42), escape: [0xfe03]}); + expect(times_called).to.be.equal(1); + }); + it('should pass through when a char modifier is not down', function() { + var times_called = 0; + EscapeModifiers(function(evt) { + expect(times_called).to.be.equal(0); + ++times_called; + expect(evt).to.be.deep.equal({type: 'keyup', keyId: 0x41, keysym: keysyms.lookup(0x42)}); + })({type: 'keyup', keyId: 0x41, keysym: keysyms.lookup(0x42)}); + expect(times_called).to.be.equal(1); + }); + }); + }); +}); diff --git a/noVNC/tests/viewport.css b/noVNC/tests/viewport.css new file mode 100644 index 0000000..86f65ff --- /dev/null +++ b/noVNC/tests/viewport.css @@ -0,0 +1,43 @@ +html,body { + margin: 0px; + padding: 0px; + width: 100%; + height: 100%; +} + +.flex-layout { + width: 100%; + height: 100%; + + display: box; + display: -webkit-box; + display: -moz-box; + display: -ms-box; + + box-orient: vertical; + -webkit-box-orient: vertical; + -moz-box-orient: vertical; + -ms-box-orient: vertical; + + box-align: stretch; + -webkit-box-align: stretch; + -moz-box-align: stretch; + -ms-box-align: stretch; +} +.flex-box { + box-flex: 1; + -webkit-box-flex: 1; + -moz-box-flex: 1; + -ms-box-flex: 1; +} + +.container { + margin: 0px; + padding: 0px; +} + +.canvas { + position: absolute; + border-style: dotted; + border-width: 1px; +} diff --git a/noVNC/tests/viewport.html b/noVNC/tests/viewport.html new file mode 100644 index 0000000..cb13ecf --- /dev/null +++ b/noVNC/tests/viewport.html @@ -0,0 +1,204 @@ + + + Viewport Test + + + + + +
    +
    + Canvas: + +
    +
    +
    + + Canvas not supported. + +
    +
    +
    +
    + Results:
    + +
    +
    + + + + + + + + + + + + diff --git a/noVNC/tests/vnc_perf.html b/noVNC/tests/vnc_perf.html new file mode 100644 index 0000000..18aba35 --- /dev/null +++ b/noVNC/tests/vnc_perf.html @@ -0,0 +1,209 @@ + + + + VNC Performance Benchmark + + + + Passes:   + +   + +

    + + Results:
    + + +

    + +
    +
    + + +
    Loading
    +
    + + Canvas not supported. + +
    + + + + + + + + + + + + diff --git a/noVNC/tests/vnc_playback.html b/noVNC/tests/vnc_playback.html new file mode 100644 index 0000000..9d7f31f --- /dev/null +++ b/noVNC/tests/vnc_playback.html @@ -0,0 +1,138 @@ + + + + VNC Playback + + + + Iterations:   + Perftest:  + Realtime:   + +   + +

    + + Results:
    + + +

    + +
    +
    + + +
    Loading
    +
    + + Canvas not supported. + +
    + + + + + + + + + + + diff --git a/noVNC/utils/Makefile b/noVNC/utils/Makefile new file mode 100644 index 0000000..7dc1bc4 --- /dev/null +++ b/noVNC/utils/Makefile @@ -0,0 +1,11 @@ +TARGETS=rebind.so +CFLAGS += -fPIC + +all: $(TARGETS) + +rebind.so: rebind.o + $(CC) $(LDFLAGS) $^ -shared -fPIC -ldl -o $@ + +clean: + rm -f rebind.o rebind.so + diff --git a/noVNC/utils/README.md b/noVNC/utils/README.md new file mode 100644 index 0000000..b90a387 --- /dev/null +++ b/noVNC/utils/README.md @@ -0,0 +1,10 @@ +## WebSockets Proxy/Bridge + +For more detailed description and usage information please refer to +the [websockify README](https://github.com/kanaka/websockify/blob/master/README.md). + +The other versions of websockify (C, Node.js) and the associated test +programs have been moved to +[websockify](https://github.com/kanaka/websockify). Websockify was +formerly named wsproxy. + diff --git a/noVNC/utils/img2js.py b/noVNC/utils/img2js.py new file mode 100755 index 0000000..4d21342 --- /dev/null +++ b/noVNC/utils/img2js.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python + +# +# Convert image to Javascript compatible base64 Data URI +# Copyright 2011 Joel Martin +# Licensed under MPL 2.0 (see docs/LICENSE.MPL-2.0) +# + +import sys, base64 + +try: + from PIL import Image +except: + print "python PIL module required (python-imaging package)" + sys.exit(1) + + +if len(sys.argv) < 3: + print "Usage: %s IMAGE JS_VARIABLE" % sys.argv[0] + sys.exit(1) + +fname = sys.argv[1] +var = sys.argv[2] + +ext = fname.lower().split('.')[-1] +if ext == "png": mime = "image/png" +elif ext in ["jpg", "jpeg"]: mime = "image/jpeg" +elif ext == "gif": mime = "image/gif" +else: + print "Only PNG, JPEG and GIF images are supported" + sys.exit(1) +uri = "data:%s;base64," % mime + +im = Image.open(fname) +w, h = im.size + +raw = open(fname).read() + +print '%s = {"width": %s, "height": %s, "data": "%s%s"};' % ( + var, w, h, uri, base64.b64encode(raw)) diff --git a/noVNC/utils/json2graph.py b/noVNC/utils/json2graph.py new file mode 100755 index 0000000..f9ae27d --- /dev/null +++ b/noVNC/utils/json2graph.py @@ -0,0 +1,206 @@ +#!/usr/bin/env python + +''' +Use matplotlib to generate performance charts +Copyright 2011 Joel Martin +Licensed under MPL-2.0 (see docs/LICENSE.MPL-2.0) +''' + +# a bar plot with errorbars +import sys, json, pprint +import numpy as np +import matplotlib.pyplot as plt +from matplotlib.font_manager import FontProperties + +def usage(): + print "%s json_file level1 level2 level3 [legend_height]\n\n" % sys.argv[0] + print "Description:\n" + print "level1, level2, and level3 are one each of the following:\n"; + print " select=ITEM - select only ITEM at this level"; + print " bar - each item on this level becomes a graph bar"; + print " group - items on this level become groups of bars"; + print "\n"; + print "json_file is a file containing json data in the following format:\n" + print ' {'; + print ' "conf": {'; + print ' "order_l1": ['; + print ' "level1_label1",'; + print ' "level1_label2",'; + print ' ...'; + print ' ],'; + print ' "order_l2": ['; + print ' "level2_label1",'; + print ' "level2_label2",'; + print ' ...'; + print ' ],'; + print ' "order_l3": ['; + print ' "level3_label1",'; + print ' "level3_label2",'; + print ' ...'; + print ' ]'; + print ' },'; + print ' "stats": {'; + print ' "level1_label1": {'; + print ' "level2_label1": {'; + print ' "level3_label1": [val1, val2, val3],'; + print ' "level3_label2": [val1, val2, val3],'; + print ' ...'; + print ' },'; + print ' "level2_label2": {'; + print ' ...'; + print ' },'; + print ' },'; + print ' "level1_label2": {'; + print ' ...'; + print ' },'; + print ' ...'; + print ' },'; + print ' }'; + sys.exit(2) + +def error(msg): + print msg + sys.exit(1) + + +#colors = ['#ff0000', '#0863e9', '#00f200', '#ffa100', +# '#800000', '#805100', '#013075', '#007900'] +colors = ['#ff0000', '#00ff00', '#0000ff', + '#dddd00', '#dd00dd', '#00dddd', + '#dd6622', '#dd2266', '#66dd22', + '#8844dd', '#44dd88', '#4488dd'] + +if len(sys.argv) < 5: + usage() + +filename = sys.argv[1] +L1 = sys.argv[2] +L2 = sys.argv[3] +L3 = sys.argv[4] +if len(sys.argv) > 5: + legendHeight = float(sys.argv[5]) +else: + legendHeight = 0.75 + +# Load the JSON data from the file +data = json.loads(file(filename).read()) +conf = data['conf'] +stats = data['stats'] + +# Sanity check data hierarchy +if len(conf['order_l1']) != len(stats.keys()): + error("conf.order_l1 does not match stats level 1") +for l1 in stats.keys(): + if len(conf['order_l2']) != len(stats[l1].keys()): + error("conf.order_l2 does not match stats level 2 for %s" % l1) + if conf['order_l1'].count(l1) < 1: + error("%s not found in conf.order_l1" % l1) + for l2 in stats[l1].keys(): + if len(conf['order_l3']) != len(stats[l1][l2].keys()): + error("conf.order_l3 does not match stats level 3") + if conf['order_l2'].count(l2) < 1: + error("%s not found in conf.order_l2" % l2) + for l3 in stats[l1][l2].keys(): + if conf['order_l3'].count(l3) < 1: + error("%s not found in conf.order_l3" % l3) + +# +# Generate the data based on the level specifications +# +bar_labels = None +group_labels = None +bar_vals = [] +bar_sdvs = [] +if L3.startswith("select="): + select_label = l3 = L3.split("=")[1] + bar_labels = conf['order_l1'] + group_labels = conf['order_l2'] + bar_vals = [[0]*len(group_labels) for i in bar_labels] + bar_sdvs = [[0]*len(group_labels) for i in bar_labels] + for b in range(len(bar_labels)): + l1 = bar_labels[b] + for g in range(len(group_labels)): + l2 = group_labels[g] + bar_vals[b][g] = np.mean(stats[l1][l2][l3]) + bar_sdvs[b][g] = np.std(stats[l1][l2][l3]) +elif L2.startswith("select="): + select_label = l2 = L2.split("=")[1] + bar_labels = conf['order_l1'] + group_labels = conf['order_l3'] + bar_vals = [[0]*len(group_labels) for i in bar_labels] + bar_sdvs = [[0]*len(group_labels) for i in bar_labels] + for b in range(len(bar_labels)): + l1 = bar_labels[b] + for g in range(len(group_labels)): + l3 = group_labels[g] + bar_vals[b][g] = np.mean(stats[l1][l2][l3]) + bar_sdvs[b][g] = np.std(stats[l1][l2][l3]) +elif L1.startswith("select="): + select_label = l1 = L1.split("=")[1] + bar_labels = conf['order_l2'] + group_labels = conf['order_l3'] + bar_vals = [[0]*len(group_labels) for i in bar_labels] + bar_sdvs = [[0]*len(group_labels) for i in bar_labels] + for b in range(len(bar_labels)): + l2 = bar_labels[b] + for g in range(len(group_labels)): + l3 = group_labels[g] + bar_vals[b][g] = np.mean(stats[l1][l2][l3]) + bar_sdvs[b][g] = np.std(stats[l1][l2][l3]) +else: + usage() + +# If group is before bar then flip (zip) the data +if [L1, L2, L3].index("group") < [L1, L2, L3].index("bar"): + bar_labels, group_labels = group_labels, bar_labels + bar_vals = zip(*bar_vals) + bar_sdvs = zip(*bar_sdvs) + +print "bar_vals:", bar_vals + +# +# Now render the bar graph +# +ind = np.arange(len(group_labels)) # the x locations for the groups +width = 0.8 * (1.0/len(bar_labels)) # the width of the bars + +fig = plt.figure(figsize=(10,6), dpi=80) +plot = fig.add_subplot(1, 1, 1) + +rects = [] +for i in range(len(bar_vals)): + rects.append(plot.bar(ind+width*i, bar_vals[i], width, color=colors[i], + yerr=bar_sdvs[i], align='center')) + +# add some +plot.set_ylabel('Milliseconds (less is better)') +plot.set_title("Javascript array test: %s" % select_label) +plot.set_xticks(ind+width) +plot.set_xticklabels( group_labels ) + +fontP = FontProperties() +fontP.set_size('small') +plot.legend( [r[0] for r in rects], bar_labels, prop=fontP, + loc = 'center right', bbox_to_anchor = (1.0, legendHeight)) + +def autolabel(rects): + # attach some text labels + for rect in rects: + height = rect.get_height() + if np.isnan(height): + height = 0.0 + plot.text(rect.get_x()+rect.get_width()/2., height+20, '%d'%int(height), + ha='center', va='bottom', size='7') + +for rect in rects: + autolabel(rect) + +# Adjust axis sizes +axis = list(plot.axis()) +axis[0] = -width # Make sure left side has enough for bar +#axis[1] = axis[1] * 1.20 # Add 20% to the right to make sure it fits +axis[2] = 0 # Make y-axis start at 0 +axis[3] = axis[3] * 1.10 # Add 10% to the top +plot.axis(axis) + +plt.show() diff --git a/noVNC/utils/launch.sh b/noVNC/utils/launch.sh new file mode 100755 index 0000000..1581f17 --- /dev/null +++ b/noVNC/utils/launch.sh @@ -0,0 +1,118 @@ +#!/usr/bin/env bash + +usage() { + if [ "$*" ]; then + echo "$*" + echo + fi + echo "Usage: ${NAME} [--listen PORT] [--vnc VNC_HOST:PORT] [--cert CERT]" + echo + echo "Starts the WebSockets proxy and a mini-webserver and " + echo "provides a cut-and-paste URL to go to." + echo + echo " --listen PORT Port for proxy/webserver to listen on" + echo " Default: 6080" + echo " --vnc VNC_HOST:PORT VNC server host:port proxy target" + echo " Default: localhost:5900" + echo " --cert CERT Path to combined cert/key file" + echo " Default: self.pem" + echo " --web WEB Path to web files (e.g. vnc.html)" + echo " Default: ./" + exit 2 +} + +NAME="$(basename $0)" +HERE="$(cd "$(dirname "$0")" && pwd)" +PORT="6080" +VNC_DEST="localhost:5900" +CERT="" +WEB="" +proxy_pid="" + +die() { + echo "$*" + exit 1 +} + +cleanup() { + trap - TERM QUIT INT EXIT + trap "true" CHLD # Ignore cleanup messages + echo + if [ -n "${proxy_pid}" ]; then + echo "Terminating WebSockets proxy (${proxy_pid})" + kill ${proxy_pid} + fi +} + +# Process Arguments + +# Arguments that only apply to chrooter itself +while [ "$*" ]; do + param=$1; shift; OPTARG=$1 + case $param in + --listen) PORT="${OPTARG}"; shift ;; + --vnc) VNC_DEST="${OPTARG}"; shift ;; + --cert) CERT="${OPTARG}"; shift ;; + --web) WEB="${OPTARG}"; shift ;; + -h|--help) usage ;; + -*) usage "Unknown chrooter option: ${param}" ;; + *) break ;; + esac +done + +# Sanity checks +which netstat >/dev/null 2>&1 \ + || die "Must have netstat installed" + +netstat -ltn | grep -qs "${PORT} .*LISTEN" \ + && die "Port ${PORT} in use. Try --listen PORT" + +trap "cleanup" TERM QUIT INT EXIT + +# Find vnc.html +if [ -n "${WEB}" ]; then + if [ ! -e "${WEB}/vnc.html" ]; then + die "Could not find ${WEB}/vnc.html" + fi +elif [ -e "$(pwd)/vnc.html" ]; then + WEB=$(pwd) +elif [ -e "${HERE}/../vnc.html" ]; then + WEB=${HERE}/../ +elif [ -e "${HERE}/vnc.html" ]; then + WEB=${HERE} +elif [ -e "${HERE}/../share/novnc/vnc.html" ]; then + WEB=${HERE}/../share/novnc/ +else + die "Could not find vnc.html" +fi + +# Find self.pem +if [ -n "${CERT}" ]; then + if [ ! -e "${CERT}" ]; then + die "Could not find ${CERT}" + fi +elif [ -e "$(pwd)/self.pem" ]; then + CERT="$(pwd)/self.pem" +elif [ -e "${HERE}/../self.pem" ]; then + CERT="${HERE}/../self.pem" +elif [ -e "${HERE}/self.pem" ]; then + CERT="${HERE}/self.pem" +else + echo "Warning: could not find self.pem" +fi + +echo "Starting webserver and WebSockets proxy on port ${PORT}" +${HERE}/websockify --web ${WEB} ${CERT:+--cert ${CERT}} ${PORT} ${VNC_DEST} & +proxy_pid="$!" +sleep 1 +if ! ps -p ${proxy_pid} >/dev/null; then + proxy_pid= + echo "Failed to start WebSockets proxy" + exit 1 +fi + +echo -e "\n\nNavigate to this URL:\n" +echo -e " http://$(hostname):${PORT}/vnc.html?host=$(hostname)&port=${PORT}\n" +echo -e "Press Ctrl-C to exit\n\n" + +wait ${proxy_pid} diff --git a/noVNC/utils/nova-novncproxy b/noVNC/utils/nova-novncproxy new file mode 100755 index 0000000..7e5afbd --- /dev/null +++ b/noVNC/utils/nova-novncproxy @@ -0,0 +1,152 @@ +#!/usr/bin/env python +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2012 Openstack, LLC. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +#!/usr/bin/env python + +''' +Websocket proxy that is compatible with Openstack Nova. +Leverages websockify by Joel Martin +''' + +import Cookie +from oslo.config import cfg +import socket +import sys + +import websockify + +from nova import config +from nova import context +from nova import utils +from nova.openstack.common import rpc + + +opts = [ + cfg.BoolOpt('record', + default=False, + help='Record sessions to FILE.[session_number]'), + cfg.BoolOpt('daemon', + default=False, + help='Become a daemon (background process)'), + cfg.BoolOpt('ssl_only', + default=False, + help='Disallow non-encrypted connections'), + cfg.BoolOpt('source_is_ipv6', + default=False, + help='Source is ipv6'), + cfg.StrOpt('cert', + default='self.pem', + help='SSL certificate file'), + cfg.StrOpt('key', + default=None, + help='SSL key file (if separate from cert)'), + cfg.StrOpt('web', + default='.', + help='Run webserver on same port. Serve files from DIR.'), + cfg.StrOpt('novncproxy_host', + default='0.0.0.0', + help='Host on which to listen for incoming requests'), + cfg.IntOpt('novncproxy_port', + default=6080, + help='Port on which to listen for incoming requests'), + ] +CONF = cfg.CONF +CONF.register_cli_opts(opts) + +# As of nova commit 0b11668e64450039dc071a4a123abd02206f865f we must +# manually register the rpc library +if hasattr(rpc, 'register_opts'): + rpc.register_opts(CONF) + + +class NovaWebSocketProxy(websockify.WebSocketProxy): + def __init__(self, *args, **kwargs): + websockify.WebSocketProxy.__init__(self, *args, **kwargs) + + def new_client(self): + """ + Called after a new WebSocket connection has been established. + """ + cookie = Cookie.SimpleCookie() + cookie.load(self.headers.getheader('cookie')) + token = cookie['token'].value + ctxt = context.get_admin_context() + connect_info = rpc.call(ctxt, 'consoleauth', + {'method': 'check_token', + 'args': {'token': token}}) + + if not connect_info: + raise Exception("Invalid Token") + + host = connect_info['host'] + port = int(connect_info['port']) + + # Connect to the target + self.msg("connecting to: %s:%s" % ( + host, port)) + tsock = self.socket(host, port, + connect=True) + + # Handshake as necessary + if connect_info.get('internal_access_path'): + tsock.send("CONNECT %s HTTP/1.1\r\n\r\n" % + connect_info['internal_access_path']) + while True: + data = tsock.recv(4096, socket.MSG_PEEK) + if data.find("\r\n\r\n") != -1: + if not data.split("\r\n")[0].find("200"): + raise Exception("Invalid Connection Info") + tsock.recv(len(data)) + break + + if self.verbose and not self.daemon: + print(self.traffic_legend) + + # Start proxying + try: + self.do_proxy(tsock) + except: + if tsock: + tsock.shutdown(socket.SHUT_RDWR) + tsock.close() + self.vmsg("%s:%s: Target closed" % (host, port)) + raise + + +if __name__ == '__main__': + if CONF.ssl_only and not os.path.exists(CONF.cert): + parser.error("SSL only and %s not found" % CONF.cert) + + # Setup flags + config.parse_args(sys.argv) + + # Create and start the NovaWebSockets proxy + server = NovaWebSocketProxy(listen_host=CONF.novncproxy_host, + listen_port=CONF.novncproxy_port, + source_is_ipv6=CONF.source_is_ipv6, + verbose=CONF.verbose, + cert=CONF.cert, + key=CONF.key, + ssl_only=CONF.ssl_only, + daemon=CONF.daemon, + record=CONF.record, + web=CONF.web, + target_host='ignore', + target_port='ignore', + wrap_mode='exit', + wrap_cmd=None) + server.start_server() diff --git a/noVNC/utils/parse.js b/noVNC/utils/parse.js new file mode 100644 index 0000000..02ac66c --- /dev/null +++ b/noVNC/utils/parse.js @@ -0,0 +1,97 @@ +// Utility to parse keysymdef.h to produce mappings from Unicode codepoints to keysyms +"use strict"; + +var fs = require('fs'); + +var show_help = process.argv.length === 2; +var use_keynames = false; +var filename; + +for (var i = 2; i < process.argv.length; ++i) { + switch (process.argv[i]) { + case "--help": + case "-h": + show_help = true; + break; + case "--debug-names": + case "-d": + use_keynames = true; + break; + case "--file": + case "-f": + default: + filename = process.argv[i]; + } +} + +if (!filename) { + show_help = true; + console.log("Error: No filename specified\n"); +} + +if (show_help) { + console.log("Parses a *nix keysymdef.h to generate Unicode code point mappings"); + console.log("Usage: node parse.js [options] filename:"); + console.log(" -h [ --help ] Produce this help message"); + console.log(" -d [ --debug-names ] Preserve keysym names for debugging (Increases file size by ~40KB)"); + console.log(" filename The keysymdef.h file to parse"); + return; +} + +// Set this to false to omit key names from the generated keysymdef.js +// This reduces the file size by around 40kb, but may hinder debugging + +var buf = fs.readFileSync(filename); +var str = buf.toString('utf8'); + +var re = /^\#define XK_([a-zA-Z_0-9]+)\s+0x([0-9a-fA-F]+)\s*(\/\*\s*(.*)\s*\*\/)?\s*$/m; + +var arr = str.split('\n'); + +var keysyms = {}; +var codepoints = {}; + +for (var i = 0; i < arr.length; ++i) { + var result = re.exec(arr[i]); + if (result){ + var keyname = result[1]; + var keysym = parseInt(result[2], 16); + var remainder = result[3]; + + keysyms[keysym] = keyname; + + var unicodeRes = /U\+([0-9a-fA-F]+)/.exec(remainder); + if (unicodeRes) { + var unicode = parseInt(unicodeRes[1], 16); + if (!codepoints[unicode]){ + codepoints[unicode] = keysym; + } + } + else { + console.log("no unicode codepoint found:", arr[i]); + } + } + else { + console.log("line is not a keysym:", arr[i]); + } +} + +var out = "// This file describes mappings from Unicode codepoints to the keysym values\n" + +"// (and optionally, key names) expected by the RFB protocol\n" + +"// How this file was generated:\n" + +"// " + process.argv.join(" ") + "\n" + +"var keysyms = (function(){\n" + +" \"use strict\";\n" + +" var keynames = {keysyms};\n" + +" var codepoints = {codepoints};\n" + +"\n" + +" function lookup(k) { return k ? {keysym: k, keyname: keynames ? keynames[k] : k} : undefined; }\n" + +" return {\n" + +" fromUnicode : function(u) { return lookup(codepoints[u]); },\n" + +" lookup : lookup\n" + +" };\n" + +"})();\n"; +out = out.replace('{keysyms}', use_keynames ? JSON.stringify(keysyms) : "null"); +out = out.replace('{codepoints}', JSON.stringify(codepoints)); + +fs.writeFileSync("keysymdef.js", out); diff --git a/noVNC/utils/rebind b/noVNC/utils/rebind new file mode 100755 index 0000000..2289aaa --- /dev/null +++ b/noVNC/utils/rebind @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +usage() { + echo "Usage: $(basename $0) OLD_PORT NEW_PORT COMMAND_LINE" + echo + echo "Launch COMMAND_LINE, but intercept system calls to bind" + echo "to OLD_PORT and instead bind them to localhost:NEW_PORT" + exit 2 +} + +# Parameter defaults +mydir=$(readlink -f $(dirname ${0})) + +export REBIND_PORT_OLD="${1}"; shift +export REBIND_PORT_NEW="${1}"; shift + +LD_PRELOAD=${mydir}/rebind.so "${@}" + diff --git a/noVNC/utils/rebind.c b/noVNC/utils/rebind.c new file mode 100644 index 0000000..69b9ff9 --- /dev/null +++ b/noVNC/utils/rebind.c @@ -0,0 +1,94 @@ +/* + * rebind: Intercept bind calls and bind to a different port + * Copyright 2010 Joel Martin + * Licensed under MPL-2.0 (see docs/LICENSE.MPL-2.0) + * + * Overload (LD_PRELOAD) bind system call. If REBIND_PORT_OLD and + * REBIND_PORT_NEW environment variables are set then bind on the new + * port (of localhost) instead of the old port. + * + * This allows a bridge/proxy (such as websockify) to run on the old port and + * translate traffic to/from the new port. + * + * Usage: + * LD_PRELOAD=./rebind.so \ + * REBIND_PORT_OLD=23 \ + * REBIND_PORT_NEW=2023 \ + * program + */ + +//#define DO_DEBUG 1 + +#include +#include + +#define __USE_GNU 1 // Pull in RTLD_NEXT +#include + +#include +#include + + +#if defined(DO_DEBUG) +#define DEBUG(...) \ + fprintf(stderr, "wswrapper: "); \ + fprintf(stderr, __VA_ARGS__); +#else +#define DEBUG(...) +#endif + + +int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen) +{ + static void * (*func)(); + int do_move = 0; + struct sockaddr_in * addr_in = (struct sockaddr_in *)addr; + struct sockaddr_in addr_tmp; + socklen_t addrlen_tmp; + char * PORT_OLD, * PORT_NEW, * end1, * end2; + int ret, oldport, newport, askport = htons(addr_in->sin_port); + uint32_t askaddr = htons(addr_in->sin_addr.s_addr); + if (!func) func = (void *(*)()) dlsym(RTLD_NEXT, "bind"); + + DEBUG(">> bind(%d, _, %d), askaddr %d, askport %d\n", + sockfd, addrlen, askaddr, askport); + + /* Determine if we should move this socket */ + if (addr_in->sin_family == AF_INET) { + // TODO: support IPv6 + PORT_OLD = getenv("REBIND_OLD_PORT"); + PORT_NEW = getenv("REBIND_NEW_PORT"); + if (PORT_OLD && (*PORT_OLD != '\0') && + PORT_NEW && (*PORT_NEW != '\0')) { + oldport = strtol(PORT_OLD, &end1, 10); + newport = strtol(PORT_NEW, &end2, 10); + if (oldport && (*end1 == '\0') && + newport && (*end2 == '\0') && + (oldport == askport)) { + do_move = 1; + } + } + } + + if (! do_move) { + /* Just pass everything right through to the real bind */ + ret = (int) func(sockfd, addr, addrlen); + DEBUG("<< bind(%d, _, %d) ret %d\n", sockfd, addrlen, ret); + return ret; + } + + DEBUG("binding fd %d on localhost:%d instead of 0x%x:%d\n", + sockfd, newport, ntohl(addr_in->sin_addr.s_addr), oldport); + + /* Use a temporary location for the new address information */ + addrlen_tmp = sizeof(addr_tmp); + memcpy(&addr_tmp, addr, addrlen_tmp); + + /* Bind to other port on the loopback instead */ + addr_tmp.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + addr_tmp.sin_port = htons(newport); + ret = (int) func(sockfd, &addr_tmp, addrlen_tmp); + + DEBUG("<< bind(%d, _, %d) ret %d\n", sockfd, addrlen, ret); + return ret; +} diff --git a/noVNC/utils/u2x11 b/noVNC/utils/u2x11 new file mode 100755 index 0000000..fd3e4ba --- /dev/null +++ b/noVNC/utils/u2x11 @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +# +# Convert "U+..." commented entries in /usr/include/X11/keysymdef.h +# into JavaScript for use by noVNC. Note this is likely to produce +# a few duplicate properties with clashing values, that will need +# resolving manually. +# +# Colin Dean +# + +regex="^#define[ \t]+XK_[A-Za-z0-9_]+[ \t]+0x([0-9a-fA-F]+)[ \t]+\/\*[ \t]+U\+([0-9a-fA-F]+)[ \t]+[^*]+.[ \t]+\*\/[ \t]*$" +echo "unicodeTable = {" +while read line; do + if echo "${line}" | egrep -qs "${regex}"; then + + x11=$(echo "${line}" | sed -r "s/${regex}/\1/") + vnc=$(echo "${line}" | sed -r "s/${regex}/\2/") + + if echo "${vnc}" | egrep -qs "^00[2-9A-F][0-9A-F]$"; then + : # skip ISO Latin-1 (U+0020 to U+00FF) as 1-to-1 mapping + else + # note 1-to-1 is possible (e.g. for Euro symbol, U+20AC) + echo " 0x${vnc} : 0x${x11}," + fi + fi +done < /usr/include/X11/keysymdef.h | uniq +echo "};" + diff --git a/noVNC/utils/web.py b/noVNC/utils/web.py new file mode 100755 index 0000000..23afca0 --- /dev/null +++ b/noVNC/utils/web.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python +''' +A super simple HTTP/HTTPS webserver for python. Automatically detect + +You can make a cert/key with openssl using: +openssl req -new -x509 -days 365 -nodes -out self.pem -keyout self.pem +as taken from http://docs.python.org/dev/library/ssl.html#certificates + +''' + +import traceback, sys +import socket +import ssl +#import http.server as server # python 3.X +import SimpleHTTPServer as server # python 2.X + +def do_request(connstream, from_addr): + x = object() + server.SimpleHTTPRequestHandler(connstream, from_addr, x) + connstream.close() + +def serve(): + bindsocket = socket.socket() + bindsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + #bindsocket.bind(('localhost', PORT)) + bindsocket.bind(('', PORT)) + bindsocket.listen(5) + + print("serving on port", PORT) + + while True: + try: + newsocket, from_addr = bindsocket.accept() + peek = newsocket.recv(1024, socket.MSG_PEEK) + if peek.startswith("\x16"): + connstream = ssl.wrap_socket( + newsocket, + server_side=True, + certfile='self.pem', + ssl_version=ssl.PROTOCOL_TLSv1) + else: + connstream = newsocket + + do_request(connstream, from_addr) + + except Exception: + traceback.print_exc() + +try: + PORT = int(sys.argv[1]) +except: + print "%s port" % sys.argv[0] + sys.exit(2) + +serve() diff --git a/noVNC/utils/websocket.py b/noVNC/utils/websocket.py new file mode 100644 index 0000000..8240fc3 --- /dev/null +++ b/noVNC/utils/websocket.py @@ -0,0 +1,887 @@ +#!/usr/bin/env python + +''' +Python WebSocket library with support for "wss://" encryption. +Copyright 2011 Joel Martin +Licensed under LGPL version 3 (see docs/LICENSE.LGPL-3) + +Supports following protocol versions: + - http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-07 + - http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-10 + - http://tools.ietf.org/html/rfc6455 + +You can make a cert/key with openssl using: +openssl req -new -x509 -days 365 -nodes -out self.pem -keyout self.pem +as taken from http://docs.python.org/dev/library/ssl.html#certificates + +''' + +import os, sys, time, errno, signal, socket, traceback, select +import array, struct +from base64 import b64encode, b64decode + +# Imports that vary by python version + +# python 3.0 differences +if sys.hexversion > 0x3000000: + b2s = lambda buf: buf.decode('latin_1') + s2b = lambda s: s.encode('latin_1') + s2a = lambda s: s +else: + b2s = lambda buf: buf # No-op + s2b = lambda s: s # No-op + s2a = lambda s: [ord(c) for c in s] +try: from io import StringIO +except: from cStringIO import StringIO +try: from http.server import SimpleHTTPRequestHandler +except: from SimpleHTTPServer import SimpleHTTPRequestHandler + +# python 2.6 differences +try: from hashlib import sha1 +except: from sha import sha as sha1 + +# python 2.5 differences +try: + from struct import pack, unpack_from +except: + from struct import pack + def unpack_from(fmt, buf, offset=0): + slice = buffer(buf, offset, struct.calcsize(fmt)) + return struct.unpack(fmt, slice) + +# Degraded functionality if these imports are missing +for mod, msg in [('numpy', 'HyBi protocol will be slower'), + ('ssl', 'TLS/SSL/wss is disabled'), + ('multiprocessing', 'Multi-Processing is disabled'), + ('resource', 'daemonizing is disabled')]: + try: + globals()[mod] = __import__(mod) + except ImportError: + globals()[mod] = None + print("WARNING: no '%s' module, %s" % (mod, msg)) +if multiprocessing and sys.platform == 'win32': + # make sockets pickle-able/inheritable + import multiprocessing.reduction + + +class WebSocketServer(object): + """ + WebSockets server class. + Must be sub-classed with new_client method definition. + """ + + buffer_size = 65536 + + server_handshake_hybi = """HTTP/1.1 101 Switching Protocols\r +Upgrade: websocket\r +Connection: Upgrade\r +Sec-WebSocket-Accept: %s\r +""" + + GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" + + policy_response = """\n""" + + # An exception before the WebSocket connection was established + class EClose(Exception): + pass + + # An exception while the WebSocket client was connected + class CClose(Exception): + pass + + def __init__(self, listen_host='', listen_port=None, source_is_ipv6=False, + verbose=False, cert='', key='', ssl_only=None, + daemon=False, record='', web='', + run_once=False, timeout=0, idle_timeout=0): + + # settings + self.verbose = verbose + self.listen_host = listen_host + self.listen_port = listen_port + self.prefer_ipv6 = source_is_ipv6 + self.ssl_only = ssl_only + self.daemon = daemon + self.run_once = run_once + self.timeout = timeout + self.idle_timeout = idle_timeout + + self.launch_time = time.time() + self.ws_connection = False + self.handler_id = 1 + + # Make paths settings absolute + self.cert = os.path.abspath(cert) + self.key = self.web = self.record = '' + if key: + self.key = os.path.abspath(key) + if web: + self.web = os.path.abspath(web) + if record: + self.record = os.path.abspath(record) + + if self.web: + os.chdir(self.web) + + # Sanity checks + if not ssl and self.ssl_only: + raise Exception("No 'ssl' module and SSL-only specified") + if self.daemon and not resource: + raise Exception("Module 'resource' required to daemonize") + + # Show configuration + print("WebSocket server settings:") + print(" - Listen on %s:%s" % ( + self.listen_host, self.listen_port)) + print(" - Flash security policy server") + if self.web: + print(" - Web server. Web root: %s" % self.web) + if ssl: + if os.path.exists(self.cert): + print(" - SSL/TLS support") + if self.ssl_only: + print(" - Deny non-SSL/TLS connections") + else: + print(" - No SSL/TLS support (no cert file)") + else: + print(" - No SSL/TLS support (no 'ssl' module)") + if self.daemon: + print(" - Backgrounding (daemon)") + if self.record: + print(" - Recording to '%s.*'" % self.record) + + # + # WebSocketServer static methods + # + + @staticmethod + def socket(host, port=None, connect=False, prefer_ipv6=False, unix_socket=None, use_ssl=False): + """ Resolve a host (and optional port) to an IPv4 or IPv6 + address. Create a socket. Bind to it if listen is set, + otherwise connect to it. Return the socket. + """ + flags = 0 + if host == '': + host = None + if connect and not (port or unix_socket): + raise Exception("Connect mode requires a port") + if use_ssl and not ssl: + raise Exception("SSL socket requested but Python SSL module not loaded."); + if not connect and use_ssl: + raise Exception("SSL only supported in connect mode (for now)") + if not connect: + flags = flags | socket.AI_PASSIVE + + if not unix_socket: + addrs = socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM, + socket.IPPROTO_TCP, flags) + if not addrs: + raise Exception("Could not resolve host '%s'" % host) + addrs.sort(key=lambda x: x[0]) + if prefer_ipv6: + addrs.reverse() + sock = socket.socket(addrs[0][0], addrs[0][1]) + if connect: + sock.connect(addrs[0][4]) + if use_ssl: + sock = ssl.wrap_socket(sock) + else: + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + sock.bind(addrs[0][4]) + sock.listen(100) + else: + sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + sock.connect(unix_socket) + + return sock + + @staticmethod + def daemonize(keepfd=None, chdir='/'): + os.umask(0) + if chdir: + os.chdir(chdir) + else: + os.chdir('/') + os.setgid(os.getgid()) # relinquish elevations + os.setuid(os.getuid()) # relinquish elevations + + # Double fork to daemonize + if os.fork() > 0: os._exit(0) # Parent exits + os.setsid() # Obtain new process group + if os.fork() > 0: os._exit(0) # Parent exits + + # Signal handling + def terminate(a,b): os._exit(0) + signal.signal(signal.SIGTERM, terminate) + signal.signal(signal.SIGINT, signal.SIG_IGN) + + # Close open files + maxfd = resource.getrlimit(resource.RLIMIT_NOFILE)[1] + if maxfd == resource.RLIM_INFINITY: maxfd = 256 + for fd in reversed(range(maxfd)): + try: + if fd != keepfd: + os.close(fd) + except OSError: + _, exc, _ = sys.exc_info() + if exc.errno != errno.EBADF: raise + + # Redirect I/O to /dev/null + os.dup2(os.open(os.devnull, os.O_RDWR), sys.stdin.fileno()) + os.dup2(os.open(os.devnull, os.O_RDWR), sys.stdout.fileno()) + os.dup2(os.open(os.devnull, os.O_RDWR), sys.stderr.fileno()) + + @staticmethod + def unmask(buf, hlen, plen): + pstart = hlen + 4 + pend = pstart + plen + if numpy: + b = c = s2b('') + if plen >= 4: + mask = numpy.frombuffer(buf, dtype=numpy.dtype('BB', b1, payload_len) + elif payload_len > 125 and payload_len < 65536: + header = pack('>BBH', b1, 126, payload_len) + elif payload_len >= 65536: + header = pack('>BBQ', b1, 127, payload_len) + + #print("Encoded: %s" % repr(header + buf)) + + return header + buf, len(header), 0 + + @staticmethod + def decode_hybi(buf, base64=False): + """ Decode HyBi style WebSocket packets. + Returns: + {'fin' : 0_or_1, + 'opcode' : number, + 'masked' : boolean, + 'hlen' : header_bytes_number, + 'length' : payload_bytes_number, + 'payload' : decoded_buffer, + 'left' : bytes_left_number, + 'close_code' : number, + 'close_reason' : string} + """ + + f = {'fin' : 0, + 'opcode' : 0, + 'masked' : False, + 'hlen' : 2, + 'length' : 0, + 'payload' : None, + 'left' : 0, + 'close_code' : 1000, + 'close_reason' : ''} + + blen = len(buf) + f['left'] = blen + + if blen < f['hlen']: + return f # Incomplete frame header + + b1, b2 = unpack_from(">BB", buf) + f['opcode'] = b1 & 0x0f + f['fin'] = (b1 & 0x80) >> 7 + f['masked'] = (b2 & 0x80) >> 7 + + f['length'] = b2 & 0x7f + + if f['length'] == 126: + f['hlen'] = 4 + if blen < f['hlen']: + return f # Incomplete frame header + (f['length'],) = unpack_from('>xxH', buf) + elif f['length'] == 127: + f['hlen'] = 10 + if blen < f['hlen']: + return f # Incomplete frame header + (f['length'],) = unpack_from('>xxQ', buf) + + full_len = f['hlen'] + f['masked'] * 4 + f['length'] + + if blen < full_len: # Incomplete frame + return f # Incomplete frame header + + # Number of bytes that are part of the next frame(s) + f['left'] = blen - full_len + + # Process 1 frame + if f['masked']: + # unmask payload + f['payload'] = WebSocketServer.unmask(buf, f['hlen'], + f['length']) + else: + print("Unmasked frame: %s" % repr(buf)) + f['payload'] = buf[(f['hlen'] + f['masked'] * 4):full_len] + + if base64 and f['opcode'] in [1, 2]: + try: + f['payload'] = b64decode(f['payload']) + except: + print("Exception while b64decoding buffer: %s" % + repr(buf)) + raise + + if f['opcode'] == 0x08: + if f['length'] >= 2: + f['close_code'] = unpack_from(">H", f['payload'])[0] + if f['length'] > 3: + f['close_reason'] = f['payload'][2:] + + return f + + + # + # WebSocketServer logging/output functions + # + + def traffic(self, token="."): + """ Show traffic flow in verbose mode. """ + if self.verbose and not self.daemon: + sys.stdout.write(token) + sys.stdout.flush() + + def msg(self, msg): + """ Output message with handler_id prefix. """ + if not self.daemon: + print("% 3d: %s" % (self.handler_id, msg)) + + def vmsg(self, msg): + """ Same as msg() but only if verbose. """ + if self.verbose: + self.msg(msg) + + # + # Main WebSocketServer methods + # + def send_frames(self, bufs=None): + """ Encode and send WebSocket frames. Any frames already + queued will be sent first. If buf is not set then only queued + frames will be sent. Returns the number of pending frames that + could not be fully sent. If returned pending frames is greater + than 0, then the caller should call again when the socket is + ready. """ + + tdelta = int(time.time()*1000) - self.start_time + + if bufs: + for buf in bufs: + if self.base64: + encbuf, lenhead, lentail = self.encode_hybi(buf, opcode=1, base64=True) + else: + encbuf, lenhead, lentail = self.encode_hybi(buf, opcode=2, base64=False) + + if self.rec: + self.rec.write("%s,\n" % + repr("{%s{" % tdelta + + encbuf[lenhead:len(encbuf)-lentail])) + + self.send_parts.append(encbuf) + + while self.send_parts: + # Send pending frames + buf = self.send_parts.pop(0) + sent = self.client.send(buf) + + if sent == len(buf): + self.traffic("<") + else: + self.traffic("<.") + self.send_parts.insert(0, buf[sent:]) + break + + return len(self.send_parts) + + def recv_frames(self): + """ Receive and decode WebSocket frames. + + Returns: + (bufs_list, closed_string) + """ + + closed = False + bufs = [] + tdelta = int(time.time()*1000) - self.start_time + + buf = self.client.recv(self.buffer_size) + if len(buf) == 0: + closed = {'code': 1000, 'reason': "Client closed abruptly"} + return bufs, closed + + if self.recv_part: + # Add partially received frames to current read buffer + buf = self.recv_part + buf + self.recv_part = None + + while buf: + frame = self.decode_hybi(buf, base64=self.base64) + #print("Received buf: %s, frame: %s" % (repr(buf), frame)) + + if frame['payload'] == None: + # Incomplete/partial frame + self.traffic("}.") + if frame['left'] > 0: + self.recv_part = buf[-frame['left']:] + break + else: + if frame['opcode'] == 0x8: # connection close + closed = {'code': frame['close_code'], + 'reason': frame['close_reason']} + break + + self.traffic("}") + + if self.rec: + start = frame['hlen'] + end = frame['hlen'] + frame['length'] + if frame['masked']: + recbuf = WebSocketServer.unmask(buf, frame['hlen'], + frame['length']) + else: + recbuf = buf[frame['hlen']:frame['hlen'] + + frame['length']] + self.rec.write("%s,\n" % + repr("}%s}" % tdelta + recbuf)) + + + bufs.append(frame['payload']) + + if frame['left']: + buf = buf[-frame['left']:] + else: + buf = '' + + return bufs, closed + + def send_close(self, code=1000, reason=''): + """ Send a WebSocket orderly close frame. """ + + msg = pack(">H%ds" % len(reason), code, reason) + buf, h, t = self.encode_hybi(msg, opcode=0x08, base64=False) + self.client.send(buf) + + def do_websocket_handshake(self, headers, path): + h = self.headers = headers + self.path = path + + prot = 'WebSocket-Protocol' + protocols = h.get('Sec-'+prot, h.get(prot, '')).split(',') + + ver = h.get('Sec-WebSocket-Version') + if ver: + # HyBi/IETF version of the protocol + + # HyBi-07 report version 7 + # HyBi-08 - HyBi-12 report version 8 + # HyBi-13 reports version 13 + if ver in ['7', '8', '13']: + self.version = "hybi-%02d" % int(ver) + else: + raise self.EClose('Unsupported protocol version %s' % ver) + + key = h['Sec-WebSocket-Key'] + + # Choose binary if client supports it + if 'binary' in protocols: + self.base64 = False + elif 'base64' in protocols: + self.base64 = True + else: + raise self.EClose("Client must support 'binary' or 'base64' protocol") + + # Generate the hash value for the accept header + accept = b64encode(sha1(s2b(key + self.GUID)).digest()) + + response = self.server_handshake_hybi % b2s(accept) + if self.base64: + response += "Sec-WebSocket-Protocol: base64\r\n" + else: + response += "Sec-WebSocket-Protocol: binary\r\n" + response += "\r\n" + + else: + raise self.EClose("Missing Sec-WebSocket-Version header. Hixie protocols not supported.") + + return response + + + def do_handshake(self, sock, address): + """ + do_handshake does the following: + - Peek at the first few bytes from the socket. + - If the connection is Flash policy request then answer it, + close the socket and return. + - If the connection is an HTTPS/SSL/TLS connection then SSL + wrap the socket. + - Read from the (possibly wrapped) socket. + - If we have received a HTTP GET request and the webserver + functionality is enabled, answer it, close the socket and + return. + - Assume we have a WebSockets connection, parse the client + handshake data. + - Send a WebSockets handshake server response. + - Return the socket for this WebSocket client. + """ + stype = "" + ready = select.select([sock], [], [], 3)[0] + + + if not ready: + raise self.EClose("ignoring socket not ready") + # Peek, but do not read the data so that we have a opportunity + # to SSL wrap the socket first + handshake = sock.recv(1024, socket.MSG_PEEK) + #self.msg("Handshake [%s]" % handshake) + + if handshake == "": + raise self.EClose("ignoring empty handshake") + + elif handshake.startswith(s2b("")): + # Answer Flash policy request + handshake = sock.recv(1024) + sock.send(s2b(self.policy_response)) + raise self.EClose("Sending flash policy response") + + elif handshake[0] in ("\x16", "\x80", 22, 128): + # SSL wrap the connection + if not ssl: + raise self.EClose("SSL connection but no 'ssl' module") + if not os.path.exists(self.cert): + raise self.EClose("SSL connection but '%s' not found" + % self.cert) + retsock = None + try: + retsock = ssl.wrap_socket( + sock, + server_side=True, + certfile=self.cert, + keyfile=self.key) + except ssl.SSLError: + _, x, _ = sys.exc_info() + if x.args[0] == ssl.SSL_ERROR_EOF: + if len(x.args) > 1: + raise self.EClose(x.args[1]) + else: + raise self.EClose("Got SSL_ERROR_EOF") + else: + raise + + self.scheme = "wss" + stype = "SSL/TLS (wss://)" + + elif self.ssl_only: + raise self.EClose("non-SSL connection received but disallowed") + + else: + retsock = sock + self.scheme = "ws" + stype = "Plain non-SSL (ws://)" + + wsh = WSRequestHandler(retsock, address, not self.web) + if wsh.last_code == 101: + # Continue on to handle WebSocket upgrade + pass + elif wsh.last_code == 405: + raise self.EClose("Normal web request received but disallowed") + elif wsh.last_code < 200 or wsh.last_code >= 300: + raise self.EClose(wsh.last_message) + elif self.verbose: + raise self.EClose(wsh.last_message) + else: + raise self.EClose("") + + response = self.do_websocket_handshake(wsh.headers, wsh.path) + + self.msg("%s: %s WebSocket connection" % (address[0], stype)) + self.msg("%s: Version %s, base64: '%s'" % (address[0], + self.version, self.base64)) + if self.path != '/': + self.msg("%s: Path: '%s'" % (address[0], self.path)) + + + # Send server WebSockets handshake response + #self.msg("sending response [%s]" % response) + retsock.send(s2b(response)) + + # Return the WebSockets socket which may be SSL wrapped + return retsock + + + # + # Events that can/should be overridden in sub-classes + # + def started(self): + """ Called after WebSockets startup """ + self.vmsg("WebSockets server started") + + def poll(self): + """ Run periodically while waiting for connections. """ + #self.vmsg("Running poll()") + pass + + def fallback_SIGCHLD(self, sig, stack): + # Reap zombies when using os.fork() (python 2.4) + self.vmsg("Got SIGCHLD, reaping zombies") + try: + result = os.waitpid(-1, os.WNOHANG) + while result[0]: + self.vmsg("Reaped child process %s" % result[0]) + result = os.waitpid(-1, os.WNOHANG) + except (OSError): + pass + + def do_SIGINT(self, sig, stack): + self.msg("Got SIGINT, exiting") + sys.exit(0) + + def top_new_client(self, startsock, address): + """ Do something with a WebSockets client connection. """ + # Initialize per client settings + self.send_parts = [] + self.recv_part = None + self.base64 = False + self.rec = None + self.start_time = int(time.time()*1000) + + # handler process + try: + try: + self.client = self.do_handshake(startsock, address) + + if self.record: + # Record raw frame data as JavaScript array + fname = "%s.%s" % (self.record, + self.handler_id) + self.msg("opening record file: %s" % fname) + self.rec = open(fname, 'w+') + encoding = "binary" + if self.base64: encoding = "base64" + self.rec.write("var VNC_frame_encoding = '%s';\n" + % encoding) + self.rec.write("var VNC_frame_data = [\n") + + self.ws_connection = True + self.new_client() + except self.CClose: + # Close the client + _, exc, _ = sys.exc_info() + if self.client: + self.send_close(exc.args[0], exc.args[1]) + except self.EClose: + _, exc, _ = sys.exc_info() + # Connection was not a WebSockets connection + if exc.args[0]: + self.msg("%s: %s" % (address[0], exc.args[0])) + except Exception: + _, exc, _ = sys.exc_info() + self.msg("handler exception: %s" % str(exc)) + if self.verbose: + self.msg(traceback.format_exc()) + finally: + if self.rec: + self.rec.write("'EOF'];\n") + self.rec.close() + + if self.client and self.client != startsock: + # Close the SSL wrapped socket + # Original socket closed by caller + self.client.close() + + def new_client(self): + """ Do something with a WebSockets client connection. """ + raise("WebSocketServer.new_client() must be overloaded") + + def start_server(self): + """ + Daemonize if requested. Listen for for connections. Run + do_handshake() method for each connection. If the connection + is a WebSockets client then call new_client() method (which must + be overridden) for each new client connection. + """ + lsock = self.socket(self.listen_host, self.listen_port, False, self.prefer_ipv6) + + if self.daemon: + self.daemonize(keepfd=lsock.fileno(), chdir=self.web) + + self.started() # Some things need to happen after daemonizing + + # Allow override of SIGINT + signal.signal(signal.SIGINT, self.do_SIGINT) + if not multiprocessing: + # os.fork() (python 2.4) child reaper + signal.signal(signal.SIGCHLD, self.fallback_SIGCHLD) + + last_active_time = self.launch_time + while True: + try: + try: + self.client = None + startsock = None + pid = err = 0 + child_count = 0 + + if multiprocessing and self.idle_timeout: + child_count = len(multiprocessing.active_children()) + + time_elapsed = time.time() - self.launch_time + if self.timeout and time_elapsed > self.timeout: + self.msg('listener exit due to --timeout %s' + % self.timeout) + break + + if self.idle_timeout: + idle_time = 0 + if child_count == 0: + idle_time = time.time() - last_active_time + else: + idle_time = 0 + last_active_time = time.time() + + if idle_time > self.idle_timeout and child_count == 0: + self.msg('listener exit due to --idle-timeout %s' + % self.idle_timeout) + break + + try: + self.poll() + + ready = select.select([lsock], [], [], 1)[0] + if lsock in ready: + startsock, address = lsock.accept() + else: + continue + except Exception: + _, exc, _ = sys.exc_info() + if hasattr(exc, 'errno'): + err = exc.errno + elif hasattr(exc, 'args'): + err = exc.args[0] + else: + err = exc[0] + if err == errno.EINTR: + self.vmsg("Ignoring interrupted syscall") + continue + else: + raise + + if self.run_once: + # Run in same process if run_once + self.top_new_client(startsock, address) + if self.ws_connection : + self.msg('%s: exiting due to --run-once' + % address[0]) + break + elif multiprocessing: + self.vmsg('%s: new handler Process' % address[0]) + p = multiprocessing.Process( + target=self.top_new_client, + args=(startsock, address)) + p.start() + # child will not return + else: + # python 2.4 + self.vmsg('%s: forking handler' % address[0]) + pid = os.fork() + if pid == 0: + # child handler process + self.top_new_client(startsock, address) + break # child process exits + + # parent process + self.handler_id += 1 + + except KeyboardInterrupt: + _, exc, _ = sys.exc_info() + print("In KeyboardInterrupt") + pass + except SystemExit: + _, exc, _ = sys.exc_info() + print("In SystemExit") + break + except Exception: + _, exc, _ = sys.exc_info() + self.msg("handler exception: %s" % str(exc)) + if self.verbose: + self.msg(traceback.format_exc()) + + finally: + if startsock: + startsock.close() + + # Close listen port + self.vmsg("Closing socket listening at %s:%s" + % (self.listen_host, self.listen_port)) + lsock.close() + + +# HTTP handler with WebSocket upgrade support +class WSRequestHandler(SimpleHTTPRequestHandler): + def __init__(self, req, addr, only_upgrade=False): + self.only_upgrade = only_upgrade # only allow upgrades + SimpleHTTPRequestHandler.__init__(self, req, addr, object()) + + def do_GET(self): + if (self.headers.get('upgrade') and + self.headers.get('upgrade').lower() == 'websocket'): + + # Just indicate that an WebSocket upgrade is needed + self.last_code = 101 + self.last_message = "101 Switching Protocols" + elif self.only_upgrade: + # Normal web request responses are disabled + self.last_code = 405 + self.last_message = "405 Method Not Allowed" + else: + SimpleHTTPRequestHandler.do_GET(self) + + def send_response(self, code, message=None): + # Save the status code + self.last_code = code + SimpleHTTPRequestHandler.send_response(self, code, message) + + def log_message(self, f, *args): + # Save instead of printing + self.last_message = f % args diff --git a/noVNC/utils/websocket.pyc b/noVNC/utils/websocket.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34cadaa902b576e98353d6e592f93c356eaf1275 GIT binary patch literal 25156 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 literal 0 HcmV?d00001 diff --git a/noVNC/utils/websockify b/noVNC/utils/websockify new file mode 100755 index 0000000..1154d92 --- /dev/null +++ b/noVNC/utils/websockify @@ -0,0 +1,393 @@ +#!/usr/bin/env python + +''' +A WebSocket to TCP socket proxy with support for "wss://" encryption. +Copyright 2011 Joel Martin +Licensed under LGPL version 3 (see docs/LICENSE.LGPL-3) + +You can make a cert/key with openssl using: +openssl req -new -x509 -days 365 -nodes -out self.pem -keyout self.pem +as taken from http://docs.python.org/dev/library/ssl.html#certificates + +''' + +import signal, socket, optparse, time, os, sys, subprocess +from select import select +import websocket +try: + from urllib.parse import parse_qs, urlparse +except: + from cgi import parse_qs + from urlparse import urlparse + +class WebSocketProxy(websocket.WebSocketServer): + """ + Proxy traffic to and from a WebSockets client to a normal TCP + socket server target. All traffic to/from the client is base64 + encoded/decoded to allow binary data to be sent/received to/from + the target. + """ + + buffer_size = 65536 + + traffic_legend = """ +Traffic Legend: + } - Client receive + }. - Client receive partial + { - Target receive + + > - Target send + >. - Target send partial + < - Client send + <. - Client send partial +""" + + def __init__(self, *args, **kwargs): + # Save off proxy specific options + self.target_host = kwargs.pop('target_host', None) + self.target_port = kwargs.pop('target_port', None) + self.wrap_cmd = kwargs.pop('wrap_cmd', None) + self.wrap_mode = kwargs.pop('wrap_mode', None) + self.unix_target = kwargs.pop('unix_target', None) + self.ssl_target = kwargs.pop('ssl_target', None) + self.target_cfg = kwargs.pop('target_cfg', None) + # Last 3 timestamps command was run + self.wrap_times = [0, 0, 0] + + if self.wrap_cmd: + rebinder_path = ['./', os.path.dirname(sys.argv[0])] + self.rebinder = None + + for rdir in rebinder_path: + rpath = os.path.join(rdir, "rebind.so") + if os.path.exists(rpath): + self.rebinder = rpath + break + + if not self.rebinder: + raise Exception("rebind.so not found, perhaps you need to run make") + self.rebinder = os.path.abspath(self.rebinder) + + self.target_host = "127.0.0.1" # Loopback + # Find a free high port + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.bind(('', 0)) + self.target_port = sock.getsockname()[1] + sock.close() + + os.environ.update({ + "LD_PRELOAD": self.rebinder, + "REBIND_OLD_PORT": str(kwargs['listen_port']), + "REBIND_NEW_PORT": str(self.target_port)}) + + if self.target_cfg: + self.target_cfg = os.path.abspath(self.target_cfg) + + websocket.WebSocketServer.__init__(self, *args, **kwargs) + + def run_wrap_cmd(self): + print("Starting '%s'" % " ".join(self.wrap_cmd)) + self.wrap_times.append(time.time()) + self.wrap_times.pop(0) + self.cmd = subprocess.Popen( + self.wrap_cmd, env=os.environ, preexec_fn=_subprocess_setup) + self.spawn_message = True + + def started(self): + """ + Called after Websockets server startup (i.e. after daemonize) + """ + # Need to call wrapped command after daemonization so we can + # know when the wrapped command exits + if self.wrap_cmd: + dst_string = "'%s' (port %s)" % (" ".join(self.wrap_cmd), self.target_port) + elif self.unix_target: + dst_string = self.unix_target + else: + dst_string = "%s:%s" % (self.target_host, self.target_port) + + if self.target_cfg: + msg = " - proxying from %s:%s to targets in %s" % ( + self.listen_host, self.listen_port, self.target_cfg) + else: + msg = " - proxying from %s:%s to %s" % ( + self.listen_host, self.listen_port, dst_string) + + if self.ssl_target: + msg += " (using SSL)" + + print(msg + "\n") + + if self.wrap_cmd: + self.run_wrap_cmd() + + def poll(self): + # If we are wrapping a command, check it's status + + if self.wrap_cmd and self.cmd: + ret = self.cmd.poll() + if ret != None: + self.vmsg("Wrapped command exited (or daemon). Returned %s" % ret) + self.cmd = None + + if self.wrap_cmd and self.cmd == None: + # Response to wrapped command being gone + if self.wrap_mode == "ignore": + pass + elif self.wrap_mode == "exit": + sys.exit(ret) + elif self.wrap_mode == "respawn": + now = time.time() + avg = sum(self.wrap_times)/len(self.wrap_times) + if (now - avg) < 10: + # 3 times in the last 10 seconds + if self.spawn_message: + print("Command respawning too fast") + self.spawn_message = False + else: + self.run_wrap_cmd() + + # + # Routines above this point are run in the master listener + # process. + # + + # + # Routines below this point are connection handler routines and + # will be run in a separate forked process for each connection. + # + + def new_client(self): + """ + Called after a new WebSocket connection has been established. + """ + # Checks if we receive a token, and look + # for a valid target for it then + if self.target_cfg: + (self.target_host, self.target_port) = self.get_target(self.target_cfg, self.path) + + # Connect to the target + if self.wrap_cmd: + msg = "connecting to command: '%s' (port %s)" % (" ".join(self.wrap_cmd), self.target_port) + elif self.unix_target: + msg = "connecting to unix socket: %s" % self.unix_target + else: + msg = "connecting to: %s:%s" % ( + self.target_host, self.target_port) + + if self.ssl_target: + msg += " (using SSL)" + self.msg(msg) + + tsock = self.socket(self.target_host, self.target_port, + connect=True, use_ssl=self.ssl_target, unix_socket=self.unix_target) + + if self.verbose and not self.daemon: + print(self.traffic_legend) + + # Start proxying + try: + self.do_proxy(tsock) + except: + if tsock: + tsock.shutdown(socket.SHUT_RDWR) + tsock.close() + self.vmsg("%s:%s: Closed target" %( + self.target_host, self.target_port)) + raise + + def get_target(self, target_cfg, path): + """ + Parses the path, extracts a token, and looks for a valid + target for that token in the configuration file(s). Sets + target_host and target_port if successful + """ + # The files in targets contain the lines + # in the form of token: host:port + + # Extract the token parameter from url + args = parse_qs(urlparse(path)[4]) # 4 is the query from url + + if not args.has_key('token') or not len(args['token']): + raise self.EClose("Token not present") + + token = args['token'][0].rstrip('\n') + + # target_cfg can be a single config file or directory of + # config files + if os.path.isdir(target_cfg): + cfg_files = [os.path.join(target_cfg, f) + for f in os.listdir(target_cfg)] + else: + cfg_files = [target_cfg] + + targets = {} + for f in cfg_files: + for line in [l.strip() for l in file(f).readlines()]: + if line and not line.startswith('#'): + ttoken, target = line.split(': ') + targets[ttoken] = target.strip() + + self.vmsg("Target config: %s" % repr(targets)) + + if targets.has_key(token): + return targets[token].split(':') + else: + raise self.EClose("Token '%s' not found" % token) + + def do_proxy(self, target): + """ + Proxy client WebSocket to normal target socket. + """ + cqueue = [] + c_pend = 0 + tqueue = [] + rlist = [self.client, target] + + while True: + wlist = [] + + if tqueue: wlist.append(target) + if cqueue or c_pend: wlist.append(self.client) + ins, outs, excepts = select(rlist, wlist, [], 1) + if excepts: raise Exception("Socket exception") + + if self.client in outs: + # Send queued target data to the client + c_pend = self.send_frames(cqueue) + + cqueue = [] + + if self.client in ins: + # Receive client data, decode it, and queue for target + bufs, closed = self.recv_frames() + tqueue.extend(bufs) + + if closed: + # TODO: What about blocking on client socket? + self.vmsg("%s:%s: Client closed connection" %( + self.target_host, self.target_port)) + raise self.CClose(closed['code'], closed['reason']) + + + if target in outs: + # Send queued client data to the target + dat = tqueue.pop(0) + sent = target.send(dat) + if sent == len(dat): + self.traffic(">") + else: + # requeue the remaining data + tqueue.insert(0, dat[sent:]) + self.traffic(".>") + + + if target in ins: + # Receive target data, encode it and queue for client + buf = target.recv(self.buffer_size) + if len(buf) == 0: + self.vmsg("%s:%s: Target closed connection" %( + self.target_host, self.target_port)) + raise self.CClose(1000, "Target closed") + + cqueue.append(buf) + self.traffic("{") + + + +def _subprocess_setup(): + # Python installs a SIGPIPE handler by default. This is usually not what + # non-Python successfulbprocesses expect. + signal.signal(signal.SIGPIPE, signal.SIG_DFL) + + +def websockify_init(): + usage = "\n %prog [options]" + usage += " [source_addr:]source_port [target_addr:target_port]" + usage += "\n %prog [options]" + usage += " [source_addr:]source_port -- WRAP_COMMAND_LINE" + parser = optparse.OptionParser(usage=usage) + parser.add_option("--verbose", "-v", action="store_true", + help="verbose messages and per frame traffic") + parser.add_option("--record", + help="record sessions to FILE.[session_number]", metavar="FILE") + parser.add_option("--daemon", "-D", + dest="daemon", action="store_true", + help="become a daemon (background process)") + parser.add_option("--run-once", action="store_true", + help="handle a single WebSocket connection and exit") + parser.add_option("--timeout", type=int, default=0, + help="after TIMEOUT seconds exit when not connected") + parser.add_option("--idle-timeout", type=int, default=0, + help="server exits after TIMEOUT seconds if there are no " + "active connections") + parser.add_option("--cert", default="self.pem", + help="SSL certificate file") + parser.add_option("--key", default=None, + help="SSL key file (if separate from cert)") + parser.add_option("--ssl-only", action="store_true", + help="disallow non-encrypted client connections") + parser.add_option("--ssl-target", action="store_true", + help="connect to SSL target as SSL client") + parser.add_option("--unix-target", + help="connect to unix socket target", metavar="FILE") + parser.add_option("--web", default=None, metavar="DIR", + help="run webserver on same port. Serve files from DIR.") + parser.add_option("--wrap-mode", default="exit", metavar="MODE", + choices=["exit", "ignore", "respawn"], + help="action to take when the wrapped program exits " + "or daemonizes: exit (default), ignore, respawn") + parser.add_option("--prefer-ipv6", "-6", + action="store_true", dest="source_is_ipv6", + help="prefer IPv6 when resolving source_addr") + parser.add_option("--target-config", metavar="FILE", + dest="target_cfg", + help="Configuration file containing valid targets " + "in the form 'token: host:port' or, alternatively, a " + "directory containing configuration files of this form") + (opts, args) = parser.parse_args() + + # Sanity checks + if len(args) < 2 and not (opts.target_cfg or opts.unix_target): + parser.error("Too few arguments") + if sys.argv.count('--'): + opts.wrap_cmd = args[1:] + else: + opts.wrap_cmd = None + if len(args) > 2: + parser.error("Too many arguments") + + if not websocket.ssl and opts.ssl_target: + parser.error("SSL target requested and Python SSL module not loaded."); + + if opts.ssl_only and not os.path.exists(opts.cert): + parser.error("SSL only and %s not found" % opts.cert) + + # Parse host:port and convert ports to numbers + if args[0].count(':') > 0: + opts.listen_host, opts.listen_port = args[0].rsplit(':', 1) + opts.listen_host = opts.listen_host.strip('[]') + else: + opts.listen_host, opts.listen_port = '', args[0] + + try: opts.listen_port = int(opts.listen_port) + except: parser.error("Error parsing listen port") + + if opts.wrap_cmd or opts.unix_target or opts.target_cfg: + opts.target_host = None + opts.target_port = None + else: + if args[1].count(':') > 0: + opts.target_host, opts.target_port = args[1].rsplit(':', 1) + opts.target_host = opts.target_host.strip('[]') + else: + parser.error("Error parsing target") + try: opts.target_port = int(opts.target_port) + except: parser.error("Error parsing target port") + + # Create and start the WebSockets proxy + server = WebSocketProxy(**opts.__dict__) + server.start_server() + +if __name__ == '__main__': + websockify_init() diff --git a/noVNC/utils/websockify.py b/noVNC/utils/websockify.py new file mode 120000 index 0000000..05b5af4 --- /dev/null +++ b/noVNC/utils/websockify.py @@ -0,0 +1 @@ +websockify \ No newline at end of file diff --git a/noVNC/utils/wsproxy.py b/noVNC/utils/wsproxy.py new file mode 120000 index 0000000..05b5af4 --- /dev/null +++ b/noVNC/utils/wsproxy.py @@ -0,0 +1 @@ +websockify \ No newline at end of file diff --git a/noVNC/vnc.html b/noVNC/vnc.html new file mode 100644 index 0000000..2aa9fe3 --- /dev/null +++ b/noVNC/vnc.html @@ -0,0 +1,214 @@ + + + + + + noVNC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +

    no
    VNC

    + + +
    + + Canvas not supported. + +
    + +
    + + + + + diff --git a/noVNC/vnc_auto.html b/noVNC/vnc_auto.html new file mode 100644 index 0000000..53b8220 --- /dev/null +++ b/noVNC/vnc_auto.html @@ -0,0 +1,209 @@ + + + + + + noVNC + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + Loading +
    + + + + + + +
    +
    + + Canvas not supported. + +
    + + + + + diff --git a/screenshots/lxde.png b/screenshots/lxde.png new file mode 100644 index 0000000000000000000000000000000000000000..a59cd8d561601399e1f6bb5c6b8aed4c0682c520 GIT binary patch literal 241258 zcmYg%Wk4KFv-RK(i@ODPg1ftGa7l1?*8ssSKyY`L;O-EDySux)eLU~;-h03OF*`Fo zy<5|Bs{2%(nlL2=NhEkYcmM#9q@~1E002?}03a-3!9UIr^rg6bd_g#gNUOoZ!Y*$r zZhRbqoW(VrRqafj-M%`S0IKFL&dw%|MgbFW06+priwUc_FP&t#d1DMN4rZlP%qteH z(SgHFdYz9(({X&RtRie|;#@&nu{t3?iHQ555v^kZj zV#M|3tkwqYzL42#JbAV4uEi*4Sb$Km-PvZPZES}n$YvtZkI7|X>oUl*G_sw!=vq<8@93vSTkx)I6|24sZWpvcGLp|t5Vdp?hU0r_OB_p^WdXO}88!}VSqn54! z1561%0Zn~2tP))Wwg87T^79^-@CNV|62Mq;M)+t3muW@mH;Ue7mVkW~{KBh-P*N&U zLoeN=n2sa3UauM$o~yh@GEBg8NcUg!^XxXfX4&%+4%BAVD2jDse=+k+{xoguOGT<* z6ABxyZU223(L<}1=$>gu3<=6juq-VM60xwb2n&Pz`BNDc)wO7Pc40wDOG{lviiFtM*k8XaVnVBvNA;`bcP$xdX-kWXW5rO#zHf5@5AV6I)Nt-T z9odDdzzF_mV)D$&h;ggi`dnW4ghHc|e1GE3w9B`bKG5j))dQSeLz=i=C@~)`=d4QS zPy3RG&C_(pyyIqMzoX`wxoW55?zlu5KnhJ^dD+gPK$wBj`e=!Jb-Oof~;P`7;>@M=&V&m>dT&G#7)II4L1vVq&7n zVtOwdEl&LBcJuV{=#PL(Q*qI6V)@EKfY|l(uk2ilAaFx{3^~(4jOe&hU%Lt788~3i zW6_*VdJ~Qs?dHiRyihd=s@wYW9|BPS{KlL@skUf-lxj}W9|tz zX$tctNwc@;@Z5OLoUNjOZd03$7BUBSAP>oqX+2!u{LUrnMwDsm&p}wgpLz|t5&G0o zs-*HE5KMg9Sq6-GFf7iPCA|F$C;`$3i3rJ`m3xG;Qty=A0|K(T8_hyMo?C>iD)nXA z>|B6z>mfw(?e_R-C(W+Io9kS^e!JDic4D>(VX4EjN&ir>G^8w-EZurkeqC7-?dI;S6 ziD0M2RpD1x%t83Lx$Ty;!)dV<3M1IbUh9-vK)iNW6h4`h;id8tkPkEaK*LGTVg7Lv+-umrD~q-GIQS!&(i)f&jABV`uKlRPGo zI1KCLJ)T+Px-D#x3(k@`RVsC#jD22jXN?Jb+Ko7So-+CA0hB`V&p8=*T(@b$zFds> zR1t*fUR=>#=UFUjjPw7l6JbFBUHyPweSai;?aF#TsCX}C!}CD93d$YSwO?zygka4> z!YQt5Fh573OQILV0R7O1#gIwx7dYu2w;O^iesZ2fUw0>Gjq$f6@_X5>dfg;|;nEQB zc&2hWWmB^2i!arAMp489o?>KJy;aw9PTD)DPmRMkw*rz3QixX%CHNnuwOA3)ynFhCUc9dMk3IRC-8i)afy=+hAx-KVQj9yftMyf|~$dx?Y4QpSZKRzk-e3^1Qiw z%Xartgv}rYu9U$(y4Td#jlJ@Vp8qMt?-y*Ko%=&{7#5IC!UZkYe*0NRY#rrN_<_5Sc6|ZcKDYn10zGwfs0*mxqj=VqLynUq@E-B zK}-Tp0VzeEp#w3**a*Oy9$m~2?H^b&-0x?+RzyAyWu4dMP|Ez&_XGQOX=t-|=q&xF z@;I&U*Gwo%H5yt}cnws+NL5t2_J>`Vb_Ar9U>N;udvV;z0HBjAI$;SkF(L#2<_GyS z0`w`OR_pEtndWpl^}O!1kHVt*S(1~|O;?cJ<}82Ole2QZXRFi~vSap>T!eFiV1Jll zfH~xj+Jcn0##1F|deV*Ak|~hC6Xj>%Cx7m-?9szky7tQOC9F1&VTKKbOyeiQtnS`n zuHh#6?*zhEGQE8vV4ljuG=?GiS~?5`xV$Ne3XMjw{ou#odNutn%Pi~Jg>Kd`9>G~< zi|9a5b)^06TLAsAuOA7YraWv8TN^G+&zBjHNNFi9;y_Se(9;snPjnacn1~40G&x^C z0GO*-&bG+F4jxTq7ge9NFK%h!$;>Rpmy#wiOnd&5fq>5Q0l+~5WhVTTw6W857q0BX{M?D{aI*n%Iobx9!lZ; zv^HiWhS+zAd@!0_fC$55i|}5~sSc+M!2pte84(~sY`xy4a07qv)$~5+0Dx+RrtKdk z%3p+?h*qml?1<0ohi#U2*wRxyBBvOA&pH-sObqxhR~j+3XSk`qnGS$+LR z%hUU~(t?1Q!Yu{^pNqEv9_2mIfp68q`O0xsGA~PS@N8i&amU+@ffb#5d^Uk@D=(LM zz|65y_GO)4qdy{K(nMT`VA<9i((6inhTOY zEG0=Vrqy!ueG<}#3DbNZZTF*YI{3@o>%qBJd%Sve*NAu5gw6_1qIM&sOFe7stC%DpHUb>4c%xCwfxs(0Z{ohe^##Y<2P+yBlN@NnHn!OZB z0h&2_?)_Ew-L}mVQvyrA28+c`!3Aw5X(0t$!^RH3bWP}VHK7gjz7@%JtysjUGHfPo zN8S2JgPXgGz#lEU_0@-R;MDCO_1G&S4mUi;|OWD}>kv&J__v%Ve3z z8bSdfG#%|SC?Y|Epal|p?rdpY~O<}xoBje2&Iu|^Y0^qE#3{D9L`s;?1KUhfO`jm(h}T5dzz zPuxpB01iqxf$&iEZC_u_<$ZZDtT?CK>aEE=m`sLEZJr9vdQe=w5OUm>*Osknf%FI-kV;`h3)?vsKs_3@geE(edjK zMwMN;6$d^P7!+QF>nu1ELUEEvl*$?!DTM#oEVt8@$9|#DyKfEiP8;_m&<*^g)0860>H#QW$}<}#>BRr8eCj1O6$dxhZ?ud);oJ@m z`6Pn!>Y-5`0S&G4URkAPGwOEk&9@i!qlDG2o%y{a&Z!cgUg-8JNq}zG7}s-A>c3Ht zFGmT)>b)X}B=>lT<&%IQ1tf6w?IdC>?W$+~c)w`zU3JQPpF19!l=G4c%pb%*WK7Z$ z4aybcOq0ur1t&C%>XDt)_M1c%X{k(!l#qc1&lclMk;_pkW{@HQnIp_jVa~7v6E3Uf zY$_svXMu|dOs6*5RL*)6@~T{R&_(o3LVltRN@8*lHCXyW>+N}#qWeqSjm7^4F|+!}656~`^s!xcND({c1_OhwTXch5?X`_@Yb zkH6@2!a;}Z?)1x^smCyQ9=rE7EAqM71Y7j&U^wr%cX2$1<0AWajd2n`UJvXwc|_>9 zwHRF4F%s3i%znfQKAi;)e@~>A|7hW6b+{m!jN)tq{^2fGrLoqwsys@!tHCgG3qVP?2{X93p+eAptJJz1^y(1c7Pv2! z#A?^e{wBR+jeeet38(Zp1ffXJFl%Hg@Njgi)$7OFlh`>)<7{b|9FhE_=B5E}+2LVx zm@GIt&gD1BD#jvoJ2l@yyDf(PjV0tixr_lO#iN_L-!Nn{B|l5QPJ#n{>g(&d`YfIk z&uRDi+`bn=Q~Awl+CNa^!tgTNNfW>WF0NRECK4Hz6{5Xf9zK5^j~hXip#gF*Nb^f+ z>$HE`4(luvZ?gITLUCME$1duj*hp*(wnfVB5Fid5yw0ZU7K&U3mm3O{H5O8jF_$Fk zmiH_ZiL~Ak2x`nh%ad0Xs8AeEx2LPT<>mV%UgR;=T$tPB=Ibf2?33kR;%e1E!G!#a zq=5TL#YR1L^k|g)a5Nk=2=L!R*8B+GJOnWoZmaHHTZTa9$G+3(!#T0W9C+NT=#~zu z?6hghy<-&=^Co7FpS6%}yCUu=H1}I%DIo1MlXp zbQfE8cWbNUIAT&}&tF-1%p#%uiJnZY0=v?dCClb2eNRVy{aT!^ijQr7@=?*%B)U$^ zw;s@33&FC8;eZL*Fb==_K69f)5!M-Qf{RiH{66pGHvR)vEp3WkD5403%7C^Rtmk!} zPMvKcoB6!2@Z;Q7Z(iCIF2I-jJiOI5GtGqivdkO}^%h-5`F(~o}m&4^a zwUtzfPcGE&Yd3cyj0QwLytWd*c2LAmc0OLOf6{i_tGkKfb&G)mSAbO|L#9dr8;=j%_29oB7I0HZ*X|~N6M!ilV%tyFyC|taLGdlUB^V|-H+iVJz zWeF0raJ!2fL;a_2`-yu;@FFH@9$A-<->5q8l(V9w4Xz9Pb1(Fgpw1~4B7uZZXyu_M z#^)owJ-EaQG$4pic>Jx3lOsAKp3MT%zvVolVm4D59`Nrr72?Mf)9^_g@_TrNWu^97 z^SzCbF^=mhyOTKtv6CZqY>qW+t z%sGG3@Xu}|=mdXIbISmwgUL7Tjb@*{13sD=zq2OnM7w6zWxg(20FV&*snJaU1K=1H zO`FstQ&Zp=b*{%a3`1umT4a3z^$^9tI1vCnIGmiV3|Qy|7)FRfaHKff9N!^@*yX8$ zNP^n*-4@1iu`&)?NV!MVyz=X`DE=hye^WyQsFB8EF)*#b0fu~)@SD9Wc&11W2TCoP zH4QkeuxRCJmd+PRi>V!DSD<)7hoDbWrT$M&?>8XZc~}5@FpUP3JFGVt1DeIuD{3S2 zdNJWNV3h)3PhQ3wf|b5_*oc*pa*8@fLIEOCyHPSlr-Xz_Ml`~t_qn(w0EnJ{syHJj z-l8u6pHl2g`Rm0pxcbpl>1vo56f2|q<&*5v*0xD2ce$~rwXFZ_UkDRsHq|j+w}jX6 zwAAhW(Ldlo#fxG47#R^lo7sKiW5*l19E6`610b~hbdGEhK%P#1&IK0j^LF(&M{$Ik z)TR1*5UC)^AOjv(W7R?Qpts8P7q5CZR#pbOYNwMTdZIRl(|8IMb(^pOQV=zb!Sn1T z_q-|4be(kSfIdVF4#bwT6gg|e@?;$Rbh2$_Q3TEt-Sn3yvcW9pxaeI$=saM6sB?aP z5)^9PvnQXSd?YGZw)Lyox~(;alccTyo%osBJ7FpKFmx*c5#~fIx*CA-RiTPo8!9la z+q!(zpyl_7qJN{rVi@NivI!oqvqPDZ7QVYDoq^Qs!;Kj8jg54=GlBg-Tf0#b5QCXT z|II--s1#8lSOS>uP0m7taF-`t7*uw3w|)NN~;O6 z?ohC6zV!(uI~H7LJ;_i*IWFYJB%YSFPcH76Rb^%9Tpg;^k*Ec+S)F;RiEQ!|LBXPz zZ4=KXtQmYqmVemJt|Y5uq0rz<1L#Qs{}vg(U0Dg{v|>8= z!v34khu-A<1+#GFBL#8WlQ31or z_S3xjPA$GwfvZGpfevonK&AE8URpw>AzwDQDjq9sOEPK zdv3;cR^ir~OUMdtL}BN_06+^ssgH0#C zC9r>`q5qD<_;zf>%F5X4ur^kt(G)vk>iRFoe!0q5XdFvbfKt}n-y5qbm4-!UNHCn} zHo#oV%4@}AaUm2FdBMZ#)6;M19!?nr2QJzcW_BVY!{fxhg94bhoRLX`l-y~MXTucW z`f)h9^%#q$&DkK1Kr+*Z6FH(>$VQO>2%rc;6M6X#Nc`Eq=j33+lat7eXN~6p_|63z z8fTUS*?UO9kk|-Tn_Y)GHIlC4PS$Q-$n0ll_Z9xS_6=pTVeR>~?qpe|A+el1F0JlqJZWg#cM;Q z92C6T`qykMl6JYK6VAa~V|d5Y>U%|qT^HQbq@TcJ`SoAAeMD&vqxNRD_hrR(9p&yJ z@1~+?@nY@U+wa$v<6FBE4{-Bkru)T6w%K zL>><3Gy>4fsd?*;V-+`qkHz2MawKXIfoxh@D1~gOEdE!V?f_~8scAKFm<_SoK2n9_ zQj%R*hrOWW3rauhhI%<}hlaa&9vt>^@6+DCG{)rELXH-7WVeUXM8B(*&gS)3Q)5pN zPd`9uMZF(pIKY2-&T?uDQ$dkELxM&r98!AmdTx9C%d2a5Bxwq2fPYwHLsRetpSt?Y zqllYR!CxAwW`rsN3Q@y-N!bWzc!Ty0Lj^;9d$P^%c(O_?Z~>q*w$hwf1u0WgZFkC|Q^X1MqJVF5 z&f02fe=ggorEv1>sYNU#BzSs+;4BcJfFO_z*jGplLP1{w;45=Sf_Mg*vFbB%o zKV&4Oc(CR%8 zs4or*VCVnL+G05C$(KwDP?_}=Fu%CdmP5ho#Ueepagw!anoWuX45U}uq@fm0@AT0835?6Y@ zNuQ2b2{5?a{t4Suf3*HGNE$<}hR}+%j+t1h?CCphaxrB!b+XOF&q1FDoqqS-yLNmx z*RLvth#UDGsYsh7ISGVO4t3?&!i$9Ey7N?WLH4DM>Q?JzDCr?U*MY!>$cJ?Yt8i|V zsI!k4(1^hH+=oa)2|2av)qaqtP(-$rdz|fXOshP~Sna?XDJPN>fllYHhoEM_!xalc zQ49!6p)j%}P^psT<@W!}S)fqiOU$=|K7VzXf(W24E&cQ(fKzjoj2tRdp||(#D{4Tq zUieM)a%m{EbX>Me7!s+PGKSvtM~Wv>VtZ)+=;8J4=m;;mH;%q>k%%NH7(;wsT0|th z+c29j_y$!(YW_AnTt+061h%EpjYYfbKkC_k#KF>1M;aPwo9DMy(Rml?1hx^o8~9z) zSP(lY?bi#Cw-lz}ZL+}qGS?z?ctzm?00tEV8g%e4t{p0&CKbYPN(KkzKEJ*V3=|Fw zNGQjONy86g25F0YjfTjUmsgOV2EYcAK_m%~zp{r9OG`?2-4!-GZd4dK@l10tE#K3!%f2F;E+Xf3xgnqxjbAc_(DW!lte^QOUqIfZZ2dv zke$-IBHH}z-M^~C@Xj#g6ceei%g@4+CZGi|45+wp zMa;4jMC|#b`A!6O%sATeP&Z=kI>-Z|pXk4a!EbVBC5rO&SgkKLT&5F*gA~xXr9s-K z3SdgP=t`oNR`j9rNB?VfBqR5annQ&TB^a*ci0RX@+}{5+W#%KRBK=oTMkKV@5C5N9 z0O)NEYL^8T=6_xG3a!_t!M=eSM#ycA=`Vi5N-fv3oM47Kr=2iC zzGDe`n38lT`{z2h-RZpR;c_D{xCLYH8FM9N72M7ngX!M`KN0-IsimR(_ZJOBVI4Tw zi3FO6{qI%+jrCv${A6`bzZYcr=sk(p(l=g@xLud8nxb1#lZ-~n^g5vfFoM!#KfYkdR&_e(x zsK|Lk-iGU$nXNJ92;C2M7G?ZO>gq1Tr<^WNmr)w)Pc)8Y&;eHGKCyG^C^FG^oSaE# ztMz+l;;LDGsY$z8pSWc#MmLG0E4<4(%*{kyey{?xV43@rx{u7jLwbFHH7e48LF|mO zdVNWbKt6RGy`;pTJ%QWZQ0wYhC@f5?`oGVl4i%Gd+qG2-JK*xzyo_Inx*(xtRc4v# zOPQGY`nWr_?ft#miWMyMQ$Zg<3TqxNT}&;|v9-r*+J2R5Tz_ZdSTEV|-gI-=5{M5v zh!QY|1pq_H&ota|BqvWdhpBM^DUIzSY?aflraiA8Yme_YnUL3 zzs8UK2MjluADOwPCLBOTRdx3a#!5C7ywTV7!M@@=0d=o0Rlk#sYV<2t>pcGnom0hA zO+)b2&`uVye3&VHUxyjP_uC8mKBLuPhMmWnDNAozs3i0|MO z`7!sIk4Jc4)*Un;W2UCJs7YJqBT%Pkq?s@4E1xhq*I2G+ljJ9V`otwx2D`p`U2g8$ z+2b$=Sfb2$e(xnQWQHSwDeKVU%i{*(?c9}FwETi)7wJm!jy-MU>t}5xVJ%WAVFLzN zUs#P9L9iIu*zCmbBbI|P0iuqA#~vP)u8_jP`aF`sHliY0Co87?X9%5^r}az z(c#av0|J0c_xPXPDq9@aJ*_M1aX*(C{26F+%>fh12tMS}mT7!XpIL_(gJJ19cg)uc z_I@S<)|<%qgM24u7$*slAl#Tg{y%Y*=3rZ+dyDX;T_D&zHku1|1W{_gevxS0Aujbg zs32_qJV_Rxx4&dgOKv?0Lc^@)6zQ*imt>8>tC{A5~;ViNogK%?N9^F~#J6qv4 zpov&Ar-_TCaint#BUuqw#1 z-4N6bYq-~C38|Ep;BUw!4LTdqB_mzEEcS_=z_{EVmC zr>8u(oA1?l1N|O$gc8J4xkx0?9w_aK|KeKTmBe*L9b^BBHofb8D-br&&GPH^Wc&)bln^{}9(Q;SV~2nuPCip&z~+Y;5PHT;CG z{^jazBYD3>zFEPi%=vVM)omIF7}->aPXnJq;0k_9tmQv+w7wZe`UkP8#5DQM?KI0$`l-ToRAWIJ4VTSZ>I`ib^dGX45y)K9WO|Ei1S@XYc7J0u< zX?!7)jbahk+6jmD`$adgqmJ<_lrOqYYVymXZGu`xP+bSXn2e%-v#8->Vj}Xvx<*{H z=mnI~g#qnb8T6=B_TIzg-*VJ)_4jo5mmDvBEl%#wPRDl)k|?L?Y}_B^6e#tYk!cNt zdM^(Kren!2=a|?l_eU+5ekpbw;XW=gAemcNy1Aat8|fW+D5$bC?S!OwOiW@?7X~%G z0*+Q0KFdFr5DN4Tb4A+Z5QEQbvz8kqAYF&;bF+>YY)RKnR$1HSPON!?l@uQG*7t{@ z0P^P2(r9bVX|*$sg&;T$-CsP$L8Xu|a_OGV!-X~mzOO@i@yGZXzIMzGUD;OeEh;S9 zzPVOQ)6F~yQ%j{X!WfXkh%~~{+iL2!Y@Ae-MWF!?(~F_k&#$d+=b2m|Dz|A~f~l#g zXZu=9OG|1h9ht2ozR7MHOH41sK!-9i-o=jSAy zm{#ZRNxvgZw^bkMOsFywVqLHP& zu|8?1_4dnYleLyB^m4itzwGS%mTofw&rK-NQyl+?zpi#`uGLd{2n{>J+muMsv8cd= zQtwY2oqNpLXE+Wq6GU7=4k{V3iHi5ch+{fI?HF{^J{iIBUQw%sT2GhljYsUv%9($t zgv9+p%b8=dn))o8{4`tVdR9gTq3iGEQz$4X-_ERUuFQQX;p*j6{$vbK&d#goA)0fW zvZLM;8ya(a&spD^IT^F+>H&U|ZtvrAL^mNHFBb=s_;qwx3h`u+h^3p#exxTJoH79X ztY`&}(l@RGbI#XX)of^2>U|7^wK6myHlm^*ZrW<9(D7rJh4oLg7l(mXOR$u#(0i_Whd9S2PNI`2n2ma!vwo*UpdwFpIA+E?`nMc_!y z)<-Ls8jOaw6=QH%XRvUE*%>sy zRc~D7KMa#ZABa5i5lIv9?64mU4m$ZRzTO_sL2b1XFdSvdo5S|m%-nj;U)`?l=VwRz zfnsR^Gl)rcfW>f%t#i5EcW7xR=XI<0X}3zd(QY*(kwGZJR#R zKXE`$PfvFsjN9dk9i!&;q>kUSxfj2Xt4{0Xna}yJ-S0yhg5Ev^{2f;nZU*hdQ;GCM zHsNXa3u&Sd3=~Rq9lm=hvkt1Pyr%6V>dWv!PDMHuc^wO?04iaUHC}dY31}hxP+OoeZrawB-{HI#%1!HDr#-6~eb`kLZ zC<_CPH@3OEXP&Qj3X+OVvjxQt@0M0po_!VWlRcI-&^Aa#wQxVbYHMu#V$I;1;d9r3 z$)lPpC%>lTqDsQM_Ob!R4ckq4ejZjQ)jLH9D9x9<2UxDpNh@P2!8-+SGQhwBLC>G? zQSL?)kdeOFK8`0nrza+K=M@cVam}u;D6Qg%Bp;?5Ks|az>pgX%0n7HGXtpW|Nq0yc(S0=ixCkQ)Alt ztJpHTiF(JG&@A;uEaSF*3m(rbVfaiS)N<(doP;D35ZhQTV3 zPn${$^3{DETDs3-S*|$yZ38~#L@CFjO%^~zya%awFJ54(*!l)-Bo-+Z+l{xlV>9RS z3r&iUWu?xwwzXq3{as5_L)Fc2I5eXm>-XX*DMj%y9$+{k&h<&#_I56X zU1s?_FZZj*k*zD(L~-&0>#(YciHWtfwT+F<$C@uKJv1a6RaRE^QG4tAaIsmLAFcg( znx+3rdNxHx^l(|SpHb2IY4{*SKtBKq8LTUxwD47jXsNSE0zZR7!em$c$E*1-*>%lR z0?&ObYzh~)s!hR*OS3^TChzU<8_f_mz+8*$?a(XL~@XJ)~3n_bRhd zx4X~$)2fO5SvEAFBDS<~iGKC%Lmlrkc-)>lg&9tV?{~cEN^z3xcW#i_5^Q*yCVL|h zRuMZ2^9L$3WY^c>01)SExRc7vw$9u+qm?s^3t$~NN|Z35j)|ep6ByJ;j+DveA=Ngr zM({yBC&>r~9SG(#>NBg$NMHey@K2|{>TRnGeZ70(fA7_o$hfrE-fncsSfT(2}vR@+S0 zFM|OvdMyGth@x>k+w&Q+JA(BZ(s!X0x*#Owl-?paqLn9GlN-`!guj$jDC&WpuB9|Q zJWIBk8NX`inhK!5v+5K^rSJ%hf8SDC)$=LBhVnMza2S7zAO`;T_6gjPm~fk z8&s%bqD>K=7F~wXy^p#fiy1uKH#=mQ-p?+z!|-2qN#h1roBz#NLaA8ys+JxP+gBJ= zy!Xhf8yz9JO*&z`P&v-oCAPUm=Vme4NOlO^GTy2vQGGa2lhjm~nmqieq@ub{g`C%m zNMW*jw({LI`oZ$}<(phv%5>{Bu?Za04?1&XJ9L_}@}rXZXtn1cgomd3wP6`QSe|L}2E7z|TpWlPYecia9D zlOIK3YRfJqEc^y3tXXHStgE}Pih&tbil@w`H!GzpHoUMt%F3#*?_1uchxXHSbIjxQ zsaiX+JR}N6N}ImziC1?Cwy{IuDW5C*%Q@XeM9OsVfNQ;WR4Kbo=YuQp4Zfh62ssFx<>`Swd<&<|0VK&X@BF}-oSahP4ozi4T!GyHXQyiG z!4~3U9I0n``JjZ{K)hFJwtusLeS zbsGC8QSz#mu3}0uZO`{K3iDshNWSe9Z{Dwpf3{>Q1M+GV1zMgJ{kZGAG!%lmNu{G? zVz-%ZJZqIiMOP<&F7hbj9|a7(vWVq{sTi}SYG7i%cr4zl!t674Y^C;G<(hHq+l{Qd zyhqYBX0q0nEDp&+8yS}y@Y|m#{iNwB%!sZ(`yik5`hMFxUUv;Tc41**+(;#&a1<>H zaBw<5gs93=(fy|H0usRsAU94p)S7jv_C`H2=h;S$Sx7%LPdf<-32W=}!R-c$}JB_rA{ z1{B>qM1yZ|HS!zx@=EG5|466wI--?}RC~Vfozl&PUhkXG5J8dG&ZHWx875{gXgjP&d&&8@U`}IjFRK354=@mqkeJ%UAyV36QEunKZw?JTi>#4^3#v z<-z0T(GLazp{QXr(#izn18Mxb2AEi_b>uqznSr*;7ZHVsVF#O#S~Ro_WE9~Lp{&ir z9Xwx7rs4=b3V=(4J@*#lGyS|+uYUFRDXSv}%cOzi9Vc_QbR1ww3knK;(^HX?-&9w>NM$G%C5XZT$g}RZX9imi z4h{%d^bbd6Rlk4#W*!KN{a|O;TP>s49R=;7PV?BNtb4Z5NKI90`q8`cKfFZSY#4zQjv;xfr*yCjg-3SbMFr#tZbLo=|oTu+f85<|DExd$cCfmV1Cz_1#c~AcO z#PiwG`+!aehYit2Y@TuR=i(ay%*k(V>|XFO7>}4r&S)xO^iF7lc4c=1H(6H;5mg4f zCbsIevdo15jkm>NW21pP(YP1X_aqbUY~lFjW2zQ1iyMomb6xwlN4hVSQi_Tw>$UxZ z5&L5q%LQYH(np%7sAGlD5wm!e7$UHP4zT{gSqYn384X3IyrZJ9m(Q^|Jp?Gzl&RhXS*oT~cAiMk6`k1i z3>&JbWx$W)UET!@RAhIVnBVHq44@e>NWi*UN(p-=d6xYjNFsfJtiQjXF^P`lw-ZWv zb8`v^jhJ}d3GppfU-SH&*a+O;=T{N)0H5hdGMQv_LSkaDMw*$KSqv^~p={PGI(>l) zSl}NWB0u;A8|aygE?X$Be%C-x3E~{2w*Q!AB3Rf4q%vcqq6j6zMS$c zZv{Pb6GG*!RofiS_e<~Vv#f1aTFyk_4pmf1jisg=E+}j7PO|<`bjQ ztad)Va%walcX_D8k6?%pv-(OcO;sWHEo}R(oYOH@M1%X`bd3l@_FF%NzxClc^3 zuf!E5WNY>|?QS?BW`fb{zHw(I31U`cW3ksf^FN8g#B?DAF?QPgwZOFL3*8)qkNK6P z(I+N3KRa(`Y7&j}xs7*xbxmtik4Had(3s^ghy>7^=Rdp9l?iDkIN+M@{W^9Q%C$Xf z1$?|uwc*Tzj)vyw2*6HW>Kr)%Z>o(BW_YwQ-?CoV%j?w5pO)yk_k@wmf z^(qo`J1D0UAJ&)`S9q0wuOtUI3#$((8d%K@ESb{WhOlb;B`7c0-U`Eom<_E4js^{^ znWJ`ZBM7%?f%lhz0AxT2!CjO@i~J)F`(2`h=QEW5W{T+HvAF!PIu18P?pP$+zCeH! zhdvi2^HCO>(8J=QJrCx{OVU9M1qaCRn>zo76CPX!`x@zw#&tTx6Qm81IYku$#wJ1o zfD7?K%h1I0{KIEuKjJh;$O&^c*V?sK)@NG&uO+obTQmD(^tw$Ki)L92bad$A4x2qc zRz2{O2%C$V{wR?4kPuN{uU*BgHja+UMX=3z&9s{^=1wM1Ywakfw=*e1XR$&03c?81 zCX_EIQ2%J6c0Z$i+4$jZfLh{|sqRqS{dF_D@^8UzvbI}^3K~2lcn+(9ofsTc-|fn; z0)WJHq|H$7Cd?Mfj)gg6dVi(b@JR5zmRltz0dXsyi6Dco#Pldg4$$muwjX`c)(Of` za;&?$sCS&frTXl(7fCUkSfO9*`*cI&f^?QWwMZW_h=1V@@teF)Ol!V!b>sSJ&%pl8 zVjU`mukF0TtsSXyetD{xr>@-Iq~em_$g4b7;Ex6bp|=P4|11?`+<4i@Lq#A#LW=)%Z+*9-#R4i^Iv23H?aW zx{bm2;%6YHw8Kl+SBUT1Vp^~s?TY$7i^U(6k4$NCDQI-O*2DU~CzIkyubTt10i@!p zx7*LMGfK=BLbl)1Eskbr+DOuE!Jvej_KwP&^*TScK}3N@2bZyv$q$f`HE3#F(Ws zz$9;{d$$vjWw+F^nP--zgFn*h?JIa#_v$IBTzA|u|J`66{aC0tWuoOS_h%Ux@ zm}!X`k5(VQjuK5wm<(utb9cUUI^nkrh#D)!|HhZU~Exys-MyO;1ue|P?ojh&^Ladtce z+K_WgN=mY`v#YDCYidvd=7C)5JBia1dMjxEsY0Q4&Y3i^?X9i1he1Kt=AvCODu^83 zJrh)!RpI(>LKf*4f5_$Px=@_5N$d%kv;c*eBcuZn&Uieti62s-;NQ>d1`yM2FKCst z-5UDAjHNQTxK+y^H){*Z+z4oC8JL*3^`{n8^rRFBGt8W9pKVvyws&{Mz2E-9zyZo9W19zjnW`Q$!~Fq}@xoF7GC=z9KUyW7x9v5UDo zh;q)WSyr92rP$ktx_B<&W7DjnyI<9nK5sgA`UM18-=p5vZY)bqD@wYLnWX1@EYEqe zTHBgrQ$Ibp8QQXwdmRyzWW7{J!SOd3b;@Pxt{b*rVv)mUNkv;*;63-6?9-?5>X;~p z3EOEGetH+s9`m4)!iM{2dKZ8s-?Afn>+ZR?^Pq*OZW-8KE9!ykVNmQqwUHi`a_qYw zwk)-!UeO6Mw!O(7IW>4Y%uB*bk>@L^AQGfJuL-FfB1DhbP5qx*fLL-#9b{YXx|=G4 zaA+`xbZ*+xnzoG*cpO4>r*VEa$-%yxmxO~uSY<%SA1zLWc34I<{I8Ryx(MI6m8MmB zS;YBT?C@gz&!56Ht92IBh4N`z+uJUBRV5{#@uG5+{v0|hq_WYFk!`cBL+tW~mtc8b zpW!e0hU;IP4L05<0U|DvmR$lAYZHs~+E$~XDH`n$))y&B>)!4rQVMu}s}U%=34IXU zHiG;Udm*(bsr<6bZ9ez+24y6YCQ(_Oj9L;vy3wDLl%>KKLMwQewNyUqyFRcli2mCW z;~7EM_qKYzQV^i>Fo>cke4-&Rp`4xI=MwcPLU^ifbvw0)zs^ z-GW@cbAIP}-%mSN_S#El*~~rnEO3Eif25_S6DNSrupX9|mn{Yp;digk z@oHj?Tb79eC`Jg!qe#~sY7371g@4rAjf2g5y2XRNzY7t)u|wuVD$+t#M2l%u@UFLV z1t!2I@}>@M_u`m~MqUd{f(Q6^^!%C`kf8CAC3osGQ>X(ydq?_Rd;=~UUal|Ta7u*k zA4>&kP3 z5kyi}6)5viJ3P4^%qGSN{m_kp_&V(Aqc%jfP^`=JR_ONT;Pe35zWpIX&1Gekk*4`C zRY$;sh0o}Rn~vMm zuV!>&etY~WGvaKra;3%D|_3=W2n#Li9o=~-J=s4Q5kO`3q9Ud9Xb&wVy4Ku zHNV06OcVcIT(5E{CU!vzZ8+djjBv#}lg;T-FUZ92VBt3CV#}4*;MTT8L&*PX|Lp9S z_=F%SmXD`rl}U#`S9;3#ll-xcmsJkc#=t`lAO4YTdo*Ok9!x}Npu2mj21(q&9=0E+ z3Qy+f=lI;*NeaE^eeoby-yiM;`Ex2^#oy+H*}4k$#Y61Y2zGHc6KG~m3r4U?R91=+ zWDXtPtku)E6!A1ph2BC#?jfk;_gB=pIE8muqvI2tin5zYr-O$6VcbMx5+IBk3hRKR zLQyVqY4I1Z7ZBIh`Btq!X!)i;voYqF5Ts=CvgXotZ}TFj=|S`3Bn9#W(aatQ)P?mD zy(cBP-%2XzJZ@xrFW|gSk%Ji8IRWl?xH%#Jb!sS_UU}w<@k_z zdC|16?scgsv8emuv@>L9y@uj`7oB6LZYi5WhWdQ5IEgv-BI)HX+>y@Z*}o#O;H9mL zXbtW%{1jb7YnWr=Zw;+~c`BK>iLzA6(*%snC7ZBofl(QlK@3X1Fz9LXX-dL)#aWMW zK;bjROWhuxn%H&1scG@U^^_Dg>tVDsZAEpl$Nm_x3_aTC!CGzO7o1MD9y8a`3^v0? z$G76um0Dj2QB-w*PguP!@<2um+eAU6((*~*>*K`eD-Re6@e8~w6!&@T|1Bh52b$2I zHVcIHth0<$b>Hw|t}O5x6|&SJ1F%2u}{n&M0mQE*INW`l|oR#SH=5cz%qfH0Hs` zRewLrWS3TTFK~sTv$V;vwu?^xlW=QW89mrRTN4{O$I!4w=Qxm{Q302=k^flSc)Bfv zP8yRL2Mw9RBclY7BgpFV`l0*BRVwWLxQpa!BVzC~Ch}Q;;E%YKftawMvOfgT2=nGn zF!E-XI3hnc(R%OW){X~kwu3hR3C!DDhwPHF%7^--pu+>35Gn;^fJyLOgZSeS#F)%D z&ts#`9CpMmSgzenc0P)~z!Ebz9FJ^`>+RO& z4Ku4(R-s(|06%gMr)bKbL$sERzzF5~<&ekO$&j;eGYmXUV)wJHPDw`ZG*AKfGIpm& zt*s|gTk>Lsap3Lk%u6bXRKvo@Tf+e_cq0*eyj1B$$==9`5vrhBdagZ5FRX1BYz%G8 zUG79f{XEIpRM@cBA7bFELpsjIW=El|oqffeeIg`TpH`t2qXNRwx9>*|7X1G9;K+y! ze@cFhO!U!&Y{6@njy)#B{`6tY^m$F~c|-hV+UMmC6x~>}(#~F>9AUwwKT{4XO155U z)CVbBm6kHltC0#ep00_uR5d-Jn+6|Ec7A!?QYx@d6Wq12(scAUr7!BOJRh$)YlaFw zyxw7(7MK>SqN3M54{f?t25dPv;qM`B{spt2FvyTdMWfe7MLJ%L}-IuM&Y*8gi8X3^cra95hht z>|3(V|Nj2Zav+Ten1-?Z``($iLJAE5$Ke0_WK|Fjm1zMhwZHzqEZ~o1;eT_GaOL}% zNc%JKpUnT0pt&{~Ed`Bg@^PnZ+u(o2B8R_6k^Cx6dr-k39ED!&O;HS*>)>+0GyPc@S@ack$S#| zTx|qDp;w$3k%6=RTEUeU|7{_1(#3Q<6N{pc{;ddwkD1Od8XJSVdvW9!Yran9p;KC*@(AP(y50^WVMgK|F2n_7h9yV zf98HsG4ujo1lkmHg%001s~j$+il*{^&;UPz8(sY&Le--OVVY<~)lD0G3r@x5_P|=E z0_A*S!R+y$-!L(GJiORNvSUri{!>l(#3N9z^2hC&4wXFM^NS|OWGq!dCtx5=j+lAB zco4b6ePCbW{*YhTtUiPz*&2{pDCoTioEwtVkh?nkU$=rH6vq>y(;S4^sLkbD>hNY` zT>X(gbR@@|*Pg6fNdq~e(Wnws#_s}8sQ>?;u~V#AaDQCztV)(nhSc6+>TY>b@#@6O zASOa~fbmK_4$w4>oP3gTWvq8~Gl|9?j!K{SWaf%vqAWG#e$*asxA~jwUr7Sz6uIYI z3uf-DrMC8W`u~P|c$M$Zz5Tzs86o5$LGw%@vUCtAuTkcq=TmH=7t1nsK9P{G`QJXb z5uset#Y#I8o3V2}%}FqJ4^zqSYAWvqvL;nEwXWOeqPoGFNKNo!|JiVu#RKVR9>wV* z-yld^v1OWPkYIe@xS^uOLI~`eq6#CF({5-HuU|TP2)JE$A7wk&8%s*D%I2cKi&I(f zp!`QRn`{-Brw~WEZP-<$JNG6GjV@w>4>s z)xX>!S-G%hAPa2N7u{X0zeBBpbwHoo-vsQdv_3xfFLLL*o^grhiyD{!~a%STxg%sr|YWlZ8+I zbnW`j*S?h1R`2WMwa=m<+fWA0q&33HkYBI?Dw`8xRsoQoyIV>od#A+NCs#i*vi#~{ zz96S-X+&{PcS}!hpYteKY97dN`Xriy^u5uKeuLkdlgPvJY8XhNAXuXnil^5cFdcCA zypBB*>DgfLDpbp3P}_54jky^ z&s2yI8a01157I8O#l?%q*~{Y^8HpTQ+^jvQ?XjR}=i&D?A0J=gqiL2e^C~#3M}KEo zza)Cv<+6W&vewq*xU^kK_QIG#%N43Zi4(}`sk)-_{`6EMY`(ONg_aa%)Cn9Gym%~# zzb@)n%=Y^@uw-tp7yQ{A|7c&oWN)2_y93r0)tT4ppBi1bpChXL#&>Y{kHn+65(9umh{pP z4{E%9e=`S%<{Tk@>DIP3F{Y)-PEq3=qSKl?HDycM_XZeEdd2=LIp|KyPNS##1RnL8 zgOvt0a<@T?f!>)fDpEx^1q91Wh;9m}Cur|YZl3U77ON;NIN8oZ~pfA?)k}v7)ernid z&~*K5Mq5i%hMqER?Q^;$#l)6A3i#!)0D_ZdOk5v-wSw;qJ%fm(_N^sKuL3R_bk#8Q zNqdaNRg&ILcHI32%@%q`(zP(2nlwjS12TU*nEiSy*!!V*#r`?EKW zNtnQg($*rlu#+|iFAGKJZbj|wx;T#!1R%Kh#|wI&kwNLEn2i*mMm|xQd#XQ!3>fB9 za~3^=Lr)JqF* zs#A~K#%YTHldO}!kK1(&Wru`2;UYH1Obv$>ZSTkN%48wc!{^^@mR(xeO#DtuI^=*j z`%71|^cMU1`7Y<$rp-K`PAIB*1)A(ncDgGB5|=AEDu4Y>70Ws9aFCHK%qqWEqatm; zBh`F$5T0x0QSmhKf!wz4rmNM)#cj_%Meo$+#0h;&%Iats&mBoNZda zo^*r=LV7ekLla%sJTA{qS1$MIR|^%!#QECb`uH{%r160ymt;5Q`5VJV-mn%-3Y#~} zCh>SeeT?IG3=P}c-piUU562-Yn<*#kh6di`tM5qiF)l_GDtSx-UeSV348+{iwJ8=P ziS50)mMt0p!2Rb_ry73~@MPye(}i@RHLx~?{zCxS4Ws})jsqu<*2tu0LZ-7m?-Jdq zV8PWmUNa_HyMrxSHE~Sb0nQp@fdnBp))L>}&W~EWf))n;d3o$O4RX0YoQwMGI`LLg zR8+LlN&I4n=6Txm`6828z`aB@dxc21$r)}uJOTJ#H@VQ7PpjlQUtmY|ZH?!;93Bi8 zig+!f?RTsh6G0MSx>lDT&=WoVRI3fHH$l3_EA}wMg$8rTBX17#q}qX>vmkEA-H966 z`XzX0sJq9w#<>}ynM1BuN0eBN0^;?dYI?DCsw5o|Yh~6PHotg7%eu(eUoD?>bkOLJlEHj5*Afg*zGuHvBVAtF z@HaKBn|j%PrjENc@zoKUb$gkg&oU$-^1=lZl$s(CfDd9slK~jAiKqL^_c1Gt zRRDnN!-f#g?#28sL^Eq3xmCHAXVItEED|bvA-VnnH~cN%ILL>x@V_UjuxlGh^z0hD zRhDz8DTJmak5xo&2X*A{P1S&llf0utxem3ljztOmmS*cN0tj6F#2;aQjoz03*eJk4+*q= z);FBL1(`0@K5TZM&p?#emL*jk1`d2jvK}s3Oz%eGI6AXNcZn>BEc7#=o>&0JSdAP~ z?EW0k5Yu2}tmy5+UIL6m88>dA(Rm32P-^EsF~~qa%0KlAe{Ue)9h`U?)YssU>#}yU z0~J#uMk)_^ARYXK{|eyUes{kkAL6oc5%&CT@V2w_W*&9=)ulJP8y<8xQ|Pm%?$m#d zey$KHEkr=W56HNV^H`k{03f)$z8YD%_lJ3Wvuh+sw|^6{*Rx8&J7A7ALL{vEQ%DM7LS)aX=@}7(=P=3xEO_xA znUu)X@<#S%L7_tS8vQb!UeFcbvVE51qnu6ZYDQhplxB~v)MuhgT7UI7g6|t~{mYrd zLtKHuYw_03dV$0!_L^T+85~+g4Wbc=I#1E0)p;GxtiM_(#{C04%{><;Uc8zO@@>Rge-^~ zxZ8smkP-TzCM&emQu0>q^n<89o8_hD{eH!BV?z*Z!3Utn55Reaq^oI|xrOJFuvfBw zbX=Ssu5STwW;65@Ap>-i3;%`X3(1X&Jq|73bZVV-o6{gYNnL`FjK9P8;pp*QJ|+$^ z6^P_NLbZCp2J`2yIY0^BiaB~ri$C9rag_5gUm0gXYHfv19ncXtQI$pDNa;ccMIO)k z(3kp&@Fdw&Uu1;y*{3%;?rubV;CRM!-^cA&!@KSQSeSZR#_~Vl*bc=Ks~QI*m3z2-)Dm}8}kiW2g;6H59pK~xh`FIf32P9W2I z?~t)bUAZ(e&~C?bPKEcWr_Qp?jedbF)7N?7d71}narg=P-G7ccu z_)g1SZ{G6Pk)aKc9I4#pa!2~}_MGYNEyI^o{g0K-K~)Qt%gF|FD;nf$hTo)^!U41@ z+9_5OB2G`e9stI&N`8wmX0_}o&^|M(*hRS9t-Jl0f*>^&oVdIzWMq>wu zojRt__Lhgml;`P7gRZXNppBf)#bDB4{A@UA z&W_F5s!%Fi!})d3?Z039!jKo%ye>0b55`T8h^qww2FzdW!l;FCbP+}}6fm=h>3gOf zDcc;mP2%A{_-Hsv9ca*!~Sq%bNpwT?D%8 z)J$bNhb?y>jF9ExIXtxEaGd10ih#LL0cdm>fj{+PFz)?gd3mh zONn@38?2q11#1|B0N3yFn%(COxi8;Wf^Q>zZZndr%mIVvg1e;2KXJcfe3b<>59%?w zNVR3mzGeHSuJy`fC@YN{Ak5Pc>7i?F&RIyD zRBFJn?Ma1lua++u{M(5Ap+h!B-g54cFW*>{M?=oQ43y}LKns@_TD{MIkHc={{8uPK zScOv?f9e5+0M;)RcvcHyqP(5KUX%H`Cm&KWmxXh?Vd5g%pSijcPJMF6W*4D1C4Xy% z!HH@H)oid#fnQatO`wh?^5>*EUoA7|Hz#e`8qlGW)az9hFpu2A_IAh`G3 z-$td7gax#(A9PF4?O5iIYdJv-0Mw+DNz_rfS$i}Y0410k&P$^;y??V+0A{TNya-c7 z4LInk3vG@a6<;dUNr^|DOs3~bB<`=06^IM7S$j}SIT{~okZr7(xLZN+&dSW~3z##27| zJ&Z&D=G?BV_8jll$#G&kk(~@EC0FOYPCi+EYS`iQEsuUp<*RC9;ye*V;!0jIs#m&} z|65lpKNGgVs<#Kyp_7P3bY^6czq#*7V_d-Pi>w@gav%%9S4sW1!#&t~ z?gTTbXxRRD$+xrGV#q5JL&u-d1`{1vP(t`IMxHYB_U5sFb0?-}m`>{g8aVjQ(|@MU zTO}QJ@DJ*tQxT8Pd>CHeno|X6esO<2hZ|#BVbUmGBJ|$nIZ@;P}pK zgqTzJ8zpZ4sDB&uN8G^nsLL_g=sc}H!r4ST#nSH|zm5|PAB)d@+iQx4iy^zQ2kO7F z#t=CE*inh10M0YS#4mcET(h9&)Sti%suVfo!j&Ed_x#*g1yDY3(3mm?;U9}4>Cx1F zG>fAKT@&WaQJ8?E}}0yXXTf422|6)+y3&t9-+(L_ajIGP1S}nRjYqtr{wP&h2#d1kmee#RNl9t zU>{Za=rq2(J7vUnwl|)(!Yov9=wRB&+FMQ6YaBaCU#WFHO(? z&FOY8aEfKk^rc8@^0f4}%E4f1V01>R>%2Y_7INaV(_^@t*>Ju(G`z4*%)*5QP~;>* zA>uGNsVctbkH+r!74p>K@IK>}0|ZIVbR)N3P!A996`UvLXz$oTa_-9Yw@+NQG zvXfVEfW$C>z+q=9W#ek0eNRTt#FcD<1+EO5ZnwKvkGS#cdWy{RZlFilJgZ2#d+mK9 z?zN&a3V-m4U%>wX&1>m8xK9>^v3S0zhqV|RLB}e{6q)*tF7o)J7cUA8zZUucmo4*T`s&kB@`H8yps@jN9NSx?me<*bH$l`@CI4+A9DX&gVS0 z;O9yLMPo@z@ZwH(-@%qe=R^#jm%z27S-c-e>g&%})Sda4nZG;J90`8Hl}!JQ5kTa3 zoSw-^uNHWt(4ECKBBGmGQm}5dCMxREd46x`^2nd9j7weQ5(2Av*%l8xZvXaj-qJLX zr1_7wyUeG!=mYsiBiGaV?S{d zFwG_6lFrkAB-dDNSR1$$8S}DbYEs^8nWC!Je#>&WTzL}MJ2f|Wy7ssp_RLdk7qUuX zgZ~*3F!M!@n`RIYDzEsvw!YQ|3E&H=uWGxV#|-N7J$~w_5mmAD8mLZU-T9qpKX;jN zEOvfZh9;YK&k-khEuzR|g@Mq1wOzBayu2P95Um#m*Ri1mQ<&`{MY|g|dN#0RYtGB1 zp;mdZ!#W#uBOOCR{Pte09_{2T+41X|i!J`H?fG!G5<^WeNg1{o1qeGfy39707HZmR z{iUgrf-EYC9B2T8R=7oZUtnA>`$xjaydT`FIN|gvI2njBjkYTW zD@F02;$vW36FqL(E;gM@m-!~4R!ag-o%*S?vZ8R?Sq@n)W*%3f*)DKS>WdBGs&1Ki z>o$}LZkt#jNQb-jfjS%<+T711u8Xs+K>Y%a$4<3>T-x2NtGMeWbL>5^B*>b~TXpHx z{de`F8ATU2k9A#$tcoke>uR7A!ViA+N{a=Rwb9vwm@6%jxP3 znYi^nUia{9H@akmkTV1pylHLLq-GlPa2)(b+e>sSve)ccDjq$(-5>L(|205DntS^= zWxgR%$wmvOq+k$k)q>o4@8yb4+L3)M4bDI(*A!^m6R%fvLZ&3z1k#X`Y5=9ThD08ie*r>nr}wK?>%ycpB?iEKX4Y*nY& zBVcAtGv0xQlBWG`>~3(N2w|JgXzXngmbD`L$Eh`Z!>+m&w~3pzcr_~qbS$wCVTBxj zm@>5Xgz`R#)w3el%t~dsPM|{uSv1QYrF*31e!|gstGXXMUxhFNNA;dTRxcTM2(uZQH zvzCfn>{PwM`swW5X%?T20^4(BPA$WPvUgJnfAxuQ;32Mt&CDUY_>+u5f1IbVY13bS z>mt_))~-LPKY(BEQ3s(vRXK@{j%=MA<##S#ZHnN&Zu*^9zq+K=Bm0$AFCsFZIjq?x z{n-BF3~%@+HHSQZ44n8p;Y}DR_3(H;i@%P`E5M`&okBqiJ*kd2A71>C{c8X|4V=0_ zDK;g0Ef(hjDG>+m9D|aFgoymrL-pq?f3Jwye+?_OvqEJGOLIB#5m%RgI7?q)R#TC8 zo+THt)Jd~1v3GoDGZB9ZKt*X>t26i0g|Ioa`A`UVBsakCvl%{oIT@GhVPSF2CO%9MOCqPW7VnO(Ru>l>|!OFbfL|?jFim@gwFCSvnfO}?!DR0EdyfW`_t5=7tKblrl06QO@@V=HSuAt&{PuK){P+FsV5kRz<4 zn5aW@^s6o9YJUQIcBlh}4?}TWk@FBGyKQ9a?&Q!?4mp%4{k{HY0@c+$?B0%&&-dB4 zzdi(XpL{8!p@I}tSCV)6%m52AZjMqA~IJi z;ZUZExz>@b@ z70vl3((Ocv-*aT9Duz|8w$ID?Ry8aDu(@L!!)G;`HsZSV!oxEBJ4phX0W1 z3T57*WmuwP5iVAF=fp=eEA;e*bx{qF0UDJA=W>YI*%i~$SKxFbI(i)uSMTK0<}Khy zw&o<38BON1$^UG=$VwT)nJ05S$R6O=;CJNIL~I~k8@uWqV^owIGP3sL(oSvBah2h6 z&@kU<{uq8@e!*f(*M{*b;!>Qa{mRWY$2*I$Mki|HX#jsx@t3EA<*w&;t%k(HY}qV~ zL{%~&KXBdgAcY?h;Q6=&e)N9$K1!>gb1`5);7O}6p#@lIdllyz+gmNLJ9)%f5=|?5 zI2Rjc*<|B+^g;M{X^l{Ay9IlYuQw%CDbMhAtPGYKC=0AJM3I7n*qL z&v*g1Nr2Y!S%jj0he%iRu)XneNVEwAM$6C7O;m5x%O4@UrJy)Gw#^f_K&9bLXG*V} zFDb!d^^E!`+Wl_{&O5f2Fi8x^~J4TBZ4enxOlF*G5UL ziB5hXi;NEQiX#R_UEq>qn0(z&#@HX2Duh=0DFoW71o6XGf&+Dg$BTIs!5ftXmZCof z+XSH<$HNozC|Lrw)eT(pE7Pv_Wh524QTYEp#l;oupV;p2Kx)E zJnUY>DP;aTZ;Z0Z1%)}iJ--LHy}(^oy9~k)`~0lBeBnfrMO{xTUDqO~+bB#W4O52$ zr*`$b6_hwMAu_EKFW} zuXA5EUUmR;Iqzd>x#+WS6jEbYm84~dHli;tlwz$!XIloC5_M;uoc-?ebqfQabN(&g zW+i}XF~2DzI9i>isT+7HkQc6oi+h;$XM z^!XK`t)S5?Zd%AC(Y%9**iT1?|C%zwnz!c&KNEd-;Ez&lntUaxy*p69DfPx)MwM(& zNKXUj6RjvUs-`04mdj?n*~Ih@dfT3=g6!ct|OtdM!<}P`bno6 z4Yqi*)9T-dxCHlU3sy6{;iR_7Bs~lGI5GWNcY&!_k+TF@^W8#soR7adkFBU0X3~>HZZ7(n_5f z&owmU%Jh+jUleF4T;K)+r)MSqtt+sHKOHNjSHJnp|A9@ySwcNbhM+Xl<*cJ~iUVG2 zl^5J(RJ1ILlsMf)@8JA-*{=Q;A39Jp9y5ASm4=hX$d~bmveY|i`<&lMAmDw=&~^du{Q$^Mi|Ve zSFf~aab~T!Mfs(JQsWp=m~C`SLT?tQLMCub*ML^f5yIO$tF0 z*I-d1%s&qy^amrLTXdv3nu!5d$0}wh)y^<5_#A-<5#TDyJjzYQU6Mva8KJIN;iN<^ zm3E(hz3WbFL5hYf2=%(nvH*~x$w7@2BuL@tF?ZvIOVSA;Fub~98cEStj205`<$vK) zBqA9eJ&ks$kqiwPjVcjB8G$eJIX>H3pNcdTK@)*?!U|xPh2SpKh|ogn2k4eS0Rb`* zx-XB+O z+aAblsN)1$M>!GDf4!Gyuxm+e0@8WZjxk=a0&KZ1{{aHD{*&RAd_b*c;oM ztQ=Opr7oPQn+}lbe*3|&&owGE+Nxx)Sr5BZsgy9jWtJtA+bN+oD%5j(D6GlkxuV%l z$s7Vs&|TZRuL-=1{W;M9krRKO-p0cQsKZI6!z8>vLX0w)LSLZ?a=zn4MgC4nNyM46 zfv9JssVwsDRX8@q0+K$Qyp&NM84&8$jm8K?rdnwr(Ek`}bU3o}XQf&{v4qK>K?idm zVbFtCfm?;g7MZCm7?!QUjMrkW6E6D;^lGI+TmM=Lz^JXb1@G=YP8yJ)D>!?DdN7o! z4EgN_2OzC-SDljA=RTaHTafPS*bAr4YVo?cVk-{$C1c66Om2M);4YDfbMg}3PL}^~ zNj+(t2dMJi2#z(zHMxLvpOY?lA^DpH>%$YLS1j>uL=LuJ#xER^NDis(LA_1d`WJZg z9yO4|lL&$nxO5v@XVbs(cDW1I?4bfwruPol&0C0G%RClm8_^T1O}vBxVoS_vNf7`m zwc0Wbj_3eh?aCZ&g;Xt>SAfw*xIkG8GX z_@P@~G6Q?)I_;4I6F1vhzh^J_ZHg0zSpX0*07Pb3-J!0g=4Jqig~x3p7dZHlo*OSt zS*Sul*Fn7?Yqhm*cw8&If5vLEE>16<$Q<7y7RU7!mt+>a`$YgzLe{o#smuT|NRrRr zbRwwnx1w=#(t$rJ3LqL27%F9XOMK{@lxAVcTSDyAL_{3gBit#7MVpe|z+FX7QlR#@ z1Y_2yM?RLAW4hwEwaE-Q(7LHVzJZ+qcuOLGoI9=HE5`kWS z>a_Z2()<%D&3xJOXK3Vkh_~)SpF{2oL_84h?dtc6LkiKQ%=msUOoVHZsGf7qVj>=i zZUjN9_|I6OA`PbUcj6mjL_To45g0j=Du8!^) zTIr&cbMcJxI2%?-1gJ2)j7m#-82sroGl6h@muL-usec z;NhsEQ_dXuMRx5f-JFT&HIfzb7wRp=YLcWVsjbbO#b)R7s8SpmFexX(WG!p`pFe-X z1sleIlFZ_I{lc*d@m4Off~t!9XmKB?+!DtT1f&o@{su+|$D zfuLM(;@dJ35D=gR5dVVrvC^YU@g;|=#bd>|y|@)G0SobzyBHWFMm2|8BC^Ia?iFS7 z-0HH~P_9EE&>*7}k_)WBX*K6&F~ZrbBpKN2BfvX7rx0;E(c{kSLCtc=k%X> zEsYRgXC+M@xlJLEJ_sj5+c-|<$F%J%NMGsNL5Br&ypJG7k6S!eOLo{Yv&*EtV33nT zd{z-NY(E|^^W)t1w-M_rOJcWQ;|5C>q+!ZGZFvuY8A_t6#E3h$(p0Y*ZP1O?-o~m& z2$&G@BJSGLWe#_CIrunujP}p|G_HR%sC2%UXAFckwzUcif2;N7GWES1$OP_=c+#)U z|2gDRG@e95!HJI5PmhsCBYywhLB1rsXR|m-Ea&SWQwf}=@`Lx$naE_L)1Vt56o-1e zmxxDYrmo6YL`+QVd6y%krMmj~s#}6OSZ*Z z{6K=jWoDB;R)u126VN&}_Cj&@%tsM9dp>dJ==a@j`4Q4oWB)u&vGzPb(Y`XfnlrI0 znz@vy%f+_c%zT3=J9MrbODvOxgmB_E5r(iG+5`E@9?VLEltja|`7wg}(X|AN@=z#; z)oo9EL`Hi7F~^`fdszC1ea6hpHz0_()gBpX_S${vH}$aB@epn!+c(Piw-Mn{gXN|6 zsnpPVAqmR25pQi~o#g3wwKFW+lP!V5{JY92mYM!&-Ba5AR5%#vZ)Cm?QLNG_=~1PM zXC+W7XFJ%o4wgH$#{W=k*~e}w=NK;6txhw@HSA5H+}`98=HdsH<6hd*l4@B+A~cN| zRP09~_Dm!;Dps`rgfV@VjUC^hZ%H=;O)bp$gDHatGRm^klCF;y@IZ&h{8)erXNq2v%B%R@EA*G?) z5GYnD@7|#C1N08-)sHQ--Kyl#LZP)nMOuW-v%r9Rt*1u zw6p^4fPs@YZC2Xn43n(=;z2JDvC4mDzVWRfg1;aawC2QBm3KE5N>%Wye zm{Aiq9c3>JiR<3PVsfpO&G5fGy$4mjGR_c@w-YD&=F z!M7UU&*l5V7PFk5lb4*bMG~PnB3%4Yf(&_$P)&?-32xpfuayUg1e`#X39{7%7!haj6WnoT0qr<-|{@- z;RDB=ooAV|<(j6E$tCd>k2;`06QtwN00bT;S_~Awp7gNq?+pdck$@>j?TsJ8%m26?U%=8wt7fK?H)_K_`>^wXiN;D9=5!Sw^eJDW$Yw(hQw8rS}5~R)3 zT1zwr8Xa=1X(6u%&!bSIC5ygV&2!>38L*`@S4X`?i}-WkIfW*aNDvDaofHc4PsYJd zVjz%V!dI+Q#+UiV#fee?^Cd;#j2KG2fSd-h1)IW;cc&JMQ&XGpU;vwXjh~U@|>bfuRC{2c{YDeIt35a z;O4Ef>&s*%MZxi(mi4oDV2JC9}PDi)!5ja_-0Uc)apbSRt!Udz82%FADS?`I-bMr{Vz1%5DUyHfEd>Pit`-B!L zNz@Yd-C3u)^~Rwz0Vg|0S^VMXviqDOcuPTM-kxt|>dRnazVE?6CV}>SFGaAz0#euC zJ9Gv$vKR2eODQNnQc?<=L^jz!(9`p=|6CJ-SG=n+=WRclS$$+UUta~Mie5s+CJhcb zJ(29RME>pM6SO_Gg#@wq2BgPhwLoOity=eou_2EtUBHBYThECt`fTo0Kpb>x9{O*b zG{0Gh2iz>>*lqZ{h^{nk_#7>66^dNe`%>R$4;I=w+l@nG)9vZZr0bR*Svb0^k$^JETlnM z%KnNC`#xyoETmxY&x}5nR)&_MA8W>y!x#4ooHsHy8i*|KShnQH-qEDFFBE0lPlSZY zh+>5{NMs3_RBO$B`P^M+UJlYvw;~X{k%})dqcp0XNBamM`s;VB9QfpE8n`GNJsG%3 z%4p`fzLN(ljePo~M27vnVB*~Gs#81C{qsg{4R(Q8@tiq{2O==%YxKoHUe_!cQhZDQ z$8AakPBG0qnd`&9N;&SdjoWY0#I&v?LJ@|5Z-`L2up())jhr{HzJsE1bm&VuSe#=sW>cgs@ zRBIvEscz?Vy4dVi{Fw*>fwY3~6d-vV!!F}>xG`V}MiE{Sb`~(1k5gZ&2wy&WbYHe( zZOG=;<`mKH)YKx7IP5&e)6mec)(AnlH$|G0G)9^_OkL2l{Al?ySWPX776x>-%|Vuz zji8AjvQQdMda)$9Zjm?(KpV^|Z+)9=MVvhL_QHsMv|C6P+4=*<#A`m9@9(z^s-tlJ z@Q%9)QT~F{Up-%LJT+}?ZAnuj0G1pZi;E%eH~yl0rgVsfXsBQ#)CodcK@R@5mafem zm3?jp3ti_beVm=w)h=A%&Zpy3%81VA>l#=O4j_%ClomGh86-#d+9O#okE|EmV>*4i z+-ckLyuLklKrF)YF|4pd?x;02gd%3PcH-^`!58PD5(?OSe_MkXy1?*Mb+A?2)Ok1F z#fVkF&GJgc?#*bO10i>|@*LNfl=9EW;4%*cm16SHLBuF)eReQ1Jl5D2DG}0Sar`HJ z9W8AniAE>42?CidQr49}yfPw0a4ku7>@L^;umHrF3fggQV}P$p*($Ym9??`sZkcZ} z>IN&0sYYK#o4>iZeLje8bZTmBgbSGw`)xm-+SS$7<0h*3S+nQi)zDh(hWvvcip68GO#usG+&?dsvs``I=H3S~370xlpe=3&da>S`xjTU$6ea@1$X zwN|g=<%a6&>Qd4Bo*oOdB95Q~CD?p5`TJa2MKgGs((xbD`vCzr7V&+x7ue5tcB6G7 zlPuc#%E59iMx|;0xK6$2k4z#Jy68cru;eD5yws?erAZR`Gd=y=1G?U{?$1&<`97-l zb6=EprOvA_A0v`kM`ec?)2hb}PyPI>I5H#eU5B?Scqcu!KPv}@kb8w$~fuRX-Pb};Nelr*~eNKfmM@2>T^z=lcznjPvm^9=3 z9snn5(!l?ub@#Hr4#XlW^irqHkm)i1N>^{5ZHxcaO40*>Z_BefGmx4wp@1&~r$eii zPvgqc1|$jqBxo}l7e#p)0HFh_GUj%P0%rN|z_#SM%6|hp&1>~Wlm_bdu24e5+kejT z{f3Y0H8^)+@%YBP)|Nkal!R>x03eK(ON)_xPn0q7?oIr36#yNe8eOl>n6|?WxOGcP zej}mz+gtBA;r|i!9`IEEU;OwrldO=HopFtjE(syoA$w)7tdPv?ooj{cy;qVQnMsnk zB!rN}HL{b<|M>jAzu*7!=<#{fP51qNzuvEN&htFa^L37m0lL6izU0vhx3TA3n<2<3 zMCTAme{HebMY8d?Y%<>0;*-M}Jr(mc5Qw^otid82#2IQ=4I#u3gDxn`AV%N{KG(vb zqd~een;T|#H)QK_+@>B7;=f0PL>~ugq{t-5+(z#y6|l#h{f^$B&21m^KvSw?NAjCX z-50K-@n7;@XmzgZqhn#wDl+y^)38ED++_Z9=^>M;Ed51!N9y151N`5wH0TJV*8C9b zeWH*QKL6IT28nk8A#5juqehR+05EK&`WB2(s!v|=T7hgGxXIu0eQC+aP|k0tTghK+ z(KfU$JXGmdUbX6~Sw{=M>885TF}qPsmi}jA%fR6%M}5*xYObiqrFBc8%-$1P@dCVT%!$(3_RwBjfyzAwBC{CTo)+8TqEH9_UaqDXGbcjAXu zHFS?r`a0=*ER6eKQ`_YFH)RCv6Q=pcN4G zA~sAJQ2zYz;a>ap=UhieN9=X6+qsyH^*@YJA21RdlJULMCG#+rN_-@uyb&{WF2zll^!jXvh{b>E^Dtx!t}|a-k~C`qxSV;I=TbOD*pXHXwCd; z+S=O6%Xw1!*Cu9nW_&lcBm>t|+ZkgOBqSuxumfIGQ&YF&M(C_G^)B|`8kFkN)hz!S zQJ|{A+k-GkfzpPdy4iro(*Bo_o2eJ^vf!!n5K6o~4y^s=S$8v8HE!O|7egRFhY6=i z2CvA{6XDDdbzUUDvwap9Q-a8A`RudP@uLd&IcFYn6TgBdv>ZuAZ;%K7EV{{!IH=pv z#C?UnepvGMZ64*s;9t%iN6vMj`UsATs-9jY1|{~B*1s+-FuHiSg{aZ==!nOwHNBfo zx8Amj8D~e3+^gd!&0{+#T)uZj+xAz892F-49kWidC~>h{`VAw5%=J`)X!$P-$k3=_ zG5N%=>A0ut**pkWevCHb1S=M43bBNJ}Bf~S9d34g#miY ziJ!pXVvwCt^Q!`P9M>Px2fq%vHJFqSJ1ej8MB-0`j8_u`O<~M%`8xu3^fVBSo>4Ss zXI{HK95A+$*`nX+!g8&xLc0T>Bko^6y~

    iZ)nBPOmr(A5TWgbMsZAXx0i^qvx8@PhF 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%0A8?TIDKxR<@;-a#9QwS+lgD%$@jT>Cj) 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 r^mM* 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≤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 YA3EO`w{uq3L;wH)07*qoM6N<$f^{=?a{vGU literal 0 HcmV?d00001 diff --git a/supervisord.conf b/supervisord.conf index d3d1d96..1a6b2c0 100644 --- a/supervisord.conf +++ b/supervisord.conf @@ -44,3 +44,14 @@ autorestart=true stopsignal=QUIT stdout_logfile=/var/log/x11vnc.log stderr_logfile=/var/log/x11vnc.err + +[program:novnc] +priority=25 +directory=/noVNC +command=/noVNC/utils/launch.sh +user=root +autostart=true +autorestart=true +stopsignal=QUIT +stdout_logfile=/var/log/novnc.log +stderr_logfile=/var/log/novnc.err

    + + +
    + +
    + + + + + + +
    + + + + + +
    +
    +
    + +
    Loading
    + + +
    + + + + + + +
    + + + +
    + + +
    +
    + + +
    + +
    + +
    + + +
    + + + + + +
    + + +
    + +
      +
    • Encrypt
    • +
    • True Color
    • +
    • Local Cursor
    • +
    • Clip to Window
    • +
    • Shared Mode
    • +
    • View Only
    • +
    • Path
    • +
    • Repeater ID
    • +
      + +
    • +
    • + + +
    • +
    • +
      +
    • +
    +
    +
    + + +
    +
      +
    • +
    • +
    • +
    • +
    +
    + +